diff options
-rwxr-xr-x | constants.asm | 1 | ||||
-rw-r--r-- | constants/hardware_constants.asm | 117 | ||||
-rw-r--r-- | constants/misc_constants.asm | 32 | ||||
-rwxr-xr-x | engine/bank3.asm | 12 | ||||
-rwxr-xr-x | engine/home.asm | 126 |
5 files changed, 218 insertions, 70 deletions
diff --git a/constants.asm b/constants.asm index b67f31a..bb678d8 100755 --- a/constants.asm +++ b/constants.asm @@ -6,3 +6,4 @@ INCLUDE "constants/deck_constants.asm" INCLUDE "constants/type_constants.asm" INCLUDE "constants/set_constants.asm" INCLUDE "constants/misc_constants.asm" +INCLUDE "constants/hardware_constants.asm" diff --git a/constants/hardware_constants.asm b/constants/hardware_constants.asm new file mode 100644 index 0000000..8e926a1 --- /dev/null +++ b/constants/hardware_constants.asm @@ -0,0 +1,117 @@ +; From http://nocash.emubase.de/pandocs.htm. + +GBC EQU $11 + +; MBC3 +MBC3SRamEnable EQU $0000 +MBC3RomBank EQU $2000 +MBC3SRamBank EQU $4000 +MBC3LatchClock EQU $6000 +MBC3RTC EQU $a000 + +SRAM_DISABLE EQU $00 +SRAM_ENABLE EQU $0a + +NUM_SRAM_BANKS EQU 4 + +RTC_S EQU $08 ; Seconds 0-59 (0-3Bh) +RTC_M EQU $09 ; Minutes 0-59 (0-3Bh) +RTC_H EQU $0a ; Hours 0-23 (0-17h) +RTC_DL EQU $0b ; Lower 8 bits of Day Counter (0-FFh) +RTC_DH EQU $0c ; Upper 1 bit of Day Counter, Carry Bit, Halt Flag + ; Bit 0 Most significant bit of Day Counter (Bit 8) + ; Bit 6 Halt (0=Active, 1=Stop Timer) + ; Bit 7 Day Counter Carry Bit (1=Counter Overflow) + +; interrupt flags +VBLANK EQU 0 +LCD_STAT EQU 1 +TIMER EQU 2 +SERIAL EQU 3 +JOYPAD EQU 4 + +LY_VBLANK EQU 145 + +; OAM attribute flags +OAM_PALETTE EQU %111 +OAM_TILE_BANK EQU 3 +OAM_OBP_NUM EQU 4 ; Non CGB Mode Only +OAM_X_FLIP EQU 5 +OAM_Y_FLIP EQU 6 +OAM_PRIORITY EQU 7 ; 0: OBJ above BG, 1: OBJ behind BG (colors 1-3) + + +; Hardware registers +rJOYP EQU $ff00 ; Joypad (R/W) +rSB EQU $ff01 ; Serial transfer data (R/W) +rSC EQU $ff02 ; Serial Transfer Control (R/W) +rSC_ON EQU 7 +rSC_CGB EQU 1 +rSC_CLOCK EQU 0 +rDIV EQU $ff04 ; Divider Register (R/W) +rTIMA EQU $ff05 ; Timer counter (R/W) +rTMA EQU $ff06 ; Timer Modulo (R/W) +rTAC EQU $ff07 ; Timer Control (R/W) +rTAC_ON EQU 2 +rTAC_4096_HZ EQU 0 +rTAC_262144_HZ EQU 1 +rTAC_65536_HZ EQU 2 +rTAC_16384_HZ EQU 3 +rIF EQU $ff0f ; Interrupt Flag (R/W) +rNR10 EQU $ff10 ; Channel 1 Sweep register (R/W) +rNR11 EQU $ff11 ; Channel 1 Sound length/Wave pattern duty (R/W) +rNR12 EQU $ff12 ; Channel 1 Volume Envelope (R/W) +rNR13 EQU $ff13 ; Channel 1 Frequency lo (Write Only) +rNR14 EQU $ff14 ; Channel 1 Frequency hi (R/W) +rNR21 EQU $ff16 ; Channel 2 Sound Length/Wave Pattern Duty (R/W) +rNR22 EQU $ff17 ; Channel 2 Volume Envelope (R/W) +rNR23 EQU $ff18 ; Channel 2 Frequency lo data (W) +rNR24 EQU $ff19 ; Channel 2 Frequency hi data (R/W) +rNR30 EQU $ff1a ; Channel 3 Sound on/off (R/W) +rNR31 EQU $ff1b ; Channel 3 Sound Length +rNR32 EQU $ff1c ; Channel 3 Select output level (R/W) +rNR33 EQU $ff1d ; Channel 3 Frequency's lower data (W) +rNR34 EQU $ff1e ; Channel 3 Frequency's higher data (R/W) +rNR41 EQU $ff20 ; Channel 4 Sound Length (R/W) +rNR42 EQU $ff21 ; Channel 4 Volume Envelope (R/W) +rNR43 EQU $ff22 ; Channel 4 Polynomial Counter (R/W) +rNR44 EQU $ff23 ; Channel 4 Counter/consecutive; Inital (R/W) +rNR50 EQU $ff24 ; Channel control / ON-OFF / Volume (R/W) +rNR51 EQU $ff25 ; Selection of Sound output terminal (R/W) +rNR52 EQU $ff26 ; Sound on/off +rLCDC EQU $ff40 ; LCD Control (R/W) +rLCDC_ENABLE EQU 7 +rLCDC_ENABLE_MASK EQU 1 << rLCDC_ENABLE +rSTAT EQU $ff41 ; LCDC Status (R/W) +rSCY EQU $ff42 ; Scroll Y (R/W) +rSCX EQU $ff43 ; Scroll X (R/W) +rLY EQU $ff44 ; LCDC Y-Coordinate (R) +rLYC EQU $ff45 ; LY Compare (R/W) +rDMA EQU $ff46 ; DMA Transfer and Start Address (W) +rBGP EQU $ff47 ; BG Palette Data (R/W) - Non CGB Mode Only +rOBP0 EQU $ff48 ; Object Palette 0 Data (R/W) - Non CGB Mode Only +rOBP1 EQU $ff49 ; Object Palette 1 Data (R/W) - Non CGB Mode Only +rWY EQU $ff4a ; Window Y Position (R/W) +rWX EQU $ff4b ; Window X Position minus 7 (R/W) +rKEY1 EQU $ff4d ; CGB Mode Only - Prepare Speed Switch +rVBK EQU $ff4f ; CGB Mode Only - VRAM Bank +rHDMA1 EQU $ff51 ; CGB Mode Only - New DMA Source, High +rHDMA2 EQU $ff52 ; CGB Mode Only - New DMA Source, Low +rHDMA3 EQU $ff53 ; CGB Mode Only - New DMA Destination, High +rHDMA4 EQU $ff54 ; CGB Mode Only - New DMA Destination, Low +rHDMA5 EQU $ff55 ; CGB Mode Only - New DMA Length/Mode/Start +rRP EQU $ff56 ; CGB Mode Only - Infrared Communications Port +rBGPI EQU $ff68 ; CGB Mode Only - Background Palette Index +rBGPD EQU $ff69 ; CGB Mode Only - Background Palette Data +rOBPI EQU $ff6a ; CGB Mode Only - Sprite Palette Index +rOBPD EQU $ff6b ; CGB Mode Only - Sprite Palette Data +rUNKNOWN1 EQU $ff6c ; (FEh) Bit 0 (Read/Write) - CGB Mode Only +rSVBK EQU $ff70 ; CGB Mode Only - WRAM Bank +rUNKNOWN2 EQU $ff72 ; (00h) - Bit 0-7 (Read/Write) +rUNKNOWN3 EQU $ff73 ; (00h) - Bit 0-7 (Read/Write) +rUNKNOWN4 EQU $ff74 ; (00h) - Bit 0-7 (Read/Write) - CGB Mode Only +rUNKNOWN5 EQU $ff75 ; (8Fh) - Bit 4-6 (Read/Write) +rUNKNOWN6 EQU $ff76 ; (00h) - Always 00h (Read Only) +rUNKNOWN7 EQU $ff77 ; (00h) - Always 00h (Read Only) +rIE EQU $ffff ; Interrupt Enable (R/W) + diff --git a/constants/misc_constants.asm b/constants/misc_constants.asm index 3315eb1..45623d0 100644 --- a/constants/misc_constants.asm +++ b/constants/misc_constants.asm @@ -1,5 +1,35 @@ -; addresses + +; WRAM addresses $Cxxx +DATA_INITIAL_A EQU $CAB3 +DATA_CONSOLE EQU $CAB4 +CONSOLE_DMG EQU $00 +CONSOLE_SGB EQU $01 +CONSOLE_CGB EQU $02 +DATA_TILE_MAP_FILL EQU $CAB6 +CURR_IE EQU $CAB7 +DATA_VBLANK_COUNTER EQU $CAB8 +CURR_LCDC EQU $CABB +CURR_BGP EQU $CABC +CURR_OBP0 EQU $CABD +CURR_OBP1 EQU $CABE + +BUF_PALETTE EQU $CAF0 +BUF_SERIAL EQU $CB74 + +; HRAM addresses CURR_ROM_BANK EQU $FF80 CURR_RAM_BANK EQU $FF81 CURR_DEST_VRAM_BANK EQU $FF82 +DMA_FUNCTION EQU $FF83 + +DPAD_REPEAT_CTR EQU $FF8D +BUTTONS_RELEASED EQU $FF8E +BUTTONS_PRESSED_2 EQU $FF8F +BUTTONS_HELD EQU $FF90 +BUTTONS_PRESSED EQU $FF91 + +CURR_SCX EQU $FF92 +CURR_SCY EQU $FF93 +CURR_WX EQU $FF94 +CURR_WY EQU $FF95 diff --git a/engine/bank3.asm b/engine/bank3.asm index 502d179..297d02c 100755 --- a/engine/bank3.asm +++ b/engine/bank3.asm @@ -15,7 +15,7 @@ LoadMap: ; c000 (3:4000) xor a ld [$cab6], a call Func_2119 - call Func_02b9 + call Set_OBJ_8x8 xor a ld [$cd08], a xor a @@ -388,7 +388,7 @@ Func_c2db: ; c2db (3:42db) push bc push de call DisableLCD - call Func_02b9 + call Set_OBJ_8x8 call Func_3ca0 farcall Func_12bcd ld a, $c2 @@ -1004,20 +1004,20 @@ Func_c7b8: ; c7b8 (3:47b8) xor a ld [$ff92], a ld [$ff93], a - call Func_02c2 + call Set_OBJ_8x16 farcall Func_1288c farcall Func_8db0 - call Func_02b9 + call Set_OBJ_8x8 ret Func_c7cc: ; c7cc (3:47cc) xor a ld [$ff92], a ld [$ff93], a - call Func_02c2 + call Set_OBJ_8x16 farcall Func_1288c farcall Func_a288 - call Func_02b9 + call Set_OBJ_8x8 ret Func_c7e0: ; c7e0 (3:47e0) diff --git a/engine/home.asm b/engine/home.asm index c2b2650..362de0f 100755 --- a/engine/home.asm +++ b/engine/home.asm @@ -39,8 +39,8 @@ Start: ; 0150 (0:0150) ld sp, $fffe push af xor a - ld [$ff0f], a - ld [$ffff], a + ld [rIF], a + ld [rIE], a call ZeroRAM ld a, $1 call BankswitchHome @@ -49,10 +49,10 @@ Start: ; 0150 (0:0150) call BankswitchVRAM_0 call DisableLCD pop af - ld [$cab3], a + ld [DATA_INITIAL_A], a call Func_0349 ld a, $20 - ld [$cab6], a + ld [DATA_TILE_MAP_FILL], a call Func_03a1 call Func_030b call Func_036a @@ -80,20 +80,20 @@ VBlankHandler: ; 019b (0:019b) ld a, [$cac0] or a jr z, .asm_1b8 - call $ff83 + call DMA_FUNCTION xor a ld [$cac0], a .asm_1b8 - ld a, [$ff92] - ld [$ff43], a - ld a, [$ff93] - ld [$ff42], a - ld a, [$ff94] - ld [$ff4b], a - ld a, [$ff95] - ld [$ff4a], a - ld a, [$cabb] - ld [$ff40], a + ld a, [CURR_SCX] + ld [rSCX], a + ld a, [CURR_SCY] + ld [rSCY], a + ld a, [CURR_WX] + ld [rWX], a + ld a, [CURR_WY] + ld [rWY], a + ld a, [CURR_LCDC] + ld [rLCDC], a ei call $cad0 call Func_042d @@ -176,17 +176,17 @@ Func_0241: ; 0241 (0:0241) ld b, $bc call Func_025c jr c, .asm_250 - ld a, [$ff4d] + ld a, [rKEY1] and $80 jr z, .asm_250 ld b, $78 .asm_250 ld a, b - ld [$ff06], a - ld a, $3 - ld [$ff07], a + ld [rTMA], a + ld a, rTAC_16384_HZ + ld [rTAC], a ld a, $7 - ld [$ff07], a + ld [rTAC], a ret Func_025c: ; 025c (0:025c) @@ -213,55 +213,55 @@ Func_0264: ; 0264 (0:0264) ; turn LCD on EnableLCD: ; 0277 (0:0277) - ld a, [$cabb] ; + ld a, [CURR_LCDC] ; bit 7, a ; ret nz ; assert that LCD is off or $80 ; - ld [$cabb], a ; - ld [$ff40], a ; turn LCD on + ld [CURR_LCDC], a ; + ld [rLCDC], a ; turn LCD on ld a, $c0 ld [$cabf], a ret ; wait for vblank, then turn LCD off DisableLCD: ; 028a (0:028a) - ld a, [$ff40] ; + ld a, [rLCDC] ; bit 7, a ; ret z ; assert that LCD is on - ld a, [$ffff] ; - ld [$cab7], a ; save IE + ld a, [rIE] + ld [CURR_IE], a res 0, a ; - ld [$ffff], a ; disable vblank interrupt + ld [rIE], a ; disable vblank interrupt .asm_298 - ld a, [$ff44] ; + ld a, [rLY] ; cp $91 ; jr nz, .asm_298 ; wait for vblank - ld a, [$ff40] ; + ld a, [rLCDC] ; and $7f ; - ld [$ff40], a ; - ld a, [$cabb] ; + ld [rLCDC], a ; + ld a, [CURR_LCDC] ; and $7f ; - ld [$cabb], a ; turn LCD off + ld [CURR_LCDC], a ; turn LCD off xor a - ld [$ff47], a - ld [$ff48], a - ld [$ff49], a - ld a, [$cab7] ; - ld [$ffff], a ; restore IE + ld [rBGP], a + ld [rOBP0], a + ld [rOBP1], a + ld a, [CURR_IE] + ld [rIE], a ret ; set OBJ size: 8x8 (in [$CABB]) -Func_02b9: ; 02b9 (0:02b9) - ld a, [$cabb] +Set_OBJ_8x8: ; 02b9 (0:02b9) + ld a, [CURR_LCDC] and $fb - ld [$cabb], a + ld [CURR_LCDC], a ret ; set OBJ size: 8x16 (in [$CABB]) -Func_02c2: ; 02c2 (0:02c2) - ld a, [$cabb] +Set_OBJ_8x16: ; 02c2 (0:02c2) + ld a, [CURR_LCDC] or $4 - ld [$cabb], a + ld [CURR_LCDC], a ret ; 0x2cb @@ -269,16 +269,16 @@ INCBIN "baserom.gbc",$02cb,$02dd - $02cb ; enable timer interrupt EnableInt_Timer: ; 02dd (0:02dd) - ld a, [$ffff] + ld a, [rIE] or $4 - ld [$ffff], a + ld [rIE], a ret ; enable vblank interrupt EnableInt_VBlank: ; 02e4 (0:02e4) - ld a, [$ffff] + ld a, [rIE] or $1 - ld [$ffff], a + ld [rIE], a ret ; 0x2eb @@ -286,33 +286,33 @@ INCBIN "baserom.gbc",$02eb,$030b - $02eb Func_030b: ; 030b (0:030b) xor a - ld [$ff42], a - ld [$ff43], a - ld [$ff4a], a - ld [$ff4b], a + ld [rSCY], a + ld [rSCX], a + ld [rWY], a + ld [rWX], a ld [$cab0], a ld [$cab1], a ld [$cab2], a - ld [$ff92], a - ld [$ff93], a - ld [$ff94], a - ld [$ff95], a + ld [CURR_SCX], a + ld [CURR_SCY], a + ld [CURR_WX], a + ld [CURR_WY], a xor a ld [$caba], a ld a, $c3 ld [$cacd], a ld [$cad0], a ld hl, $cad1 - ld [hl], Func_0348 & $ff + ld [hl], NopF & $ff inc hl - ld [hl], Func_0348 >> $8 + ld [hl], NopF >> $8 ld a, $47 - ld [$cabb], a + ld [CURR_LCDC], a ld a, $1 ld [$6000], a ld a, $a ld [$0000], a -Func_0348: ; 0348 (0:0348) +NopF: ; 0348 (0:0348) ret Func_0349: ; 0349 (0:0349) @@ -330,7 +330,7 @@ Func_0349: ; 0349 (0:0349) cp $2 ret nz ld a, $1 - ld [$ff70], a + ld [rSVBK], a call Func_07e7 ret @@ -614,7 +614,7 @@ Func_04de: ; 04de (0:04de) jr nz, asm_522 call Func_0ea6 Func_051b: ; 051b (0:051b) - ld a, [$cab3] + ld a, [DATA_INITIAL_A] di jp Start asm_522 @@ -770,7 +770,7 @@ INCBIN "baserom.gbc",$0695,$06c3 - $0695 Func_06c3: ; 06c3 (0:06c3) push af - ld a, [$cabb] + ld a, [CURR_LCDC] rla jr c, .asm_6d8 pop af @@ -809,7 +809,7 @@ Func_0709: ; 0709 (0:0709) jp MemcpyHLDE_hblank CopyGfxData: ; 070c (0:070c) - ld a, [$cabb] + ld a, [CURR_LCDC] rla jr nc, .asm_726 .asm_712 |