Bitmap-Modus

Aus C64-Wiki
Zur Navigation springenZur Suche springen

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).

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

Verwandte Themen[Bearbeiten | Quelltext bearbeiten]