Speicherbelegung (BASIC)
Dieser Artikel behandelt die Speicherbelegung in BASIC des C64.
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 High-Byte 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:
|
Beispiel[Bearbeiten | Quelltext 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, dort M() >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 ................ N%() ab $08CE >C:08d0 13 00 01 00 06 00 00 00 02 00 00 00 00 00 00 00 ................ >C:08e0 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.
Weblinks[Bearbeiten | Quelltext bearbeiten]
- cbmbasicVariableDumper: Cross-Development-Tool im Stil eines erweiterten Dumps zur Analyse des Variablenspeichers inkl. nicht mehr referenzierter Strings
- heise.de: "Ein fast vergessenes Datum: Happy Birthday, Microsoft", 07/2005; Speicherbelegung Altair BASIC"