Das Schneider CPC Systembuch

Das Betriebssystem des Schneider CPC

Maschinencode auf dem CPC

Obwohl der Schneider CPC mit einem außerordentlich leistungsfähigen Basic-Interpreter ausgestattet ist, ergibt sich doch früher oder später der Wunsch nach 'Maschinencode'.

Dabei muss man grundsätzlich zwei Fälle unterscheiden:

Einmal kann man Assembler-Routinen als Grundlagen: UnterprogrammeUnterprogramme einsetzen, die die Der Sound Manager: FähigkeitenFähigkeiten des Basic-Interpreters besonders bei zeitkritischen oder zeitintensiven Prozeduren erweitern. Zum anderen können aber auch Maschinencode-Programme als ein eigenständiges 'Vordergrund-Programm' gestartet werden.

Hintergrund-Programme = System-Erweiterungen
Vordergrund-Programme = Hauptprogramme

Und wie das in der Informatik so ist, kann man beide Fälle erneut fein systematisch untergliedern: Wo soll denn der Maschinencode herkommen? Handelt es sich um Maschinencode auf dem CPC: ROM-SoftwareROM-Software oder wird die Software von einem Einleitung: MassenspeicherMassenspeicher eingeladen?

Maschinencode auf dem CPC: ROM-SoftwareROM-Software
Kassetten/Disketten-Software

Vordergrundprogramme vom Massenspeicher

Zum Starten eines Hauptprogrammes von Diskette oder Kassette sollte immer der Vektor &MACHINE PACK: BD13: MC BOOT PROGRAMBD13 MAIN FIRMWARE JUMPBLOCK: MACHINE PACK
Die Firmware des Schneider CPC: MACHINE PACK
MC
BOOT PROGRAMM benutzt werden. Dieser Vektor nimmt zunächst eine Teil-Initialisierung des Rechners vor und ruft dann eine Laderoutine auf, die man selbst bestimmen kann. Die Adresse der Laderoutine muss dem Vektor im HL-Register übergeben werden.

Die Laderoutine muss dann, wie es die Bezeichnung schon andeutet, das Assemblerprogramm in den Speicher des Rechners einladen, und kehrt danach mit 'RET' zu MAIN FIRMWARE JUMPBLOCK: MACHINE PACK
Die Firmware des Schneider CPC: MACHINE PACK
MC
BOOT PROGRAMM zurück.

Danach wird der Computer vollständig initialisiert und das Programm gestartet. Normalerweise wird man ein eigenständiges Maschinencode-Programm aber vom Basic-Interpreter aus einladen, weil dieser ja 'by default' nach dem Einschalten des Computers gestartet wird. Einleitung: BASIC
Anhang: Basic
Basic
führt die beschriebenen Ladeaktionen aus, wenn man ein Maschinencode-Programm mit 'RUN"progname.ext"' startet.

Die Aufruf-Bedingungen für das Maschinencode-Programm selbst sind dabei die selben, wie für jedes andere Vordergrund-Programm auch:

BC = &B0FF = letztes Datentypen: Bytes
Datenbreite: Bytes
Byte
des Memory Pools (total) HL = &ABFF = Vorschlag für den statischen Variablenbereich des Vordergr.Prog. DE = &0040 = erstes Datentypen: Bytes
Datenbreite: Bytes
Byte
des Memory Pools

Das RAM-Vordergrund-Programm muss sich dann zunächst seinen statischen Variablenbereich reservieren, danach evtl. Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs initialisieren (auch Die Abteilungen des Betriebssystems: AmsdosAmsdos muss, wenn es benötigt wird, erst noch initialisiert werden!) und kann erst dann so richtig loslegen.

ROM-Software

Alle Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs mit zusätzlicher Software oder Vordergrund-Programmen müssen, wollen sie in den Genuss der existierenden Kernel-Routinen kommen, im obersten Adressviertel der Die ICs im Überblick: Die CPU Z80
Das Innenleben der CPC-Rechner: Die CPU Z80
Die Anschlussbelegungen der wichtigsten ICs im CPC: Die CPU Z80
CPU
eingeblendet werden. Es können also zunächst einmal nur 16-kByte Die Anschlussbelegungen der wichtigsten ICs im CPC: Die EPROMs 27128 und 27256EPROMs, PROMs oder Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs eingesetzt werden. Die belegten Adressen liegen im Bereich von &C000 bis &FFFF.

