Aus dem 64'er
Heft - 5/86
|
In der folgenden Aufstellung steht »NAME« für den ASC-Wert eines Zeichens.
Integer-Variable
Die ganzzahligen Integer-Variablen werden in zwei Speicherzellen mit dem höchstwertigen Byte (MSB) an erster Stelle abgelegt. Es sind vorzeichenbehaftete Zahlen im Bereich von -32768 bis + 32767. Ist das höchstwertige Bit in einer Zahl gesetzt, so ist sie negativ. Im Commodore-Basic werden Integer-Variablen durch ein nachgestelltes Prozentzeichen dargestellt (zum Beispiel AA% oder Z%). Für die interne Kennzeichnung werden in den beiden Namen-Bytes die höchstwertigen Bits gesetzt.
Einzelvariable
Jede Einzelvariable belegt 7 Byte. Den Aufbau ersehen Sie aus Bild 1:
Felder
Ein Feld belegt 5 + 2 x Dimension + (Dimension n x Dimension (n-1) x Dimension (n-2)...) x 2 Byte.
Aufbau des Deskriptorblockes
1. Byte Name + 128
2. Byte Name + 128
3. Byte Gesamtlänge Array (Lowbyte)
4. Byte Gesamtlänge Array (Highbyte)
5. Byte Anzahl der Dimensionen
6. Byte Anzahl Elemente Dimension n, Low
7. Byte Anzahl Elemente Dimension n, High
8. Byte Anzahl Elemente Dimension n-1, Low
9. Byte Anzahl Elemente Dimension n-1, High
und so weiter für die restlichen Dimensionen. Die Feldelemente werden direkt hinter dem Deskriptorblock in je 2 Byte (MSB-LSB) gespeichert (siehe Bild 2). Bei mehrdimensionalen Feldern wird die letzte Dimension als erste angelegt.
Gleitkomma-Variable
Die Gleitkommazahlen sind in 5 Byte abgelegt. Im ersten Byte wird der Exponent gespeichert. Die Mantisse liegt in den folgenden 4 Byte als 32-Bit vorzeichenbehaftete Zahl. Die Gleitkommazahlen werden im Commodore-Basic nur durch die ASC-Werte der ersten beiden Zeichen dargestellt (zum Beispiel AA oder B). Intern wird die Gleitkommazahl mit ihrem Namen in 2 Byte mit den ASC-Werten gekennzeichnet. Besteht der Name nur aus einem Zeichen, so lautet das zweite Byte Null. Einzelvariable Jede
Einzelvariable
belegt 7 Byte, wie Sie aus Bild 3 ersehen können.
Felder
Ein Feld belegt 5 + 2 x Dimension + (Dimension n x Dimension (n-1) x Dimension (n-2)...) x 2 Byte.
Aufbau des Deskriptorblockes
1. Byte Name + 128
2. Byte Name + 128
3. Byte Gesamtlänge Array (Lowbyte)
4. Byte Gesamtlänge Array (Highbyte)
5. Byte Anzahl der Dimensionen
6. Byte Anzahl Elemente Dimension n, Low
7. Byte Anzahl Elemente Dimension n, High
8. Byte Anzahl Elemente Dimension n-1, Low
9. Byte Anzahl Elemente Dimension n-1, High
und so weiter für die restlichen Dimensionen.
Die Feldelemente werden direkt hinter dem Deskriptorblock in je fünf Speicherzellen gespeichert. (Siehe Bild 4). Bei mehrdimensionalen Feldern wird die letzte Dimension als erste angelegt.
Stringvariable
Stringvariablen werden in zwei Teilen gespeichert. In einem Deskriptorblock finden sich die für die Verwaltung notwendigen Angaben. Im oberen RAM-Bereich wird der String selbst als Folge von ASC-Werten abgelegt. Im Deskriptorblock zeigt ein Zeiger auf eine Adresse im oberen R AM-Be-reich, an der der String abgelegt ist. Jeder String wird von einem Zwei-Byte-Zeiger, der auf das Längen-Byte im Deskriptor zeigt, abgeschlossen.
Aufbau der ASCII-Zeichenformate
Text-String ............ Zeiger
....................Lowbyte Highbyte
Im Commodore-Basic werden Stringvariable mit einem nachgestellten Dollarzeichen dargestellt (zum Beispiel A$ oder AB$). Intern werden Strings mit 2 Byte gekennzeichnet, wobei das höchstwertige Bit im zweiten Namen-Byte gesetzt ist. Besteht der Name nur aus einem Byte, so hat das zweite Namen-Byte den ASC-Wert 128.
Einzelvariable
Jede Einzelvariable belegt 7 Byte und im oberen RAM-Bereich zwei Byte + Länge des Strings. Der Aufbau wird aus Bild 5 ersichtlich.
Bild 1 - 7
Bild
1. Aufbau einer Integer Variable |
Name
1 |
Name
2 |
MSB |
LSB |
00 |
00 |
00 |
+ 126 |
+ 128 |
|
|
|
|
|
|
Bild
2. So liegen die Feldelemente hintereinander |
MSB 1 |
LSB 1 |
MSB 2 |
LSB 2 |
etc. |
|
|
Bild
3. Aufbau einer Gleitkomma-Variable |
Name
1 |
Name
2 |
Exponent |
|
Mantisse
32 Bit |
|
|
+128 |
|
|
|
Bild
4. Und auf diese Weise liegen die Feldelemente in Speicher |
Expon
1 |
Mantisse
1 |
Expon
2 |
Mantisse
2 |
usw. |
|
|
Bild
5. Aufbau einer String-Variable |
Name
1 |
Name
2 |
Stringlänge |
Zeiger |
im RAM |
00 |
00 |
|
|
|
low |
high |
|
|
|
Bild
6. Lage der Feldelemente hinter dem Deskriptorblock |
String
1 |
Zeiger
1 |
String
2 |
Zeiger
2 |
usw. |
länge |
low/high |
länge |
low/high |
|
|
Bild
7. Anordnung der Funktionsvariablen |
Name
1 |
Name
2 |
String- |
Zeiger |
im RAM |
00 |
00 |
+ 128 |
|
länge |
low |
high |
|
|
|
Tabelle
1 - Wichtige Adressen (B0/B1 entspricht Bank 0/1)
|
Dez |
Hex |
|
TXTTAB |
45 |
002D |
Zeiger auf Start BASIC
B0 |
VARTAB |
47 |
002F |
Zeiger auf
Start Variable B1 |
ARYTAB |
49 |
0031 |
Zieger auf Star
Variablenfelder B1 |
STREND |
51 |
0033 |
Zeiger auf Ende der
Variablenfelder + 1 B1 |
FRETOP |
53 |
0035 |
Zeiger auf Start String
B1 |
FRESPC |
55 |
0037 |
Hilfszeiger für
Stringverwaltung |
MAXME1 |
57 |
0039 |
Höchste verfügbare
Variablenadresse B1 |
BASTOP |
4624 |
1210 |
Zeiger auf BASIC-Text
Ende B0 |
MAXMME0 |
4626 |
1212 |
Höchste verfügbare
BASIC-Text-Adresse B0 |
Felder
Jedes Feld belegt 5 + 2 x Dimension-Byte + (Dimension n x Dimension (n-1) x Dimension (n-2)...) x 3 und im oberen RAM-Bereich (Länge aller Strings + (2 x Anzahl aller Strings)). Es : nüssen nur Strings, deren Länge größer Null ist, berücksichtigt werden.
Aufbau des Deskriptorblockes :
1. Byte Name + 128
2. Byte Name + 128
3. Byte Gesamtlänge Array (Lowbyte)
4. Byte Gesamtlänge Array (Highbyte)
5. Byte Anzahl der Dimensionen
6. Byte Anzahl Elemente Dimension n, Low
7. Byte Anzahl Elemente Dimension n, High
8. Byte Anzahl Elemente Dimension n-1, Low
9. Byte Anzahl Elemente Dimension n-1, High
und so weiter für die restlichen Dimensionen.
Die Feldelemente werden direkt hinter dem Deskriptorblock in je 3 Byte gespeichert (Bild 6). Bei mehrdimensionalen Feldern wird die letzte Dimension als erste
angelegt.
Funktions variable
Funktionen, die man mit der Anweisung DEF FN name(var) = ausdr. diefiniert, werden von Basic ebenfalls als Variable mit dem Namen »name« im RAM abgelegt. Intern wird das höchstwertige Bit im ersten Namen-Byte geseztzt. Hat der
Vanablenname nur ein Zeichen, so ist das zweite Namen-Byte Null. Im Gegensatz zu den anderen Variablen gibt es aber hier keine Felder. Jede Funktionsvariable belegt 7 Byte und im oberen RAM-Bereich 2 + Länge der Funktionsvariablen. Ansonsten entspricht die Ablage der einen einfachen Stringvariablen (Bild 7).
Damit sind alle Vanablentypen, die der C 128 kennt, dargestellt. Im Normalzustand werden die Variablen in Bank l ab Adresse $0400 (dezimal 1024) aufwärts und die Inhalte der Strings und Funktionsvariablen ab Adresse $FEFF (dezimal 65279) abwärts gelegt.
In Tabelle l sind die Adressen einiger Zeiger aus der erweiterten Zeropage, die für die Verwaltung der Variablen wichtig sind, aufgeführt. Die aktuellen Adressen in der jeweiligen Bank kann man leicht nach folgender Formel berechnen:
Adresse = PEEK(Zeigeradresse) +
PEEK(Zeigeradresse +1) * 256
Doch Achtung: Zum Nachschauen muß man dann noch die richtige Bank angeben.
Diskette zum Heft und damit auch die
genannten Listings, gibt's hier
|
|
|