0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゲームボーイ_スプライトを使用してドット絵を歩かせる

0
Posted at

前回は背景の領域にドット絵を描画していましたが、市販のゲームと同じくスプライトを使用してドット絵を描画するように変更しました。
ゲームボーイでドット絵を歩かせる

output
rgbasm -o sptest.o sptest.asm && \
rgblink -o sptest.gb sptest.o && \
rgbfix -v -p 0xFF sptest.gb && \
../SameBoy-master/build/bin/SDL/sameboy sptest.gb
main.asm
SECTION "Entry", ROM0[$0100]
    jp start

SECTION "Main", ROM0[$0150]

INCLUDE "tile.asm"

start:
    di ; 割り込み禁止
    ld sp, $FFFE ; スタック設定
    
    call display_off
    
    ; 画面クリア
    call bj_clear
    
    ; パレット
    ld a, %11100100 ; 4色(11 10 01 00)を設定
    ld [$FF47], a ; 背景用
    ld [$FF48], a ; スプライト用
    
    ; タイル読み込み
    ld hl, hero
    ld de, $8000
    ld bc, 16*13 ; タイル4枚
    call memcpy
    
main_loop:
    
    ; スプライト登録
    ld hl, $FE00
    ld b, 20
    ld c, 20
    ld d, 0
    call set_tile1616
    
    call display_on
    call delay
    call display_off
    
    ld hl, $FE00
    ld b, 20
    ld c, 20
    ld d, 4
    call set_tile1616
    
    call display_on
    call delay
    call display_off
    
    ld hl, $FE00
    ld b, 20
    ld c, 20
    ld d, 8
    call set_tile1616
    
    call display_on
    call delay
    call display_off
    
    ld hl, $FE00
    ld b, 20
    ld c, 20
    ld d, 4
    call set_tile1616
    
    call display_on
    call delay
    call display_off
    
    jr main_loop
    

    ld hl, $FE00
    call display_on

hang:
    jr hang

; B:Y座標
; C:X座標
; D:左上タイル番号
set_tile1616:
    ; 左上
    ld [hl], b ; Y座標
    inc hl
    ld [hl], c ; X座標
    inc hl
    ld [hl], d  ; タイル番号
    inc hl
    ld [hl], 0
    
    ; 右上 X+8
    inc hl
    ld [hl], b ; Y座標
    inc hl
    ld a, c
    add a,8
    ld [hl], a ; X座標
    inc hl
    inc d
    ld [hl], d  ; タイル番号
    inc hl
    ld [hl], 0
    
    ; 左下 Y+8
    inc hl
    ld a, b
    add a, 8
    ld [hl], a ; Y座標
    inc hl
    ld [hl], c ; X座標
    inc hl
    inc d
    ld [hl], d  ; タイル番号
    inc hl
    ld [hl], 0
    
    ; 右下 X+8 Y+8
    inc hl
    ld a, b
    add a,8
    ld [hl], a ; Y座標
    inc hl
    ld a, c
    add a, 8
    ld [hl], a ; X座標
    inc hl
    inc d
    ld [hl], d  ; タイル番号
    inc hl
    ld [hl], 0
    ret
    
    ; 画面描画停止
display_off:
    xor a
    ldh[$FF40], a
    ret

    ; 画面描画再開: BG有効
display_on:
    ld a, %10010011
    ldh [$FF40], a
    ret
    
; メモリ複製関数
; 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
    
    ; 画面全体にタイル255(真っ白)を登録する
    ; メモリは初めから0で初期化されているのでタイル255を故意に書き換え無ければ全て0
bj_clear:
    ld bc, 32*32
    ld hl, $9800
loop1:
    ld [hl],255
    inc hl
    dec bc
    ld a, b
    or c
    jr nz, loop1
    ret
    
    ; 遅延
delay:
    ld bc, $AFFE
loop2:
    dec bc
    ld a, b
    or c
    jr nz, loop2
    ret
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?