🔀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
| Bereich | Adressen | Einträge | Aufbau | Wozu |
|---|---|---|---|---|
| Hauptsprungleiste | &BB00–&BD5D | 202 (464: 190) | RST 1 + Low Address | für Programme: alle Pakete KM, TXT, GRA, SCR, CAS, SOUND, KL, MC |
| Indirections | &BDCD–&BDF6 | 14 (464: 13) | JP adresse | von der Firmware selbst benutzt – umlenken ändert das Verhalten der Firmware |
| High Kernel | &B900–&B92C | 13 | Routinen im RAM | ROMs ein-/ausblenden, ROM wählen, LDIR/LDDR unter ROMs |
| Low Kernel | &0000–&003F | 16 | RST 0–7 + Routinen | erweiterte „Befehle“: LOW JUMP, FAR CALL, RAM LAM, FIRM JUMP; Interrupt-Einsprung |
🔍So sieht die Hauptsprungleiste im Speicher aus
| Adresse | Bytes | Bedeutung | Name |
|---|---|---|---|
| &BB00 | CF 00 81 | RST 1 · &0100 · oberes ROM aus | KM INITIALISE |
| &BB03 | CF 04 81 | RST 1 · &0104 · oberes ROM aus | KM RESET |
| &BB06 | CF 08 81 | RST 1 · &0108 · oberes ROM aus | KM WAIT CHAR |
| &BB09 | CF 0C 81 | RST 1 · &010C · oberes ROM aus | KM READ CHAR |
| &BB0C | CF 10 81 | RST 1 · &0110 · oberes ROM aus | KM CHAR RETURN |
| &BB0F | CF 14 81 | RST 1 · &0114 · oberes ROM aus | KM SET EXPAND |
| &BB5A | CF 78 81 | RST 1 · &0178 · oberes ROM aus | TXT OUTPUT |
🪝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 hierIndirection ü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
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: …|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).📼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,00Die 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.