summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--home.asm152
-rw-r--r--home/array.asm44
-rw-r--r--home/battle.asm19
-rw-r--r--home/call_regs.asm8
-rw-r--r--home/copy.asm430
-rw-r--r--home/copy2.asm131
-rw-r--r--home/flag.asm27
-rw-r--r--home/gfx.asm391
-rw-r--r--home/hp_pals.asm17
-rw-r--r--home/map.asm9
-rw-r--r--home/math.asm10
-rw-r--r--home/mon_party.asm (renamed from home/mon_data_2.asm)0
-rw-r--r--home/pokedex_flags.asm32
-rw-r--r--home/print_text.asm17
-rw-r--r--home/printer.asm (renamed from home/handshake.asm)0
-rw-r--r--home/region.asm3
-rw-r--r--home/sprite_anims.asm19
-rw-r--r--home/tilemap.asm18
-rw-r--r--home/time_palettes.asm (renamed from home/rtc.asm)0
19 files changed, 660 insertions, 667 deletions
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
-
+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
-FarCopyBytesDouble_DoubleBankSwitch::
- ldh [hBuffer], a
- ldh a, [hROMBank]
+SwapBytes::
+; swap bc bytes between hl and de
+.Loop:
+ ; stash [hl] away on the stack
+ ld a, [hl]
push af
- ldh a, [hBuffer]
- rst Bankswitch
- call FarCopyBytesDouble
+ ; 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
- rst Bankswitch
- ret
+ ld [de], a
+ inc de
-OldDMATransfer::
- dec c
- ldh a, [hBGMapMode]
- push af
- xor a
- ldh [hBGMapMode], a
- ldh a, [hROMBank]
- push af
+ ; handle loop stuff
+ dec bc
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
+ or c
+ jr nz, .Loop
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
+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
-FarCopyBytes::
-; copy bc bytes from a:hl to de
-
+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
- call CopyBytes
+ ; get byte from new bank
+ ld a, [hl]
+ ldh [hBuffer], a
+ ; bankswitch to previous bank
pop af
rst Bankswitch
- ret
-FarCopyBytesDouble::
-; Copy bc bytes from a:hl to bc*2 bytes at de,
-; doubling each byte in the process.
+ ; 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
-; 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
+ ; 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
-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]
+FarCopyWRAM::
+ ldh [hBuffer], a
+ ldh a, [rSVBK]
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
+ ldh a, [hBuffer]
+ ldh [rSVBK], a
- pop af
- rst Bankswitch
+ call CopyBytes
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]
+GetFarWRAMByte::
+ ldh [hBuffer], a
+ ldh a, [rSVBK]
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
-
+ ldh a, [hBuffer]
+ ldh [rSVBK], a
+ ld a, [hl]
+ ldh [hBuffer], a
pop af
- ldh [hBGMapMode], a
+ ldh [rSVBK], a
+ ldh a, [hBuffer]
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
+GetFarWRAMWord::
+ ldh [hBuffer], a
+ ldh a, [rSVBK]
push af
- ld h, 0
- ld l, c
- add hl, hl
- add hl, hl
- add hl, hl
- ld b, h
- ld c, l
+ ldh a, [hBuffer]
+ ldh [rSVBK], a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
pop af
-
- pop hl
- jp FarCopyBytesDouble
+ ldh [rSVBK], a
+ ret
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
index 99169eaa8..99169eaa8 100644
--- a/home/mon_data_2.asm
+++ b/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
index 9747713c7..9747713c7 100644
--- a/home/handshake.asm
+++ b/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
index 7dc4e776a..7dc4e776a 100644
--- a/home/rtc.asm
+++ b/home/time_palettes.asm