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 :
  1 REM    ************************ 
  2 REM    *         DEMO         * 
  3 REM    *  SUBROUTINE-RESTORE  * 
  4 REM    ************************ 
  5 PRINT"{CLR,6SPACE}TASTE DRUECKEN !" 
  6 PRINT:PRINT 
 10 X=INT (RND (TI)*3)+1 
 20 ON XGOSUB 1000,2000,3000 
 25 POKE 65,PEEK (122):POKE 66,PEEK (123) 
 30 READ A$:PRINTA$ 
 50 DATA " HAUPTPRG." 
 100 GOTO 10 
 1000 REM   *** SUBROUTINE 1 *** 
 1005 : 
 1010 POKE 65,PEEK (122):POKE 66,PEEK (123) 
 1020 FOR I=1 TO4:READ A:PRINTA;:NEXT 
 1030 READ A$:PRINTA$; 
 1040 POKE 198,0:WAIT 198,1 
 1050 DATA 1,11,111,1111,"UP1{2SPACE}" 
 1060 RETURN 
 1070 : 
 2000 REM   *** SUBROUTINE 2 *** 
 2005 : 
 2010 POKE 65,PEEK (122):POKE 66,PEEK (123) 
 2020 FOR I=1 TO4:READ A:PRINTA;:NEXT 
 2030 READ A$:PRINTA$; 
 2040 POKE 198,0:WAIT 198,1 
 2050 DATA 2,22,222,2222,"UP 2 " 
 2060 RETURN 
 2070 : 
 3000 REM   *** SUBROUTINE 3 *** 
 3005 : 
 3010 POKE 65,PEEK (122):POKE 66,PEEK (123) 
 3020 FOR I=1 TO4:READ A:PRINTA;:NEXT 
 3030 READ A$:PRINTA$; 
 3040 POKE 198,0:WAIT 198,1 
 3050 DATA 3,33,333,3333,"UP{2SPACE}3" 
 3060 RETURN 
 3070 : 
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →