Abläufe während des Start eines MSX Computers

Quelle: "The Complete MSX Programmers Guide" S.244ff

Auffinden von RAM

Wenn der MSX Computer eingeschaltet wird, durchsucht es alle Slots um daraus das System RAM zu allokieren. Dazu finden diese Schritte statt:
Zuerst sucht es RAM Bausteine in Page 2 also die Speicherstellen mit den Adressen H8000 bis HBFFF in allen Slots, dann aktiviert es den Slot mit dem größten gefundenen RAM. Wenn es mehrere Slots mit den gleich größten RAM gibt, so nutzt es den Slot mit der niedersten Nummer.
Als nächstes sucht MSX Basic die Page 3, also die Speicherstellen beginnend mit der Adresse HC000 bis HFFF in allen Slots. Auch hier wird der Slot aktiviert in dem der größte gefundene RAM gefunden worden ist. Wird auch hier bei mehreren Slots der gleich größte RAM gefunden, so wird ebenso der Slot mit der kleinsten Nummer aktiviert.
Als letztes prüft der Computer ob der gefundene Speicher von Page2 und Page3 durchgängig ist. Das bedeutet dass bei jeder Zahl, also Adresswert eine Speicherzelle gefunden werden kann. Durch das Ende kennt der Computer die höchste verfügbare Speicherzelle und schreibt diesen Wert in die Systemvariable BOTTOM in die später genutzte Speicherstelle HFC48.

Auffinden von Cartridge Software

Nachdem dem System der verfügbare RAM bekannt ist, wird geprüft ob Cartridges in den Slots 2 und 3 eingesteckt sind. Die entsprechendes Pages in diesen Slots beginnen ab H4000 bis HBFFF. Der Computer sucht hier zu valide Werte an den jeweiligen Anfängen der Speicherbereiche. 
Diese sind: 
Wenn entsprechende Funktionen (init,text,etc..) vom Entwickler des Cartridge nicht benötigt werden, so tragen sie den Wert 0. 
Das Betriebssystem BASIC vollzieht diese Schritte beim Start:
Prüft auf den 'AB'-ID um zu verstehen dass es sich hierbei um ein Cartridge handelt 
Das ist obligatorisch da ansonsten der Computer das als RAM sieht, obwohl nur ROM Bausteien drin sind, und crashed womöglich.
BASIC führt die INIT routine aus, wenn in Form der Startadresse der Routine diese definiert ist. Wenn nicht, findet es hier eine 0.
BASIC führt die BASIC routine aus, wenn in Form der Startadresse der Bereich definiert ist (TEXT), an dem Basic Tokens abgelegt sind. Wenn nicht definiert, muss es hier eine 0 finden.
Der Code dessen Startadresse in STATEMENT und in DEVICE angegeben ist, wird beim Start nicht ausgeführt, da dieser vom Benutzer bei Bedarf angefordert wird. Der Computer merkt sich diese adressen jedoch und beachtet diese bei entsprechenden BASIC Befehlen, wie z.B. CALL und OPEN <gerätenummer>, "blabla".
Statement - wird bei einer CALL Anweisung gerufen. 
Device - wird bei einem OPEN Command gerufen. 
 

Statement Aufruf

Wenn BASIC ein "CALL <BEFEHL>" sieht, dann kopiert es den <BEFEHL> an die Speicherstelle HFD89 (PROCEDUREname := PROCNM). Der Befehl darf maximal 15 Zeichen haben, da das 16te Zeichen ein 0-terminator ist. Das Register "HL" zeigt auf die Speicherstelle nach der '0'. BASIC übergibt den Ablauf an die Speicherstelle, die oben in der Statement-Adresse angegeben worden war. Der Code an dieser Stelle muss nun HL soweit Rückwärts laufen(echt Rückwärts?) bis es die Zeichenkette also den <BEFEHL> als solches gelesen hat. Das entsprechende Programm muss nun prüfen, ob es mit diesem Befehl etwas anfangen kann oder nicht. Kann es das, dann macht es das. Rock'n Roll. Kann es das nicht, kehrt es zurück zu BASIC. Es muss noch was mit dem Carry Flag und dem text pointer machen. (siehe hierzu die Experimente im openMSX experimente-procnm)

Device Aufruf

MSX BASIC die Fähigkeit ein physisch eingestecktes Cartridge als Hardwareerweiterung bei sich einzuhängen, so als wäre es ein Input/Output Gerät, z.B. Tastatur, Drucker, Parallelport. Damit dies Funktioniert gilt es folgendes zu beachten: 
Beim Boot wird DEVICE gelesen. Dort muss sich die Startadresse befinden, ab der der DEVICE-Handler (Unterprogramm zum Behandeln von DEVICE Operationen) befindet. Stellt das Cartridge das nicht zur Verfügung, muss in DEVICE der Wert 0 stehen.
Das Cartridge muss den Speicherplatz in Page 1 (H4000-HBFFF) belegen
ein Cartridge mit 16K kann vier logische Geräte physisch anschliessen
Gerätenamen werden bei Benutzung in z.B. open statements in den PROCNM Bereich (HFD89) geschrieben - wie auch im Statement Bereich. Der Gerätename wird mit einer "0" abgeschlossen und darf daher maximal 15 Zeichen lang sein
Wenn BASIC ein Gerätenamen in einer "OPEN" Anweisung sieht , welche nicht dem System bekannt ist, dann ruft es die Routine, mit dem Wert HFF im Akku-Register, die beim Start des Systems an der Adresse DEVICE angegeben worden ist. Der Handler muss früher oder später zurück kehren zu BASIC. Dazu muss dem BASIC ein Wert zwischn 0-3 zurückgegeben werden. (Stimmt das? WIll BASIC verstehen was es für ein Gerät ist?) BASIC versteht dann dass da tatsächlich etwas ist, mit dem es arbeiten kann. Um den tatsächlichen I/O Request fortzuführen, ruft BASIC die DEVICE-Routine nochmal auf, jedoch mit folgenden Werten im AKku: 
 
0 - open
2 - close
4 - random I/O
6 - sequential output
8 - sequential input
10 - LOC function
12 - LOF function
14 - EOF function
16 - FPOS function
18 - Backup Character

TEXT

Noch zwei drei Hinweise zu Basic 
 
Wenn mehrere Cartridges eingesteckt sind mit einem TEXT , dann wird nur der TEXT Bereich genutzt, der in dem Slot gefunden worden ist, der die kleinste Slotnummer hat
Das Basic Programm ab der Speicherstelle TEXT ist als BASIC TOKENs abgelegt
Das Cartridge muss sich an Page2 (also ab H8000 bis HBFFF) befinden - also maximal 16KB
jegliche RAM Bausteine an Page2 in anderen Slots wird deaktiviert und kann nicht von diesem BASIC Programm genutzt werden

INIT

INIT trägt die Startadresse der "initialisierungsroutine". Dieses initialisiert üblicherweise das Cartridge und setzt HOOK Adressen (später dazu). Aber das muß nicht das einzigste sein. Ab hier kann auch komplett ein Spiel, oder sonstiges ANwendungsprogramm gestartet werden. Quasi direkt beim Einschalten des Rechners. 
Wenn es keine Initialierungsroutine gibt, so muss INIT mit 0 gesetzt sein.