Das Schneider CPC Systembuch

Grundlagen

Datenspeicherung und Datenstrukturen

Arrays

Felder als FLR-Array

Bei Datenspeicherung und Datenstrukturen: ArraysArrays aus fixed length Datenspeicherung und Datenstrukturen: Recordsrecords (FLR) ist beispielsweise der Zugriff auf die einzelnen Datenspeicherung und Datenstrukturen: RecordsRecords sehr schnell. Felder mit wahlfreiem Zugriff werden fast ausschließlich als FLR-Array realisiert! Die exakte Lage eines Datenspeicherung und Datenstrukturen: RecordsRecords lässt sich nämlich aus seinen Indizees, der Länge der einzelnen Datenspeicherung und Datenstrukturen: RecordsRecords und der Startadresse (Basis) des Datenspeicherung und Datenstrukturen: ArraysArrays berechnen:

Rec.Adr. = Arraybasis + Rec.Len. * (i0 + im0*i1 + im0*im1+i2 + ... )

i0, i1 etc. stellen hierbei die Indizees der verschiedenen Array-Dimensionen dar und Die verschiedenen Interrupt-Modi der Z80: IM0 - Interrupt-Modus 0im0, Die verschiedenen Interrupt-Modi der Z80: IM1 - Interrupt-Modus 1im1 usw. die Größe der einzelnen Dimensionen. i0 bzw. Die verschiedenen Interrupt-Modi der Z80: IM0 - Interrupt-Modus 0im0 entsprechen dabei dem innersten Erklärungen zu den Anschlussbezeichnungen: INDEXIndex.

Ein Beispiel:

Die Zahlenfelder, die von Einleitung: BASIC
Anhang: Basic
Basic
angelegt werden, sind FLR-Arrays. Deshalb kann man ja auch auf jede beliebige Zahl innerhalb des Feldes sofort zugreifen. Mit dem folgenden Beispiel wird ein Integerfeld dimensioniert:

DIM Operationen: BD5B / 349A / 349A:  FLO SUBa%(3,5,2)
       ^ ^ ^
     Die verschiedenen Interrupt-Modi der Z80: IM0 - Interrupt-Modus 0im0 | Die verschiedenen Interrupt-Modi der Z80: IM2 - Interrupt-Modus 2im2
        Die verschiedenen Interrupt-Modi der Z80: IM1 - Interrupt-Modus 1im1

Das Feld hat drei verschiedene Dimensionen, erkennbar an den drei Maximal-Indizees. Die Größe der ersten Dimension ist 4 (und nicht 3), weil insgesamt vier Datenplätze in dieser Richtung ansprechbar sind: 0, 1, 2 und 3. Die Größe der zweiten Dimension ist 6, die der dritten ist 3.

Die Record-Länge in einem Integer-Array beträgt zwei Datentypen: Bytes
Datenbreite: Bytes
Bytes
. Die Array-Basis ist die Adresse des Datenspeicherung und Datenstrukturen: RecordsRecords Operationen: BD5B / 349A / 349A: FLO SUBa%(0,0,0) und der innerste Erklärungen zu den Anschlussbezeichnungen: INDEXIndex ist im Schneider-Basic der erste Erklärungen zu den Anschlussbezeichnungen: INDEXIndex innerhalb der Klammer.

Die Adresse des Datenspeicherung und Datenstrukturen: RecordsRecords Operationen: BD5B / 349A / 349A: FLO SUBa%(3,4,1) lässt sich dann so berechnen:

@Operationen: BD5B / 349A / 349A:  FLO SUBa%(3,4,1) = @Operationen: BD5B / 349A / 349A:  FLO SUBa%(0,0,0) + 2 * (3 + 4*4 + 4*6*1)
    ^ ^ ^                      ^   ^ ^   ^ ^ ^
   i0 | i2                     i0  | i1  | | i2
      i1                          Die verschiedenen Interrupt-Modi der Z80: IM0 - Interrupt-Modus 0im0    | Die verschiedenen Interrupt-Modi der Z80: IM1 - Interrupt-Modus 1im1
                                        Die verschiedenen Interrupt-Modi der Z80: IM0 - Interrupt-Modus 0im0

