Das Schneider CPC Systembuch

Das Betriebssystem des Schneider CPC

Die Sprungleisten des Betriebssystems

Patchen von Vektoren

Das Patchen muss dabei so lautlos wie möglich über die Buehne gehen. Auf die Vektoren greift beim Schneider CPC ja nicht nur ein einziges Programm zu. Hier können gleichzeitig ein Vordergrund- und beliebig viele Hintergrund-Programme im Speicher vorhanden sein, die alle Routinen des Betriebssystems benutzen können.

Änderungen, die man für das eine Programm vorgesehen hat, können katastrophale Folgen für ein anderes Programm nach sich ziehen, wenn dieses den veränderten Vektor benutzen will. Die ursprüngliche 'Modul'-Beschreibung des gepatchten Vektors darf möglichst nicht geändert werden:

   Eingabe - Die Fließkomma-Routinen: FunktionenFunktion - Ausgabe

Zur Ein- und Ausgabe gehören dabei die Beschreibung der Register-Schnittstellen:

• In welchen Registern werden welche Eingaben erwartet?
• In welchen Registern werden welche Ausgaben gemacht?
• Welche Die Tonausgabe: Das Kontrollregister  (Reg. 7)
Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)
Register
bleiben garantiert unverändert?

Auch die Die Fließkomma-Routinen: FunktionenFunktion muss möglichst die gleiche bleiben. Wenn man einen Vektor für die Textausgabe zum Ansteuern des Sound-ICs umwidmet, wird man sich sehr wahrscheinlich nicht mehr mit dem Computer 'unterhalten' können, weil alle Antworten, die auf dem Bildschirm dargestellt werden sollten, in ein unverständliches Pfeifkonzert umgesetzt werden.

Trotzdem ist aber immer gerade die Die Fließkomma-Routinen: FunktionenFunktion eines Vektors, die durch einen Patch geändert werden soll. Die Änderung muss sich eben nur in Grenzen Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: Halthalten. So ist es beispielsweise eine beliebte Idee, die Textausgabe vom Bildschirm auf den Drucker umzulenken, um beispielsweise auch einmal einen Disketten-Katalog zu Papier bringen zu können.

Die bekanntesten Patches werden wohl von Die Abteilungen des Betriebssystems: AmsdosAmsdos vorgenommen. Viele Vektoren zum MAIN FIRMWARE JUMPBLOCK: CASSETTE MANAGER
Die Firmware des Schneider CPC: CASSETTE MANAGER
Cassette Manager
werden 'umgebogen', um Ein- und Ausgabe-Dateien nun auf einem Diskettenlaufwerken zu verwalten.

Beim Patchen sind dabei folgende Punkte zu beachten:

• Es dürfen keine zusätzlichen Eingaben erwartet werden. Man kann allerdings weniger verlangen, als der Original-Eintrag.

• Alle Ausgaben, die vom Original-Eintrag gemacht wurden, müssen auch vom Patch an das aufrufende Programm zurückgeliefert werden.

• Alle Die Tonausgabe: Das Kontrollregister (Reg. 7)
Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)
Register
, die bisher unverändert blieben, dürfen auch durch die neue Routine nicht verändert werden.

• Es sollten keine völlig sinnentstellende Änderungen an einzelnen Vektoren vorgenommen werden.

Darüber hinaus gibt es noch einige praktische Erwägungen. So ist es oft sinnvoll, den alten Eintrag zu retten. Dann kann man eine Änderung zu einem späteren Zeitpunkt auch wieder rückgängig machen. Oder man kann die Original-Routine noch mitbenutzen, nachdem man beispielsweise einige Vorarbeiten oder zusätzliche Erklärung der Anschlussbelegung: TestTests vorgenomen hat.

• Meist ist es sinnvoll, den alten Vektor zu retten, bevor man seinen Patch installiert.

Deshalb müssen auch alle Vektoren ortsunabhängig sein. Ein normaler Z80-Sprungbefehl ist das. Adressierungsarten der Z80: RelativRelative Sprünge in Vektoren sind nicht sehr ratsam.

• Der Patch muss ortsunabhängig (position independant) sein.

Achtung: Die von Die Abteilungen des Betriebssystems: AmsdosAmsdos gepatchten Vektoren sind nicht ortsunabhängig !!

