summaryrefslogtreecommitdiff
path: root/home/copy.asm
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2016-01-29 18:36:31 -0500
committerPikalaxALT <PikalaxALT@gmail.com>2016-01-29 18:36:31 -0500
commit2bf93c5905319e9181f87b3f83cd3bce7b9feeca (patch)
tree3ebf17c8879e5d6243d81aac8f1c36eb226fac26 /home/copy.asm
parented3f9395f6d45f6554ed9d9c49c41ea86a8e2447 (diff)
Import stuff from pokecrystal; diff gold and silver
Diffstat (limited to 'home/copy.asm')
-rw-r--r--home/copy.asm434
1 files changed, 434 insertions, 0 deletions
diff --git a/home/copy.asm b/home/copy.asm
new file mode 100644
index 00000000..08eb5c10
--- /dev/null
+++ b/home/copy.asm
@@ -0,0 +1,434 @@
+; Functions to copy data from ROM.
+
+
+Get2bpp_2:: ; dc9
+ ld a, [rLCDC]
+ bit 7, a
+ jp z, Copy2bpp
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_Get2bpp)
+ rst Bankswitch
+ call _Get2bpp
+ pop af
+ rst Bankswitch
+
+ ret
+; ddc
+
+Get1bpp_2:: ; ddc
+ ld a, [rLCDC]
+ bit 7, a
+ jp z, Copy1bpp
+
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(_Get1bpp)
+ rst Bankswitch
+ call _Get1bpp
+ pop af
+ rst Bankswitch
+
+ ret
+; def
+
+FarCopyBytesDouble_DoubleBankSwitch:: ; def
+ ld [hBuffer], a
+ ld a, [hROMBank]
+ push af
+ ld a, [hBuffer]
+ rst Bankswitch
+
+ call FarCopyBytesDouble
+
+ pop af
+ rst Bankswitch
+ ret
+; dfd
+
+OldDMATransfer:: ; dfd
+ dec c
+ ld a, [hBGMapMode]
+ push af
+ xor a
+ ld [hBGMapMode], a
+ ld a, [hROMBank]
+ push af
+ ld a, b
+ rst Bankswitch
+
+.loop
+; load the source and target MSB and LSB
+ ld a, d
+ ld [rHDMA1], a ; source MSB
+ ld a, e
+ and $f0
+ ld [rHDMA2], a ; source LSB
+ ld a, h
+ and $1f
+ ld [rHDMA3], a ; target MSB
+ ld a, l
+ and $f0
+ ld [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
+ ld [hDMATransfer], a
+ call DelayFrame
+; add $100 to hl and de
+ ld a, l
+ add $100 % $100
+ ld l, a
+ ld a, h
+ adc $100 / $100
+ ld h, a
+ ld a, e
+ add $100 % $100
+ ld e, a
+ ld a, d
+ adc $100 / $100
+ ld d, a
+ jr .loop
+
+.done
+ ld a, c
+ and $7f ; pretty silly, considering at most bits 0-2 would be set
+ ld [hDMATransfer], a
+ call DelayFrame
+ pop af
+ rst Bankswitch
+
+ pop af
+ ld [hBGMapMode], a
+ ret
+; e4a
+
+
+
+ReplaceKrisSprite:: ; e4a
+ callba _ReplaceKrisSprite
+ ret
+; e51
+
+
+
+LoadStandardFont:: ; e51
+ callba _LoadStandardFont
+ ret
+; e58
+
+LoadFontsBattleExtra:: ; e58
+ callba _LoadFontsBattleExtra
+ ret
+; e5f
+
+
+
+LoadFontsExtra:: ; e5f
+ callba _LoadFontsExtra1
+ callba _LoadFontsExtra2
+ ret
+; e6c
+
+LoadFontsExtra2:: ; e6c
+ callba _LoadFontsExtra2
+ ret
+; e73
+
+DecompressRequest2bpp:: ; e73
+ 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
+; e8d
+
+
+
+FarCopyBytes:: ; e8d
+; copy bc bytes from a:hl to de
+
+ ld [hBuffer], a
+ ld a, [hROMBank]
+ push af
+ ld a, [hBuffer]
+ rst Bankswitch
+
+ call CopyBytes
+
+ pop af
+ rst Bankswitch
+ ret
+; 0xe9b
+
+
+FarCopyBytesDouble:: ; e9b
+; Copy bc bytes from a:hl to bc*2 bytes at de,
+; doubling each byte in the process.
+
+ ld [hBuffer], a
+ ld a, [hROMBank]
+ push af
+ ld 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
+rept 2
+ ld [hli], a
+endr
+.dec
+ dec c
+ jr nz, .loop
+ dec b
+ jr nz, .loop
+
+ pop af
+ rst Bankswitch
+ ret
+; 0xeba
+
+
+Request2bpp:: ; eba
+; Load 2bpp at b:de to occupy c tiles of hl.
+ ld a, [hBGMapMode]
+ push af
+ xor a
+ ld [hBGMapMode], a
+
+ ld a, [hROMBank]
+ push af
+ ld a, b
+ rst Bankswitch
+
+ ld a, [hTilesPerCycle]
+ push af
+ ld a, $8
+ ld [hTilesPerCycle], a
+
+ ld a, [wLinkMode]
+ cp LINK_MOBILE
+ jr nz, .NotMobile
+ ld a, [hMobile]
+ and a
+ jr nz, .NotMobile
+ ld a, $6
+ ld [hTilesPerCycle], a
+
+.NotMobile
+ ld a, e
+ ld [Requested2bppSource], a
+ ld a, d
+ ld [Requested2bppSource + 1], a
+ ld a, l
+ ld [Requested2bppDest], a
+ ld a, h
+ ld [Requested2bppDest + 1], a
+.loop
+ ld a, c
+ ld hl, hTilesPerCycle
+ cp [hl]
+ jr nc, .iterate
+
+ ld [Requested2bpp], a
+.wait
+ call DelayFrame
+ ld a, [Requested2bpp]
+ and a
+ jr nz, .wait
+
+ pop af
+ ld [hTilesPerCycle], a
+
+ pop af
+ rst Bankswitch
+
+ pop af
+ ld [hBGMapMode], a
+ ret
+
+.iterate
+ ld a, [hTilesPerCycle]
+ ld [Requested2bpp], a
+
+.wait2
+ call DelayFrame
+ ld a, [Requested2bpp]
+ and a
+ jr nz, .wait2
+
+ ld a, c
+ ld hl, hTilesPerCycle
+ sub [hl]
+ ld c, a
+ jr .loop
+; f1e
+
+
+Request1bpp:: ; f1e
+; Load 1bpp at b:de to occupy c tiles of hl.
+ ld a, [hBGMapMode]
+ push af
+ xor a
+ ld [hBGMapMode], a
+
+ ld a, [hROMBank]
+ push af
+ ld a, b
+ rst Bankswitch
+
+ ld a, [hTilesPerCycle]
+ push af
+
+ ld a, $8
+ ld [hTilesPerCycle], a
+ ld a, [wLinkMode]
+ cp LINK_MOBILE
+ jr nz, .NotMobile
+ ld a, [hMobile]
+ and a
+ jr nz, .NotMobile
+ ld a, $6
+ ld [hTilesPerCycle], a
+
+.NotMobile
+ ld a, e
+ ld [Requested1bppSource], a
+ ld a, d
+ ld [Requested1bppSource + 1], a
+ ld a, l
+ ld [Requested1bppDest], a
+ ld a, h
+ ld [Requested1bppDest + 1], a
+.loop
+ ld a, c
+ ld hl, hTilesPerCycle
+ cp [hl]
+ jr nc, .iterate
+
+ ld [Requested1bpp], a
+.wait
+ call DelayFrame
+ ld a, [Requested1bpp]
+ and a
+ jr nz, .wait
+
+ pop af
+ ld [hTilesPerCycle], a
+
+ pop af
+ rst Bankswitch
+
+ pop af
+ ld [hBGMapMode], a
+ ret
+
+.iterate
+ ld a, [hTilesPerCycle]
+ ld [Requested1bpp], a
+
+.wait2
+ call DelayFrame
+ ld a, [Requested1bpp]
+ and a
+ jr nz, .wait2
+
+ ld a, c
+ ld hl, hTilesPerCycle
+ sub [hl]
+ ld c, a
+ jr .loop
+; f82
+
+
+Get2bpp:: ; f82
+ ld a, [rLCDC]
+ bit 7, a
+ jp nz, Request2bpp
+
+Copy2bpp:: ; f89
+; 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
+; f9d
+
+
+Get1bpp:: ; f9d
+ ld a, [rLCDC]
+ bit 7, a
+ jp nz, Request1bpp
+
+Copy1bpp:: ; fa4
+; 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
+rept 3
+ add hl, hl
+endr
+ ld b, h
+ ld c, l
+ pop af
+
+ pop hl
+ jp FarCopyBytesDouble
+; fb6