🔀Sprungleisten, Indirections & RSX

Die CPC-Firmware liegt im unteren ROM – aber kein Programm springt direkt hinein. Alle Aufrufe gehen über Sprungleisten im RAM. So konnte Amstrad das ROM zwischen 464, 664 und 6128 ändern, ohne dass Programme angepasst werden mussten.

🗂️Vier Sprungleisten

BereichAdressenEinträgeAufbauWozu
Hauptsprungleiste&BB00–&BD5D202 (464: 190)RST 1 + Low Addressfür Programme: alle Pakete KM, TXT, GRA, SCR, CAS, SOUND, KL, MC
Indirections&BDCD–&BDF614 (464: 13)JP adressevon der Firmware selbst benutzt – umlenken ändert das Verhalten der Firmware
High Kernel&B900–&B92C13Routinen im RAMROMs ein-/ausblenden, ROM wählen, LDIR/LDDR unter ROMs
Low Kernel&0000–&003F16RST 0–7 + Routinenerweiterte „Befehle“: LOW JUMP, FAR CALL, RAM LAM, FIRM JUMP; Interrupt-Einsprung

🔍So sieht die Hauptsprungleiste im Speicher aus

Jeder Eintrag belegt 3 Bytes: &CF ist der Opcode von RST 1 (LOW JUMP), dahinter folgt die „Low Address“: Bits 0–13 = Adresse im unteren ROM, Bit 14 = unteres ROM aus, Bit 15 = oberes ROM aus.
AdresseBytesBedeutungName
&BB00CF 00 81RST 1 · &0100 · oberes ROM ausKM INITIALISE
&BB03CF 04 81RST 1 · &0104 · oberes ROM ausKM RESET
&BB06CF 08 81RST 1 · &0108 · oberes ROM ausKM WAIT CHAR
&BB09CF 0C 81RST 1 · &010C · oberes ROM ausKM READ CHAR
&BB0CCF 10 81RST 1 · &0110 · oberes ROM ausKM CHAR RETURN
&BB0FCF 14 81RST 1 · &0114 · oberes ROM ausKM SET EXPAND
&BB5ACF 78 81RST 1 · &0178 · oberes ROM ausTXT OUTPUT
⚠️ Ehrlicher Hinweis zum Simulator
Die Bytes stammen aus dem Simulator dieser Seite. Aufbau und Bits der Low Address entsprechen dem Original (SOFT 968, Abschnitte 2.3 und 18). Die Zieladressen im unteren ROM sind aber simulatorintern – dort stehen keine echten ROM-Routinen, sondern „Fallen“, an denen TypeScript übernimmt. Auf einem echten 6128 stehen an diesen Stellen andere Adressen.

🪝Umlenken: Sprungleiste oder Indirection?

Eintrag der Hauptsprungleiste überschreiben

Wirkt nur auf Aufrufer über die Sprungleiste – z. B. BASIC. Die Firmware selbst ruft ihre Routinen intern direkt auf (SOFT 968, Abschnitt 14). Zurück zum Original mit JUMP RESTORE (&BD37).

        ld a,&c3        ; JP …
        ld (&bb5a),a
        ld hl,meine     ; … meine Routine
        ld (&bb5b),hl   ; ab jetzt landet CALL &BB5A hier

Indirection überschreiben

Wirkt auf die Firmware selbst: TXT OUTPUT ruft für jedes druckbare Zeichen TXT WRITE CHAR (&BDD3). Wer die alten 3 Bytes rettet und am Ende dorthin springt, erweitert die Firmware. Beispiel mit Zähler: TXT WRITE CHAR.

        ld hl,&bdd3
        ld de,alt
        ld bc,3
        ldir            ; alten JP retten
        ld a,&c3
        ld (&bdd3),a
        ld hl,neu
        ld (&bdd4),hl
        …
neu:    …               ; eigene Arbeit
alt:    ds 3            ; danach: alter JP ins ROM

🧩RSX: eigene BASIC-Befehle mit |NAME

Eine „Resident System Extension“ meldet eine Befehlstabelle beim Kernel an (KL LOG EXT, &BCD1). BASIC findet den Befehl dann über KL FIND COMMAND, wenn man |NAME eintippt.
        org &4000
        ld bc,tabelle   ; Befehlstabelle
        ld hl,arbeit    ; 4 Bytes für den Kernel
        jp &bcd1        ; KL LOG EXT
tabelle: dw namen       ; Adresse der Namensliste
        jp hallo        ; Eintrag 0 → |HALLO
        jp zwei         ; Eintrag 1 → |ZWEI
namen:  db "HALL","O"+&80  ; letztes Zeichen mit Bit 7
        db "ZWE","I"+&80
        db 0            ; Ende der Liste
arbeit: ds 4
hallo:  …               ; A = Anzahl Parameter, IX → Parameter
zwei:   …
💡 Parameter aus BASIC
Bei |HALLO,10,20 steht in A die Anzahl der Parameter (2), IX zeigt auf den letzten Parameter; der i-te von n liegt bei IX + (n − i) · 2. Jeder Parameter ist 2 Byte groß: Zahlen direkt, Zeichenketten als Adresse eines Deskriptors (Länge, Adresse) (SOFT 968, Abschnitt 10.6/10.7).
✅ Im Simulator ausprobieren
KL LOG EXT und KL FIND COMMAND haben lauffähige Beispiele.

📼Maschinenprogramm aus BASIC starten

1. Platz schaffen

MEMORY &3FFF setzt die Obergrenze für BASIC unter &4000 – dann überschreibt BASIC das Programm nicht mit Variablen oder Zeichenketten.

2. Laden

LOAD "PROG.BIN",&4000 lädt eine Binärdatei an eine Adresse (von Kassette oder Diskette) – oder ein BASIC-Lader schreibt die Bytes per POKE.

3. Starten

CALL &4000 ruft das Programm auf; ein abschließendes RET kehrt zu BASIC zurück. Im Simulator steht dafür eine Rücksprungadresse auf dem Stapel.

10 MEMORY &3FFF
20 summe=0
30 FOR a=&4000 TO &4016
40   READ b$: b=VAL("&"+b$): POKE a,b: summe=summe+b
50 NEXT
60 IF summe<>&885 THEN PRINT "Tippfehler in den DATA-Zeilen!": END
70 CALL &4000
80 DATA 21,0C,40,7E,B7,C8,CD,5A,BB,23,18
90 DATA F7,48,61,6C,6C,6F,20,43,50,43,21,00

Die Prüfsumme &885 = 2181 ist die Summe der 23 Bytes (per Test gegen den Assembler geprüft) – ein üblicher Schutz gegen Abtippfehler aus Zeitschriften-Listings.

➗Und die Rechenroutinen?

💡 Arithmetik-Sprungleiste
Zwischen Hauptsprungleiste und Indirections liegt beim 664/6128 eine Sprungleiste für die Gleitkomma- und Ganzzahlroutinen von BASIC (REAL/INTEGER). Sie gehört nicht zur Firmware-Beschreibung in SOFT 968 und liegt beim 464 an anderen Adressen – deshalb fehlt sie in der Tabelle (Taylor/Defoe listen sie getrennt als „Maths Firmware“).