diff options
Diffstat (limited to 'home.asm')
-rwxr-xr-x | home.asm | 6512 |
1 files changed, 6512 insertions, 0 deletions
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 + |