alles rund um den C128'er

Hinweis: Diese Seite wurde mit einer OCR Software erstellt. Es ist mit Schreibfehlern zu rechnen!

Tips und Tricks zum C128

Aus dem 64'er

Heft - 5/86

 

Die Variablenformate

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)
Label Adresse Funktion
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.

(Michael Bauer/dm)

-

Diskette zum Heft und damit auch die genannten Listings, gibt's hier

.

"Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !"

I Startseite I