Umschaltung zwischen der 8502-CPU und der Z80A-CPU

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 für Emulator-Benutzer: Nicht alle C128-Emulatoren unterstützen die Z80-CPU. Die Assembler-Programme sollten Sie daher an einem "echten" C128 ausprobieren.

So wird im C128-Modus die Z80-CPU eingeschaltet:

$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

Wichtig: Die Z80-CPU beginnt ihre Arbeit bei $0FFED.

Ein Z80-Programm, um die 8502-CPU wieder einzuschalten:

$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

Wichtig: Die 8502-CPU beginnt ihre Arbeit bei $0FFDB

Die beiden Listings stammen übrigens aus der Zeitschrift 64er, Ausgabe April 1986, Seite 81, "Programmieren in Z80-Assembler".

Hier geht es zur Hauptseite zurück