Dabei enthält der Schneider CPC einen Soft/Hardware-Mechanismus, mit dem den einzelnen 16k-ROM-Bloecken eine 'ROM-Selekt-Adresse' im Bereich von &00 bis &FB (252) zugeordnet wird. (Die ROM-Konfiguration: ROM-Selektion
Anschluss eines Zusatz-ROM: ROM-Selektion
ROM-Selektion
wurde bereits im Kapitel über die Speicherkonfiguration erläutert.)

power on ROM

Die für das Basic-ROM reservierte Adresse ist &00. Man kann aber auch ein anderes Vordergrund-ROM auf dieser ROM-Selekt-Adresse installieren. Das Basic-ROM bleibt auf jeder noch nicht benutzten Adresse erreichbar, weil es über keine eigene Selekt-Decodierung verfügt und immer von anderen Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs, die sich angesprochen fühlen, ausgeblendet werden muss. Der MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
des Schneider CPC startet nach einem Kaltstart (Einschalten etc.) immer das Programm in dem Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM, das auf der Selekt-Adresse &00 eingeblendet wird.

Dadurch kann man seinen Computer beispielsweise zu einem PASCAL-Rechner oder auch reinrassigen CP/M-Rechner machen. Im Amsdos-Disketten-Kontroller ist ein Platz für eine Drahtbrücke vorgesehen, die, wenn man sie einsetzt, die Selekt-Adresse für das Amsdos-ROM von &07 auf &00 ändert! Dadurch wird Die Abteilungen des Betriebssystems: AmsdosAmsdos anstelle des Basic-Interpreters gestartet. Die Initialisierungs-Routine von Die Abteilungen des Betriebssystems: AmsdosAmsdos, das eigentlich ein 'Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROM' ist, testet, ob Die Abteilungen des Betriebssystems: AmsdosAmsdos auf der Adresse &00 eingeblendet wurde und startet in diesem Fall Einleitung: CP/MCP/M!

ROM-Typen

Jeder ROM-Block hat einen sogenannten Amsdos: HeaderHEADER. Die ersten Datentypen: Bytes
Datenbreite: Bytes
Bytes
eines jeden Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs müssen für Verwaltungs-Aufgaben geopfert werden:

#C000  DEFB Ty
#C001  DEFB Mark number
#C002  DEFB Version number
#C003  DEFB Modification level
#C004  DEFS Resident System Extensions: external command tableExternal command table
 ....

Die drei Datentypen: Bytes
Datenbreite: Bytes
Bytes
auf den Adressen &C001 bis &C004 können vollkommen frei mit jedem beliebigen Wert beschrieben werden und sind nur für die eigene Statistik interessant.

Das erste Datentypen: Bytes
Datenbreite: Bytes
Byte
dagegen ist schon wichtiger. Der MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
kennt drei verschiedene ROM-Software: ROM-TypenROM-Typen und eine kleine Variation für das eingebaute Basic-ROM:

     #C000  DEFB #00       ; Vordergrund-ROM
oder #C000  DEFB #00+#80   ; Eingebautes Vordergrund-ROM
oder #C000  DEFB #02       ; Erweiterungs-ROM
oder #C000  DEFB #01       ; Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROM
&80

Im Typ-Byte des Basic-ROMs ist 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
7 gesetzt. Das 'On-Board-ROM' hat keine eigene Dekodierungs-Schaltung für seine ROM-Selekt-Adresse. Jeder Lesezugriff auf ein Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM bezieht sich automatisch auf das Basic-ROM, wenn es nicht von einem anderen Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM, das sich angesprochen fühlt, explizit mit der Leitung Erläuterung zu den Anschlüssen 40 bis 45: 43 - ROMDIS (1)ROMDIS ausgeblendet wird.

