目的
タイルが多くなって来たのでドット絵のデータを別ソースに分割しました。
ドット絵をバイナリに変換するマクロは以下の記事で紹介しています。
ゲームボーイのドット絵を表計算ソフトからバイナリに変換
対象のドット絵
今回は左足前進と静止状態のドット絵を表示します。
tile.asm
; 主人公正面左足前進
hero_down_left_foot:
db %00000000, %00000000
db %00000111, %00000111
db %00001111, %00001000
db %00011111, %00010000
db %00011111, %00010000
db %00111100, %00111000
db %00111111, %00111111
db %01010000, %01010000
db %00000000, %00000000
db %11100000, %11100000
db %11110000, %00010000
db %11111000, %00001000
db %11111000, %00001000
db %00111100, %00011100
db %11111100, %11111100
db %00001010, %00001010
db %01000010, %01000010
db %01110010, %01110010
db %01011001, %01011000
db %00111111, %00111111
db %00011111, %00011011
db %00011111, %00011110
db %00001111, %00001001
db %00000111, %00000111
db %01000010, %01000010
db %01001100, %01001100
db %10011100, %00010100
db %11110100, %11110100
db %11001100, %11001100
db %11001100, %01001100
db %10111000, %10111000
db %00000000, %00000000
; 主人公正面静止
hero_down_idle:
db %00000111, %00000111
db %00001111, %00001000
db %00011111, %00010000
db %00011111, %00010000
db %00111000, %00111000
db %00110111, %00110111
db %01010000, %01010000
db %01000010, %01000010
db %11100000, %11100000
db %11110000, %00010000
db %11111000, %00001000
db %11111000, %00001000
db %00111100, %00011100
db %11101100, %11101100
db %00001010, %00001010
db %01000010, %01000010
db %00110010, %00110010
db %00111001, %00111000
db %01001111, %01001111
db %01001111, %01001111
db %00111111, %00111001
db %00011110, %00010110
db %00011111, %00010001
db %00001110, %00001110
db %01001100, %01001100
db %10011100, %00011100
db %11110010, %11110010
db %11110010, %11110010
db %11111100, %10011100
db %01111000, %01101000
db %11111000, %10001000
db %01110000, %01110000
表示部分の実装
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]
INCLUDE "tile.asm"
start:
di ; 割り込み禁止
ld sp, $FFFE ; スタック設定
; 画面描画停止
xor a
ldh[$FF40], a
; 画面全体を白くする(タイル0を白で初期化して画面全体に適応)
ld hl, white_tile ; 真っ白(全0)のデータが登録されているタイル
ld de, $8000 ; タイル0の開始アドレス
ld bc, 16 ; 1タイルのバイト数
call memcpy
; 画面全体にタイル0(真っ白)を登録する
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, hero_down_left_foot
ld de, $8000+1*16
ld bc, 16*4
call memcpy
ld hl, $9800
ld a, 1
call set_tile1616
; 主人公正面静止
ld hl, hero_down_idle
ld de, $8000+5*16
ld bc, 16*4
call memcpy
ld hl, $9802
ld a, 5
call set_tile1616
; パレット
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
; 16*16のタイル(4つ分)を表示する
; HL VRAM
; A 開始タイル番号(連続して配置する前提)
set_tile1616:
; 左上
ld [hl], a
; 右上
inc hl
inc a
ld [hl], a
; 左下
ld bc, 31
inc a
add hl, bc
ld [hl], a
; 右下
inc hl
inc a
ld [hl], a
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