diff options
| -rw-r--r-- | constants.asm | 4 | ||||
| -rw-r--r-- | main.asm | 283 | 
2 files changed, 264 insertions, 23 deletions
| diff --git a/constants.asm b/constants.asm index fa2c6eda..43861e80 100644 --- a/constants.asm +++ b/constants.asm @@ -814,7 +814,7 @@ H_VBCOPYBGDEST EQU $FFC3 ; 2 bytes  ; 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 @@ H_VBCOPYSRC EQU $FFC7  ; 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 @@ -1307,7 +1307,7 @@ LoadTilesetTilePatternData: ; 9E8  	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 @@ LoadPlayerSpriteGraphicsCommon: ; 0x1063  	push de  	push hl  	ld bc,$050c -	call $1848 +	call CopyVideoData  	pop hl  	pop de  	ld a,$c0 @@ -2465,7 +2465,7 @@ LoadPlayerSpriteGraphicsCommon: ; 0x1063  .noCarry\@  	set 3,h  	ld bc,$050c -	jp $1848 +	jp CopyVideoData  ; function to load data from the map header  LoadMapHeader: ; 107C @@ -2938,7 +2938,177 @@ Tset17_Coll: ; 0x17f0  	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, @@ -3251,7 +3421,7 @@ Char51: ; 0x1ab4  	call $3898  	ld hl,$C4A5  	ld bc,$0412 -	call $18C4 +	call ClearScreenArea  	ld c,$14  	call DelayFrames  	pop de @@ -3266,7 +3436,7 @@ Char49: ; 0x1ad5  	call $3898  	ld hl,$C469  	ld bc,$0712 -	call $18C4 +	call ClearScreenArea  	ld c,$14  	call DelayFrames  	pop de @@ -3934,7 +4104,7 @@ VBlankCopyBgMap: ; 1DE1  	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 @@ VBlankCopyDouble: ; 1E02  	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,7 +5441,25 @@ GetMoveName: ; 3058  	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 @@ -5464,7 +5652,60 @@ MoveSprite: ; 363A  	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 @@ -6101,7 +6342,7 @@ PrintText: ; 3C49  	push hl  	ld a,1  	ld [$D125],a -	call $30E8 +	call DisplayTextBoxID  	call $2429  	call Delay3  	pop hl @@ -6666,8 +6907,8 @@ MainMenu: ; 0x5af2  	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 @@ OakSpeech: ; 6115  	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 @@ Function61BC: ; 0x61bc  	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 @@ Function61BC: ; 0x61bc  	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 @@ DisplayTextIDInit: ; 7096  	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 @@ EnemySendOut: ; 490E  	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 @@ EnemySendOut: ; 490E  	call $0082  	ld hl,$C3A0  	ld bc,$040B -	call $18C4 +	call ClearScreenArea  	ld b,1  	call $3DEF  	call $3DDC @@ -64638,7 +64879,7 @@ LoadAnimationTileset: ; 41D2  	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 | 