Wenn der MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
alle ROM-Adressen nach Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs absucht, erkennt er am Typ-Byte &80 auf der Adresse #C000, dass auf dieser ROM-Select-Adresse kein anderes Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM installiert ist, weil hier das Basic-ROM 'durchschimmert'.

&00

Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs, die Vordergrund-Programme enthalten, werden mit einem Datentypen: Bytes
Datenbreite: Bytes
Byte
&00 auf der Adresse &C000 gekennzeichnet.

&02

Sehr umfangreiche Vordergrund-Programme können bis zu vier 16k-Blocks umfassen. Diese müssen dann aufeinanderfolgende Selekt-Adressen haben. Nur das erste Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM darf in seinem Amsdos: HeaderHeader als Vordergrund-ROM gekennzeichnet sein. Die bis zu drei 'nachfolgenden' Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs müssen als Erweiterungs-ROM deklariert werden.

Vor allem mit dem Restart_2 ist es dabei möglich, von jedem Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM eines Hauptprogrammes aus Grundlagen: UnterprogrammeUnterprogramme in 'benachbarten' Erweiterungs-ROMs aufzurufen.

&01

Alle Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs, die keine eigenständige Software enthalten, sondern nur zusätzliche Routinen, die von einem Vordergrund-Programm benutzt werden können, müssen als Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROM markiert werden. Alle Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs sollten auf Select-Adressen von &01 bis &07 (CPC 464) bzw. &00 bis &0F (CPC 664, 6128) installiert werden, weil der Vektor KERNEL: BCCB: KL ROM WALKKL ROM WALK nur diese ROM-Adressen abklappert und auch nur für diese Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs Zeiger auf deren reservierten RAM-Bereich speichern kann. Das Amsdos-ROM hat die Select-Adresse &07.

Hintergrund-Routinen von Massenspeichern

Hintergrund-Software, die erst nachtraeglich von Kassette oder Diskette eingeladen wird, muss vom Vordergrund-Programm ihren Platz zugewiesen bekommen.

CPC-typisch ist dabei die Methode, dass das Vordergrund-Programm von seinem Memory Pool von oben her etwas abtritt. Beim eingebauten Basic-Interpreter müsste man also Die Aufteilung des RAM durch den Basic-Interpreter: Chaos über HIMEMHIMEM herabsetzen und danach die Datei mit dem Assemblerprogramm dorthin einladen.

Problematisch ist für das eingeladene Maschinencode-Programm vor allem, dass nicht vorhersehbar ist, an welche Adresse es denn nun genau zu liegen kommt. Die Anschlussbelegungen der wichtigsten ICs im CPC: Das RAM 4164Das RAM wird ja dynamisch von oben und von unten her den verschiedenen Erweiterungen zugeteilt, wobei die Grenzen des noch verfügbaren Memory Pools langsam aufeinander zu wachsen.

Da Maschinencode-Programme, bis auf ganz wenige Ausnahmen, nicht ortsunabhängig geschrieben werden können, müssen sie der Datentypen: Realrealen Lage angepasst, also 'relocalisiert' werden. Am Ende dieses Kapitels wird deshalb ein einfacher 'Relocater' für Z80-Assemblerprogramme beschrieben. Dieses Zusatz-Programm muss aufgerufen werden, bevor die erste Routine in der Erweiterung benutzt werden kann. Dabei passt es alle Adressierungsarten der Z80: Absolutabsoluten Adressen an die aktuelle Lage des Programmes an. Im Anschluss an die Relozierung können noch weitere Initialisierungen vorgenommen werden, zum Beispiel die Einbindung als Maschinencode über HIMEM: RSXRSX:

Resident System Extensions

Der MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
des Schneider CPC unterstuetzt ein System externer Kommandos (Maschinencode über HIMEM: RSXRSXes), bei der alle verfügbaren Zusatzroutinen über einen Namen ansprechbar sind. Von Einleitung: BASIC
Anhang: Basic
Basic
aus sind diese Kommandos mit Hilfe des 'extended colon' genannten Zeichens zugänglich, beispielsweise:

|Einleitung: BASIC
Anhang: Basic
BASIC
[ENTER]

