✨CPC Plus: echte Hardware-Sprites

1990 brachte Amstrad den 464 Plus und den 6128 Plus. Ein neuer Baustein, der ASIC, enthält die Aufgaben des Gate Arrays und zusätzliche Fähigkeiten – darunter, was der klassische CPC nie hatte: Sprites in Hardware. Die Figur wird nicht mehr in den Bildschirmspeicher geschrieben, sondern vom ASIC beim Bildaufbau eingeblendet. Bewegen heißt: zwei Register ändern.

Sprites
16
Priorität: Rand > Sprite 0 > … > Sprite 15 > Bild
Größe
16 × 16
4 Bit je Pixel, Pixel so breit wie in Modus 2
Farben
15 aus 4096
gemeinsame Sprite-Palette, 12 Bit RGB
Vergrößerung
×1 ×2 ×4
X und Y getrennt; %00 = aus

🕹️Ausprobieren (Simulation)

Sprite 0 ist der Geist aus den Software-Beispielen – mit X-Vergrößerung ×2 genau so breit wie in Modus 0. Sprite 1 (Roboter) ist ×4/×2 vergrößert, Sprite 2 (Rakete) ×1.
🧪 Simulation: Hier rechnet TypeScript nach, was die Arnold-V-Spezifikation beschreibt (Größe, 4-Bit-Pixel, Palette, Vergrößerung, Priorität, Pixel 0 = durchsichtig). Das ist kein Plus-Emulator; Zeitverhalten des ASIC und Sonderfälle am Bildrand sind nicht nachgebildet. (0,0) liegt hier links oben im Bildbereich – laut cpctech werden die Koordinaten mit den CRTC-Zählern verglichen, bei Standardeinstellung ist das diese Ecke.
Sprite wählen (0 = höchste Priorität)
&6000: 78 00 3C 00 09
X lo, X hi, Y lo, Y hi, Vergrößerung %1001 (Bits 3–2 X, 1–0 Y) · Pixel ab &4000
Pixel des Sprites (Klick malt Stift 1, Rechtsklick = 0)
Sprite-Palette &6422–&643F: 15 Farben aus 4096 (4 Bit je Rot/Grün/Blau), für alle Sprites gemeinsam
0
Stift 1: Wort &00FF → Adresse &6422 = &FF (Rot 15 · Blau 15), &6423 = &00 (Grün 0)· Bildschirmstifte 0–15 liegen bei &6400–&641E, der Rand bei &6420
Freischalten: 17 Bytes an den CRTC-Adressport &BCxx
&FF
&00
&FF
&77
&B3
&51
&A8
&D4
&62
&39
&9C
&46
&2B
&15
&8A
&CD
&EE
Schritt 1 / 18 · Tasten ← →
Noch nichts gesendet. Die ersten Bytes (&FF, &00) synchronisieren die Prüflogik: erst ein Wert ungleich 0, dann 0.

Laut Spezifikation beruht die Prüfung auf zwei 4-Bit-Schieberegistern; dieselbe Folge ohne das abschließende &EE sperrt wieder. Die Simulation hier vergleicht nur Byte für Byte.

Z80-Programm für Sprite 0 (Muster: hwsprite.asm von K. Thacker) – nur auf dem Plus lauffähig
; CPC Plus: Hardware-Sprite 0 einrichten (läuft NICHT auf CPC 464/664/6128)
        org &8000             ; Code nicht bei &4000–&7FFF: dort liegt gleich die ASIC-Seite
        di
        ld b,&bc              ; 1) Freischalten: 17 Bytes an den CRTC-Adressport
        ld hl,sequence
        ld e,17
seq:    ld a,(hl)
        out (c),a
        inc hl
        dec e
        jr nz,seq
        ei
        ld bc,&7fb8           ; 2) RMR2: ASIC-Register bei &4000–&7FFF einblenden
        out (c),c
        ld hl,pixels          ; 3) Pixeldaten: 256 Bytes, je Byte ein Pixel (Bits 3–0)
        ld de,&4000
        ld bc,256
        ldir
        ld hl,colours         ; 4) Sprite-Palette: 15 Farben à 2 Bytes ab &6422
        ld de,&6422
        ld bc,30
        ldir
        ld hl,120
        ld (&6000),hl       ; 5) X (Modus-2-Pixel)
        ld hl,60
        ld (&6002),hl       ;    Y (Rasterzeilen)
        ld a,&09
        ld (&6004),a        ;    Vergrößerung X ×2, Y ×1
        ld bc,&7fa0           ; 6) ASIC-Seite wieder ausblenden
        out (c),c
        ret
