shithub: pokered

Download patch

ref: 8573d9f7bd0ad311cd2b90c767f11cefd43da371
parent: 823441c59127174d564cb8abc0152e0336f04cec
author: YamaArashi <shadow962@live.com>
date: Fri Feb 3 18:41:43 EST 2012

disasm of misc functions

hg-commit-id: 774697dc5134


--- a/constants.asm
+++ b/constants.asm
@@ -814,7 +814,7 @@
 ; number of rows for VBlankCopyBgMap to copy
 H_VBCOPYBGNUMROWS EQU $FFC5
 
-; size of VBlankCopy transfer in 8-byte units
+; size of VBlankCopy transfer in 16-byte units
 H_VBCOPYSIZE EQU $FFC6
 
 ; source address for VBlankCopy function
@@ -823,7 +823,7 @@
 ; destination address for VBlankCopy function
 H_VBCOPYDEST EQU $FFC9
 
-; size of source data for VBlankCopyDouble in 4-byte units
+; size of source data for VBlankCopyDouble in 8-byte units
 H_VBCOPYDOUBLESIZE EQU $FFCB
 
 ; source address for VBlankCopyDouble function
--- a/main.asm
+++ b/main.asm
@@ -1307,7 +1307,7 @@
 	ld de,$9000
 	ld bc,$0600
 	ld a,[$d52b]
-	jp $17f7
+	jp FarCopyData2
 
 ; this loads the current maps complete tile map (which references blocks, not individual tiles) to C6E8
 ; it can also load partial tile maps of connected maps into a border of length 3 around the current map
@@ -2454,7 +2454,7 @@
 	push de
 	push hl
 	ld bc,$050c
-	call $1848
+	call CopyVideoData
 	pop hl
 	pop de
 	ld a,$c0
@@ -2465,7 +2465,7 @@
 .noCarry\@
 	set 3,h
 	ld bc,$050c
-	jp $1848
+	jp CopyVideoData
 
 ; function to load data from the map header
 LoadMapHeader: ; 107C
@@ -2938,8 +2938,178 @@
 	INCBIN "gfx/tilesets/17.tilecoll"
 ;Tile Collision ends 0x17f7
 
-INCBIN "baserom.gbc",$17F7,$190F-$17F7
+; does the same thing as FarCopyData at 009D
+; only difference is that it uses [$ff8b] instead of [$cee9] for a temp value
+; copy bc bytes of data from a:hl to de
+FarCopyData2: ; 17F7
+	ld [$ff8b],a
+	ld a,[$ffb8]
+	push af
+	ld a,[$ff8b]
+	ld [$ffb8],a
+	ld [$2000],a
+	call CopyData
+	pop af
+	ld [$ffb8],a
+	ld [$2000],a
+	ret
 
