C 64
Tips & Tricks

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)
Diagramm des Speicheraufbaus dreier Arrays mit Variablenname, Platzbedarf, Dimensionen und Feldelementen
Aufbau der verschiedenen Array-Typen
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
Listing 1. »CLEAR-DIM« bitte mit dem MSE eingeben
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         ; ================================
Listing 2. Assembler-Listing zu »CLEAR-DIM«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →