Im Schneider CPC gibt es insgesamt 5 Sprungleisten. Die Vektoren aller fünf Sprungleisten sind im AnhangAnhang mit ihrer vollständigen Modul-Beschreibung aufgeführt.
Der erste ist der Überblick: LOW KERNEL JUMPBLOCK Die Firmware des Schneider CPC: LOW KERNEL JUMPBLOCKLOW KERNEL JUMPBLOCK mit den ROM-Konfiguration: RestartsRestarts. Weil hier die Einträge in Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM und RAM gemacht sind, eignet er sich nicht besonders zum Patchen. Ausgenommen davon sind allerdings zwei Stellen: Der ROM-Konfiguration: RestartsRestart 6, dem vom Vordergrund-Programm eine beliebige Die Fließkomma-Routinen: FunktionenFunktion zugeordnet werden kann und der Die Sprungleisten: External Interrupt EntryExternal Interrupt Entry.
Außerdem kann man den ROM-Konfiguration: RestartsRestart 0 Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: Reset Erklärung zu den Anschluss-Bezeichnungen: RESET Erklärung der Anschlussbelegung: Reset Erklärung zu den Bezeichnungen: RESET Erklärungen zu den Anschlussbezeichnungen: RESET Erläuterung zu den Anschlüssen 40 bis 45: 41 - RESET (0)RESET ENTRY im RAM umwidmen. Der Software-Reset mit [CTRL]-[SHIFT]-[ESC] funktioniert dann auch weiterhin, weil der immer den ROM-Restart benutzt. Solange man also sicher geht, dass beim Aufruf des eigenen ROM-Konfiguration: RestartsRestart 0 das untere Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM nie eingeblendet ist, kann nichts schief gehen.
Der MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKernel kann zwischen den normalen Ticker-Interrupts, die 300 mal in jeder Sekunde von der Die ICs im Überblick: Die ULA 40007, 40008 oder 40010 Die Anschlussbelegungen der wichtigsten ICs im CPC: Die ULA 40007 und 40008 (CPC 464 und 664) Die Anschlussbelegungen der wichtigsten ICs im CPC: Die ULA 40010 (CPC 6128)ULA erzeugt werden, und Interrupt-Anforderungen von Erweiterungen am Die Anschlüsse am Schneider CPC: Der Expansion-Port (Systembus)Systembus unterscheiden. Dazu dient die Dauer des Interrupt-Signals. Externe Der Kernel - Software-Interrupts: Interrupt-QuellenInterrupt-Quellen dürfen ihre Interrupt-Anforderung erst auf ausdrückliche Anweisung ihrer Behandlungs-Routine zurücknehmen (oder frühestens MAIN FIRMWARE JUMPBLOCK: CASSETTE MANAGER Die Firmware des Schneider CPC: CASSETTE MANAGERca. 20 Mikrosek. nach Aufnahme der Interrupt-Behandlung).
Erkennt die Interrupt-Behandlungs-Routine des MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKernel, dass ein externer Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt vorliegt, so wird der Vektor auf der Adresse &003LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTB aufgerufen.
Für jede Interrupt-erzeugende Systemerweiterung muss an dieser Stelle eine Behandlungs-Routine eingeklinkt werden. Da man davon ausgehen muss, dass eventuell noch weitere solcher Erweiterungen angeschlossen sein könnten, muss der Vektor an dieser Stelle ordnungsgemaess gepatcht werden. Das heißt, man muss eine Kopie des alten Eintrages anlegen, die angesprungen werden muss, wenn man feststellt, dass der Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt doch nicht für die eigene Routine war.
Die Behandlungs-Routine darf dabei die Die Tonausgabe: Das Kontrollregister (Reg. 7) Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)Register AF, BC, DE und HL verändern. Sie darf aber nicht den Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt wieder zulassen und auch die meisten Betriebssystems-Routinen nicht aufrufen. Am empfehlenswertesten ist es, den Event-Mechanismus des MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKernel in Anspruch zu nehmen. Darauf wird im Kapitel über den MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKernel noch einmal näher eingegangen.
Das folgende Assemblerprogramm veranschaulicht die allgemeine Vorgehensweise:
; Behandlungsroutine für eine Interrupt-erzeugende Hardware-Erweiterung
; ----------------------------------------------------------------------
;
INIT: LD HL,#003B ; Alten Eintrag an dieser Stelle retten.
LD DE,KOPIE ; Achtung: hier stehen 5 Datentypen: Bytes Datenbreite: BytesBytes für den Vektor
LD BC,5 ; zur Verfügung, die evtl. auch ausgenutzt sein
LDIR ; könnten.
;
LD HL,PATCH ; Eigenen Vektor an dieser Stelle installieren.
LD DE,#003B
LD BC,3
LDIR
;
LD Operationen: BD5B / 349A / 349A: FLO SUBA,#uv ; Irgendwie der Hardware mitteilen, dass sie
LD BC,#wxyz ; ab sofort Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupts erzeugen darf.
OUT (C),Operationen: BD5B / 349A / 349A: FLO SUBA
RET
;
KOPIE: DEFS 5 ; Platz für den alten Eintrag.
PATCH: JP XTINT ; Eigener Eintrag.
;
XTINT: LD BC,#wxyz ; Irgendwie überprüfen, dass der Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt
IN Operationen: BD5B / 349A / 349A: FLO SUBA,(BC) ; auch wirklich von der eigenen Erweiterung
CP #uv ; ausgelöst wurde.
JR NZ,KOPIE ; wenn nicht, muss die Kopie angesprungen werden.
;
LD Operationen: BD5B / 349A / 349A: FLO SUBA,#uv ; Interrupt-Signal abstellen.
LD BC,#wxyz
OUT (C),Operationen: BD5B / 349A / 349A: FLO SUBA
.... ; Interrupt-Behandlung.
....
RET ; fertig.
Der ROM-Konfiguration: RestartsRestart 6 ist so etwas wie ein Geschenk der Amstrad-Designer an den Anwender. Dieser ROM-Konfiguration: RestartsRestart wird vom Betriebssystem nicht benutzt und kann vom Vordergrund-Programm nach belieben eingesetzt werden. Da man Änderungen am ROM-Konfiguration: RestartsRestart aber nur im RAM machen kann, ist der ROM-Konfiguration: RestartsRestart im Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM so konstruiert Datenbreite: Wordsworden, dass hier zunächst der aktuelle ROM-Konfiguration: ROM-Status Anschluss eines Zusatz-ROM: ROM-StatusROM-Status in der Speicherzelle &002LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTB gerettet wird und danach der ROM-Konfiguration: RestartsRestart im RAM wiederholt wird.
Als Beispiel folgt ein Assemblerprogramm, das vielleicht für CPC 6128-Programmierer ganz interessant ist. Ähnlich dem ROM-Konfiguration: RestartsRestart 4 RAM LAM, mit dem man unabhängig vom aktuellen ROM-Konfiguration: ROM-Status Anschluss eines Zusatz-ROM: ROM-StatusROM-Status ein Datentypen: Bytes Datenbreite: BytesByte aus dem RAM lesen kann, soll ein neuer Befehl gebildet werden, der das Datentypen: Bytes Datenbreite: BytesByte immer aus der zusätzlichen RAM-Bank liest. 464- und 664-Benutzer können sich aber immerhin ansehen, wie dieser ROM-Konfiguration: RestartsRestart eingesetzt werden kann:
; ROM-Konfiguration: RestartsRestart 6: ZRAM LAM
;
; simuliert ein LD Operationen: BD5B / 349A / 349A: FLO SUBA,(HL) aus dem zusätzlichen RAM des CPC 6128.
;
INIT: LD HL,PATCH ; Initialisierung des ROM-Konfiguration: RestartsRestart 6:
LD DE,#0030
LD BC,3 ; Sprung zur eigenen Routine RAMLAM an die
LDIR ; Adresse des ROM-Konfiguration: RestartsRestart 6 kopieren.
;
LD Operationen: BD5B / 349A / 349A: FLO SUBA,#FF ; #FF soll als Kennung dafür dienen, dass der
LD (#002B),Operationen: BD5B / 349A / 349A: FLO SUBA ; ROM-Restart 6 in dieser Speicherzelle keinen
RET ; alten ROM-Konfiguration: ROM-Status Anschluss eines Zusatz-ROM: ROM-StatusROM-Status gespeichert hat; dass der
; ; ROM-Konfiguration: RestartsRestart also bei eingeschaltetem unteren RAM
PATCH: JP RAMLAM ; erfolgte.
;
; Die Routine RAMLAM soll wie der Z80-Befehl LD Operationen: BD5B / 349A / 349A: FLO SUBA,(HL) funktionieren.
; das heißt, nur das A-Register wird verändert. F, BC, DE, HL, IX und IY
; bleiben unberührt:
;
RAMLAM: PUSH HL ; HL retten.
PUSH AF ; AF retten.
;
LD Operationen: BD5B / 349A / 349A: FLO SUBA,H ; Port B - Input: &F5xx: Bits 1, 2 und 3: Port C - Output: &F6xx: Bit 6 und 7:Bits 14 und 15 der Adresse (Speicherviertel)
RLCA ; in die Port B - Input: &F5xx: Bits 1, 2 und 3: Port C - Output: &F6xx: Bit 6 und 7:Bits 0 und 1 von Operationen: BD5B / 349A / 349A: FLO SUBA schieben.
RLCA
AND 7 ; Port C - Output: &F6xx: Bits 0 bis 3:Bits 3 bis 7 Real: Nullnullen und
OR 4 ; Datenbreite: Bits Port B - Input: &F5xx: Bit 0: Port B - Input: &F5xx: Bit 4: Port B - Input: &F5xx: Bit 5: Port B - Input: &F5xx: Bit 6: Port B - Input: &F5xx: Bit 7: Port C - Output: &F6xx: Bit 4: Port C - Output: &F6xx: Bit 5:Bit 2 setzen.
Maschinencode über HIMEM: CALLCALL #BD5B ; KERNEL: BD5B: KL RAM SELECTKL RAM SELECT -> von &4000 bis &7FFF wird der
; ; entsprechende Die Speicherkonfiguration im Schneider CPC: BlockBlock des zus. RAM eingeblendet.
;
RES 7,H ; Adresse in HL in den Bereich &4000 bis &7FFF
SET 6,H ; zwingen
LD H,(HL) ; und Wert zunächst nach H laden.
;
Maschinencode über HIMEM: CALLCALL #BD5B ; KERNEL: BD5B: KL RAM SELECTKL RAM SELECT. Operationen: BD5B / 349A / 349A: FLO SUBA enthielt noch den alten
; ; RAM-Status. Der wird hiermit restauriert.
;
LD Operationen: BD5B / 349A / 349A: FLO SUBA,(#002B) ; Erklärung der Anschlussbelegung: TestTeste, ob LOW KERNEL JUMPBLOCK: 0030 - RST 6: LOW USER RESTARTRST_6 mit unterem Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM = Ein erfolgte.
CP #FF
Maschinencode über HIMEM: CALLCALL NZ,OLDROM ; Wenn ja, restauriere ROM-Konfiguration: ROM-Status Anschluss eines Zusatz-ROM: ROM-StatusROM-Status.
;
POP AF ; Restauriere F
LD Operationen: BD5B / 349A / 349A: FLO SUBA,H ; Wert aus dem zus. RAM nach Operationen: BD5B / 349A / 349A: FLO SUBA laden
POP HL ; Restauriere HL
RET ; und fertig.
;
; Restauriere alten ROM-Konfiguration: ROM-Status Anschluss eines Zusatz-ROM: ROM-StatusROM-Status. Dieser war in &002LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTB gespeichert und ist jetzt
; im A-Register.
;
OLDROM: DI ; zweiter Registersatz wird benutzt.
EXX
; ; C' muss ständig korrekten ROM-Konfiguration: ROM-Status Anschluss eines Zusatz-ROM: ROM-StatusROM-Status (und
; ; Bildschirm-Modus) enthalten. LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTB' die Speicher und Peripherie: Reservierte und frei verfügbare I/O-AdressenI/O-Adresse
; ; der Die ICs im Überblick: Die ULA 40007, 40008 oder 40010 Die Anschlussbelegungen der wichtigsten ICs im CPC: Die ULA 40007 und 40008 (CPC 464 und 664) Die Anschlussbelegungen der wichtigsten ICs im CPC: Die ULA 40010 (CPC 6128)ULA.
LD C,Operationen: BD5B / 349A / 349A: FLO SUBA ; ---> Alte Die Speicherkonfiguration im Schneider CPC: ROM-KonfigurationROM-Konfiguration nach C' und
OUT (C),C ; Speicher und Peripherie: Die ULA Die Bildausgabe: Die ULAdie ULA damit programmieren.
EXX
EI
LD Operationen: BD5B / 349A / 349A: FLO SUBA,#FF ; in &002LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPTB wieder #FF eintragen, falls nächster
LD (#002B),Operationen: BD5B / 349A / 349A: FLO SUBA ; ROM-Konfiguration: RestartsRestart mit unten RAM = Ein erfolgt.
RET
Außer dem Überblick: LOW KERNEL JUMPBLOCK Die Firmware des Schneider CPC: LOW KERNEL JUMPBLOCKLOW KERNEL JUMPBLOCK gibt es auch noch den Die Sprungleisten: High Kernel Jumpblock Überblick: HIGH KERNEL JUMPBLOCK Die Firmware des Schneider CPC: HIGH KERNEL JUMPBLOCKHIGH KERNEL JUMPBLOCK im Bereich &HIGH KERNEL JUMPBLOCK: B900: HI KL U ROM ENABLEB900 bis &B920. Hier finden sich nur Routinen, mit denen man Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs umschalten kann, außerdem LDDR und LDIR-Routinen, die Speicherbereiche bei eingeblendeten RAMs verschieben. Letzteres sind für Maschinencode auf dem CPC: ROM-SoftwareROM-Software interessante Grundlagen: UnterprogrammeUnterprogramme.
Ebenfalls zu diesem BCD1: KL LOG EXT: 1. JumpblockJumpblock gehört noch &HIGH KERNEL JUMPBLOCK: B921: HI KL POLL SYNCHRONOUSB921 HI KL POLL SYNCHRONOUS. Mit dieser Routine lässt sich sehr schnell Erklärung der Anschlussbelegung: Testtesten, ob ein synchroner Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: INT - InterruptInterrupt mit einer höheren Priorität als der laufenden auf seine Ausführung wartet. Diese Routine ist aber nicht als Vektor ausgelegt, sondern beginnt direkt auf dieser Adresse.
Bei den CPCs 664 und 6128 kommt dann noch mit der Adresse &HIGH KERNEL JUMPBLOCK: B92A: HI KL SCAN NEEDEDB92A die Routine HIGH KERNEL JUMPBLOCK: B92A: HI KL SCAN NEEDEDHI KL SCAN NEEDED dazu, die ebenfalls nicht als Vektor ausgeführt ist.
Die eigentliche Sprungleiste zu den Betriebssystem-Routinen ist aber Die Sprungleisten: Der Main Firmware Jumpblockder MAIN FIRMWARE JUMPBLOCK, der auf der Adresse &KEY MANAGER: BB00: KM INITIALIZEBB00 beginnt und Garbage Collection: ... beim CPC 464beim CPC 464 bis &BD39 reicht. Garbage Collection: ... beim CPC 464Beim CPC 664 kamen noch einige Vektoren hinzu, vor allem für Die Abteilungen des Betriebssystems: Die Grafik-VDUdie Grafik-VDU, so dass dieser BCD1: KL LOG EXT: 1. JumpblockJumpblock hier bis &BD5A geht. Garbage Collection: ... beim CPC 464Beim CPC 6128 kam auch noch der Vektor KERNEL: BD5B: KL RAM SELECTKL RAM SELECT dazu. Hier geht der BCD1: KL LOG EXT: 1. JumpblockJumpblock bis &BD5D.
In diesem Überblick: MAIN FIRMWARE JUMPBLOCKMain Firmware Jumpblock befinden sich die (natürlich wieder mit ROM-Konfiguration: RestartsRestarts gebildeten Vektoren) zu allen Abteilungen der Die Firmware des Schneider CPCFirmware. Dieser BCD1: KL LOG EXT: 1. JumpblockJumpblock ist, wie sein Name auch schon sagt, für den Assembler-Programmierer überhaupt der wichtigste von allen.
Nicht zum Betriebssystem zählt der BCD1: KL LOG EXT: 1. JumpblockJumpblock, der vom MAIN FIRMWARE JUMPBLOCK: KERNEL Die Firmware des Schneider CPC: KERNELKernel für den Basic-Interpreter eingerichtet wird. Trotzdem wird auch diese Sprungleiste durch die Betriebssystem-Routine JUMPER: BD37: JUMP RESTOREJUMP RESTORE eingerichtet.
In diesem BCD1: KL LOG EXT: 1. JumpblockJumpblock sind die Vektoren zum Zeileneditor, zu den Die Basic-Vektoren: Fließkomma-RoutinenFließkomma-Routinen und (nur Garbage Collection: ... beim CPC 464beim CPC 464) zu den Die Basic-Vektoren: Integer-RoutinenInteger-Routinen zusammengefasst.
Wuenschenswert wäre gewesen, wenn auch dieser Bereich eine garantierte Lage im RAM hätte. Dem ist leider nicht so. Er wird immer direkt über den normalen Firmware-Jumpblock 'geklebt', und da dieser bei allen CPCs verschieden lang ist, ändert sich auch die Lage dieses Die Speicherkonfiguration im Schneider CPC: BlockBlocks. Zusätzlich hat man sich bei Amstrad noch den Scherz erlaubt, ab dem CPC 664 Die Basic-Vektoren: Die Integer-Routinendie Integer-Routinen aus dem Betriebssystem in's Basic-ROM zu verbannen, womit auch deren Vektoren wegfielen. Außerdem hat man die verbliebenen Fließkomma-Vektoren umgestellt, und auch hier ein paar gestrichen.
Wer also den Zeileneditor oder Die Basic-Vektoren: Die Fließkomma-Routinendie Fließkomma-Routinen benutzen will, muss, sofern er Programme schreibt, die auf allen CPCs laufen sollen, hier ganz besonders aufpassen, und zunächst einmal Erklärung der Anschlussbelegung: Testtesten, auf welchem Rechner das Programm denn gerade läuft.
Der letzte BCD1: KL LOG EXT: 1. JumpblockJumpblock stellt eine weitere Die CPU Z80: Besonderheiten der Z80 im Schneider CPCBesonderheit dar. Die Sprungleisten: die IndirectionsDie Indirections sind eigentlich keine Vektoren, sondern Umleitungen von ROM-Routinen über Die Anschlussbelegungen der wichtigsten ICs im CPC: Das RAM 4164das RAM.
Einige Routinen rufen an entscheidenden Stellen diesen 'Vektor' im RAM auf, wo normalerweise nur wieder ein Sprung zurück zur Routine eingetragen ist. Der Umweg über Die Anschlussbelegungen der wichtigsten ICs im CPC: Das RAM 4164das RAM bietet aber die Möglichkeit hier eine eigene Routine zu installieren, um, wie bei den normalen Vektoren, die Die Fließkomma-Routinen: FunktionenFunktion der einzelnen Betriebssystem-Routinen zu ändern.
Der Patch einer Überblick: Die Indirections der Firmware-Packs Die Firmware des Schneider CPC: Die Indirections der Firmware-PacksIndirection wirkt jedoch auf alle Programme im Computer. Auch Betriebssystem-Routinen, die andere Betriebssystem-Routinen aufrufen, werden davon beeinflusst, beim Patch eines Vektors jedoch nicht, weil die Betriebsystem-Routinen die Vektoren nicht selbst aufrufen.
Dabei sind Die Sprungleisten: die Indirectionsdie Indirections nur mit dem 'profanen' Z80-Befehl 'JP' gebildet, weil sie ja bereits vom unteren Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM aus angesprungen werden. Patcht man eine Überblick: Die Indirections der Firmware-Packs Die Firmware des Schneider CPC: Die Indirections der Firmware-PacksIndirection, so ist immer das untere Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM eingeblendet und der Status des oberen unbestimmt.
Außerdem stellen Patches einer Überblick: Die Indirections der Firmware-Packs Die Firmware des Schneider CPC: Die Indirections der Firmware-PacksIndirection meist einen Eingriff auf der untersten Ebene des Betriebssystems dar. Plausibilitäts-Kontrollen, die viele Vektoren noch mit den ihnen übergebenen Argumenten vornehmen, sind hier nicht mehr üblich.
Die Sprungleisten: die IndirectionsDie Indirections liegen im Bereich von &Die Indirections der Firmware-Packs: BDCD: IND TXT DRAW CURSORBDCD bis &BDF3 (CPC 464) bzw. &BDF6 (CPC 664, 6128).
|