atari-home.de - Foren
Software => Coding => Thema gestartet von: Burkhard Mankel am Di 30.07.2013, 10:43:47
-
Ich habe folgendes Problem: Früher - als ich noch ohne Festplatte (jaja, ist mindestens 25 Jahre her) habe ich alle Naselang ein Loaderprogramm für eine Diskette erstellt, mit dem ich das Programm, mit dem ich gerade arbeiten wollte, direkt per Drücken einer Taste wählen und starten lassen konnte. Jetzt werden sicher einige von Euch aufschreien: "so ein Umstand ..." - Jawohl, ich gebe zu: In den Zeiten von "Fensterln und Mauserln" ist eine solche Programmgestaltung eher eine Spielerei! Nun habe ich aber 4 verschiedene Ausführungen von Bubble Bobble (von "Original" bus "Ultra light") mit Hilfe eines Editors praktisch selbst erstellt. Mit einem Diskmonitor habe ich dann kontrolliert: Im Hauptprogramm sind die Namen der nachzuladenen RSC's editierbar abgelegt (BUB1.RSC & BUB2.RSC). In BUB1.RSC wiederum die anderen Dateinamen. Die fürs Spiel veränderte Dateien heißen AIRFLOW.DAT & BDATA.DAT. Für die einzelnen Versionen (2-4) habe ich nun dxas zweite Zeichen der Namen durch "2", "3" bzw. "4" ersetzt, BUB1 3x kopiert und zu BUB3 (v2), BUB5 (v3) und BUB7 (v4) umbenannt, danach ähnlich mit dem Hauptprogramm, dem ich zuvor BUBBLE_1.PRG ans Namen zuwies. Jetzt habe ich also BUBBLE_1.PRG, BUBBLE_2.PRG, BUBBLE_3.PRG und BUBBLE_4.PRG, habe in 2-4 per Diskmonitor die passende RSC zugewiesen (BUB3 etc) und danach in BUBx.RSC (x=3,5,7) je die Dateinamen für AIRFLOW und BDATA angepaßt. Danach habe ich nun alles (weniger als 600k) auf eine DD-Disk kopiert. Durch diverse Tests konnte ich dann in Erfahrung bringen, daß ich alle 4 Versionen von dieser Disk korrekt starten (durch umbenennen der jeweils nicht benötigten Version zu PRX). Danach habe ich sie jetzt aus dem AUTU-Ordner ins Root versachoben und versuche mich nun an einem gescheiten Loader - bekomme das aber nicht hin - wer kann helfen?
Ich habe schon mit folgender kurzen Routine getestet - der Erfolg bleibt aber auf der Strecke:
PRINT AT (3,8);"<1> Bubble Bobble original"
PRINT AT (3,9);"<2> Bubble Bobble oth. Level"
PRINT AT (3,10);"<3> Bubble Bobble o.L. gepatcht"
PRINT AT (3,11);"<4> Bubble Bobble UltraLight"
anfang:
DO
a$=INKEY$
IF a$>="1" OR a$<="4"
file$="A:\BUBBLE_"+a$+".PRG"
RUN file$
ENDIF
LOOP
Im Editor testweise gestartet, kommt nach wenigen untätigen Sekunden die Fehlermeldung: "Ausdruck zu komplex ...". Wenn ich die Tasten Tastatur testweise bediene, spricht aber auch die Floppy bei den entsprechenden Tasten an, bricht aber irgendwann erwartungsgemäß ab, weil ein PRG auf diese Weise (unkompiliert) nicht unbedingt zu starten ist. Also kompiliert und in den AUTO-Ordner der Disk - erreichen tue ich aber nur einen Blick auf den Desktop!
Was mache ich falsch. Wer kann mir noch 'ne Routine zum Laden und nutzen des Startbildes zufügen?
-
Also zumindest das IF-statement ist falsch. Anstatt OR gehört da ein AND hin.
-
Das geht problemlos, man muss nur einiges beachten:
- RUN kannst du nicht benutzen, das geht nur mit GFABASIC Dateien und nur im Interpreter
- Ausführen geht mit dem Befehl EXEC mit bestimmten Kombinationen der Parameter
- GFABASIC reserviert im Normalbetrieb den gesamten Speicher, d.h. ein anderes Programm reinladen geht nicht. Du musst dazu den Speicher über RESERVE korrekt freigeben (ACHTUNG: wieder an die Freigabe ans TOS denken!)
- Am besten das Programm compilieren.
Ein einfaches Beispiel (läuft compiliert)
'$m20000
' Die obvere Zeile sagt dem Compiler, er soll für das Programm mit allen Variablen nur 20000 Bytes RAM fordern.
' Der Rest bleibt vom TOS dann frei und kann ggfs sauber über GEMDOS per malloc und free reserviert und freigegeben werden.
ret%=EXEC(0,"A:\MEINPROG.PRG","","")
Dieser Code würde einfach MEINPROG.PRG starten und laufen lassen, ohne Kommandozeilenparameter und ohne spezielles Environment.
Falls Parameter übergeben werden, muss das 3. Argument speziell formiert werden.
ret%=EXEC(0,"ABC.TTP",CHR$(2)+"-v","")
Das erste Zeichen codiert, aus wievielen Zeichen die übergebene Kommandozeile besteht (hier 2). Maximal sind 127 oder 128 Zeichen möglich.
Ich hoffe, das hilft weiter.
-
Also zumindest das IF-statement ist falsch. Anstatt OR gehört da ein AND hin.
Sorry - hier habe ich auch "AND" programmiert - hatte mich heute morgen beim Setzen des Beitrages vertan!
Das geht problemlos, man muss nur einiges beachten:
- RUN kannst du nicht benutzen, das geht nur mit GFABASIC Dateien und nur im Interpreter
- Ausführen geht mit dem Befehl EXEC mit bestimmten Kombinationen der Parameter
- GFABASIC reserviert im Normalbetrieb den gesamten Speicher, d.h. ein anderes Programm reinladen geht nicht. Du musst dazu den Speicher über RESERVE korrekt freigeben (ACHTUNG: wieder an die Freigabe ans TOS denken!)
- Am besten das Programm compilieren.
Ein einfaches Beispiel (läuft compiliert)
'$m20000
' Die obvere Zeile sagt dem Compiler, er soll für das Programm mit allen Variablen nur 20000 Bytes RAM fordern.
' Der Rest bleibt vom TOS dann frei und kann ggfs sauber über GEMDOS per malloc und free reserviert und freigegeben werden.
ret%=EXEC(0,"A:\MEINPROG.PRG","","")
Dieser Code würde einfach MEINPROG.PRG starten und laufen lassen, ohne Kommandozeilenparameter und ohne spezielles Environment.
Falls Parameter übergeben werden, muss das 3. Argument speziell formiert werden.
ret%=EXEC(0,"ABC.TTP",CHR$(2)+"-v","")
Das erste Zeichen codiert, aus wievielen Zeichen die übergebene Kommandozeile besteht (hier 2). Maximal sind 127 oder 128 Zeichen möglich.
Ich hoffe, das hilft weiter.
eigentlich nicht - nur so weit, daß ich das mit der "EXEC" Anweisung zum Start einsehe. Ich hatte den auch mal ganz gut d'rauf - leider aber heute nicht mehr!
Ich fürchte, ich brauche mehr als nur Tipps! Vielleicht "strickt" mir ja jemand das "Grundgerüst"
- Es soll(te) das Titel-(Start-)bild geladen werden können
- Ohne diesen Hintergrund wieder zu löschen, würde ich begrüßen, daß deutlich die Wahlmöglichkeiten erkennbar sind
- Falls vorgenannter Punkt nicht ohne weiteres möglich ist, eben ein eigenes Startbild mit ausgegebener Wahlmöglichkeit
- Die Wahlabfrage- und Startroutine. Das zu startende Programm heißt "BUBBLE_x.PRG" - wobei x der gewählten Ziffer entspricht
-
Bildschirminhalt erhalten kann schwierig werden, dafür muss der genaue Zustand der Videohardware weggespeichert werden. Einfacher ist es, einfach nach Ende des aufgerufenen Programms einne Reset zu machen und das Menu neuzuladen, oder den Bildschirminhalt proaktiv wieder hinzuzeichnen, ob es nun Text oder Bild ist.
Ich habe unten ein einfaches Menu von mir angehängt (Wurde noch nicht offziell rausgegeben), es zeigt ein Bild und ein Menu mit Rastern, dazu spielt ein einfaches geklautes SNDH Stück von MadMax. Auf Tastendruck können verschiedene Programme gestartet werden.
Bis auf das Degasbild (welches speziell für Paradize gemacht und von mir angepasst wurde) darfst du gerne alle Teile direkt wiederverwenden.
(Die Erweiterung .PDF abschneiden, das ist eine ZIP Datei)
-
(Moderator: Persönliche Angriffe werden hier nicht weiter toleriert!)
-
Ich habe unten ein einfaches Menu von mir angehängt (Wurde noch nicht offziell rausgegeben), es zeigt ein Bild und ein Menu mit Rastern, dazu spielt ein einfaches geklautes SNDH Stück von MadMax. Auf Tastendruck können verschiedene Programme gestartet werden.
Bis auf das Degasbild (welches speziell für Paradize gemacht und von mir angepasst wurde) darfst du gerne alle Teile direkt wiederverwenden.
(Die Erweiterung .PDF abschneiden, das ist eine ZIP Datei)
'
INLINE mainpic%,32034
INLINE amigafont%,5154
INLINE rasters%,218
INLINE rastrout%,440
INLINE sndhplay%,186
INLINE music%,22968
'
Ich vermute mal, das angesprochene Degasbild lädtst du hier in die Variable mainpic% - da kann ich ja dann auch das Titelbild anwenden. Das hat hier aber meineswissens 32066 Bytes! Reicht es, wenn in dieser Zeile der Wert entsprechend angepaßt wird? Für rasters% finde ich allerdings keine Datei in Der ZIP - oder ist das vielleicht "RAINBOW.RST"? Wie lese ich die Dateien nach "INLINE" ein - war das die <Help>-Taste, wenn der Cursor in der entsprechenden Zeile steht?
Ansonsten müßte ich damit zurecht kommen - besten Dank für das Programm!
-
Das Degas format hat 32034 Bytes.
Degas Elite 32066 Bytes. Dies enthält am Ende zusätzlich 32 Bytes Anweisungen für Farbanimation. Die letzten 32 Bytes können somit vernachlässigt werden.
-
Kontrolliere die Dateigrößen, RAINBOW.RST müsste es schon sein.
INLINEs befüllen, in dem du auf die Zeile gehst, HELP drückst und dann LOAD anwählst (evtl auch gleich F1 drücken)
Kleiner Hinweis zu den INLINES: Die Inhalte können ganz leicht kaputt gehen, wenn man unvorsichtig mit den Zeigern ist oder vor den betreffenden Zeilen Code ändert. In letzterem Fall nach der Änderung ALLE INLINE Zeilen wieder mit ihren korrekten Inhalten laden, sonst gehts schief.
Und regelmäßig abspeichern rät mir meine Erfahrung damit, daher für INLINEs immer die nötigen Dateien sinnvoll mitaufbewahren.
-
Ich meine nur: Die Datei ist größer als der in der entsprechenden INLINE Zeile reservierte Bereich!
Mir kam auch heute noch eine andere Idee:
Wie wäre es, wenn ich die veränderten Dateien in ein extra Verzeichnis ablege, zB Ordner "A:\DATEIEN" un da drin dan zB "BDATA.DAx" und "AIRFLOW.DAx" (für x dann "1" für die originalen Dateien und "2" - "4" für die veränderten Dateien), und dann im Starter Kopierroutinen einbaue von A:\DATEIEN\AIRFLOW.DAx nach A:\GRAPHICS\AIRFLOW.DAT sowie A:\DATEIEN\BDATA.DAx nach A:\GRAPHICS\BDATA.DAT und nach den Routinen einfach das unveränderte Hauptprogramm starte. Da Ba das von mir (vorerst) veränderte Hauptprogramm nebst veränderter "BUB1.RSC" für jede Version etwa 60kB Diskplatz benötigen (AIRFLOW & BDATA aber "nur" 15 - 20kB) könnte man dadurch noch 150kB einsparen und bekäme alles auf eine einseitige Disk oder hätte die Möglichkeit weitere Programme zuzufügen!
-
Wenn die Datei größer als das Inline ist, dann wird soviel geladen, wie ins Inline passt, also abgeschnitten. 32034 reichen für ein normales Degasbiild.
Die Organisationsstruktur auf deiner Disk kannst Du frei wählen, mein Menu soll dir nur als Beispiel und Anregung dienen.
-
Also - vor ein paar Tagen hatte ich mir gedacht, hier mal wieder weiterzhumachen und wollte Euch meine Copyroutinen vorstellen, umk vielleicht noch Verbesserungsvorschläge oder anderes zu "ernten", da fiel mir auf: Kopieren ist eigentlich eine nicht unbedingt gute Lösung. Erstens nicht gerade Diskschonend und dann vor allem Platzraubend! Die bessere Lösung ist es wohl, Dateien umzubenennen. Da der Autor - nochmals Besten Dank an ihn - des zur Verfügung gestellten PaketOrdners weiter oben zusagte:
Bis auf das Degasbild (welches speziell für Paradize gemacht und von mir angepasst wurde) darfst du gerne alle Teile direkt wiederverwenden.
... habe ich mich daran gemacht, seinen Quelltext entsprechend anzupassen. Hier nun die evtl. Lösung (um ein bißchen was erläutern zu können, hatte ich Zeilennummern zugefügt):
128 PROCEDURE launch_program(entry%)
129 CLS
130 SDPOKE &HFFFF8240,&H0
131 SDPOKE &HFFFF825E,&H777
132 SELECT entry%
133 CASE 1
134 center("Original")
135 file$="A:\GRAPHICS\AIRFLOW.DA"
136 infile$=file$+"1"
137 IF EXIST(infile$)
138 @newname
139 ENDIF
140 file$="A:\GRAPHICS\BDATA.DA"
141 infile$=file$+"1"
142 IF EXIST(infile$)
143 @newname
144 ENDIF
145 CASE 2
146 center("Other Levels")
147 file$="A:\GRAPHICS\AIRFLOW.DA"
148 infile$=file$+"2"
149 IF EXIST(infile$)
150 @newname
151 ENDIF
152 file$="A:\GRAPHICS\BDATA.DA"
153 infile$=file$+"2"
154 IF EXIST(infile$)
155 @newname
156 ENDIF
157 CASE 3
158 center("Patching")
159 file$="A:\GRAPHICS\AIRFLOW.DA"
160 infile$=file$+"3"
161 IF EXIST(infile$)
162 @newname
163 ENDIF
164 file$="A:\GRAPHICS\BDATA.DA"
165 infile$=file$+"3"
166 IF EXIST(infile$)
167 @newname
168 ENDIF
169 CASE 4
170 center("Ultra Light")
171 file$="A:\GRAPHICS\AIRFLOW.DA"
172 infile$=file$+"4"
173 IF EXIST(infile$)
174 @newname
175 ENDIF
176 file$="A:\GRAPHICS\BDATA.DA"
177 infile$=file$+"4"
178 IF EXIST(infile$)
179 @newname
180 ENDIF
181 CASE 5
182 ' center("Bubble Bobble 2")
183 ' EXEC 0,"BUBBLE_2.PRG","",""
184 CASE 6
185 ' EXEC 0,"PARABOOT.PRG","",""
186 ENDSELECT
187 EXEC 0,"A:\BUBBLE.PRG","",""
188 RETURN
189 '
...
...
...
364 PROCEDURE newname
365 oldfile$=file$+"T"
366 FOR i=1 TO 4
367 newfile$=file$+STR$(i)
368 EXIT IF NOT EXIST(newfile$)
369 NEXT i
370 RENAME oldfile$ AS newfile$
371 RENAME infile$ AS oldfile$
372 RETURN
373 '
Erst einmal ein Beispiel: Ich hatte irgendwann als Letztes die Originalversion (Wahl 1) geladen gehabt. Dann müßten als maßgebliche Dateien AIRFLOW... ...DAT, ...DA2, ...DA3 und ...DA4 sowie equivalent BDATA (DAT, DA2, DA3, DA4) Nun möchte ich die Ultra Light Version (Wahl 4) spielen. Bezugnemende Programmzeilen: 170-180!
In 170 lege ich erst einmal für AIRFLOW die nicht zuverändernde Zeichenkette fest.
Die IF Anweisung (171-173) soll veststellen, ob AIRFLOW.DA4 vorhanden ist und da das nach meinem Beispiel der Fall ist in die Routine zum Umbenennen gesprungen, Nach der Rückkehr die gleiche Prozedur für BDATA.DA4.
In der Umbenennungsroutine versuche ich erstmal festzustellen, welch Datei fehlt. Das mache ich per FOR ... NEXT Schleife, die ich bei nicht vorhanden sein mit der EXIT IF NOT Anweisung ausbreche
Wenn die korrekten Dateien vorliegen startet das Hauptprogramm
Bin ich damit auf einem richtigen Wege oder was muß ich ändern?
-
Eine Menudisk wo man den Schreibschutz offen halten muss, fänd ich nicht so prickelnd. Kann man die verschiedenen Programmversionen nicht einfach in separate Ordner packen? Oder reicht es dann wegen teilweise doppelten Dateien platzmäßig nicht aus?
-
Eine Menudisk wo man den Schreibschutz offen halten muss, fänd ich nicht so prickelnd. Kann man die verschiedenen Programmversionen nicht einfach in separate Ordner packen? Oder reicht es dann wegen teilweise doppelten Dateien platzmäßig nicht aus?
Es handelt sich um vier verschiedene Versionen eines Spiels - dh einmal das Original, dann eine mit veränderten Leveln und dann zwecks Erleichterter Spielmöglichkeiten von mir veränderte Versionen. Das Hauptprogramm im AUTO Ordner lädt zwei RSC vom Root, vobei in der über 50k großen "BUB1.RSC" die weiteren Dateinamen stehen. Mein erster Weg war, das Hauptprogramm aufs Root zu verschieben und 3x zu kopieren und unter neuen Dateinamen ablegen, mit Diskmonitor nach BUB1.RSC gesucht, und verändert, daß für die verschiedenen Versionen verschiedene RSC's genutzt werden können. Danach in den verschiedenen BUB1 nach den Dateinamen gesucht, deren Inhalt unterschiedlich ist und alles entsprechend angepaßt. Dann viel mir auf, daß mit kopieren sehr viel Diskspace sehr viel Diskplatz (etwa 200k) eingespart werden kann. Und durch Umbenennen läßt sich noch weiteres einsparen ...
-
Naja, aber solange ohne Schriebzugriffe alles auf eine Disk passt, ist es doch auch gut, oder?
-
Naja, aber solange ohne Schriebzugriffe alles auf eine Disk passt, ist es doch auch gut, oder?
Nach allem, was ich plane, findet - eben durch das Umbenennen - nur ein Schreibzugriff auf einen Directory.Sektor statt!
edit: Oje - hatte mich verlesen! Vielleicht möchte ich mir noch eine oder mehrere Version basteln - zB eine mit Leveln der originalen Version 2 nachempfunden - und die dann hinzufügen - oder auch die originale Version 2!
-
So - ich habe mir gestern Abend 'ne Testdiskette (dh 2) erstellt und ...
... kam zu den Erkenntnissen, daß weder der Weg für Umbenennen noch der um's kopieren funktioniert. Ich habe als dritte Lösung eben meine 4 durch Diskmonitor gepatchten Starter ...