Bitmap-Modus
Mit Hilfe einer Bitmap können wir mit dem C64 hochauflösende Grafik darstellen. Im Gegensatz zum Textmodus kann im Bitmap-Modus jeder Bildschirmpunkt direkt angesprochen werden.
Einschalten[Bearbeiten | Quelltext bearbeiten]
Im VIC-II-Kontrollregister 1 ($D011) muss Bit 5 (Bitmap <=> Text) gesetzt und Bit 6 (Erweiterter Hintergrundfarbenmodus) gelöscht sein.
VIC-II Kontrollregister im Bitmap-Modus | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Adresse hex. | Adresse dez. | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | ||
$D011 | 53265 | 0 | 1 | ||||||||
$D016 | 53270 | - | - | - | MCM |
Standard Grafikmodi[Bearbeiten | Quelltext bearbeiten]
Es gibt zwei Standard-Grafikmodi, die eine Bitmap benutzen. Sie unterscheiden sich durch den Wert des Bits MCM (Multicolormodus).
- Hires Bitmap-Modus wenn MCM = 0
- Multicolor Bitmap-Modus wenn MCM = 1
Der Hires Bitmap-Modus besitzt 320×200 direkt ansprechbare Pixel in zwei von jeweils 16 Farben, die in jeder Kachel anders gewählt werden können. Der Multicolor Bitmap-Modus hat eine höhere Farb-, dafür aber eine niedrigere Pixel-Auflösung: 160×200 frei ansprechbare Pixel in vier Farben. Drei der Farben können in jeder Kachel neu gewählt werden, eine - die Hintergrundfarbe - ist im ganzen Bild gleich.
Speicherbelegung[Bearbeiten | Quelltext bearbeiten]
Da der VIC-II nur 16 KByte adressieren kann, muss die VIC-Bank ausgewählt werden.
Bitmap und Farbspeicher[Bearbeiten | Quelltext bearbeiten]
Die Lage der Bitmap und des Farbspeichers in der Video-Bank werden mit Hilfe des VIC-II Kontrollregisters 53272 ($D018) festgelegt.
Bitmap[Bearbeiten | Quelltext bearbeiten]
Im Bitmap-Modus bestimmen die Bits 1-3 von $D018 die relative Startadresse der Bitmap. Da die Bitmap ca. 8 KByte groß ist, kommen hierbei nur die Adressen 0 ($0000) und 8192 ($2000) in Frage.
Video-Bank | $D018 Bits 3-1 | Bitmap-Adresse relativ | Bitmap-Adresse absolut | Bemerkung |
---|---|---|---|---|
0 | 000 | $0000 | $0000-$1F3F | nicht nutzbar wegen Zeropage und Zeichen-ROM |
0 | 100 | $2000 | $2000-$3F3F | |
1 | 000 | $0000 | $4000-$5F3F | |
1 | 100 | $2000 | $6000-$7F3F | |
2 | 000 | $0000 | $8000-$9F3F | nicht nutzbar wegen Zeichen-ROM |
2 | 100 | $2000 | $A000-$BF3F | RAM unter BASIC-ROM |
3 | 000 | $0000 | $C000-$DF3F | |
3 | 100 | $2000 | $E000-$FF3F | RAM unter KERNAL-ROM |
In BASIC wird der Bitmapstart innerhalb des VIC-Adressbereichs wie folgt auf $2000 gesetzt:
POKE 53272,PEEK(53272) OR 8
Farben[Bearbeiten | Quelltext bearbeiten]
Im Bitmap-Modus dient der Bildschirmspeicher als Farbspeicher.
Im Hires Bitmap-Modus ist er der einzige Farbspeicher und enthält Vorder- und Hintergrundfarbe. Im Multicolor Bitmap-Modus enthält er 2 von 4 möglichen Farben.
Bit 4-7 von $D018 definieren die Startadresse des Farbspeichers in der Video-Bank.
Bits | Wert B | Startadresse (hex) | Anmerkung |
---|---|---|---|
0000xxxx | 000 | 0 ($0000) | unbenutzbar wegen Zeropage |
0001xxxx | 016 | 1024 ($0400) | Grundeinstellung |
0010xxxx | 032 | 2048 ($0800) | |
0011xxxx | 048 | 3072 ($0C00) | |
0100xxxx | 064 | 4096 ($1000) | Zeichensatz-ROM |
0101xxxx | 080 | 5120 ($1400) | Zeichensatz-ROM |
0110xxxx | 096 | 6144 ($1800) | Zeichensatz-ROM |
0111xxxx | 112 | 7168 ($1C00) | Zeichensatz-ROM |
1000xxxx | 128 | 8192 ($2000) | |
1001xxxx | 144 | 9216 ($2400) | |
1010xxxx | 160 | 10240 ($2800) | |
1011xxxx | 176 | 11264 ($2C00) | |
1100xxxx | 192 | 12288 ($3000) | |
1101xxxx | 208 | 13312 ($3400) | |
1110xxxx | 224 | 14336 ($3800) | |
1111xxxx | 240 | 15360 ($3C00) |
In BASIC wird der Start des Farbspeichers innerhalb des VIC-Adressbereichs mit Hilfe des Wertes B aus der obigen Tabelle festgelegt durch
POKE 53272,PEEK(53272) AND 15 OR B
Die im Multicolor Bitmap-Modus für die Farben 3 und 0 benutzten Farbspeicher Farb-RAM und Hintergrundfarbe haben die festen Speicheradressen 55296-56295 ($D800-$DBE7) bzw. 53281 ($D021).
Einschaltwerte:
$D016=$C8 ;%11001000 Bit 4 = 0 Hires $D011=$1B ;%00011011 Bits 6,5 = 00 Textmodus $D018=$15 ;%00011001 Bits 7-4 = 0001 => Videostart $0400 Bits 3,2,1 = 100 => Bitmap $2000 $DD00=$C7 ;%11000111 Bits 1,0 = 11 => Video-Bank 0
Programmierung[Bearbeiten | Quelltext bearbeiten]
Programmiersprachen[Bearbeiten | Quelltext bearbeiten]
Der Umgang mit Bitmap-Grafik ist für ein Programm auf dem C64 aufgrund der anfallenden Datenmengen zeitaufwändig, so dass hierfür in der Regel Assemblerprogramme zum Einsatz kommen. Man kann auch eine BASIC-Erweiterung benutzen, die Grafikbefehle enthält, wie z.B. Simons' Basic, oder eine spezielle Grafikerweiterung wie Supergrafik oder HSG. In BASIC V2 muss man überwiegend mit POKEs arbeiten.
Programmier-Beispiele[Bearbeiten | Quelltext bearbeiten]
BASIC[Bearbeiten | Quelltext bearbeiten]
Bitmap-Modus ein:
POKE 53265,PEEK(53265) OR 32
Wird Bit 5 des VIC-II-Kontrollregisters auf 0 gesetzt, kommt man zurück in den Textmodus.
POKE 53265,PEEK(53265) AND 223
Achtung bei Nutzung von Rasterzeilen-Interrupts, diese POKEs verstellen ggf. auch die Zeile, in der ein IRQ ausgelöst wird.
Assembler[Bearbeiten | Quelltext bearbeiten]
Die folgende Routine schaltet den Hires- bzw. Multicolor-Modus ein mit der Bitmap bei $4000 und dem Video-RAM bei $6000.
Ist kein Bild geladen, so müssen zuvor die Bitmap gelöscht und die Farbspeicher initialisiert werden.
hires lda #$c8 ;%11001000 Bit4=0 Hires bne weiter multi lda #$d8 ;%11011000 Bit4=1 Multicolor weiter sta $d016 lda #$3b ;%00111011 Bit65=01 Bitmap-Modus sta $d011 ;(Achtung, verstellt ggf. Rasterzeilen-Interrupt) lda #$81 ;%10000001 Bits7-4=1000 => Video $2000 sta $d018 ; Bits321=000 => Bitmap $0000 lda #$96 ;%10010110 Bits10=10 => Videobank 1 ($4000-$7fff) sta $dd00 lda backcol sta $d021 lda bordercol sta $d020 rts