sequence:
        db &FF,&00,&FF,&77,&B3,&51,&A8,&D4,&62,&39,&9C,&46,&2B,&15,&8A,&CD,&EE
colours:                      ; Wort &0GRB je Farbe 1–15
        dw &00FF
        dw &0FFF
        dw &0000
        dw &08FA
        dw &0FF0
        dw &0F0F
        dw &00F0
        dw &08F0
        dw &0088
        dw &0C04
        dw &084F
        dw &0CCC
        dw &0666
        dw &0CF4
        dw &048F
pixels:
        db &00,&00,&00,&00,&01,&01,&01,&01,&01,&01,&01,&01,&00,&00,&00,&00
        db &00,&00,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&00,&00
        db &01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01
        db &01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01
        db &01,&01,&02,&02,&02,&02,&01,&01,&01,&01,&02,&02,&02,&02,&01,&01
        db &01,&01,&02,&02,&03,&03,&01,&01,&01,&01,&02,&02,&03,&03,&01,&01
        db &01,&01,&02,&02,&03,&03,&01,&01,&01,&01,&02,&02,&03,&03,&01,&01
        db &01,&01,&02,&02,&02,&02,&01,&01,&01,&01,&02,&02,&02,&02,&01,&01
        db &01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01
        db &01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01
        db &01,&01,&04,&04,&01,&01,&01,&01,&01,&01,&01,&01,&04,&04,&01,&01
        db &01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01
        db &01,&01,&01,&01,&01,&01,&09,&09,&09,&09,&01,&01,&01,&01,&01,&01
        db &01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01
        db &01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01,&01
        db &01,&01,&00,&00,&00,&00,&01,&01,&01,&01,&00,&00,&00,&00,&01,&01

🗺️Die Register-Seite bei &4000–&7FFF

Erst nach der Freischalt-Sequenz und OUT &7FB8 (RMR2) liegt diese Seite statt RAM im Adressbereich &4000–&7FFF. Programme, die sie nutzen, stehen deshalb außerhalb dieses Bereichs (z. B. ab &8000).
AdresseInhaltHinweis
&4000–&40FFSprite 0: 256 Pixel, 1 Byte je Pixelnur Bits 3–0 zählen (Schreiben wird mit &0F maskiert)
&4100–&4FFFSprites 1–15je 256 Bytes
&6000–&607FPosition und Vergrößerungje Sprite 8 Bytes: X lo/hi, Y lo/hi, Vergrößerung (Bits 3–2 X, 1–0 Y)
&6400–&641EFarben der Bildschirmstifte 0–15je 2 Bytes: &0GRB
&6420Farbe des Randes2 Bytes
&6422–&643ESprite-Farben 1–15Sprite-Pixel 0 ist immer durchsichtig
&6800PRI – programmierbarer Raster-Interrupt0 = normaler Interrupt, sonst am Ende der angegebenen Zeile

Quellen: „Arnold V“ Specification, Issue 1.5 (10. April 1990) · K. Thacker, hwsprite.asm und „Extra CPC Plus Hardware Information“ (cpctech).

⚖️Software gegen Hardware

AufgabeCPC 464/664/6128 (Software)CPC Plus (ASIC)
ZeichnenZ80 schreibt jedes Byte, z. B. Routine c ≈ 1 500 µs für 4 × 16 BytesASIC blendet beim Bildaufbau ein
BewegenHintergrund zurück, sichern, neu zeichnenX/Y-Register schreiben (4 Bytes)
TransparenzMaske oder TabellePixelwert 0
Farbendie Tinten des Bildschirmmoduseigene 15 Farben aus 4096
FlackernStrahlrücklauf abwarten, Double Bufferingkein Umzeichnen im Bildspeicher nötig
Anzahlbegrenzt durch Rechenzeit16 gleichzeitig definierte Sprites