Dieses Basic-Programm zeigt das geordnete Aufeinanderfolgen der einzelnen Feldelemente:

10 DIM Operationen: BD5B / 349A / 349A:  FLO SUBA%(3,5,2)
20 FOR k=0 TO 2
30 FOR j=0 TO 5
40 FOR i=0 TO 3
50 PRINT @Operationen: BD5B / 349A / 349A:  FLO SUBa%(i,j,k)
60 NEXT i,j,k

Die ausgedruckten Adressen folgen genau im Zweierabstand aufeinander. Der innerste Iterationen - Schleifen: LaufindexLaufindex 'i' entspricht der innersten Dimension von Operationen: BD5B / 349A / 349A: FLO SUBa%(). Ist die innerste Dimension einmal komplett durchlaufen, so wird der Erklärungen zu den Anschlussbezeichnungen: INDEXIndex der mittleren Dimension geändert, und es folgt wieder eine Sequenz, bei der sich nur der innerste Erklärungen zu den Anschlussbezeichnungen: INDEXIndex ändert.

Arrays aus VL-Records

Sollen Unterprogramme: Variablenvariable length Datenspeicherung und Datenstrukturen: Recordsrecords in einem Datenspeicherung und Datenstrukturen: ArraysArray gespeichert werden, so kann natürlich nicht mehr von einer einheitlichen Record-Länge ausgegangen werden. Mithin ist diese Formel sinnlos. Um hier ein spezielles Array-Element zu finden, muss man sich vom ersten Datenspeicherung und Datenstrukturen: RecordsRecord an durcharbeiten. Dazu müssen die VL-Records mit einer geeigneten Kennung voneinander getrennt werden. Der Zugriff auf einen speziellen Datenspeicherung und Datenstrukturen: RecordsRecord wird hier zum ziemlich zeitintensiven Abenteuer.

Jeder Basic-Interpreter speichert das Programm aber als einen Datenspeicherung und Datenstrukturen: ArraysArray von VLR-Records in seinem Speicher ab! Hier gibt es auch kaum eine andere Wahlmöglichkeit. Die einzelnen Programmzeilen können nun einmal allesamt unterschiedlich lang sein und werden im Speicher direkt aufeinander folgend abgespeichert. Bei jedem Sprung oder Die CPU Z80: Unterprogramm-AufrufeUnterprogramm-Aufruf muss der Interpreter dann den gewünschten Datenspeicherung und Datenstrukturen: RecordsRecord (sprich Programmzeile) erst suchen.

Dazu kommt noch, dass der Variablen-Bereich ebenso aufgebaut ist. Ein normaler Basic-Interpreter verbringt also den größten Teil seines Lebens mit der Suche nach VLR's in diesen beiden Datenspeicherung und Datenstrukturen: ArraysArrays. Das Locomotive-Basic im Schneider CPC wurde hier glücklicherweise erheblich beschleunigt.

Ein grundsätzlicher Nachteil von Datenspeicherung und Datenstrukturen: ArraysArrays wird bei der Betrachtung dieser Basic-Arrays deutlich: Wird eine Basiczeile gelöscht oder eingefügt, so müssen alle nachfolgenden Zeilen verschoben werden. Bei den Basiczeilen ist das nicht weiter schlimm. Die zehntel Sekunde, die der Interpreter dafür benötigt, bemerkt man kaum.

Bei VL-Records kommt noch hinzu, dass dieses Verschieben nicht nur stattfindet, wenn ein Datenspeicherung und Datenstrukturen: RecordsRecord eingefügt oder entfernt wird. Auch wenn ein Datenspeicherung und Datenstrukturen: RecordsRecord (z.LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
. eine Basiczeile) seine Länge ändert, müssen alle nachfolgenden Datenspeicherung und Datenstrukturen: RecordsRecords (Zeilen) entsprechend verschoben werden. Würden auch die Datentypen: StringsStrings im Variablenbereich so behandelt, könnte von Verarbeitungs-'Geschwindigkeit' in Einleitung: BASIC
Anhang: Basic
Basic
wohl kaum mehr die Rede sein.

Valid HTML   Valid CSS