Löschen ohne Verluste
Ein dimensioniertes Feld läßt sich normalerweise nicht ohne den Verlust aller Variablenwerte aus dem Speicher entfernen. Dieses Programm macht's möglich.
Ein einmal angelegtes Variablenfeld läßt sich beim Commodore 64 nicht wieder löschen; es sei denn, man benutzt den Befehl CLR, der dann aber sämtliche Variablen löscht. Mit dem Programm »CLEAR« (Listing 1) können Sie ein einzelnes Variablenfeld löschen. Somit ist es möglich, diese Variable neu zu dimensionieren. Mit SYS 49152 wird der CLR-Befehl erweitert. Folgt nun nach CLR ein Variablenname (zum Beispiel CLR A$), so wird diese Variable (falls vorhanden) aus dem Array-Bereich entfernt. Die Funktionsweise des Programms kann dem Assemblerlisting entnommen werden (Listing 2).
Wie verwaltet der Computer nun ein Variablenfeld? Im Bild rechts sehen Sie, wie die drei möglichen Variablentypen im Speicher abgelegt werden. In den ersten beiden Bytes steht der Variablenname. Besteht der Name aus nur einem Buchstaben, so wird für den zweiten Namen der Wert 0 eingesetzt. Die drei Variablentypen erkennt der Computer daran, das bei einer Stringvariablen im zweiten Byte das Bit 7 gesetzt ist. Zu dem ASCII-Wert des Variablennamens wird also der Wert 128 dazugezählt. Bei einer Integervariablen ist im ersten und zweiten Byte das Bit 7 gesetzt. In den nächsten beiden Bytes steht die Anzahl der Bytes, die das Feld benötigt. Danach folgt die Anzahl der Dimensionen und die Anzahl der einzelnen Felder. Zum Schluß finden wir noch die Variablen selbst. Wie im Bild zu sehen ist, belegt eine Stringvariable 3 Byte, eine Integervariable 2 Byte und eine Fließkommavariable 5 Byte. Man kann also Speicherplatz sparen, wenn nach Möglichkeit Integervariablen benutzt werden. Dies ist aber nur bei Variablenfeldern der Fall, weil bei nichtdimensionierten Variablen immer 7 Byte pro Variable belegt werden.
(H. Kunz/og)
PROGRAMM : CLEAR-DIM C000 C0E0 ----------------------------------- C000 : A9 0B 8D 08 03 A9 C0 8D 2F C008 : 09 03 60 20 73 00 C9 9C 47 C010 : F0 0F 20 79 00 4C E7 A7 10 C018 : 4C 08 AF 20 60 A6 4C AE 22 C020 : A7 A9 00 85 F7 85 F8 20 1C C028 : 73 00 F0 EF 20 13 B1 90 58 C030 : E7 20 79 00 85 F7 20 73 05 C038 : 00 F0 2B C9 24 F0 1E C9 8A C040 : 25 F0 0F 85 F8 20 73 00 B0 C048 : F0 1C C9 24 F0 0F C9 25 36 C050 : D0 F3 20 73 00 A9 80 05 EA C058 : F7 85 F7 D0 03 20 73 00 29 C060 : A9 80 05 F8 85 F8 A5 2F BF C068 : A6 30 85 F9 86 FA A5 FA 94 C070 : C5 32 D0 06 A5 F9 C5 31 E7 C078 : F0 34 A0 00 B1 F9 C5 F7 9C C080 : D0 07 C8 B1 F9 C5 F8 F0 D0 C088 : 06 20 C6 C0 4C 6E C0 A5 EE C090 : F9 A6 FA 85 F7 86 F8 20 23 C098 : C6 C0 A5 FA C5 32 D0 11 DA C0A0 : A5 F9 C5 31 D0 0B A5 F7 C5 C0A8 : 85 31 A5 F8 85 32 4C AE C7 C0B0 : A7 A0 00 B1 F9 91 F7 E6 B7 C0B8 : F7 D0 02 E6 F8 E6 F9 D0 C5 C0C0 : D9 E6 FA 4C 9A C0 A0 03 8D C0C8 : B1 F9 AA 88 B1 F9 18 65 48 C0D0 : F9 90 02 E6 FA 85 F9 8A 48 C0D8 : 18 65 FA 85 FA 60 00 C0 46
10 "; ===================================================== 20 "; 30 "; PROGRAMM: CLEAR 40 "; 50 "; LOESCHEN EINES EINZELNEN 60 "; VARIABLENFELDES MIT : 70 "; CLR X 80 "; 90 "; ===================================================== 100 " .BA 49152 105 " LDA #$0B ; VEKTOREN AUF 110 " STA $0308 ; 115 " LDA #$C0 ; NEUE ROUTINE 120 " STA $0309 ; 125 " RTS ; 130 ";=============================================== 135 " JSR $0073 ; NAECHSTES ZEICHEN 140 " CMP #$9C ; IST ES CLR 145 " BEQ JA ; 150 " JSR $0079 ; LETZTES ZEICHEN HOLEN 155 " JMP $A7E7 ; BEFEHL AUSFUEHREN 160 "ERROR JMP $AF08 ; SYNTAX ERROR AUSGEBEN 165 "NCLR JSR $A660 ; NORMALEN CLR BEFEHL AUSFUEHREN 170 " JMP $A7AE ; ZUR INTERPRETERSCHLEIFE 175 "JA LDA #$00 ; 180 " STA $F7 ; VARIABLENNAME AUF 185 " STA $F8 ; NULL SETZEN 190 " JSR $0073 ; NAECHSTES ZEICHEN HOLEN 195 " BEQ NCLR ; NICHTS, DANN NORMALEN CLR AUSFUEHREN 200 " JSR $B113 ; PRUEFT AUF BUCHSTABE 205 " BCC ERROR ; KEIN BUCHSTABE, DANN FEHLER 210 " JSR $0079 ; LETZTES ZEICHEN NACH ACCU 215 " STA $F7 ; UND NACH $F7 220 " JSR $0073 ; NAECHSTES ZEICHEN 225 " BEQ X2 ; NICHTS, DANN NUMERISCHE VARIABLE 230 " CMP #'$ ; STRINGVARIABLE ? 235 " BEQ STRING 240 " CMP #'% ; INTEGERVARIABLE 245 " BEQ INTEGER 250 " STA $F8 ; ZEICHEN NACH $F8 255 "LLX JSR $0073 ; NAECHSTES ZEICHEN 260 " BEQ X2 ; NICHTS, DANN NUMERISCHE VARIABLE 265 " CMP #'$ ; STRINGVARIABLE ? 270 " BEQ STRING 275 " CMP #'% ; INTEGERVARIABLE ? 280 " BNE LLX ; 285 "INTEGER JSR $0073 ; NAECHSTES ZEICHEN 290 " LDA #$80 ; BIT 7 IM 1. BYTE 295 " ORA $F7 ; DES VARIABLENNAMEN 300 " STA $F7 ; SETZEN 305 " BNE SPRUNG 310 "STRING JSR $0073 ; NAECHSTES ZEICHEN 315 "SPRUNG LDA #$80 ; BIT 7 IM 2. BYTE 320 " ORA $F8 ; DES VARIABLENNAMEN 325 " STA $F8 ; SETZEN 330 "X2 LDA $2F ; ============================ 335 " LDX $30 ; ARRAYANFANG NACH I 340 " STA $F9 ; $F9/$FA SPEICHERN I 345 " STX $FA ; ============================ 350 "LOOP LDA $FA ; ============================ 355 " CMP $32 ; $F9/$FA MIT ARRAY ENDE I 360 " BNE NO1 ; I 365 " LDA $F9 ; VERGLEICHEN I 370 " CMP $31 ; ============================ 375 " BEQ NOFOUND 380 "NO1 LDY #$00 ; ERSTES BYTE DES 385 " LDA ($F9),Y ; VARIABLENNAMENS 390 " CMP $F7 ; MIT GESUCHTER VARIABLE 395 " BNE NO ; VERGLEICHEN 400 " INY ; 405 " LDA ($F9),Y ; ZWEITES BYTE 410 " CMP $F8 ; VERGLEICHEN 415 " BEQ FOUND ; 420 "NO JSR PLUS ; NAECHSTE VARIABLE 425 " JMP LOOP ; 430 "FOUND LDA $F9 ; VARIABLE GEFUNDEN 435 " LDX $FA ; ANFANG DER GESUCHTEN VARIABLE 440 " STA $F7 ; NACH $F7/$F8 SPEICHERN 445 " STX $F8 450 " JSR PLUS ; ANFANG DER NAECHSTEN VARIABLEN 455 "N2 LDA $FA ; ============================== 460 " CMP $32 ; I 465 " BNE VERSCH ; ENDE DES ARRAYBEREICHS ? I 470 " LDA $F9 ; I 475 " CMP $31 ; ============================== 480 " BNE VERSCH ; 485 " LDA $F7 ; ZEIGER ARRAY ENDE 490 " STA $31 ; 495 " LDA $F8 ; SETZEN 500 " STA $32 ; 505 "NOFOUND JMP $A7AE ; ZUR INTERPRETERSCHLEIFE 510 "VERSCH LDY #$00 ; ====================================== 515 " LDA ($F9),Y ; I 520 " STA ($F7),Y ; ANFANG DER NAECHSTEN VARIABLEN I 525 " INC $F7 ; NACH ANFANG DER GESUCHTEN VARIABLEN I 530 " BNE N1 ; VERSCHIEBEN, BIS ARRAY ENDE I 535 " INC $F8 ; ERREICHT IST. I 540 "N1 INC $F9 ; I 545 " BNE N2 ; I 550 " INC $FA ; I 555 " JMP N2 ; ====================================== 560 "PLUS LDY #$03 ; ================================ 565 " LDA ($F9),Y ; I 570 " TAX ; I 575 " DEY ; I 580 " LDA ($F9),Y ; I 585 " CLC ; ANFANG DER NAECHSTEN I 590 " ADC $F9 ; I 595 " BCC N3 ; VARIABLEN ERRECHNEN I 600 " INC $FA ; I 605 "N3 STA $F9 ; UND NACH $F9/$FA SPEICHERN I 610 " TXA ; I 615 " CLC ; I 620 " ADC $FA ; I 625 " STA $FA ; I 630 " RTS ; ================================