Speicherbelegung (BASIC)

Aus C64-Wiki
Wechseln zu: Navigation, Suche

Die Aufteilung des RAM für BASIC-Programme ist über Zeiger in der Zeropage realisiert. Da der Prozessor 6510 nur 8-Bit Werte speichern kann, sind die Adressen in Low- und Highbyte getrennt, z.B. der Standardwert $0801 für den Beginn des BASIC Programmspeichers (TXTTAB) ist mit dem Wert $01 in Adresse $2B und $08 in Adresse $2C festgelegt.

Der Bereich mit Zeichenketten (auch String-Heap genannt) wird von hohen in Richtung absteigender Adressen für neu angelegte Zeichenketten vergeben. Dieser beginnt am Ende des BASIC-RAM (MEMSIZ - Standardwert $A000) und wächst nach unten, dem Endes des Speicherbereichs für indizierte Variablen (STREND) entgegen.

Der Speicher für BASIC-Programme teilt sich wie folgt auf:

BASIC-MEM.png
TXTTAB - BASIC-Programm Start
Zeropage Zeiger in Adressen: 43/44 (dezimal), $2B/$2C (hexadezimal)
Standardwerte: $01 / $08
VARTAB - Startadresse normale Variablen
Zeiger in: 45/46 (dezimal), $2D/$2E (hexadezimal)
ARYTAB - Startadresse indizierte Variablen (Felder)
Zeiger in: 47/48 (dezimal), $2F/$30 (hexadezimal)
STREND - Endadresse(+1) indizierte Variablen
Zeiger in: 49/50 (dezimal), $31/$32 (hexadezimal)
FRETOP - (Unteres) Ende Speicher für Zeichenketten
Zeiger in: 51/52 (dezimal), $33/$34 (hexadezimal)
MEMSIZ - (Oberer) Start Zeichenketten / Ende BASIC-RAM
Zeiger in: 55/56 (dezimal), $37/$38 (hexadezimal)
Standardwerte: $00 / $A0

Beispiel[Bearbeiten]

Ein Beispiel-BASIC-Programm, das ein paar Variablen verschiedenen Typs anlegt:

100 a=258:b=514
110 c%=259:d%=515
120 dim m(5):dim n%(5)
130 m(1)=1:n%(1)=2
140 s$="test":t$="string"
150 print s$+t$
160 rem schluss

Nachdem das Programm per RUN gestartet wurde, sieht der Speicher folgendermaßen aus (zu sehen z.B. im VICE-Maschinensprachemonitor):

          0  1  2  3   4  5  6  7   8  9  A  B   C  D  E  F
>C:0020                                     01  08 7f 08 a9   ..v.............
>C:0030  08 e1 08 00  a0       00  a0                         .............|..
  • TXTTAB ($2B/$2C) zeigt also (wie immer) auf $0801
  • VARTAB ($2D/$2E) zeigt auf $087F
  • ARYTAB ($2F/$30) zeigt auf $08A9
  • STREND ($31/$32) zeigt auf $08E1
  • FRETOP ($33/$34) zeigt auf $A000
  • MEMSIZ ($37/$38) zeigt auf $A000
          0  1  2  3   4  5  6  7   8  9  A  B   C  D  E  F
>C:0800  00 11 08 64  00 41 b2 32  35 38 3a 42  b2 35 31 34   ...d.A.258:B.514
>C:0810  00 23 08 6e  00 43 25 b2  32 35 39 3a  44 25 b2 35   .#.n.C%.259:D%.5
>C:0820  31 35 00 36  08 78 00 86  20 4d 28 35  29 3a 86 20   15.6.x.. M(5):.
>C:0830  4e 25 28 35  29 00 49 08  82 00 4d 28  31 29 b2 31   N%(5).I...M(1).1
>C:0840  3a 4e 25 28  31 29 b2 32  00 63 08 8c  00 53 24 b2   :N%(1).2.c...S$.
>C:0850  22 54 45 53  54 22 3a 54  24 b2 22 53  54 52 49 4e   "TEST":T$."STRIN
>C:0860  47 22 00 6f  08 96 00 99  20 53 24 aa  54 24 00 7d   G".o.... S$.T$.}
>C:0870  08 a0 00 8f  20 53 43 48  4c 55 53 53  00 00 00      .... SCHLUSS...

Obiges ist das BASIC-Programm im Speicher. Befehle sind durch BASIC-Tokens gespeichert, also nicht direkt als ASCII im Speicher-Dump lesbar.

          0  1  2  3   4  5  6  7   8  9  A  B   C  D  E  F
>C:0870                                                  41                  A     VARTAB (Start normale Variablen) = $087F
>C:0880  00 89 01 00  00 00 42 00  8a 00 80 00  00 c3 80 01   ......B.........
>C:0890  03 00 00 00  c4 80 02 03  00 00 00 53  80 04 51 08   ...........S..Q.
>C:08a0  00 00 54 80  06 5b 08 00  00 4d 00 25  00 01 00 06   ..T..[...M.%....     ARYTAB (Start Felder) = $08A9
>C:08b0  00 00 00 00  00 81 00 00  00 00 00 00  00 00 00 00   ................
>C:08c0  00 00 00 00  00 00 00 00  00 00 00 00  00 00 ce 80   ................
>C:08d0  13 00 01 00  06 00 00 00  02 00 00 00  00 00 00 00   ................

Es kommen nach dem Programm an sich zuerst die normalen Variablen, dann die Felder. Man beachte, dass die Strukturen für die Variablen S$ und T$ mitten in das BASIC-Programm zeigen ($0851 bzw. $085B). Anders als dynamische Strings (die am Ende des BASIC-Speichers liegen), werden String-Konstanten direkt referenziert, was Speicher und Umherkopiererei spart.

          0  1  2  3   4  5  6  7   8  9  A  B   C  D  E  F
>C:9ff0  00 00 00 00  00 00 54 45  53 54 53 54  52 49 4e 47   ......TESTSTRING    

Am Ende des BASIC-Speichers liegen alle dynamisch definierten Zeichenketten. Zeile 150 im Programm hat dazu geführt, dass kurzzeitig eine neue Zeichenkette ("TESTSTRING") gebaut und PRINT übergeben wurde. Die Reste finden sich noch hier. Siehe auch Garbage Collection.

externe Links[Bearbeiten]