Wer so genial saublöd gepatchte Vektoren wie die von Die Abteilungen des Betriebssystems: AmsdosAmsdos erneut patchen will, muss einigen Umstand in Kauf nehmen, wenn er die 'Original'-Amsdos-Vektoren noch mitbenutzen will. Das muss dann etwa so vor sich gehen:

• Initialisieren: Alten (Die Abteilungen des Betriebssystems: AmsdosAmsdos-) Vektor retten, eigenen Vektor eintragen.

• Wenn jetzt die eigene Routine aufgerufen wurde:

Evtl. eigenen Programmcode abarbeiten.

Alten Vektor wieder restaurieren und den Vektor aufrufen (Originalfunktion)

Danach wieder den eigenen Vektor eintragen.

Evtl. eigenen Programmcode abarbeiten und Return.

Es ist nicht gerade vorbildlich, wie man sich hier bei Amstrad über die selbst erfundenen Spielregeln hinwegsetzte.

Katalog auf dem Drucker

Das folgende Beispiel-Programm erstellt einen Disketten-Katalog auf dem Drucker. Das Ganze ist als eine RSX-Erweiterung eingebunden und wird in Einleitung: BASIC
Anhang: Basic
Basic
mit '|LCAT' aufgerufen.

Die zugehörige Routine patcht zunächst den Textausgabe-Vektor TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT, so dass Ausgaben für den Bildschirm zum Drucker umgeleitet werden. Danach wird ein Der Cassette Manager: KatalogKatalog angefordert, wofür der Vektor MAIN FIRMWARE JUMPBLOCK: CASSETTE MANAGER
Die Firmware des Schneider CPC: CASSETTE MANAGER
CAS
CAT aufgerufen wird. Die Amsdos-Routine, die den Der Cassette Manager: KatalogKatalog ausgibt, ruft den Vektor TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT auf, im besten Glauben, so alle Zeichen zum Bildschirm zu schicken. Da dieser Vektor aber gerade vorher gepatcht wurde, landen die Zeichen wie gewünscht auf dem Drucker.

Nachdem der Der Cassette Manager: KatalogKatalog ausgegeben wurde, wird der alte Vektor in TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT wieder restauriert.

Dieses Programm ist jedoch nicht geeignet, auch einen Kassetten-Katalog zu erstellen. Die Katalog-Routine des Cassette Managers ruft nämlich, anders als Die Abteilungen des Betriebssystems: AmsdosAmsdos, nicht den Vektor für TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT, sondern diese Routine direkt auf.

Das Assembler-Programm ist auch gleich mit dem Z80-Relocater zusammengebunden, so dass man sich hier noch einmal seine Z80-Relocalisitor: FunktionsweiseFunktionsweise anschauen kann.

 ; RSX-Erweiterung für einen Disketten-Katalog auf dem Drucker.
 ; -------------------------------------------------------------
 ;
         ORG 30000
 ;
 ; 0. Label-Deklarationen
 ;
 LOGEXT: EQU  #BCD1      ; KERNEL: BCD1: KL LOG EXTKL LOG EXT
 CASCAT: EQU  #BC9B      ; MAIN FIRMWARE JUMPBLOCK: CASSETTE MANAGER
