目的
ゲームボーイのタイル表示の仕組みを調べたので記録しておきます。
実験
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+1*16 ; タイル1の開始アドレス
ld bc, 16 ; 1タイルのバイト数
call memcpy
; 画面全体にタイル1(真っ白)を登録する
ld bc, 32*32
ld hl, $9800
tile_init:
ld [hl],1
inc hl
dec bc
ld a, b
or c
jr nz, tile_init
; 実験用タイル0
ld hl, tile
ld de, $8000
ld bc, 16
call memcpy
ld hl, $9800
ld [hl],0 ; 実験用タイル
; パレット
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
; 1タイル = 16バイト(1pixel=2byte)
tile:
db %11111111, %11111111
db %00000000, %11111111
db %11111111, %00000000
db %01010101, %01010101
db %00000000, %01010101
db %01010101, %00000000
db %00000000, %00000000
db %00000000, %00000000
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