Small home/ reorganization

Time to move everything out of home.asm:
- InexplicablyEmptyFunction was moved to home/map.asm
- The wDebugFlags functions and xor_a brothers were moved to
  home/flag.asm because they're all flag-related.
- ret_2f3e was moved into home/region.asm
- The register alias sisters were moved to a new file called home/call_regs.asm
- IsInArray and SkipNames were joined by AddNTimes from home/math.asm
  into home/array.asm, as they're all used to index arrays.
- CallPointerAt was moved into home/print_text.asm because given the
  contents of that file it doesn't feel very out of place (that file
  isn't very aptly named...)
- CountSetBits was moved into home/pokedex_flags.asm because it's unique
  use is counting the amount of seen/caught mon in the podedex. GetWeekday
  was pulled into this by proximity.

Other changes were also made:
- PushLYOverrides was moved from home/sprite_anims.asm to
  home/battle.asm, because it's almost exclusively used for battle
  animations, with the lone exception being the Magnet Train.
- home/copy.asm was renamed to home/gfx.asm, as it's all gfx-related
- home/copy2.asm was renamed to home/copy.asm, now it's the only file
  called copy.
- SetHPPal and GetHPPal were moved from home/hp_pals.asm to
  home/tilemap.asm, as they're attrmap related, like many functions in
  that file are.
- home/rtc.asm was renamed to home/time_palettes.asm, as it had very
  little to do with the RTC at all, all RTC functions being in home/time.asm
- home/handshake.asm was renamed to home/printer.asm.
- home/mon_data_2.asm was renamed to home/mon_party.asm.
This commit is contained in:
mid-kid 2020-02-21 23:48:51 +01:00
parent 9a927c1b3e
commit 43eff93861
19 changed files with 676 additions and 683 deletions

152
home.asm
View File

@ -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"

44
home/array.asm Normal file
View File

@ -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

View File

@ -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

8
home/call_regs.asm Normal file
View File

@ -0,0 +1,8 @@
; Register aliases
_hl_::
jp hl
_de_::
push de
ret

View File

@ -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

View File

@ -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

View File

@ -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

391
home/gfx.asm Normal file
View File

@ -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

View File

@ -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

View File

@ -2277,3 +2277,12 @@ LoadMapTileset::
pop bc
pop hl
ret
InexplicablyEmptyFunction::
; unused
; Inexplicably empty.
; Seen in PredefPointers.
rept 16
nop
endr
ret

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -30,3 +30,6 @@ IsInJohto::
.Kanto:
ld a, 1
ret
ret_2f3e::
ret

View File

@ -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]

View File

@ -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