掌機 - Game Boy Color - Assembly - DMA Transfer



參考資訊:
https://bgb.bircd.org/
https://github.com/gbdev/rgbds
https://github.com/sinamas/gambatte
https://github.com/lancekindle/DMGreport

暫存器


注意事項:
1. DMA程式位址:0xff80~0xfffe
2. DMA來源位址:0x0000~0xdfff
3. DMA執行時間:76us(2x)、152us(1x)
4. DMA固定搬移資料到OAM 0xfe00(32bits x 40)

main.s

RAM         equ $c000
DMA         equ $ff46
DMA_CODE    equ $ff80
LCDC        equ $ff40
LCDCF_OBJ8  equ %00000000
LCDCF_OBJON equ %00000010
IE          equ $ffff
IEF_VBLANK  equ %00000001

section "vblank", rom0[$0040]
    jp DMA_CODE

section "lcdc", rom0[$0048]
    reti

section "timer", rom0[$0050]
    reti

section "serial", rom0[$0058]
    reti

section "joypad", rom0[$0060]
    reti

section "entry", rom0[$0100]
    nop
    jp _start

section "header", rom0[$0104]
    db $ce, $ed, $66, $66, $cc, $0d, $00, $0b, $03, $73, $00, $83, $00, $0c, $00, $0d
    db $00, $08, $11, $1f, $88, $89, $00, $0e, $dc, $cc, $6e, $e6, $dd, $dd, $d9, $99
    db $bb, $bb, $67, $63, $6e, $0e, $ec, $cc, $dd, $dc, $99, $9f, $bb, $b9, $33, $3e
    db "0123456789abcde"
    db $80
    db 0, 0
    db 0
    db 0
    db 0
    db 0
    db 1
    db $33
    db 0
    db 0
    dw 0

_start:
    di
    ld sp, $ffff
    call copy_dma_code
    ld a, IEF_VBLANK
    ld [IE], a
    ei

    ld a, [LCDC]
    or LCDCF_OBJON
    or LCDCF_OBJ8
    ld [LCDC], a

    ld d, 32
    ld bc, tile
    ld hl, $8000
copy_tile:
    ld a, [bc]
    ld [hl+], a
    inc bc
    dec d
    jr nz, copy_tile

    ld b, 0
    ld hl, color
copy_palette:
    ld a, b
    ld [$ff6a], a
    ld a, [hl]
    ld [$ff6b], a
    inc hl
    inc b
    ld a, b
    cp 8
    jr nz, copy_palette

    ld hl, RAM + 0
    ld [hl], 30
    ld hl, RAM + 1
    ld [hl], 30
    ld hl, RAM + 2
    ld [hl], 1
    ld hl, RAM + 3
    ld [hl], 0

    jp @

dma_code_start:
    push af
    ld a, RAM / $100
    ldh [DMA], a
    ld a, $28
wait:
    dec a
    jr nz, wait
    pop af
    reti
dma_code_end:

copy_dma_code:
    ld de, DMA_CODE
    ld hl, dma_code_start
    ld bc, dma_code_end - dma_code_start
copy:
    inc b
    inc c
    jr skip
cloop:
    ld a, [hl+]
    ld [de], a
    inc de
skip:
    dec c
    jr nz, cloop
    dec b
    jr nz, cloop
    ret

color:
    dw $7fff
    dw $001f
    dw $03e0
    dw $7c00

tile:
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000
    db %00000000

    db %00000000
    db %11111111
    db %00000000
    db %11111111
    db %00000000
    db %11111111
    db %00000000
    db %11111111
    db %00000000
    db %11111111
    db %00000000
    db %11111111
    db %00000000
    db %11111111
    db %00000000
    db %11111111

完成