📋Der Firmware-Weg

Die Firmware im ROM nimmt einem die Adressrechnung ab – und kostet dafür bei jedem Aufruf Zeit (Sprung über die Sprungleiste, ROM einblenden, allgemeine Prüfungen). Zum Vergleich hier drei Wege, die ganz ohne eigene Adressrechnung auskommen.

🧪
Simulation im Browser. Der Z80 wird Befehl für Befehl emuliert; die CPC-Firmware ist dagegen in TypeScript nachgebildet (HLE) – nach den Ein-/Ausgabebedingungen aus dem Firmware-Handbuch SOFT 968. Es wird kein ROM-Inhalt von Amstrad verwendet, der Zeichensatz ist ein gemeinfreier Ersatz. Die Firmware-Routinen selbst laufen im Simulator in TypeScript und kosten dort pauschal 1 µs – deshalb gibt es hier bewusst keine µs-Werte.

📖Die beteiligten Einsprünge

Adressen und Register nach dem Firmware-Handbuch SOFT 968 – ausführlich mit Beispiel je Routine in VisualZ80.
RoutineAdresseEingangAusgang
SCR DOT POSITION&BC1DDE = x, HL = y (Basiskoordinaten, y = 0 unten)HL = Bildschirmadresse, C = Pixelmaske, B = Pixel je Byte − 1
SCR NEXT LINE&BC26HL = BildschirmadresseHL = Adresse eine Pixelzeile tiefer
SCR NEXT BYTE&BC20HL = BildschirmadresseHL = Adresse ein Byte weiter rechts
SCR INK ENCODE&BC2CA = TinteA = Byte, in dem alle Pixel diese Tinte haben
GRA SET PEN&BBDEA = Tinte–
GRA PLOT ABSOLUTE&BBEADE = x, HL = y (Benutzerkoordinaten 0–639 / 0–399)setzt einen Punkt im Stift
TXT SET M TABLE&BBABDE = erstes Zeichen, HL = Tabelleab diesem Zeichen sind Matrizen umdefinierbar
TXT SET MATRIX&BBA8A = Zeichen, HL = 8 Bytesneue Punktmatrix (BASIC: SYMBOL)
MC WAIT FLYBACK&BD19–kehrt im Strahlrücklauf zurück

🧪Drei Wege im Emulator

bereit
ℹ️ Links oben entsteht das Sprite über SCR DOT POSITION + SCR NEXT LINE, rechts daneben Pixel für Pixel über GRA PLOT ABSOLUTE (118 Aufrufe), darunter zweimal das umdefinierte Zeichen 240. Tipp: „Zeitlupe“ wählen.
Quelltext (editierbar)
Assembler-Liste · Klick auf ● = Haltepunkt
0
1
2
3
Rand
Modus 1 · Basis &C000 · Versatz &0000
Firmware
Firmware jetzt
▶ RESET ENTRY · Details in VisualZ80 ↗
Letzte Falle: –
Letzte Firmware-Aufrufe
noch keine
Register & Flags
AF
&FFFF
BC
&0000
DE
&0000
HL
&0000
IX
&FFFF
IY
&FFFF
SP
&C000
PC
&0000
S
1
Z
1
Y
1
H
1
X
1
P/V
1
N
1
C
1
AF' &0000
BC' &7F8D
DE' &0000
HL' &0000
I &00
R &00
IM 1
IFF1/2 1/1
Z80-Takte: 0 TCPC-Zeit: 0 µsROMs: unten aus, oben ausRAM-Konfig: &C0
Disassembler ab PC
0000HLE ▸ RESET ENTRY
0002RET
0003NOP
0004NOP
0005NOP
0006NOP
0007NOP
0008HLE ▸ LOW JUMP
000ARET
000BHLE ▸ KL LOW PCHL
Stapel (SP)
C0000000← SP
C0020000
C0040000
C0060000
C0080000
C00A0000
C00C0000
C00E0000
Speicher (Hex)
800000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
801000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
802000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
803000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
804000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
805000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
806000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
807000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ················
PCSP(HL)(DE)Leseansicht mit aktueller ROM-/Bank-Einblendung
Dasselbe Zeichen in BASIC
10 MODE 0
20 SYMBOL AFTER 240
30 SYMBOL 240,&3C,&FF,&99,&99,&FF,&BD,&E7,&FF
40 PEN 1: LOCATE 15,8: PRINT CHR$(240);CHR$(240)
Die Matrix: 8 Bytes, 1 Bit je Punkt
&3C = %00111100
&FF = %11111111
&99 = %10011001
&99 = %10011001
&FF = %11111111
&BD = %10111101
&E7 = %11100111
&FF = %11111111

Aus dem Geist (8 × 16 Pixel) wird jede zweite Zeile genommen; gesetzt sind die Punkte mit Tinte 1 – Augen, Wangen und Mund bleiben Löcher. Ein Zeichen hat nur eine Farbe (Stift) und steht immer im Zeichenraster.

⚖️Wann lohnt sich was?

✅ SCR DOT POSITION + NEXT LINE
Gut für Programme, die einmal ein Bild aufbauen: kein Wissen über Modus, Bildschirmbasis oder Scroll-Versatz nötig – die Firmware kennt beides.
⚠️ GRA PLOT je Pixel
Ein Aufruf je Punkt, mit Koordinatenumrechnung, Fenster- und Stiftprüfung – für bewegte Sprites viel zu langsam, zum Verstehen ideal.
💡 SYMBOL / TXT SET MATRIX
Der klassische „Sprite-Ersatz“ in BASIC: schnell über PRINT ausgegeben, aber einfarbig und nur im Zeichenraster – in Modus 0 hat eine Zeile 20 Zeichen, eine Figur springt also in Schritten von 8 Pixeln.