summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xconstants.asm1
-rw-r--r--constants/hardware_constants.asm117
-rw-r--r--constants/misc_constants.asm32
-rwxr-xr-xengine/bank3.asm12
-rwxr-xr-xengine/home.asm126
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