diff --git a/home.asm b/home.asm index eb5848e5b..4cad2b2f6 100644 --- a/home.asm +++ b/home.asm @@ -24,7 +24,7 @@ SECTION "Home", ROM0 INCLUDE "home/init.asm" INCLUDE "home/vblank.asm" INCLUDE "home/delay.asm" -INCLUDE "home/rtc.asm" +INCLUDE "home/time_palettes.asm" INCLUDE "home/fade.asm" INCLUDE "home/lcd.asm" INCLUDE "home/time.asm" @@ -32,7 +32,7 @@ INCLUDE "home/serial.asm" INCLUDE "home/joypad.asm" INCLUDE "home/decompress.asm" INCLUDE "home/palettes.asm" -INCLUDE "home/copy.asm" +INCLUDE "home/gfx.asm" INCLUDE "home/text.asm" INCLUDE "home/video.asm" INCLUDE "home/map_objects.asm" @@ -41,169 +41,31 @@ INCLUDE "home/movement.asm" INCLUDE "home/menu.asm" INCLUDE "home/menu_window.asm" INCLUDE "home/menu2.asm" -INCLUDE "home/handshake.asm" +INCLUDE "home/printer.asm" INCLUDE "home/game_time.asm" INCLUDE "home/map.asm" - -InexplicablyEmptyFunction:: -; unused -; Inexplicably empty. -; Seen in PredefPointers. -rept 16 - nop -endr - ret - INCLUDE "home/farcall.asm" INCLUDE "home/predef.asm" INCLUDE "home/window.asm" INCLUDE "home/flag.asm" - -Unreferenced_CheckBPressedDebug:: -; Used in debug ROMs to walk through walls and avoid encounters. - - ld a, [wDebugFlags] - bit DEBUG_FIELD_F, a - ret z - - ldh a, [hJoyDown] - bit B_BUTTON_F, a - ret - -xor_a:: - xor a - ret - -xor_a_dec_a:: - xor a - dec a - ret - -Unreferenced_CheckFieldDebug:: - push hl - ld hl, wDebugFlags - bit DEBUG_FIELD_F, [hl] - pop hl - ret - INCLUDE "home/sprite_updates.asm" INCLUDE "home/string.asm" INCLUDE "home/region.asm" - -ret_2f3e:: - ret - INCLUDE "home/item.asm" INCLUDE "home/random.asm" INCLUDE "home/sram.asm" - -; Register aliases - -_hl_:: - jp hl - -_de_:: - push de - ret - +INCLUDE "home/call_regs.asm" INCLUDE "home/double_speed.asm" INCLUDE "home/clear_sprites.asm" -INCLUDE "home/copy2.asm" +INCLUDE "home/copy.asm" INCLUDE "home/copy_tilemap.asm" INCLUDE "home/copy_name.asm" - -IsInArray:: -; Find value a for every de bytes in array hl. -; Return index in b and carry if found. - - ld b, 0 - ld c, a -.loop - ld a, [hl] - cp -1 - jr z, .NotInArray - cp c - jr z, .InArray - inc b - add hl, de - jr .loop - -.NotInArray: - and a - ret - -.InArray: - scf - ret - -SkipNames:: -; Skip a names. - ld bc, NAME_LENGTH - and a - ret z -.loop - add hl, bc - dec a - jr nz, .loop - ret - +INCLUDE "home/array.asm" INCLUDE "home/math.asm" INCLUDE "home/print_text.asm" - -CallPointerAt:: - ldh a, [hROMBank] - push af - ld a, [hli] - rst Bankswitch - - ld a, [hli] - ld h, [hl] - ld l, a - - call _hl_ - - pop hl - ld a, h - rst Bankswitch - ret - INCLUDE "home/queue_script.asm" INCLUDE "home/compare.asm" INCLUDE "home/tilemap.asm" -INCLUDE "home/hp_pals.asm" - -CountSetBits:: -; Count the number of set bits in b bytes starting from hl. -; Return in a, c and [wNumSetBits]. - ld c, 0 -.next - ld a, [hli] - ld e, a - ld d, 8 - -.count - srl e - ld a, 0 - adc c - ld c, a - dec d - jr nz, .count - - dec b - jr nz, .next - - ld a, c - ld [wNumSetBits], a - ret - -GetWeekday:: - ld a, [wCurDay] -.mod - sub 7 - jr nc, .mod - add 7 - ret - INCLUDE "home/pokedex_flags.asm" INCLUDE "home/names.asm" INCLUDE "home/scrolling_menu.asm" @@ -214,7 +76,7 @@ INCLUDE "home/cry.asm" INCLUDE "home/print_level.asm" INCLUDE "home/mon_data.asm" INCLUDE "home/print_bcd.asm" -INCLUDE "home/mon_data_2.asm" +INCLUDE "home/mon_party.asm" INCLUDE "home/battle.asm" INCLUDE "home/sprite_anims.asm" INCLUDE "home/audio.asm" diff --git a/home/array.asm b/home/array.asm new file mode 100644 index 000000000..0abf9b7d3 --- /dev/null +++ b/home/array.asm @@ -0,0 +1,44 @@ +IsInArray:: +; Find value a for every de bytes in array hl. +; Return index in b and carry if found. + + ld b, 0 + ld c, a +.loop + ld a, [hl] + cp -1 + jr z, .NotInArray + cp c + jr z, .InArray + inc b + add hl, de + jr .loop + +.NotInArray: + and a + ret + +.InArray: + scf + ret + +SkipNames:: +; Skip a names. + ld bc, NAME_LENGTH + and a + ret z +.loop + add hl, bc + dec a + jr nz, .loop + ret + +AddNTimes:: +; Add bc * a to hl. + and a + ret z +.loop + add hl, bc + dec a + jr nz, .loop + ret diff --git a/home/battle.asm b/home/battle.asm index 7f2e8bfdd..fff6b7d42 100644 --- a/home/battle.asm +++ b/home/battle.asm @@ -224,3 +224,22 @@ GetBattleAnimByte:: ld a, [wBattleAnimByte] ret + +PushLYOverrides:: + ldh a, [hLCDCPointer] + and a + ret z + + ld a, LOW(wLYOverridesBackup) + ld [wRequested2bppSource], a + ld a, HIGH(wLYOverridesBackup) + ld [wRequested2bppSource + 1], a + + ld a, LOW(wLYOverrides) + ld [wRequested2bppDest], a + ld a, HIGH(wLYOverrides) + ld [wRequested2bppDest + 1], a + + ld a, (wLYOverridesEnd - wLYOverrides) / 16 + ld [wRequested2bpp], a + ret diff --git a/home/call_regs.asm b/home/call_regs.asm new file mode 100644 index 000000000..d0a4be1b9 --- /dev/null +++ b/home/call_regs.asm @@ -0,0 +1,8 @@ +; Register aliases + +_hl_:: + jp hl + +_de_:: + push de + ret diff --git a/home/copy.asm b/home/copy.asm index 5780beb95..018986cf2 100644 --- a/home/copy.asm +++ b/home/copy.asm @@ -1,391 +1,131 @@ -; Functions to copy data from ROM. - -Get2bpp_2:: - ldh a, [rLCDC] - bit rLCDC_ENABLE, a - jp z, Copy2bpp - - homecall _Get2bpp - - ret - -Get1bpp_2:: - ldh a, [rLCDC] - bit rLCDC_ENABLE, a - jp z, Copy1bpp - - homecall _Get1bpp - - ret - -FarCopyBytesDouble_DoubleBankSwitch:: - ldh [hBuffer], a - ldh a, [hROMBank] - push af - ldh a, [hBuffer] - rst Bankswitch - - call FarCopyBytesDouble - - pop af - rst Bankswitch - ret - -OldDMATransfer:: +CopyBytes:: +; copy bc bytes from hl to de + inc b ; we bail the moment b hits 0, so include the last run + inc c ; same thing; include last byte + jr .HandleLoop +.CopyByte: + ld a, [hli] + ld [de], a + inc de +.HandleLoop: dec c - ldh a, [hBGMapMode] + jr nz, .CopyByte + dec b + jr nz, .CopyByte + ret + +SwapBytes:: +; swap bc bytes between hl and de +.Loop: + ; stash [hl] away on the stack + ld a, [hl] push af - xor a - ldh [hBGMapMode], a - ldh a, [hROMBank] - push af - ld a, b - rst Bankswitch -.loop -; load the source and target MSB and LSB - ld a, d - ldh [rHDMA1], a ; source MSB - ld a, e - and $f0 - ldh [rHDMA2], a ; source LSB - ld a, h - and $1f - ldh [rHDMA3], a ; target MSB - ld a, l - and $f0 - ldh [rHDMA4], a ; target LSB -; stop when c < 8 - ld a, c - cp $8 - jr c, .done -; decrease c by 8 - sub $8 - ld c, a -; DMA transfer state - ld a, $f - ldh [hDMATransfer], a - call DelayFrame -; add $100 to hl and de - ld a, l - add LOW($100) - ld l, a - ld a, h - adc HIGH($100) - ld h, a - ld a, e - add LOW($100) - ld e, a - ld a, d - adc HIGH($100) - ld d, a - jr .loop + ; copy a byte from [de] to [hl] + ld a, [de] + ld [hli], a -.done - ld a, c - and $7f ; pretty silly, considering at most bits 0-2 would be set - ldh [hDMATransfer], a - call DelayFrame + ; retrieve the previous value of [hl]; put it in [de] pop af - rst Bankswitch + ld [de], a + inc de - pop af - ldh [hBGMapMode], a - ret - -ReplaceKrisSprite:: - farcall _ReplaceKrisSprite - ret - -LoadStandardFont:: - farcall _LoadStandardFont - ret - -LoadFontsBattleExtra:: - farcall _LoadFontsBattleExtra - ret - -LoadFontsExtra:: - farcall _LoadFontsExtra1 - farcall _LoadFontsExtra2 - ret - -LoadFontsExtra2:: - farcall _LoadFontsExtra2 - ret - -DecompressRequest2bpp:: - push de - ld a, BANK(sScratch) - call GetSRAMBank - push bc - - ld de, sScratch + ; handle loop stuff + dec bc ld a, b - call FarDecompress - - pop bc - pop hl - - ld de, sScratch - call Request2bpp - call CloseSRAM + or c + jr nz, .Loop ret -FarCopyBytes:: -; copy bc bytes from a:hl to de +ByteFill:: +; fill bc bytes with the value of a, starting at hl + inc b ; we bail the moment b hits 0, so include the last run + inc c ; same thing; include last byte + jr .HandleLoop +.PutByte: + ld [hli], a +.HandleLoop: + dec c + jr nz, .PutByte + dec b + jr nz, .PutByte + ret +GetFarByte:: +; retrieve a single byte from a:hl, and return it in a. + ; bankswitch to new bank ldh [hBuffer], a ldh a, [hROMBank] push af ldh a, [hBuffer] rst Bankswitch + ; get byte from new bank + ld a, [hl] + ldh [hBuffer], a + + ; bankswitch to previous bank + pop af + rst Bankswitch + + ; return retrieved value in a + ldh a, [hBuffer] + ret + +GetFarHalfword:: +; retrieve a halfword from a:hl, and return it in hl. + ; bankswitch to new bank + ldh [hBuffer], a + ldh a, [hROMBank] + push af + ldh a, [hBuffer] + rst Bankswitch + + ; get halfword from new bank, put it in hl + ld a, [hli] + ld h, [hl] + ld l, a + + ; bankswitch to previous bank and return + pop af + rst Bankswitch + ret + +FarCopyWRAM:: + ldh [hBuffer], a + ldh a, [rSVBK] + push af + ldh a, [hBuffer] + ldh [rSVBK], a + call CopyBytes pop af - rst Bankswitch + ldh [rSVBK], a ret -FarCopyBytesDouble:: -; Copy bc bytes from a:hl to bc*2 bytes at de, -; doubling each byte in the process. - +GetFarWRAMByte:: ldh [hBuffer], a - ldh a, [hROMBank] + ldh a, [rSVBK] push af ldh a, [hBuffer] - rst Bankswitch - -; switcheroo, de <> hl - ld a, h - ld h, d - ld d, a - ld a, l - ld l, e - ld e, a - - inc b - inc c - jr .dec - -.loop - ld a, [de] - inc de - ld [hli], a - ld [hli], a -.dec - dec c - jr nz, .loop - dec b - jr nz, .loop - + ldh [rSVBK], a + ld a, [hl] + ldh [hBuffer], a pop af - rst Bankswitch + ldh [rSVBK], a + ldh a, [hBuffer] ret -Request2bpp:: -; Load 2bpp at b:de to occupy c tiles of hl. - ldh a, [hBGMapMode] +GetFarWRAMWord:: + ldh [hBuffer], a + ldh a, [rSVBK] push af - xor a - ldh [hBGMapMode], a - - ldh a, [hROMBank] - push af - ld a, b - rst Bankswitch - - ldh a, [hTilesPerCycle] - push af - ld a, $8 - ldh [hTilesPerCycle], a - - ld a, [wLinkMode] - cp LINK_MOBILE - jr nz, .NotMobile - ldh a, [hMobile] - and a - jr nz, .NotMobile - ld a, $6 - ldh [hTilesPerCycle], a - -.NotMobile: - ld a, e - ld [wRequested2bppSource], a - ld a, d - ld [wRequested2bppSource + 1], a - ld a, l - ld [wRequested2bppDest], a - ld a, h - ld [wRequested2bppDest + 1], a -.loop - ld a, c - ld hl, hTilesPerCycle - cp [hl] - jr nc, .iterate - - ld [wRequested2bpp], a -.wait - call DelayFrame - ld a, [wRequested2bpp] - and a - jr nz, .wait - + ldh a, [hBuffer] + ldh [rSVBK], a + ld a, [hli] + ld h, [hl] + ld l, a pop af - ldh [hTilesPerCycle], a - - pop af - rst Bankswitch - - pop af - ldh [hBGMapMode], a + ldh [rSVBK], a ret - -.iterate - ldh a, [hTilesPerCycle] - ld [wRequested2bpp], a - -.wait2 - call DelayFrame - ld a, [wRequested2bpp] - and a - jr nz, .wait2 - - ld a, c - ld hl, hTilesPerCycle - sub [hl] - ld c, a - jr .loop - -Request1bpp:: -; Load 1bpp at b:de to occupy c tiles of hl. - ldh a, [hBGMapMode] - push af - xor a - ldh [hBGMapMode], a - - ldh a, [hROMBank] - push af - ld a, b - rst Bankswitch - - ldh a, [hTilesPerCycle] - push af - ld a, $8 - ldh [hTilesPerCycle], a - - ld a, [wLinkMode] - cp LINK_MOBILE - jr nz, .NotMobile - ldh a, [hMobile] - and a - jr nz, .NotMobile - ld a, $6 - ldh [hTilesPerCycle], a - -.NotMobile: - ld a, e - ld [wRequested1bppSource], a - ld a, d - ld [wRequested1bppSource + 1], a - ld a, l - ld [wRequested1bppDest], a - ld a, h - ld [wRequested1bppDest + 1], a -.loop - ld a, c - ld hl, hTilesPerCycle - cp [hl] - jr nc, .iterate - - ld [wRequested1bpp], a -.wait - call DelayFrame - ld a, [wRequested1bpp] - and a - jr nz, .wait - - pop af - ldh [hTilesPerCycle], a - - pop af - rst Bankswitch - - pop af - ldh [hBGMapMode], a - ret - -.iterate - ldh a, [hTilesPerCycle] - ld [wRequested1bpp], a - -.wait2 - call DelayFrame - ld a, [wRequested1bpp] - and a - jr nz, .wait2 - - ld a, c - ld hl, hTilesPerCycle - sub [hl] - ld c, a - jr .loop - -Get2bpp:: - ldh a, [rLCDC] - bit rLCDC_ENABLE, a - jp nz, Request2bpp - -Copy2bpp:: -; copy c 2bpp tiles from b:de to hl - - push hl - ld h, d - ld l, e - pop de - -; bank - ld a, b - -; bc = c * $10 - push af - swap c - ld a, $f - and c - ld b, a - ld a, $f0 - and c - ld c, a - pop af - - jp FarCopyBytes - -Get1bpp:: - ldh a, [rLCDC] - bit rLCDC_ENABLE, a - jp nz, Request1bpp - -Copy1bpp:: -; copy c 1bpp tiles from b:de to hl - - push de - ld d, h - ld e, l - -; bank - ld a, b - -; bc = c * $10 / 2 - push af - ld h, 0 - ld l, c - add hl, hl - add hl, hl - add hl, hl - ld b, h - ld c, l - pop af - - pop hl - jp FarCopyBytesDouble diff --git a/home/copy2.asm b/home/copy2.asm deleted file mode 100644 index 018986cf2..000000000 --- a/home/copy2.asm +++ /dev/null @@ -1,131 +0,0 @@ -CopyBytes:: -; copy bc bytes from hl to de - inc b ; we bail the moment b hits 0, so include the last run - inc c ; same thing; include last byte - jr .HandleLoop -.CopyByte: - ld a, [hli] - ld [de], a - inc de -.HandleLoop: - dec c - jr nz, .CopyByte - dec b - jr nz, .CopyByte - ret - -SwapBytes:: -; swap bc bytes between hl and de -.Loop: - ; stash [hl] away on the stack - ld a, [hl] - push af - - ; copy a byte from [de] to [hl] - ld a, [de] - ld [hli], a - - ; retrieve the previous value of [hl]; put it in [de] - pop af - ld [de], a - inc de - - ; handle loop stuff - dec bc - ld a, b - or c - jr nz, .Loop - ret - -ByteFill:: -; fill bc bytes with the value of a, starting at hl - inc b ; we bail the moment b hits 0, so include the last run - inc c ; same thing; include last byte - jr .HandleLoop -.PutByte: - ld [hli], a -.HandleLoop: - dec c - jr nz, .PutByte - dec b - jr nz, .PutByte - ret - -GetFarByte:: -; retrieve a single byte from a:hl, and return it in a. - ; bankswitch to new bank - ldh [hBuffer], a - ldh a, [hROMBank] - push af - ldh a, [hBuffer] - rst Bankswitch - - ; get byte from new bank - ld a, [hl] - ldh [hBuffer], a - - ; bankswitch to previous bank - pop af - rst Bankswitch - - ; return retrieved value in a - ldh a, [hBuffer] - ret - -GetFarHalfword:: -; retrieve a halfword from a:hl, and return it in hl. - ; bankswitch to new bank - ldh [hBuffer], a - ldh a, [hROMBank] - push af - ldh a, [hBuffer] - rst Bankswitch - - ; get halfword from new bank, put it in hl - ld a, [hli] - ld h, [hl] - ld l, a - - ; bankswitch to previous bank and return - pop af - rst Bankswitch - ret - -FarCopyWRAM:: - ldh [hBuffer], a - ldh a, [rSVBK] - push af - ldh a, [hBuffer] - ldh [rSVBK], a - - call CopyBytes - - pop af - ldh [rSVBK], a - ret - -GetFarWRAMByte:: - ldh [hBuffer], a - ldh a, [rSVBK] - push af - ldh a, [hBuffer] - ldh [rSVBK], a - ld a, [hl] - ldh [hBuffer], a - pop af - ldh [rSVBK], a - ldh a, [hBuffer] - ret - -GetFarWRAMWord:: - ldh [hBuffer], a - ldh a, [rSVBK] - push af - ldh a, [hBuffer] - ldh [rSVBK], a - ld a, [hli] - ld h, [hl] - ld l, a - pop af - ldh [rSVBK], a - ret diff --git a/home/flag.asm b/home/flag.asm index 372d8107f..125c2a434 100644 --- a/home/flag.asm +++ b/home/flag.asm @@ -101,3 +101,30 @@ CheckReceivedDex:: ld a, c and a ret + +Unreferenced_CheckBPressedDebug:: +; Used in debug ROMs to walk through walls and avoid encounters. + + ld a, [wDebugFlags] + bit DEBUG_FIELD_F, a + ret z + + ldh a, [hJoyDown] + bit B_BUTTON_F, a + ret + +xor_a:: + xor a + ret + +xor_a_dec_a:: + xor a + dec a + ret + +Unreferenced_CheckFieldDebug:: + push hl + ld hl, wDebugFlags + bit DEBUG_FIELD_F, [hl] + pop hl + ret diff --git a/home/gfx.asm b/home/gfx.asm new file mode 100644 index 000000000..4655f204f --- /dev/null +++ b/home/gfx.asm @@ -0,0 +1,391 @@ +; Functions to copy data from ROM. + +Get2bpp_2:: + ldh a, [rLCDC] + bit rLCDC_ENABLE, a + jp z, Copy2bpp + + homecall _Get2bpp + + ret + +Get1bpp_2:: + ldh a, [rLCDC] + bit rLCDC_ENABLE, a + jp z, Copy1bpp + + homecall _Get1bpp + + ret + +FarCopyBytesDouble_DoubleBankSwitch:: + ldh [hBuffer], a + ldh a, [hROMBank] + push af + ldh a, [hBuffer] + rst Bankswitch + + call FarCopyBytesDouble + + pop af + rst Bankswitch + ret + +OldDMATransfer: + dec c + ldh a, [hBGMapMode] + push af + xor a + ldh [hBGMapMode], a + ldh a, [hROMBank] + push af + ld a, b + rst Bankswitch + +.loop +; load the source and target MSB and LSB + ld a, d + ldh [rHDMA1], a ; source MSB + ld a, e + and $f0 + ldh [rHDMA2], a ; source LSB + ld a, h + and $1f + ldh [rHDMA3], a ; target MSB + ld a, l + and $f0 + ldh [rHDMA4], a ; target LSB +; stop when c < 8 + ld a, c + cp $8 + jr c, .done +; decrease c by 8 + sub $8 + ld c, a +; DMA transfer state + ld a, $f + ldh [hDMATransfer], a + call DelayFrame +; add $100 to hl and de + ld a, l + add LOW($100) + ld l, a + ld a, h + adc HIGH($100) + ld h, a + ld a, e + add LOW($100) + ld e, a + ld a, d + adc HIGH($100) + ld d, a + jr .loop + +.done + ld a, c + and $7f ; pretty silly, considering at most bits 0-2 would be set + ldh [hDMATransfer], a + call DelayFrame + pop af + rst Bankswitch + + pop af + ldh [hBGMapMode], a + ret + +ReplaceKrisSprite:: + farcall _ReplaceKrisSprite + ret + +LoadStandardFont:: + farcall _LoadStandardFont + ret + +LoadFontsBattleExtra:: + farcall _LoadFontsBattleExtra + ret + +LoadFontsExtra:: + farcall _LoadFontsExtra1 + farcall _LoadFontsExtra2 + ret + +LoadFontsExtra2: + farcall _LoadFontsExtra2 + ret + +DecompressRequest2bpp:: + push de + ld a, BANK(sScratch) + call GetSRAMBank + push bc + + ld de, sScratch + ld a, b + call FarDecompress + + pop bc + pop hl + + ld de, sScratch + call Request2bpp + call CloseSRAM + ret + +FarCopyBytes:: +; copy bc bytes from a:hl to de + + ldh [hBuffer], a + ldh a, [hROMBank] + push af + ldh a, [hBuffer] + rst Bankswitch + + call CopyBytes + + pop af + rst Bankswitch + ret + +FarCopyBytesDouble: +; Copy bc bytes from a:hl to bc*2 bytes at de, +; doubling each byte in the process. + + ldh [hBuffer], a + ldh a, [hROMBank] + push af + ldh a, [hBuffer] + rst Bankswitch + +; switcheroo, de <> hl + ld a, h + ld h, d + ld d, a + ld a, l + ld l, e + ld e, a + + inc b + inc c + jr .dec + +.loop + ld a, [de] + inc de + ld [hli], a + ld [hli], a +.dec + dec c + jr nz, .loop + dec b + jr nz, .loop + + pop af + rst Bankswitch + ret + +Request2bpp:: +; Load 2bpp at b:de to occupy c tiles of hl. + ldh a, [hBGMapMode] + push af + xor a + ldh [hBGMapMode], a + + ldh a, [hROMBank] + push af + ld a, b + rst Bankswitch + + ldh a, [hTilesPerCycle] + push af + ld a, $8 + ldh [hTilesPerCycle], a + + ld a, [wLinkMode] + cp LINK_MOBILE + jr nz, .NotMobile + ldh a, [hMobile] + and a + jr nz, .NotMobile + ld a, $6 + ldh [hTilesPerCycle], a + +.NotMobile: + ld a, e + ld [wRequested2bppSource], a + ld a, d + ld [wRequested2bppSource + 1], a + ld a, l + ld [wRequested2bppDest], a + ld a, h + ld [wRequested2bppDest + 1], a +.loop + ld a, c + ld hl, hTilesPerCycle + cp [hl] + jr nc, .iterate + + ld [wRequested2bpp], a +.wait + call DelayFrame + ld a, [wRequested2bpp] + and a + jr nz, .wait + + pop af + ldh [hTilesPerCycle], a + + pop af + rst Bankswitch + + pop af + ldh [hBGMapMode], a + ret + +.iterate + ldh a, [hTilesPerCycle] + ld [wRequested2bpp], a + +.wait2 + call DelayFrame + ld a, [wRequested2bpp] + and a + jr nz, .wait2 + + ld a, c + ld hl, hTilesPerCycle + sub [hl] + ld c, a + jr .loop + +Request1bpp:: +; Load 1bpp at b:de to occupy c tiles of hl. + ldh a, [hBGMapMode] + push af + xor a + ldh [hBGMapMode], a + + ldh a, [hROMBank] + push af + ld a, b + rst Bankswitch + + ldh a, [hTilesPerCycle] + push af + ld a, $8 + ldh [hTilesPerCycle], a + + ld a, [wLinkMode] + cp LINK_MOBILE + jr nz, .NotMobile + ldh a, [hMobile] + and a + jr nz, .NotMobile + ld a, $6 + ldh [hTilesPerCycle], a + +.NotMobile: + ld a, e + ld [wRequested1bppSource], a + ld a, d + ld [wRequested1bppSource + 1], a + ld a, l + ld [wRequested1bppDest], a + ld a, h + ld [wRequested1bppDest + 1], a +.loop + ld a, c + ld hl, hTilesPerCycle + cp [hl] + jr nc, .iterate + + ld [wRequested1bpp], a +.wait + call DelayFrame + ld a, [wRequested1bpp] + and a + jr nz, .wait + + pop af + ldh [hTilesPerCycle], a + + pop af + rst Bankswitch + + pop af + ldh [hBGMapMode], a + ret + +.iterate + ldh a, [hTilesPerCycle] + ld [wRequested1bpp], a + +.wait2 + call DelayFrame + ld a, [wRequested1bpp] + and a + jr nz, .wait2 + + ld a, c + ld hl, hTilesPerCycle + sub [hl] + ld c, a + jr .loop + +Get2bpp:: + ldh a, [rLCDC] + bit rLCDC_ENABLE, a + jp nz, Request2bpp + +Copy2bpp: +; copy c 2bpp tiles from b:de to hl + + push hl + ld h, d + ld l, e + pop de + +; bank + ld a, b + +; bc = c * $10 + push af + swap c + ld a, $f + and c + ld b, a + ld a, $f0 + and c + ld c, a + pop af + + jp FarCopyBytes + +Get1bpp:: + ldh a, [rLCDC] + bit rLCDC_ENABLE, a + jp nz, Request1bpp + +Copy1bpp:: +; copy c 1bpp tiles from b:de to hl + + push de + ld d, h + ld e, l + +; bank + ld a, b + +; bc = c * $10 / 2 + push af + ld h, 0 + ld l, c + add hl, hl + add hl, hl + add hl, hl + ld b, h + ld c, l + pop af + + pop hl + jp FarCopyBytesDouble diff --git a/home/hp_pals.asm b/home/hp_pals.asm deleted file mode 100644 index 9400d341f..000000000 --- a/home/hp_pals.asm +++ /dev/null @@ -1,17 +0,0 @@ -SetHPPal:: -; Set palette for hp bar pixel length e at hl. - call GetHPPal - ld [hl], d - ret - -GetHPPal:: -; Get palette for hp bar pixel length e in d. - ld d, HP_GREEN - ld a, e - cp (HP_BAR_LENGTH_PX * 50 / 100) ; 24 - ret nc - inc d ; HP_YELLOW - cp (HP_BAR_LENGTH_PX * 21 / 100) ; 10 - ret nc - inc d ; HP_RED - ret diff --git a/home/map.asm b/home/map.asm index bccc2ae1c..0b7bb6eac 100644 --- a/home/map.asm +++ b/home/map.asm @@ -2277,3 +2277,12 @@ LoadMapTileset:: pop bc pop hl ret + +InexplicablyEmptyFunction:: +; unused +; Inexplicably empty. +; Seen in PredefPointers. +rept 16 + nop +endr + ret diff --git a/home/math.asm b/home/math.asm index f385ccbf8..3042cc61d 100644 --- a/home/math.asm +++ b/home/math.asm @@ -1,13 +1,3 @@ -AddNTimes:: -; Add bc * a to hl. - and a - ret z -.loop - add hl, bc - dec a - jr nz, .loop - ret - SimpleMultiply:: ; Return a * c. and a diff --git a/home/mon_data_2.asm b/home/mon_party.asm similarity index 100% rename from home/mon_data_2.asm rename to home/mon_party.asm diff --git a/home/pokedex_flags.asm b/home/pokedex_flags.asm index 809341509..5c12da511 100644 --- a/home/pokedex_flags.asm +++ b/home/pokedex_flags.asm @@ -1,3 +1,35 @@ +CountSetBits:: +; Count the number of set bits in b bytes starting from hl. +; Return in a, c and [wNumSetBits]. + ld c, 0 +.next + ld a, [hli] + ld e, a + ld d, 8 + +.count + srl e + ld a, 0 + adc c + ld c, a + dec d + jr nz, .count + + dec b + jr nz, .next + + ld a, c + ld [wNumSetBits], a + ret + +GetWeekday:: + ld a, [wCurDay] +.mod + sub 7 + jr nc, .mod + add 7 + ret + SetSeenAndCaughtMon:: push af ld c, a diff --git a/home/print_text.asm b/home/print_text.asm index b7f76ce64..51f23edb2 100644 --- a/home/print_text.asm +++ b/home/print_text.asm @@ -118,3 +118,20 @@ FarPrintText:: pop af rst Bankswitch ret + +CallPointerAt:: + ldh a, [hROMBank] + push af + ld a, [hli] + rst Bankswitch + + ld a, [hli] + ld h, [hl] + ld l, a + + call _hl_ + + pop hl + ld a, h + rst Bankswitch + ret diff --git a/home/handshake.asm b/home/printer.asm similarity index 100% rename from home/handshake.asm rename to home/printer.asm diff --git a/home/region.asm b/home/region.asm index 4cb3d4768..eedcbbee4 100644 --- a/home/region.asm +++ b/home/region.asm @@ -30,3 +30,6 @@ IsInJohto:: .Kanto: ld a, 1 ret + +ret_2f3e:: + ret diff --git a/home/sprite_anims.asm b/home/sprite_anims.asm index 816849981..e20c63ac5 100644 --- a/home/sprite_anims.asm +++ b/home/sprite_anims.asm @@ -1,22 +1,3 @@ -PushLYOverrides:: - ldh a, [hLCDCPointer] - and a - ret z - - ld a, LOW(wLYOverridesBackup) - ld [wRequested2bppSource], a - ld a, HIGH(wLYOverridesBackup) - ld [wRequested2bppSource + 1], a - - ld a, LOW(wLYOverrides) - ld [wRequested2bppDest], a - ld a, HIGH(wLYOverrides) - ld [wRequested2bppDest + 1], a - - ld a, (wLYOverridesEnd - wLYOverrides) / 16 - ld [wRequested2bpp], a - ret - InitSpriteAnimStruct:: ld [wSpriteAnimIDBuffer], a ldh a, [hROMBank] diff --git a/home/tilemap.asm b/home/tilemap.asm index 914027845..379b1464a 100644 --- a/home/tilemap.asm +++ b/home/tilemap.asm @@ -216,3 +216,21 @@ GetSGBLayout:: .sgb predef_jump LoadSGBLayout + +SetHPPal:: +; Set palette for hp bar pixel length e at hl. + call GetHPPal + ld [hl], d + ret + +GetHPPal:: +; Get palette for hp bar pixel length e in d. + ld d, HP_GREEN + ld a, e + cp (HP_BAR_LENGTH_PX * 50 / 100) ; 24 + ret nc + inc d ; HP_YELLOW + cp (HP_BAR_LENGTH_PX * 21 / 100) ; 10 + ret nc + inc d ; HP_RED + ret diff --git a/home/rtc.asm b/home/time_palettes.asm similarity index 100% rename from home/rtc.asm rename to home/time_palettes.asm