+; does a far copy but the source is de and the destination is hl
+; copy bc bytes of data from a:de to hl
+FarCopyData3: ; 180D
+	ld [$ff8b],a
+	ld a,[$ffb8]
+	push af
+	ld a,[$ff8b]
+	ld [$ffb8],a
+	ld [$2000],a
+	push hl
+	push de
+	push de
+	ld d,h
+	ld e,l
+	pop hl
+	call CopyData
+	pop de
+	pop hl
+	pop af
+	ld [$ffb8],a
+	ld [$2000],a
+	ret
+
+; copies each source byte to the destination twice (next to each other)
+; copy bc source bytes from a:hl to de
+FarCopyDataDouble: ; 182B
+	ld [$ff8b],a
+	ld a,[$ffb8]
+	push af
+	ld a,[$ff8b]
+	ld [$ffb8],a
+	ld [$2000],a
+.loop\@
+	ld a,[hli]
+	ld [de],a
+	inc de
+	ld [de],a
+	inc de
+	dec bc
+	ld a,c
+	or b
+	jr nz,.loop\@
+	pop af
+	ld [$ffb8],a
+	ld [$2000],a
+	ret
+
+; copy (c * 16) bytes from b:de to hl during V-blank
+; transfers up to 128 bytes per V-blank
+CopyVideoData: ; 1848
+	ld a,[H_AUTOBGTRANSFERENABLED] ; save auto-transfer enabled flag
+	push af
+	xor a
+	ld [H_AUTOBGTRANSFERENABLED],a ; disable auto-transfer while copying
+	ld a,[$ffb8]
+	ld [$ff8b],a
+	ld a,b
+	ld [$ffb8],a
+	ld [$2000],a
+	ld a,e
+	ld [H_VBCOPYSRC],a
+	ld a,d
+	ld [H_VBCOPYSRC + 1],a
+	ld a,l
+	ld [H_VBCOPYDEST],a
+	ld a,h
+	ld [H_VBCOPYDEST + 1],a
+.loop\@
+	ld a,c
+	cp a,8 ; are there more than 128 bytes left to copy?
+	jr nc,.copyMaxSize\@ ; only copy up to 128 bytes at a time
+.copyRemainder\@
+	ld [H_VBCOPYSIZE],a
+	call DelayFrame ; wait for V-blank handler to perform the copy
+	ld a,[$ff8b]
+	ld [$ffb8],a
+	ld [$2000],a
+	pop af
+	ld [H_AUTOBGTRANSFERENABLED],a ; restore original auto-transfer enabled flag
+	ret
+.copyMaxSize\@
+	ld a,8 ; 128 bytes
+	ld [H_VBCOPYSIZE],a
+	call DelayFrame ; wait for V-blank handler to perform the copy
+	ld a,c
+	sub a,8
+	ld c,a
+	jr .loop\@
+
+; copy (c * 8) source bytes from b:de to hl during V-blank
+; copies each source byte to the destination twice (next to each other)
+; transfers up to 64 source bytes per V-blank
+CopyVideoDataDouble: ; 1886
+	ld a,[H_AUTOBGTRANSFERENABLED] ; save auto-transfer enabled flag
+	push af
+	xor a
+	ld [H_AUTOBGTRANSFERENABLED],a ; disable auto-transfer while copying
+	ld a,[$ffb8]
+	ld [$ff8b],a
+	ld a,b
+	ld [$ffb8],a
+	ld [$2000],a
+	ld a,e
+	ld [H_VBCOPYDOUBLESRC],a
+	ld a,d
+	ld [H_VBCOPYDOUBLESRC + 1],a
+	ld a,l
+	ld [H_VBCOPYDOUBLEDEST],a
+	ld a,h
+	ld [H_VBCOPYDOUBLEDEST + 1],a
+.loop\@
+	ld a,c
+	cp a,8 ; are there more than 64 source bytes left to copy?
+	jr nc,.copyMaxSize\@ ; only copy up to 64 source bytes at a time
+.copyRemainder\@
+	ld [H_VBCOPYDOUBLESIZE],a
+	call DelayFrame ; wait for V-blank handler to perform the copy
+	ld a,[$ff8b]
+	ld [$ffb8],a
+	ld [$2000],a
+	pop af
+	ld [H_AUTOBGTRANSFERENABLED],a ; restore original auto-transfer enabled flag
+	ret
+.copyMaxSize\@
+	ld a,8 ; 64 source bytes
+	ld [H_VBCOPYDOUBLESIZE],a
+	call DelayFrame ; wait for V-blank handler to perform the copy
+	ld a,c
+	sub a,8
+	ld c,a
+	jr .loop\@
+
+; clears an area of the screen
+; INPUT:
+; hl = address of upper left corner of the area
+; b = height
+; c = width
+ClearScreenArea: ; 18C4
+	ld   a,$7F ; blank tile
+	ld   de,20 ; screen width
+.loop\@
+	push hl
+	push bc
+.innerLoop\@
+	ld [hli],a
+	dec c
+	jr nz,.innerLoop\@
+	pop bc
+	pop hl
+	add hl,de
+	dec b
+	jr nz,.loop\@
+	ret
+
+INCBIN "baserom.gbc",$18D6,$190F - $18D6
+
 ClearScreen: ; 190F
 ; clears all tiles in the tilemap,
 ; then wait three frames
