Das Schneider CPC Systembuch

Das Betriebssystem des Schneider CPC

Die Sprungleisten des Betriebssystems

Die Sprungleisten

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 JUMPBLOCK
LOW 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.

External Interrupt Entry

Der MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
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 MANAGER
ca
. 20 Mikrosek. nach Aufnahme der Interrupt-Behandlung).

Erkennt die Interrupt-Behandlungs-Routine des MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
, 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 INTERRUPT
B
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: KERNEL
Kernel
in Anspruch zu nehmen. Darauf wird im Kapitel über den MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
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: Bytes
Bytes
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.
User Restart

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-Status
ROM-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 INTERRUPT
B
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-Status
ROM-Status
ein Datentypen: Bytes
Datenbreite: Bytes
Byte
aus dem RAM lesen kann, soll ein neuer Befehl gebildet werden, der das Datentypen: Bytes
Datenbreite: Bytes
Byte
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-Status
ROM-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 A,(#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-Status
ROM-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-Status
ROM-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 INTERRUPT
B
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-Status
ROM-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 INTERRUPT
B
' 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 ULA
die 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 INTERRUPT
B
wieder #FF eintragen, falls nächster LD (#002B),Operationen: BD5B / 349A / 349A: FLO SUBA ; ROM-Konfiguration: RestartsRestart mit unten RAM = Ein erfolgt. RET
High Kernel Jumpblock

Außer dem Überblick: LOW KERNEL JUMPBLOCK
Die Firmware des Schneider CPC: LOW KERNEL JUMPBLOCK
LOW KERNEL JUMPBLOCK
gibt es auch noch den Die Sprungleisten: High Kernel Jumpblock
Überblick: HIGH KERNEL JUMPBLOCK
Die Firmware des Schneider CPC: HIGH KERNEL JUMPBLOCK
HIGH 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.

Der Main Firmware Jumpblock

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.

Der Jumpblock des Basic-Interpreters

Nicht zum Betriebssystem zählt der BCD1: KL LOG EXT: 1. JumpblockJumpblock, der vom MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
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.

die Indirections

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-Packs
Indirection
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-Packs
Indirection
, 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-Packs
Indirection
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).

Valid HTML   Valid CSS