diff options
Diffstat (limited to 'home')
-rw-r--r-- | home/audio.asm | 101 | ||||
-rw-r--r-- | home/copy.asm | 591 | ||||
-rw-r--r-- | home/ir.asm | 457 | ||||
-rw-r--r-- | home/joypad.asm | 131 | ||||
-rw-r--r-- | home/random.asm | 129 |
5 files changed, 1409 insertions, 0 deletions
diff --git a/home/audio.asm b/home/audio.asm new file mode 100644 index 0000000..622e5da --- /dev/null +++ b/home/audio.asm @@ -0,0 +1,101 @@ + +PlaySong: ; 0x490 + ld a, [hLoadedROMBank] + push af + ld a, [wCurrentSongBank] + ld [hLoadedROMBank], a + ld [MBC5RomBank], a + ld a, e + ld [wStageSong], a + ld a, [wCurrentSongBank] + ld [wStageSongBank], a + call PlaySong_BankF ; this function is replicated in multiple banks. + pop af + ld [hLoadedROMBank], a + ld [MBC5RomBank], a + ret + +PlaySoundEffect: ; 0x4af +; u8 d = duration +; u8 e = SFX ID + ld a, [wdead] + and a + ret nz + ld a, [wSFXTimer] + and a + jr z, .asm_4bd + ld a, d + and a + ret z +.asm_4bd + ld a, d + ld [wSFXTimer], 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 + +PlaySFXIfNoneActive: ; 0x4d8 + push bc + push de + push hl + ld a, [wChannel4 + 2] + ld hl, wChannel5 + 2 + or [hl] + ld hl, wChannel6 + 2 + 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 + +UpdateSFX: ; 0x504 + ld a, [hLoadedROMBank] + push af + ld a, [wCurrentSongBank] + ld [hLoadedROMBank], a + ld [MBC5RomBank], a + call Func_3c180 + pop af + ld [hLoadedROMBank], a + ld [MBC5RomBank], a + ld a, [wd801] + inc a + ld [wd801], a + and $3 + ret nz + ld a, [wSFXTimer] + and a + ret z + dec a + ld [wSFXTimer], a + ret + +SetSongBank: ; 0x52c + di + ld [wCurrentSongBank], a + ei + ret diff --git a/home/copy.asm b/home/copy.asm new file mode 100644 index 0000000..d8f2a74 --- /dev/null +++ b/home/copy.asm @@ -0,0 +1,591 @@ +__memset_8: ; 0xc3e + dec bc +.asm_63f + ld [hli], a + dec bc + bit 7, b + jr z, .asm_63f + ret + +__memset_16: + 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 or palette offset for data + inc hl + ld c, [hl] + inc hl + ld b, [hl] ; bc contains size and flags + inc hl ; this is a wasted instruction + pop hl + call .autoCopyVideoData + pop hl + ld bc, $0005 + add hl, bc + jr .loadItem + +.autoCopyVideoData +; a: bank +; hl: source +; bc: flags and size rolled into one +; bit 0: CGB palette data if set, tile data else +; If tile data: +; bit 1: VBank +; de = dest +; Else: +; de = palette offset +; remaining bits: size + srl b + rr c + jp c, FarCopyCGBPals ; if lowest bit of bc is set + jp @ + 2 + 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 + +FarCopyCGBPals: ; 0x6fd +; a: bank +; hl: source +; e: dest offset +; bc: size + 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, .do_obp + ld de, rBGPI + call .copyPaletteData + jr z, .no_obp + xor a +.do_obp + ld de, rOBPI + call .copyPaletteData +.no_obp + pop af + ld [hLoadedROMBank], a + ld [MBC5RomBank], a + ret + +.copyPaletteData + res 6, a ; only 64 bytes fit here + ld b, a + set 7, a ; auto-increment + 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 + +LoadBillboardPaletteMap: ; 0x86f +; Loads the background palette map for a 6x4-tile billboard picture. + 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 +.loop + 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, .loop + 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 diff --git a/home/ir.asm b/home/ir.asm new file mode 100644 index 0000000..97572eb --- /dev/null +++ b/home/ir.asm @@ -0,0 +1,457 @@ +Func_1be3: ; 0x1be3 + ld a, $c0 + ld [rRP], a + ld a, $ff + ld [wd8ea], a + xor a + ld b, a +.loop + inc a + jr nz, .loop + inc b + jr nz, .loop + ld hl, wd8eb + ld a, [rKEY1] + bit 7, a + jr z, .normalSpeed + ld [hl], $e + inc hl + ld [hl], $12 + inc hl + ld [hl], $8 + inc hl + ld [hl], $c + inc hl + ld [hl], $c + ret + +.normalSpeed + 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 diff --git a/home/joypad.asm b/home/joypad.asm new file mode 100644 index 0000000..ff9e6dc --- /dev/null +++ b/home/joypad.asm @@ -0,0 +1,131 @@ + +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, wJoypadStatesPersistent + 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 + +ClearPersistentJoypadStates: ; 0xb2e + ld hl, wJoypadStatesPersistent + 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 diff --git a/home/random.asm b/home/random.asm new file mode 100644 index 0000000..84e4571 --- /dev/null +++ b/home/random.asm @@ -0,0 +1,129 @@ +GenRandom: ; 0x959 + push bc + push de + push hl + ld a, [wd811] + ld c, a + ld b, $0 + inc a + cp 54 + 1 + 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, [sRNGMod] +.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 [sRNGMod], 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, wd812 + $1f + 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, wd812 + $18 + 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 >> 7) & 1) +x = x + 2 +ENDR |