@@ -3251,7 +3421,7 @@
 	call $3898
 	ld hl,$C4A5
 	ld bc,$0412
-	call $18C4
+	call ClearScreenArea
 	ld c,$14
 	call DelayFrames
 	pop de
@@ -3266,7 +3436,7 @@
 	call $3898
 	ld hl,$C469
 	ld bc,$0712
-	call $18C4
+	call ClearScreenArea
 	ld c,$14
 	call DelayFrames
 	pop de
@@ -3934,7 +4104,7 @@
 	ld [H_VBCOPYBGSRC],a ; disable transfer so it doesn't continue next V-blank
 	jr TransferBgRows
 
-; This function copies ([H_VBCOPYDOUBLESIZE] * 4) source bytes
+; This function copies ([H_VBCOPYDOUBLESIZE] * 8) source bytes
 ; from H_VBCOPYDOUBLESRC to H_VBCOPYDOUBLEDEST.
 ; It copies each source byte to the destination twice (next to each other).
 ; The function updates the source and destination addresses, so the transfer
@@ -4016,7 +4186,7 @@
 	ld sp,hl ; restore stack pointer
 	ret
 
-; Copies ([H_VBCOPYSIZE] * 8) bytes from H_VBCOPYSRC to H_VBCOPYDEST.
+; Copies ([H_VBCOPYSIZE] * 16) bytes from H_VBCOPYSRC to H_VBCOPYDEST.
 ; The function updates the source and destination addresses, so the transfer
 ; can be continued easily by repeatingly calling this function.
 VBlankCopy: ; 1E5E
@@ -5271,8 +5441,26 @@
 	pop hl
 	ret
 
-INCBIN "baserom.gbc",$3071,$31cc - $3071
+INCBIN "baserom.gbc",$3071,$30E8 - $3071
 
+; function to draw various text boxes
+; INPUT:
+; [$D125] = text box ID
+DisplayTextBoxID: ; 30E8
+	ld a,[$ffb8]
+	push af
+	ld a,BANK(DisplayTextBoxID_)
+	ld [$ffb8],a
+	ld [$2000],a
+	call DisplayTextBoxID_
+	pop bc
+	ld a,b
+	ld [$ffb8],a
+	ld [$2000],a
+	ret
+
+INCBIN "baserom.gbc",$30FD,$31cc - $30FD
+
 LoadTrainerHeader: ; 0x31cc
 	call $3157
 	xor a
@@ -5464,8 +5652,61 @@
 	ld [$CD3A],a
 	ret
 
-INCBIN "baserom.gbc",$366B,$3739 - $366B
+INCBIN "baserom.gbc",$366B,$3680 - $366B
 
