📋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.
| Routine | Adresse | Eingang | Ausgang |
|---|---|---|---|
| SCR DOT POSITION | &BC1D | DE = x, HL = y (Basiskoordinaten, y = 0 unten) | HL = Bildschirmadresse, C = Pixelmaske, B = Pixel je Byte − 1 |
| SCR NEXT LINE | &BC26 | HL = Bildschirmadresse | HL = Adresse eine Pixelzeile tiefer |
| SCR NEXT BYTE | &BC20 | HL = Bildschirmadresse | HL = Adresse ein Byte weiter rechts |
| SCR INK ENCODE | &BC2C | A = Tinte | A = Byte, in dem alle Pixel diese Tinte haben |
| GRA SET PEN | &BBDE | A = Tinte | – |
| GRA PLOT ABSOLUTE | &BBEA | DE = x, HL = y (Benutzerkoordinaten 0–639 / 0–399) | setzt einen Punkt im Stift |
| TXT SET M TABLE | &BBAB | DE = erstes Zeichen, HL = Tabelle | ab diesem Zeichen sind Matrizen umdefinierbar |
| TXT SET MATRIX | &BBA8 | A = Zeichen, HL = 8 Bytes | neue 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 &0000Firmware
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
0000ED FEHLE ▸ RESET ENTRY
0002C9RET
000300NOP
000400NOP
000500NOP
000600NOP
000700NOP
0008ED FEHLE ▸ LOW JUMP
000AC9RET
000BED FEHLE ▸ 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.