C 64
Tips & Tricks

Restore für Unterprogramme

Wenn beide Programmteile, Hauptprogramm und Unterprogramme, DATAs enthalten, muß sichergestellt werden, daß auch wirklich die richtigen Werte gelesen werden. Wenn man nicht aufpaßt, kann es passieren, daß das Unterprogramm DATAs aus dem Hauptprogramm liest. Wie kann man das verhindern? Es gibt eine umständliche Methode: Man kann eine kleine Basic-Erweiterung einbauen, den RESTORE X-Befehl. Es geht aber auch einfacher. Die Zeropage, das sind die ersten 256 Byte des Speichers, hilft uns bei der Lösung des Problems. Genauer gesagt, die Adressen 65/66 und 122/123. Schlagen wir im C 64-Handbuch auf Seite 162 nach, dann steht dort:

65 - 66 Adresse des aktuellen DATA-Elements
122 - 123 Basic-Zeiger innerhalb der Subroutine

Mit diesen Informationen läßt sich schon etwas anfangen. Wenn das Unterprogramm angesprungen wird, dann sollte der Zeiger in Speicherstelle 122/123 auf die Adresse des Unterprogramms im Speicher stehen. POKEt man diese Werte in die Zeilen 65/55 mit POKE 65,PEEK(122) POKE 66,PEEK(123),

so wird beim nächsten READ der Wert gelesen, der hinter dieser Basic-Zeile mit den POKEs steht, also das erste DATA-Element innerhalb des Unterprogramms. Nach dem Rücksprung aus dem Unterprogramm muß der Zeiger eventuell auch im Hauptprogramm wieder gestellt werden.

In dem kurzen Demo-Listing werden drei Unterprogramme in zufälliger Reihenfolge aufgerufen.

(Stephan Pätzold/gk)
1 rem    ************************
2 rem    *         demo         *
3 rem    *  subroutine-restore  *
4 rem    ************************
5 print"{clr}      taste druecken !"
6 print:print
10 x=int(rnd(ti)*3)+1
20 onxgosub1000,2000,3000
25 poke65,peek(122):poke66,peek(123)
30 read a$:printa$
50 data " hauptprg."
100 goto10
1000 rem   *** subroutine 1 ***
1005 :
1010 poke65,peek(122):poke66,peek(123)
1020 fori=1to4:reada:printa;:next
1030 reada$:printa$;
1040 poke198,0:wait198,1
1050 data 1,11,111,1111,"up1  "
1060 return
1070 :
2000 rem   *** subroutine 2 ***
2005 :
2010 poke65,peek(122):poke66,peek(123)
2020 fori=1to4:reada:printa;:next
2030 reada$:printa$;
2040 poke198,0:wait198,1
2050 data 2,22,222,2222,"up 2 "
2060 return
2070 :
3000 rem   *** subroutine 3 ***
3005 :
3010 poke65,peek(122):poke66,peek(123)
3020 fori=1to4:reada:printa;:next
3030 reada$:printa$;
3040 poke198,0:wait198,1
3050 data 3,33,333,3333,"up  3"
3060 return
3070 :
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →