summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xaudio/engine_0f.asm4
-rwxr-xr-xhome.asm6512
-rwxr-xr-xhome/serial.asm782
-rwxr-xr-xhome/sgb.asm277
-rwxr-xr-xhram.asm2
-rwxr-xr-xmain.asm7723
-rwxr-xr-xwram.asm14
7 files changed, 7643 insertions, 7671 deletions
diff --git a/audio/engine_0f.asm b/audio/engine_0f.asm
index 50dbd6e..573d540 100755
--- a/audio/engine_0f.asm
+++ b/audio/engine_0f.asm
@@ -5,7 +5,7 @@ Func_3c000: ; 0x3c000
push af
call Func_3cb1b
ld hl, wdd01
- ld de, $01af
+ ld de, wdeb0 - wdd01
.clearLoop
xor a
ld [hli], a
@@ -1687,7 +1687,7 @@ Func_3ca2b: ; 0x3ca2b
ld h, d
add hl, de
add hl, hl
- ld de, $4b20 ; todo
+ ld de, $4b20
add hl, de
ld e, [hl]
inc hl
diff --git a/home.asm b/home.asm
new file mode 100755
index 0000000..a91ac15
--- /dev/null
+++ b/home.asm
@@ -0,0 +1,6512 @@
+SECTION "rst 00", ROM0 [$00]
+ di
+ jp Entry
+
+SECTION "rst 10", ROM0 [$10]
+ jp DelayFrame
+
+SECTION "rst 18", ROM0 [$18]
+ jp JumpToFuncInTable
+
+SECTION "rst 20", ROM0 [$20]
+ jp Func_486
+
+SECTION "VBlankInt", ROM0 [$40]
+ jp VBlank
+
+SECTION "HBlankInt", ROM0 [$48]
+ jp LCD
+
+SECTION "TimerInt", ROM0 [$50]
+ jp Timer
+
+SECTION "SerialInt", ROM0 [$58]
+ jp Serial
+
+SECTION "JoypadInt", ROM0 [$60]
+ jp Joypad
+
+SECTION "Entry", ROM0 [$100]
+
+Entry: ; 0x100
+ nop
+ jp Start
+
+SECTION "Header", ROM0 [$104]
+
+ ; The header is generated by rgbfix.
+ ; The space here is allocated to prevent code from being overwritten.
+ ds $150 - $104
+
+SECTION "Main", ROM0 [$150]
+
+Start: ; 0x150
+ ld [hGameBoyColorFlag], a
+ ld sp, hGameBoyColorFlag
+ di
+ xor a
+ ld [rIF], a
+ ld a, [rLCDC] ; LCD Control
+ bit 7, a ; Check if LCD Display is enabled
+ jr nz, .LCDDisplayEnabled
+ set 7, a
+ ld [rLCDC], a
+.LCDDisplayEnabled
+ ld bc, $0002
+ call SGBWait1750
+.waitForVBlank
+ ld a, [rLY] ; LY register (LCDC Y-Coordinate)
+ cp 145 ; > 144 means V-Blank
+ jr c, .waitForVBlank
+ ld a, $81
+ ld [rLCDC], a ; Enable LCD Display
+ xor a
+ ld [rBGP], a ; Clear Palette Data
+ ld [rOBP0], a
+ ld [rOBP1], a
+ ld bc, $0002
+ call SGBWait1750
+.waitForVBlank2
+ ld a, [rLY] ; LY register (LCDC Y-Coordinate)
+ cp 145 ; > 144 means V-Blank
+ jr c, .waitForVBlank2
+ xor a
+ ld [rLCDC], a ; Disable LCD Display
+ ld hl, wc000
+ ld bc, $2000
+ call ClearData ; Clear WRAM Bank 0
+ ld hl, vTiles0
+ ld bc, $1000
+ call ClearData ; Clear First half of VRAM
+ ld a, SRAM_ENABLE
+ ld [MBC5SRamEnable], a ; Enable RAM
+ ld a, $1
+ ld [MBC5RomBank], a ; Load ROM Bank $1
+ ld a, $0
+ ld [MBC5RomBankOn], a ; Enable ROM Banking Mode
+ ld a, $0
+ ld [MBC5SRamBank], a ; Set bits 5 and 6 of ROM Bank Number
+ ld a, $1
+ ld [hLoadedROMBank], a
+ ld a, $1
+ ld [MBC5RomBankOn], a ; Enable RAM Banking Mode
+ ld a, $0
+ ld [MBC5SRamBank], a ; Load RAM Bank $0
+ ld sp, wdfff ; Initialize stack pointer to the end of WRAM Bank $1
+ ld hl, hPushOAM
+ ld bc, $007e
+ call ClearData ; Clear High RAM (HRAM)
+ call WriteDMACodeToHRAM
+ call ClearOAMBuffer
+ xor a
+ ld [wd7fb], a
+ ld [wd7fc], a
+ ld [wd7fd], a
+ ld [hHBlankRoutine], a
+ ld [$ffb1], a
+ ld [wd8e1], a
+ ld [wd7fe], a
+ ld [hSGBInit], a
+ ld hl, hLCDC
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld a, $8f
+ ld [hli], a
+ ld a, $a6
+ ld [hli], a
+ ld a, $0
+ ld [wd849], a
+ ld [wd84a], a
+ ld a, Bank(PlaySong_BankF)
+ call SetSongBank
+ call Func_23b
+ ld a, [hGameBoyColorFlag]
+ and a
+ jr nz, .asm_222
+ call InitSGB
+ rl a
+ and $1
+ ld [hSGBFlag], a
+ call SendSGBBorder
+ ld a, [hSGBFlag]
+ and a
+ jr z, .asm_222
+ ld a, $1
+ ld [wd917], a
+.asm_222
+ ld a, $1
+ ld [rIE], a ; Only enable LCD Status interrupt
+ ei
+ ld a, $ff
+ ld [wd810], a
+ call Func_97a
+ xor a
+ ld [wdaa3], a
+ ld a, BANK(Func_1ffc)
+ ld hl, Func_1ffc
+ call BankSwitchSimple
+Func_23b: ; 0x23b
+ ld a, [hGameBoyColorFlag]
+ cp $11
+ jr nz, .asm_248
+ ld a, $1
+ ld [hGameBoyColorFlag], a
+ ld [$fffd], a
+ ret
+
+.asm_248
+ xor a
+ ld [hGameBoyColorFlag], a
+ ld [$fffd], a
+ ret
+
+SoftReset:
+ di
+ ld sp, hGameBoyColorFlag
+ xor a
+ ld [rIF], a
+ ld bc, $2
+ call SGBWait1750
+ ld hl, wc000
+ ld bc, $2000
+ call ClearData
+ ld hl, $8000
+ ld bc, $1000
+ call ClearData
+ ld a, SRAM_ENABLE
+ ld [MBC5SRamEnable], a
+ ld a, $1
+ ld [MBC5RomBank], a
+ ld a, $0
+ ld [MBC5RomBankOn], a
+ ld a, $0
+ ld [MBC5SRamBank], a
+ ld a, $1
+ ld [hLoadedROMBank], a
+ ld a, $1
+ ld [MBC5RomBankOn], a
+ ld a, $0
+ ld [MBC5SRamBank], a
+ ld sp, wdfff
+ call WriteDMACodeToHRAM
+ call ClearOAMBuffer
+ xor a
+ ld [wd7fb], a
+ ld [wd7fc], a
+ ld [wd7fd], a
+ ld [hHBlankRoutine], a
+ ld [$ffb1], a
+ ld [wd8e1], a
+ ld [wd7fe], a
+ ld hl, hLCDC
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld a, $8f
+ ld [hli], a
+ ld a, $a6
+ ld [hli], a
+ ld a, $0
+ ld [wd849], a
+ ld [wd84a], a
+ ld a, $f
+ call SetSongBank
+ ld a, [hSGBFlag]
+ and a
+ jr z, .asm_02d5
+ ld a, $1
+ ld [wd917], a
+.asm_02d5
+ ld a, $1
+ ld [rIE], a
+ ei
+ ld a, $ff
+ ld [wd810], a
+ call Func_97a
+ ld a, [hGameBoyColorFlag]
+ ld [$fffd], a
+ xor a
+ ld [wdaa3], a
+ ld a, $0
+ ld hl, Func_1ffc
+ call BankSwitchSimple
+ ; fallthrough
+
+VBlank: ; 0x2f2
+ push af
+ push bc
+ push de
+ push hl
+ call hPushOAM ; OAM DMA transfer
+ ld a, [hLCDC]
+ ld [rLCDC], a
+ call Func_113a
+ ei
+ ld a, [rLY]
+ cp $90
+ jr c, .asm_328
+ ld hl, hSTAT
+ ld c, rSTAT - $ff00
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ inc c
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ inc c
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ ld a, [hli]
+ ld [$ff00+c], a
+.asm_328
+ ld a, [hLYC]
+ ld [hLastLYC], a
+ ld a, [hNextLYCSub]
+ ld [hLYCSub], a
+ ld a, [hNextFrameHBlankSCX]
+ ld [hHBlankSCX], a
+ ld a, [hNextFrameHBlankSCY]
+ ld [hHBlankSCY], a
+ call ReadJoypad
+ ld a, [wdaa3]
+ and a
+ jr nz, .asm_359
+ ld a, [hJoypadState]
+ cp $f
+ jr nz, .asm_359
+ ld a, [hNewlyPressedButtons]
+ and $f
+ jr z, .asm_359
+ ld hl, [sp+$8]
+ ld [hl], $c3
+ inc hl
+ ld [hl], $3
+ ld a, $1
+ ld [wdaa3], a
+.asm_359
+ ld hl, hNumFramesSinceLastVBlank
+ ld a, [hl]
+ inc [hl]
+ and a
+ jr nz, .asm_365
+ ld hl, hNumFramesDropped
+ inc [hl]
+.asm_365
+ ld hl, hVBlankCount
+ inc [hl]
+ ld a, [wd8e1]
+ and a
+ call nz, Func_167b
+ ld a, [wd849]
+ and a
+ jr nz, .asm_37d
+ ld a, [wd85d]
+ and a
+ call nz, Func_504
+.asm_37d
+ ld a, [wd84a]
+ and a
+ jr z, .asm_39d
+ xor a
+ ld [wd84a], a
+ ld a, $1
+ ld [wd849], a
+ ld a, $bc
+ ld [rTMA], a
+ ld a, $0
+ ld [rTAC], a
+ ld hl, rIE
+ set 2, [hl]
+ ld a, $4
+ ld [rTAC], a
+.asm_39d
+ ld hl, MBC5SRamBank
+ ld a, [wd917]
+ and a
+ jr nz, .asm_3b5
+ ld a, [wd803]
+ rrca
+ ld [wd803], a
+ and $1
+ jr z, .asm_3b5
+ set 3, [hl]
+ jr .asm_3b7
+
+.asm_3b5
+ res 3, [hl]
+.asm_3b7
+ ld a, [wd4aa]
+ and a
+ call nz, Func_e69
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+
+Func_3c3:
+ ld a, [rLCDC]
+ bit 7, a
+ jr z, .asm_03cf
+ call Func_cb5
+ call Func_576
+.asm_03cf
+ ld hl, hSTAT
+ res 6, [hl]
+ ld hl, rIE
+ res 1, [hl]
+ xor a
+ ld [MBC5SRamEnable], a
+ ld [rSB], a
+ ld [rSC], a
+ ld [rIE], a
+ ld [rNR52], a
+ ld a, [$fffd]
+ ld [hGameBoyColorFlag], a
+ jp SoftReset
+
+LCD: ; 0x3ec
+ push af
+ push bc
+ push de
+ push hl
+ ld a, [hHBlankRoutine]
+ sla a
+ ld c, a
+ ld b, $0
+ ld hl, PointerTable_408
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Func_3ff: ; 0x3ff
+ ld a, $1
+ ld [$ffb5], a
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+
+PointerTable_408: ; 0x408
+ dw Func_fbc
+ dw Func_fbf
+ dw Func_fea
+ dw Func_105d
+ dw Func_109e
+ dw Func_10a1
+ dw Func_10a4
+ dw Func_10a7
+
+Timer: ; 0x418
+ ei
+ push af
+ push bc
+ push de
+ push hl
+ ld a, [wd849]
+ and a
+ jr z, .asm_42a
+ ld a, [wd85d]
+ and a
+ call nz, Func_504
+.asm_42a
+ ld a, [wd84a]
+ and a
+ jr z, .asm_440
+ xor a
+ ld [wd84a], a
+ ld [wd849], a
+ ld a, $0
+ ld [rTAC], a
+ ld hl, rIE
+ res 2, [hl]
+.asm_440
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+
+Serial: ; 0x445
+ push af
+ push bc
+ push de
+ push hl
+ ld hl, Data_45d
+ push hl
+ ld a, [$ffb1]
+ sla a
+ ld c, a
+ ld b, $0
+ ld hl, Data_462
+ add hl, bc
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ push bc
+ ret
+
+Data_45d:
+ db $e1, $d1, $c1, $f1, $d9
+
+Data_462:
+ db $64, $16, $66, $04, $c9
+
+Joypad: ; 0x467
+ reti
+
+DelayFrame: ; 0x468
+ ld a, [rLCDC]
+ bit 7, a
+ ret z
+ ld hl, hNumFramesSinceLastVBlank
+ xor a
+ ld [hl], a
+.asm_472
+ ld a, [hl]
+ and a
+ jr z, .asm_472
+ ret
+
+JumpToFuncInTable: ; 0x477
+; Jumps to a function in the pointer table immediately following
+; a "rst JumpTable" call. Function must be in the same Bank as the pointer table.
+; input: a = index of function in table
+ sla a
+ pop hl
+ push de
+ ld e, a
+ ld d, $0
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld l, e
+ ld h, d
+ pop de
+ jp [hl]
+
+Func_486: ; 0x486
+ rlca
+ add l
+ ld l, a
+ jr nc, .noCarry
+ inc h
+.noCarry
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+PlaySong: ; 0x490
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wCurrentSongBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, e
+ ld [wd7bf], a
+ ld a, [wCurrentSongBank]
+ ld [wd7c0], a
+ call PlaySong_BankF ; this function is replicated in multiple banks.
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+PlaySoundEffect: ; 0x4af
+; input: de = sound effect id? I think d specifies something special and e holds the id
+ ld a, [wdead]
+ and a
+ ret nz
+ ld a, [wd800]
+ and a
+ jr z, .asm_4bd
+ ld a, d
+ and a
+ ret z
+.asm_4bd
+ ld a, d
+ ld [wd800], a
+ ld d, $0
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wCurrentSongBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ call PlaySoundEffect_BankF ; this function is replicated in multiple banks
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+Func_4d8: ; 0x4d8
+ push bc
+ push de
+ push hl
+ ld a, [wddcb]
+ ld hl, wddfd
+ or [hl]
+ ld hl, wde2f
+ or [hl]
+ and $1
+ call z, PlaySoundEffect
+ pop hl
+ pop de
+ pop bc
+ ret
+
+PlayCry: ; 0x4ef
+; Plays a Pokemon cry.
+; Input: e = mon id
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wCurrentSongBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ call PlayCry_BankF ; this function is replicated in multiple banks
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+Func_504: ; 0x504
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wCurrentSongBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ call $4180
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [wd801]
+ inc a
+ ld [wd801], a
+ and $3
+ ret nz
+ ld a, [wd800]
+ and a
+ ret z
+ dec a
+ ld [wd800], a
+ ret
+
+SetSongBank: ; 0x52c
+ di
+ ld [wCurrentSongBank], a
+ ei
+ ret
+
+CallInFollowingTable: ; 0x532
+; Calls a function in a table located immediately after a call to this function.
+; Inputs: a = entry in the table
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d ; multiplied a by 4 because entries in the table are 4 bytes each
+ pop hl
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld a, [hl]
+ ld h, d
+ ld l, e
+ jp BankSwitch
+
+BankSwitchSimple: ; 0x549
+; Switches to Bank in register a and jumps to hl.
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a ; Load Bank
+ jp [hl]
+
+BankSwitch: ; 0x54f
+ ld e, a
+ ld a, [hLoadedROMBank] ; currently-loaded Bank
+ cp e
+ jr z, .doJump
+ push af
+ ld a, e
+ call .loadNewBank
+ call .doJump
+ pop de
+ ld a, d
+.loadNewBank
+ push hl
+ push de
+ ld hl, rIE
+ ld d, [hl]
+ ld [hl], $0
+ ld [MBC5RomBank], a
+ ld [hLoadedROMBank], a
+ ld [hl], d
+ pop de
+ pop hl
+ ret
+
+.doJump
+ ld a, [hFarCallTempE]
+ ld e, a
+ ld a, [hFarCallTempA]
+ jp [hl]
+
+Func_576: ; 0x576
+ ld a, [rLCDC]
+ bit 7, a
+ ret z
+ ld a, [hLCDC]
+ res 7, a
+ ld [hLCDC], a
+.asm_581
+ ld a, [rLCDC]
+ bit 7, a
+ jr nz, .asm_581
+ ret
+
+Func_588: ; 0x588
+ ld a, [hFFC4]
+ and a
+ call nz, Func_597
+ ld a, [hLCDC]
+ set 7, a
+ ld [rLCDC], a
+ ld [hLCDC], a
+ ret
+
+Func_597: ; 0x597
+ ld de, rBGPI
+ ld a, $80
+ ld [de], a
+ inc de
+ ld b, $8
+.asm_5a0
+ ld a, [wd80c]
+ call Func_5c2
+ dec b
+ jr nz, .asm_5a0
+ ld de, rOBPI
+ ld a, $80
+ ld [de], a
+ inc de
+ ld b, $4
+.asm_5b2
+ ld a, [wd80d]
+ call Func_5c2
+ ld a, [wd80e]
+ call Func_5c2
+ dec b
+ jr nz, .asm_5b2
+ ret
+
+Func_5c2: ; 0x5c2
+ push bc
+ ld b, $4
+.asm_5c5
+ push af
+ push bc
+ and $3
+ sla a
+ ld c, a
+ ld b, $0
+ ld hl, Data_5e1
+ add hl, bc
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ pop bc
+ pop af
+ srl a
+ srl a
+ dec b
+ jr nz, .asm_5c5
+ pop bc
+ ret
+
+Data_5e1:
+ dr $5e1, $5e9
+
+Func_5e9:
+ ld a, [rIE]
+ res 0, a
+ ld [rIE], a
+ ret
+
+Func_5f0:
+ ld a, [rIE]
+ set 0, a
+ ld [rIE], a
+ ret
+
+WriteDMACodeToHRAM: ; 0x5f7
+; Initializes registers hPushOAM - hFarCallTempA
+ ld c, $80
+ ld b, $a ; number of bytes to load
+ ld hl, DMARoutine
+.loop
+ ld a, [hli]
+ ld [$ff00+c], a ; add register c to $ff00, and store register a into the resulting address
+ inc c
+ dec b
+ jr nz, .loop
+ ret
+
+DMARoutine:
+; This routine is initially loaded into hPushOAM - hFarCallTempA by WriteDMACodeToHRAM.
+ ld a, (wOAMBuffer >> 8)
+ ld [rDMA], a ; start DMA
+ ld a, $28
+.waitLoop ; wait for DMA to finish
+ dec a
+ jr nz, .waitLoop
+ ret
+
+WaitForLCD: ; 0x60f
+; Wait for LCD controller to stop reading from both OAM and VRAM because
+; CPU can't access OAM, VRAM, or palette data ($ff69, $ff6b) during this time.
+ ld a, [rSTAT] ; LCDC Status register
+ and $3
+ jr nz, WaitForLCD
+ ld a, $a
+.delay10Cycles
+ dec a
+ jr nz, .delay10Cycles
+ ret
+
+Func_61b: ; 0x61b
+ ld a, [rLY] ; LY register (LCDC Y-Coordinate)
+ cp $40
+ jr c, .asm_625
+ cp $80
+ jr c, .asm_63d
+.asm_625
+ ld a, [rLY] ; LY register (LCDC Y-Coordinate)
+ cp $40
+ jr c, .asm_625
+ cp $80
+ jr nc, .asm_625
+.asm_62f
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_62f ; wait for lcd controller to finish transferring data
+ ld a, $15
+.wait
+ dec a
+ jr nz, .wait
+ nop
+ nop
+ nop
+.asm_63d
+ ret
+
+Func_63e: ; 0xc3e
+ dec bc
+.asm_63f
+ ld [hli], a
+ dec bc
+ bit 7, b
+ jr z, .asm_63f
+ ret
+
+Func_646:
+ srl b
+ rr c
+.asm_064a
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_064a
+ ret
+
+ClearData: ; 0x654
+; Clears bc bytes starting at hl.
+; bc can be a maximum of $7fff, since it checks bit 7 of b when looping.
+ xor a
+ dec bc
+.clearLoop
+ ld [hli], a
+ dec bc
+ bit 7, b
+ jr z, .clearLoop
+ ret
+
+LocalCopyData: ; 0x65d
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, LocalCopyData
+ ret
+
+FarCopyData: ; 0x666 spooky
+; Copies data from any bank to either working RAM or video RAM
+; Input: hl = address of data to copy
+; a = bank of data to copy
+; de = destination for data
+; bc = number of bytes to copy
+ bit 7, h
+ jr nz, .copyFromSRAM
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ jr .copyData
+
+.copyFromSRAM
+ ld [MBC5SRamBank], a
+ and a
+.copyData
+ push af
+.copyLoop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, .copyLoop
+ pop af
+ ret nc
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+ReadByteFromBank: ; 0x68f
+; Input: a = bank
+; hl = address of byte to read
+; Output: a = byte at a:hl
+ push de
+ ld d, a
+ ld a, [hLoadedROMBank]
+ ld e, a
+ ld a, d
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld d, [hl]
+ ld a, e
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, d
+ pop de
+ ret
+
+LoadVideoData: ; 0x6a4
+; Input:
+; hl = address of pointer table
+; a = index of item to load in pointer table
+; This needs more documentation. It loads things like graphics and palettes.
+ sla a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+.loadItem
+ ld a, [hli]
+ ld c, a
+ and [hl]
+ cp $ff ; two consecutive $ff bytes terminate the array
+ ret z
+ ld a, [hli]
+ ld b, a ; bc contains pointer to data to be loaded
+ push hl
+ push bc
+ ld a, [hli] ; a contains bank of data to be loaded
+ ld e, [hl]
+ inc hl
+ ld d, [hl] ; de contains destination address for data
+ inc hl
+ ld c, [hl]
+ inc hl
+ ld b, [hl] ; bc contains last word of data struct
+ inc hl ; this is a wasted instruction
+ pop hl
+ call Func_6cb
+ pop hl
+ ld bc, $0005
+ add hl, bc
+ jr .loadItem
+
+Func_6cb: ; 0x6cb
+ srl b
+ rr c
+ jp c, Func_6fd ; if lowest bit of bc is set
+ jp Func_6d5 ; This jumps to the next instruction... Strange.
+
+Func_6d5: ; 0x6d5
+ ld [hROMBankBuffer], a ; save bank of data to be loaded
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer] ; a contains bank of data to be loaded
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a ; switch bank to the bank of data to be loaded
+ srl b
+ rr c
+ rl a
+ and $1 ; checks bit 1 of the last word in the data struct
+ ld [rVBK], a ; set VRAM Bank
+.copyByte
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b ; does bc = 0?
+ jr nz, .copyByte
+ xor a
+ ld [rVBK], a ; set VRAM Bank to Bank 0
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a ; reload the previous ROM Bank
+ ret
+
+Func_6fd: ; 0x6fd
+ ld [hROMBankBuffer], a ; save bank of data to be loaded
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer] ; a contains bank of data to be loaded
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a ; switch bank to the bank of data to be loaded
+ ld a, e
+ bit 6, a
+ jr nz, .asm_717
+ ld de, rBGPI
+ call Func_724
+ jr z, .asm_71d
+ xor a
+.asm_717
+ ld de, rOBPI
+ call Func_724
+.asm_71d
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+Func_724: ; 0x724
+ res 6, a
+ ld b, a
+ set 7, a
+ ld [de], a
+ inc de
+.copyByte
+ ld a, [hli]
+ ld [de], a
+ inc b
+ dec c
+ ret z
+ bit 6, b
+ jr z, .copyByte
+ ret
+
+LoadOrCopyVRAMData: ; 0x735
+ push hl
+ ld hl, rLCDC
+ bit 7, [hl]
+ pop hl
+ jp z, FarCopyData
+ ; fall through
+LoadVRAMData: ; 0x73f
+; This loads some data into VRAM. It waits for the LCD H-Blank to copy the data 4 bytes at a time.
+; input: hl = source of data
+; a = bank of data to load
+; de = destination of data
+; bc = number of bytes to copy
+ bit 7, h
+ jr nz, .asm_752
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ jr .asm_756
+
+.asm_752
+ ld [MBC5SRamBank], a
+ and a
+.asm_756
+ push af
+ call WaitForLCD
+.loop
+ call Func_61b
+.waitForHBlank
+ ld a, [rSTAT]
+ and $3
+ jr nz, .waitForHBlank
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ dec bc
+ dec bc
+ dec bc
+ dec bc
+ nop
+ nop
+ nop
+ nop
+ ld a, b
+ or c
+ jr nz, .loop
+ pop af
+ ret nc
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+FarCopyPalettes: ; 0x790
+ push hl
+ ld hl, rLCDC
+ bit 7, [hl]
+ pop hl
+ jp nz, Func_7dc
+ bit 7, h
+ jr nz, .asm_7ad
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ jr .asm_7b1
+
+.asm_7ad
+ ld [MBC5SRamBank], a
+ and a
+.asm_7b1
+ push af
+ ld a, e
+ bit 6, e
+ ld de, rBGPI
+ jr z, .asm_7bf
+ res 6, a
+ ld de, rOBPI
+.asm_7bf
+ set 7, a
+ ld [de], a
+ inc de
+.asm_7c3
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ dec bc
+ dec bc
+ dec bc
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_7c3
+ pop af
+ ret nc
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+Func_7dc: ; 0x7dc
+ bit 7, h
+ jr nz, .asm_7ef
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ jr .asm_7f3
+
+.asm_7ef
+ ld [MBC5SRamBank], a
+ and a
+.asm_7f3
+ push af
+ ld a, e
+ bit 6, e
+ ld de, rBGPI
+ jr z, .asm_801
+ res 6, a
+ ld de, rOBPI
+.asm_801
+ push hl
+ ld h, d
+ ld l, e
+ set 7, a
+ call PutTileInVRAM
+ inc de
+ pop hl
+ call WaitForLCD
+.asm_80e
+ call Func_61b
+.asm_811
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_811
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ dec bc
+ dec bc
+ dec bc
+ dec bc
+ nop
+ nop
+ nop
+ nop
+ ld a, b
+ or c
+ jr nz, .asm_80e
+ pop af
+ ret nc
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+PutTileInVRAM: ; 0x848
+; Puts a tile in VRAM.
+; input: a = tile number
+; hl = pointer to VRAM location where tile should be placed
+ push af
+ call WaitForLCD
+ call Func_61b
+.asm_84f
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_84f ; wait for lcd controller to finish transferring data
+ pop af
+ ld [hl], a ; Store tile number in VRAM background map
+ ret
+
+Func_858: ; 0x858
+ push af
+ call WaitForLCD
+ call Func_61b
+.asm_85f
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_85f
+ ld a, $1
+ ld [rVBK], a
+ pop af
+ ld [hl], a
+ xor a
+ ld [rVBK], a
+ ret
+
+Func_86f: ; 0x86f
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [rLCDC]
+ bit 7, a
+ jr nz, .asm_8ac
+ ld a, $1
+ ld [rVBK], a
+ ld b, $4
+.asm_887
+ push bc
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld bc, $001a
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_887
+ xor a
+ ld [rVBK], a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+.asm_8ac
+ ld b, $4
+.asm_8ae
+ push bc
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc hl
+ inc de
+ ld a, [de]
+ call Func_858
+ inc de
+ ld bc, $001b
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_8ae
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+Func_8e1: ; 0x8e1
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [rLCDC]
+ bit 7, a
+ jr nz, .asm_902
+ ld a, c
+ ld [hli], a
+.asm_8f5
+ ld a, [de]
+ ld [hl], a
+ inc de
+ dec b
+ jr nz, .asm_8f5
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+.asm_902
+ ld a, c
+ call PutTileInVRAM
+ inc hl
+.asm_907
+ ld a, [de]
+ call PutTileInVRAM
+ inc de
+ dec b
+ jr nz, .asm_907
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+ClearOAMBuffer: ; 0x916
+; Clears the OAM buffer by loading $f0 into all of the entries.
+ ld hl, wOAMBuffer ; 0xd000
+ ld b, 4 * 40 ; wOAMBuffer is 4 * 40 bytes long (40 OAM entries, 4 bytes each)
+ ld a, $f0 ; byte to write
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ xor a
+ ld [wOAMBufferSize], a
+ ret
+
+Func_926: ; 0x926
+ ld a, [wOAMBufferSize]
+ cp wOAMBufferEnd % $100
+ jr nc, .asm_93a
+ ld l, a
+ ld h, wOAMBufferEnd / $100
+ cpl
+ add (wOAMBufferEnd + 1) % $100
+ ld b, a
+ ld a, $f0
+.asm_936
+ ld [hli], a
+ dec b
+ jr nz, .asm_936
+.asm_93a
+ xor a
+ ld [wOAMBufferSize], a
+ ret
+
+AdvanceFrames: ; 0x93f
+ push bc
+ rst AdvanceFrame
+ pop bc
+ dec bc
+ ld a, c
+ or b
+ jr nz, AdvanceFrames
+ ret
+
+SGBWait1750: ; 0x948
+ ld de, 1750
+.asm_94b
+ nop
+ nop
+ nop
+ dec de
+ ld a, d
+ or e
+ jr nz, .asm_94b
+ dec bc
+ ld a, b
+ or c
+ jr nz, SGBWait1750
+ ret
+
+GenRandom: ; 0x959
+ push bc
+ push de
+ push hl
+ ld a, [wd811]
+ ld c, a
+ ld b, $0
+ inc a
+ cp $37
+ jr nz, .asm_96e
+ call Func_9fa
+ xor a
+ ld bc, $0000
+.asm_96e
+ ld [wd811], a
+ ld hl, wd812
+ add hl, bc
+ ld a, [hl]
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Func_97a: ; 0x97a
+ ld a, [wd810]
+ ld d, a
+ ld a, $0
+ ld a, [$afff]
+.asm_983
+ cp d
+ jr c, .asm_989
+ sub d
+ jr .asm_983
+
+.asm_989
+ ld [wd80f], a
+ ld [wd848], a
+ ld e, $1
+ ld hl, Data_9c4
+ ld a, $36
+.asm_996
+ push af
+ ld c, [hl]
+ inc hl
+ ld b, $0
+ push hl
+ ld hl, wd812
+ add hl, bc
+ ld [hl], e
+ ld a, [wd80f]
+ sub e
+ jr nc, .asm_9a8
+ add d
+.asm_9a8
+ ld e, a
+ ld a, [hl]
+ ld [wd80f], a
+ pop hl
+ pop af
+ dec a
+ jr nz, .asm_996
+ call Func_9fa
+ call Func_9fa
+ call Func_9fa
+ ld a, $0
+ call GenRandom
+ ld [$afff], a
+ ret
+
+Data_9c4:
+ db $14, $29, $07, $1c, $31, $0f, $24, $02, $17
+ db $2c, $0a, $1f, $34, $12, $27, $05, $1a, $2f
+ db $0d, $22, $00, $15, $2a, $08, $1d, $32, $10
+ db $25, $03, $18, $2d, $0b, $20, $35, $13, $28
+ db $06, $1b, $30, $0e, $23, $01, $16, $2b, $09
+ db $1e, $33, $11, $26, $04, $19, $2e, $0c, $21
+
+Func_9fa: ; 0x9fa
+ ld a, [wd810]
+ ld d, a
+ ld bc, wd812
+ ld hl, wd831
+ ld e, $18
+.asm_a06
+ ld a, [bc]
+ sub [hl]
+ jr nc, .asm_a0b
+ add d
+.asm_a0b
+ ld [bc], a
+ dec e
+ jr nz, .asm_a06
+ ld bc, wd82a
+ ld hl, wd812
+ ld e, $1f
+.asm_a17
+ ld a, [bc]
+ sub [hl]
+ jr nc, .asm_a1c
+ add d
+.asm_a1c
+ ld [bc], a
+ dec e
+ jr nz, .asm_a17
+ ret
+
+Func_a21: ; 0xa21
+ push bc
+ push hl
+ ld c, a
+ ld b, $0
+ ld hl, Data_a38
+ add hl, bc
+ ld l, [hl]
+ call GenRandom
+ call Func_dd4
+ inc h
+ srl h
+ ld a, h
+ pop hl
+ pop bc
+ ret
+
+Data_a38:
+x = 0
+REPT 128
+ db x
+x = x + 2
+IF x == $80
+x = x + 1
+ENDC
+ENDR
+
+ReadJoypad: ; 0xab8
+; Reads the current state of the joypad and saves the state into
+; some registers the game uses during gameplay. It remembers the joypad state
+; from the current frame, previous frame, and two frames ago.
+ ld a, $20
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ and $f
+ swap a
+ ld b, a
+ ld a, $30
+ ld [rJOYP], a
+ ld a, $10
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ and $f
+ or b
+ cpl ; a contains currently-pressed buttons
+ ld [hJoypadState], a
+ ld a, $30
+ ld [rJOYP], a
+ ld a, [hJoypadState]
+ ld hl, hPreviousJoypadState
+ xor [hl] ; a contains buttons that are different from previous frame
+ push af
+ ld hl, hJoypadState
+ and [hl] ; a contains newly-pressed buttons compared to last frame
+ ld [hNewlyPressedButtons], a
+ ld [hPressedButtons], a
+ pop af
+ ld hl, hPreviousJoypadState
+ and [hl] ; a contains newly-pressed buttons compared to two frames ago
+ ld [hPrevPreviousJoypadState], a
+ ld a, [hJoypadState]
+ and a
+ jr z, .asm_b15
+ ld hl, hPreviousJoypadState
+ cp [hl]
+ jr nz, .asm_b15
+ ; button(s) is pressed, and they're identical to the buttons pressed last frame.
+ ; this code is related to holding down a button for an extended period of time.
+ ld hl, hJoyRepeatDelay
+ dec [hl]
+ jr nz, .asm_b1a
+ ld a, [hJoypadState]
+ ld [hPressedButtons], a
+ ld a, [wd807]
+ ld [hJoyRepeatDelay], a
+ jr .asm_b1a
+
+.asm_b15
+ ld a, [wd806]
+ ld [hJoyRepeatDelay], a
+.asm_b1a
+ ld a, [hJoypadState]
+ ld [hPreviousJoypadState], a
+ ld hl, wd808
+ ld a, [hJoypadState]
+ or [hl]
+ ld [hli], a
+ ld a, [hNewlyPressedButtons]
+ or [hl]
+ ld [hli], a
+ ld a, [hPressedButtons]
+ or [hl]
+ ld [hli], a
+ ret
+
+Func_b2e: ; 0xb2e
+ ld hl, wd808
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ret
+
+IsKeyPressed2: ; 0xb36
+ ld a, [hJoypadState]
+ and [hl]
+ jr z, .asm_b3e
+ cp [hl]
+ jr z, .asm_b48
+.asm_b3e
+ inc hl
+ ld a, [hJoypadState]
+ and [hl]
+ ret z
+ cp [hl]
+ jr z, .asm_b48
+ xor a
+ ret
+
+.asm_b48
+ ld a, $1
+ and a
+ ret
+
+IsKeyPressed: ; 0xb4c
+; Checks if a key for the specified key config is pressed.
+; input: hl = pointer to key config byte pair (e.g. wKeyConfigLeftFlipper)
+; output: zero flag is set if a corresponding key is pressed
+; zero flag is reset if no corresponding key is pressed
+ ld a, [hJoypadState]
+ and [hl]
+ jr z, .asm_b58
+ cp [hl]
+ jr nz, .asm_b58
+ ld a, [hNewlyPressedButtons]
+ and [hl]
+ ret nz
+.asm_b58
+ inc hl
+ ld a, [hJoypadState]
+ and [hl]
+ ret z
+ cp [hl]
+ jr nz, .asm_b64
+ ld a, [hNewlyPressedButtons]
+ and [hl]
+ ret
+
+.asm_b64
+ xor a
+ ret
+
+Func_b66: ; 0xb66
+ ld a, [hGameBoyColorFlag]
+ and a
+ jr nz, .asm_b73
+ xor a
+ ld [hBGP], a
+ ld [hOBP0], a
+ ld [hOBP1], a
+ ret
+
+.asm_b73
+ ld de, rBGPI
+ ld hl, wPaletteData
+ ld b, $0
+ ld c, $20
+.asm_b7d
+ ld a, b
+ ld [rBGPI], a
+ inc b
+ ld a, [rBGPD]
+ ld [hli], a
+ ld a, b
+ ld [rBGPI], a
+ inc b
+ ld a, [rBGPD]
+ ld [hli], a
+ dec c
+ jr nz, .asm_b7d
+ ld b, $0
+ ld c, $20
+.asm_b92
+ ld a, b
+ ld [rOBPI], a
+ inc b
+ ld a, [rOBPD]
+ ld [hli], a
+ ld a, b
+ ld [rOBPI], a
+ inc b
+ ld a, [rOBPD]
+ ld [hli], a
+ dec c
+ jr nz, .asm_b92
+ ld de, rBGPI
+ ld b, $2
+.asm_ba8
+ ld a, $80
+ ld [de], a
+ inc de
+ ld c, $20
+.asm_bae
+ ld a, $ff
+ ld [de], a
+ ld [hli], a
+ ld a, $7f
+ ld [de], a
+ ld [hli], a
+ dec c
+ jr nz, .asm_bae
+ inc de
+ dec b
+ jr nz, .asm_ba8
+ ret
+
+Func_bbe: ; 0xbbe
+ ld a, [hGameBoyColorFlag]
+ and a
+ jp nz, Func_c19
+ ld hl, hBGP
+ ld de, wd80c
+ ld b, $3
+.asm_bcc
+ ld a, [de]
+ and $55
+ ld c, a
+ ld a, [de]
+ and $aa
+ srl a
+ and c
+ ld [hli], a
+ inc de
+ dec b
+ jr nz, .asm_bcc
+ ld bc, $0002
+ call AdvanceFrames
+ ld hl, hBGP
+ ld de, wd80c
+ ld b, $3
+.asm_be9
+ ld a, [de]
+ and $aa
+ srl a
+ add [hl]
+ ld [hli], a
+ inc de
+ dec b
+ jr nz, .asm_be9
+ ld bc, $0002
+ call AdvanceFrames
+ ld hl, hBGP
+ ld de, wd80c
+ ld b, $3
+.asm_c02
+ ld a, [de]
+ and $55
+ ld c, a
+ ld a, [de]
+ and $aa
+ srl a
+ or c
+ add [hl]
+ ld [hli], a
+ inc de
+ dec b
+ jr nz, .asm_c02
+ ld bc, $0002
+ call AdvanceFrames
+ ret
+
+Func_c19: ; 0xc19
+ ld b, $10
+.asm_c1b
+ push bc
+ ld de, wPaletteData
+ ld hl, wd280
+ call Func_c2d
+ call Func_d61
+ pop bc
+ dec b
+ jr nz, .asm_c1b
+ ret
+
+Func_c2d: ; 0xc2d
+ ld a, b
+ cp $1
+ jr z, .asm_c49
+ ld c, $40
+.asm_c34
+ push bc
+ ld a, [hli]
+ sub $42
+ ld c, a
+ ld a, [hld]
+ sbc $8
+ ld b, a
+ call Func_c60
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hli], a
+ pop bc
+ dec c
+ jr nz, .asm_c34
+ ret
+
+.asm_c49
+ ld c, $40
+.asm_c4b
+ push bc
+ ld a, [hli]
+ sub $21
+ ld c, a
+ ld a, [hld]
+ sbc $4
+ ld b, a
+ call Func_c60
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hli], a
+ pop bc
+ dec c
+ jr nz, .asm_c4b
+ ret
+
+Func_c60: ; 0xc60
+ push hl
+ ld a, [de]
+ and $1f
+ ld l, a
+ ld a, c
+ and $1f
+ cp l
+ jr nc, .asm_c70
+ ld a, c
+ and $e0
+ or l
+ ld c, a
+.asm_c70
+ ld a, [de]
+ and $e0
+ ld l, a
+ inc de
+ ld a, [de]
+ srl a
+ rr l
+ srl a
+ rr l
+ ld a, c
+ and $e0
+ ld h, a
+ ld a, b
+ srl a
+ rr h
+ srl a
+ rr h
+ ld a, h
+ cp l
+ jr nc, .asm_ca3
+ ld h, $0
+ sla l
+ rl h
+ sla l
+ rl h
+ ld a, c
+ and $1f
+ or l
+ ld c, a
+ ld a, b
+ and $7c
+ or h
+ ld b, a
+.asm_ca3
+ ld a, [de]
+ and $7c
+ ld l, a
+ ld a, b
+ and $7c
+ cp l
+ jr nc, .asm_cb2
+ ld a, b
+ and $3
+ or l
+ ld b, a
+.asm_cb2
+ inc de
+ pop hl
+ ret
+
+Func_cb5: ; 0xcb5
+ ld a, [hGameBoyColorFlag]
+ and a
+ jp nz, Func_cee
+ ld hl, hBGP
+ ld b, $3
+.asm_cc0
+ push bc
+ push hl
+ ld b, $3
+.asm_cc4
+ ld a, [hl]
+ and $55
+ ld c, a
+ ld a, [hl]
+ and $aa
+ srl a
+ or c
+ cpl
+ inc a
+ add [hl]
+ ld [hli], a
+ dec b
+ jr nz, .asm_cc4
+ ld bc, $0002
+ call AdvanceFrames
+ pop hl
+ pop bc
+ dec b
+ jr nz, .asm_cc0
+ xor a
+ ld hl, hBGP
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld bc, $0002
+ call AdvanceFrames
+ ret
+
+Func_cee: ; 0xcee
+ ld hl, wd280
+ ld de, rBGPI
+ call Func_d9d
+ ld hl, wd2c0
+ ld de, rOBPI
+ call Func_d9d
+ ld b, $10
+.asm_d02
+ push bc
+ ld hl, wd280
+ call Func_d11
+ call Func_d61
+ pop bc
+ dec b
+ jr nz, .asm_d02
+ ret
+
+Func_d11: ; 0xd11
+ ld b, $40
+.asm_d13
+ ld a, [hl]
+ and $1f
+ add $2
+ ld e, a
+ cp $1f
+ jr c, .asm_d1f
+ ld e, $1f
+.asm_d1f
+ ld a, [hl]
+ and $e0
+ or e
+ ld [hl], a
+ ld a, [hli]
+ and $e0
+ ld e, [hl]
+ dec hl
+ srl e
+ rr a
+ srl e
+ rr a
+ add $10
+ ld e, a
+ jr nc, .asm_d38
+ ld e, $f8
+.asm_d38
+ ld d, $0
+ sla e
+ rl d
+ sla e
+ rl d
+ ld a, [hl]
+ and $1f
+ or e
+ ld [hli], a
+ ld a, [hl]
+ and $7c
+ or d
+ ld [hl], a
+ ld a, [hl]
+ and $7c
+ add $8
+ ld e, a
+ cp $7c
+ jr c, .asm_d58
+ ld e, $7c
+.asm_d58
+ ld a, [hl]
+ and $3
+ or e
+ ld [hli], a
+ dec b
+ jr nz, .asm_d13
+ ret
+
+Func_d61: ; 0d61
+ ld a, [rIE]
+ res 0, a
+ ld [rIE], a
+ ld hl, wd280
+ ld de, rBGPI
+ ld a, $80
+ ld [de], a
+ inc de
+.asm_d71
+ ld a, [rLY]
+ cp $90
+ jr c, .asm_d71
+ ld b, $10
+.asm_d79
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ dec b
+ jr nz, .asm_d79
+ inc de
+ ld a, $80
+ ld [de], a
+ inc de
+ ld b, $10
+.asm_d8b
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ dec b
+ jr nz, .asm_d8b
+ ld a, [rIE]
+ set 0, a
+ ld [rIE], a
+ ret
+
+Func_d9d: ; 0xd9d
+ ld b, $0
+ ld c, e
+ inc c
+ call WaitForLCD
+.asm_da4
+ call Func_61b
+.asm_da7
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_da7 ; wait for lcd controller to finish transferring data
+ ld a, b
+ ld [de], a
+ ld a, [$ff00+c]
+ ld [hli], a
+ inc b
+ ld a, b
+ ld [de], a
+ ld a, [$ff00+c]
+ ld [hli], a
+ inc b
+ ld a, b
+ ld [de], a
+ ld a, [$ff00+c]
+ ld [hli], a
+ inc b
+ ld a, b
+ ld [de], a
+ ld a, [$ff00+c]
+ ld [hli], a
+ inc b
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ nop
+ ld a, b
+ cp $40
+ jr nz, .asm_da4
+ ret
+
+Func_dd4: ; 0xdd4
+; Return a * l to hl
+; Stupid waste of space
+ push bc
+ ld c, l
+ ld b, $0
+ ld hl, $0000
+ bit 0, a
+ jr z, .asm_de0
+ add hl, bc
+.asm_de0
+ sla c
+ rl b
+ bit 1, a
+ jr z, .asm_de9
+ add hl, bc
+.asm_de9
+ sla c
+ rl b
+ bit 2, a
+ jr z, .asm_df2
+ add hl, bc
+.asm_df2
+ sla c
+ rl b
+ bit 3, a
+ jr z, .asm_dfb
+ add hl, bc
+.asm_dfb
+ sla c
+ rl b
+ bit 4, a
+ jr z, .asm_e04
+ add hl, bc
+.asm_e04
+ sla c
+ rl b
+ bit 5, a
+ jr z, .asm_e0d
+ add hl, bc
+.asm_e0d
+ sla c
+ rl b
+ bit 6, a
+ jr z, .asm_e16
+ add hl, bc
+.asm_e16
+ sla c
+ rl b
+ bit 7, a
+ jr z, .asm_e1f
+ add hl, bc
+.asm_e1f
+ pop bc
+ ret
+
+ConvertHexByteToDecWord: ; 0xe21
+; Convert the base-16 value in register a into a Binary Coded Decimal (base-10) word.
+; Example: If a = $97, de = $0151.
+ ld b, a
+ ld hl, PowersOfTwo
+ ld de, $0000
+.asm_e28
+ srl b
+ ld a, [hli]
+ jr nc, .asm_e34
+ add e
+ daa
+ ld e, a
+ ld a, [hl]
+ adc d
+ daa
+ ld d, a
+.asm_e34
+ inc hl
+ ld a, b
+ and a
+ jr nz, .asm_e28
+ ret
+
+PowersOfTwo: ; 0xe3a
+ dw $0001
+ dw $0002
+ dw $0004
+ dw $0008
+ dw $0016
+ dw $0032
+ dw $0064
+ dw $0128
+
+Func_e4a: ; 0xe4a
+ ld a, [hl]
+ cp $64
+ jr z, .asm_e53
+ inc a
+ ld [hl], a
+ scf
+ ret
+
+.asm_e53
+ and a
+ ret
+
+Func_e55: ; 0xe55
+ cp c
+ jr c, .asm_e5b
+ sub c
+ jr Func_e55
+
+.asm_e5b
+ and a
+ ret
+
+Func_e5d: ; 0xe5d
+ ld a, $1
+ ld [wd84a], a
+.asm_e62
+ ld a, [wd84a]
+ and a
+ jr nz, .asm_e62
+ ret
+
+Func_e69: ; 0xe69
+ ld a, [rLY]
+ cp $90
+ jr nc, Func_e69
+.asm_e6f
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_e6f
+ ld a, $a
+.asm_e77
+ dec a
+ jr nz, .asm_e77
+ ld hl, wcBottomMessageText + $140
+ call Func_eef
+ push hl
+ ld hl, $9c00
+ call Func_ef8
+ pop hl
+ call Func_eef
+ push hl
+ ld hl, $9c04
+ call Func_ef8
+ pop hl
+ call Func_eef
+ push hl
+ ld hl, $9c08
+ call Func_ef8
+ pop hl
+ call Func_eef
+ push hl
+ ld hl, $9c0c
+ call Func_ef8
+ pop hl
+ call Func_eef
+ push hl
+ ld hl, $9c10
+ call Func_ef8
+ pop hl
+ ld hl, wcBottomMessageText + $1c0
+ call Func_eef
+ push hl
+ ld hl, $9c20
+ call Func_ef8
+ pop hl
+ call Func_eef
+ push hl
+ ld hl, $9c24
+ call Func_ef8
+ pop hl
+ call Func_eef
+ push hl
+ ld hl, $9c28
+ call Func_ef8
+ pop hl
+ call Func_eef
+ push hl
+ ld hl, $9c2c
+ call Func_ef8
+ pop hl
+ call Func_eef
+ push hl
+ ld hl, $9c30
+ call Func_ef8
+ pop hl
+ ret
+
+Func_eef: ; 0xeef
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld e, a
+ ret
+
+Func_ef8: ; 0xef8
+ ld a, [rSTAT]
+ and $3
+ jr nz, Func_ef8
+ ld a, b
+ ld [hli], a
+ ld a, c
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ ld a, e
+ ld [hli], a
+ ld a, $a
+.asm_f08
+ dec a
+ jr nz, .asm_f08
+ ret
+
+Func_f0c: ; 0xf0c
+ call Func_f34
+ ret nc
+.asm_f10
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_f10
+ scf
+ ret
+
+SaveData: ; 0xf1a
+; Input: hl = data to save
+; bc = number of bytes to save
+; de = destination for saved data
+ push bc
+ push de
+ push hl
+.asm_f1d
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_f1d
+ pop hl
+ pop de
+ pop bc
+ ld h, d
+ ld l, e
+ call Func_f74
+ call Func_fa1
+ call Func_f4c
+ ret
+
+Func_f34: ; 0xf34
+ call Func_f62
+ jr nc, .asm_f3f
+ call Func_f7e
+ jr nc, .asm_f3f
+ ret
+
+.asm_f3f
+ add hl, bc
+ inc hl
+ inc hl
+ inc hl
+ inc hl
+ call Func_f62
+ ret nc
+ call Func_f7e
+ ret
+
+Func_f4c: ; 0xf4c
+ push bc
+ push hl
+ push de
+ inc bc
+ inc bc
+ inc bc
+ inc bc
+ ld d, h
+ ld e, l
+ add hl, bc
+.asm_f56
+ ld a, [de]
+ ld [hli], a
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_f56
+ pop de
+ pop hl
+ pop bc
+ ret
+
+Func_f62: ; 0xf62
+ push hl
+ add hl, bc
+ ld a, [hli]
+ cp $4e
+ jr nz, .asm_f71
+ ld a, [hl]
+ cp $54
+ jr nz, .asm_f71
+ scf
+ jr .asm_f72
+
+.asm_f71
+ and a
+.asm_f72
+ pop hl
+ ret
+
+Func_f74: ; 0xf74
+ push hl
+ add hl, bc
+ ld a, $4e
+ ld [hli], a
+ ld a, $54
+ ld [hl], a
+ pop hl
+ ret
+
+Func_f7e: ; 0xf7e
+ push bc
+ push de
+ push hl
+ inc bc
+ inc bc
+ ld de, $0000
+.asm_f86
+ ld a, [hli]
+ add e
+ ld e, a
+ jr nc, .asm_f8c
+ inc d
+.asm_f8c
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_f86
+ ld a, [hli]
+ cp e
+ jr nz, .asm_f9c
+ ld a, [hl]
+ cp d
+ jr nz, .asm_f9c
+ scf
+ jr .asm_f9d
+
+.asm_f9c
+ and a
+.asm_f9d
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Func_fa1: ; 0xfa1
+ push bc
+ push de
+ push hl
+ inc bc
+ inc bc
+ ld de, $0000
+.asm_fa9
+ ld a, [hli]
+ add e
+ ld e, a
+ jr nc, .asm_faf
+ inc d
+.asm_faf
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_fa9
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hl], a
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Func_fbc: ; 0xfbc
+ jp Func_3ff
+
+Func_fbf: ; 0xfbf
+ ld hl, hLastLYC
+ ld c, [hl]
+ ld a, [rLY]
+ cp c
+ jp c, Func_3ff
+ inc c
+ inc c
+ cp c
+ jp nc, Func_3ff
+ ld a, [hLCDCMask]
+ ld c, a
+ ld a, [hLCDC]
+ xor $10
+ and c
+ ld c, a
+ ld hl, rSTAT
+.asm_fdb
+ ld a, [hl]
+ and $3
+ jr nz, .asm_fdb
+ ld a, [rLCDC]
+ and $80
+ or c
+ ld [rLCDC], a
+ jp Func_3ff
+
+Func_fea: ; 0xfea
+ ld hl, hLastLYC
+ ld a, [hLYCSub]
+ cp [hl]
+ jr nz, .asm_1015
+ ld a, [rLY]
+ cp [hl]
+ jp nz, Func_3ff
+ ld a, [hLCDC]
+ xor $18
+ ld c, a
+ ld a, [hHBlankSCX]
+ ld b, a
+ ld hl, rSTAT
+.asm_1003
+ ld a, [hl]
+ and $3
+ jr nz, .asm_1003
+ ld a, [rLCDC]
+ and $80
+ or c
+ ld [rLCDC], a
+ ld a, b
+ ld [rSCY], a
+ jp Func_3ff
+
+.asm_1015
+ ld a, [rLY]
+ cp [hl]
+ jr nz, .asm_1037
+ ld a, [hLastLYC]
+ ld hl, hLYCSub
+ sub [hl]
+ add $40
+ ld c, a
+ ld a, [hLYCSub]
+ ld b, a
+ ld hl, rSTAT
+.asm_1029
+ ld a, [hl]
+ and $3
+ jr nz, .asm_1029
+ ld a, c
+ ld [rSCY], a
+ ld a, b
+ ld [rLYC], a
+ jp Func_3ff
+
+.asm_1037
+ ld hl, hLYCSub
+ ld a, [rLY]
+ cp [hl]
+ jp nz, Func_3ff
+ ld a, [hLCDC]
+ xor $18
+ ld c, a
+ ld a, [hHBlankSCX]
+ ld b, a
+ ld hl, rSTAT
+.asm_104b
+ ld a, [hl]
+ and $3
+ jr nz, .asm_104b
+ ld a, [rLCDC]
+ and $80
+ or c
+ ld [rLCDC], a
+ ld a, b
+ ld [rSCY], a
+ jp Func_3ff
+
+Func_105d: ; 0x105d
+ ld hl, hLastLYC
+ ld a, [rLY]
+ cp [hl]
+ jr z, .asm_1069
+ dec a
+ cp [hl]
+ jr nz, .asm_1080
+.asm_1069
+ ld a, [hLYCSub]
+ ld c, a
+ ld a, [hHBlankSCX]
+ ld b, a
+ ld hl, rSTAT
+.asm_1072
+ ld a, [hl]
+ and $3
+ jr nz, .asm_1072
+ ld a, b
+ ld [rSCY], a
+ ld a, c
+ ld [rLYC], a
+ jp Func_3ff
+
+.asm_1080
+ ld hl, hLYCSub
+ ld a, [rLY]
+ cp [hl]
+ jr z, .asm_108d
+ dec a
+ cp [hl]
+ jp nz, Func_3ff
+.asm_108d
+ ld a, [hHBlankSCY]
+ ld b, a
+ ld hl, rSTAT
+.asm_1093
+ ld a, [hl]
+ and $3
+ jr nz, .asm_1093
+ ld a, b
+ ld [rSCY], a
+ jp Func_3ff
+
+Func_109e: ; 0x109e
+ jp Func_3ff
+
+Func_10a1: ; 0x10a1
+ jp Func_3ff
+
+Func_10a4: ; 0x10a4
+ jp Func_3ff
+
+Func_10a7: ; 0x10a7
+ jp Func_3ff
+
+Func_10aa: ; 0x10aa
+ ld c, a
+ ld a, [hli]
+ ld b, a
+.asm_10ad
+ push bc
+ ld a, c
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ inc hl
+ push af
+ ld a, [bc]
+ ld e, a
+ inc bc
+ ld a, [bc]
+ ld d, a
+ inc bc
+ pop af
+ push hl
+ call Func_10c5
+ pop hl
+ pop bc
+ dec b
+ jr nz, .asm_10ad
+ ret
+
+Func_10c5: ; 0x10c5
+ push af
+ ld a, [rLCDC]
+ bit 7, a
+ jr z, .asm_10d2
+.asm_10cc
+ ld a, [rLY]
+ cp $88
+ jr nc, .asm_10cc
+.asm_10d2
+ pop af
+ ld hl, wd7fb
+ ld l, [hl]
+ ld h, wcb00 / $100
+ inc bc
+ ld [hl], c
+ inc h
+ ld [hl], b
+ inc h
+ ld [hl], a
+ inc h
+ ld [hl], e
+ inc h
+ ld [hl], d
+ ld e, $ff
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ dec bc
+ ld a, [bc]
+ ld hl, wd7fa
+ add [hl]
+ cp $30
+ jr c, .asm_10fe
+ ld a, [bc]
+ ld e, $0
+.asm_10fe
+ add $4
+ ld [hl], a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, wd7fb
+ ld l, [hl]
+ ld h, wca00 / $100
+ inc l
+ ld [hl], $0
+ dec l
+ ld [hl], e
+ ld hl, wd7fb
+ inc [hl]
+ ld a, [rLCDC]
+ bit 7, a
+ ret nz
+ ld a, [rIE]
+ push af
+ res 0, a
+ ld [rIE], a
+ call Func_113a
+ pop af
+ ld [rIE], a
+ ret
+
+Func_1129: ; 0x1129
+ ld a, [wd7fb]
+ ld [wd7fc], a
+ ret
+
+Func_1130: ; 0x1130
+ push hl
+ ld a, [wd7fb]
+ ld hl, wd7fc
+ cp [hl]
+ pop hl
+ ret
+
+Func_113a: ; 0x113a
+ ld hl, wd7fc
+ ld a, [wd7fb]
+ cp [hl]
+ ret z
+ ld l, [hl]
+ ld h, $ca
+ ld [hl], $ff
+.loop
+ ld a, [hl]
+ and a
+ jr z, .done
+ push hl
+ inc h
+ ld e, [hl]
+ inc h
+ ld d, [hl]
+ inc h
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hl]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ inc h
+ ld a, [hl]
+ inc h
+ ld h, [hl]
+ ld l, a
+ call Func_117a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ pop hl
+ inc l
+ jr .loop
+
+.done
+ ld a, l
+ ld [wd7fc], a
+ ld hl, wd7fb
+ cp [hl]
+ ret nz
+ xor a
+ ld [wd7fa], a
+ ret
+
+Func_117a: ; 0x117a
+ jp [hl]
+
+LoadTileLists: ; 0x117b
+; Loads a series of defined tile ids into VRAM
+; input: de = pointer to data structure
+; data structure: list of VRAM tile data with the following format
+; [num tiles][destination pointer][list of tile ids]
+ ld h, d
+ ld l, e
+.loadTileSequence
+ ld a, [hli]
+ and a
+ ret z
+ ld b, a
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a ; de = destination for tile data
+.loadTileData
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .loadTileData
+ jr .loadTileSequence
+
+LoadTileListsBank1: ; 0x118d
+ ld a, $1
+ ld [rVBK], a
+ call LoadTileLists
+ xor a
+ ld [rVBK], a
+ ret
+
+Func_1198:
+ ld h, d
+ ld l, e
+.asm_119a
+ ld a, [hli]
+ and a
+ ret z
+ ld b, a
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ srl b
+ jr nc, .asm_11a8
+ ld a, [hli]
+ ld c, a
+.asm_11a8
+ push hl
+ ld h, d
+ ld l, e
+ ld a, c
+.asm_11ac
+ ld [hli], a
+ inc a
+ dec b
+ jr nz, .asm_11ac
+ ld c, a
+ pop hl
+ jr .asm_119a
+
+Func_11b5: ; 11b5 (0:11b5)
+ ld h, d
+ ld l, e
+.asm_11b7
+ ld a, [hli]
+ and a
+ ret z
+ ld b, a
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+.asm_11c0
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_11c0
+ jr .asm_11b7
+
+Func_11c7:
+ ld a, $1
+ ld [rVBK], a
+ call Func_11b5
+ xor a
+ ld [rVBK], a
+ ret
+
+Func_11d2:
+ ld h, d
+ ld l, e
+ ld a, [hLoadedROMBank]
+ ld [$ff94], a
+.asm_11d8
+ ld a, [hli]
+ and a
+ ret z
+ ld [$ff95], a
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ push hl
+ ld h, b
+ ld l, c
+ ld a, [$ff95]
+ ld b, a
+.asm_11f1
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc e
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_11f1
+ pop hl
+ ld a, [$ff94]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ jr .asm_11d8
+
+Func_122e:
+ ld a, $1
+ ld [rVBK], a
+ ld h, d
+ ld l, e
+ ld a, [hLoadedROMBank]
+ ld [$ff94], a
+.asm_1238
+ ld a, [hli]
+ and a
+ jr nz, .asm_1240
+ xor a
+ ld [rVBK], a
+ ret
+
+.asm_1240
+ ld [$ff95], a
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ push hl
+ ld h, b
+ ld l, c
+ ld a, [$ff95]
+ ld b, a
+.asm_1256
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_1256
+ pop hl
+ ld a, [$ff94]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ jr .asm_1238
+
+Func_1266:
+ ld h, d
+ ld l, e
+.asm_1268
+ ld a, [hli]
+ and a
+ ret z
+ ld [$ff94], a
+ ld a, [hli]
+ bit 6, a
+ ld de, rBGPI
+ jr z, .asm_127a
+ res 6, a
+ ld de, rOBPI
+.asm_127a
+ set 7, a
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hli]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ push hl
+ ld h, b
+ ld l, c
+ ld a, [$ff94]
+ ld b, a
+.asm_1291
+ ld a, [hli]
+ ld [de], a
+ ld a, [hli]
+ ld [de], a
+ dec b
+ jr nz, .asm_1291
+ pop hl
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ jr .asm_1268
+
+INCLUDE "home/sgb.asm"
+INCLUDE "home/serial.asm"
+
+Func_1a21: ; 0x1a21
+ call Func_1a59
+ call Func_1a89
+ jr c, .asm_1a3f
+.asm_1a29
+ call Func_1aa9
+ call Func_1b3d
+ jr c, .asm_1a3f
+ ld a, [wd86c]
+ and a
+ jr z, .asm_1a29
+ call Func_1b60
+ jr c, .asm_1a3f
+ call Func_1b88
+.asm_1a3f
+ call Func_1ba7
+ ret
+
+Func_1a43: ; 0x1a43
+ xor a
+ ld [wd86e], a
+ call Func_1a59
+ call Func_1a89
+ jr c, .asm_1a54
+ ld a, $1
+ ld [wd86e], a
+.asm_1a54
+ call Func_1ba7
+ ret
+
+ ret ; unused instruction?
+
+Func_1a59: ; 0x1a59
+ ld [wd86a], a
+ ld a, h
+ ld [wd869], a
+ ld a, l
+ ld [wd868], a
+ ld a, $80
+ ld [wd866], a
+ ld a, $c2
+ ld [wd867], a
+ xor a
+ ld [wd86b], a
+ ld [wd86c], a
+ ld [wd86d], a
+ call Func_16a2
+ ld hl, rIE
+ set 3, [hl]
+ xor a
+ ld [$ffb1], a
+ ld a, $1
+ ld [wd8e1], a
+ ret
+
+Func_1a89: ; 0x1a89
+ call Func_16e2
+ cp $f0
+ jr z, .asm_1a9f
+ cp $ff
+ jp z, Func_1bb2
+ ld a, [wd8c8]
+ cp $81
+ jp nz, Func_1bb2
+ and a
+ ret
+
+.asm_1a9f
+ ld a, [hNewlyPressedButtons]
+ bit 1, a
+ jp nz, Func_1bd3
+ rst AdvanceFrame
+ jr Func_1a89
+
+Func_1aa9: ; 0x1aa9
+ ld a, [wd866]
+ ld l, a
+ ld a, [wd867]
+ ld h, a
+ ld de, wc000
+ ld b, $2
+.asm_1ab6
+ ld c, $14
+.asm_1ab8
+ ld a, [hli]
+ call Func_1ae2
+ dec c
+ jr nz, .asm_1ab8
+ ld a, l
+ add $c
+ ld l, a
+ jr nc, .asm_1ac6
+ inc h
+.asm_1ac6
+ dec b
+ jr nz, .asm_1ab6
+ ld a, l
+ ld [wd866], a
+ ld a, h
+ ld [wd867], a
+ ld a, [wd86b]
+ inc a
+ ld [wd86b], a
+ cp $9
+ jr nz, .asm_1ae1
+ ld a, $1
+ ld [wd86c], a
+.asm_1ae1
+ ret
+
+Func_1ae2: ; 0x1ae2
+ push bc
+ push hl
+ xor $80
+ swap a
+ ld c, a
+ and $f
+ ld b, a
+ ld a, c
+ and $f0
+ ld c, a
+ ld a, [wd868]
+ ld l, a
+ ld a, [wd869]
+ ld h, a
+ add hl, bc
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wd86a]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+REPT 15
+ ld a, [hli]
+ ld [de], a
+ inc e
+ENDR
+ ld a, [hli]
+ ld [de], a
+ inc de
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ pop hl
+ pop bc
+ ret
+
+Func_1b3d: ; 0x1b3d
+ ld a, [wd86c]
+ ld [wd8dd], a
+ ld hl, wc000
+ ld a, $1
+ call Func_1779
+ cp $ff
+ jp z, Func_1bb2
+ cp $f0
+ jr z, .asm_1b56
+ and a
+ ret
+
+.asm_1b56
+ ld a, [hNewlyPressedButtons]
+ bit BIT_B_BUTTON, a
+ jp nz, Func_1bd3
+ rst AdvanceFrame
+ jr Func_1b3d
+
+Func_1b60: ; 0x1b60
+ ld a, $1
+ ld [wd8a8], a
+ ld a, $13
+ ld [wd8a9], a
+ call Func_1740
+ cp $ff
+ jp z, Func_1bb2
+ cp $f0
+ jr z, .asm_1b7e
+ ld bc, $001e
+ call AdvanceFrames
+ and a
+ ret
+
+.asm_1b7e
+ ld a, [hNewlyPressedButtons]
+ bit BIT_B_BUTTON, a
+ jp nz, Func_1bd3
+ rst AdvanceFrame
+ jr Func_1b60
+
+Func_1b88: ; 0x1b88
+ ld a, [wd8c7]
+ ld b, a
+ cp $ff
+ jr z, Func_1bb2
+ and $f0
+ jr nz, Func_1bb2
+ bit 1, b
+ jr nz, .asm_1b9d
+ call Func_16a2
+ and a
+ ret
+
+.asm_1b9d
+ ld a, [hNewlyPressedButtons]
+ bit BIT_B_BUTTON, a
+ jp nz, Func_1bd3
+ rst AdvanceFrame
+ jr Func_1b88
+
+Func_1ba7: ; 0x1ba7
+ ld hl, rIE
+ res 3, [hl]
+ xor a
+ ld [wd8e1], a
+ and a
+ ret
+
+Func_1bb2: ; 0x1bb2
+ ld hl, Data_1bcf
+ ld a, [wd8c7]
+ cp $ff
+ jr z, .asm_1bc6
+ ld b, $3
+.asm_1bbe
+ inc hl
+ sla a
+ jr c, .asm_1bc6
+ dec b
+ jr nz, .asm_1bbe
+.asm_1bc6
+ ld a, [hl]
+ ld [wd86d], a
+ call Func_16a2
+ scf
+ ret
+
+Data_1bcf:
+ dr $1bcf, $1bd3
+
+Func_1bd3: ; 0x1bd3
+ ld de, $0001
+ call PlaySoundEffect
+ ld a, $5
+ ld [wd86d], a
+ call Func_16a2
+ scf
+ ret
+
+Func_1be3: ; 0x1be3
+ ld a, $c0
+ ld [rRP], a
+ ld a, $ff
+ ld [wd8ea], a
+ xor a
+ ld b, a
+.asm_1bee
+ inc a
+ jr nz, .asm_1bee
+ inc b
+ jr nz, .asm_1bee
+ ld hl, wd8eb
+ ld a, [rKEY1]
+ bit 7, a
+ jr z, .asm_1c0c
+ ld [hl], $e
+ inc hl
+ ld [hl], $12
+ inc hl
+ ld [hl], $8
+ inc hl
+ ld [hl], $c
+ inc hl
+ ld [hl], $c
+ ret
+
+.asm_1c0c
+ ld [hl], $6
+ inc hl
+ ld [hl], $8
+ inc hl
+ ld [hl], $2
+ inc hl
+ ld [hl], $4
+ inc hl
+ ld [hl], $5
+ ret
+
+Func_1c1b: ; 0x1c1b
+ inc d
+ ret z
+ ld a, [$ff00+c]
+ bit 1, a
+ jr z, Func_1c1b
+ ret
+
+Func_1c23: ; 0x1c23
+ inc d
+ ret z
+ ld a, [$ff00+c]
+ bit 1, a
+ jr nz, Func_1c23
+ ret
+
+Func_1c2b: ; 0x1c2b
+ ld a, $c1
+ ld [$ff00+c], a
+.asm_1c2e
+ dec d
+ jr nz, .asm_1c2e
+ ret
+
+Func_1c32: ; 0x1c32
+ ld a, $c0
+ ld [$ff00+c], a
+.asm_1c35
+ dec d
+ jr nz, .asm_1c35
+ ret
+
+Func_1c39:
+ xor a
+ ld [hNumFramesSinceLastVBlank], a
+ ld a, $1
+ ld [wd8e9], a
+.asm_1c41
+ ld b, $2
+ ld c, rRP % $100
+ ld a, [$ff00+c]
+ and b
+ jr z, Func_1c50
+ ld a, [hNumFramesSinceLastVBlank]
+ and a
+ jr nz, Func_1ca1
+ jr .asm_1c41
+
+Func_1c50: ; 0x1c50
+ ld a, $1
+ ld [wd8e9], a
+ ld b, $1a
+ ld c, rRP % $100
+ ld d, $0
+ ld e, d
+ call Func_1c23
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, e
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ call Func_1c23
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ cp $8
+ jp c, Func_1dc2
+ cp $2a
+ jp nc, Func_1dc2
+ ld a, $0
+ ld [wd8ea], a
+ ld d, b
+ call Func_1c32
+ ld d, b
+ call Func_1c2b
+ ld d, b
+ call Func_1c32
+ ld d, b
+ call Func_1c2b
+ ld d, b
+ call Func_1c32
+ ret
+
+Func_1ca1: ; 0x1ca1
+ ld a, $2
+ ld [wd8e9], a
+ ld b, $1a
+ ld c, rRP % $100
+ ld d, b
+ ld e, $0
+ call Func_1c32
+ ld d, b
+ call Func_1c2b
+ ld d, b
+ call Func_1c32
+ ld d, b
+ call Func_1c2b
+ ld d, b
+ call Func_1c32
+ ld d, e
+ call Func_1c23
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, e
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, e
+ call Func_1c23
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, e
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, $1a
+ call Func_1c32
+ ld a, $0
+ ld [wd8ea], a
+ ret
+
+Func_1cef:
+ xor a
+ ld [rRP], a
+ ld a, $ff
+ ld [wd8ea], a
+ ret
+
+Func_1cf8: ; 0x1cf8
+ xor a
+ ld [wd8e4], a
+ ld [wd8e5], a
+ push hl
+ push bc
+ ld hl, wd8e6
+ ld a, $5a
+ ld [hli], a
+ ld [hl], b
+ dec hl
+ ld b, $2
+ ld d, $1e
+ call Func_1c32
+ call Func_1d44
+ pop bc
+ pop hl
+ call Func_1ed3
+ call Func_1d44
+ ld a, [wd8e4]
+ ld [wd8e6], a
+ ld a, [wd8e5]
+ ld [wd8e7], a
+ ld hl, wd8e6
+ ld b, $2
+ call Func_1d44
+ ld hl, wd8ea
+ ld b, $1
+ call Func_1e3b
+ ld a, [wd8e6]
+ ld [wd8e4], a
+ ld a, [wd8e7]
+ ld [wd8e5], a
+ ret
+
+Func_1d44: ; 0x1d44
+ ld a, [wd8ea]
+ cp $0
+ ret nz
+ ld c, rRP % $100
+ ld d, $16
+ call Func_1c2b
+ ld d, $16
+ call Func_1c32
+ ld a, b
+ cpl
+ ld b, a
+.asm_1d59
+ inc b
+ jr z, .asm_1dae
+ ld a, $8
+ ld [wd8e3], a
+ ld a, [hli]
+ ld e, a
+ ld a, [wd8e4]
+ add e
+ ld [wd8e4], a
+ jr nc, .asm_1d75
+ ld a, [wd8e5]
+ inc a
+ ld [wd8e5], a
+ jr .asm_1d78
+
+.asm_1d75
+ call Func_1ed3
+.asm_1d78
+ ld a, e
+ rlca
+ ld e, a
+ jr nc, .asm_1d8d
+ ld a, [wd8eb]
+ ld d, a
+ call Func_1c2b
+ ld a, [wd8ec]
+ ld d, a
+ call Func_1c32
+ jr .asm_1d9b
+
+.asm_1d8d
+ ld a, [wd8ed]
+ ld d, a
+ call Func_1c2b
+ ld a, [wd8ee]
+ ld d, a
+ call Func_1c32
+.asm_1d9b
+ ld a, [wd8e3]
+ dec a
+ ld [wd8e3], a
+ jr z, .asm_1dac
+ call Func_1ed4
+ call Func_1ed4
+ jr .asm_1d78
+
+.asm_1dac
+ jr .asm_1d59
+
+.asm_1dae
+ call Func_1ed3
+ call Func_1ed3
+ call Func_1ed4
+ ld d, $16
+ call Func_1c2b
+ ld d, $16
+ call Func_1c32
+ ret
+
+Func_1dc2: ; 0x1dc2
+ ld a, $2
+ ld [wd8ea], a
+ ret
+
+Func_1dc8:
+ ld a, [wd8ea]
+ or $1
+ ld [wd8ea], a
+ ret
+
+Func_1dd1: ; 0x1dd1
+ ld a, [wd8ea]
+ or $4
+ ld [wd8ea], a
+ ret
+
+Func_1dda: ; 0x1dda
+ xor a
+ ld [wd8e4], a
+ ld [wd8e5], a
+ push hl
+ ld hl, wd8e6
+ ld b, $2
+ call Func_1e3b
+ ld a, [wd8e7]
+ ld [wd8e8], a
+ ld b, a
+ pop hl
+ ld a, [wd8e6]
+ cp $5a
+ jp nz, Func_1dd1
+ call Func_1e3b
+ ld a, [wd8e4]
+ ld d, a
+ ld a, [wd8e5]
+ ld e, a
+ push de
+ ld hl, wd8e6
+ ld b, $2
+ call Func_1e3b
+ pop de
+ ld hl, wd8e6
+ ld a, [hli]
+ xor d
+ ld b, a
+ ld a, [hl]
+ xor e
+ or b
+ jr z, .asm_1e22
+ ld a, [wd8ea]
+ or $1
+ ld [wd8ea], a
+.asm_1e22
+ push de
+ ld hl, wd8ea
+ ld b, $1
+ call Func_1d44
+ pop de
+ ld a, d
+ ld [wd8e4], a
+ ld a, e
+ ld [wd8e5], a
+ ld a, [wd8e8]
+ cp $82
+ ret z
+ ret
+
+Func_1e3b: ; 0x1e3b
+ ld a, [wd8ea]
+ cp $0
+ ret nz
+ ld c, rRP % $100
+ ld d, $0
+ call Func_1c23
+ ld a, d
+ or a
+ jp z, Func_1dc2
+ ld d, $0
+ call Func_1c1b
+ ld a, d
+ or a
+ jp z, Func_1dc2
+ ld d, $0
+ call Func_1c23
+ ld a, d
+ or a
+ jp z, Func_1dc2
+ call Func_1ed4
+ call Func_1ed4
+ push af
+ pop af
+ ld a, b
+ cpl
+ ld b, a
+.asm_1e6c
+ inc b
+ jr z, .asm_1eb9
+ ld a, $8
+ ld [wd8e3], a
+.asm_1e74
+ ld d, $0
+ call Func_1c1b
+ call Func_1c23
+ ld a, [wd8ef]
+ cp d
+ jr nc, .asm_1e88
+ ld a, e
+ set 0, a
+ ld e, a
+ jr .asm_1e8c
+
+.asm_1e88
+ ld a, e
+ res 0, a
+ ld e, a
+.asm_1e8c
+ ld a, [wd8e3]
+ dec a
+ ld [wd8e3], a
+ jr z, .asm_1ea0
+ ld a, e
+ rlca
+ ld e, a
+ call Func_1ed4
+ call Func_1ed4
+ jr .asm_1e74
+
+.asm_1ea0
+ ld a, e
+ ld [hli], a
+ ld a, [wd8e4]
+ add e
+ ld [wd8e4], a
+ jr nc, .asm_1eb4
+ ld a, [wd8e5]
+ inc a
+ ld [wd8e5], a
+ jr .asm_1eb7
+
+.asm_1eb4
+ call Func_1ed3
+.asm_1eb7
+ jr .asm_1e6c
+
+.asm_1eb9
+ ld d, $0
+ call Func_1c1b
+ ld a, d
+ and a
+ jp z, Func_1dc2
+ ld d, $11
+ call Func_1c32
+ ret
+
+Func_1ec9:
+ ld b, $00
+ jp Func_1cf8
+
+Func_1ece:
+ ld b, $00
+ jp Func_1dda
+
+Func_1ed3: ; 0x1ed3
+ ret
+
+Func_1ed4: ; 0x1ed4
+ jr z, .asm_1ed6
+.asm_1ed6
+ jr nz, .asm_1ed8
+.asm_1ed8
+ ret
+
+Func_1ed9:
+ push bc
+ push de
+ push hl
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, BANK(Data_8f06)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, Data_8f06
+ jr asm_1f3b
+
+Func_1ef2:
+ push bc
+ push de
+ push hl
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, BANK(Data_8f06)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, Data_8f06
+ jr asm_1f3b
+
+LoadOAMData2: ; 0x1f0b
+; This function loads OAM data, but it adds b and c to the x and y values
+; input: a = OAM data id (see OAMDataPointers2)
+ push bc
+ push de
+ push hl
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, Bank(OAMDataPointers2)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, OAMDataPointers2
+ jr asm_1f3b
+
+LoadOAMData: ; 0x1f24
+; This function loads OAM data, but it adds b and c to the x and y values
+; input: a = OAM data id (see OAMDataPointers)
+ push bc
+ push de
+ push hl
+ ld e, a
+ ld d, $0
+ sla e
+ rl d ; multiply de by 2
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, Bank(OAMDataPointers)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, OAMDataPointers
+asm_1f3b: ; 0x1f3b
+ add hl, de ; hl points to oam pointer in OAMDataPointers
+ ld a, [hli]
+ ld e, a
+ ld a, [hl]
+ ld d, a ; de points to OAM data
+ ld a, [wOAMBufferSize]
+ ld l, a
+ ld h, (wOAMBuffer >> 8)
+.loadOAMDataLoop
+ ld a, [de]
+ cp $80 ; OAM data list terminator
+ jr z, .doneReadingOAMData
+ add c
+ ld [hli], a
+ inc de
+ ld a, [de]
+ add b
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ jr .loadOAMDataLoop
+
+.doneReadingOAMData
+ ld a, l
+ ld [wOAMBufferSize], a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Func_1f68:
+ push bc
+ push de
+ push hl
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, BANK(Data_8f06)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, Data_8f06 ; all 0s
+ jr asm_1fca
+
+Func_1f81:
+ push bc
+ push de
+ push hl
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, BANK(Data_8f06)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, Data_8f06 ; all 0s
+ jr asm_1fca
+
+Func_1f9a:
+ push bc
+ push de
+ push hl
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, BANK(OAMDataPointers2)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, OAMDataPointers2
+ jr asm_1fca
+
+Func_1fb3:
+ push bc
+ push de
+ push hl
+ ld e, a
+ ld d, $0
+ sla e
+ rl d
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, BANK(OAMDataPointers)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, OAMDataPointers
+asm_1fca
+ add hl, de
+ ld a, [hli]
+ ld e, a
+ ld a, [hl]
+ ld d, a
+ ld a, [wOAMBufferSize]
+ ld l, a
+ ld h, $d0
+.asm_1fd5
+ ld a, [de]
+ cp $80
+ jr z, .asm_1fee
+ add c
+ ld [hli], a
+ inc de
+ ld a, [de]
+ add b
+ ld [hli], a
+ inc de
+ ld a, [de]
+ push hl
+ ld hl, sp+$7
+ add [hl]
+ pop hl
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ jr .asm_1fd5
+
+.asm_1fee
+ ld a, l
+ ld [wOAMBufferSize], a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Func_1ffc: ; 0x1ffc
+ ld a, $b
+ ld [wd806], a
+ ld a, $4
+ ld [wd807], a
+ ld [hFarCallTempA], a
+ callba Func_3c000
+ ld a, $1
+ ld [wd85d], a
+ ld a, $37
+ ld [wd470], a
+ ld [wd471], a
+ ld [wd472], a
+ ld a, SCREEN_ERASE_ALL_DATA
+ ld [wCurrentScreen], a
+.master_loop
+ call Func_2034
+ call Func_2043
+ call Func_926
+ call Func_b2e
+ rst AdvanceFrame
+ jr .master_loop
+
+Func_2034: ; 0x2034
+ ld a, [wd804]
+ and a
+ jr z, .asm_203f
+ dec a
+ ld [wd804], a
+ ret
+
+.asm_203f
+ ld [wd803], a
+ ret
+
+Func_2043: ; 0x2043
+ ld a, [wCurrentScreen]
+ call CallInFollowingTable
+CallTable_2049: ; 0x2049
+; First two bytes is function pointer.
+; Third byte is bank of function.
+; Fourth byte seems to be unused.
+ padded_dab Func_8000
+
+ ; SCREEN_ERASE_ALL_DATA
+ padded_dab HandleEraseAllDataMenu
+
+ ; SCREEN_COPYRIGHT
+ padded_dab HandleCopyrightScreen
+
+ ; SCREEN_TITLESCREEN
+ padded_dab HandleTitlescreen
+
+ ; SCREEN_PINBALL_GAME
+ padded_dab HandlePinballGame
+
+ ; SCREEN_POKEDEX
+ padded_dab HandlePokedexScreen
+
+ ; SCREEN_OPTIONS
+ padded_dab HandleOptionsScreen
+
+ ; SCREEN_HIGH_SCORES
+ padded_dab HandleHighScoresScreen
+
+ ; SCREEN_FIELD_SELECT
+ padded_dab HandleFieldSelectScreen
+ ; end of call table
+
+Func_206d: ; 0x206d
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, Bank(Func_8d17)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ call Func_8d17
+ jr c, .asm_2084
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ and a
+ ret
+
+.asm_2084
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ ret
+
+Func_208c: ; 0x208c
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, Bank(Func_8ee0)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ call Func_8ee0
+ jr c, .asm_20a3
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ and a
+ ret
+
+.asm_20a3
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ scf
+ ret
+
+Func_20ab: ; 0x20ab
+ push af
+ xor a
+ ld [$ffb6], a
+ jr .asm_20c6
+
+ push af
+ ld a, b
+ xor c
+ ld [$ffb6], a
+ bit 7, b
+ jr z, .asm_20be
+ ld a, b
+ cpl
+ inc a
+ ld b, a
+.asm_20be
+ bit 7, c
+ jr z, .asm_20c6
+ ld a, c
+ cpl
+ inc a
+ ld c, a
+.asm_20c6
+ push de
+ push hl
+ ld a, b
+ cp c
+ jr nc, .asm_20ce
+ ld b, c
+ ld c, a
+.asm_20ce
+ ld h, $3e
+ ld l, c
+ ld e, [hl]
+ inc h
+ ld d, [hl]
+ ld l, b
+ ld a, [hl]
+ dec h
+ ld l, [hl]
+ ld h, a
+ add hl, de
+ push af
+ ld d, $3e
+ ld a, b
+ sub c
+ ld e, a
+ ld a, [de]
+ ld c, a
+ inc d
+ ld a, [de]
+ ld b, a
+ ld a, l
+ sub c
+ ld l, a
+ ld a, h
+ sbc b
+ ld h, a
+ jr nc, .asm_20f1
+ pop af
+ ccf
+ jr .asm_20f2
+
+.asm_20f1
+ pop af
+.asm_20f2
+ rr h
+ rr l
+ ld b, h
+ ld c, l
+ ld a, [$ffb6]
+ rlca
+ jr nc, .asm_2107
+ ld a, c
+ cpl
+ add $1
+ ld c, a
+ ld a, b
+ cpl
+ adc $0
+ ld b, a
+.asm_2107
+ pop hl
+ pop de
+ pop af
+ ret
+
+Func_210b: ; 0x210b
+ push af
+ push hl
+ ld a, b
+ xor d
+ ld [$ffb7], a
+ bit 7, b
+ jr z, .asm_211f
+ ld a, c
+ cpl
+ add $1
+ ld c, a
+ ld a, b
+ cpl
+ adc $0
+ ld b, a
+.asm_211f
+ push bc
+ ld b, e
+ call Func_20ab
+ ld l, c
+ ld h, b
+ ld bc, $0080
+ add hl, bc
+ ld l, h
+ ld h, $0
+ pop bc
+ ld c, e
+ call Func_20ab
+ add hl, bc
+ ld a, [$ffb7]
+ rlca
+ jr nc, .asm_2142
+ ld a, l
+ cpl
+ add $1
+ ld l, a
+ ld a, h
+ cpl
+ adc $0
+ ld h, a
+.asm_2142
+ ld c, l
+ ld b, h
+ pop hl
+ pop af
+ ret
+
+Func_2147: ; 0x2147
+ add $40
+ ; fall through
+Func_2149: ; 0x2149
+ push hl
+ ld [$ffb6], a
+ and $7f
+ cp $40
+ jr c, .asm_2155
+ cpl
+ add $81
+.asm_2155
+ ld hl, Data_26be
+ ld e, a
+ ld d, $0
+ add hl, de
+ ld e, [hl]
+ pop hl
+ ld d, $0
+ ld a, [$ffb6]
+ sla a
+ ret nc
+ ld d, $ff
+ ret
+
+ApplyGravityToBall: ; 0x2168
+; Adds a constant to the pinball's y velocity.
+ ld a, [wd549]
+ and a
+ ret z
+ ld de, $000b ; gravity added to y velocity every frame
+ ld hl, wBallYVelocity
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, de
+ ld a, l
+ ld [wBallYVelocity], a
+ ld a, h
+ ld [wBallYVelocity + 1], a
+ ret
+
+LimitBallVelocity: ; 0x2180
+; Ensures that the ball's x and y velocity are kept under a threshold.
+; The ball can travel at a higher max speed when moving diagonally, since it
+; limits the x and y components independently.
+ ld hl, wBallXVelocity + 1
+ call _LimitBallVelocity
+ ld hl, wBallYVelocity + 1
+ ; fall through
+_LimitBallVelocity: ; 0x2189
+ ld a, [hl]
+ bit 7, a ; is it negative velocity? (left or up)
+ jr nz, .negativeVelocity
+ cp $8
+ ret c
+ ld a, $7 ; max positive velocity
+ ld [hl], a
+ ret
+
+.negativeVelocity
+ cp $f9
+ ret nc
+ ld a, $f9 ; max negative velocity
+ ld [hl], a
+ ret
+
+MoveBallPosition: ; 0x219c
+; Updates the ball's position according to its velocity
+ ld a, [wBallXPos]
+ ld [wPreviousBallXPos], a
+ ld a, [wBallXPos + 1]
+ ld [wPreviousBallXPos + 1], a
+ ld a, [wBallYPos]
+ ld [wPreviousBallYPos], a
+ ld a, [wBallYPos + 1]
+ ld [wPreviousBallYPos + 1], a
+ ld de, wBallXVelocity + 1
+ ld hl, wBallXPos
+ call AddVelocityToPosition
+ ld de, wBallYVelocity + 1
+ ld hl, wBallYPos
+ ; fall through
+
+AddVelocityToPosition: ; 0x21c3
+ ld a, [de]
+ bit 7, a
+ jr nz, .asm_21d1
+ cp 1+4
+ jr c, .asm_21da
+ ld bc, $04ff
+ jr .asm_21de
+
+.asm_21d1
+ cp -4
+ jr nc, .asm_21da
+ ld bc, -$04ff
+ jr .asm_21de
+
+.asm_21da
+ ld b, a
+ dec de
+ ld a, [de]
+ ld c, a
+.asm_21de
+ ld a, [hl]
+ add c
+ ld [hli], a
+ ld a, [hl]
+ adc b
+ ld [hl], a
+ ret
+
+Func_21e5: ; 0x21e5
+ cpl
+ inc a
+ ; fall through
+Func_21e7: ; 0x21e7
+ push hl
+ push bc
+ push de
+ ld [$ff8c], a
+ call Func_2147
+ ld a, e
+ ld [$ff8d], a
+ ld a, d
+ ld [$ff8e], a
+ call Func_210b
+ ld l, c
+ ld h, b
+ pop bc
+ push bc
+ ld a, [$ff8c]
+ call Func_2149
+ ld a, e
+ ld [$ff8f], a
+ ld a, d
+ ld [$ff90], a
+ call Func_210b
+ add hl, bc
+ pop de
+ pop bc
+ push hl
+ push de
+ ld a, [$ff8f]
+ ld e, a
+ ld a, [$ff90]
+ cpl
+ ld d, a
+ call Func_210b
+ ld l, c
+ ld h, b
+ pop bc
+ ld a, [$ff8d]
+ ld e, a
+ ld a, [$ff8e]
+ ld d, a
+ call Func_210b
+ add hl, bc
+ ld d, h
+ ld e, l
+ pop bc
+ pop hl
+ ret
+
+Func_222b: ; 0x222b
+ push hl
+ ld hl, wd7f8
+ ld [hl], $ff
+ bit 7, d
+ jr nz, .asm_2297
+ ld [hl], $0
+ ld a, d
+ cp $3
+ jr c, .asm_2254
+ ld a, $ff
+ ld [wd803], a
+ ld a, $1
+ ld [wd804], a
+ ld a, [wFlipperCollision]
+ and a
+ jr nz, .asm_2254
+ push de
+ ld de, $0008
+ call Func_4d8
+ pop de
+.asm_2254
+ srl d
+ rr e
+ srl d
+ rr e
+ ld h, d
+ ld l, e
+ srl d
+ rr e
+ ld a, [wd7eb]
+ and a
+ jr z, .asm_226c
+.asm_2268
+ add hl, de
+ dec a
+ jr nz, .asm_2268
+.asm_226c
+ ld d, h
+ ld e, l
+ ld a, e
+ cpl
+ add $1
+ ld e, a
+ ld a, d
+ cpl
+ adc $0
+ ld d, a
+ ld a, [wBallSpin]
+ sra a
+ ld l, a
+ ld h, $0
+ bit 7, l
+ jr z, .asm_2286
+ ld h, $ff
+.asm_2286
+ add hl, bc
+ ld b, h
+ ld c, l
+ push bc
+ sla c
+ rl b
+ sla c
+ rl b
+ ld a, b
+ ld [wBallSpin], a
+ pop bc
+.asm_2297
+ pop hl
+ ret
+
+LoadBallVelocity: ; 0x2299
+; Loads velocity of the ball into bc and de
+; bc = x velocity
+; de = y velocity
+ push hl
+ ld hl, wBallXVelocity
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld e, a
+ ld a, [hl]
+ ld d, a
+ pop hl
+ ret
+
+SetBallVelocity: ; 0x22a7
+; Sets the x and y velocities of the ball.
+; bc = x velocity
+; de = y velocity
+ push hl
+ ld hl, wBallXVelocity
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hli], a
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hl], a
+ pop hl
+ ret
+
+Func_22b5: ; 0x22b5
+ ld a, [wBallXPos + 1]
+ sub $4
+ push af
+ and $7
+ ld [wSubTileBallXPos], a ; sub-tile position
+ pop af
+ and $f8
+ ld c, a
+ ld a, [wBallYPos + 1]
+ sub $4
+ push af
+ and $7
+ ld [wSubTileBallYPos], a
+ pop af
+ and $f8
+ ld b, a
+ ld l, b ; bc contains tile coords of ball position
+ ld h, $0
+ sla l
+ rl h
+ sla l
+ rl h ; b was multiplied by 4 (y tile position)
+ srl c
+ srl c
+ srl c ; c was divided by 8 (x tile position)
+ ld b, $0
+ add hl, bc
+ ld a, l
+ ld [wd7f3], a
+ ld a, h
+ ld [wd7f4], a
+ ld a, [wStageCollisionMapPointer]
+ ld c, a
+ ld a, [wStageCollisionMapPointer + 1]
+ ld b, a
+ add hl, bc ; hl = address of upper-left collision byte
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wStageCollisionMapBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld bc, $001f ; number of tiles wide - 1
+ ld a, [hli]
+ ld [wUpperLeftCollisionAttribute], a
+ ld a, [hl]
+ ld [wUpperRightCollisionAttribute], a
+ add hl, bc
+ ld a, [hli]
+ ld [wLowerLeftCollisionAttribute], a
+ ld a, [hl]
+ ld [wLowerRightCollisionAttribute], a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [wStageCollisionMasksBank]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [wSubTileBallXPos]
+ sla a
+ ld c, a
+ ld b, $0
+ ld hl, SubTileXPos_CollisionDataPointers
+ add hl, bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, [wSubTileBallYPos]
+ ld c, a
+ ld b, $10 ; number of times to loop over .asm_233d
+.asm_233d
+ push bc
+ ld a, [de]
+ inc de
+ add c ; add the sub tile y pos
+ push af
+ srl a
+ srl a
+ srl a
+ ld c, a
+ ld b, $0
+ ld hl, wUpperLeftCollisionAttribute
+ add hl, bc
+ ld a, [hl]
+ call Func_248a
+ jr nc, .asm_235e
+ pop af
+ and $7
+ ld c, a
+ ld b, $0
+ add hl, bc
+ jr .asm_237b
+
+.asm_235e
+ ld c, a
+ ld b, $0
+ sla c
+ rl b
+ sla c
+ rl b
+ sla c
+ rl b
+ ld hl, wStageCollisionMasksPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, bc
+ pop af
+ and $7
+ ld c, a
+ ld b, $0
+ add hl, bc
+.asm_237b
+ ld a, [de]
+ inc de
+ and [hl]
+ push af
+ ld a, [de]
+ inc de
+ ld c, a
+ ld hl, wd7c9
+ add hl, bc
+ pop af
+ ld [hl], a
+ pop bc
+ dec b
+ jr nz, .asm_233d
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld hl, wd7c9
+ ld de, wd7d9
+ ld b, $4
+.asm_239a
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_239a
+ ld hl, wd7c9
+ ld de, $0000
+ ld b, $0
+ ld a, [hl]
+ and a
+ jr z, .asm_23c1
+.asm_23b5
+ ld a, [hli]
+ inc b
+ and a
+ jr z, .asm_23c1
+ ld a, b
+ cp $11
+ jr nc, .asm_23ee
+ jr .asm_23b5
+
+.asm_23c1
+ ld a, [hli]
+ inc b
+ and a
+ jr nz, .asm_23cd
+ ld a, b
+ cp $11
+ jr nc, .asm_23ee
+ jr .asm_23c1
+
+.asm_23cd
+ push de
+ ld d, $1
+ ld c, b
+ dec c
+.asm_23d2
+ ld a, [hli]
+ inc b
+ inc d
+ and a
+ jr nz, .asm_23d2
+ dec d
+ ld a, b
+ dec a
+ dec a
+ and $f
+ swap c
+ or c
+ ld c, a
+ ld a, d
+ cp e
+ pop de
+ jr c, .asm_23e9
+ ld e, a
+ ld d, c
+.asm_23e9
+ ld a, b
+ cp $10
+ jr c, .asm_23c1
+.asm_23ee
+ ld a, e
+ ld [wd7e9], a
+ and a
+ ret z
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, Bank(Data_8817)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ push de
+ ld e, d
+ ld d, $0
+ ld hl, Data_8817
+ add hl, de
+ ld a, [hl]
+ ld [wd7ea], a
+ sla e
+ rl d
+ ld hl, Data_8917
+ add hl, de
+ ld a, [wBallYPos]
+ add [hl]
+ ld [wBallYPos], a
+ inc hl
+ ld a, [wBallYPos + 1]
+ adc [hl]
+ ld [wBallYPos + 1], a
+ ld hl, Data_8b17
+ add hl, de
+ ld a, [wBallXPos]
+ add [hl]
+ ld [wBallXPos], a
+ inc hl
+ ld a, [wBallXPos + 1]
+ adc [hl]
+ ld [wBallXPos + 1], a
+ pop de
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, d
+ swap a
+ and $f
+ ld e, a
+ ld a, d
+ and $f
+ sub e
+ jr nc, .asm_2449
+ add $10
+.asm_2449
+ add e
+ add e
+ inc a
+ and $1e
+ ld c, a
+ ld b, $0
+ ld hl, Data_250e
+ add hl, bc
+ ld a, [wSubTileBallXPos]
+ add $4
+ add [hl]
+ bit 3, a
+ ld c, b
+ jr z, .asm_2462
+ ld c, $2
+.asm_2462
+ ld a, [wSubTileBallYPos]
+ add $4
+ inc hl
+ add [hl]
+ bit 3, a
+ jr z, .asm_246e
+ inc c
+.asm_246e
+ ld hl, wUpperLeftCollisionAttribute
+ add hl, bc
+ ld a, [hl]
+ ld [wd7f5], a
+ ld hl, Data_250a
+ add hl, bc
+ ld a, [wd7f3]
+ add [hl]
+ ld [wd7f6], a
+ ld a, [wd7f4]
+ adc $0
+ ld [wd7f7], a
+ ret
+
+Func_248a: ; 0x248a
+ push af
+ ld a, [wCurrentStage]
+ bit 0, a
+ jr nz, .asm_2495
+ pop af
+ and a
+ ret
+
+.asm_2495
+ pop af
+ cp $d0
+ ccf
+ ret nc
+ cp $e0
+ jr nc, .asm_24ab
+ sub $d0
+ sla a
+ sla a
+ sla a
+ ld l, a
+ ld h, $c4
+ scf
+ ret
+
+.asm_24ab
+ push de
+ sub $e0
+ ld b, a
+ ld a, [wCurrentStage]
+ cp $6 ; gengar stage buggy?
+ jr nc, .asm_24e0
+ bit 4, b
+ ld hl, Data_3800
+ ld a, [wd7af]
+ jr z, .asm_24c8
+ res 4, b
+ ld hl, Data_3980
+ ld a, [wd7b3]
+.asm_24c8
+ ld de, $0080
+ cp $7
+ jr c, .asm_24d5
+ add hl, de
+ cp $e
+ jr c, .asm_24d5
+ add hl, de
+.asm_24d5
+ ld e, b
+ sla e
+ sla e
+ sla e
+ add hl, de
+ pop de
+ scf
+ ret
+
+.asm_24e0
+ bit 4, b
+ ld hl, Data_3b00
+ ld a, [wd7af]
+ jr z, .asm_24f2
+ res 4, b
+ ld hl, Data_3c80
+ ld a, [wd7b3]
+.asm_24f2
+ ld de, $0080
+ cp $7
+ jr c, .asm_24ff
+ add hl, de
+ cp $e
+ jr c, .asm_24ff
+ add hl, de
+.asm_24ff
+ ld e, b
+ sla e
+ sla e
+ sla e
+ add hl, de
+ pop de
+ scf
+ ret
+
+Data_250a:
+ dr $250a, $250e
+
+Data_250e:
+ dr $250e, $252e
+
+SubTileXPos_CollisionDataPointers: ; 0x252e
+ dw SubTileXPos_CollisionData0
+ dw SubTileXPos_CollisionData1
+ dw SubTileXPos_CollisionData2
+ dw SubTileXPos_CollisionData3
+ dw SubTileXPos_CollisionData4
+ dw SubTileXPos_CollisionData5
+ dw SubTileXPos_CollisionData6
+ dw SubTileXPos_CollisionData7
+
+SubTileXPos_CollisionData0: ; 0x253e
+ db $00, $10, $0B
+ db $00, $08, $0C
+ db $00, $04, $0D
+ db $01, $40, $0A
+ db $01, $01, $0E
+ db $03, $80, $09
+ db $13, $80, $0F
+ db $04, $80, $08
+ db $14, $80, $00
+ db $05, $80, $07
+ db $15, $80, $01
+ db $07, $40, $06
+ db $07, $01, $02
+ db $08, $10, $05
+ db $08, $08, $04
+ db $08, $04, $03
+
+SubTileXPos_CollisionData1: ; 0x256e
+ db $00, $08, $0B
+ db $00, $04, $0C
+ db $00, $02, $0D
+ db $01, $20, $0A
+ db $11, $80, $0E
+ db $03, $40, $09
+ db $13, $40, $0F
+ db $04, $40, $08
+ db $14, $40, $00
+ db $05, $40, $07
+ db $15, $40, $01
+ db $07, $20, $06
+ db $17, $80, $02
+ db $08, $08, $05
+ db $08, $04, $04
+ db $08, $02, $03
+
+SubTileXPos_CollisionData2: ; 0x259e
+ db $00, $04, $0B
+ db $00, $02, $0C
+ db $00, $01, $0D
+ db $01, $10, $0A
+ db $11, $40, $0E
+ db $03, $20, $09
+ db $13, $20, $0F
+ db $04, $20, $08
+ db $14, $20, $00
+ db $05, $20, $07
+ db $15, $20, $01
+ db $07, $10, $06
+ db $17, $40, $02
+ db $08, $04, $05
+ db $08, $02, $04
+ db $08, $01, $03
+
+SubTileXPos_CollisionData3: ; 0x25ce
+ db $00, $02, $0B
+ db $00, $01, $0C
+ db $10, $80, $0D
+ db $01, $08, $0A
+ db $11, $20, $0E
+ db $03, $10, $09
+ db $13, $10, $0F
+ db $04, $10, $08
+ db $14, $10, $00
+ db $05, $10, $07
+ db $15, $10, $01
+ db $07, $08, $06
+ db $17, $20, $02
+ db $08, $02, $05
+ db $08, $01, $04
+ db $18, $80, $03
+
+SubTileXPos_CollisionData4: ; 0x25fe
+ db $00, $01, $0B
+ db $10, $80, $0C
+ db $10, $40, $0D
+ db $01, $04, $0A
+ db $11, $10, $0E
+ db $03, $08, $09
+ db $13, $08, $0F
+ db $04, $08, $08
+ db $14, $08, $00
+ db $05, $08, $07
+ db $15, $08, $01
+ db $07, $04, $06
+ db $17, $10, $02
+ db $08, $01, $05
+ db $18, $80, $04
+ db $18, $40, $03
+
+SubTileXPos_CollisionData5: ; 0x262e
+ db $10, $80, $0B
+ db $10, $40, $0C
+ db $10, $20, $0D
+ db $01, $02, $0A
+ db $11, $08, $0E
+ db $03, $04, $09
+ db $13, $04, $0F
+ db $04, $04, $08
+ db $14, $04, $00
+ db $05, $04, $07
+ db $15, $04, $01
+ db $07, $02, $06
+ db $17, $08, $02
+ db $18, $80, $05
+ db $18, $40, $04
+ db $18, $20, $03
+
+SubTileXPos_CollisionData6: ; 0x265e
+ db $10, $40, $0B
+ db $10, $20, $0C
+ db $10, $10, $0D
+ db $01, $01, $0A
+ db $11, $04, $0E
+ db $03, $02, $09
+ db $13, $02, $0F
+ db $04, $02, $08
+ db $14, $02, $00
+ db $05, $02, $07
+ db $15, $02, $01
+ db $07, $01, $06
+ db $17, $04, $02
+ db $18, $40, $05
+ db $18, $20, $04
+ db $18, $10, $03
+
+SubTileXPos_CollisionData7: ; 0x268e
+ db $10, $20, $0B
+ db $10, $10, $0C
+ db $10, $08, $0D
+ db $11, $80, $0A
+ db $11, $02, $0E
+ db $03, $01, $09
+ db $13, $01, $0F
+ db $04, $01, $08
+ db $14, $01, $00
+ db $05, $01, $07
+ db $15, $01, $01
+ db $17, $80, $06
+ db $17, $02, $02
+ db $18, $20, $05
+ db $18, $10, $04
+ db $18, $08, $03
+
+Data_26be:
+ dr $26be, $2720
+
+Func_2720: ; 0x2720
+ ld a, $ff
+ ld [wd4ea], a
+ call Func_272f
+ ld a, [wd4ea]
+ ld [wd4ec], a
+ ret
+
+Func_272f: ; 0x272f
+; not collisions
+ ld a, [wCurrentStage]
+ call CallInFollowingTable
+CallTable_2735: ; 0x2735
+ ; STAGE_RED_FIELD_TOP
+ padded_dab Func_143e1
+
+ ; STAGE_RED_FIELD_BOTTOM
+ padded_dab Func_143f9
+
+ padded_dab Func_18061
+
+ padded_dab Func_18062
+
+ ; STAGE_BLUE_FIELD_TOP
+ padded_dab Func_1c520
+
+ ; STAGE_BLUE_FIELD_BOTTOM
+ padded_dab Func_1c536
+
+ ; STAGE_GENGAR_BONUS
+ padded_dab Func_181b1
+
+ ; STAGE_GENGAR_BONUS
+ padded_dab Func_181b1
+
+ ; STAGE_MEWTWO_BONUS
+ padded_dab Func_19330
+
+ ; STAGE_MEWTWO_BONUS
+ padded_dab Func_19330
+
+ ; STAGE_MEOWTH_BONUS
+ padded_dab Func_2414d
+
+ ; STAGE_MEOWTH_BONUS
+ padded_dab Func_2414d
+
+ ; STAGE_DIGLETT_BONUS
+ padded_dab Func_19ab3
+
+ ; STAGE_DIGLETT_BONUS
+ padded_dab Func_19ab3
+
+ ; STAGE_SEEL_BONUS
+ padded_dab Func_25bbc
+
+ ; STAGE_SEEL_BONUS
+ padded_dab Func_25bbc
+
+Func_2775: ; 0x2775
+ ld a, [wd4ea]
+ inc a
+ jr nz, .asm_27a2
+ ld a, [bc]
+ bit 7, a
+ jr nz, .asm_27a2
+ push bc
+ push de
+ call nc, Func_27da
+ pop hl
+ call c, Func_27a4
+ ld a, [wd4ea]
+ ld b, a
+ pop hl
+ ld [hl], $0
+ jr nc, .asm_27a2
+ ld a, [wd4ec]
+ cp b
+ jr z, .asm_27a2
+ ld a, [wd4eb]
+ ld [hli], a
+ ld a, [wd4ea]
+ ld [hl], a
+ scf
+ ret
+
+.asm_27a2
+ and a
+ ret
+
+Func_27a4: ; 0x27a4
+ xor a
+ ld [wd4eb], a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld e, a
+ ld a, [wBallXPos + 1]
+ ld b, a
+ ld a, [wBallYPos + 1]
+ ld c, a
+.asm_27b4
+ ld a, [wd4eb]
+ inc a
+ ld [wd4eb], a
+ ld a, [hli]
+ ld [wd4ea], a
+ cp $ff
+ ret z
+ ld a, [hli]
+ sub b
+ bit 7, a
+ jr z, .asm_27ca
+ cpl
+ inc a
+.asm_27ca
+ cp d
+ ld a, [hli]
+ jr nc, .asm_27b4
+ sub c
+ bit 7, a
+ jr z, .asm_27d5
+ cpl
+ inc a
+.asm_27d5
+ cp e
+ jr nc, .asm_27b4
+ scf
+ ret
+
+Func_27da: ; 0x27da
+ ld a, [hli]
+ and a
+ jr z, .asm_27e8
+ dec hl
+ ld a, [wStageCollisionState]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld c, [hl]
+ add hl, bc
+.asm_27e8
+ ld a, [wd7e9]
+ and a
+ ret z
+ ld a, [wd7f5]
+ ld b, a
+ ld c, $ff
+.asm_27f3
+ inc c
+ ld a, [hli]
+ cp $ff
+ ret z
+ cp b
+ jr nz, .asm_27f3
+ scf
+ ret
+
+PinballCollideWithPoints: ; 0x27fd
+; Checks if pinball collides with any of the (x, y) points in the given list.
+; Saves the index of the collided point.
+; Input: hl = pointer to array of (x, y) points
+; Output: Saves index of collided point in wd578
+ ld a, [wBallXPos + 1]
+ ld b, a
+ ld a, [wBallYPos + 1]
+ ld c, a
+ ld d, $0
+.nextPoint
+ ld a, [hli]
+ and a
+ ret z
+ inc d
+ ld a, [hli]
+ sub b
+ cp $e8
+ ld a, [hli]
+ jr c, .nextPoint
+ sub c
+ cp $e8
+ jr c, .nextPoint
+ ld a, d
+ ld [wd578], a
+ ret
+
+Func_281c: ; 0x281c
+ ld a, [wCurrentStage]
+ call CallInFollowingTable
+CallTable_2822: ; 0x2822
+; not collisions
+ ; STAGE_RED_FIELD_TOP
+ padded_dab Func_1460e
+
+ ; STAGE_RED_FIELD_BOTTOM
+ padded_dab Func_14652
+
+ padded_dab Func_1806d
+
+ padded_dab Func_1806e
+
+ ; STAGE_BLUE_FIELD_TOP
+ padded_dab Func_1c715
+
+ ; STAGE_BLUE_FIELD_BOTTOM
+ padded_dab Func_1c769
+
+ ; STAGE_GENGAR_BONUS
+ padded_dab Func_18377
+
+ ; STAGE_GENGAR_BONUS
+ padded_dab Func_18377
+
+ ; STAGE_MEWTWO_BONUS
+ padded_dab Func_19451
+
+ ; STAGE_MEWTWO_BONUS
+ padded_dab Func_19451
+
+ ; STAGE_MEOWTH_BONUS
+ padded_dab Func_2442a
+
+ ; STAGE_MEOWTH_BONUS
+ padded_dab Func_2442a
+
+ ; STAGE_DIGLETT_BONUS
+ padded_dab Func_19b88
+
+ ; STAGE_DIGLETT_BONUS
+ padded_dab Func_19b88
+
+ ; STAGE_SEEL_BONUS
+ padded_dab Func_25c5a
+
+ ; STAGE_SEEL_BONUS
+ padded_dab Func_25c5a
+
+Func_2862: ; 0x2862
+ ld a, [wd7be]
+ and a
+ jr nz, .asm_287c
+ ld a, [hGameBoyColorFlag]
+ and a
+ jr z, .asm_287b
+ ld a, $0
+ ld hl, Data_2890
+ ld de, $0052
+ ld bc, $0004
+ call FarCopyPalettes
+.asm_287b
+ ret
+
+.asm_287c
+ ld a, [hGameBoyColorFlag]
+ and a
+ jr z, .asm_288f
+ ld a, $0
+ ld hl, Data_2894
+ ld de, $0052
+ ld bc, $0004
+ call FarCopyPalettes
+.asm_288f
+ ret
+
+Data_2890:
+ RGB 31, 31, 31
+ RGB 21, 21, 27
+
+Data_2894:
+ RGB 27, 10, 10
+ RGB 20, 04, 04
+
+Data_2898:
+ dr $2898, $28a0
+
+CopyHLToDE: ; 0x28a0
+; Places [hl] into [de]
+; Also places $0 into [de + 2]
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ xor a
+ ld [de], a
+ ret
+
+UpdateAnimation: ; 0x28a9
+; Updates an animation struct. (See wDugtrioAnimationFrameCounter)
+; Input: de = pointer to 3-byte animation struct
+; hl = pointer to animation frames data
+; Sets carry flag if the animation is over.
+ ld a, [de]
+ and a
+ ret z ; return, if counter is zero
+ dec a
+ ld [de], a
+ ret nz ; return if counter is not zero after the decrement
+ push de
+ inc de
+ inc de
+ ld a, [de] ; a = current frame index
+ inc a
+ ld [de], a
+ ld c, a
+ ld b, $0
+ sla c
+ rl b
+ add hl, bc ; hl = pointer to two-byte entry in the frames data table
+ ld a, [hli]
+ pop de
+ and a
+ scf
+ ret z ; return if the next entry is $00
+ push de
+ ld [de], a ; save the animation duration
+ inc de
+ ld a, [hli]
+ ld [de], a ; save the next animation frame id
+ pop de
+ ret
+
+INCLUDE "text.asm"
+
+Func_30db: ; 0x30db
+ ld a, $86
+ ld [hWY], a
+ ld a, $1
+ ld [wd5ca], a
+ ld [wd5cb], a
+ ret
+
+Func_30e8: ; 0x30e8
+ ld a, $81
+ ld hl, wcBottomMessageText + $100
+ ld b, $40
+.asm_30ef
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ dec b
+ jr nz, .asm_30ef
+ xor a
+ ld [wd5cc], a
+ ld [wd5d4], a
+ ld [wd5dc], a
+ ld [wd5e4], a
+ ld [wd5e9], a
+ ld [wd5ee], a
+ ret
+
+Func_310a: ; 0x310a
+ ld a, $81
+ ld hl, wc600 + $40
+ ld b, $5
+.asm_3111
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ dec b
+ jr nz, .asm_3111
+ ld hl, wc600 + $c0
+ ld b, $5
+.asm_311d
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ dec b
+ jr nz, .asm_311d
+ ret
+
+Func_3125: ; 0x3125
+ ld b, $1
+ jr asm_312b
+
+Func_3129: ; 0x3129
+ ld b, $0
+asm_312b: ; 0x312b
+ ld a, [wd805]
+ and a
+ jp nz, Func_3268
+.next_char
+ ld a, [hli]
+ and a
+ ret z
+ ld c, $81
+ cp " "
+ jr z, .space
+ cp ","
+ jr z, .comma
+ cp "♂"
+ jr z, .male
+ cp "♀"
+ jr z, .female
+ cp "`"
+ jr z, .apostrophe
+ cp "!"
+ jr z, .exclamation
+ cp "x"
+ jr z, .little_x
+ cp "e"
+ jr z, .e_acute
+ cp "*"
+ jr z, .asterisk
+ cp "."
+ jr z, .period
+ cp ":"
+ jr z, .colon
+ cp "0"
+ jr c, .check_atoz
+ cp "9" + 1
+ jr c, .digit
+.check_atoz
+ cp "A"
+ jr c, .invalid
+ cp "Z" + 1
+ jr c, .alphabet
+.invalid
+ jr .next_char
+
+.space
+ ld a, c
+ jr .load_char
+
+.comma
+ inc c
+ dec e
+ jr .check_special_load
+
+.male
+ xor a
+ call Func_31e1
+ ld a, $83
+ jr .load_char
+
+.female
+ ld a, $1
+ call Func_31e1
+ ld a, $84
+ jr .load_char
+
+.apostrophe
+ ld a, $2
+ call Func_31e1
+ ld a, $85
+ jr .load_char
+
+.e_acute
+ ld a, $3
+ call Func_31e1
+ ld a, $83
+ jr .load_char
+
+.asterisk
+ ld a, $4
+ call Func_31e1
+ ld a, $87
+ jr .load_char
+
+.exclamation
+ ld a, $5
+ call Func_31e1
+ ld a, $85
+ jr .load_char
+
+.little_x
+ ld a, $6
+ call Func_31e1
+ ld a, $85
+ jr .load_char
+
+.period
+ ld a, $7
+ call Func_31e1
+ ld a, $86
+ jr .load_char
+
+.colon
+ ld a, $8
+ call Func_31e1
+ ld a, $83
+ jr .load_char
+
+.digit
+ add $56
+ jr .load_char
+
+.alphabet
+ add $bf
+.load_char
+ ld [de], a
+.check_special_load
+ bit 0, b
+ jr nz, .no_special_load
+ set 7, e
+ ld a, c
+ ld [de], a
+ res 7, e
+.no_special_load
+ inc e
+ jp .next_char
+
+Func_31e1: ; 0x31e1
+ push bc
+ push de
+ push hl
+ ld c, a
+ ld a, [hGameBoyColorFlag]
+ and a
+ ld a, c
+ jr z, .asm_31ed
+ add $9
+.asm_31ed
+ ld c, a
+ sla a
+ sla a
+ add c
+ ld c, a
+ ld b, $0
+ ld hl, Data_320e
+ add hl, bc
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, b
+ ld bc, $0010
+ call LoadVRAMData
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Data_320e:
+ dr $320e, $3268
+
+Func_3268: ; 0x3268
+ ld a, [hli]
+ and a
+ ret z
+ ld c, $81
+ cp $20
+ jr z, .asm_3297
+ cp $2c
+ jr z, .asm_329a
+ cp $30
+ jr c, .asm_327d
+ cp $3a
+ jr c, .asm_329e
+.asm_327d
+ cp $a0
+ jr c, .asm_3285
+ cp $e0
+ jr c, .asm_328f
+.asm_3285
+ cp $e0
+ jr c, .asm_328d
+ cp $f4
+ jr c, .asm_3293
+.asm_328d
+ jr Func_3268
+
+.asm_328f
+ sub $80
+ jr .asm_32a0
+
+.asm_3293
+ sub $50
+ jr .asm_32a0
+
+.asm_3297
+ ld a, c
+ jr .asm_32a0
+
+.asm_329a
+ inc c
+ dec e
+ jr .asm_32a1
+
+.asm_329e
+ add $56
+.asm_32a0
+ ld [de], a
+.asm_32a1
+ set 7, e
+ ld a, c
+ ld [de], a
+ res 7, e
+ inc e
+ jr Func_3268
+
+LoadTextHeader: ; 0x32aa
+ ld a, $1
+ ld [hli], a
+ ld a, [de]
+ ld [hli], a
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ push af
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ pop af
+ ld l, a
+ ld h, wcBottomMessageText / $100
+.asm_32c5
+ ld a, [de]
+ ld [hli], a
+ inc de
+ and a
+ jr nz, .asm_32c5
+ ret
+
+Func_32cc: ; 0x32cc
+ ld a, $1
+ ld [hli], a
+ ld a, [de]
+ ld [hli], a
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ push af
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ pop af
+ ld e, a
+ ld d, wcBottomMessageText / $100
+ ld hl, [sp+$5]
+ lb bc, 8, 1
+.asm_32ec
+ ld a, [hl]
+ swap a
+ and $f
+ call Func_3309
+ dec b
+ ld a, [hld]
+ and $f
+ call Func_3309
+ dec b
+ jr nz, .asm_32ec
+ ld a, "0"
+ ld [de], a
+ inc de
+ ld a, " "
+ ld [de], a
+ inc de
+ xor a
+ ld [de], a
+ ret
+
+Func_3309: ; 0x3309
+ jr nz, .asm_3312
+ ld a, b
+ dec a
+ jr z, .asm_3312
+ ld a, c
+ and a
+ ret nz
+.asm_3312
+ add $30
+ ld [de], a
+ inc de
+ ld c, $0
+ ld a, b
+ cp $6
+ jr z, .asm_3320
+ cp $3
+ ret nz
+.asm_3320
+ ld a, $2c
+ ld [de], a
+ inc de
+ ret
+
+Func_3325: ; 0x3325
+ ld a, [hli]
+ and a
+ ret z
+ ld a, [hl]
+ dec a
+ ld [hli], a
+ ret nz
+ ld a, [hld]
+ ld [hl], a
+ inc hl
+ inc hl
+ push hl
+ ld a, [hli]
+ ld e, a
+ cp [hl]
+ inc hl
+ jr nz, .asm_333c
+ ld a, [hl]
+ dec a
+ ld [hl], a
+ jr nz, .asm_333d
+.asm_333c
+ dec e
+.asm_333d
+ push de
+ ld d, wc600 / $100
+ inc hl
+ push hl
+ ld l, [hl]
+ ld h, wcBottomMessageText / $100
+ call Func_3129
+ pop hl
+ inc hl
+ ld a, [hl]
+ dec a
+ ld [hl], a
+ pop de
+ pop hl
+ ld [hl], e
+ ret nz
+ dec hl
+ dec hl
+ dec hl
+ ld [hl], $0
+ ret
+
+Func_3357: ; 0x3357
+ ld a, $1
+ ld [hli], a
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ push af
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ pop af
+ ld l, a
+ ld h, wcBottomMessageText / $100
+.asm_336b
+ ld a, [de]
+ ld [hli], a
+ inc de
+ and a
+ jr nz, .asm_336b
+ ret
+
+Func_3372: ; 0x3372
+ ld a, $1
+ ld [hli], a
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ push af
+ inc de
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hli], a
+ pop af
+ ld e, a
+ ld d, wcBottomMessageText / $100
+ ld hl, [sp+$5]
+ lb bc, 8, 1
+.asm_338a
+ ld a, [hl]
+ swap a
+ and $f
+ call Func_33a7
+ dec b
+ ld a, [hld]
+ and $f
+ call Func_33a7
+ dec b
+ jr nz, .asm_338a
+ ld a, $30
+ ld [de], a
+ inc de
+ ld a, $20
+ ld [de], a
+ inc de
+ xor a
+ ld [de], a
+ ret
+
+Func_33a7: ; 0x33a7
+ jr nz, .asm_33b0
+ ld a, b
+ dec a
+ jr z, .asm_33b0
+ ld a, c
+ and a
+ ret nz
+.asm_33b0
+ add $30
+ ld [de], a
+ inc de
+ ld c, $0
+ ld a, b
+ cp $6
+ jr z, .asm_33be
+ cp $3
+ ret nz
+.asm_33be
+ ld a, $2c
+ ld [de], a
+ inc de
+ ret
+
+Func_33c3: ; 0x33c3
+ ld a, [hli]
+ and a
+ ret z
+ ld a, [hli]
+ ld e, a
+ ld d, wc600 / $100
+ push hl
+ ld l, [hl]
+ ld h, wcBottomMessageText / $100
+ call Func_3129
+ pop hl
+ inc hl
+ ld a, [hl]
+ dec a
+ ld [hli], a
+ ret nz
+ ld a, [hl]
+ dec a
+ ld [hld], a
+ bit 7, a
+ ret z
+ dec hl
+ dec hl
+ dec hl
+ ld [hl], $0
+ ret
+
+Func_33e3: ; 0x33e3
+ ld a, [wd5ca]
+ and a
+ jr nz, .asm_33ed
+ ld [wd5cb], a
+ ret
+
+.asm_33ed
+ ld c, $0
+ ld a, [wd5cc]
+ and a
+ jr z, .asm_33fe
+ push bc
+ ld hl, wd5cc
+ call Func_3325
+ pop bc
+ inc c
+.asm_33fe
+ ld a, [wd5d4]
+ and a
+ jr z, .asm_340d
+ push bc
+ ld hl, wd5d4
+ call Func_3325
+ pop bc
+ inc c
+.asm_340d
+ ld a, [wd5dc]
+ and a
+ jr z, .asm_341c
+ push bc
+ ld hl, wd5dc
+ call Func_3325
+ pop bc
+ inc c
+.asm_341c
+ ld a, [wd5e4]
+ and a
+ jr z, .asm_342b
+ push bc
+ ld hl, wd5e4
+ call Func_33c3
+ pop bc
+ inc c
+.asm_342b
+ ld a, [wd5e9]
+ and a
+ jr z, .asm_343a
+ push bc
+ ld hl, wd5e9
+ call Func_33c3
+ pop bc
+ inc c
+.asm_343a
+ ld a, [wd5ee]
+ and a
+ jr z, .asm_3449
+ push bc
+ ld hl, wd5ee
+ call Func_33c3
+ pop bc
+ inc c
+.asm_3449
+ ld a, c
+ and a
+ ret nz
+ ld [wd5ca], a
+ call Func_30e8
+ ld a, [hGameBoyColorFlag]
+ and a
+ jr nz, .gameboyColor
+ ld a, Bank(StageRedFieldTopStatusBarSymbolsGfx_GameBoy)
+ ld hl, $30 + StageRedFieldTopStatusBarSymbolsGfx_GameBoy
+ ld de, $8830
+ ld bc, $0040
+ call LoadOrCopyVRAMData
+ ret
+
+.gameboyColor
+ ld a, Bank(StageRedFieldTopStatusBarSymbolsGfx_GameBoyColor)
+ ld hl, $30 + StageRedFieldTopStatusBarSymbolsGfx_GameBoyColor
+ ld de, $8830
+ ld bc, $0040
+ call LoadOrCopyVRAMData
+ ret
+
+Func_3475: ; 0x3475
+ xor a
+ ld [hJoypadState], a
+ ld [hNewlyPressedButtons], a
+ ld [hPressedButtons], a
+ call HandleTilts
+ ld a, [wCurrentStage]
+ bit 0, a
+ ld [hFarCallTempA], a
+ ld a, Bank(HandleFlippers)
+ ld hl, HandleFlippers
+ call nz, BankSwitch
+ ld [hFarCallTempA], a
+ callba Func_84b7
+ call Func_33e3
+ call Func_926
+ rst AdvanceFrame
+ ld a, [wd5ca]
+ and a
+ jr nz, Func_3475
+ ret
+
+FivePoints: ; 34a6
+ bigBCD6 000000000005
+TenPoints: ; 34ac
+ bigBCD6 000000000010
+OneHundredPoints: ; 34b2
+ bigBCD6 000000000100
+FourHundredPoints: ; 34b8
+ bigBCD6 000000000400
+FiveHundredPoints: ; 34be
+ bigBCD6 000000000500
+OneThousandPoints: ; 34c4
+ bigBCD6 000000001000
+FiveThousandPoints: ; 34ca
+ bigBCD6 000000005000
+TenThousandPoints: ; 34d0
+ bigBCD6 000000010000
+OneHundredThousandPoints: ; 34d6
+ bigBCD6 000000100000
+ThreeHundredThousandPoints: ; 34dc
+ bigBCD6 000000300000
+FiveHundredThousandPoints: ; 34e2
+ bigBCD6 000000500000
+OneMillionPoints: ; 34e8
+ bigBCD6 000001000000
+FiveMillionPoints: ; 34ee
+ bigBCD6 000005000000
+TenMillionPoints: ; 34f4
+ bigBCD6 000010000000
+OneHundredMillionPoints: ; 34fa
+ bigBCD6 000100000000
+
+Func_3500:
+ ld hl, wd464
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hli], a
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ld bc, wd464
+ ldh [hFarCallTempA], a
+ callba AddBCDScore
+ ret
+
+Func_351c: ; 0x351c
+ ld hl, wd464
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hli], a
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ld bc, wd464
+ ld [hFarCallTempA], a
+ callba Func_8588
+ ret
+
+Func_3538: ; 0x3538
+; Add BCD value bcde to [wd47a]. Cap at $99999999.
+ ld hl, wd47a
+ ld a, [hl]
+ add e
+ daa
+ ld [hli], a
+ ld a, [hl]
+ adc d
+ daa
+ ld [hli], a
+ ld a, [hl]
+ adc c
+ daa
+ ld [hli], a
+ ld a, [hl]
+ adc b
+ daa
+ ld [hli], a
+ ret nc
+ ld hl, wd47a
+ ld a, $99
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ret
+
+Func_3556: ; 0x3556
+ ld a, [wd47a]
+ ld e, a
+ ld a, [wd47a + 1]
+ ld d, a
+ ld a, [wd47a + 2]
+ ld c, a
+ ld a, [wd47a + 3]
+ ld b, a
+ ret
+
+Func_3567:
+ ld a, l
+ add c
+ daa
+ ld l, a
+ ld a, h
+ adc b
+ daa
+ ld h, a
+ ret
+
+Func_3570:
+ ld a, l
+ add e
+ daa
+ ld l, a
+ ld a, h
+ adc d
+ daa
+ ld h, a
+ ret
+
+Func_3579: ; 0x3579
+ ld hl, wd47a
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ret
+
+HandleTilts: ; 0x3582
+ call HandleLeftTilt
+ call HandleRightTilt
+ call HandleUpperTilt
+ ret
+
+HandleLeftTilt: ; 0x358c
+ ld a, [wLeftTiltReset]
+ and a
+ jr nz, .tiltCoolDown
+ ld hl, wKeyConfigLeftTilt
+ call IsKeyPressed2
+ jr z, .tiltCoolDown
+ ld a, [wLeftTiltCounter]
+ cp $3
+ jr z, .startCoolDown
+ inc a
+ ld [wLeftTiltCounter], a
+ cp $1
+ jr nz, .skipSoundEffect
+ ld de, $003f
+ call PlaySoundEffect
+.skipSoundEffect
+ ld a, [wd548]
+ ld hl, wd549
+ and [hl]
+ jr z, .skipBallMovement
+ ld a, [wBallXPos + 1]
+ dec a ; move ball's position to the left by 1 pixel
+ ld [wBallXPos + 1], a
+.skipBallMovement
+ ld a, [wd79f]
+ inc a
+ ld [wd79f], a
+ ld a, $1
+ ld [wLeftTiltPushing], a
+ ret
+
+.startCoolDown
+ ld a, $1
+ ld [wLeftTiltReset], a
+.tiltCoolDown
+ xor a
+ ld [wLeftTiltPushing], a
+ ld a, [wLeftTiltCounter]
+ and a
+ jr z, .done
+ dec a
+ ld [wLeftTiltCounter], a
+ ld a, [wd79f]
+ dec a
+ ld [wd79f], a
+ ret
+
+.done
+ ld hl, wKeyConfigLeftTilt
+ call IsKeyPressed2
+ ret nz
+ xor a
+ ld [wLeftTiltReset], a
+ ret
+
+HandleRightTilt: ; 0x35f3
+ ld a, [wRightTiltReset]
+ and a
+ jr nz, .tiltCoolDown
+ ld hl, wKeyConfigRightTilt
+ call IsKeyPressed2
+ jr z, .tiltCoolDown
+ ld a, [wRightTiltCounter]
+ cp $3
+ jr z, .startCoolDown
+ inc a
+ ld [wRightTiltCounter], a
+ cp $1
+ jr nz, .skipSoundEffect
+ ld de, $003f
+ call PlaySoundEffect
+.skipSoundEffect
+ ld a, [wd548]
+ ld hl, wd549
+ and [hl]
+ jr z, .skipBallMovement
+ ld a, [wBallXPos + 1]
+ inc a ; move ball's position to the right by 1 pixel
+ ld [wBallXPos + 1], a
+.skipBallMovement
+ ld a, [wd79f]
+ dec a
+ ld [wd79f], a
+ ld a, $1
+ ld [wRightTiltPushing], a
+ ret
+
+.startCoolDown
+ ld a, $1
+ ld [wRightTiltReset], a
+.tiltCoolDown
+ xor a
+ ld [wRightTiltPushing], a
+ ld a, [wRightTiltCounter]
+ and a
+ jr z, .done
+ dec a
+ ld [wRightTiltCounter], a
+ ld a, [wd79f]
+ inc a
+ ld [wd79f], a
+ ret
+
+.done
+ ld hl, wKeyConfigRightTilt
+ call IsKeyPressed2
+ ret nz
+ xor a
+ ld [wRightTiltReset], a
+ ret
+
+HandleUpperTilt: ; 0x365a
+ ld a, [wUpperTiltReset]
+ and a
+ jr nz, .tiltCoolDown
+ ld hl, wKeyConfigUpperTilt
+ call IsKeyPressed2
+ jr z, .tiltCoolDown
+ ld a, [wUpperTiltCounter]
+ cp $4
+ jr z, .startCoolDown
+ inc a
+ ld [wUpperTiltCounter], a
+ cp $1
+ jr nz, .skipSoundEffect
+ ld de, $003f
+ call PlaySoundEffect
+.skipSoundEffect
+ ld a, [wd548]
+ ld hl, wd549
+ and [hl]
+ jr z, .skipBallMovement
+ ld a, [wBallYPos + 1]
+ inc a ; move ball's position down by 1 pixel
+ ld [wBallYPos + 1], a
+.skipBallMovement
+ ld a, [wd7a0]
+ dec a
+ ld [wd7a0], a
+ ld a, $1
+ ld [wUpperTiltPushing], a
+ ret
+
+.startCoolDown
+ ld a, $1
+ ld [wUpperTiltReset], a
+.tiltCoolDown
+ xor a
+ ld [wUpperTiltPushing], a
+ ld a, [wUpperTiltCounter]
+ and a
+ jr z, .done
+ dec a
+ ld [wUpperTiltCounter], a
+ ld a, [wd7a0]
+ inc a
+ ld [wd7a0], a
+ ret
+
+.done
+ ld hl, wKeyConfigUpperTilt
+ call IsKeyPressed2
+ ret nz
+ xor a
+ ld [wUpperTiltReset], a
+ ret
+
+ApplyTiltForces: ; 0x36c1
+ ld a, [wd548]
+ ld hl, wd549
+ and [hl]
+ ret z
+ ld c, $0
+ ld a, [wUpperTiltPushing]
+ srl a
+ rl c
+ ld a, [wRightTiltPushing]
+ srl a
+ rl c
+ ld a, [wLeftTiltPushing]
+ srl a
+ rl c
+ ld b, $0
+ sla c
+ ld hl, Data_372d
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ bit 7, h
+ ret nz
+ ld a, [wd7ea]
+ ld c, a
+ ld b, $0
+ sla c
+ rl b
+ sla c
+ rl b
+ add hl, bc
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, BANK(TiltLeftOnlyForce)
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [wBallXVelocity]
+ add [hl]
+ ld [wBallXVelocity], a
+ inc hl
+ ld a, [wBallXVelocity + 1]
+ adc [hl]
+ ld [wBallXVelocity + 1], a
+ inc hl
+ ld a, [wBallYVelocity]
+ add [hl]
+ ld [wBallYVelocity], a
+ inc hl
+ ld a, [wBallYVelocity + 1]
+ adc [hl]
+ ld [wBallYVelocity + 1], a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+Data_372d:
+ dw -1 ; no tilt
+ dw TiltLeftOnlyForce
+ dw TiltRightOnlyForce
+ dw -1 ; left + right (cancel)
+ dw TiltUpOnlyForce
+ dw TiltUpLeftForce
+ dw TiltUpRightForce
+ dw TiltUpOnlyForce
+
+SECTION "bank0.2", ROM0 [$3800]
+
+Data_3800:
+ dr $3800, $3980
+
+Data_3980:
+ dr $3980, $3b00
+
+Data_3b00:
+ dr $3b00, $3c80
+
+Data_3c80:
+ dr $3c80, $3e00
+
+SquaresLow:
+x = 0
+rept 256
+ db (x * x) % $100
+x = x + 1
+endr
+
+SquaresHigh:
+x = 0
+rept 256
+ db (x * x) / $100
+x = x + 1
+endr
+
diff --git a/home/serial.asm b/home/serial.asm
new file mode 100755
index 0000000..8e68e6b
--- /dev/null
+++ b/home/serial.asm
@@ -0,0 +1,782 @@
+Func_14c4: ; 14c4 (0:14c4)
+ ld a, [wd8dc]
+ and a
+ jp nz, Func_165f
+ ld a, [wd8ad]
+ cp $7
+ jp z, Func_1612
+ ld a, [wd8af]
+ and a
+ jr nz, .asm_14df
+ call Func_1502
+ jp Func_1663
+
+.asm_14df
+ ld a, [wd8b0]
+ and a
+ jr z, .asm_14fc
+ ld a, [wd8b1]
+ and a
+ jr z, .asm_14fc
+ ld a, [wd8b2]
+ cp $2
+ jr z, .asm_14f7
+ call Func_15e1
+ jr .asm_14ff
+
+.asm_14f7
+ call Func_15f8
+ jr .asm_14ff
+
+.asm_14fc
+ call Func_1527
+.asm_14ff
+ jp Func_1663
+
+Func_1502: ; 1502 (0:1502)
+ ld hl, wd8b9
+ ld c, [hl]
+ inc [hl]
+ ld b, $0
+ ld hl, Data_18ff
+ add hl, bc
+ ld a, [hl]
+ ld [rSB], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ld a, [wd8b9]
+ cp $2
+ ret nz
+ xor a
+ ld [wd8b9], a
+ inc a
+ ld [wd8af], a
+ ret
+
+Func_1527: ; 1527 (0:1527)
+ ld a, [wd8b9]
+ ld c, a
+ ld a, [wd8ba]
+ ld b, a
+ ld a, [wd8bb]
+ ld l, a
+ ld a, [wd8bc]
+ ld h, a
+ add hl, bc
+ ld a, [rSB]
+ ld [wd8c8 + 1], a
+ ld a, [hl]
+ ld [rSB], a
+ ld l, a
+ ld a, [wd8c3]
+ add l
+ ld [wd8c3], a
+ ld a, [wd8c4]
+ adc $0
+ ld [wd8c4], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ld hl, wd8b9
+ inc [hl]
+ jr nz, .asm_1560
+ inc hl
+ inc [hl]
+.asm_1560
+ ld hl, wd8b9
+ ld a, [wd8b3]
+ cp [hl]
+ jr nz, .asm_1570
+ inc hl
+ ld a, [wd8b4]
+ cp [hl]
+ jr z, .asm_1572
+.asm_1570
+ jr .asm_15b0
+
+.asm_1572
+ ld hl, wd8b0
+ ld a, [hl]
+ and a
+ jr z, .asm_157c
+ ld hl, wd8b1
+.asm_157c
+ inc [hl]
+ ld a, [wd8cc]
+ and a
+ jr z, .asm_15b5
+ ld a, [wd8ad]
+ cp $6
+ jr z, .asm_15b5
+ ld hl, wd8b1
+ ld a, [hl]
+ and a
+ jr nz, .asm_15b1
+ xor a
+ ld [wd8b9], a
+ ld [wd8ba], a
+ ld a, [wd8bf]
+ ld [wd8bb], a
+ ld a, [wd8c0]
+ ld [wd8bc], a
+ ld a, [wd8b7]
+ ld [wd8b3], a
+ ld a, [wd8b8]
+ ld [wd8b4], a
+.asm_15b0
+ ret
+
+.asm_15b1
+ call Func_15c8
+ ret
+
+.asm_15b5
+ ld a, [wd8c8 + 1]
+ ld [wd8c8], a
+asm_15bb
+ ld a, $7
+ ld [wd8ad], a
+ ld a, $1
+ ld [wd8c5], a
+ call Func_16bf
+Func_15c8: ; 15c8 (0:15c8)
+ ld a, [wd8b5]
+ ld [wd8b3], a
+ ld a, [wd8b6]
+ ld [wd8b4], a
+ ld a, [wd8bd]
+ ld [wd8bb], a
+ ld a, [wd8be]
+ ld [wd8bc], a
+ ret
+
+Func_15e1: ; 15e1 (0:15e1)
+ ld c, a
+ ld b, $0
+ ld hl, wd8c3
+ add hl, bc
+ ld a, [hl]
+ ld [rSB], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ld hl, wd8b2
+ inc [hl]
+ ret
+
+Func_15f8: ; 15f8 (0:15f8)
+ ld a, [rSB]
+ ld [wd8c8], a
+ xor a
+ ld [rSB], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ld hl, wd8c6
+ inc [hl]
+ ld a, [hl]
+ cp $2
+ jr z, asm_15bb
+ ret
+
+Func_1612: ; 1612 (0:1612)
+ ld a, [wd8cb]
+ ld [wd8ae], a
+ ld a, [wd8c7]
+ ld [wd86e + 2], a
+ cp $ff
+ jr z, .asm_1625
+ ld [wd86e + 1], a
+.asm_1625
+ ld a, [rSB]
+ ld [wd8c7], a
+ cp $ff
+ jr nz, .asm_163a
+ ld a, $0
+ ld [wd8db], a
+ ld [wd8ad], a
+ ld a, $2
+ jr .asm_1652
+
+.asm_163a
+ bit 1, a
+ jr z, .asm_1643
+ ld a, $1
+ ld [wd8e2], a
+.asm_1643
+ bit 4, a
+ ld a, $0
+ ld [wd8ad], a
+ ld a, $1
+ jr nz, .asm_1651
+ ld [wd8ad], a
+.asm_1651
+ inc a
+.asm_1652
+ ld [wd8c5], a
+ ld a, [wd8cc]
+ and a
+ jr nz, Func_165f
+ xor a
+ ld [wd8db], a
+Func_165f: ; 165f (0:165f)
+ ret
+
+Func_1660:
+ xor a
+ ld [rSC], a
+Func_1663: ; 1663 (0:1663)
+ ret
+
+Func_1664:
+ push af
+ ld a, [rSC]
+ bit 7, a
+ jr nz, .asm_1679
+ push bc
+ push de
+ push hl
+ ld a, $1
+ ld [wd8ca], a
+ call Func_14c4
+ pop hl
+ pop de
+ pop bc
+.asm_1679
+ pop af
+ reti
+Func_167b: ; 0x167b
+ ld a, [wd8ad]
+ cp $1
+ ret nz
+ ld a, [wd8c7]
+ cp $ff
+ ret z
+ ld a, [wd8db]
+ and a
+ ret nz
+ ld hl, wd8e0
+ inc [hl]
+ ld a, [hl]
+ cp $6
+ ret c
+ xor a
+ ld [hl], a
+ ld [wd8e2], a
+ call Func_18ac
+ ret
+
+Func_169d:
+ xor a
+ ld [rSC], a
+ ld [rSB], a
+ ; fallthrough
+
+Func_16a2: ; 0x16a2
+ xor a
+ ld [rSB], a
+ ld [rSC], a
+ ld [wd8ad], a
+ dec a
+ ld [wd8c7], a
+ ld [wd8c8], a
+ call Func_16b5
+ ret
+
+Func_16b5: ; 0x16b5
+ xor a
+ ld [wd8c5], a
+ ld [wd8ca], a
+ ld [wd8db], a
+ ; fall through
+Func_16bf: ; 0x16bf
+ xor a
+ ld [wd8af], a
+ ld [wd8b0], a
+ ld [wd8b1], a
+ ld [wd8b2], a
+ ld [wd8c6], a
+ ld [wd8c3], a
+ ld [wd8c4], a
+ ld [wd8b9], a
+ ld [wd8ba], a
+ ld [wd8dc], a
+ ld [wd8e2], a
+ ret
+
+Func_16e2: ; 0x16e2
+ ld a, [wd8db]
+ and a
+ jr z, .asm_16ec
+ call Func_16fd
+ ret nc
+.asm_16ec
+ ld a, [wd8ae]
+ cp $1
+ jr nz, .asm_16f7
+ call Func_16fd
+ ret nc
+.asm_16f7
+ call Func_1925
+ jp Func_19e5
+
+Func_16fd: ; 0x16fd
+ ld a, [wd8c5]
+ cp $2
+ jr nz, .asm_173c
+ xor a
+ ld [wd8e0], a
+ ld [wd8ae], a
+ inc a
+ ld [wd8ad], a
+ ld a, [wd8c7]
+ cp $ff
+ jr z, .asm_1735
+ bit 0, a
+ jr nz, .asm_172e
+ bit 1, a
+ jr nz, .asm_172e
+ bit 4, a
+ jr z, .asm_173a
+ xor a
+ ld [wd8ad], a
+ ld [wd8ae], a
+ ld a, [wd8c7]
+ jr .asm_173a
+
+.asm_172e
+ scf
+ ret
+
+.asm_1730
+ xor a
+ ld [wd8ae], a
+ dec a
+.asm_1735
+ inc a
+ ld [wd8ad], a
+ dec a
+.asm_173a
+ and a
+ ret
+
+.asm_173c
+ xor a
+ ld a, $f0
+ ret
+
+Func_1740: ; 0x1740
+ ld a, [wd8ad]
+ cp $1
+ jr z, .asm_1752
+ cp $2
+ jr z, .asm_1752
+ and a
+ ld a, $ff
+ ret z
+.asm_174f
+ ld a, $f0
+ ret
+
+.asm_1752
+ ld a, [wd8e2]
+ and a
+ jr nz, .asm_174f
+ ld a, [wd8db]
+ and a
+ jr z, .asm_1762
+ call Func_16fd
+ ret nc
+.asm_1762
+ ld a, [wd8ae]
+ cp $2
+ jr nz, .asm_176d
+ call Func_16fd
+ ret nc
+.asm_176d
+ ld a, [wd8c7]
+ cp $ff
+ ret z
+ call Func_1932
+ jp Func_19e5
+
+Func_1779: ; 0x1779
+ ld c, a
+ ld a, [wd8ad]
+ and a
+ ld a, [wd8c7]
+ ret z
+ ld a, [wd8ad]
+ cp $1
+ jr z, .asm_1790
+ cp $3
+ jr z, .asm_1790
+ ld a, $f0
+ ret
+
+.asm_1790
+ ld a, [wd8db]
+ and a
+ jr nz, .asm_17df
+ ld a, c
+ inc a
+ ld [wd8de], a
+ ld a, l
+ ld [wd8c1], a
+ ld a, h
+ ld [wd8c2], a
+ ld a, [wd8c7]
+ cp $ff
+ ret z
+ ld a, [wd8ab]
+ ld [wd8ac], a
+ and a
+ jr z, .asm_17d6
+ ld a, [wd8de]
+ dec a
+ dec a
+ push af
+ ld c, a
+ ld b, $0
+ push hl
+ ld hl, wd89d
+ add hl, bc
+ ld a, [hl]
+ pop hl
+ ld [wd8ac], a
+ pop af
+ add a
+ ld c, a
+ ld b, $0
+ push hl
+ ld hl, wd88b
+ add hl, bc
+ ld a, [hli]
+ ld b, [hl]
+ pop hl
+ ld c, a
+ jp .asm_17d9
+
+.asm_17d6
+ ld bc, $0280
+.asm_17d9
+ call Func_1989
+ jp Func_19e5
+
+.asm_17df
+ ld a, [wd8c5]
+ cp $2
+ ld a, $f0
+ jp nz, .asm_1869
+ ld hl, wd8de
+ ld a, [wd8c7]
+ bit 4, a
+ jp nz, .asm_1859
+ bit 1, a
+ jp nz, .asm_1804
+ bit 0, a
+ jp nz, .asm_1804
+ dec [hl]
+ ld a, [wd8c7]
+ jr z, .asm_1860
+.asm_1804
+ ld a, [hl]
+ cp $1
+ jr z, .asm_186a
+ ld bc, $0280
+ ld a, [wd8ab]
+ ld [wd8ac], a
+ and a
+ jr z, .asm_1836
+ ld a, [wd8de]
+ dec a
+ dec a
+ push af
+ ld c, a
+ ld b, $0
+ push hl
+ ld hl, wd89d
+ add hl, bc
+ ld a, [hl]
+ pop hl
+ ld [wd8ac], a
+ pop af
+ add a
+ ld c, a
+ ld b, $0
+ push hl
+ ld hl, wd88b
+ add hl, bc
+ ld a, [hli]
+ ld b, [hl]
+ pop hl
+ ld c, a
+.asm_1836
+ ld a, [wd8c7]
+ bit 1, a
+ jp nz, .asm_184e
+ ld a, [wd8bf]
+ add $80
+ ld [wd8bf], a
+ ld a, [wd8c0]
+ adc $2
+ ld [wd8c0], a
+.asm_184e
+ ld a, [wd8bf]
+ ld l, a
+ ld a, [wd8c0]
+ ld h, a
+ jp .asm_17d9
+
+.asm_1859
+ push af
+ ld a, $1
+ ld [wd8dc], a
+ pop af
+.asm_1860
+ push af
+ xor a
+ ld [wd8cc], a
+ ld [wd8db], a
+ pop af
+.asm_1869
+ ret
+
+.asm_186a
+ ld a, [wd8dd]
+ and a
+ ld a, [wd8c7]
+ jr z, .asm_1860
+ call Func_19d7
+ jp Func_19e5
+
+Func_1879:
+ ld a, [wd8ad]
+ cp $1
+ jr z, .asm_188b
+ cp $3
+ jr z, .asm_188b
+ and a
+ ld a, $ff
+ ret z
+ ld a, $f0
+ ret
+
+.asm_188b
+ ld a, [wd8db]
+ and a
+ jr z, .asm_1895
+ call Func_16fd
+ ret nc
+.asm_1895
+ ld a, [wd8ae]
+ cp $4
+ jr nz, .asm_18a0
+ call Func_16fd
+ ret nc
+.asm_18a0
+ ld a, [wd8c7]
+ cp $ff
+ ret z
+ call Func_19bd
+ jp Func_19e5
+
+Func_18ac: ; 0x18ac
+ ld a, [wd8ad]
+ cp $1
+ jr z, .asm_18be
+ cp $3
+ jr z, .asm_18be
+ and a
+ ld a, $ff
+ ret z
+ ld a, $f0
+ ret
+
+.asm_18be
+ ld a, [wd8db]
+ and a
+ jr z, .asm_18c8
+ call Func_16fd
+ ret nc
+.asm_18c8
+ ld a, [wd8c7]
+ cp $ff
+ ret z
+ call Func_19ca
+ jp Func_19e5
+
+Func_18d4: ; 0x18d4
+ ld [wd8cb], a
+ ld a, d
+ ld [wd8cc], a
+ ld a, l
+ ld [wd8bb], a
+ ld [wd8bd], a
+ ld a, h
+ ld [wd8bc], a
+ ld [wd8be], a
+ ld a, c
+ ld [wd8b3], a
+ ld [wd8b5], a
+ ld a, b
+ ld [wd8b4], a
+ ld [wd8b6], a
+ xor a
+ ld [wd8c5], a
+ call Func_16bf
+ ret
+
+Data_18ff:
+ dr $18ff, $1901
+
+Data_1901:
+ dr $1901, $1909
+
+Data_1909:
+ dr $1909, $190d
+
+Data_190d:
+ dr $190d, $1915
+
+Data_1915:
+ dr $1915, $191d
+
+Data_191d:
+ dr $191d, $1925
+
+Func_1925: ; 0x1925
+ ld a, $1
+ ld d, $0
+ ld hl, Data_1901
+ ld bc, $0008
+ jp Func_18d4
+
+Func_1932: ; 0x19332
+ ld a, $2
+ ld d, $0
+ ld hl, wd8cd
+ ld bc, $000c
+ call Func_18d4
+ ld hl, Data_1909
+ ld de, wd8cd
+ ld bc, $0004
+ call LocalCopyData
+ ld de, $0006
+ ld a, [wd8a8]
+ ld [wd8d1], a
+ call Func_1982
+ ld a, [wd8a9]
+ ld [wd8d2], a
+ call Func_1982
+ ld a, [wd8aa]
+ ld [wd8d3], a
+ call Func_1982
+ ld a, [wd8a7]
+ ld [wd8d4], a
+ call Func_1982
+ ld a, e
+ ld [wd8d5], a
+ ld a, d
+ ld [wd8d6], a
+ xor a
+ ld [wd8d7], a
+ ld [wd8d8], a
+ ret
+
+Func_1982: ; 0x1982
+ add e
+ ld e, a
+ ld a, d
+ adc $0
+ ld d, a
+ ret
+
+Func_1989: ; 0x1989
+ ld a, l
+ ld [wd8bf], a
+ ld a, h
+ ld [wd8c0], a
+ ld a, c
+ ld [wd8b7], a
+ ld a, b
+ ld [wd8b8], a
+ push bc
+ ld a, $3
+ ld d, $1
+ ld hl, wd8cd
+ ld bc, $0004
+ call Func_18d4
+ ld a, [Data_190d]
+ ld [wd8cd], a
+ ld a, [wd8ac]
+ ld [wd8ce], a
+ pop bc
+ ld a, c
+ ld [wd8cf], a
+ ld a, b
+ ld [wd8d0], a
+ ret
+
+Func_19bd: ; 19bd (0:19bd)
+ ld a, $4
+ ld d, $0
+ ld hl, Data_1915
+ ld bc, $8
+ jp Func_18d4
+
+Func_19ca: ; 0x19ca
+ ld a, $5
+ ld d, $0
+ ld hl, Data_191d
+ ld bc, $0008
+ jp Func_18d4
+
+Func_19d7: ; 0x19d7
+ ld a, $6
+ ld d, $1
+ ld hl, Data_190d
+ ld bc, $0008
+ jp Func_18d4
+
+; XXX
+ ret
+
+Func_19e5: ; 0x19e5
+ ld a, [wd8ad]
+ cp $1
+ jr z, .asm_19f8
+ and a
+ jr nz, .asm_19f6
+ ld a, [wd8cb]
+ cp $1
+ jr z, .asm_1a02
+.asm_19f6
+ scf
+ ret
+
+.asm_19f8
+ ld a, [wd8cb]
+ cp $1
+ jr z, .asm_19f6
+ ld [wd8ad], a
+.asm_1a02
+ xor a
+ ld [wd8c5], a
+ ld [wd8ae], a
+ ld a, $1
+ ld [wd8b9], a
+ ld [wd8db], a
+ ld a, [Data_18ff]
+ ld [rSB], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ld a, $f0
+ ret
diff --git a/home/sgb.asm b/home/sgb.asm
new file mode 100755
index 0000000..49f8a00
--- /dev/null
+++ b/home/sgb.asm
@@ -0,0 +1,277 @@
+FarSendSGBPackets: ; 0x12a1
+; send 16*b bytes at a:hl via the joypad register
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ld a, [hl]
+ and $7
+ jr z, .quit
+ ld b, a
+ ld c, $0
+.loop
+ push bc
+ ld a, $0
+ ld [$ff00+c], a
+ ld a, $30
+ ld [$ff00+c], a
+ ld b, $10
+.inner_loop
+ ld e, $8
+ ld a, [hli]
+ ld d, a
+.innermost_loop
+ bit 0, d
+ ld a, $10
+ jr nz, .got_data
+ ld a, $20
+.got_data
+ ld [$ff00+c], a
+ ld a, $30
+ ld [$ff00+c], a
+ rr d
+ dec e
+ jr nz, .innermost_loop
+ dec b
+ jr nz, .inner_loop
+ ld a, $20
+ ld [$ff00+c], a
+ ld a, $30
+ ld [$ff00+c], a
+ pop bc
+ dec b
+ jr z, .quit
+ call SGBWait7000
+ jr .loop
+
+.quit
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+SGBWait7000: ; 0x12ec
+ ld de, 7000
+.asm_12ef
+ nop
+ nop
+ nop
+ dec de
+ ld a, d
+ or e
+ jr nz, .asm_12ef
+ ret
+
+InitSGB: ; 0x12f8
+ ld a, BANK(Data_38010)
+ ld hl, Data_38010
+ call FarSendSGBPackets
+ call SGBWait7000
+ ld a, [rJOYP]
+ and $3
+ cp $3
+ jr nz, .asm_1346
+ ld a, $20
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, $30
+ ld [rJOYP], a
+ ld a, $10
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, $30
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ and $3
+ cp $3
+ jr nz, .asm_1346
+ ld a, BANK(Data_38000)
+ ld hl, Data_38000
+ call FarSendSGBPackets
+ call SGBWait7000
+ and a
+ ret
+
+.asm_1346
+ ld a, BANK(Data_38000)
+ ld hl, Data_38000
+ call FarSendSGBPackets
+ call SGBWait7000
+ scf
+ ret
+
+FarSendSGBPacket_BGMapRows: ; 0x1353
+ ld [hROMBankBuffer], a
+ ld a, [hLoadedROMBank]
+ push af
+ ld a, [hROMBankBuffer]
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ push af
+ push hl
+ ld a, $e4
+ ld [rBGP], a
+ ld de, $0010
+ add hl, de
+ ld de, vTiles1 ; tiles
+ call LocalCopyData
+ ld hl, vBGMap0 ; bgmap
+ ld de, $000c
+ ld a, $80
+ ld c, $d
+.row
+ ld b, $14
+.col
+ ld [hli], a
+ inc a
+ dec b
+ jr nz, .col
+ add hl, de
+ dec c
+ jr nz, .row
+ ld a, $81
+ ld [rLCDC], a
+ ld bc, $0005
+ call SGBWait1750
+ pop hl
+ pop af
+ call FarSendSGBPackets
+ ld bc, $0006
+ call SGBWait1750
+ ld a, [hBGP]
+ ld [rBGP], a
+ ld a, [hLCDC]
+ ld [rLCDC], a
+ pop af
+ ld [hLoadedROMBank], a
+ ld [MBC5RomBank], a
+ ret
+
+SendSGBBorder: ; 0x13a8
+ ld a, [hSGBFlag]
+ and a
+ ret z
+ ld bc, $0078
+ call SGBWait1750
+ call SignalStartSGBBorderTransmission
+ ld a, BANK(Data_3a9e6)
+ ld hl, Data_3a9e6
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld a, BANK(Data_3a9f6)
+ ld hl, Data_3a9f6
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld a, BANK(Data_3aa06)
+ ld hl, Data_3aa06
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld a, BANK(Data_3aa16)
+ ld hl, Data_3aa16
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld a, BANK(Data_3aa26)
+ ld hl, Data_3aa26
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld a, BANK(Data_3aa36)
+ ld hl, Data_3aa36
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld a, BANK(Data_3aa46)
+ ld hl, Data_3aa46
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld a, BANK(Data_3aa56)
+ ld hl, Data_3aa56
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld bc, Data_39166 - Data_38156 - $10
+ ld a, BANK(Data_38156)
+ ld hl, Data_38156
+ call FarSendSGBPacket_BGMapRows
+ ld bc, $0004
+ call SGBWait1750
+ ld bc, Data_3a176 - Data_39166 - $10
+ ld a, BANK(Data_39166)
+ ld hl, Data_39166
+ call FarSendSGBPacket_BGMapRows
+ ld bc, $0004
+ call SGBWait1750
+ ld bc, Data_3a9e6 - Data_3a176 - $10
+ ld a, BANK(Data_3a176)
+ ld hl, Data_3a176
+ call FarSendSGBPacket_BGMapRows
+ ld bc, $0004
+ call SGBWait1750
+ ld bc, Data_38156 - Data_380a6 - $10
+ ld a, BANK(Data_380a6)
+ ld hl, Data_380a6
+ call FarSendSGBPacket_BGMapRows
+ ld bc, $0004
+ call SGBWait1750
+ ld bc, Data_3809a - Data_38030 - $10
+ ld a, BANK(Data_38030)
+ ld hl, Data_38030
+ call FarSendSGBPacket_BGMapRows
+ ld bc, $0004
+ call SGBWait1750
+ ld a, BANK(Data_38020)
+ ld hl, Data_38020
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ret
+
+SignalStartSGBBorderTransmission: ; 0x1489
+ ld a, [hSGBFlag]
+ and a
+ ret z
+ ld a, [hSGBInit]
+ and a
+ ret nz
+ ld a, BANK(Data_3aa66)
+ ld hl, Data_3aa66
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ ld a, $ff
+ ld [hSGBInit], a
+ ret
+
+SGBNormal: ; 0x14a4
+ ld a, [hSGBFlag]
+ and a
+ ret z
+ ld bc, $0002
+ call SGBWait1750
+ ld a, [hSGBInit]
+ and a
+ ret z
+ ld a, BANK(Data_3aa76)
+ ld hl, Data_3aa76
+ call FarSendSGBPackets
+ ld bc, $0004
+ call SGBWait1750
+ xor a
+ ld [hSGBInit], a
+ ret
diff --git a/hram.asm b/hram.asm
index 74950e1..36e2800 100755
--- a/hram.asm
+++ b/hram.asm
@@ -42,4 +42,6 @@ hFFC4 = $FFC4
hLoadedROMBank EQU $FFF8 ; this is updated whenever the code switches ROM Banks
hROMBankBuffer EQU $FFFA
+hSGBFlag EQU $FFFB
+hSGBInit EQU $FFFC
hGameBoyColorFlag EQU $FFFE ; this is set to $01 if a GameBoy Color is running the game. $00, otherwise.
diff --git a/main.asm b/main.asm
index ebfca96..56acd3e 100755
--- a/main.asm
+++ b/main.asm
@@ -2,7614 +2,7 @@ INCLUDE "charmap.asm"
INCLUDE "macros.asm"
INCLUDE "constants.asm"
-SECTION "rst 00", ROM0 [$00]
- di
- jp Entry
-
-SECTION "rst 10", ROM0 [$10]
- jp DelayFrame
-
-SECTION "rst 18", ROM0 [$18]
- jp JumpToFuncInTable
-
-SECTION "rst 20", ROM0 [$20]
- jp Func_486
-
-SECTION "VBlankInt", ROM0 [$40]
- jp VBlank
-
-SECTION "HBlankInt", ROM0 [$48]
- jp LCD
-
-SECTION "TimerInt", ROM0 [$50]
- jp Timer
-
-SECTION "SerialInt", ROM0 [$58]
- jp Serial
-
-SECTION "JoypadInt", ROM0 [$60]
- jp Joypad
-
-SECTION "Entry", ROM0 [$100]
-
-Entry: ; 0x100
- nop
- jp Start
-
-SECTION "Header", ROM0 [$104]
-
- ; The header is generated by rgbfix.
- ; The space here is allocated to prevent code from being overwritten.
- ds $150 - $104
-
-SECTION "Main", ROM0 [$150]
-
-Start: ; 0x150
- ld [hGameBoyColorFlag], a
- ld sp, hGameBoyColorFlag
- di
- xor a
- ld [rIF], a
- ld a, [rLCDC] ; LCD Control
- bit 7, a ; Check if LCD Display is enabled
- jr nz, .LCDDisplayEnabled
- set 7, a
- ld [rLCDC], a
-.LCDDisplayEnabled
- ld bc, $0002
- call Func_948
-.waitForVBlank
- ld a, [rLY] ; LY register (LCDC Y-Coordinate)
- cp 145 ; > 144 means V-Blank
- jr c, .waitForVBlank
- ld a, $81
- ld [rLCDC], a ; Enable LCD Display
- xor a
- ld [rBGP], a ; Clear Palette Data
- ld [rOBP0], a
- ld [rOBP1], a
- ld bc, $0002
- call Func_948
-.waitForVBlank2
- ld a, [rLY] ; LY register (LCDC Y-Coordinate)
- cp 145 ; > 144 means V-Blank
- jr c, .waitForVBlank2
- xor a
- ld [rLCDC], a ; Disable LCD Display
- ld hl, wc000
- ld bc, $2000
- call ClearData ; Clear WRAM Bank 0
- ld hl, vTiles0
- ld bc, $1000
- call ClearData ; Clear First half of VRAM
- ld a, $a
- ld [MBC5SRamEnable], a ; Enable RAM
- ld a, $1
- ld [MBC5RomBank], a ; Load ROM Bank $1
- ld a, $0
- ld [MBC5RomBankOn], a ; Enable ROM Banking Mode
- ld a, $0
- ld [MBC5SRamBank], a ; Set bits 5 and 6 of ROM Bank Number
- ld a, $1
- ld [hLoadedROMBank], a
- ld a, $1
- ld [MBC5RomBankOn], a ; Enable RAM Banking Mode
- ld a, $0
- ld [MBC5SRamBank], a ; Load RAM Bank $0
- ld sp, wdfff ; Initialize stack pointer to the end of WRAM Bank $1
- ld hl, hPushOAM
- ld bc, $007e
- call ClearData ; Clear High RAM (HRAM)
- call WriteDMACodeToHRAM
- call ClearOAMBuffer
- xor a
- ld [wd7fb], a
- ld [wd7fc], a
- ld [wd7fd], a
- ld [hHBlankRoutine], a
- ld [$ffb1], a
- ld [wd8e1], a
- ld [wd7fe], a
- ld [$fffc], a
- ld hl, hLCDC
- xor a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld a, $8f
- ld [hli], a
- ld a, $a6
- ld [hli], a
- ld a, $0
- ld [wd849], a
- ld [wd84a], a
- ld a, Bank(PlaySong_BankF)
- call SetSongBank
- call Func_23b
- ld a, [hGameBoyColorFlag]
- and a
- jr nz, .asm_222
- call Func_12f8
- rl a
- and $1
- ld [$fffb], a
- call Func_13a8
- ld a, [$fffb]
- and a
- jr z, .asm_222
- ld a, $1
- ld [wd917], a
-.asm_222
- ld a, $1
- ld [rIE], a ; Only enable LCD Status interrupt
- ei
- ld a, $ff
- ld [wd810], a
- call Func_97a
- xor a
- ld [wdaa3], a
- ld a, BANK(Func_1ffc)
- ld hl, Func_1ffc
- call BankSwitchSimple
-Func_23b: ; 0x23b
- ld a, [hGameBoyColorFlag]
- cp $11
- jr nz, .asm_248
- ld a, $1
- ld [hGameBoyColorFlag], a
- ld [$fffd], a
- ret
-
-.asm_248
- xor a
- ld [hGameBoyColorFlag], a
- ld [$fffd], a
- ret
-
-SoftReset:
- di
- ld sp, hGameBoyColorFlag
- xor a
- ld [rIF], a
- ld bc, $2
- call Func_948
- ld hl, wc000
- ld bc, $2000
- call ClearData
- ld hl, $8000
- ld bc, $1000
- call ClearData
- ld a, $a
- ld [MBC5SRamEnable], a
- ld a, $1
- ld [MBC5RomBank], a
- ld a, $0
- ld [MBC5RomBankOn], a
- ld a, $0
- ld [MBC5SRamBank], a
- ld a, $1
- ld [hLoadedROMBank], a
- ld a, $1
- ld [MBC5RomBankOn], a
- ld a, $0
- ld [MBC5SRamBank], a
- ld sp, wdfff
- call WriteDMACodeToHRAM
- call ClearOAMBuffer
- xor a
- ld [wd7fb], a
- ld [wd7fc], a
- ld [wd7fd], a
- ld [hHBlankRoutine], a
- ld [$ffb1], a
- ld [wd8e1], a
- ld [wd7fe], a
- ld hl, hLCDC
- xor a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld a, $8f
- ld [hli], a
- ld a, $a6
- ld [hli], a
- ld a, $0
- ld [wd849], a
- ld [wd84a], a
- ld a, $f
- call SetSongBank
- ld a, [$fffb]
- and a
- jr z, .asm_02d5
- ld a, $1
- ld [wd917], a
-.asm_02d5
- ld a, $1
- ld [rIE], a
- ei
- ld a, $ff
- ld [wd810], a
- call Func_97a
- ld a, [hGameBoyColorFlag]
- ld [$fffd], a
- xor a
- ld [wdaa3], a
- ld a, $0
- ld hl, Func_1ffc
- call BankSwitchSimple
- ; fallthrough
-
-VBlank: ; 0x2f2
- push af
- push bc
- push de
- push hl
- call hPushOAM ; OAM DMA transfer
- ld a, [hLCDC]
- ld [rLCDC], a
- call Func_113a
- ei
- ld a, [rLY]
- cp $90
- jr c, .asm_328
- ld hl, hSTAT
- ld c, rSTAT - $ff00
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- inc c
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- inc c
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- ld a, [hli]
- ld [$ff00+c], a
- inc c
- ld a, [hli]
- ld [$ff00+c], a
-.asm_328
- ld a, [hLYC]
- ld [hLastLYC], a
- ld a, [hNextLYCSub]
- ld [hLYCSub], a
- ld a, [hNextFrameHBlankSCX]
- ld [hHBlankSCX], a
- ld a, [hNextFrameHBlankSCY]
- ld [hHBlankSCY], a
- call ReadJoypad
- ld a, [wdaa3]
- and a
- jr nz, .asm_359
- ld a, [hJoypadState]
- cp $f
- jr nz, .asm_359
- ld a, [hNewlyPressedButtons]
- and $f
- jr z, .asm_359
- ld hl, [sp+$8]
- ld [hl], $c3
- inc hl
- ld [hl], $3
- ld a, $1
- ld [wdaa3], a
-.asm_359
- ld hl, hNumFramesSinceLastVBlank
- ld a, [hl]
- inc [hl]
- and a
- jr nz, .asm_365
- ld hl, hNumFramesDropped
- inc [hl]
-.asm_365
- ld hl, hVBlankCount
- inc [hl]
- ld a, [wd8e1]
- and a
- call nz, Func_167b
- ld a, [wd849]
- and a
- jr nz, .asm_37d
- ld a, [wd85d]
- and a
- call nz, Func_504
-.asm_37d
- ld a, [wd84a]
- and a
- jr z, .asm_39d
- xor a
- ld [wd84a], a
- ld a, $1
- ld [wd849], a
- ld a, $bc
- ld [rTMA], a
- ld a, $0
- ld [rTAC], a
- ld hl, rIE
- set 2, [hl]
- ld a, $4
- ld [rTAC], a
-.asm_39d
- ld hl, MBC5SRamBank
- ld a, [wd917]
- and a
- jr nz, .asm_3b5
- ld a, [wd803]
- rrca
- ld [wd803], a
- and $1
- jr z, .asm_3b5
- set 3, [hl]
- jr .asm_3b7
-
-.asm_3b5
- res 3, [hl]
-.asm_3b7
- ld a, [wd4aa]
- and a
- call nz, Func_e69
- pop hl
- pop de
- pop bc
- pop af
- reti
-
-Func_3c3:
- ld a, [rLCDC]
- bit 7, a
- jr z, .asm_03cf
- call Func_cb5
- call Func_576
-.asm_03cf
- ld hl, hSTAT
- res 6, [hl]
- ld hl, rIE
- res 1, [hl]
- xor a
- ld [MBC5SRamEnable], a
- ld [rSB], a
- ld [rSC], a
- ld [rIE], a
- ld [rNR52], a
- ld a, [$fffd]
- ld [hGameBoyColorFlag], a
- jp SoftReset
-
-LCD: ; 0x3ec
- push af
- push bc
- push de
- push hl
- ld a, [hHBlankRoutine]
- sla a
- ld c, a
- ld b, $0
- ld hl, PointerTable_408
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp [hl]
-
-Func_3ff: ; 0x3ff
- ld a, $1
- ld [$ffb5], a
- pop hl
- pop de
- pop bc
- pop af
- reti
-
-PointerTable_408: ; 0x408
- dw Func_fbc
- dw Func_fbf
- dw Func_fea
- dw Func_105d
- dw Func_109e
- dw Func_10a1
- dw Func_10a4
- dw Func_10a7
-
-Timer: ; 0x418
- ei
- push af
- push bc
- push de
- push hl
- ld a, [wd849]
- and a
- jr z, .asm_42a
- ld a, [wd85d]
- and a
- call nz, Func_504
-.asm_42a
- ld a, [wd84a]
- and a
- jr z, .asm_440
- xor a
- ld [wd84a], a
- ld [wd849], a
- ld a, $0
- ld [rTAC], a
- ld hl, rIE
- res 2, [hl]
-.asm_440
- pop hl
- pop de
- pop bc
- pop af
- reti
-
-Serial: ; 0x445
- push af
- push bc
- push de
- push hl
- ld hl, Data_45d ; todo
- push hl
- ld a, [$ffb1]
- sla a
- ld c, a
- ld b, $0
- ld hl, Data_462 ; todo
- add hl, bc
- ld c, [hl]
- inc hl
- ld b, [hl]
- push bc
- ret
-
-Data_45d:
- db $e1, $d1, $c1, $f1, $d9
-
-Data_462:
- db $64, $16, $66, $04, $c9
-
-Joypad: ; 0x467
- reti
-
-DelayFrame: ; 0x468
- ld a, [rLCDC]
- bit 7, a
- ret z
- ld hl, hNumFramesSinceLastVBlank
- xor a
- ld [hl], a
-.asm_472
- ld a, [hl]
- and a
- jr z, .asm_472
- ret
-
-JumpToFuncInTable: ; 0x477
-; Jumps to a function in the pointer table immediately following
-; a "rst JumpTable" call. Function must be in the same Bank as the pointer table.
-; input: a = index of function in table
- sla a
- pop hl
- push de
- ld e, a
- ld d, $0
- add hl, de
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld l, e
- ld h, d
- pop de
- jp [hl]
-
-Func_486: ; 0x486
- rlca
- add l
- ld l, a
- jr nc, .noCarry
- inc h
-.noCarry
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ret
-
-PlaySong: ; 0x490
- ld a, [hLoadedROMBank]
- push af
- ld a, [wCurrentSongBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, e
- ld [wd7bf], a
- ld a, [wCurrentSongBank]
- ld [wd7c0], a
- call PlaySong_BankF ; this function is replicated in multiple banks.
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-PlaySoundEffect: ; 0x4af
-; input: de = sound effect id? I think d specifies something special and e holds the id
- ld a, [wdead]
- and a
- ret nz
- ld a, [wd800]
- and a
- jr z, .asm_4bd
- ld a, d
- and a
- ret z
-.asm_4bd
- ld a, d
- ld [wd800], a
- ld d, $0
- ld a, [hLoadedROMBank]
- push af
- ld a, [wCurrentSongBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- call PlaySoundEffect_BankF ; this function is replicated in multiple banks
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_4d8: ; 0x4d8
- push bc
- push de
- push hl
- ld a, [wddcb]
- ld hl, wddfd
- or [hl]
- ld hl, wde2f
- or [hl]
- and $1
- call z, PlaySoundEffect
- pop hl
- pop de
- pop bc
- ret
-
-PlayCry: ; 0x4ef
-; Plays a Pokemon cry.
-; Input: e = mon id
- ld a, [hLoadedROMBank]
- push af
- ld a, [wCurrentSongBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- call PlayCry_BankF ; this function is replicated in multiple banks
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_504: ; 0x504
- ld a, [hLoadedROMBank]
- push af
- ld a, [wCurrentSongBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- call $4180 ; todo
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [wd801]
- inc a
- ld [wd801], a
- and $3
- ret nz
- ld a, [wd800]
- and a
- ret z
- dec a
- ld [wd800], a
- ret
-
-SetSongBank: ; 0x52c
- di
- ld [wCurrentSongBank], a
- ei
- ret
-
-CallInFollowingTable: ; 0x532
-; Calls a function in a table located immediately after a call to this function.
-; Inputs: a = entry in the table
- ld e, a
- ld d, $0
- sla e
- rl d
- sla e
- rl d ; multiplied a by 4 because entries in the table are 4 bytes each
- pop hl
- add hl, de
- ld e, [hl]
- inc hl
- ld d, [hl]
- inc hl
- ld a, [hl]
- ld h, d
- ld l, e
- jp BankSwitch
-
-BankSwitchSimple: ; 0x549
-; Switches to Bank in register a and jumps to hl.
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a ; Load Bank
- jp [hl]
-
-BankSwitch: ; 0x54f
- ld e, a
- ld a, [hLoadedROMBank] ; currently-loaded Bank
- cp e
- jr z, .doJump
- push af
- ld a, e
- call .loadNewBank
- call .doJump
- pop de
- ld a, d
-.loadNewBank
- push hl
- push de
- ld hl, rIE
- ld d, [hl]
- ld [hl], $0
- ld [MBC5RomBank], a
- ld [hLoadedROMBank], a
- ld [hl], d
- pop de
- pop hl
- ret
-
-.doJump
- ld a, [hFarCallTempE]
- ld e, a
- ld a, [hFarCallTempA]
- jp [hl]
-
-Func_576: ; 0x576
- ld a, [rLCDC]
- bit 7, a
- ret z
- ld a, [hLCDC]
- res 7, a
- ld [hLCDC], a
-.asm_581
- ld a, [rLCDC]
- bit 7, a
- jr nz, .asm_581
- ret
-
-Func_588: ; 0x588
- ld a, [hFFC4]
- and a
- call nz, Func_597
- ld a, [hLCDC]
- set 7, a
- ld [rLCDC], a
- ld [hLCDC], a
- ret
-
-Func_597: ; 0x597
- ld de, rBGPI
- ld a, $80
- ld [de], a
- inc de
- ld b, $8
-.asm_5a0
- ld a, [wd80c]
- call Func_5c2
- dec b
- jr nz, .asm_5a0
- ld de, rOBPI
- ld a, $80
- ld [de], a
- inc de
- ld b, $4
-.asm_5b2
- ld a, [wd80d]
- call Func_5c2
- ld a, [wd80e]
- call Func_5c2
- dec b
- jr nz, .asm_5b2
- ret
-
-Func_5c2: ; 0x5c2
- push bc
- ld b, $4
-.asm_5c5
- push af
- push bc
- and $3
- sla a
- ld c, a
- ld b, $0
- ld hl, Data_5e1
- add hl, bc
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- pop bc
- pop af
- srl a
- srl a
- dec b
- jr nz, .asm_5c5
- pop bc
- ret
-
-Data_5e1:
- dr $5e1, $5e9
-
-Func_5e9:
- ld a, [rIE]
- res 0, a
- ld [rIE], a
- ret
-
-Func_5f0:
- ld a, [rIE]
- set 0, a
- ld [rIE], a
- ret
-
-WriteDMACodeToHRAM: ; 0x5f7
-; Initializes registers hPushOAM - hFarCallTempA
- ld c, $80
- ld b, $a ; number of bytes to load
- ld hl, DMARoutine
-.loop
- ld a, [hli]
- ld [$ff00+c], a ; add register c to $ff00, and store register a into the resulting address
- inc c
- dec b
- jr nz, .loop
- ret
-
-DMARoutine:
-; This routine is initially loaded into hPushOAM - hFarCallTempA by WriteDMACodeToHRAM.
- ld a, (wOAMBuffer >> 8)
- ld [rDMA], a ; start DMA
- ld a, $28
-.waitLoop ; wait for DMA to finish
- dec a
- jr nz, .waitLoop
- ret
-
-WaitForLCD: ; 0x60f
-; Wait for LCD controller to stop reading from both OAM and VRAM because
-; CPU can't access OAM, VRAM, or palette data ($ff69, $ff6b) during this time.
- ld a, [rSTAT] ; LCDC Status register
- and $3
- jr nz, WaitForLCD
- ld a, $a
-.delay10Cycles
- dec a
- jr nz, .delay10Cycles
- ret
-
-Func_61b: ; 0x61b
- ld a, [rLY] ; LY register (LCDC Y-Coordinate)
- cp $40
- jr c, .asm_625
- cp $80
- jr c, .asm_63d
-.asm_625
- ld a, [rLY] ; LY register (LCDC Y-Coordinate)
- cp $40
- jr c, .asm_625
- cp $80
- jr nc, .asm_625
-.asm_62f
- ld a, [rSTAT]
- and $3
- jr nz, .asm_62f ; wait for lcd controller to finish transferring data
- ld a, $15
-.wait
- dec a
- jr nz, .wait
- nop
- nop
- nop
-.asm_63d
- ret
-
-Func_63e: ; 0xc3e
- dec bc
-.asm_63f
- ld [hli], a
- dec bc
- bit 7, b
- jr z, .asm_63f
- ret
-
-Func_646:
- srl b
- rr c
-.asm_064a
- ld a, e
- ld [hli], a
- ld a, d
- ld [hli], a
- dec bc
- ld a, b
- or c
- jr nz, .asm_064a
- ret
-
-ClearData: ; 0x654
-; Clears bc bytes starting at hl.
-; bc can be a maximum of $7fff, since it checks bit 7 of b when looping.
- xor a
- dec bc
-.clearLoop
- ld [hli], a
- dec bc
- bit 7, b
- jr z, .clearLoop
- ret
-
-LocalCopyData: ; 0x65d
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b
- jr nz, LocalCopyData
- ret
-
-FarCopyData: ; 0x666 spooky
-; Copies data from any bank to either working RAM or video RAM
-; Input: hl = address of data to copy
-; a = bank of data to copy
-; de = destination for data
-; bc = number of bytes to copy
- bit 7, h
- jr nz, .copyFromSRAM
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- jr .copyData
-
-.copyFromSRAM
- ld [MBC5SRamBank], a
- and a
-.copyData
- push af
-.copyLoop
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b
- jr nz, .copyLoop
- pop af
- ret nc
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-ReadByteFromBank: ; 0x68f
-; Input: a = bank
-; hl = address of byte to read
-; Output: a = byte at a:hl
- push de
- ld d, a
- ld a, [hLoadedROMBank]
- ld e, a
- ld a, d
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld d, [hl]
- ld a, e
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, d
- pop de
- ret
-
-LoadVideoData: ; 0x6a4
-; Input:
-; hl = address of pointer table
-; a = index of item to load in pointer table
-; This needs more documentation. It loads things like graphics and palettes.
- sla a
- ld c, a
- ld b, $0
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
-.loadItem
- ld a, [hli]
- ld c, a
- and [hl]
- cp $ff ; two consecutive $ff bytes terminate the array
- ret z
- ld a, [hli]
- ld b, a ; bc contains pointer to data to be loaded
- push hl
- push bc
- ld a, [hli] ; a contains bank of data to be loaded
- ld e, [hl]
- inc hl
- ld d, [hl] ; de contains destination address for data
- inc hl
- ld c, [hl]
- inc hl
- ld b, [hl] ; bc contains last word of data struct
- inc hl ; this is a wasted instruction
- pop hl
- call Func_6cb
- pop hl
- ld bc, $0005
- add hl, bc
- jr .loadItem
-
-Func_6cb: ; 0x6cb
- srl b
- rr c
- jp c, Func_6fd ; if lowest bit of bc is set
- jp Func_6d5 ; This jumps to the next instruction... Strange.
-
-Func_6d5: ; 0x6d5
- ld [hROMBankBuffer], a ; save bank of data to be loaded
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer] ; a contains bank of data to be loaded
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a ; switch bank to the bank of data to be loaded
- srl b
- rr c
- rl a
- and $1 ; checks bit 1 of the last word in the data struct
- ld [rVBK], a ; set VRAM Bank
-.copyByte
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, c
- or b ; does bc = 0?
- jr nz, .copyByte
- xor a
- ld [rVBK], a ; set VRAM Bank to Bank 0
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a ; reload the previous ROM Bank
- ret
-
-Func_6fd: ; 0x6fd
- ld [hROMBankBuffer], a ; save bank of data to be loaded
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer] ; a contains bank of data to be loaded
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a ; switch bank to the bank of data to be loaded
- ld a, e
- bit 6, a
- jr nz, .asm_717
- ld de, rBGPI
- call Func_724
- jr z, .asm_71d
- xor a
-.asm_717
- ld de, rOBPI
- call Func_724
-.asm_71d
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_724: ; 0x724
- res 6, a
- ld b, a
- set 7, a
- ld [de], a
- inc de
-.copyByte
- ld a, [hli]
- ld [de], a
- inc b
- dec c
- ret z
- bit 6, b
- jr z, .copyByte
- ret
-
-LoadOrCopyVRAMData: ; 0x735
- push hl
- ld hl, rLCDC
- bit 7, [hl]
- pop hl
- jp z, FarCopyData
- ; fall through
-LoadVRAMData: ; 0x73f
-; This loads some data into VRAM. It waits for the LCD H-Blank to copy the data 4 bytes at a time.
-; input: hl = source of data
-; a = bank of data to load
-; de = destination of data
-; bc = number of bytes to copy
- bit 7, h
- jr nz, .asm_752
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- jr .asm_756
-
-.asm_752
- ld [MBC5SRamBank], a
- and a
-.asm_756
- push af
- call WaitForLCD
-.loop
- call Func_61b
-.waitForHBlank
- ld a, [rSTAT]
- and $3
- jr nz, .waitForHBlank
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- dec bc
- dec bc
- dec bc
- dec bc
- nop
- nop
- nop
- nop
- ld a, b
- or c
- jr nz, .loop
- pop af
- ret nc
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-FarCopyPalettes: ; 0x790
- push hl
- ld hl, rLCDC
- bit 7, [hl]
- pop hl
- jp nz, Func_7dc
- bit 7, h
- jr nz, .asm_7ad
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- jr .asm_7b1
-
-.asm_7ad
- ld [MBC5SRamBank], a
- and a
-.asm_7b1
- push af
- ld a, e
- bit 6, e
- ld de, rBGPI
- jr z, .asm_7bf
- res 6, a
- ld de, rOBPI
-.asm_7bf
- set 7, a
- ld [de], a
- inc de
-.asm_7c3
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- dec bc
- dec bc
- dec bc
- dec bc
- ld a, b
- or c
- jr nz, .asm_7c3
- pop af
- ret nc
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_7dc: ; 0x7dc
- bit 7, h
- jr nz, .asm_7ef
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- jr .asm_7f3
-
-.asm_7ef
- ld [MBC5SRamBank], a
- and a
-.asm_7f3
- push af
- ld a, e
- bit 6, e
- ld de, rBGPI
- jr z, .asm_801
- res 6, a
- ld de, rOBPI
-.asm_801
- push hl
- ld h, d
- ld l, e
- set 7, a
- call PutTileInVRAM
- inc de
- pop hl
- call WaitForLCD
-.asm_80e
- call Func_61b
-.asm_811
- ld a, [rSTAT]
- and $3
- jr nz, .asm_811
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- dec bc
- dec bc
- dec bc
- dec bc
- nop
- nop
- nop
- nop
- ld a, b
- or c
- jr nz, .asm_80e
- pop af
- ret nc
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-PutTileInVRAM: ; 0x848
-; Puts a tile in VRAM.
-; input: a = tile number
-; hl = pointer to VRAM location where tile should be placed
- push af
- call WaitForLCD
- call Func_61b
-.asm_84f
- ld a, [rSTAT]
- and $3
- jr nz, .asm_84f ; wait for lcd controller to finish transferring data
- pop af
- ld [hl], a ; Store tile number in VRAM background map
- ret
-
-Func_858: ; 0x858
- push af
- call WaitForLCD
- call Func_61b
-.asm_85f
- ld a, [rSTAT]
- and $3
- jr nz, .asm_85f
- ld a, $1
- ld [rVBK], a
- pop af
- ld [hl], a
- xor a
- ld [rVBK], a
- ret
-
-Func_86f: ; 0x86f
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [rLCDC]
- bit 7, a
- jr nz, .asm_8ac
- ld a, $1
- ld [rVBK], a
- ld b, $4
-.asm_887
- push bc
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld bc, $001a
- add hl, bc
- pop bc
- dec b
- jr nz, .asm_887
- xor a
- ld [rVBK], a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-.asm_8ac
- ld b, $4
-.asm_8ae
- push bc
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc hl
- inc de
- ld a, [de]
- call Func_858
- inc de
- ld bc, $001b
- add hl, bc
- pop bc
- dec b
- jr nz, .asm_8ae
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_8e1: ; 0x8e1
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [rLCDC]
- bit 7, a
- jr nz, .asm_902
- ld a, c
- ld [hli], a
-.asm_8f5
- ld a, [de]
- ld [hl], a
- inc de
- dec b
- jr nz, .asm_8f5
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-.asm_902
- ld a, c
- call PutTileInVRAM
- inc hl
-.asm_907
- ld a, [de]
- call PutTileInVRAM
- inc de
- dec b
- jr nz, .asm_907
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-ClearOAMBuffer: ; 0x916
-; Clears the OAM buffer by loading $f0 into all of the entries.
- ld hl, wOAMBuffer ; 0xd000
- ld b, 4 * 40 ; wOAMBuffer is 4 * 40 bytes long (40 OAM entries, 4 bytes each)
- ld a, $f0 ; byte to write
-.loop
- ld [hli], a
- dec b
- jr nz, .loop
- xor a
- ld [wd802], a
- ret
-
-Func_926: ; 0x926
- ld a, [wd802]
- cp $a0
- jr nc, .asm_93a
- ld l, a
- ld h, $d0
- cpl
- add $a1
- ld b, a
- ld a, $f0
-.asm_936
- ld [hli], a
- dec b
- jr nz, .asm_936
-.asm_93a
- xor a
- ld [wd802], a
- ret
-
-Func_93f: ; 0x93f
- push bc
- rst AdvanceFrame
- pop bc
- dec bc
- ld a, c
- or b
- jr nz, Func_93f
- ret
-
-Func_948: ; 0x948
- ld de, $06d6
-.asm_94b
- nop
- nop
- nop
- dec de
- ld a, d
- or e
- jr nz, .asm_94b
- dec bc
- ld a, b
- or c
- jr nz, Func_948
- ret
-
-GenRandom: ; 0x959
- push bc
- push de
- push hl
- ld a, [wd811]
- ld c, a
- ld b, $0
- inc a
- cp $37
- jr nz, .asm_96e
- call Func_9fa
- xor a
- ld bc, $0000
-.asm_96e
- ld [wd811], a
- ld hl, wd812
- add hl, bc
- ld a, [hl]
- pop hl
- pop de
- pop bc
- ret
-
-Func_97a: ; 0x97a
- ld a, [wd810]
- ld d, a
- ld a, $0
- ld a, [$afff]
-.asm_983
- cp d
- jr c, .asm_989
- sub d
- jr .asm_983
-
-.asm_989
- ld [wd80f], a
- ld [wd848], a
- ld e, $1
- ld hl, Data_9c4 ; todo
- ld a, $36
-.asm_996
- push af
- ld c, [hl]
- inc hl
- ld b, $0
- push hl
- ld hl, wd812
- add hl, bc
- ld [hl], e
- ld a, [wd80f]
- sub e
- jr nc, .asm_9a8
- add d
-.asm_9a8
- ld e, a
- ld a, [hl]
- ld [wd80f], a
- pop hl
- pop af
- dec a
- jr nz, .asm_996
- call Func_9fa
- call Func_9fa
- call Func_9fa
- ld a, $0
- call GenRandom
- ld [$afff], a
- ret
-
-Data_9c4:
- db $14, $29, $07, $1c, $31, $0f, $24, $02, $17
- db $2c, $0a, $1f, $34, $12, $27, $05, $1a, $2f
- db $0d, $22, $00, $15, $2a, $08, $1d, $32, $10
- db $25, $03, $18, $2d, $0b, $20, $35, $13, $28
- db $06, $1b, $30, $0e, $23, $01, $16, $2b, $09
- db $1e, $33, $11, $26, $04, $19, $2e, $0c, $21
-
-Func_9fa: ; 0x9fa
- ld a, [wd810]
- ld d, a
- ld bc, wd812
- ld hl, wd831
- ld e, $18
-.asm_a06
- ld a, [bc]
- sub [hl]
- jr nc, .asm_a0b
- add d
-.asm_a0b
- ld [bc], a
- dec e
- jr nz, .asm_a06
- ld bc, wd82a
- ld hl, wd812
- ld e, $1f
-.asm_a17
- ld a, [bc]
- sub [hl]
- jr nc, .asm_a1c
- add d
-.asm_a1c
- ld [bc], a
- dec e
- jr nz, .asm_a17
- ret
-
-Func_a21: ; 0xa21
- push bc
- push hl
- ld c, a
- ld b, $0
- ld hl, Data_a38
- add hl, bc
- ld l, [hl]
- call GenRandom
- call Func_dd4
- inc h
- srl h
- ld a, h
- pop hl
- pop bc
- ret
-
-Data_a38:
-x = 0
-REPT 128
- db x
-x = x + 2
-IF x == $80
-x = x + 1
-ENDC
-ENDR
-
-ReadJoypad: ; 0xab8
-; Reads the current state of the joypad and saves the state into
-; some registers the game uses during gameplay. It remembers the joypad state
-; from the current frame, previous frame, and two frames ago.
- ld a, $20
- ld [rJOYP], a
- ld a, [rJOYP]
- ld a, [rJOYP]
- and $f
- swap a
- ld b, a
- ld a, $30
- ld [rJOYP], a
- ld a, $10
- ld [rJOYP], a
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- and $f
- or b
- cpl ; a contains currently-pressed buttons
- ld [hJoypadState], a
- ld a, $30
- ld [rJOYP], a
- ld a, [hJoypadState]
- ld hl, hPreviousJoypadState
- xor [hl] ; a contains buttons that are different from previous frame
- push af
- ld hl, hJoypadState
- and [hl] ; a contains newly-pressed buttons compared to last frame
- ld [hNewlyPressedButtons], a
- ld [hPressedButtons], a
- pop af
- ld hl, hPreviousJoypadState
- and [hl] ; a contains newly-pressed buttons compared to two frames ago
- ld [hPrevPreviousJoypadState], a
- ld a, [hJoypadState]
- and a
- jr z, .asm_b15
- ld hl, hPreviousJoypadState
- cp [hl]
- jr nz, .asm_b15
- ; button(s) is pressed, and they're identical to the buttons pressed last frame.
- ; this code is related to holding down a button for an extended period of time.
- ld hl, hJoyRepeatDelay
- dec [hl]
- jr nz, .asm_b1a
- ld a, [hJoypadState]
- ld [hPressedButtons], a
- ld a, [wd807]
- ld [hJoyRepeatDelay], a
- jr .asm_b1a
-
-.asm_b15
- ld a, [wd806]
- ld [hJoyRepeatDelay], a
-.asm_b1a
- ld a, [hJoypadState]
- ld [hPreviousJoypadState], a
- ld hl, wd808
- ld a, [hJoypadState]
- or [hl]
- ld [hli], a
- ld a, [hNewlyPressedButtons]
- or [hl]
- ld [hli], a
- ld a, [hPressedButtons]
- or [hl]
- ld [hli], a
- ret
-
-Func_b2e: ; 0xb2e
- ld hl, wd808
- xor a
- ld [hli], a
- ld [hli], a
- ld [hl], a
- ret
-
-IsKeyPressed2: ; 0xb36
- ld a, [hJoypadState]
- and [hl]
- jr z, .asm_b3e
- cp [hl]
- jr z, .asm_b48
-.asm_b3e
- inc hl
- ld a, [hJoypadState]
- and [hl]
- ret z
- cp [hl]
- jr z, .asm_b48
- xor a
- ret
-
-.asm_b48
- ld a, $1
- and a
- ret
-
-IsKeyPressed: ; 0xb4c
-; Checks if a key for the specified key config is pressed.
-; input: hl = pointer to key config byte pair (e.g. wKeyConfigLeftFlipper)
-; output: zero flag is set if a corresponding key is pressed
-; zero flag is reset if no corresponding key is pressed
- ld a, [hJoypadState]
- and [hl]
- jr z, .asm_b58
- cp [hl]
- jr nz, .asm_b58
- ld a, [hNewlyPressedButtons]
- and [hl]
- ret nz
-.asm_b58
- inc hl
- ld a, [hJoypadState]
- and [hl]
- ret z
- cp [hl]
- jr nz, .asm_b64
- ld a, [hNewlyPressedButtons]
- and [hl]
- ret
-
-.asm_b64
- xor a
- ret
-
-Func_b66: ; 0xb66
- ld a, [hGameBoyColorFlag]
- and a
- jr nz, .asm_b73
- xor a
- ld [hBGP], a
- ld [hOBP0], a
- ld [hOBP1], a
- ret
-
-.asm_b73
- ld de, rBGPI
- ld hl, wPaletteData ; todo
- ld b, $0
- ld c, $20
-.asm_b7d
- ld a, b
- ld [rBGPI], a
- inc b
- ld a, [rBGPD]
- ld [hli], a
- ld a, b
- ld [rBGPI], a
- inc b
- ld a, [rBGPD]
- ld [hli], a
- dec c
- jr nz, .asm_b7d
- ld b, $0
- ld c, $20
-.asm_b92
- ld a, b
- ld [rOBPI], a
- inc b
- ld a, [rOBPD]
- ld [hli], a
- ld a, b
- ld [rOBPI], a
- inc b
- ld a, [rOBPD]
- ld [hli], a
- dec c
- jr nz, .asm_b92
- ld de, rBGPI
- ld b, $2
-.asm_ba8
- ld a, $80
- ld [de], a
- inc de
- ld c, $20
-.asm_bae
- ld a, $ff
- ld [de], a
- ld [hli], a
- ld a, $7f
- ld [de], a
- ld [hli], a
- dec c
- jr nz, .asm_bae
- inc de
- dec b
- jr nz, .asm_ba8
- ret
-
-Func_bbe: ; 0xbbe
- ld a, [hGameBoyColorFlag]
- and a
- jp nz, Func_c19
- ld hl, hBGP
- ld de, wd80c
- ld b, $3
-.asm_bcc
- ld a, [de]
- and $55
- ld c, a
- ld a, [de]
- and $aa
- srl a
- and c
- ld [hli], a
- inc de
- dec b
- jr nz, .asm_bcc
- ld bc, $0002
- call Func_93f
- ld hl, hBGP
- ld de, wd80c
- ld b, $3
-.asm_be9
- ld a, [de]
- and $aa
- srl a
- add [hl]
- ld [hli], a
- inc de
- dec b
- jr nz, .asm_be9
- ld bc, $0002
- call Func_93f
- ld hl, hBGP
- ld de, wd80c
- ld b, $3
-.asm_c02
- ld a, [de]
- and $55
- ld c, a
- ld a, [de]
- and $aa
- srl a
- or c
- add [hl]
- ld [hli], a
- inc de
- dec b
- jr nz, .asm_c02
- ld bc, $0002
- call Func_93f
- ret
-
-Func_c19: ; 0xc19
- ld b, $10
-.asm_c1b
- push bc
- ld de, wPaletteData
- ld hl, wd280
- call Func_c2d
- call Func_d61
- pop bc
- dec b
- jr nz, .asm_c1b
- ret
-
-Func_c2d: ; 0xc2d
- ld a, b
- cp $1
- jr z, .asm_c49
- ld c, $40
-.asm_c34
- push bc
- ld a, [hli]
- sub $42
- ld c, a
- ld a, [hld]
- sbc $8
- ld b, a
- call Func_c60
- ld a, c
- ld [hli], a
- ld a, b
- ld [hli], a
- pop bc
- dec c
- jr nz, .asm_c34
- ret
-
-.asm_c49
- ld c, $40
-.asm_c4b
- push bc
- ld a, [hli]
- sub $21
- ld c, a
- ld a, [hld]
- sbc $4
- ld b, a
- call Func_c60
- ld a, c
- ld [hli], a
- ld a, b
- ld [hli], a
- pop bc
- dec c
- jr nz, .asm_c4b
- ret
-
-Func_c60: ; 0xc60
- push hl
- ld a, [de]
- and $1f
- ld l, a
- ld a, c
- and $1f
- cp l
- jr nc, .asm_c70
- ld a, c
- and $e0
- or l
- ld c, a
-.asm_c70
- ld a, [de]
- and $e0
- ld l, a
- inc de
- ld a, [de]
- srl a
- rr l
- srl a
- rr l
- ld a, c
- and $e0
- ld h, a
- ld a, b
- srl a
- rr h
- srl a
- rr h
- ld a, h
- cp l
- jr nc, .asm_ca3
- ld h, $0
- sla l
- rl h
- sla l
- rl h
- ld a, c
- and $1f
- or l
- ld c, a
- ld a, b
- and $7c
- or h
- ld b, a
-.asm_ca3
- ld a, [de]
- and $7c
- ld l, a
- ld a, b
- and $7c
- cp l
- jr nc, .asm_cb2
- ld a, b
- and $3
- or l
- ld b, a
-.asm_cb2
- inc de
- pop hl
- ret
-
-Func_cb5: ; 0xcb5
- ld a, [hGameBoyColorFlag]
- and a
- jp nz, Func_cee
- ld hl, hBGP
- ld b, $3
-.asm_cc0
- push bc
- push hl
- ld b, $3
-.asm_cc4
- ld a, [hl]
- and $55
- ld c, a
- ld a, [hl]
- and $aa
- srl a
- or c
- cpl
- inc a
- add [hl]
- ld [hli], a
- dec b
- jr nz, .asm_cc4
- ld bc, $0002
- call Func_93f
- pop hl
- pop bc
- dec b
- jr nz, .asm_cc0
- xor a
- ld hl, hBGP
- ld [hli], a
- ld [hli], a
- ld [hl], a
- ld bc, $0002
- call Func_93f
- ret
-
-Func_cee: ; 0xcee
- ld hl, wd280
- ld de, rBGPI
- call Func_d9d
- ld hl, wd2c0
- ld de, rOBPI
- call Func_d9d
- ld b, $10
-.asm_d02
- push bc
- ld hl, wd280
- call Func_d11
- call Func_d61
- pop bc
- dec b
- jr nz, .asm_d02
- ret
-
-Func_d11: ; 0xd11
- ld b, $40
-.asm_d13
- ld a, [hl]
- and $1f
- add $2
- ld e, a
- cp $1f
- jr c, .asm_d1f
- ld e, $1f
-.asm_d1f
- ld a, [hl]
- and $e0
- or e
- ld [hl], a
- ld a, [hli]
- and $e0
- ld e, [hl]
- dec hl
- srl e
- rr a
- srl e
- rr a
- add $10
- ld e, a
- jr nc, .asm_d38
- ld e, $f8
-.asm_d38
- ld d, $0
- sla e
- rl d
- sla e
- rl d
- ld a, [hl]
- and $1f
- or e
- ld [hli], a
- ld a, [hl]
- and $7c
- or d
- ld [hl], a
- ld a, [hl]
- and $7c
- add $8
- ld e, a
- cp $7c
- jr c, .asm_d58
- ld e, $7c
-.asm_d58
- ld a, [hl]
- and $3
- or e
- ld [hli], a
- dec b
- jr nz, .asm_d13
- ret
-
-Func_d61: ; 0d61
- ld a, [rIE]
- res 0, a
- ld [rIE], a
- ld hl, wd280
- ld de, rBGPI
- ld a, $80
- ld [de], a
- inc de
-.asm_d71
- ld a, [rLY]
- cp $90
- jr c, .asm_d71
- ld b, $10
-.asm_d79
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- dec b
- jr nz, .asm_d79
- inc de
- ld a, $80
- ld [de], a
- inc de
- ld b, $10
-.asm_d8b
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- dec b
- jr nz, .asm_d8b
- ld a, [rIE]
- set 0, a
- ld [rIE], a
- ret
-
-Func_d9d: ; 0xd9d
- ld b, $0
- ld c, e
- inc c
- call WaitForLCD
-.asm_da4
- call Func_61b
-.asm_da7
- ld a, [rSTAT]
- and $3
- jr nz, .asm_da7 ; wait for lcd controller to finish transferring data
- ld a, b
- ld [de], a
- ld a, [$ff00+c]
- ld [hli], a
- inc b
- ld a, b
- ld [de], a
- ld a, [$ff00+c]
- ld [hli], a
- inc b
- ld a, b
- ld [de], a
- ld a, [$ff00+c]
- ld [hli], a
- inc b
- ld a, b
- ld [de], a
- ld a, [$ff00+c]
- ld [hli], a
- inc b
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- ld a, b
- cp $40
- jr nz, .asm_da4
- ret
-
-Func_dd4: ; 0xdd4
-; Return a * l to hl
-; Stupid waste of space
- push bc
- ld c, l
- ld b, $0
- ld hl, $0000
- bit 0, a
- jr z, .asm_de0
- add hl, bc
-.asm_de0
- sla c
- rl b
- bit 1, a
- jr z, .asm_de9
- add hl, bc
-.asm_de9
- sla c
- rl b
- bit 2, a
- jr z, .asm_df2
- add hl, bc
-.asm_df2
- sla c
- rl b
- bit 3, a
- jr z, .asm_dfb
- add hl, bc
-.asm_dfb
- sla c
- rl b
- bit 4, a
- jr z, .asm_e04
- add hl, bc
-.asm_e04
- sla c
- rl b
- bit 5, a
- jr z, .asm_e0d
- add hl, bc
-.asm_e0d
- sla c
- rl b
- bit 6, a
- jr z, .asm_e16
- add hl, bc
-.asm_e16
- sla c
- rl b
- bit 7, a
- jr z, .asm_e1f
- add hl, bc
-.asm_e1f
- pop bc
- ret
-
-ConvertHexByteToDecWord: ; 0xe21
-; Convert the base-16 value in register a into a Binary Coded Decimal (base-10) word.
-; Example: If a = $97, de = $0151.
- ld b, a
- ld hl, PowersOfTwo ; todo
- ld de, $0000
-.asm_e28
- srl b
- ld a, [hli]
- jr nc, .asm_e34
- add e
- daa
- ld e, a
- ld a, [hl]
- adc d
- daa
- ld d, a
-.asm_e34
- inc hl
- ld a, b
- and a
- jr nz, .asm_e28
- ret
-
-PowersOfTwo: ; 0xe3a
- dw $0001
- dw $0002
- dw $0004
- dw $0008
- dw $0016
- dw $0032
- dw $0064
- dw $0128
-
-Func_e4a: ; 0xe4a
- ld a, [hl]
- cp $64
- jr z, .asm_e53
- inc a
- ld [hl], a
- scf
- ret
-
-.asm_e53
- and a
- ret
-
-Func_e55: ; 0xe55
- cp c
- jr c, .asm_e5b
- sub c
- jr Func_e55
-
-.asm_e5b
- and a
- ret
-
-Func_e5d: ; 0xe5d
- ld a, $1
- ld [wd84a], a
-.asm_e62
- ld a, [wd84a]
- and a
- jr nz, .asm_e62
- ret
-
-Func_e69: ; 0xe69
- ld a, [rLY]
- cp $90
- jr nc, Func_e69
-.asm_e6f
- ld a, [rSTAT]
- and $3
- jr nz, .asm_e6f
- ld a, $a
-.asm_e77
- dec a
- jr nz, .asm_e77
- ld hl, wcBottomMessageText + $140
- call Func_eef
- push hl
- ld hl, $9c00
- call Func_ef8
- pop hl
- call Func_eef
- push hl
- ld hl, $9c04
- call Func_ef8
- pop hl
- call Func_eef
- push hl
- ld hl, $9c08
- call Func_ef8
- pop hl
- call Func_eef
- push hl
- ld hl, $9c0c
- call Func_ef8
- pop hl
- call Func_eef
- push hl
- ld hl, $9c10
- call Func_ef8
- pop hl
- ld hl, wcBottomMessageText + $1c0
- call Func_eef
- push hl
- ld hl, $9c20
- call Func_ef8
- pop hl
- call Func_eef
- push hl
- ld hl, $9c24
- call Func_ef8
- pop hl
- call Func_eef
- push hl
- ld hl, $9c28
- call Func_ef8
- pop hl
- call Func_eef
- push hl
- ld hl, $9c2c
- call Func_ef8
- pop hl
- call Func_eef
- push hl
- ld hl, $9c30
- call Func_ef8
- pop hl
- ret
-
-Func_eef: ; 0xeef
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld e, a
- ret
-
-Func_ef8: ; 0xef8
- ld a, [rSTAT]
- and $3
- jr nz, Func_ef8
- ld a, b
- ld [hli], a
- ld a, c
- ld [hli], a
- ld a, d
- ld [hli], a
- ld a, e
- ld [hli], a
- ld a, $a
-.asm_f08
- dec a
- jr nz, .asm_f08
- ret
-
-Func_f0c: ; 0xf0c
- call Func_f34
- ret nc
-.asm_f10
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, b
- or c
- jr nz, .asm_f10
- scf
- ret
-
-SaveData: ; 0xf1a
-; Input: hl = data to save
-; bc = number of bytes to save
-; de = destination for saved data
- push bc
- push de
- push hl
-.asm_f1d
- ld a, [hli]
- ld [de], a
- inc de
- dec bc
- ld a, b
- or c
- jr nz, .asm_f1d
- pop hl
- pop de
- pop bc
- ld h, d
- ld l, e
- call Func_f74
- call Func_fa1
- call Func_f4c
- ret
-
-Func_f34: ; 0xf34
- call Func_f62
- jr nc, .asm_f3f
- call Func_f7e
- jr nc, .asm_f3f
- ret
-
-.asm_f3f
- add hl, bc
- inc hl
- inc hl
- inc hl
- inc hl
- call Func_f62
- ret nc
- call Func_f7e
- ret
-
-Func_f4c: ; 0xf4c
- push bc
- push hl
- push de
- inc bc
- inc bc
- inc bc
- inc bc
- ld d, h
- ld e, l
- add hl, bc
-.asm_f56
- ld a, [de]
- ld [hli], a
- inc de
- dec bc
- ld a, b
- or c
- jr nz, .asm_f56
- pop de
- pop hl
- pop bc
- ret
-
-Func_f62: ; 0xf62
- push hl
- add hl, bc
- ld a, [hli]
- cp $4e
- jr nz, .asm_f71
- ld a, [hl]
- cp $54
- jr nz, .asm_f71
- scf
- jr .asm_f72
-
-.asm_f71
- and a
-.asm_f72
- pop hl
- ret
-
-Func_f74: ; 0xf74
- push hl
- add hl, bc
- ld a, $4e
- ld [hli], a
- ld a, $54
- ld [hl], a
- pop hl
- ret
-
-Func_f7e: ; 0xf7e
- push bc
- push de
- push hl
- inc bc
- inc bc
- ld de, $0000
-.asm_f86
- ld a, [hli]
- add e
- ld e, a
- jr nc, .asm_f8c
- inc d
-.asm_f8c
- dec bc
- ld a, b
- or c
- jr nz, .asm_f86
- ld a, [hli]
- cp e
- jr nz, .asm_f9c
- ld a, [hl]
- cp d
- jr nz, .asm_f9c
- scf
- jr .asm_f9d
-
-.asm_f9c
- and a
-.asm_f9d
- pop hl
- pop de
- pop bc
- ret
-
-Func_fa1: ; 0xfa1
- push bc
- push de
- push hl
- inc bc
- inc bc
- ld de, $0000
-.asm_fa9
- ld a, [hli]
- add e
- ld e, a
- jr nc, .asm_faf
- inc d
-.asm_faf
- dec bc
- ld a, b
- or c
- jr nz, .asm_fa9
- ld a, e
- ld [hli], a
- ld a, d
- ld [hl], a
- pop hl
- pop de
- pop bc
- ret
-
-Func_fbc: ; 0xfbc
- jp Func_3ff
-
-Func_fbf: ; 0xfbf
- ld hl, hLastLYC
- ld c, [hl]
- ld a, [rLY]
- cp c
- jp c, Func_3ff
- inc c
- inc c
- cp c
- jp nc, Func_3ff
- ld a, [hLCDCMask]
- ld c, a
- ld a, [hLCDC]
- xor $10
- and c
- ld c, a
- ld hl, rSTAT
-.asm_fdb
- ld a, [hl]
- and $3
- jr nz, .asm_fdb
- ld a, [rLCDC]
- and $80
- or c
- ld [rLCDC], a
- jp Func_3ff
-
-Func_fea: ; 0xfea
- ld hl, hLastLYC
- ld a, [hLYCSub]
- cp [hl]
- jr nz, .asm_1015
- ld a, [rLY]
- cp [hl]
- jp nz, Func_3ff
- ld a, [hLCDC]
- xor $18
- ld c, a
- ld a, [hHBlankSCX]
- ld b, a
- ld hl, rSTAT
-.asm_1003
- ld a, [hl]
- and $3
- jr nz, .asm_1003
- ld a, [rLCDC]
- and $80
- or c
- ld [rLCDC], a
- ld a, b
- ld [rSCY], a
- jp Func_3ff
-
-.asm_1015
- ld a, [rLY]
- cp [hl]
- jr nz, .asm_1037
- ld a, [hLastLYC]
- ld hl, hLYCSub
- sub [hl]
- add $40
- ld c, a
- ld a, [hLYCSub]
- ld b, a
- ld hl, rSTAT
-.asm_1029
- ld a, [hl]
- and $3
- jr nz, .asm_1029
- ld a, c
- ld [rSCY], a
- ld a, b
- ld [rLYC], a
- jp Func_3ff
-
-.asm_1037
- ld hl, hLYCSub
- ld a, [rLY]
- cp [hl]
- jp nz, Func_3ff
- ld a, [hLCDC]
- xor $18
- ld c, a
- ld a, [hHBlankSCX]
- ld b, a
- ld hl, rSTAT
-.asm_104b
- ld a, [hl]
- and $3
- jr nz, .asm_104b
- ld a, [rLCDC]
- and $80
- or c
- ld [rLCDC], a
- ld a, b
- ld [rSCY], a
- jp Func_3ff
-
-Func_105d: ; 0x105d
- ld hl, hLastLYC
- ld a, [rLY]
- cp [hl]
- jr z, .asm_1069
- dec a
- cp [hl]
- jr nz, .asm_1080
-.asm_1069
- ld a, [hLYCSub]
- ld c, a
- ld a, [hHBlankSCX]
- ld b, a
- ld hl, rSTAT
-.asm_1072
- ld a, [hl]
- and $3
- jr nz, .asm_1072
- ld a, b
- ld [rSCY], a
- ld a, c
- ld [rLYC], a
- jp Func_3ff
-
-.asm_1080
- ld hl, hLYCSub
- ld a, [rLY]
- cp [hl]
- jr z, .asm_108d
- dec a
- cp [hl]
- jp nz, Func_3ff
-.asm_108d
- ld a, [hHBlankSCY]
- ld b, a
- ld hl, rSTAT
-.asm_1093
- ld a, [hl]
- and $3
- jr nz, .asm_1093
- ld a, b
- ld [rSCY], a
- jp Func_3ff
-
-Func_109e: ; 0x109e
- jp Func_3ff
-
-Func_10a1: ; 0x10a1
- jp Func_3ff
-
-Func_10a4: ; 0x10a4
- jp Func_3ff
-
-Func_10a7: ; 0x10a7
- jp Func_3ff
-
-Func_10aa: ; 0x10aa
- ld c, a
- ld a, [hli]
- ld b, a
-.asm_10ad
- push bc
- ld a, c
- ld c, [hl]
- inc hl
- ld b, [hl]
- inc hl
- push af
- ld a, [bc]
- ld e, a
- inc bc
- ld a, [bc]
- ld d, a
- inc bc
- pop af
- push hl
- call Func_10c5
- pop hl
- pop bc
- dec b
- jr nz, .asm_10ad
- ret
-
-Func_10c5: ; 0x10c5
- push af
- ld a, [rLCDC]
- bit 7, a
- jr z, .asm_10d2
-.asm_10cc
- ld a, [rLY]
- cp $88
- jr nc, .asm_10cc
-.asm_10d2
- pop af
- ld hl, wd7fb
- ld l, [hl]
- ld h, wcb00 / $100
- inc bc
- ld [hl], c
- inc h
- ld [hl], b
- inc h
- ld [hl], a
- inc h
- ld [hl], e
- inc h
- ld [hl], d
- ld e, $ff
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- dec bc
- ld a, [bc]
- ld hl, wd7fa
- add [hl]
- cp $30
- jr c, .asm_10fe
- ld a, [bc]
- ld e, $0
-.asm_10fe
- add $4
- ld [hl], a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, wd7fb
- ld l, [hl]
- ld h, wca00 / $100
- inc l
- ld [hl], $0
- dec l
- ld [hl], e
- ld hl, wd7fb
- inc [hl]
- ld a, [rLCDC]
- bit 7, a
- ret nz
- ld a, [rIE]
- push af
- res 0, a
- ld [rIE], a
- call Func_113a
- pop af
- ld [rIE], a
- ret
-
-Func_1129: ; 0x1129
- ld a, [wd7fb]
- ld [wd7fc], a
- ret
-
-Func_1130: ; 0x1130
- push hl
- ld a, [wd7fb]
- ld hl, wd7fc
- cp [hl]
- pop hl
- ret
-
-Func_113a: ; 0x113a
- ld hl, wd7fc
- ld a, [wd7fb]
- cp [hl]
- ret z
- ld l, [hl]
- ld h, $ca
- ld [hl], $ff
-.loop
- ld a, [hl]
- and a
- jr z, .done
- push hl
- inc h
- ld e, [hl]
- inc h
- ld d, [hl]
- inc h
- ld a, [hLoadedROMBank]
- push af
- ld a, [hl]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- inc h
- ld a, [hl]
- inc h
- ld h, [hl]
- ld l, a
- call Func_117a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- pop hl
- inc l
- jr .loop
-
-.done
- ld a, l
- ld [wd7fc], a
- ld hl, wd7fb
- cp [hl]
- ret nz
- xor a
- ld [wd7fa], a
- ret
-
-Func_117a: ; 0x117a
- jp [hl]
-
-LoadTileLists: ; 0x117b
-; Loads a series of defined tile ids into VRAM
-; input: de = pointer to data structure
-; data structure: list of VRAM tile data with the following format
-; [num tiles][destination pointer][list of tile ids]
- ld h, d
- ld l, e
-.loadTileSequence
- ld a, [hli]
- and a
- ret z
- ld b, a
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a ; de = destination for tile data
-.loadTileData
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .loadTileData
- jr .loadTileSequence
-
-LoadTileListsBank1: ; 0x118d
- ld a, $1
- ld [rVBK], a
- call LoadTileLists
- xor a
- ld [rVBK], a
- ret
-
-Func_1198:
- ld h, d
- ld l, e
-.asm_119a
- ld a, [hli]
- and a
- ret z
- ld b, a
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- srl b
- jr nc, .asm_11a8
- ld a, [hli]
- ld c, a
-.asm_11a8
- push hl
- ld h, d
- ld l, e
- ld a, c
-.asm_11ac
- ld [hli], a
- inc a
- dec b
- jr nz, .asm_11ac
- ld c, a
- pop hl
- jr .asm_119a
-
-Func_11b5: ; 11b5 (0:11b5)
- ld h, d
- ld l, e
-.asm_11b7
- ld a, [hli]
- and a
- ret z
- ld b, a
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
-.asm_11c0
- ld [de], a
- inc de
- dec b
- jr nz, .asm_11c0
- jr .asm_11b7
-
-Func_11c7:
- ld a, $1
- ld [rVBK], a
- call Func_11b5
- xor a
- ld [rVBK], a
- ret
-
-Func_11d2:
- ld h, d
- ld l, e
- ld a, [hLoadedROMBank]
- ld [$ff94], a
-.asm_11d8
- ld a, [hli]
- and a
- ret z
- ld [$ff95], a
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- push hl
- ld h, b
- ld l, c
- ld a, [$ff95]
- ld b, a
-.asm_11f1
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .asm_11f1
- pop hl
- ld a, [$ff94]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- jr .asm_11d8
-
-Func_122e:
- ld a, $1
- ld [rVBK], a
- ld h, d
- ld l, e
- ld a, [hLoadedROMBank]
- ld [$ff94], a
-.asm_1238
- ld a, [hli]
- and a
- jr nz, .asm_1240
- xor a
- ld [rVBK], a
- ret
-
-.asm_1240
- ld [$ff95], a
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- push hl
- ld h, b
- ld l, c
- ld a, [$ff95]
- ld b, a
-.asm_1256
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .asm_1256
- pop hl
- ld a, [$ff94]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- jr .asm_1238
-
-Func_1266:
- ld h, d
- ld l, e
-.asm_1268
- ld a, [hli]
- and a
- ret z
- ld [$ff94], a
- ld a, [hli]
- bit 6, a
- ld de, rBGPI
- jr z, .asm_127a
- res 6, a
- ld de, rOBPI
-.asm_127a
- set 7, a
- ld [de], a
- inc de
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hli]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- push hl
- ld h, b
- ld l, c
- ld a, [$ff94]
- ld b, a
-.asm_1291
- ld a, [hli]
- ld [de], a
- ld a, [hli]
- ld [de], a
- dec b
- jr nz, .asm_1291
- pop hl
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- jr .asm_1268
-
-Func_12a1: ; 0x12a1
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [hl]
- and $7
- jr z, .asm_12e5
- ld b, a
- ld c, $0
-.asm_12b5
- push bc
- ld a, $0
- ld [$ff00+c], a
- ld a, $30
- ld [$ff00+c], a
- ld b, $10
-.asm_12be
- ld e, $8
- ld a, [hli]
- ld d, a
-.asm_12c2
- bit 0, d
- ld a, $10
- jr nz, .asm_12ca
- ld a, $20
-.asm_12ca
- ld [$ff00+c], a
- ld a, $30
- ld [$ff00+c], a
- rr d
- dec e
- jr nz, .asm_12c2
- dec b
- jr nz, .asm_12be
- ld a, $20
- ld [$ff00+c], a
- ld a, $30
- ld [$ff00+c], a
- pop bc
- dec b
- jr z, .asm_12e5
- call Func_12ec
- jr .asm_12b5
-
-.asm_12e5
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_12ec ; 0x12ec
- ld de, 7000
-.asm_12ef
- nop
- nop
- nop
- dec de
- ld a, d
- or e
- jr nz, .asm_12ef
- ret
-
-Func_12f8: ; 0x12f8
- ld a, BANK(Data_38010)
- ld hl, Data_38010
- call Func_12a1
- call Func_12ec
- ld a, [rJOYP]
- and $3
- cp $3
- jr nz, .asm_1346
- ld a, $20
- ld [rJOYP], a
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, $30
- ld [rJOYP], a
- ld a, $10
- ld [rJOYP], a
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, $30
- ld [rJOYP], a
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- ld a, [rJOYP]
- and $3
- cp $3
- jr nz, .asm_1346
- ld a, BANK(Data_38000)
- ld hl, Data_38000
- call Func_12a1
- call Func_12ec
- and a
- ret
-
-.asm_1346
- ld a, BANK(Data_38000)
- ld hl, Data_38000
- call Func_12a1
- call Func_12ec
- scf
- ret
-
-Func_1353: ; 0x1353
- ld [hROMBankBuffer], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [hROMBankBuffer]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- push af
- push hl
- ld a, $e4
- ld [rBGP], a
- ld de, $0010
- add hl, de
- ld de, vTiles1 ; tiles
- call LocalCopyData
- ld hl, vBGMap0 ; bgmap
- ld de, $000c
- ld a, $80
- ld c, $d
-.asm_1379
- ld b, $14
-.asm_137b
- ld [hli], a
- inc a
- dec b
- jr nz, .asm_137b
- add hl, de
- dec c
- jr nz, .asm_1379
- ld a, $81
- ld [rLCDC], a
- ld bc, $0005
- call Func_948
- pop hl
- pop af
- call Func_12a1
- ld bc, $0006
- call Func_948
- ld a, [hBGP]
- ld [rBGP], a
- ld a, [hLCDC]
- ld [rLCDC], a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Func_13a8: ; 0x13a8
- ld a, [$fffb]
- and a
- ret z
- ld bc, $0078
- call Func_948
- call Func_1489
- ld a, BANK(Data_3a9e6)
- ld hl, Data_3a9e6
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld a, BANK(Data_3a9f6)
- ld hl, Data_3a9f6
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld a, BANK(Data_3aa06)
- ld hl, Data_3aa06
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld a, BANK(Data_3aa16)
- ld hl, Data_3aa16
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld a, BANK(Data_3aa26)
- ld hl, Data_3aa26
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld a, BANK(Data_3aa36)
- ld hl, Data_3aa36
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld a, BANK(Data_3aa46)
- ld hl, Data_3aa46
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld a, BANK(Data_3aa56)
- ld hl, Data_3aa56
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld bc, Data_39166 - Data_38156 - $10
- ld a, BANK(Data_38156)
- ld hl, Data_38156 ; todo
- call Func_1353
- ld bc, $0004
- call Func_948
- ld bc, Data_3a176 - Data_39166 - $10
- ld a, BANK(Data_39166)
- ld hl, Data_39166 ; todo
- call Func_1353
- ld bc, $0004
- call Func_948
- ld bc, Data_3a9e6 - Data_3a176 - $10
- ld a, BANK(Data_3a176)
- ld hl, Data_3a176 ; todo
- call Func_1353
- ld bc, $0004
- call Func_948
- ld bc, Data_38156 - Data_380a6 - $10
- ld a, BANK(Data_380a6)
- ld hl, Data_380a6 ; todo
- call Func_1353
- ld bc, $0004
- call Func_948
- ld bc, Data_3809a - Data_38030 - $10
- ld a, BANK(Data_38030)
- ld hl, Data_38030
- call Func_1353
- ld bc, $0004
- call Func_948
- ld a, BANK(Data_38020)
- ld hl, Data_38020
- call Func_12a1
- ld bc, $0004
- call Func_948
- ret
-
-Func_1489: ; 0x1489
- ld a, [$fffb]
- and a
- ret z
- ld a, [$fffc]
- and a
- ret nz
- ld a, BANK(Data_3aa66)
- ld hl, Data_3aa66 ; todo
- call Func_12a1
- ld bc, $0004
- call Func_948
- ld a, $ff
- ld [$fffc], a
- ret
-
-Func_14a4: ; 0x14a4
- ld a, [$fffb]
- and a
- ret z
- ld bc, $0002
- call Func_948
- ld a, [$fffc]
- and a
- ret z
- ld a, BANK(Data_3aa76)
- ld hl, Data_3aa76
- call Func_12a1
- ld bc, $0004
- call Func_948
- xor a
- ld [$fffc], a
- ret
-
-Func_14c4: ; 14c4 (0:14c4)
- ld a, [wd8dc]
- and a
- jp nz, Func_165f
- ld a, [wd8ad]
- cp $7
- jp z, Func_1612
- ld a, [wd8af]
- and a
- jr nz, .asm_14df
- call Func_1502
- jp Func_1663
-
-.asm_14df
- ld a, [wd8b0]
- and a
- jr z, .asm_14fc
- ld a, [wd8b1]
- and a
- jr z, .asm_14fc
- ld a, [wd8b2]
- cp $2
- jr z, .asm_14f7
- call Func_15e1
- jr .asm_14ff
-
-.asm_14f7
- call Func_15f8
- jr .asm_14ff
-
-.asm_14fc
- call Func_1527
-.asm_14ff
- jp Func_1663
-
-Func_1502: ; 1502 (0:1502)
- ld hl, wd8b9
- ld c, [hl]
- inc [hl]
- ld b, $0
- ld hl, Data_18ff
- add hl, bc
- ld a, [hl]
- ld [rSB], a
- ld a, $1
- ld [rSC], a
- ld a, $81
- ld [rSC], a
- ld a, [wd8b9]
- cp $2
- ret nz
- xor a
- ld [wd8b9], a
- inc a
- ld [wd8af], a
- ret
-
-Func_1527: ; 1527 (0:1527)
- ld a, [wd8b9]
- ld c, a
- ld a, [wd8ba]
- ld b, a
- ld a, [wd8bb]
- ld l, a
- ld a, [wd8bc]
- ld h, a
- add hl, bc
- ld a, [rSB]
- ld [wd8c8 + 1], a
- ld a, [hl]
- ld [rSB], a
- ld l, a
- ld a, [wd8c3]
- add l
- ld [wd8c3], a
- ld a, [wd8c4]
- adc $0
- ld [wd8c4], a
- ld a, $1
- ld [rSC], a
- ld a, $81
- ld [rSC], a
- ld hl, wd8b9
- inc [hl]
- jr nz, .asm_1560
- inc hl
- inc [hl]
-.asm_1560
- ld hl, wd8b9
- ld a, [wd8b3]
- cp [hl]
- jr nz, .asm_1570
- inc hl
- ld a, [wd8b4]
- cp [hl]
- jr z, .asm_1572
-.asm_1570
- jr .asm_15b0
-
-.asm_1572
- ld hl, wd8b0
- ld a, [hl]
- and a
- jr z, .asm_157c
- ld hl, wd8b1
-.asm_157c
- inc [hl]
- ld a, [wd8cc]
- and a
- jr z, .asm_15b5
- ld a, [wd8ad]
- cp $6
- jr z, .asm_15b5
- ld hl, wd8b1
- ld a, [hl]
- and a
- jr nz, .asm_15b1
- xor a
- ld [wd8b9], a
- ld [wd8ba], a
- ld a, [wd8bf]
- ld [wd8bb], a
- ld a, [wd8c0]
- ld [wd8bc], a
- ld a, [wd8b7]
- ld [wd8b3], a
- ld a, [wd8b8]
- ld [wd8b4], a
-.asm_15b0
- ret
-
-.asm_15b1
- call Func_15c8
- ret
-
-.asm_15b5
- ld a, [wd8c8 + 1]
- ld [wd8c8], a
-asm_15bb
- ld a, $7
- ld [wd8ad], a
- ld a, $1
- ld [wd8c5], a
- call Func_16bf
-Func_15c8: ; 15c8 (0:15c8)
- ld a, [wd8b5]
- ld [wd8b3], a
- ld a, [wd8b6]
- ld [wd8b4], a
- ld a, [wd8bd]
- ld [wd8bb], a
- ld a, [wd8be]
- ld [wd8bc], a
- ret
-
-Func_15e1: ; 15e1 (0:15e1)
- ld c, a
- ld b, $0
- ld hl, wd8c3
- add hl, bc
- ld a, [hl]
- ld [rSB], a
- ld a, $1
- ld [rSC], a
- ld a, $81
- ld [rSC], a
- ld hl, wd8b2
- inc [hl]
- ret
-
-Func_15f8: ; 15f8 (0:15f8)
- ld a, [rSB]
- ld [wd8c8], a
- xor a
- ld [rSB], a
- ld a, $1
- ld [rSC], a
- ld a, $81
- ld [rSC], a
- ld hl, wd8c6
- inc [hl]
- ld a, [hl]
- cp $2
- jr z, asm_15bb
- ret
-
-Func_1612: ; 1612 (0:1612)
- ld a, [wd8cb]
- ld [wd8ae], a
- ld a, [wd8c7]
- ld [wd86e + 2], a
- cp $ff
- jr z, .asm_1625
- ld [wd86e + 1], a
-.asm_1625
- ld a, [rSB]
- ld [wd8c7], a
- cp $ff
- jr nz, .asm_163a
- ld a, $0
- ld [wd8db], a
- ld [wd8ad], a
- ld a, $2
- jr .asm_1652
-
-.asm_163a
- bit 1, a
- jr z, .asm_1643
- ld a, $1
- ld [wd8e2], a
-.asm_1643
- bit 4, a
- ld a, $0
- ld [wd8ad], a
- ld a, $1
- jr nz, .asm_1651
- ld [wd8ad], a
-.asm_1651
- inc a
-.asm_1652
- ld [wd8c5], a
- ld a, [wd8cc]
- and a
- jr nz, Func_165f
- xor a
- ld [wd8db], a
-Func_165f: ; 165f (0:165f)
- ret
-
-Func_1660:
- xor a
- ld [rSC], a
-Func_1663: ; 1663 (0:1663)
- ret
-
-Func_1664:
- push af
- ld a, [rSC]
- bit 7, a
- jr nz, .asm_1679
- push bc
- push de
- push hl
- ld a, $1
- ld [wd8ca], a
- call Func_14c4
- pop hl
- pop de
- pop bc
-.asm_1679
- pop af
- reti
-Func_167b: ; 0x167b
- ld a, [wd8ad]
- cp $1
- ret nz
- ld a, [wd8c7]
- cp $ff
- ret z
- ld a, [wd8db]
- and a
- ret nz
- ld hl, wd8e0
- inc [hl]
- ld a, [hl]
- cp $6
- ret c
- xor a
- ld [hl], a
- ld [wd8e2], a
- call Func_18ac
- ret
-
-Func_169d:
- xor a
- ld [rSC], a
- ld [rSB], a
- ; fallthrough
-
-Func_16a2: ; 0x16a2
- xor a
- ld [rSB], a
- ld [rSC], a
- ld [wd8ad], a
- dec a
- ld [wd8c7], a
- ld [wd8c8], a
- call Func_16b5
- ret
-
-Func_16b5: ; 0x16b5
- xor a
- ld [wd8c5], a
- ld [wd8ca], a
- ld [wd8db], a
- ; fall through
-Func_16bf: ; 0x16bf
- xor a
- ld [wd8af], a
- ld [wd8b0], a
- ld [wd8b1], a
- ld [wd8b2], a
- ld [wd8c6], a
- ld [wd8c3], a
- ld [wd8c4], a
- ld [wd8b9], a
- ld [wd8ba], a
- ld [wd8dc], a
- ld [wd8e2], a
- ret
-
-Func_16e2: ; 0x16e2
- ld a, [wd8db]
- and a
- jr z, .asm_16ec
- call Func_16fd
- ret nc
-.asm_16ec
- ld a, [wd8ae]
- cp $1
- jr nz, .asm_16f7
- call Func_16fd
- ret nc
-.asm_16f7
- call Func_1925
- jp Func_19e5
-
-Func_16fd: ; 0x16fd
- ld a, [wd8c5]
- cp $2
- jr nz, .asm_173c
- xor a
- ld [wd8e0], a
- ld [wd8ae], a
- inc a
- ld [wd8ad], a
- ld a, [wd8c7]
- cp $ff
- jr z, .asm_1735
- bit 0, a
- jr nz, .asm_172e
- bit 1, a
- jr nz, .asm_172e
- bit 4, a
- jr z, .asm_173a
- xor a
- ld [wd8ad], a
- ld [wd8ae], a
- ld a, [wd8c7]
- jr .asm_173a
-
-.asm_172e
- scf
- ret
-
-.asm_1730
- xor a
- ld [wd8ae], a
- dec a
-.asm_1735
- inc a
- ld [wd8ad], a
- dec a
-.asm_173a
- and a
- ret
-
-.asm_173c
- xor a
- ld a, $f0
- ret
-
-Func_1740: ; 0x1740
- ld a, [wd8ad]
- cp $1
- jr z, .asm_1752
- cp $2
- jr z, .asm_1752
- and a
- ld a, $ff
- ret z
-.asm_174f
- ld a, $f0
- ret
-
-.asm_1752
- ld a, [wd8e2]
- and a
- jr nz, .asm_174f
- ld a, [wd8db]
- and a
- jr z, .asm_1762
- call Func_16fd
- ret nc
-.asm_1762
- ld a, [wd8ae]
- cp $2
- jr nz, .asm_176d
- call Func_16fd
- ret nc
-.asm_176d
- ld a, [wd8c7]
- cp $ff
- ret z
- call Func_1932
- jp Func_19e5
-
-Func_1779: ; 0x1779
- ld c, a
- ld a, [wd8ad]
- and a
- ld a, [wd8c7]
- ret z
- ld a, [wd8ad]
- cp $1
- jr z, .asm_1790
- cp $3
- jr z, .asm_1790
- ld a, $f0
- ret
-
-.asm_1790
- ld a, [wd8db]
- and a
- jr nz, .asm_17df
- ld a, c
- inc a
- ld [wd8de], a
- ld a, l
- ld [wd8c1], a
- ld a, h
- ld [wd8c2], a
- ld a, [wd8c7]
- cp $ff
- ret z
- ld a, [wd8ab]
- ld [wd8ac], a
- and a
- jr z, .asm_17d6
- ld a, [wd8de]
- dec a
- dec a
- push af
- ld c, a
- ld b, $0
- push hl
- ld hl, wd89d
- add hl, bc
- ld a, [hl]
- pop hl
- ld [wd8ac], a
- pop af
- add a
- ld c, a
- ld b, $0
- push hl
- ld hl, wd88b
- add hl, bc
- ld a, [hli]
- ld b, [hl]
- pop hl
- ld c, a
- jp .asm_17d9
-
-.asm_17d6
- ld bc, $0280
-.asm_17d9
- call Func_1989
- jp Func_19e5
-
-.asm_17df
- ld a, [wd8c5]
- cp $2
- ld a, $f0
- jp nz, .asm_1869
- ld hl, wd8de
- ld a, [wd8c7]
- bit 4, a
- jp nz, .asm_1859
- bit 1, a
- jp nz, .asm_1804
- bit 0, a
- jp nz, .asm_1804
- dec [hl]
- ld a, [wd8c7]
- jr z, .asm_1860
-.asm_1804
- ld a, [hl]
- cp $1
- jr z, .asm_186a
- ld bc, $0280
- ld a, [wd8ab]
- ld [wd8ac], a
- and a
- jr z, .asm_1836
- ld a, [wd8de]
- dec a
- dec a
- push af
- ld c, a
- ld b, $0
- push hl
- ld hl, wd89d
- add hl, bc
- ld a, [hl]
- pop hl
- ld [wd8ac], a
- pop af
- add a
- ld c, a
- ld b, $0
- push hl
- ld hl, wd88b
- add hl, bc
- ld a, [hli]
- ld b, [hl]
- pop hl
- ld c, a
-.asm_1836
- ld a, [wd8c7]
- bit 1, a
- jp nz, .asm_184e
- ld a, [wd8bf]
- add $80
- ld [wd8bf], a
- ld a, [wd8c0]
- adc $2
- ld [wd8c0], a
-.asm_184e
- ld a, [wd8bf]
- ld l, a
- ld a, [wd8c0]
- ld h, a
- jp .asm_17d9
-
-.asm_1859
- push af
- ld a, $1
- ld [wd8dc], a
- pop af
-.asm_1860
- push af
- xor a
- ld [wd8cc], a
- ld [wd8db], a
- pop af
-.asm_1869
- ret
-
-.asm_186a
- ld a, [wd8dd]
- and a
- ld a, [wd8c7]
- jr z, .asm_1860
- call Func_19d7
- jp Func_19e5
-
-Func_1879:
- ld a, [wd8ad]
- cp $1
- jr z, .asm_188b
- cp $3
- jr z, .asm_188b
- and a
- ld a, $ff
- ret z
- ld a, $f0
- ret
-
-.asm_188b
- ld a, [wd8db]
- and a
- jr z, .asm_1895
- call Func_16fd
- ret nc
-.asm_1895
- ld a, [wd8ae]
- cp $4
- jr nz, .asm_18a0
- call Func_16fd
- ret nc
-.asm_18a0
- ld a, [wd8c7]
- cp $ff
- ret z
- call Func_19bd
- jp Func_19e5
-
-Func_18ac: ; 0x18ac
- ld a, [wd8ad]
- cp $1
- jr z, .asm_18be
- cp $3
- jr z, .asm_18be
- and a
- ld a, $ff
- ret z
- ld a, $f0
- ret
-
-.asm_18be
- ld a, [wd8db]
- and a
- jr z, .asm_18c8
- call Func_16fd
- ret nc
-.asm_18c8
- ld a, [wd8c7]
- cp $ff
- ret z
- call Func_19ca
- jp Func_19e5
-
-Func_18d4: ; 0x18d4
- ld [wd8cb], a
- ld a, d
- ld [wd8cc], a
- ld a, l
- ld [wd8bb], a
- ld [wd8bd], a
- ld a, h
- ld [wd8bc], a
- ld [wd8be], a
- ld a, c
- ld [wd8b3], a
- ld [wd8b5], a
- ld a, b
- ld [wd8b4], a
- ld [wd8b6], a
- xor a
- ld [wd8c5], a
- call Func_16bf
- ret
-
-Data_18ff:
- dr $18ff, $1901
-
-Data_1901:
- dr $1901, $1909
-
-Data_1909:
- dr $1909, $190d
-
-Data_190d:
- dr $190d, $1915
-
-Data_1915:
- dr $1915, $191d
-
-Data_191d:
- dr $191d, $1925
-
-Func_1925: ; 0x1925
- ld a, $1
- ld d, $0
- ld hl, Data_1901 ; todo
- ld bc, $0008
- jp Func_18d4
-
-Func_1932: ; 0x19332
- ld a, $2
- ld d, $0
- ld hl, wd8cd
- ld bc, $000c
- call Func_18d4
- ld hl, Data_1909
- ld de, wd8cd
- ld bc, $0004
- call LocalCopyData
- ld de, $0006
- ld a, [wd8a8]
- ld [wd8d1], a
- call Func_1982
- ld a, [wd8a9]
- ld [wd8d2], a
- call Func_1982
- ld a, [wd8aa]
- ld [wd8d3], a
- call Func_1982
- ld a, [wd8a7]
- ld [wd8d4], a
- call Func_1982
- ld a, e
- ld [wd8d5], a
- ld a, d
- ld [wd8d6], a
- xor a
- ld [wd8d7], a
- ld [wd8d8], a
- ret
-
-Func_1982: ; 0x1982
- add e
- ld e, a
- ld a, d
- adc $0
- ld d, a
- ret
-
-Func_1989: ; 0x1989
- ld a, l
- ld [wd8bf], a
- ld a, h
- ld [wd8c0], a
- ld a, c
- ld [wd8b7], a
- ld a, b
- ld [wd8b8], a
- push bc
- ld a, $3
- ld d, $1
- ld hl, wd8cd
- ld bc, $0004
- call Func_18d4
- ld a, [$190d]
- ld [wd8cd], a
- ld a, [wd8ac]
- ld [wd8ce], a
- pop bc
- ld a, c
- ld [wd8cf], a
- ld a, b
- ld [wd8d0], a
- ret
-
-Func_19bd: ; 19bd (0:19bd)
- ld a, $4
- ld d, $0
- ld hl, Data_1915
- ld bc, $8
- jp Func_18d4
-
-Func_19ca: ; 0x19ca
- ld a, $5
- ld d, $0
- ld hl, Data_191d ; todo
- ld bc, $0008
- jp Func_18d4
-
-Func_19d7: ; 0x19d7
- ld a, $6
- ld d, $1
- ld hl, Data_190d ; todo
- ld bc, $0008
- jp Func_18d4
-
-; XXX
- ret
-
-Func_19e5: ; 0x19e5
- ld a, [wd8ad]
- cp $1
- jr z, .asm_19f8
- and a
- jr nz, .asm_19f6
- ld a, [wd8cb]
- cp $1
- jr z, .asm_1a02
-.asm_19f6
- scf
- ret
-
-.asm_19f8
- ld a, [wd8cb]
- cp $1
- jr z, .asm_19f6
- ld [wd8ad], a
-.asm_1a02
- xor a
- ld [wd8c5], a
- ld [wd8ae], a
- ld a, $1
- ld [wd8b9], a
- ld [wd8db], a
- ld a, [$18ff]
- ld [rSB], a
- ld a, $1
- ld [rSC], a
- ld a, $81
- ld [rSC], a
- ld a, $f0
- ret
-
-Func_1a21: ; 0x1a21
- call Func_1a59
- call Func_1a89
- jr c, .asm_1a3f
-.asm_1a29
- call Func_1aa9
- call Func_1b3d
- jr c, .asm_1a3f
- ld a, [wd86c]
- and a
- jr z, .asm_1a29
- call Func_1b60
- jr c, .asm_1a3f
- call Func_1b88
-.asm_1a3f
- call Func_1ba7
- ret
-
-Func_1a43: ; 0x1a43
- xor a
- ld [wd86e], a
- call Func_1a59
- call Func_1a89
- jr c, .asm_1a54
- ld a, $1
- ld [wd86e], a
-.asm_1a54
- call Func_1ba7
- ret
-
- ret ; unused instruction?
-
-Func_1a59: ; 0x1a59
- ld [wd86a], a
- ld a, h
- ld [wd869], a
- ld a, l
- ld [wd868], a
- ld a, $80
- ld [wd866], a
- ld a, $c2
- ld [wd867], a
- xor a
- ld [wd86b], a
- ld [wd86c], a
- ld [wd86d], a
- call Func_16a2
- ld hl, rIE
- set 3, [hl]
- xor a
- ld [$ffb1], a
- ld a, $1
- ld [wd8e1], a
- ret
-
-Func_1a89: ; 0x1a89
- call Func_16e2
- cp $f0
- jr z, .asm_1a9f
- cp $ff
- jp z, Func_1bb2
- ld a, [wd8c8]
- cp $81
- jp nz, Func_1bb2
- and a
- ret
-
-.asm_1a9f
- ld a, [hNewlyPressedButtons]
- bit 1, a
- jp nz, Func_1bd3
- rst AdvanceFrame
- jr Func_1a89
-
-Func_1aa9: ; 0x1aa9
- ld a, [wd866]
- ld l, a
- ld a, [wd867]
- ld h, a
- ld de, wc000
- ld b, $2
-.asm_1ab6
- ld c, $14
-.asm_1ab8
- ld a, [hli]
- call Func_1ae2
- dec c
- jr nz, .asm_1ab8
- ld a, l
- add $c
- ld l, a
- jr nc, .asm_1ac6
- inc h
-.asm_1ac6
- dec b
- jr nz, .asm_1ab6
- ld a, l
- ld [wd866], a
- ld a, h
- ld [wd867], a
- ld a, [wd86b]
- inc a
- ld [wd86b], a
- cp $9
- jr nz, .asm_1ae1
- ld a, $1
- ld [wd86c], a
-.asm_1ae1
- ret
-
-Func_1ae2: ; 0x1ae2
- push bc
- push hl
- xor $80
- swap a
- ld c, a
- and $f
- ld b, a
- ld a, c
- and $f0
- ld c, a
- ld a, [wd868]
- ld l, a
- ld a, [wd869]
- ld h, a
- add hl, bc
- ld a, [hLoadedROMBank]
- push af
- ld a, [wd86a]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc e
- ld a, [hli]
- ld [de], a
- inc de
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- pop hl
- pop bc
- ret
-
-Func_1b3d: ; 0x1b3d
- ld a, [wd86c]
- ld [wd8dd], a
- ld hl, wc000
- ld a, $1
- call Func_1779
- cp $ff
- jp z, Func_1bb2
- cp $f0
- jr z, .asm_1b56
- and a
- ret
-
-.asm_1b56
- ld a, [hNewlyPressedButtons]
- bit BIT_B_BUTTON, a
- jp nz, Func_1bd3
- rst AdvanceFrame
- jr Func_1b3d
-
-Func_1b60: ; 0x1b60
- ld a, $1
- ld [wd8a8], a
- ld a, $13
- ld [wd8a9], a
- call Func_1740
- cp $ff
- jp z, Func_1bb2
- cp $f0
- jr z, .asm_1b7e
- ld bc, $001e
- call Func_93f
- and a
- ret
-
-.asm_1b7e
- ld a, [hNewlyPressedButtons]
- bit BIT_B_BUTTON, a
- jp nz, Func_1bd3
- rst AdvanceFrame
- jr Func_1b60
-
-Func_1b88: ; 0x1b88
- ld a, [wd8c7]
- ld b, a
- cp $ff
- jr z, Func_1bb2
- and $f0
- jr nz, Func_1bb2
- bit 1, b
- jr nz, .asm_1b9d
- call Func_16a2
- and a
- ret
-
-.asm_1b9d
- ld a, [hNewlyPressedButtons]
- bit BIT_B_BUTTON, a
- jp nz, Func_1bd3
- rst AdvanceFrame
- jr Func_1b88
-
-Func_1ba7: ; 0x1ba7
- ld hl, rIE
- res 3, [hl]
- xor a
- ld [wd8e1], a
- and a
- ret
-
-Func_1bb2: ; 0x1bb2
- ld hl, Data_1bcf
- ld a, [wd8c7]
- cp $ff
- jr z, .asm_1bc6
- ld b, $3
-.asm_1bbe
- inc hl
- sla a
- jr c, .asm_1bc6
- dec b
- jr nz, .asm_1bbe
-.asm_1bc6
- ld a, [hl]
- ld [wd86d], a
- call Func_16a2
- scf
- ret
-
-Data_1bcf:
- dr $1bcf, $1bd3
-
-Func_1bd3: ; 0x1bd3
- ld de, $0001
- call PlaySoundEffect
- ld a, $5
- ld [wd86d], a
- call Func_16a2
- scf
- ret
-
-Func_1be3: ; 0x1be3
- ld a, $c0
- ld [rRP], a
- ld a, $ff
- ld [wd8ea], a
- xor a
- ld b, a
-.asm_1bee
- inc a
- jr nz, .asm_1bee
- inc b
- jr nz, .asm_1bee
- ld hl, wd8eb
- ld a, [rKEY1]
- bit 7, a
- jr z, .asm_1c0c
- ld [hl], $e
- inc hl
- ld [hl], $12
- inc hl
- ld [hl], $8
- inc hl
- ld [hl], $c
- inc hl
- ld [hl], $c
- ret
-
-.asm_1c0c
- ld [hl], $6
- inc hl
- ld [hl], $8
- inc hl
- ld [hl], $2
- inc hl
- ld [hl], $4
- inc hl
- ld [hl], $5
- ret
-
-Func_1c1b: ; 0x1c1b
- inc d
- ret z
- ld a, [$ff00+c]
- bit 1, a
- jr z, Func_1c1b
- ret
-
-Func_1c23: ; 0x1c23
- inc d
- ret z
- ld a, [$ff00+c]
- bit 1, a
- jr nz, Func_1c23
- ret
-
-Func_1c2b: ; 0x1c2b
- ld a, $c1
- ld [$ff00+c], a
-.asm_1c2e
- dec d
- jr nz, .asm_1c2e
- ret
-
-Func_1c32: ; 0x1c32
- ld a, $c0
- ld [$ff00+c], a
-.asm_1c35
- dec d
- jr nz, .asm_1c35
- ret
-
-Func_1c39:
- xor a
- ld [hNumFramesSinceLastVBlank], a
- ld a, $1
- ld [wd8e9], a
-.asm_1c41
- ld b, $2
- ld c, rRP % $100
- ld a, [$ff00+c]
- and b
- jr z, Func_1c50
- ld a, [hNumFramesSinceLastVBlank]
- and a
- jr nz, Func_1ca1
- jr .asm_1c41
-
-Func_1c50: ; 0x1c50
- ld a, $1
- ld [wd8e9], a
- ld b, $1a
- ld c, rRP % $100
- ld d, $0
- ld e, d
- call Func_1c23
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, e
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- call Func_1c23
- ld a, d
- and a
- jp z, Func_1dc2
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- cp $8
- jp c, Func_1dc2
- cp $2a
- jp nc, Func_1dc2
- ld a, $0
- ld [wd8ea], a
- ld d, b
- call Func_1c32
- ld d, b
- call Func_1c2b
- ld d, b
- call Func_1c32
- ld d, b
- call Func_1c2b
- ld d, b
- call Func_1c32
- ret
-
-Func_1ca1: ; 0x1ca1
- ld a, $2
- ld [wd8e9], a
- ld b, $1a
- ld c, rRP % $100
- ld d, b
- ld e, $0
- call Func_1c32
- ld d, b
- call Func_1c2b
- ld d, b
- call Func_1c32
- ld d, b
- call Func_1c2b
- ld d, b
- call Func_1c32
- ld d, e
- call Func_1c23
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, e
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, e
- call Func_1c23
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, e
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, $1a
- call Func_1c32
- ld a, $0
- ld [wd8ea], a
- ret
-
-Func_1cef:
- xor a
- ld [rRP], a
- ld a, $ff
- ld [wd8ea], a
- ret
-
-Func_1cf8: ; 0x1cf8
- xor a
- ld [wd8e4], a
- ld [wd8e5], a
- push hl
- push bc
- ld hl, wd8e6
- ld a, $5a
- ld [hli], a
- ld [hl], b
- dec hl
- ld b, $2
- ld d, $1e
- call Func_1c32
- call Func_1d44
- pop bc
- pop hl
- call Func_1ed3
- call Func_1d44
- ld a, [wd8e4]
- ld [wd8e6], a
- ld a, [wd8e5]
- ld [wd8e7], a
- ld hl, wd8e6
- ld b, $2
- call Func_1d44
- ld hl, wd8ea
- ld b, $1
- call Func_1e3b
- ld a, [wd8e6]
- ld [wd8e4], a
- ld a, [wd8e7]
- ld [wd8e5], a
- ret
-
-Func_1d44: ; 0x1d44
- ld a, [wd8ea]
- cp $0
- ret nz
- ld c, rRP % $100
- ld d, $16
- call Func_1c2b
- ld d, $16
- call Func_1c32
- ld a, b
- cpl
- ld b, a
-.asm_1d59
- inc b
- jr z, .asm_1dae
- ld a, $8
- ld [wd8e3], a
- ld a, [hli]
- ld e, a
- ld a, [wd8e4]
- add e
- ld [wd8e4], a
- jr nc, .asm_1d75
- ld a, [wd8e5]
- inc a
- ld [wd8e5], a
- jr .asm_1d78
-
-.asm_1d75
- call Func_1ed3
-.asm_1d78
- ld a, e
- rlca
- ld e, a
- jr nc, .asm_1d8d
- ld a, [wd8eb]
- ld d, a
- call Func_1c2b
- ld a, [wd8ec]
- ld d, a
- call Func_1c32
- jr .asm_1d9b
-
-.asm_1d8d
- ld a, [wd8ed]
- ld d, a
- call Func_1c2b
- ld a, [wd8ee]
- ld d, a
- call Func_1c32
-.asm_1d9b
- ld a, [wd8e3]
- dec a
- ld [wd8e3], a
- jr z, .asm_1dac
- call Func_1ed4
- call Func_1ed4
- jr .asm_1d78
-
-.asm_1dac
- jr .asm_1d59
-
-.asm_1dae
- call Func_1ed3
- call Func_1ed3
- call Func_1ed4
- ld d, $16
- call Func_1c2b
- ld d, $16
- call Func_1c32
- ret
-
-Func_1dc2: ; 0x1dc2
- ld a, $2
- ld [wd8ea], a
- ret
-
-Func_1dc8:
- ld a, [wd8ea]
- or $1
- ld [wd8ea], a
- ret
-
-Func_1dd1: ; 0x1dd1
- ld a, [wd8ea]
- or $4
- ld [wd8ea], a
- ret
-
-Func_1dda: ; 0x1dda
- xor a
- ld [wd8e4], a
- ld [wd8e5], a
- push hl
- ld hl, wd8e6
- ld b, $2
- call Func_1e3b
- ld a, [wd8e7]
- ld [wd8e8], a
- ld b, a
- pop hl
- ld a, [wd8e6]
- cp $5a
- jp nz, Func_1dd1
- call Func_1e3b
- ld a, [wd8e4]
- ld d, a
- ld a, [wd8e5]
- ld e, a
- push de
- ld hl, wd8e6
- ld b, $2
- call Func_1e3b
- pop de
- ld hl, wd8e6
- ld a, [hli]
- xor d
- ld b, a
- ld a, [hl]
- xor e
- or b
- jr z, .asm_1e22
- ld a, [wd8ea]
- or $1
- ld [wd8ea], a
-.asm_1e22
- push de
- ld hl, wd8ea
- ld b, $1
- call Func_1d44
- pop de
- ld a, d
- ld [wd8e4], a
- ld a, e
- ld [wd8e5], a
- ld a, [wd8e8]
- cp $82
- ret z
- ret
-
-Func_1e3b: ; 0x1e3b
- ld a, [wd8ea]
- cp $0
- ret nz
- ld c, rRP % $100
- ld d, $0
- call Func_1c23
- ld a, d
- or a
- jp z, Func_1dc2
- ld d, $0
- call Func_1c1b
- ld a, d
- or a
- jp z, Func_1dc2
- ld d, $0
- call Func_1c23
- ld a, d
- or a
- jp z, Func_1dc2
- call Func_1ed4
- call Func_1ed4
- push af
- pop af
- ld a, b
- cpl
- ld b, a
-.asm_1e6c
- inc b
- jr z, .asm_1eb9
- ld a, $8
- ld [wd8e3], a
-.asm_1e74
- ld d, $0
- call Func_1c1b
- call Func_1c23
- ld a, [wd8ef]
- cp d
- jr nc, .asm_1e88
- ld a, e
- set 0, a
- ld e, a
- jr .asm_1e8c
-
-.asm_1e88
- ld a, e
- res 0, a
- ld e, a
-.asm_1e8c
- ld a, [wd8e3]
- dec a
- ld [wd8e3], a
- jr z, .asm_1ea0
- ld a, e
- rlca
- ld e, a
- call Func_1ed4
- call Func_1ed4
- jr .asm_1e74
-
-.asm_1ea0
- ld a, e
- ld [hli], a
- ld a, [wd8e4]
- add e
- ld [wd8e4], a
- jr nc, .asm_1eb4
- ld a, [wd8e5]
- inc a
- ld [wd8e5], a
- jr .asm_1eb7
-
-.asm_1eb4
- call Func_1ed3
-.asm_1eb7
- jr .asm_1e6c
-
-.asm_1eb9
- ld d, $0
- call Func_1c1b
- ld a, d
- and a
- jp z, Func_1dc2
- ld d, $11
- call Func_1c32
- ret
-
-Func_1ec9:
- ld b, $00
- jp Func_1cf8
-
-Func_1ece:
- ld b, $00
- jp Func_1dda
-
-Func_1ed3: ; 0x1ed3
- ret
-
-Func_1ed4: ; 0x1ed4
- jr z, .asm_1ed6
-.asm_1ed6
- jr nz, .asm_1ed8
-.asm_1ed8
- ret
-
-Func_1ed9:
- push bc
- push de
- push hl
- ld e, a
- ld d, $0
- sla e
- rl d
- ld a, [hLoadedROMBank]
- push af
- ld a, BANK(Data_8f06)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, Data_8f06
- jr asm_1f3b
-
-Func_1ef2:
- push bc
- push de
- push hl
- ld e, a
- ld d, $0
- sla e
- rl d
- ld a, [hLoadedROMBank]
- push af
- ld a, BANK(Data_8f06)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, Data_8f06
- jr asm_1f3b
-
-LoadOAMData2: ; 0x1f0b
-; This function loads OAM data, but it adds b and c to the x and y values
-; input: a = OAM data id (see OAMDataPointers2)
- push bc
- push de
- push hl
- ld e, a
- ld d, $0
- sla e
- rl d
- ld a, [hLoadedROMBank]
- push af
- ld a, Bank(OAMDataPointers2)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, OAMDataPointers2
- jr asm_1f3b
-
-LoadOAMData: ; 0x1f24
-; This function loads OAM data, but it adds b and c to the x and y values
-; input: a = OAM data id (see OAMDataPointers)
- push bc
- push de
- push hl
- ld e, a
- ld d, $0
- sla e
- rl d ; multiply de by 2
- ld a, [hLoadedROMBank]
- push af
- ld a, Bank(OAMDataPointers)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, OAMDataPointers
-asm_1f3b: ; 0x1f3b
- add hl, de ; hl points to oam pointer in OAMDataPointers
- ld a, [hli]
- ld e, a
- ld a, [hl]
- ld d, a ; de points to OAM data
- ld a, [wd802]
- ld l, a
- ld h, (wOAMBuffer >> 8)
-.loadOAMDataLoop
- ld a, [de]
- cp $80 ; OAM data list terminator
- jr z, .doneReadingOAMData
- add c
- ld [hli], a
- inc de
- ld a, [de]
- add b
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- jr .loadOAMDataLoop
-
-.doneReadingOAMData
- ld a, l
- ld [wd802], a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- pop hl
- pop de
- pop bc
- ret
-
-Func_1f68:
- push bc
- push de
- push hl
- ld e, a
- ld d, $0
- sla e
- rl d
- ld a, [hLoadedROMBank]
- push af
- ld a, BANK(Data_8f06)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, Data_8f06 ; all 0s
- jr asm_1fca
-
-Func_1f81:
- push bc
- push de
- push hl
- ld e, a
- ld d, $0
- sla e
- rl d
- ld a, [hLoadedROMBank]
- push af
- ld a, BANK(Data_8f06)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, Data_8f06 ; all 0s
- jr asm_1fca
-
-Func_1f9a:
- push bc
- push de
- push hl
- ld e, a
- ld d, $0
- sla e
- rl d
- ld a, [hLoadedROMBank]
- push af
- ld a, BANK(OAMDataPointers2)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, OAMDataPointers2
- jr asm_1fca
-
-Func_1fb3:
- push bc
- push de
- push hl
- ld e, a
- ld d, $0
- sla e
- rl d
- ld a, [hLoadedROMBank]
- push af
- ld a, BANK(OAMDataPointers)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, OAMDataPointers
-asm_1fca
- add hl, de
- ld a, [hli]
- ld e, a
- ld a, [hl]
- ld d, a
- ld a, [wd802]
- ld l, a
- ld h, $d0
-.asm_1fd5
- ld a, [de]
- cp $80
- jr z, .asm_1fee
- add c
- ld [hli], a
- inc de
- ld a, [de]
- add b
- ld [hli], a
- inc de
- ld a, [de]
- push hl
- ld hl, sp+$7
- add [hl]
- pop hl
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- jr .asm_1fd5
-
-.asm_1fee
- ld a, l
- ld [wd802], a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- pop hl
- pop de
- pop bc
- ret
-
-Func_1ffc: ; 0x1ffc
- ld a, $b
- ld [wd806], a
- ld a, $4
- ld [wd807], a
- ld [hFarCallTempA], a
- callba Func_3c000
- ld a, $1
- ld [wd85d], a
- ld a, $37
- ld [wd470], a
- ld [wd471], a
- ld [wd472], a
- ld a, SCREEN_ERASE_ALL_DATA
- ld [wCurrentScreen], a
-.asm_2025
- call Func_2034
- call Func_2043
- call Func_926
- call Func_b2e
- rst AdvanceFrame
- jr .asm_2025
-
-Func_2034: ; 0x2034
- ld a, [wd804]
- and a
- jr z, .asm_203f
- dec a
- ld [wd804], a
- ret
-
-.asm_203f
- ld [wd803], a
- ret
-
-Func_2043: ; 0x2043
- ld a, [wCurrentScreen]
- call CallInFollowingTable
-CallTable_2049: ; 0x2049
-; First two bytes is function pointer.
-; Third byte is bank of function.
-; Fourth byte seems to be unused.
- padded_dab Func_8000
-
- ; SCREEN_ERASE_ALL_DATA
- padded_dab HandleEraseAllDataMenu
-
- ; SCREEN_COPYRIGHT
- padded_dab HandleCopyrightScreen
-
- ; SCREEN_TITLESCREEN
- padded_dab HandleTitlescreen
-
- ; SCREEN_PINBALL_GAME
- padded_dab HandlePinballGame
-
- ; SCREEN_POKEDEX
- padded_dab HandlePokedexScreen
-
- ; SCREEN_OPTIONS
- padded_dab HandleOptionsScreen
-
- ; SCREEN_HIGH_SCORES
- padded_dab HandleHighScoresScreen
-
- ; SCREEN_FIELD_SELECT
- padded_dab HandleFieldSelectScreen
- ; end of call table
-
-Func_206d: ; 0x206d
- ld a, [hLoadedROMBank]
- push af
- ld a, Bank(Func_8d17)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- call Func_8d17
- jr c, .asm_2084
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- and a
- ret
-
-.asm_2084
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- ret
-
-Func_208c: ; 0x208c
- ld a, [hLoadedROMBank]
- push af
- ld a, Bank(Func_8ee0)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- call Func_8ee0
- jr c, .asm_20a3
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- and a
- ret
-
-.asm_20a3
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- scf
- ret
-
-Func_20ab: ; 0x20ab
- push af
- xor a
- ld [$ffb6], a
- jr .asm_20c6
-
- push af
- ld a, b
- xor c
- ld [$ffb6], a
- bit 7, b
- jr z, .asm_20be
- ld a, b
- cpl
- inc a
- ld b, a
-.asm_20be
- bit 7, c
- jr z, .asm_20c6
- ld a, c
- cpl
- inc a
- ld c, a
-.asm_20c6
- push de
- push hl
- ld a, b
- cp c
- jr nc, .asm_20ce
- ld b, c
- ld c, a
-.asm_20ce
- ld h, $3e
- ld l, c
- ld e, [hl]
- inc h
- ld d, [hl]
- ld l, b
- ld a, [hl]
- dec h
- ld l, [hl]
- ld h, a
- add hl, de
- push af
- ld d, $3e
- ld a, b
- sub c
- ld e, a
- ld a, [de]
- ld c, a
- inc d
- ld a, [de]
- ld b, a
- ld a, l
- sub c
- ld l, a
- ld a, h
- sbc b
- ld h, a
- jr nc, .asm_20f1
- pop af
- ccf
- jr .asm_20f2
-
-.asm_20f1
- pop af
-.asm_20f2
- rr h
- rr l
- ld b, h
- ld c, l
- ld a, [$ffb6]
- rlca
- jr nc, .asm_2107
- ld a, c
- cpl
- add $1
- ld c, a
- ld a, b
- cpl
- adc $0
- ld b, a
-.asm_2107
- pop hl
- pop de
- pop af
- ret
-
-Func_210b: ; 0x210b
- push af
- push hl
- ld a, b
- xor d
- ld [$ffb7], a
- bit 7, b
- jr z, .asm_211f
- ld a, c
- cpl
- add $1
- ld c, a
- ld a, b
- cpl
- adc $0
- ld b, a
-.asm_211f
- push bc
- ld b, e
- call Func_20ab
- ld l, c
- ld h, b
- ld bc, $0080
- add hl, bc
- ld l, h
- ld h, $0
- pop bc
- ld c, e
- call Func_20ab
- add hl, bc
- ld a, [$ffb7]
- rlca
- jr nc, .asm_2142
- ld a, l
- cpl
- add $1
- ld l, a
- ld a, h
- cpl
- adc $0
- ld h, a
-.asm_2142
- ld c, l
- ld b, h
- pop hl
- pop af
- ret
-
-Func_2147: ; 0x2147
- add $40
- ; fall through
-Func_2149: ; 0x2149
- push hl
- ld [$ffb6], a
- and $7f
- cp $40
- jr c, .asm_2155
- cpl
- add $81
-.asm_2155
- ld hl, Data_26be ; todo
- ld e, a
- ld d, $0
- add hl, de
- ld e, [hl]
- pop hl
- ld d, $0
- ld a, [$ffb6]
- sla a
- ret nc
- ld d, $ff
- ret
-
-ApplyGravityToBall: ; 0x2168
-; Adds a constant to the pinball's y velocity.
- ld a, [wd549]
- and a
- ret z
- ld de, $000b ; gravity added to y velocity every frame
- ld hl, wBallYVelocity
- ld a, [hli]
- ld h, [hl]
- ld l, a
- add hl, de
- ld a, l
- ld [wBallYVelocity], a
- ld a, h
- ld [wBallYVelocity + 1], a
- ret
-
-LimitBallVelocity: ; 0x2180
-; Ensures that the ball's x and y velocity are kept under a threshold.
-; The ball can travel at a higher max speed when moving diagonally, since it
-; limits the x and y components independently.
- ld hl, wBallXVelocity + 1
- call _LimitBallVelocity
- ld hl, wBallYVelocity + 1
- ; fall through
-_LimitBallVelocity: ; 0x2189
- ld a, [hl]
- bit 7, a ; is it negative velocity? (left or up)
- jr nz, .negativeVelocity
- cp $8
- ret c
- ld a, $7 ; max positive velocity
- ld [hl], a
- ret
-
-.negativeVelocity
- cp $f9
- ret nc
- ld a, $f9 ; max negative velocity
- ld [hl], a
- ret
-
-MoveBallPosition: ; 0x219c
-; Updates the ball's position according to its velocity
- ld a, [wBallXPos]
- ld [wPreviousBallXPos], a
- ld a, [wBallXPos + 1]
- ld [wPreviousBallXPos + 1], a
- ld a, [wBallYPos]
- ld [wPreviousBallYPos], a
- ld a, [wBallYPos + 1]
- ld [wPreviousBallYPos + 1], a
- ld de, wBallXVelocity + 1
- ld hl, wBallXPos
- call AddVelocityToPosition
- ld de, wBallYVelocity + 1
- ld hl, wBallYPos
- ; fall through
-
-AddVelocityToPosition: ; 0x21c3
- ld a, [de]
- bit 7, a
- jr nz, .asm_21d1
- cp 1+4
- jr c, .asm_21da
- ld bc, $04ff
- jr .asm_21de
-
-.asm_21d1
- cp -4
- jr nc, .asm_21da
- ld bc, -$04ff
- jr .asm_21de
-
-.asm_21da
- ld b, a
- dec de
- ld a, [de]
- ld c, a
-.asm_21de
- ld a, [hl]
- add c
- ld [hli], a
- ld a, [hl]
- adc b
- ld [hl], a
- ret
-
-Func_21e5: ; 0x21e5
- cpl
- inc a
- ; fall through
-Func_21e7: ; 0x21e7
- push hl
- push bc
- push de
- ld [$ff8c], a
- call Func_2147
- ld a, e
- ld [$ff8d], a
- ld a, d
- ld [$ff8e], a
- call Func_210b
- ld l, c
- ld h, b
- pop bc
- push bc
- ld a, [$ff8c]
- call Func_2149
- ld a, e
- ld [$ff8f], a
- ld a, d
- ld [$ff90], a
- call Func_210b
- add hl, bc
- pop de
- pop bc
- push hl
- push de
- ld a, [$ff8f]
- ld e, a
- ld a, [$ff90]
- cpl
- ld d, a
- call Func_210b
- ld l, c
- ld h, b
- pop bc
- ld a, [$ff8d]
- ld e, a
- ld a, [$ff8e]
- ld d, a
- call Func_210b
- add hl, bc
- ld d, h
- ld e, l
- pop bc
- pop hl
- ret
-
-Func_222b: ; 0x222b
- push hl
- ld hl, wd7f8
- ld [hl], $ff
- bit 7, d
- jr nz, .asm_2297
- ld [hl], $0
- ld a, d
- cp $3
- jr c, .asm_2254
- ld a, $ff
- ld [wd803], a
- ld a, $1
- ld [wd804], a
- ld a, [wFlipperCollision]
- and a
- jr nz, .asm_2254
- push de
- ld de, $0008
- call Func_4d8
- pop de
-.asm_2254
- srl d
- rr e
- srl d
- rr e
- ld h, d
- ld l, e
- srl d
- rr e
- ld a, [wd7eb]
- and a
- jr z, .asm_226c
-.asm_2268
- add hl, de
- dec a
- jr nz, .asm_2268
-.asm_226c
- ld d, h
- ld e, l
- ld a, e
- cpl
- add $1
- ld e, a
- ld a, d
- cpl
- adc $0
- ld d, a
- ld a, [wBallSpin]
- sra a
- ld l, a
- ld h, $0
- bit 7, l
- jr z, .asm_2286
- ld h, $ff
-.asm_2286
- add hl, bc
- ld b, h
- ld c, l
- push bc
- sla c
- rl b
- sla c
- rl b
- ld a, b
- ld [wBallSpin], a
- pop bc
-.asm_2297
- pop hl
- ret
-
-LoadBallVelocity: ; 0x2299
-; Loads velocity of the ball into bc and de
-; bc = x velocity
-; de = y velocity
- push hl
- ld hl, wBallXVelocity
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld e, a
- ld a, [hl]
- ld d, a
- pop hl
- ret
-
-SetBallVelocity: ; 0x22a7
-; Sets the x and y velocities of the ball.
-; bc = x velocity
-; de = y velocity
- push hl
- ld hl, wBallXVelocity
- ld a, c
- ld [hli], a
- ld a, b
- ld [hli], a
- ld a, e
- ld [hli], a
- ld a, d
- ld [hl], a
- pop hl
- ret
-
-Func_22b5: ; 0x22b5
- ld a, [wBallXPos + 1]
- sub $4
- push af
- and $7
- ld [wSubTileBallXPos], a ; sub-tile position
- pop af
- and $f8
- ld c, a
- ld a, [wBallYPos + 1]
- sub $4
- push af
- and $7
- ld [wSubTileBallYPos], a
- pop af
- and $f8
- ld b, a
- ld l, b ; bc contains tile coords of ball position
- ld h, $0
- sla l
- rl h
- sla l
- rl h ; b was multiplied by 4 (y tile position)
- srl c
- srl c
- srl c ; c was divided by 8 (x tile position)
- ld b, $0
- add hl, bc
- ld a, l
- ld [wd7f3], a
- ld a, h
- ld [wd7f4], a
- ld a, [wStageCollisionMapPointer]
- ld c, a
- ld a, [wStageCollisionMapPointer + 1]
- ld b, a
- add hl, bc ; hl = address of upper-left collision byte
- ld a, [hLoadedROMBank]
- push af
- ld a, [wStageCollisionMapBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld bc, $001f ; number of tiles wide - 1
- ld a, [hli]
- ld [wUpperLeftCollisionAttribute], a
- ld a, [hl]
- ld [wUpperRightCollisionAttribute], a
- add hl, bc
- ld a, [hli]
- ld [wLowerLeftCollisionAttribute], a
- ld a, [hl]
- ld [wLowerRightCollisionAttribute], a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [hLoadedROMBank]
- push af
- ld a, [wStageCollisionMasksBank]
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [wSubTileBallXPos]
- sla a
- ld c, a
- ld b, $0
- ld hl, SubTileXPos_CollisionDataPointers
- add hl, bc
- ld e, [hl]
- inc hl
- ld d, [hl]
- ld a, [wSubTileBallYPos]
- ld c, a
- ld b, $10 ; number of times to loop over .asm_233d
-.asm_233d
- push bc
- ld a, [de]
- inc de
- add c ; add the sub tile y pos
- push af
- srl a
- srl a
- srl a
- ld c, a
- ld b, $0
- ld hl, wUpperLeftCollisionAttribute
- add hl, bc
- ld a, [hl]
- call Func_248a
- jr nc, .asm_235e
- pop af
- and $7
- ld c, a
- ld b, $0
- add hl, bc
- jr .asm_237b
-
-.asm_235e
- ld c, a
- ld b, $0
- sla c
- rl b
- sla c
- rl b
- sla c
- rl b
- ld hl, wStageCollisionMasksPointer
- ld a, [hli]
- ld h, [hl]
- ld l, a
- add hl, bc
- pop af
- and $7
- ld c, a
- ld b, $0
- add hl, bc
-.asm_237b
- ld a, [de]
- inc de
- and [hl]
- push af
- ld a, [de]
- inc de
- ld c, a
- ld hl, wd7c9
- add hl, bc
- pop af
- ld [hl], a
- pop bc
- dec b
- jr nz, .asm_233d
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld hl, wd7c9
- ld de, wd7d9
- ld b, $4
-.asm_239a
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .asm_239a
- ld hl, wd7c9
- ld de, $0000
- ld b, $0
- ld a, [hl]
- and a
- jr z, .asm_23c1
-.asm_23b5
- ld a, [hli]
- inc b
- and a
- jr z, .asm_23c1
- ld a, b
- cp $11
- jr nc, .asm_23ee
- jr .asm_23b5
-
-.asm_23c1
- ld a, [hli]
- inc b
- and a
- jr nz, .asm_23cd
- ld a, b
- cp $11
- jr nc, .asm_23ee
- jr .asm_23c1
-
-.asm_23cd
- push de
- ld d, $1
- ld c, b
- dec c
-.asm_23d2
- ld a, [hli]
- inc b
- inc d
- and a
- jr nz, .asm_23d2
- dec d
- ld a, b
- dec a
- dec a
- and $f
- swap c
- or c
- ld c, a
- ld a, d
- cp e
- pop de
- jr c, .asm_23e9
- ld e, a
- ld d, c
-.asm_23e9
- ld a, b
- cp $10
- jr c, .asm_23c1
-.asm_23ee
- ld a, e
- ld [wd7e9], a
- and a
- ret z
- ld a, [hLoadedROMBank]
- push af
- ld a, Bank(Data_8817)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- push de
- ld e, d
- ld d, $0
- ld hl, Data_8817
- add hl, de
- ld a, [hl]
- ld [wd7ea], a
- sla e
- rl d
- ld hl, Data_8917
- add hl, de
- ld a, [wBallYPos]
- add [hl]
- ld [wBallYPos], a
- inc hl
- ld a, [wBallYPos + 1]
- adc [hl]
- ld [wBallYPos + 1], a
- ld hl, Data_8b17
- add hl, de
- ld a, [wBallXPos]
- add [hl]
- ld [wBallXPos], a
- inc hl
- ld a, [wBallXPos + 1]
- adc [hl]
- ld [wBallXPos + 1], a
- pop de
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, d
- swap a
- and $f
- ld e, a
- ld a, d
- and $f
- sub e
- jr nc, .asm_2449
- add $10
-.asm_2449
- add e
- add e
- inc a
- and $1e
- ld c, a
- ld b, $0
- ld hl, Data_250e ; todo
- add hl, bc
- ld a, [wSubTileBallXPos]
- add $4
- add [hl]
- bit 3, a
- ld c, b
- jr z, .asm_2462
- ld c, $2
-.asm_2462
- ld a, [wSubTileBallYPos]
- add $4
- inc hl
- add [hl]
- bit 3, a
- jr z, .asm_246e
- inc c
-.asm_246e
- ld hl, wUpperLeftCollisionAttribute
- add hl, bc
- ld a, [hl]
- ld [wd7f5], a
- ld hl, Data_250a ; todo
- add hl, bc
- ld a, [wd7f3]
- add [hl]
- ld [wd7f6], a
- ld a, [wd7f4]
- adc $0
- ld [wd7f7], a
- ret
-
-Func_248a: ; 0x248a
- push af
- ld a, [wCurrentStage]
- bit 0, a
- jr nz, .asm_2495
- pop af
- and a
- ret
-
-.asm_2495
- pop af
- cp $d0
- ccf
- ret nc
- cp $e0
- jr nc, .asm_24ab
- sub $d0
- sla a
- sla a
- sla a
- ld l, a
- ld h, $c4
- scf
- ret
-
-.asm_24ab
- push de
- sub $e0
- ld b, a
- ld a, [wCurrentStage]
- cp $6 ; gengar stage buggy?
- jr nc, .asm_24e0
- bit 4, b
- ld hl, Data_3800
- ld a, [wd7af]
- jr z, .asm_24c8
- res 4, b
- ld hl, Data_3980
- ld a, [wd7b3]
-.asm_24c8
- ld de, $0080
- cp $7
- jr c, .asm_24d5
- add hl, de
- cp $e
- jr c, .asm_24d5
- add hl, de
-.asm_24d5
- ld e, b
- sla e
- sla e
- sla e
- add hl, de
- pop de
- scf
- ret
-
-.asm_24e0
- bit 4, b
- ld hl, Data_3b00
- ld a, [wd7af]
- jr z, .asm_24f2
- res 4, b
- ld hl, Data_3c80
- ld a, [wd7b3]
-.asm_24f2
- ld de, $0080
- cp $7
- jr c, .asm_24ff
- add hl, de
- cp $e
- jr c, .asm_24ff
- add hl, de
-.asm_24ff
- ld e, b
- sla e
- sla e
- sla e
- add hl, de
- pop de
- scf
- ret
-
-Data_250a:
- dr $250a, $250e
-
-Data_250e:
- dr $250e, $252e
-
-SubTileXPos_CollisionDataPointers: ; 0x252e
- dw SubTileXPos_CollisionData0
- dw SubTileXPos_CollisionData1
- dw SubTileXPos_CollisionData2
- dw SubTileXPos_CollisionData3
- dw SubTileXPos_CollisionData4
- dw SubTileXPos_CollisionData5
- dw SubTileXPos_CollisionData6
- dw SubTileXPos_CollisionData7
-
-SubTileXPos_CollisionData0: ; 0x253e
- db $00, $10, $0B
- db $00, $08, $0C
- db $00, $04, $0D
- db $01, $40, $0A
- db $01, $01, $0E
- db $03, $80, $09
- db $13, $80, $0F
- db $04, $80, $08
- db $14, $80, $00
- db $05, $80, $07
- db $15, $80, $01
- db $07, $40, $06
- db $07, $01, $02
- db $08, $10, $05
- db $08, $08, $04
- db $08, $04, $03
-
-SubTileXPos_CollisionData1: ; 0x256e
- db $00, $08, $0B
- db $00, $04, $0C
- db $00, $02, $0D
- db $01, $20, $0A
- db $11, $80, $0E
- db $03, $40, $09
- db $13, $40, $0F
- db $04, $40, $08
- db $14, $40, $00
- db $05, $40, $07
- db $15, $40, $01
- db $07, $20, $06
- db $17, $80, $02
- db $08, $08, $05
- db $08, $04, $04
- db $08, $02, $03
-
-SubTileXPos_CollisionData2: ; 0x259e
- db $00, $04, $0B
- db $00, $02, $0C
- db $00, $01, $0D
- db $01, $10, $0A
- db $11, $40, $0E
- db $03, $20, $09
- db $13, $20, $0F
- db $04, $20, $08
- db $14, $20, $00
- db $05, $20, $07
- db $15, $20, $01
- db $07, $10, $06
- db $17, $40, $02
- db $08, $04, $05
- db $08, $02, $04
- db $08, $01, $03
-
-SubTileXPos_CollisionData3: ; 0x25ce
- db $00, $02, $0B
- db $00, $01, $0C
- db $10, $80, $0D
- db $01, $08, $0A
- db $11, $20, $0E
- db $03, $10, $09
- db $13, $10, $0F
- db $04, $10, $08
- db $14, $10, $00
- db $05, $10, $07
- db $15, $10, $01
- db $07, $08, $06
- db $17, $20, $02
- db $08, $02, $05
- db $08, $01, $04
- db $18, $80, $03
-
-SubTileXPos_CollisionData4: ; 0x25fe
- db $00, $01, $0B
- db $10, $80, $0C
- db $10, $40, $0D
- db $01, $04, $0A
- db $11, $10, $0E
- db $03, $08, $09
- db $13, $08, $0F
- db $04, $08, $08
- db $14, $08, $00
- db $05, $08, $07
- db $15, $08, $01
- db $07, $04, $06
- db $17, $10, $02
- db $08, $01, $05
- db $18, $80, $04
- db $18, $40, $03
-
-SubTileXPos_CollisionData5: ; 0x262e
- db $10, $80, $0B
- db $10, $40, $0C
- db $10, $20, $0D
- db $01, $02, $0A
- db $11, $08, $0E
- db $03, $04, $09
- db $13, $04, $0F
- db $04, $04, $08
- db $14, $04, $00
- db $05, $04, $07
- db $15, $04, $01
- db $07, $02, $06
- db $17, $08, $02
- db $18, $80, $05
- db $18, $40, $04
- db $18, $20, $03
-
-SubTileXPos_CollisionData6: ; 0x265e
- db $10, $40, $0B
- db $10, $20, $0C
- db $10, $10, $0D
- db $01, $01, $0A
- db $11, $04, $0E
- db $03, $02, $09
- db $13, $02, $0F
- db $04, $02, $08
- db $14, $02, $00
- db $05, $02, $07
- db $15, $02, $01
- db $07, $01, $06
- db $17, $04, $02
- db $18, $40, $05
- db $18, $20, $04
- db $18, $10, $03
-
-SubTileXPos_CollisionData7: ; 0x268e
- db $10, $20, $0B
- db $10, $10, $0C
- db $10, $08, $0D
- db $11, $80, $0A
- db $11, $02, $0E
- db $03, $01, $09
- db $13, $01, $0F
- db $04, $01, $08
- db $14, $01, $00
- db $05, $01, $07
- db $15, $01, $01
- db $17, $80, $06
- db $17, $02, $02
- db $18, $20, $05
- db $18, $10, $04
- db $18, $08, $03
-
-Data_26be:
- dr $26be, $2720
-
-Func_2720: ; 0x2720
- ld a, $ff
- ld [wd4ea], a
- call Func_272f
- ld a, [wd4ea]
- ld [wd4ec], a
- ret
-
-Func_272f: ; 0x272f
-; not collisions
- ld a, [wCurrentStage]
- call CallInFollowingTable
-CallTable_2735: ; 0x2735
- ; STAGE_RED_FIELD_TOP
- padded_dab Func_143e1
-
- ; STAGE_RED_FIELD_BOTTOM
- padded_dab Func_143f9
-
- padded_dab Func_18061
-
- padded_dab Func_18062
-
- ; STAGE_BLUE_FIELD_TOP
- padded_dab Func_1c520
-
- ; STAGE_BLUE_FIELD_BOTTOM
- padded_dab Func_1c536
-
- ; STAGE_GENGAR_BONUS
- padded_dab Func_181b1
-
- ; STAGE_GENGAR_BONUS
- padded_dab Func_181b1
-
- ; STAGE_MEWTWO_BONUS
- padded_dab Func_19330
-
- ; STAGE_MEWTWO_BONUS
- padded_dab Func_19330
-
- ; STAGE_MEOWTH_BONUS
- padded_dab Func_2414d
-
- ; STAGE_MEOWTH_BONUS
- padded_dab Func_2414d
-
- ; STAGE_DIGLETT_BONUS
- padded_dab Func_19ab3
-
- ; STAGE_DIGLETT_BONUS
- padded_dab Func_19ab3
-
- ; STAGE_SEEL_BONUS
- padded_dab Func_25bbc
-
- ; STAGE_SEEL_BONUS
- padded_dab Func_25bbc
-
-Func_2775: ; 0x2775
- ld a, [wd4ea]
- inc a
- jr nz, .asm_27a2
- ld a, [bc]
- bit 7, a
- jr nz, .asm_27a2
- push bc
- push de
- call nc, Func_27da
- pop hl
- call c, Func_27a4
- ld a, [wd4ea]
- ld b, a
- pop hl
- ld [hl], $0
- jr nc, .asm_27a2
- ld a, [wd4ec]
- cp b
- jr z, .asm_27a2
- ld a, [wd4eb]
- ld [hli], a
- ld a, [wd4ea]
- ld [hl], a
- scf
- ret
-
-.asm_27a2
- and a
- ret
-
-Func_27a4: ; 0x27a4
- xor a
- ld [wd4eb], a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld e, a
- ld a, [wBallXPos + 1]
- ld b, a
- ld a, [wBallYPos + 1]
- ld c, a
-.asm_27b4
- ld a, [wd4eb]
- inc a
- ld [wd4eb], a
- ld a, [hli]
- ld [wd4ea], a
- cp $ff
- ret z
- ld a, [hli]
- sub b
- bit 7, a
- jr z, .asm_27ca
- cpl
- inc a
-.asm_27ca
- cp d
- ld a, [hli]
- jr nc, .asm_27b4
- sub c
- bit 7, a
- jr z, .asm_27d5
- cpl
- inc a
-.asm_27d5
- cp e
- jr nc, .asm_27b4
- scf
- ret
-
-Func_27da: ; 0x27da
- ld a, [hli]
- and a
- jr z, .asm_27e8
- dec hl
- ld a, [wStageCollisionState]
- ld c, a
- ld b, $0
- add hl, bc
- ld c, [hl]
- add hl, bc
-.asm_27e8
- ld a, [wd7e9]
- and a
- ret z
- ld a, [wd7f5]
- ld b, a
- ld c, $ff
-.asm_27f3
- inc c
- ld a, [hli]
- cp $ff
- ret z
- cp b
- jr nz, .asm_27f3
- scf
- ret
-
-PinballCollideWithPoints: ; 0x27fd
-; Checks if pinball collides with any of the (x, y) points in the given list.
-; Saves the index of the collided point.
-; Input: hl = pointer to array of (x, y) points
-; Output: Saves index of collided point in wd578
- ld a, [wBallXPos + 1]
- ld b, a
- ld a, [wBallYPos + 1]
- ld c, a
- ld d, $0
-.nextPoint
- ld a, [hli]
- and a
- ret z
- inc d
- ld a, [hli]
- sub b
- cp $e8
- ld a, [hli]
- jr c, .nextPoint
- sub c
- cp $e8
- jr c, .nextPoint
- ld a, d
- ld [wd578], a
- ret
-
-Func_281c: ; 0x281c
- ld a, [wCurrentStage]
- call CallInFollowingTable
-CallTable_2822: ; 0x2822
-; not collisions
- ; STAGE_RED_FIELD_TOP
- padded_dab Func_1460e
-
- ; STAGE_RED_FIELD_BOTTOM
- padded_dab Func_14652
-
- padded_dab Func_1806d
-
- padded_dab Func_1806e
-
- ; STAGE_BLUE_FIELD_TOP
- padded_dab Func_1c715
-
- ; STAGE_BLUE_FIELD_BOTTOM
- padded_dab Func_1c769
-
- ; STAGE_GENGAR_BONUS
- padded_dab Func_18377
-
- ; STAGE_GENGAR_BONUS
- padded_dab Func_18377
-
- ; STAGE_MEWTWO_BONUS
- padded_dab Func_19451
-
- ; STAGE_MEWTWO_BONUS
- padded_dab Func_19451
-
- ; STAGE_MEOWTH_BONUS
- padded_dab Func_2442a
-
- ; STAGE_MEOWTH_BONUS
- padded_dab Func_2442a
-
- ; STAGE_DIGLETT_BONUS
- padded_dab Func_19b88
-
- ; STAGE_DIGLETT_BONUS
- padded_dab Func_19b88
-
- ; STAGE_SEEL_BONUS
- padded_dab Func_25c5a
-
- ; STAGE_SEEL_BONUS
- padded_dab Func_25c5a
-
-Func_2862: ; 0x2862
- ld a, [wd7be]
- and a
- jr nz, .asm_287c
- ld a, [hGameBoyColorFlag]
- and a
- jr z, .asm_287b
- ld a, $0
- ld hl, Data_2890
- ld de, $0052
- ld bc, $0004
- call FarCopyPalettes
-.asm_287b
- ret
-
-.asm_287c
- ld a, [hGameBoyColorFlag]
- and a
- jr z, .asm_288f
- ld a, $0
- ld hl, Data_2894
- ld de, $0052
- ld bc, $0004
- call FarCopyPalettes
-.asm_288f
- ret
-
-Data_2890:
- RGB 31, 31, 31
- RGB 21, 21, 27
-
-Data_2894:
- RGB 27, 10, 10
- RGB 20, 04, 04
-
-Data_2898:
- dr $2898, $28a0
-
-CopyHLToDE: ; 0x28a0
-; Places [hl] into [de]
-; Also places $0 into [de + 2]
- ld a, [hli]
- ld [de], a
- inc de
- ld a, [hli]
- ld [de], a
- inc de
- xor a
- ld [de], a
- ret
-
-UpdateAnimation: ; 0x28a9
-; Updates an animation struct. (See wDugtrioAnimationFrameCounter)
-; Input: de = pointer to 3-byte animation struct
-; hl = pointer to animation frames data
-; Sets carry flag if the animation is over.
- ld a, [de]
- and a
- ret z ; return, if counter is zero
- dec a
- ld [de], a
- ret nz ; return if counter is not zero after the decrement
- push de
- inc de
- inc de
- ld a, [de] ; a = current frame index
- inc a
- ld [de], a
- ld c, a
- ld b, $0
- sla c
- rl b
- add hl, bc ; hl = pointer to two-byte entry in the frames data table
- ld a, [hli]
- pop de
- and a
- scf
- ret z ; return if the next entry is $00
- push de
- ld [de], a ; save the animation duration
- inc de
- ld a, [hli]
- ld [de], a ; save the next animation frame id
- pop de
- ret
-
-INCLUDE "text.asm"
-
-Func_30db: ; 0x30db
- ld a, $86
- ld [hWY], a
- ld a, $1
- ld [wd5ca], a
- ld [wd5cb], a
- ret
-
-Func_30e8: ; 0x30e8
- ld a, $81
- ld hl, wcBottomMessageText + $100
- ld b, $40
-.asm_30ef
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- dec b
- jr nz, .asm_30ef
- xor a
- ld [wd5cc], a
- ld [wd5d4], a
- ld [wd5dc], a
- ld [wd5e4], a
- ld [wd5e9], a
- ld [wd5ee], a
- ret
-
-Func_310a: ; 0x310a
- ld a, $81
- ld hl, wc600 + $40
- ld b, $5
-.asm_3111
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- dec b
- jr nz, .asm_3111
- ld hl, wc600 + $c0
- ld b, $5
-.asm_311d
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- dec b
- jr nz, .asm_311d
- ret
-
-Func_3125: ; 0x3125
- ld b, $1
- jr asm_312b
-
-Func_3129: ; 0x3129
- ld b, $0
-asm_312b: ; 0x312b
- ld a, [wd805]
- and a
- jp nz, Func_3268
-.next_char
- ld a, [hli]
- and a
- ret z
- ld c, $81
- cp " "
- jr z, .space
- cp ","
- jr z, .comma
- cp "♂"
- jr z, .male
- cp "♀"
- jr z, .female
- cp "`"
- jr z, .apostrophe
- cp "!"
- jr z, .exclamation
- cp "x"
- jr z, .little_x
- cp "e"
- jr z, .e_acute
- cp "*"
- jr z, .asterisk
- cp "."
- jr z, .period
- cp ":"
- jr z, .colon
- cp "0"
- jr c, .check_atoz
- cp "9" + 1
- jr c, .digit
-.check_atoz
- cp "A"
- jr c, .invalid
- cp "Z" + 1
- jr c, .alphabet
-.invalid
- jr .next_char
-
-.space
- ld a, c
- jr .load_char
-
-.comma
- inc c
- dec e
- jr .check_special_load
-
-.male
- xor a
- call Func_31e1
- ld a, $83
- jr .load_char
-
-.female
- ld a, $1
- call Func_31e1
- ld a, $84
- jr .load_char
-
-.apostrophe
- ld a, $2
- call Func_31e1
- ld a, $85
- jr .load_char
-
-.e_acute
- ld a, $3
- call Func_31e1
- ld a, $83
- jr .load_char
-
-.asterisk
- ld a, $4
- call Func_31e1
- ld a, $87
- jr .load_char
-
-.exclamation
- ld a, $5
- call Func_31e1
- ld a, $85
- jr .load_char
-
-.little_x
- ld a, $6
- call Func_31e1
- ld a, $85
- jr .load_char
-
-.period
- ld a, $7
- call Func_31e1
- ld a, $86
- jr .load_char
-
-.colon
- ld a, $8
- call Func_31e1
- ld a, $83
- jr .load_char
-
-.digit
- add $56
- jr .load_char
-
-.alphabet
- add $bf
-.load_char
- ld [de], a
-.check_special_load
- bit 0, b
- jr nz, .no_special_load
- set 7, e
- ld a, c
- ld [de], a
- res 7, e
-.no_special_load
- inc e
- jp .next_char
-
-Func_31e1: ; 0x31e1
- push bc
- push de
- push hl
- ld c, a
- ld a, [hGameBoyColorFlag]
- and a
- ld a, c
- jr z, .asm_31ed
- add $9
-.asm_31ed
- ld c, a
- sla a
- sla a
- add c
- ld c, a
- ld b, $0
- ld hl, Data_320e ; todo
- add hl, bc
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld h, [hl]
- ld l, a
- ld a, b
- ld bc, $0010
- call LoadVRAMData
- pop hl
- pop de
- pop bc
- ret
-
-Data_320e:
- dr $320e, $3268
-
-Func_3268: ; 0x3268
- ld a, [hli]
- and a
- ret z
- ld c, $81
- cp $20
- jr z, .asm_3297
- cp $2c
- jr z, .asm_329a
- cp $30
- jr c, .asm_327d
- cp $3a
- jr c, .asm_329e
-.asm_327d
- cp $a0
- jr c, .asm_3285
- cp $e0
- jr c, .asm_328f
-.asm_3285
- cp $e0
- jr c, .asm_328d
- cp $f4
- jr c, .asm_3293
-.asm_328d
- jr Func_3268
-
-.asm_328f
- sub $80
- jr .asm_32a0
-
-.asm_3293
- sub $50
- jr .asm_32a0
-
-.asm_3297
- ld a, c
- jr .asm_32a0
-
-.asm_329a
- inc c
- dec e
- jr .asm_32a1
-
-.asm_329e
- add $56
-.asm_32a0
- ld [de], a
-.asm_32a1
- set 7, e
- ld a, c
- ld [de], a
- res 7, e
- inc e
- jr Func_3268
-
-LoadTextHeader: ; 0x32aa
- ld a, $1
- ld [hli], a
- ld a, [de]
- ld [hli], a
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- push af
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- pop af
- ld l, a
- ld h, wcBottomMessageText / $100
-.asm_32c5
- ld a, [de]
- ld [hli], a
- inc de
- and a
- jr nz, .asm_32c5
- ret
-
-Func_32cc: ; 0x32cc
- ld a, $1
- ld [hli], a
- ld a, [de]
- ld [hli], a
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- push af
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- pop af
- ld e, a
- ld d, wcBottomMessageText / $100
- ld hl, [sp+$5]
- lb bc, 8, 1
-.asm_32ec
- ld a, [hl]
- swap a
- and $f
- call Func_3309
- dec b
- ld a, [hld]
- and $f
- call Func_3309
- dec b
- jr nz, .asm_32ec
- ld a, "0"
- ld [de], a
- inc de
- ld a, " "
- ld [de], a
- inc de
- xor a
- ld [de], a
- ret
-
-Func_3309: ; 0x3309
- jr nz, .asm_3312
- ld a, b
- dec a
- jr z, .asm_3312
- ld a, c
- and a
- ret nz
-.asm_3312
- add $30
- ld [de], a
- inc de
- ld c, $0
- ld a, b
- cp $6
- jr z, .asm_3320
- cp $3
- ret nz
-.asm_3320
- ld a, $2c
- ld [de], a
- inc de
- ret
-
-Func_3325: ; 0x3325
- ld a, [hli]
- and a
- ret z
- ld a, [hl]
- dec a
- ld [hli], a
- ret nz
- ld a, [hld]
- ld [hl], a
- inc hl
- inc hl
- push hl
- ld a, [hli]
- ld e, a
- cp [hl]
- inc hl
- jr nz, .asm_333c
- ld a, [hl]
- dec a
- ld [hl], a
- jr nz, .asm_333d
-.asm_333c
- dec e
-.asm_333d
- push de
- ld d, wc600 / $100
- inc hl
- push hl
- ld l, [hl]
- ld h, wcBottomMessageText / $100
- call Func_3129
- pop hl
- inc hl
- ld a, [hl]
- dec a
- ld [hl], a
- pop de
- pop hl
- ld [hl], e
- ret nz
- dec hl
- dec hl
- dec hl
- ld [hl], $0
- ret
-
-Func_3357: ; 0x3357
- ld a, $1
- ld [hli], a
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- push af
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- pop af
- ld l, a
- ld h, wcBottomMessageText / $100
-.asm_336b
- ld a, [de]
- ld [hli], a
- inc de
- and a
- jr nz, .asm_336b
- ret
-
-Func_3372: ; 0x3372
- ld a, $1
- ld [hli], a
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- push af
- inc de
- ld a, [de]
- ld [hli], a
- inc de
- ld a, [de]
- ld [hli], a
- pop af
- ld e, a
- ld d, wcBottomMessageText / $100
- ld hl, [sp+$5]
- lb bc, 8, 1
-.asm_338a
- ld a, [hl]
- swap a
- and $f
- call Func_33a7
- dec b
- ld a, [hld]
- and $f
- call Func_33a7
- dec b
- jr nz, .asm_338a
- ld a, $30
- ld [de], a
- inc de
- ld a, $20
- ld [de], a
- inc de
- xor a
- ld [de], a
- ret
-
-Func_33a7: ; 0x33a7
- jr nz, .asm_33b0
- ld a, b
- dec a
- jr z, .asm_33b0
- ld a, c
- and a
- ret nz
-.asm_33b0
- add $30
- ld [de], a
- inc de
- ld c, $0
- ld a, b
- cp $6
- jr z, .asm_33be
- cp $3
- ret nz
-.asm_33be
- ld a, $2c
- ld [de], a
- inc de
- ret
-
-Func_33c3: ; 0x33c3
- ld a, [hli]
- and a
- ret z
- ld a, [hli]
- ld e, a
- ld d, wc600 / $100
- push hl
- ld l, [hl]
- ld h, wcBottomMessageText / $100
- call Func_3129
- pop hl
- inc hl
- ld a, [hl]
- dec a
- ld [hli], a
- ret nz
- ld a, [hl]
- dec a
- ld [hld], a
- bit 7, a
- ret z
- dec hl
- dec hl
- dec hl
- ld [hl], $0
- ret
-
-Func_33e3: ; 0x33e3
- ld a, [wd5ca]
- and a
- jr nz, .asm_33ed
- ld [wd5cb], a
- ret
-
-.asm_33ed
- ld c, $0
- ld a, [wd5cc]
- and a
- jr z, .asm_33fe
- push bc
- ld hl, wd5cc
- call Func_3325
- pop bc
- inc c
-.asm_33fe
- ld a, [wd5d4]
- and a
- jr z, .asm_340d
- push bc
- ld hl, wd5d4
- call Func_3325
- pop bc
- inc c
-.asm_340d
- ld a, [wd5dc]
- and a
- jr z, .asm_341c
- push bc
- ld hl, wd5dc
- call Func_3325
- pop bc
- inc c
-.asm_341c
- ld a, [wd5e4]
- and a
- jr z, .asm_342b
- push bc
- ld hl, wd5e4
- call Func_33c3
- pop bc
- inc c
-.asm_342b
- ld a, [wd5e9]
- and a
- jr z, .asm_343a
- push bc
- ld hl, wd5e9
- call Func_33c3
- pop bc
- inc c
-.asm_343a
- ld a, [wd5ee]
- and a
- jr z, .asm_3449
- push bc
- ld hl, wd5ee
- call Func_33c3
- pop bc
- inc c
-.asm_3449
- ld a, c
- and a
- ret nz
- ld [wd5ca], a
- call Func_30e8
- ld a, [hGameBoyColorFlag]
- and a
- jr nz, .gameboyColor
- ld a, Bank(StageRedFieldTopStatusBarSymbolsGfx_GameBoy)
- ld hl, $30 + StageRedFieldTopStatusBarSymbolsGfx_GameBoy
- ld de, $8830
- ld bc, $0040
- call LoadOrCopyVRAMData
- ret
-
-.gameboyColor
- ld a, Bank(StageRedFieldTopStatusBarSymbolsGfx_GameBoyColor)
- ld hl, $30 + StageRedFieldTopStatusBarSymbolsGfx_GameBoyColor
- ld de, $8830
- ld bc, $0040
- call LoadOrCopyVRAMData
- ret
-
-Func_3475: ; 0x3475
- xor a
- ld [hJoypadState], a
- ld [hNewlyPressedButtons], a
- ld [hPressedButtons], a
- call HandleTilts
- ld a, [wCurrentStage]
- bit 0, a
- ld [hFarCallTempA], a
- ld a, Bank(HandleFlippers)
- ld hl, HandleFlippers
- call nz, BankSwitch
- ld [hFarCallTempA], a
- callba Func_84b7
- call Func_33e3
- call Func_926
- rst AdvanceFrame
- ld a, [wd5ca]
- and a
- jr nz, Func_3475
- ret
-
-FivePoints: ; 34a6
- bigBCD6 000000000005
-TenPoints: ; 34ac
- bigBCD6 000000000010
-OneHundredPoints: ; 34b2
- bigBCD6 000000000100
-FourHundredPoints: ; 34b8
- bigBCD6 000000000400
-FiveHundredPoints: ; 34be
- bigBCD6 000000000500
-OneThousandPoints: ; 34c4
- bigBCD6 000000001000
-FiveThousandPoints: ; 34ca
- bigBCD6 000000005000
-TenThousandPoints: ; 34d0
- bigBCD6 000000010000
-OneHundredThousandPoints: ; 34d6
- bigBCD6 000000100000
-ThreeHundredThousandPoints: ; 34dc
- bigBCD6 000000300000
-FiveHundredThousandPoints: ; 34e2
- bigBCD6 000000500000
-OneMillionPoints: ; 34e8
- bigBCD6 000001000000
-FiveMillionPoints: ; 34ee
- bigBCD6 000005000000
-TenMillionPoints: ; 34f4
- bigBCD6 000010000000
-OneHundredMillionPoints: ; 34fa
- bigBCD6 000100000000
-
-Func_3500:
- ld hl, wd464
- ld a, e
- ld [hli], a
- ld a, d
- ld [hli], a
- ld a, c
- ld [hli], a
- ld a, b
- ld [hli], a
- xor a
- ld [hli], a
- ld [hl], a
- ld bc, wd464
- ldh [hFarCallTempA], a
- callba AddBCDScore
- ret
-
-Func_351c: ; 0x351c
- ld hl, wd464
- ld a, e
- ld [hli], a
- ld a, d
- ld [hli], a
- ld a, c
- ld [hli], a
- ld a, b
- ld [hli], a
- xor a
- ld [hli], a
- ld [hl], a
- ld bc, wd464
- ld [hFarCallTempA], a
- callba Func_8588
- ret
-
-Func_3538: ; 0x3538
-; Add BCD value bcde to [wd47a]. Cap at $99999999.
- ld hl, wd47a
- ld a, [hl]
- add e
- daa
- ld [hli], a
- ld a, [hl]
- adc d
- daa
- ld [hli], a
- ld a, [hl]
- adc c
- daa
- ld [hli], a
- ld a, [hl]
- adc b
- daa
- ld [hli], a
- ret nc
- ld hl, wd47a
- ld a, $99
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ret
-
-Func_3556: ; 0x3556
- ld a, [wd47a]
- ld e, a
- ld a, [wd47a + 1]
- ld d, a
- ld a, [wd47a + 2]
- ld c, a
- ld a, [wd47a + 3]
- ld b, a
- ret
-
-Func_3567:
- ld a, l
- add c
- daa
- ld l, a
- ld a, h
- adc b
- daa
- ld h, a
- ret
-
-Func_3570:
- ld a, l
- add e
- daa
- ld l, a
- ld a, h
- adc d
- daa
- ld h, a
- ret
-
-Func_3579: ; 0x3579
- ld hl, wd47a
- xor a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ret
-
-HandleTilts: ; 0x3582
- call HandleLeftTilt
- call HandleRightTilt
- call HandleUpperTilt
- ret
-
-HandleLeftTilt: ; 0x358c
- ld a, [wLeftTiltReset]
- and a
- jr nz, .tiltCoolDown
- ld hl, wKeyConfigLeftTilt
- call IsKeyPressed2
- jr z, .tiltCoolDown
- ld a, [wLeftTiltCounter]
- cp $3
- jr z, .startCoolDown
- inc a
- ld [wLeftTiltCounter], a
- cp $1
- jr nz, .skipSoundEffect
- ld de, $003f
- call PlaySoundEffect
-.skipSoundEffect
- ld a, [wd548]
- ld hl, wd549
- and [hl]
- jr z, .skipBallMovement
- ld a, [wBallXPos + 1]
- dec a ; move ball's position to the left by 1 pixel
- ld [wBallXPos + 1], a
-.skipBallMovement
- ld a, [wd79f]
- inc a
- ld [wd79f], a
- ld a, $1
- ld [wLeftTiltPushing], a
- ret
-
-.startCoolDown
- ld a, $1
- ld [wLeftTiltReset], a
-.tiltCoolDown
- xor a
- ld [wLeftTiltPushing], a
- ld a, [wLeftTiltCounter]
- and a
- jr z, .done
- dec a
- ld [wLeftTiltCounter], a
- ld a, [wd79f]
- dec a
- ld [wd79f], a
- ret
-
-.done
- ld hl, wKeyConfigLeftTilt
- call IsKeyPressed2
- ret nz
- xor a
- ld [wLeftTiltReset], a
- ret
-
-HandleRightTilt: ; 0x35f3
- ld a, [wRightTiltReset]
- and a
- jr nz, .tiltCoolDown
- ld hl, wKeyConfigRightTilt
- call IsKeyPressed2
- jr z, .tiltCoolDown
- ld a, [wRightTiltCounter]
- cp $3
- jr z, .startCoolDown
- inc a
- ld [wRightTiltCounter], a
- cp $1
- jr nz, .skipSoundEffect
- ld de, $003f
- call PlaySoundEffect
-.skipSoundEffect
- ld a, [wd548]
- ld hl, wd549
- and [hl]
- jr z, .skipBallMovement
- ld a, [wBallXPos + 1]
- inc a ; move ball's position to the right by 1 pixel
- ld [wBallXPos + 1], a
-.skipBallMovement
- ld a, [wd79f]
- dec a
- ld [wd79f], a
- ld a, $1
- ld [wRightTiltPushing], a
- ret
-
-.startCoolDown
- ld a, $1
- ld [wRightTiltReset], a
-.tiltCoolDown
- xor a
- ld [wRightTiltPushing], a
- ld a, [wRightTiltCounter]
- and a
- jr z, .done
- dec a
- ld [wRightTiltCounter], a
- ld a, [wd79f]
- inc a
- ld [wd79f], a
- ret
-
-.done
- ld hl, wKeyConfigRightTilt
- call IsKeyPressed2
- ret nz
- xor a
- ld [wRightTiltReset], a
- ret
-
-HandleUpperTilt: ; 0x365a
- ld a, [wUpperTiltReset]
- and a
- jr nz, .tiltCoolDown
- ld hl, wKeyConfigUpperTilt
- call IsKeyPressed2
- jr z, .tiltCoolDown
- ld a, [wUpperTiltCounter]
- cp $4
- jr z, .startCoolDown
- inc a
- ld [wUpperTiltCounter], a
- cp $1
- jr nz, .skipSoundEffect
- ld de, $003f
- call PlaySoundEffect
-.skipSoundEffect
- ld a, [wd548]
- ld hl, wd549
- and [hl]
- jr z, .skipBallMovement
- ld a, [wBallYPos + 1]
- inc a ; move ball's position down by 1 pixel
- ld [wBallYPos + 1], a
-.skipBallMovement
- ld a, [wd7a0]
- dec a
- ld [wd7a0], a
- ld a, $1
- ld [wUpperTiltPushing], a
- ret
-
-.startCoolDown
- ld a, $1
- ld [wUpperTiltReset], a
-.tiltCoolDown
- xor a
- ld [wUpperTiltPushing], a
- ld a, [wUpperTiltCounter]
- and a
- jr z, .done
- dec a
- ld [wUpperTiltCounter], a
- ld a, [wd7a0]
- inc a
- ld [wd7a0], a
- ret
-
-.done
- ld hl, wKeyConfigUpperTilt
- call IsKeyPressed2
- ret nz
- xor a
- ld [wUpperTiltReset], a
- ret
-
-ApplyTiltForces: ; 0x36c1
- ld a, [wd548]
- ld hl, wd549
- and [hl]
- ret z
- ld c, $0
- ld a, [wUpperTiltPushing]
- srl a
- rl c
- ld a, [wRightTiltPushing]
- srl a
- rl c
- ld a, [wLeftTiltPushing]
- srl a
- rl c
- ld b, $0
- sla c
- ld hl, Data_372d
- add hl, bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- bit 7, h
- ret nz
- ld a, [wd7ea]
- ld c, a
- ld b, $0
- sla c
- rl b
- sla c
- rl b
- add hl, bc
- ld a, [hLoadedROMBank]
- push af
- ld a, BANK(TiltLeftOnlyForce)
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ld a, [wBallXVelocity]
- add [hl]
- ld [wBallXVelocity], a
- inc hl
- ld a, [wBallXVelocity + 1]
- adc [hl]
- ld [wBallXVelocity + 1], a
- inc hl
- ld a, [wBallYVelocity]
- add [hl]
- ld [wBallYVelocity], a
- inc hl
- ld a, [wBallYVelocity + 1]
- adc [hl]
- ld [wBallYVelocity + 1], a
- pop af
- ld [hLoadedROMBank], a
- ld [MBC5RomBank], a
- ret
-
-Data_372d:
- dw -1 ; no tilt
- dw TiltLeftOnlyForce
- dw TiltRightOnlyForce
- dw -1 ; left + right (cancel)
- dw TiltUpOnlyForce
- dw TiltUpLeftForce
- dw TiltUpRightForce
- dw TiltUpOnlyForce
-
-SECTION "bank0.2", ROM0 [$3800]
-
-Data_3800:
- dr $3800, $3980
-
-Data_3980:
- dr $3980, $3b00
-
-Data_3b00:
- dr $3b00, $3c80
-
-Data_3c80:
- dr $3c80, $3e00
-
-SquaresLow:
-x = 0
-rept 256
- db (x * x) % $100
-x = x + 1
-endr
-
-SquaresHigh:
-x = 0
-rept 256
- db (x * x) / $100
-x = x + 1
-endr
+INCLUDE "home.asm"
SECTION "bank1", ROMX, BANK[$1]
@@ -11274,14 +3667,14 @@ Func_8104: ; 0x8104
jr nz, .asm_812e
ld a, Bank(Data_813a)
ld bc, Data_813a
- ld de, LoadTileLists ; todo
+ ld de, LoadTileLists
call Func_10c5
ret
.asm_812e
ld a, Bank(Data_8144)
ld bc, Data_8144
- ld de, LoadTileLists ; todo
+ ld de, LoadTileLists
call Func_10c5
ret
@@ -11348,7 +3741,7 @@ CheckForResetButtonCombo: ; 0x8167
call ClearOAMBuffer
call Func_b66
call Func_588
- call Func_14a4
+ call SGBNormal
call Func_bbe
ld hl, wScreenState
inc [hl]
@@ -11456,9 +3849,9 @@ FadeInCopyrightScreen: ; 0x8228
call ClearOAMBuffer
call Func_b66
call Func_588
- call Func_14a4
+ call SGBNormal
ld bc, $0050
- call Func_93f
+ call AdvanceFrames
call Func_bbe
ld hl, wScreenState
inc [hl]
@@ -11630,7 +4023,7 @@ Func_8388: ; 0x8388
ld hl, wPartyMons
ld bc, $0170
call ClearData
- ld hl, wd473 ; todo
+ ld hl, wd473
ld bc, $0039
call ClearData
ld hl, wd4ad
@@ -12251,7 +4644,7 @@ HandleInGameMenu: ; 0x86d7
ld [wd804], a
.pickedCancel
ld bc, $003c
- call Func_93f
+ call AdvanceFrames
ld a, $86
ld [hWY], a
ld a, $83
@@ -13602,7 +5995,7 @@ TitlescreenLoop: ; 0xc089
ld de, $0027
call PlaySoundEffect
ld bc, $0037
- call Func_93f
+ call AdvanceFrames
ld a, $3
ld [wScreenState], a
ret
@@ -13657,7 +6050,7 @@ Func_c10e: ; 0xc10e
ld de, $0027
call PlaySoundEffect
ld bc, $0041
- call Func_93f
+ call AdvanceFrames
ld a, [wTitleScreenGameStartCursorSelection]
and a
jr z, .asm_c177
@@ -13800,7 +6193,7 @@ HandleTitlescreenPikachuBlinkingAnimation: ; 0xc21e
ld b, $0
ld hl, TitleScreenBlinkAnimation
add hl, bc
- ld bc, $3810
+ lb bc, $38, $10
ld a, [hl]
cp $5a ; blink animation frame 1 OAM id
call nz, LoadOAMData
@@ -14100,7 +6493,7 @@ Func_c447: ; 0xc447
ld a, [wd916]
and a
jr nz, .asm_c465
- ld a, [$fffb]
+ ld a, [hSGBFlag]
and a
ret nz
call Func_c4f4
@@ -14265,7 +6658,7 @@ Func_c55a: ; 0xc55a
ld de, $0001
call PlaySoundEffect
ld bc, $001e
- call Func_93f
+ call AdvanceFrames
ld a, [wd918]
dec a
sla a
@@ -14310,7 +6703,7 @@ Func_c55a: ; 0xc55a
call Func_c639
push hl
ld bc, $001e
- call Func_93f
+ call AdvanceFrames
pop hl
ld bc, $0020
add hl, bc
@@ -15424,12 +7817,12 @@ Func_ccb6: ; 0xccb6
call PlaySoundEffect
call CopyInitialHighScores
ld a, BANK(HighScoresTilemap)
- ld hl, HighScoresTilemap + $40 ; todo
+ ld hl, HighScoresTilemap + $40
ld de, $9840
ld bc, $01c0
call LoadVRAMData
ld a, BANK(HighScoresTilemap2)
- ld hl, HighScoresTilemap2 + $40 ; todo
+ ld hl, HighScoresTilemap2 + $40
ld de, $9c40
ld bc, $01c0
call LoadVRAMData
@@ -15716,7 +8109,7 @@ Func_cf58: ; 0xcf58
call ClearOAMBuffer
rst AdvanceFrame
pop af
- ld bc, $473b ; todo
+ ld bc, $473b
add $8f
call LoadOAMData
.asm_cf6f
@@ -15919,7 +8312,7 @@ Func_d042: ; 0xd042
ret c
.asm_d0a2
ld a, BANK(HighScoresTilemap2)
- ld hl, HighScoresTilemap2 + $3c0 ; todo
+ ld hl, HighScoresTilemap2 + $3c0
ld de, wc280
ld bc, $0040
call FarCopyData
@@ -15929,7 +8322,7 @@ Func_d042: ; 0xd042
ld bc, $01c0
call LoadVRAMData
ld a, BANK(HighScoresTilemap2)
- ld hl, HighScoresTilemap2 + $280 ; todo
+ ld hl, HighScoresTilemap2 + $280
ld de, wc480
ld bc, $0040
call FarCopyData
@@ -16887,7 +9280,7 @@ FieldSelectGfx_GameBoyColor: ; 0xd730
ChooseFieldToPlay: ; 0xd74e
call MoveFieldSelectCursor
- ld hl, Data_d83d ; todo
+ ld hl, Data_d83d
call AnimateBlinkingFieldSelectBorder
ld a, [hNewlyPressedButtons]
and (A_BUTTON | B_BUTTON)
@@ -16991,7 +9384,7 @@ AnimateBlinkingFieldSelectBorder: ; 0xd7fb
sla a
ld c, a
ld b, $0
- ld hl, Data_d84f ; todo
+ ld hl, Data_d84f
add hl, bc
ld a, [hli]
ld c, a
@@ -17230,7 +9623,7 @@ SaveGame: ; 0xda05
ld de, $0000
call PlaySong
ld bc, $0004
- call Func_93f
+ call AdvanceFrames
call Func_cb5
ld a, [wd849]
and a
@@ -17330,7 +9723,7 @@ Func_dab2: ; 0xdab2
ld de, $0000
call PlaySong
ld bc, $0004
- call Func_93f
+ call AdvanceFrames
call Func_cb5
ld a, [wd849]
and a
@@ -17357,7 +9750,7 @@ Func_dab2: ; 0xdab2
ld de, $0000
call PlaySong
ld bc, $0004
- call Func_93f
+ call AdvanceFrames
call Func_cb5
ld a, [wd849]
and a
@@ -17381,7 +9774,7 @@ TransitionToHighScoresScreen: ; 0xdb5d
ld de, $0000
call PlaySong
ld bc, $0004
- call Func_93f
+ call AdvanceFrames
call Func_cb5
call Func_576
ld hl, hSTAT
@@ -17723,7 +10116,7 @@ Func_dd76: ; 0xdd76
ld de, $0000
call PlaySong
ld bc, $001e
- call Func_93f
+ call AdvanceFrames
ld de, $2524
call PlaySoundEffect
call Func_dbba
@@ -17830,7 +10223,7 @@ Func_de4f: ; 0xde4f
ld de, $0000
call PlaySong
ld bc, $001e
- call Func_93f
+ call AdvanceFrames
ld de, $2524
call PlaySoundEffect
call Func_dbba
@@ -20521,7 +12914,7 @@ Func_f57f: ; 0xf57f
Func_f5a0: ; 0xf5a0
ld de, wcBottomMessageText + $40
- ld hl, Data_3069 ; todo
+ ld hl, Data_3069
call PrintTextNoHeader
ld de, wcBottomMessageText + $80
ld hl, Data_3070
@@ -20602,7 +12995,7 @@ CallTable_f60d: ; 0xf60d
Func_f626: ; 0xf626
ld de, wcBottomMessageText + $01
- ld hl, Data_3006 ; todo
+ ld hl, Data_3006
call PrintTextNoHeader
ld hl, wcBottomMessageText + $01
ld a, [wd628]
@@ -20618,7 +13011,7 @@ Func_f626: ; 0xf626
Func_f64e: ; 0xf64e
ld de, wcBottomMessageText
- ld hl, Data_3019 ; todo
+ ld hl, Data_3019
call PrintTextNoHeader
ld hl, wcBottomMessageText
ld a, [wd629]
@@ -20657,10 +13050,10 @@ Func_f676: ; 0xf676
dec b
jr nz, .asm_f678
ld de, wcBottomMessageText + $40
- ld hl, Data_307a ; todo
+ ld hl, Data_307a
call PrintTextNoHeader
ld de, wcBottomMessageText + $80
- ld hl, Data_3086 ; todo
+ ld hl, Data_3086
call PrintTextNoHeader
ld hl, wcBottomMessageText + $50
ld a, [wd482]
@@ -22302,8 +14695,8 @@ Func_106b6: ; 0x106b6
rl b ; bc was just multiplied by 16
ld hl, PokemonNames + 1
add hl, bc
- ld de, YouGotAnText ; todo "You got an"
- ld bc, Data_2a91 ; todo
+ ld de, YouGotAnText ; "You got an"
+ ld bc, Data_2a91
ld a, [hl]
; check if mon's name starts with a vowel, so it can print "an", instead of "a"
cp "A"
@@ -22316,7 +14709,7 @@ Func_106b6: ; 0x106b6
jr z, .asm_106f1
cp "O"
jr z, .asm_106f1
- ld de, YouGotAText ; todo "You got a"
+ ld de, YouGotAText ; "You got a"
ld bc, Data_2a79
.asm_106f1
push hl
@@ -25777,8 +18170,8 @@ Func_14467: ; 0x14467
jp Func_2775
Func_14474: ; 0x14474
- ld de, Data_14515 ; todo
- ld hl, Data_144fd ; todo
+ ld de, Data_14515
+ ld hl, Data_144fd
ld bc, wd4cb
and a
jp Func_2775
@@ -25797,7 +18190,7 @@ Func_1448e: ; 0x1448e
jp Func_2775
Func_14498: ; 0x14498
- ld de, Data_1453c ; todo
+ ld de, Data_1453c
ld bc, wd507
scf
jp Func_2775
@@ -25815,14 +18208,14 @@ Func_144ac: ; 0x144ac
jp Func_2775
Func_144b6: ; 0x144b6
- ld de, Data_1455d ; todo
+ ld de, Data_1455d
ld bc, wd51f
scf
jp Func_2775
Func_144c0: ; 0x144c0
- ld de, Data_1457d ; todo
- ld hl, Data_14578 ; todo
+ ld de, Data_1457d
+ ld hl, Data_14578
ld bc, wd500
and a
jp Func_2775
@@ -27840,10 +20233,10 @@ Func_161e0: ; 0x161e0
sla c
add hl, bc
asm_1620f: ; 0x1620f
- ld bc, $4000
+ ld bc, Data_f0000
add hl, bc
ld de, wBallXVelocity
- ld a, $3c
+ ld a, BANK(Data_f0000)
call ReadByteFromBank
ld c, a
ld a, [de]
@@ -27851,7 +20244,7 @@ asm_1620f: ; 0x1620f
ld [de], a
inc de
inc hl
- ld a, $3c
+ ld a, BANK(Data_f0000)
call ReadByteFromBank
ld b, a
ld a, [de]
@@ -27860,7 +20253,7 @@ asm_1620f: ; 0x1620f
inc de
inc hl
push bc
- ld a, $3c
+ ld a, BANK(Data_f0000)
call ReadByteFromBank
ld c, a
ld a, [de]
@@ -27868,7 +20261,7 @@ asm_1620f: ; 0x1620f
ld [de], a
inc de
inc hl
- ld a, $3c
+ ld a, BANK(Data_f0000)
call ReadByteFromBank
ld b, a
ld a, [de]
@@ -29532,7 +21925,7 @@ Func_17e81: ; 0x17e81
ld a, [hGameBoyColorFlag]
and a
ret nz
- ld a, [$fffb]
+ ld a, [hSGBFlag]
and a
ret nz
ld a, [wd4c5]
@@ -29790,16 +22183,16 @@ InitGengarBonusStage: ; 0x18099
ld [wd4c8], a
ld [wBallType], a
ld [wd49a], a
- ld hl, Data_18121 ; todo
+ ld hl, Data_18121
ld de, wd659
call Func_18112
call Func_18112
call Func_18112
- ld hl, Data_1813c ; todo
+ ld hl, Data_1813c
ld de, wd67e
call Func_18112
call Func_18112
- ld hl, Data_1814e ; todo
+ ld hl, Data_1814e
ld de, wd698
call Func_18112
xor a
@@ -32452,7 +24845,7 @@ Func_19aba: ; 0x19aba
ret nc
ld c, a
ld b, $0
- ld hl, Data_19b18 ; todo
+ ld hl, Data_19b18
add hl, bc
ld a, [hl]
cp $a
@@ -34504,7 +26897,7 @@ Func_1cb1c: ; 0x1cb1c
ld a, [wd517]
ld c, a
ld b, $0
- ld hl, Data_1cb33 ; todo
+ ld hl, Data_1cb33
add hl, bc
ld a, [hl]
ld e, a
@@ -34520,11 +26913,11 @@ Func_1cb43: ; 0x1cb43
ld c, a
sla c
ld b, $0
- ld hl, Data_1cb60 ; todo
+ ld hl, Data_1cb60
ld a, [hGameBoyColorFlag]
and a
jr z, .asm_1cb56
- ld hl, Data_1cd10 ; todo
+ ld hl, Data_1cd10
.asm_1cb56
add hl, bc
ld a, [hli]
@@ -38233,9 +30626,9 @@ Func_20230: ; 0x20230
ld a, [wd5b6]
add $4
cp $18
- jr c, .asm_20259
+ jr c, .master_loop9
ld a, $18
-.asm_20259
+.master_loop9
ld [wd5b6], a
cp $18
jr nz, .asm_20264
@@ -43432,7 +35825,7 @@ Func_26137: ; 0x26137
sla a
ld c, a
ld b, $0
- ld hl, Data_2614f ; todo
+ ld hl, Data_2614f
add hl, bc
ld a, [hli]
ld h, [hl]
@@ -45251,7 +37644,7 @@ Func_28add: ; 0x28add
and a
ret z
push bc
- ld hl, MonBillboardPaletteMapPointers ; todo
+ ld hl, MonBillboardPaletteMapPointers
add hl, bc
ld a, Bank(MonBillboardPaletteMapPointers)
call ReadByteFromBank
diff --git a/wram.asm b/wram.asm
index d935467..0b737a1 100755
--- a/wram.asm
+++ b/wram.asm
@@ -97,7 +97,10 @@ wcb00:: ; 0xcb00
SECTION "WRAM Bank 1", WRAMX, BANK[1]
wOAMBuffer:: ; 0xd000
- ds $200
+ ds $a0
+
+wOAMBufferEnd:: ; 0xd0a0
+ ds $160
wPaletteData:: ; 0xd200
ds $80
@@ -1845,7 +1848,7 @@ wd800:: ; 0xd800
wd801:: ; 0xd801
ds $1
-wd802:: ; 0xd802
+wOAMBufferSize:: ; 0xd802
ds $1
wd803:: ; 0xd803
@@ -2616,9 +2619,12 @@ wdead:: ; 0xdead
ds $1
wdeae:: ; 0xdeae
- ds $52
+ ds $2
+
+wdeb0:: ; 0xdeb0
+ ds $50
-wStack::
+wStack:: ; 0xdf00
ds $ff
wdfff:: ; 0xdfff