In dieses System sind alle Vordergrund-ROMs und alle initialisierten Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs eingebunden und ebenfalls alle nachgeladenen Maschinencode-Programme, die sich über den Vektor &KERNEL: BCD1: KL LOG EXTBCD1 KL LOG EXT dem Betriebssystem vorgestellt haben.

Dafür wird für jedes Programmpaket eine 'external command table', also eine Tabelle der externen Kommandos benötigt. Die einzelnen Tabellen werden über eine verkettete Trees: ListenListe 'zusammengehalten'. Zusätzlich zu jeder Kommandotabelle werden vier Datentypen: Bytes
Datenbreite: Bytes
Bytes
für diesen Kettungsmechanismus benötigt.

Bei Vorder- und Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs ist die Resident System Extensions: external command tableexternal command table Bestandteil des ROM-Headers. Wird ein Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROM initialisiert, so darf es sich vom Memory Pool etwas Speicherplatz reservieren (Siehe Kapitel über die Speicheraufteilung durch ein Vordergrund-Programm: Speicher-Aufteilung totalSpeicher-Aufteilung der CPCs). Dabei zieht der MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
die vier Datentypen: Bytes
Datenbreite: Bytes
Bytes
für die verkettete Trees: ListenListe einfach noch zusätzlich vom Memory Pool ab.

Mit dem Vektor &KERNEL: BCD4: KL FIND COMANDBCD4 KL FIND COMAND kann zu einem Kommando-Namen dessen Adresse und ROM-Select-Byte erfragt werden. Dabei werden die Kommando-Tabellen von hinten her durchsucht. Die RSX-Erweiterungen, die zuletzt eingeführt wurden, werden als erste überprüft. Sollten also zwei Routinen mit dem gleichen Namen existieren, so wird die aeltere von der später angefügten Routine 'verdeckt'.

Beim Suchen eines Kommandos werden zuerst alle Maschinencode über HIMEM: RSXRSXes im RAM abgeklappert, dann alle Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs und, wenn der Befehl immer noch nicht gefunden wurde, auch noch alle Vordergrund-ROMs ab der ROM-Select-Adresse &08 (Garbage Collection: ... beim CPC 464beim CPC 464) bzw. &10 (bei den CPCs 664 und 6128), bis der MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
einen unbenutzten ROM-Steckplatz findet.

Der Vektor MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
KL
FIND Befehls-Elemente: CommandsCOMMAND ruft dabei die gefundene Routine nicht selbst auf, er gibt nur die Routinenadresse in HL und die Die Speicherkonfiguration im Schneider CPC: ROM-KonfigurationROM-Konfiguration in C zurück. Ausgenommen ist nur der Fall, dass ein Vordergrund-Kommando, wie etwa '|Einleitung: BASIC
Anhang: Basic
BASIC
' aufgerufen werden soll. In diesem Fall wird der Computer initialisiert und das Programm direkt gestartet.

Sonst muss man die entsprechende Routine noch via Restart_3 (LOW KERNEL JUMPBLOCK: 0018 - RST 3: LOW FAR CALLLOW FAR CALL) oder über &001LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
LOW FAR PCHL aufrufen. Dabei wird allen Routinen in Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs die Start-Adresse des von ihnen über dem Memory Pool reservierten Speicherbereiches im IY-Register übergeben.

external command table

Nach diesen Einzelheiten bleibt nur noch das 'Layout' der Resident System Extensions: external command tableexternal command tables zu klären:

; Aufbau der Namenstabellen für RSX-Kommandos:
; ---------------------------------------------
RSXTAB: DEFW BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB    ; Zeiger auf Namenstabelle
        JP   ROUT1     ; \
        JP   ROUT2     ;  \  Sprungleiste zu den Routinen.
        JP   ROUT3     ;   > Können natürlich auch mit
        ...            ;  /  ROM-Konfiguration: RestartsRestarts gebildet werden.
        JP   ROUTn     ; /
;
BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB: DEFB "R","O","U","T","1"+#80
        DEFB "R","O","U","T","2"+#80
        DEFB "R","O","U","T","3"+#80
        ...
        DEFB "R","O","U","T","n"+#80
        DEFB 0