+; copies the tile patterns for letters and numbers into VRAM
+LoadFontTilePatterns: ; 3680
+	ld a,[rLCDC]
+	bit 7,a ; is the LCD enabled?
+	jr nz,.lcdEnabled\@
+.lcdDisabled\@
+	ld hl,$5a80
+	ld de,$8800
+	ld bc,$0400
+	ld a,$04
+	jp FarCopyDataDouble ; if LCD is off, transfer all at once
+.lcdEnabled\@
+	ld de,$5a80
+	ld hl,$8800
+	ld bc,$0480
+	jp CopyVideoDataDouble ; if LCD is on, transfer during V-blank
+
+; copies the text box tile patterns into VRAM
+LoadTextBoxTilePatterns: ; 36A0
+	ld a,[rLCDC]
+	bit 7,a ; is the LCD enabled?
+	jr nz,.lcdEnabled\@
+.lcdDisabled\@
+	ld hl,$6288
+	ld de,$9600
+	ld bc,$0200
+	ld a,$04
+	jp FarCopyData2 ; if LCD is off, transfer all at once
+.lcdEnabled\@
+	ld de,$6288
+	ld hl,$9600
+	ld bc,$0420
+	jp CopyVideoData ; if LCD is on, transfer during V-blank
+
+; copies HP bar and status display tile patterns into VRAM
+LoadHpBarAndStatusTilePatterns: ; 36C0
+	ld a,[rLCDC]
+	bit 7,a ; is the LCD enabled?
+	jr nz,.lcdEnabled\@
+.lcdDisabled\@
+	ld hl,$5ea0
+	ld de,$9620
+	ld bc,$01e0
+	ld a,$04
+	jp FarCopyData2 ; if LCD is off, transfer all at once
+.lcdEnabled\@
+	ld de,$5ea0
+	ld hl,$9620
+	ld bc,$041e
+	jp CopyVideoData ; if LCD is on, transfer during V-blank
+
+INCBIN "baserom.gbc",$36E0,$3739 - $36E0
+
 DelayFrames: ; 3739
 ; wait n frames, where n is the value in c
 	call DelayFrame
@@ -6101,7 +6342,7 @@
 	push hl
 	ld a,1
 	ld [$D125],a
-	call $30E8
+	call DisplayTextBoxID
 	call $2429
 	call Delay3
 	pop hl
@@ -6666,8 +6907,8 @@
 	res 6,[hl]
 	call ClearScreen
 	call $3DED
-	call $36A0 ; load some graphics in VRAM
-	call $3680 ; load fonts in VRAM
+	call LoadTextBoxTilePatterns
+	call LoadFontTilePatterns
 	ld hl,$D730
 	set 6,[hl]
 	ld a,[$D088]
@@ -6800,7 +7041,7 @@
 	ld a,$EF    ; song #
 	call $23A1  ; plays music
 	call ClearScreen
-	call $36A0
+	call LoadTextBoxTilePatterns
 	call $60CA
 	ld a,$18
 	call Predef
@@ -6877,7 +7118,7 @@
 	ld de,$4180
 	ld hl,$8000
 	ld bc,$050C
-	call $1848
+	call CopyVideoData
 	ld de,$6FE8
 	ld bc,$0400
 	call IntroPredef3B
@@ -6905,8 +7146,8 @@
 	ld hl,$C40A
 	ld b,7
 	ld c,7
-	call $18C4
-	call $36A0
+	call ClearScreenArea
+	call LoadTextBoxTilePatterns
 	ld a,1
 	ld [$CFCB],a
 	ld c,$32
@@ -7425,7 +7666,7 @@
 	call $18d6 ; transfer background in WRAM to VRAM
 	xor a
 	ld [$ffb0],a ; put the window on the screen
-	call $3680 ; transfer tile pattern data for text into VRAM
+	call LoadFontTilePatterns
 	ld a,$01
 	ld [H_AUTOBGTRANSFERENABLED],a ; enable continuous WRAM to VRAM transfer each V-blank
 	ret
@@ -32611,7 +32852,7 @@
 	ld bc,$0801
 	ld a,$14
 	ld [$D125],a
-	call $30E8
+	call DisplayTextBoxID
 	ld a,[$CC26]
 	and a
 	jr nz,.next4\@
@@ -32644,7 +32885,7 @@
 	call $0082
 	ld hl,$C3A0
 	ld bc,$040B
-	call $18C4
+	call ClearScreenArea
 	ld b,1
 	call $3DEF
 	call $3DDC
@@ -64638,7 +64879,7 @@
 	ld b,$1E ; ROM bank
 	ld a,[$D07D]
 	ld c,a ; number of tiles
-	jp $1848 ; load tileset
+	jp CopyVideoData ; load tileset
 
 AnimationTilesetPointers: ; 41F2
 db 79 ; number of tiles