Der C128 verfügt bekanntlicherweise gleich über zwei verschiedene CPUs: eine MOS 8502 und eine Z80A von Zilog. Die eingebaute Z80-CPU wird beim C128 normalerweise nur im CP/M-Modus benutzt. Wie Sie diese CPU auch im C128-Modus ansprechen können, verrät Ihnen der folgende Text:
Um den Z80-Mikroprozessor einzuschalten, muß das Bit 0 in der Speicherstelle $FD505 auf 1 gesetzt werden. Doch wo beginnt der Prozessor seine Arbeit und was ist sonst noch zu beachten?
Zunächst müssen die System-IRQs gesperrt werden. Weiterhin sollte man sich in Bank 0 befinden (dort wird später das Z80-ROM von $0000 bis $1000 eingeblendet). Nachdem dies geschehen ist, kann man endlich das Bit 0 in $FD505 auf "High" legen. Nach dem Abfallen des Systemtaktes der 8502-CPU beginnt nun endlich die Z80-CPU ihre Arbeit ab der Adresse $0FFED. Hinter dem dort stehenden "NOP" findet sie einen Sprungbefehl nach $0008 in das nun eingeschaltete ROM. Das dort vorhandene Programm dient normalerweise dazu, eine bootfähige CP/M-Diskette zu starten.
Um in eigene Programme zu gelangen, muß man vor dem Einschalten den Sprungbefehl verbiegen. Dazu schreibt man in die Speicherzelle $0FFEE ein $C3 (entspricht dem "JP"-Befehl) und in die folgenden beiden Stellen die Startadresse im Low/High-Format.
Das unten aufgeführte Listing zeigt ein Programm, das die oben genannten Punkte, außer dem Verändern des Sprungbefehls, für Sie ausführt. Nach dem Abarbeiten des Z80-Programms sollte man nach $0FFE0 springen. Dort wird die 8502-CPU reaktiviert (näheres siehe im zweiten Listing).
Hinweis: Die folgenden Assemblerprogramme können Sie nicht zusammen mit einem C128-Emulator benutzen. Da es bislang keinen C128-Emulator gibt, der die Z80-CPU unterstützt, können Sie diese Programme nur mit einem "echten" C128 ausprobieren.
$0FFD0 | SEI | ;IRQ aus |
$0FFD1 | LDA #$3E | ;Wert für "I/O ein" |
$0FFD3 | STA $FF00 | ;in Konf. Register |
$0FFD6 | LDA #$B0 | ;Wert für "Z80 ein" |
$0FFD8 | STA $D505 | ;in Mode Konfigurations Register, kurz: "Z80 einschalten" |
$0FFDB | NOP | ;Ab hier wird die 8502-CPU angehalten |
$0FFDC | JMP $1100 | ;Muß auf eigene Routine verbogen werden |
$0FFE0 | DI | ;IRQ aus |
$0FFE1 | LD A,$3E | ;Wert für "I/O ein" |
$0FFE3 | LD $FF00,A | ;in Konf. Register |
$0FFE6 | LD BC,$D505 | ;Mode Konfigurations Register |
$0FFE9 | LD A,$B1 | ;Wert für "8502 einschalten" |
$0FFEB | OUT (C),A | ;Einschalten |
$0FFED | NOP | ;Ab hier wird die Z80-CPU angehalten |
$0FFEE | RST $08 | ;Muß als JP-Befehl auf eigene Routine verbogen werden |
Die beiden Listings stammen übrigens aus der Zeitschrift 64er, Ausgabe April 1986, Seite 81, "Programmieren in Z80-Assembler".