C 64
Tips und Tricks

»Procedure« — oder der C 64 kann lernen

Strukturiertes Programmieren bleibt nicht länger ein Schlagwort. Definierbare Basic-Befehle kürzen manchen »Spaghetti-Code«.

Mit diesem Programm (Listing 1) können Sie eigene Basic-Befehle definieren, wie das auch in vielen anderen Programmiersprachen möglich ist. Die Befehlsangaben können dabei bis zu einer Zeile lang sein (80 Zeichen) und auch bereits definierte Befehle enthalten. Ein Beispiel dazu finden Sie in Listing 2. Dort wird in Zeile 20 und 30 eine Prozedur definiert, die aus Anfangskapital, Laufzeit und Zinssatz das Endkapital berechnet. In Zeile 70 wird die Prozedur mit »UMRECHNUNG« aufgerufen.

»Procedure« liegt im Speicherbereich von $C000 bis $C367 (Tabelle 1) und wird mit SYS 49514 initialisiert. Dabei wird der Vektor auf die Tabelle der Basic-Befehle von $A7E1 auf $C000 geändert. Die Adresse des Vektors steht in $134 und $135. Im ersten Teil von »Procedure« wird ständig geprüft, ob der Interpreter einen neu definierten Befehl gelesen hat. Wenn ja, sucht die Routine in einer eigenen Tabelle nach der Startadresse der gespeicherten Befehlsfolge. Handelt es sich um keinen zusätzlichen Befehl, macht der Computer weiter wie normal. Der Interpreter sucht in der Basic-Befehls-Tabelle des C 64 im ROM. »Procedure« versteht die Anweisungen in Tabelle 2.

Beachten Sie bitte, daß bei mehrfachen Definitionen eines Wortes immer die erste abgearbeitet wird, wenn Sie kein !NEW eingegeben haben. Es können deshalb keine Befehlsfolgen umdefiniert werden.

Basic-Erweiterungen in der Praxis

Was geschieht mit den selbstdefinierten Befehlen? Das oben schon angerissene Thema ist relativ einfach zu beschreiben, vergleicht man das Programm mit einer Kartei. Es gibt eine Liste, in der alle Kunden (Wörter) eingetragen sind. In der Liste ist vermerkt, in welcher Schublade — stellen Sie sich einen großen Schrank vor — genaueres über den Kunden zu finden ist, oder in diesem Fall über die Befehlsfolge. Übrigens arbeiten fast alle Basic-Erweiterungen nach diesem Prinzip. Wenn nun »Procedure« auf !DEF stößt, wird das neue Befehlswort eingetragen, mit dem Vermerk in welcher Schublade die Befehlsfolge zu finden ist. Wird nun ein neu definiertes Befehlswort aufgerufen, wird die Nummer der Schublade in den Programmzeiger (Adressen $7A und $7B) geschrieben und die Programmausführung bei dieser Adresse fortgesetzt. Der Programmzeiger sagt nämlich dem C 64, was als nächstes bei welcher Adresse ausgeführt werden muß. Ist das Befehlswort der Pfeil (←), heißt das, daß die neue Befehlsfolge abgearbeitet ist und wieder ins Programm zurückgesprungen werden kann. Dazu wird in Adresse $7A und $7B einfach der aktuelle Wert geschrieben. Wie Sie sehen, ist es also sehr wichtig, daß am Ende der Befehlsdefinition der Pfeil (←) steht.

Nach einem Reset kann die Erweiterung mit SYS 49541 wieder aktiviert werden, wobei die neuen Befehle erhalten bleiben.

Tips zur Eingabe.

Das Maschinenprogramm (Listing 1) müssen Sie mit dem MSE eingeben und speichern. Nach dem Laden mit LOAD "PROCEDURE",8,1 (1,1) sollten Sie vor dem Initialisieren als erstes NEW eingeben, um bei weiteren Anweisungen keinen »OUT OF MEMORY ERROR« auszulösen.