Dabei müssen die Sprung-Vektoren in der Reihenfolge der Namen in der Namenstabelle aufeinanderfolgen. In der Namenstabellen werden die Namen der einzelnen RSX-Befehle in ihrer ASCII-Codierung abgelegt. Im letzten Buchstaben eines Namens muss jeweils Hardware-Basteleien: Das 8. Bitdas 7. Bit gesetzt sein. Abgeschlossen wird die Tabelle durch ein Nullbyte.

Bei Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs wird der erste Eintrag benutzt, um das Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM zu initialisieren. Hier sollte der Name möglichst so gestaltet werden, dass man ihn nicht von Einleitung: BASIC
Anhang: Basic
Basic
aus unbeabsichtigt aufrufen kann. Das kann man erreichen, indem man beispielsweise Kleinbuchstaben, Spaces oder Sonderzeichen in den Namen einbaut (Bei der Namensgebung ist vom MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
Kernel
her fast alles erlaubt).

Auch kann man von einem Vordergrund-Programm aus gut Erklärung der Anschlussbelegung: Testtesten, ob ein spezielles Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROM bereits initialisiert ist, indem man mit MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
KL
FIND Befehls-Elemente: CommandsCOMMAND versucht, die Adresse des Initialisierungs-Vektors zu ermitteln. Man muss dazu nur den Namen des ersten Vektors kennen. Um in einer Mcode-Routine zu erfahren, ob Die Abteilungen des Betriebssystems: AmsdosAmsdos initialisiert ist, könnte man mit MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
KL
FIND Befehls-Elemente: CommandsCOMMAND die Adresse des Kommandos "Einleitung: CP/MCPM Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM" suchen lassen.

Vordergrund-ROMs sollten normalerweise nur einen Eintrag haben: Den, mit dem sie gestartet werden. Nur wenn ein Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROM mehrere, voneinander unabhängige Vordergrund-Programme enthält, können in der Kommando-Tabelle auch mehrere Einträge auftauchen.

Als praktische Beispiele folgen nun Assemblerprogramme für eine RAM-RSX und ein ROM-Header:

; RAM-RSX-Erweiterung z.LOW KERNEL JUMPBLOCK: 000B:  LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
. für einen Drucker-Spooler: ; ---------------------------------------------------- INIT: LD HL,SPACE ; Adresse der 4 freien Datentypen: Bytes
Datenbreite: Bytes
Bytes
für die Befehls-Elemente: CommandsCommand Datenspeicherung und Datenstrukturen: ChainsChain LD BC,RSXTAB ; Adresse der 'Resident System Extensions: external command tableexternal command table' Maschinencode über HIMEM: CALLCALL #BCD1 ; und KERNEL: BCD1: KL LOG EXTKL LOG EXT aufrufen. RET SPACE: DEFS 4 RSXTAB: DEFW BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB ; Adresse der Namenstabelle. JP ON ; Vektoren zu den einzelnen JP OFF ; RSX-Routinen. JP FLUSH JP ASKFRE BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB: DEFB "S","P","O","O","L",".","O","N"+#80 ; SPOOL.ON DEFB "S","P","O","O","L",".","O","F","F"+#80 ; SPOOL.OFF DEFB "F","L","U","S","H",".","LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
","U","F"+#80 ; FLUSH.BUF DEFB "Operationen: BD5B / 349A / 349A: FLO SUBA","S","K",".","F","R","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
"+#80 ; ASK.FREE DEFB 0
; ROM-Header z. LOW KERNEL JUMPBLOCK: 000B:  LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
. für eine Grafik-Erweiterung ; --------------------------------------------- #C000: DEFB 1 ; Typ = Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROM DEFS 3 ; Mark, Version, Modification RSXTAB: DEFW BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB ; Zeiger auf die Namenstabelle. #C006: JP INIT ; Initialisierungs-Routine (Immer auf dieser Adresse!). JP BOX ; Vektoren zu den einzelnen JP Die Grafik-VDU: CircleCIRCLE ; RSX-Routinen. JP ELLIPSE JP FILL JP TRIANG BCD1: KL LOG EXT: 2. Namenstabelle (NAMTAB)NAMTAB: DEFB "G","r","Operationen: BD5B / 349A / 349A: FLO SUBa","f","i","k"+#80 ; Name des Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROMs DEFB "LOW KERNEL JUMPBLOCK: 000B: LOW KL LOW PCHL
LOW KERNEL JUMPBLOCK: 001B: LOW KL FAR PCHL
LOW KERNEL JUMPBLOCK: 003B: LOW EXT INTERRUPT
B
","O","Die verwendeten Abkürzungen bedeuten: x:X"+#80 ; BOX DEFB "C","I","R","C","L","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
"+#80 ; Die Grafik-VDU: CircleCIRCLE DEFB "LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
","L","L","I","P","S","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
"+#80 ; ELLIPSE DEFB "F","I","L","L"+#80 ; FILL DEFB "T","R","I","Operationen: BD5B / 349A / 349A: FLO SUBA","N","G","L","LOW KERNEL JUMPBLOCK: 000E: LOW PCBC INSTRUCTION
LOW KERNEL JUMPBLOCK: 001E: LOW PCHL INSTRUCTION
E
"+#80 ; TRIANGLE DEFB 0

Der Aufruf einer RSX-Erweiterung gestaltet sich in Assembler nicht ganz so einfach, wie in Einleitung: BASIC
Anhang: Basic
Basic
. Hier muss man erst mit MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
KL
FIND Befehls-Elemente: CommandsCOMMAND die Routine suchen und dann auch noch selbst aufrufen. Das folgende Programm ist ein Beispiel für einen RSX-Aufruf in Maschinensprache. Soll ein bestimmtes externes Kommando sehr oft aufgerufen werden, so empfiehlt es sich jedoch, die Adresse nur einmal zu bestimmen.

 ; Aufruf einer Maschinencode über HIMEM: RSXRSX in Maschinensprache
 ; ------------------------------------
        ...
        LD   HL,NAME           ; Zeiger auf den Namen nach HL laden
        Maschinencode über HIMEM: CALLCALL #BCD4             ; MAIN FIRMWARE JUMPBLOCK: KERNEL
Die Firmware des Schneider CPC: KERNEL
KL
FIND Befehls-Elemente: CommandsCOMMAND JR NC,Der Linien-Algorithmus: Fehler 3FEHLER ; NC -> nicht gefunden !! LD (FARADR),HL ; FAR ADDRESS für ROM-Konfiguration: RestartsRestart 3 basteln: LD Operationen: BD5B / 349A / 349A: FLO SUBA,C ; zuerst Routinen-Adresse in HL LD (FARADR+2),Operationen: BD5B / 349A / 349A: FLO SUBA ; und dann ROM-Konfigurationsbyte in C Speicheraufteilung durch ein Vordergrund-Programm: RST 3
LOW KERNEL JUMPBLOCK: 0000 - RST 0: LOW RESET ENTRY
LOW KERNEL JUMPBLOCK: 0008 - RST 1: LOW LOW JUMP
LOW KERNEL JUMPBLOCK: 0010 - RST 2: LOW SIDE CALL
LOW KERNEL JUMPBLOCK: 0018 - RST 3: LOW FAR CALL
LOW KERNEL JUMPBLOCK: 0020 - RST 4: LOW RAM LAM
LOW KERNEL JUMPBLOCK: 0028 - RST 5: LOW FIRM JUMP
LOW KERNEL JUMPBLOCK: 0030 - RST 6: LOW USER RESTART
LOW KERNEL JUMPBLOCK: 0038 - RST 7: LOW INTERRUPT ENTRY
RST
#18 ; mit ROM-Konfiguration: RestartsRestart 3: FAR Maschinencode über HIMEM: CALLCALL DEFW FARADR ; das externe Kommando aufrufen. ... ; und weiter im Programm.... ... FARADR:DEFS 3 ; Platz für die FAR ADDRESS zum ROM-Konfiguration: RestartsRestart 3 ... NAME: DEFB "D","I","R"+#80 ; Name der zu rufenden Maschinencode über HIMEM: RSXRSX. Letzter Buchstabe ; mit gesetztem 7. 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
.

Valid HTML   Valid CSS