Die Firmware des Schneider CPC: CASSETTE MANAGER
CAS
CAT TXTOUT: EQU #BB5A ; TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT MCPRNT: EQU #BD2B ; MACHINE PACK: BD2B: MC PRINT CHARMC PRINT CHAR ; ; 1. Relocalisiere das Programm: ; RELOC: EI Alle noch folgenden Anschlüsse fallen unter die Rubrik STEUER- oder auch CONTROLBUS:: HaltHALT STELLE: DEC S DEC S POP HL LD DE,STELLE AND Operationen: BD5B / 349A / 349A: FLO SUBA SBC HL,DE LD LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
,H LD C,L LD HL,RTABEL ADD HL,BC RELOOP: LD LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
,(HL) INC HL LD D,(HL) INC HL LD Operationen: BD5B / 349A / 349A: FLO SUBA,LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
OR D X0: JP Z,BIND EX DE,HL ADD HL,BC INC HL LD Operationen: BD5B / 349A / 349A: FLO SUBA,(HL) ADD Operationen: BD5B / 349A / 349A: FLO SUBA,C LD (HL),Operationen: BD5B / 349A / 349A: FLO SUBA INC HL LD Operationen: BD5B / 349A / 349A: FLO SUBA,(HL) ADC Operationen: BD5B / 349A / 349A: FLO SUBA,LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
LD (HL),Operationen: BD5B / 349A / 349A: FLO SUBA EX DE,HL JR RELOO ; ; Tabelle aller zu relocalisierenden Stellen: ; ------------------------------------------- RTABEL: DEFW X0,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10 DEFW #0000 ; Endmarke der Tabelle ; ------------------------------------------- ; ; 2. Einbinden der RSX-Sammlung: ; X1: BIND: LD BC,ITABEL X2: LD HL,ISPACE Maschinencode über HIMEM: CALLCALL LOGEXT LD Operationen: BD5B / 349A / 349A: FLO SUBA,201 X3: LD (RELOC),Operationen: BD5B / 349A / 349A: FLO SUBA ; Abstellen von Interrupts: sukzessive Initialisierungsukzessive Initialisierungen verhindern RET ; ISPACE: DEFS 4 ; ; Tabelle der Routinen-Namen. ; --------------------------- BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB: DEFM "LCA" DEFB "T"+#80 DEFB 0 ; X4: EQU $-1 ITABEL: DEFW BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB ; Zeiger auf Namenstabelle ; ; Tabelle mit MAIN FIRMWARE JUMPBLOCK: JUMPER
Die Firmware des Schneider CPC: JUMPER
Jumps
zu den Routinen (je 3 Datentypen: Bytes
Datenbreite: Bytes
Bytes
) ; ---------------------------------------------- X5: JP LCAT ; ; 3. RSX-Behandlungsroutine: ; LCAT: LD HL,TXTOUT ; Kopiere Original-Eintrag des X6: LD DE,PUFFER ; Text-Ausgabe-Vektors TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT LD BC,3 ; in einen Puffer LDIR ; X7: LD HL,PATCH ; Installiere Patch: LD DE,TXTOUT ; Kopiere Sprung zur eigenen LD BC,3 ; Text-Ausgabe-Routine LDIR ; in den Vektor ; X8: LD DE,CASPUF ; MAIN FIRMWARE JUMPBLOCK: CASSETTE MANAGER
Die Firmware des Schneider CPC: CASSETTE MANAGER
CAS
CAT benötigt 2kByte Puffer. Maschinencode über HIMEM: CALLCALL CASCAT ; Der Cassette Manager: KatalogKatalog ausgeben. ; X9: LD HL,PUFFER ; Original-Eintrag in LD DE,TXTOUT ; TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT restaurieren LD BC,3 LDIR RET ; und fertig. ; PUFFER: DEFS 3 ; Speicher für Original-TXT-OUTPUT-Vektor ; X10: PATCH: JP DRUOUT ; Ersatz-Sprung für TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT ; ; 4.Ersatz-Routine für TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT: ; DRU1: POP AF DRUOUT: PUSH AF ; AF muss für TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT erhalten bleiben. Maschinencode über HIMEM: CALLCALL MCPRNT ; Versuche, Zeichen auszudrucken. JR NC,DRU1 ; Kein Erfolg: Try again. POP AF ; sonst fertig. RET ; CASPUF: DEFS #800 ; END

In der Ersatzroutine DRUOUT muss das AF-Doppelregister gerettet werden. Der Grund ist die Schnittstellenbeschreibung von TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT und MACHINE PACK: BD2B: MC PRINT CHARMC PRINT CHAR.

Der Vektor TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT verändert keine Die Tonausgabe: Das Kontrollregister (Reg. 7)
Die Tonausgabe: Die möglichen Hüllkurvenformen (Reg. 13)
Register
, MACHINE PACK: BD2B: MC PRINT CHARMC PRINT CHAR kann aber das A-Register verändern und setzt als Erfolgskontrolle das CY-Flag (oder auch nicht). Die Routine DRUOUT muss also einerseits das AF-Register retten, weil das für den Vektor TEXT VDU: BB5A: TXT OUTPUTTXT OUTPUT so verlangt wird und andererseits, um das Zeichen, das ausgedruckt werden soll, wieder zu bestimmen, wenn der Ausdruck nicht gleich beim ersten Mal klappte.

Valid HTML   Valid CSS