(Frank Pflüger/hm)
PROGRAMM : PROCEDURE      C000 C371
-----------------------------------
C000 : 20 73 00 C9 21 F0 0C C9   70
C008 : 5F F0 13 20 79 00 4C 92   96
C010 : C0 EA EA 20 73 00 C9 96   90
C018 : F0 0B 4C EB C2 00 20 88   DC
C020 : C1 4C 33 C1 EA 20 60 C3   C5
C028 : 4C AE A7 EA A5 FE 85 7A   70
C030 : A5 FF 85 7B 60 A0 00 A9   04
C038 : 40 91 FA 20 7C C0 20 73   39
C040 : 00 C9 B2 F0 05 91 FA 4C   51
C048 : 3B C0 A9 40 91 FA 20 7C   C0
C050 : C0 A5 FC 91 FA 20 7C C0   78
C058 : A5 FD 91 FA 20 20 C1 EA   9F
C060 : 91 FA 20 5D C1 20 73 00   0D
C068 : C9 5F F0 08 91 FC 20 87   AE
C070 : C0 4C 65 C0 20 64 C1 20   34
C078 : CD C1 60 EA 18 E6 FA F0   22
C080 : 01 60 18 E6 FB 60 EA 18   33
C088 : E6 FC F0 01 60 18 E6 FD   A7
C090 : 60 EA 20 FD C1 EA 85 F7   A7
C098 : A9 CD 85 F8 A0 00 B1 F7   69
C0A0 : C9 40 F0 03 4C 04 C1 A2   57
C0A8 : 01 20 15 C1 B1 F7 C9 40   B9
C0B0 : F0 23 C5 FF D0 25 20 73   41
C0B8 : 00 C9 00 F0 69 C9 3A F0   6B
C0C0 : 65 85 FF E8 4C A9 C0 C8   AB
C0C8 : C8 B1 F7 85 7A C8 B1 F7   BC
C0D0 : 85 7B 4C AE A7 C6 F7 D0   2E
C0D8 : 02 C6 F8 20 1C C2 EA EA   D9
C0E0 : EA 20 15 C1 B1 F7 C9 40   DA
C0E8 : D0 F7 A2 04 20 15 C1 CA   24
C0F0 : D0 FA B1 F7 C9 40 D0 19   BD
C0F8 : AA 20 79 00 85 FF 8A A2   D8
C100 : 01 4C A9 C0 20 79 00 4C   10
C108 : E7 A7 C6 7A D0 02 C6 7B   F3
C110 : 60 4C EB C1 EA 18 E6 F7   C4
C118 : F0 01 60 18 E6 F8 60 EA   31
C120 : 20 7C C0 A9 40 60 20 0D   85
C128 : C2 4C C7 C0 20 35 C0 20   09
C130 : 73 00 60 20 79 00 4C AE   E6
C138 : A7 00 20 79 00 EA 4C 92   C4
C140 : C0 A9 EA 85 80 85 81 85   85
C148 : 82 85 83 60 A9 C9 85 80   7A
C150 : A9 20 85 81 A9 F0 85 82   D8
C158 : A9 EF 85 83 60 20 7C C0   45
C160 : 20 41 C1 60 91 FC 20 4C   B7
C168 : C1 60 A9 00 8D 08 03 20   29
C170 : DE C1 EA A9 C3 85 FD A9   D2
C178 : CD 85 FB A9 C0 8D 09 03   DE
C180 : 60 20 15 C1 20 15 C1 60   E0
C188 : AE A0 CF CA BD A1 CF 85   07
C190 : 7B CA BD A1 CF 85 7A 8E   44
C198 : A0 CF 60 20 B8 C1 A5 7A   61
C1A0 : 9D A1 CF E8 A5 7B 9D A1   0F
C1A8 : CF E8 8E A0 CF 60 EA 85   5A
C1B0 : FA 85 FC 20 33 C3 60 EA   59
C1B8 : AE A0 CF E0 2A F0 01 60   B5
C1C0 : A2 00 8E A0 CF 4C 35 A4   97
C1C8 : A4 FF 85 FA 60 EA 20 87   19
C1D0 : C0 A6 02 E8 86 02 E0 2A   D1
C1D8 : F0 01 60 4C 35 A4 20 AE   41
C1E0 : C1 85 02 60 20 D1 C1 20   C8
C1E8 : 2C C1 60 EA AD FA CF 85   67
C1F0 : 7A AD FB CF 85 7B 20 79   E1
C1F8 : 00 4C E7 A7 EA 85 FF A5   33
C200 : 7A 8D FA CF A5 7B 8D FB   5E
C208 : CF A9 00 60 EA 48 8A 48   64
C210 : 98 48 20 9B C1 68 A8 68   1B
C218 : AA 68 60 EA AD FA CF 85   69
C220 : 7A AD FB CF 85 7B 60 A5   6B
C228 : 7A 8D FA CF A5 7B 8D FB   86
C230 : CF 20 73 00 C9 B2 F0 2C   3A
C238 : C9 00 F0 1C 4C 31 C2 20   5B
C240 : 73 00 C9 5F F0 07 C9 00   80
C248 : F0 0E 4C 3F C2 AD FA CF   5F
C250 : 85 7A AD FB CF 85 7B 60   D5
C258 : 4C 08 AF EA EA 20 27 C2   C3
C260 : 20 2C C1 60 20 73 00 C9   44
C268 : 3A F0 D4 4C 58 C2 EA EA   F6
C270 : A9 00 85 F7 A9 CD 85 F8   8B
C278 : A0 00 B1 F7 C9 40 D0 65   30
C280 : 20 15 C1 B1 F7 C9 40 F0   82
C288 : 44 AA 38 E9 81 10 07 8A   36
C290 : 20 D2 FF 4C 80 C2 8A 38   5B
C298 : E9 80 AA A0 00 84 B5 E4   45
C2A0 : B5 F0 11 B9 9E A0 C8 38   CB
C2A8 : E9 80 10 03 4C A3 C2 E6   F1
C2B0 : B5 4C 9F C2 B9 9E A0 C8   70
C2B8 : 38 AA E9 80 10 07 8A 20   73
C2C0 : D2 FF 4C B4 C2 20 D2 FF   B4
C2C8 : A0 00 4C 80 C2 A9 20 20   C6
C2D0 : D2 FF A2 04 20 15 C1 CA   12
C2D8 : D0 FA 4C 78 C2 A9 11 20   45
C2E0 : D2 FF 4C 70 C2 A9 11 20   D1
C2E8 : D2 FF 60 C9 9B F0 07 C9   FC
C2F0 : A2 F0 4A 4C 92 C0 20 73   BD
C2F8 : 00 20 DD C2 4C AE A7 20   F1
C300 : 73 00 C9 00 F0 07 C9 3A   C9
C308 : F0 03 4C 08 AF A0 00 A9   E1
C310 : 70 85 F7 A9 C3 85 F8 A9   15
C318 : 0C 85 F9 A9 FF 85 FA A9   06
C320 : FF 91 F7 20 15 C1 C6 FA   5A
C328 : D0 F7 C6 F9 D0 ED 20 6A   B6
C330 : C1 60 00 8D A0 CF A9 70   E3
C338 : 85 FC A9 00 60 20 FF C2   32
C340 : 4C AE A7 A5 FB C9 CF D0   71
C348 : 06 A5 FA C9 50 10 0E A5   22
C350 : FD C9 CE F0 01 60 A5 FC   A7
C358 : C9 B0 10 01 60 4C 35 A4   24
C360 : 20 43 C3 20 5D C2 60 FF   84
C368 : 8A 00 00 00 30 00 9A 00   60
C370 : 11                        04
Listing 1. »Procedure«. Das Listing muß mit dem MSE eingegeben werden. Vergessen Sie nach dem absoluten Laden nicht den NEW-Befehl.
5 rem*****rechen-demo*****
10 !new
15 :
20 !def unterprogramm=:q=1+p/100:kn=k*q^n:_
30 !def umrechnung=:unterprogramm:print"endkapital nach"n"jahren ="kn:_
35 :
40 input"anfangskapital  :";k
50 input"laufzeit (jahre):";n
60 input"zins            :";p
65 :
70 umrechnung
80 end
Listing 2. Demo zu »Procedure«
5 rem *****ton - demo*****
10 !new
15 :
20 !def a=:si=54272:pokesi+24,15:pokesi+5,24:pokesi+6,68:pokesi+1,asc(a$):_
25 :
30 !def b=:a:pokesi,int(256*rnd(1)):pokesi+4,17:fort=1to100:next:_
35 :
40 !def c=:b:pokesi+4,0:pokesi+5,0:pokesi+6,0:_
45 :
50 geta$:ifa$=""then50
55 :
60 c
65 :
70 goto50
100 open1,8,15
110 print#1,"s:ton-demo"
120 close1
10 rem*****deutsche befehle*****
20 :
25 !new
30 !def start=:run:_
60 !def zeigen=:list:_
70 !def neu=:new:_
90 !def zurueck=:return:_
100 !def halt=:stop:_
110 !def anfang=:restore:_
120 :
125 print chr$(147)
127 print"deutsche befehle:"
128 print
130 print"start    = run"
160 print"zeigen   = list"
170 print"neu      = new"
190 print"zurueck  = return"
200 print"halt     = stop"
210 print"anfang   = restore"
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →