目的
これまでゲームボーイのゲームを書く時にはゲームボーイ専用アセンブラrgbasmを使用して来ました
筆者の目的はゲームを作ることではなく、z80のCPUに慣れることであるため、z80asmのアセンブラを使うことにします。
但し、ROMのヘッダや任天堂の商標をバイナリで書く部分だけはrgbfixを使用します。
この部分もバイナリで書きたかったのですが任天堂商標をそのまま載せたく無いので苦肉の策です。
直接機械語を書き込む
ゲームボーイのCPUはz80を改造したような使用で、多くの機械語は共通していますが、一部が異なります。
以下の記事で調査しています。
z80とrgbasmのアセンブリで生成される機械語を比較
例えば今回使用しているld(0xXXXX), aの命令はz80にもゲームボーイのCPUにも存在しますが、機械語が異なります。
仕方が無いのでこの部分はニーモニックを使わずDEFB 0xEA の様に直接機械語を書き込みます。
z80.asm
org 0x0000
ld(0xFF40), a
gameboy.asm
SECTION "test", ROM0[$0000]
ld[$FF40], a
test@test-fujitsu:~/kaihatsu$ xxd z80.gb
00000000: 3240 ff 2@.
test@test-fujitsu:~/kaihatsu$ xxd -l 50 gameboy.gb
00000000: ea40 ff00 0000 0000 0000 0000 0000 0000 .@..............
実装
以下をz80asmでアセンブル出来るように書き直した。
ゲームボーイ画面描画
z80asm main.asm -o main.gb
rgbfix -v -p 0xFF main.gb
../SameBoy-master/build/bin/SDL/sameboy main.gb
main.asm
org 0x0000
ds 0x0050 - $, 0x00 ; rgbfixで埋めるヘッダ分の領域を確保
org 0x0050
ds 0x0100 - $, 0x00
org 0x0100 ; start
jp start
ds 0x0150 - $, 0x00
org 0x0150
start:
di
ld sp, 0xFFFE
; 画面描画停止
xor a, 0
DEFB 0xEA ; ld (0xFF40), a
DEFW 0xFF40
; 真っ黒のタイルを1つ作る
ld hl, 0x8000 + 1 * 16 ; 2つめの領域にタイルを作る
ld b, 16 ; (8*8 1pixel=2bit)
fill:
ld (hl),0xAA
inc hl
dec b
jr nz, fill
ld hl, 0x9800 ; タイルを置くVRAM
ld (hl),1 ; タイル1
; パレット
ld a, %11100100 ; 4色(11 10 01 00)を設定
DEFB 0xEA ; ld (0xFF47), a
DEFW 0xFF47
; 画面描画再開: BG有効
ld a, %10010011
DEFB 0xEA ; ld (0xFF40), a
DEFW 0xFF40
hang:
halt
jr hang
org 0x7FFF ; 32KB ROM の末尾アドレス
ds 0x8000 - $, 0x00