目的
ゲームボーイでタイルをする仕組みが分かったので、ドット絵を表示してみます。
VRAM$9800は本来背景を表示するための場所で、主人公はスプライトという領域に配置しないといけないらしいのですが、まだ仕組みを勉強していないので背景として描画します。
ドット絵の設計
表計算ソフトでドット絵を書き色番号を割り当てます。
8×8毎にタイルを分けて、地道に0と1を打ち込みます。
途中で嫌になりました。
実験
rgbasm -o main.o main.asm && \
rgblink -o main.gb main.o && \
rgbfix -v -p 0xFF main.gb && \
../SameBoy-master/build/bin/SDL/sameboy main.gb
main.asm
SECTION "Entry", ROM0[$0100]
jp start
SECTION "Main", ROM0[$0150]
start:
di ; 割り込み禁止
ld sp, $FFFE ; スタック設定
; 画面描画停止
xor a
ldh[$FF40], a
; 画面全体を白くする(タイル1を白で初期化して画面全体に適応)
ld hl, white_tile ; 真っ白(全0)のデータが登録されているタイル
ld de, $8000 ; タイル0の開始アドレス
ld bc, 16 ; 1タイルのバイト数
call memcpy
; 画面全体にタイル1(真っ白)を登録する
ld bc, 32*32
ld hl, $9800
tile_init:
ld [hl],0
inc hl
dec bc
ld a, b
or c
jr nz, tile_init
; 主人公
ld hl, tile1
ld de, $8000+1*16
ld bc, 16*4
call memcpy
ld hl, $9800
ld [hl],1 ; 主人公左上
inc hl
ld [hl],2 ; 主人公右上
ld hl, $9800+32
ld [hl],3 ; 主人公左下
inc hl
ld [hl],4 ; 主人公右下
; パレット
ld a, %11100100 ; 4色(11 10 01 00)を設定
ld [$FF47], a
; 画面描画再開: BG有効
ld a, %10010001
ldh [$FF40], a
hang:
jr hang
; メモリ複製関数
; HL=元, DE=先, BC=長さ
memcpy:
ld a, [hl]
ld [de], a
inc hl
inc de
dec bc
ld a, b ; B==CならBC==0 (B==$FF,C==$FFの時は失敗する)
or c
jr nz,memcpy ; BC!=0なら繰り返す
ret
white_tile:
db %00000000, %00000000
db %00000000, %00000000
db %00000000, %00000000
db %00000000, %00000000
db %00000000, %00000000
db %00000000, %00000000
db %00000000, %00000000
db %00000000, %00000000
; 主人公左上
tile1:
db %00000111, %00000111
db %00001111, %00001000
db %00011111, %00010000
db %00011111, %00010000
db %00111000, %00111000
db %00110111, %00110111
db %01010000, %01010000
db %01000010, %01000010
; 主人公右上
tile2:
db %11100000, %11100000
db %11110000, %00010000
db %11111000, %00001000
db %11111000, %00001000
db %00111100, %00011100
db %11101100, %11101100
db %00001010, %00001010
db %01000010, %01000010
; 主人公左下
tile3:
db %00110010, %00110010
db %00111001, %00111000
db %01001111, %01001111
db %01001111, %01001111
db %00111111, %00111001
db %00011110, %00010110
db %00011111, %00010001
db %00001110, %00001110
; 主人公右下
tile4:
db %01001100, %01001100
db %10011100, %00011100
db %11110010, %11110010
db %11110010, %11110010
db %11111100, %10011100
db %01111000, %01101000
db %11111000, %10001000
db %01110000, %01110000