mirror of
https://github.com/thornAvery/kep-hack.git
synced 2025-09-17 02:40:50 +12:00
Split more code out of home.asm.
This commit is contained in:
parent
d424eb4438
commit
6d8c6055b5
24
data/collision.asm
Normal file
24
data/collision.asm
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
Underground_Coll:: INCBIN "gfx/tilesets/underground.tilecoll"
|
||||||
|
Overworld_Coll:: INCBIN "gfx/tilesets/overworld.tilecoll"
|
||||||
|
RedsHouse1_Coll::
|
||||||
|
RedsHouse2_Coll:: INCBIN "gfx/tilesets/reds_house.tilecoll"
|
||||||
|
Mart_Coll::
|
||||||
|
Pokecenter_Coll:: INCBIN "gfx/tilesets/pokecenter.tilecoll"
|
||||||
|
Dojo_Coll::
|
||||||
|
Gym_Coll:: INCBIN "gfx/tilesets/gym.tilecoll"
|
||||||
|
Forest_Coll:: INCBIN "gfx/tilesets/forest.tilecoll"
|
||||||
|
House_Coll:: INCBIN "gfx/tilesets/house.tilecoll"
|
||||||
|
ForestGate_Coll::
|
||||||
|
Museum_Coll::
|
||||||
|
Gate_Coll:: INCBIN "gfx/tilesets/gate.tilecoll"
|
||||||
|
Ship_Coll:: INCBIN "gfx/tilesets/ship.tilecoll"
|
||||||
|
ShipPort_Coll:: INCBIN "gfx/tilesets/ship_port.tilecoll"
|
||||||
|
Cemetery_Coll:: INCBIN "gfx/tilesets/cemetery.tilecoll"
|
||||||
|
Interior_Coll:: INCBIN "gfx/tilesets/interior.tilecoll"
|
||||||
|
Cavern_Coll:: INCBIN "gfx/tilesets/cavern.tilecoll"
|
||||||
|
Lobby_Coll:: INCBIN "gfx/tilesets/lobby.tilecoll"
|
||||||
|
Mansion_Coll:: INCBIN "gfx/tilesets/mansion.tilecoll"
|
||||||
|
Lab_Coll:: INCBIN "gfx/tilesets/lab.tilecoll"
|
||||||
|
Club_Coll:: INCBIN "gfx/tilesets/club.tilecoll"
|
||||||
|
Facility_Coll:: INCBIN "gfx/tilesets/facility.tilecoll"
|
||||||
|
Plateau_Coll:: INCBIN "gfx/tilesets/plateau.tilecoll"
|
183
home/audio.asm
Normal file
183
home/audio.asm
Normal file
|
@ -0,0 +1,183 @@
|
||||||
|
Func_2307:: ; 2307 (0:2307)
|
||||||
|
call WaitForSoundToFinish
|
||||||
|
xor a
|
||||||
|
ld c, a
|
||||||
|
ld d, a
|
||||||
|
ld [wcfca], a
|
||||||
|
jr asm_2324
|
||||||
|
|
||||||
|
Func_2312:: ; 2312 (0:2312)
|
||||||
|
ld c, $a
|
||||||
|
ld d, $0
|
||||||
|
ld a, [wd72e]
|
||||||
|
bit 5, a
|
||||||
|
jr z, asm_2324
|
||||||
|
xor a
|
||||||
|
ld [wcfca], a
|
||||||
|
ld c, $8
|
||||||
|
ld d, c
|
||||||
|
asm_2324:: ; 2324 (0:2324)
|
||||||
|
ld a, [wd700]
|
||||||
|
and a
|
||||||
|
jr z, .asm_2343
|
||||||
|
cp $2
|
||||||
|
jr z, .asm_2332
|
||||||
|
ld a, MUSIC_BIKE_RIDING
|
||||||
|
jr .asm_2334
|
||||||
|
.asm_2332
|
||||||
|
ld a, MUSIC_SURFING
|
||||||
|
.asm_2334
|
||||||
|
ld b, a
|
||||||
|
ld a, d
|
||||||
|
and a
|
||||||
|
ld a, Bank(Func_7d8ea)
|
||||||
|
jr nz, .asm_233e
|
||||||
|
ld [wc0ef], a
|
||||||
|
.asm_233e
|
||||||
|
ld [wc0f0], a
|
||||||
|
jr .asm_234c
|
||||||
|
.asm_2343
|
||||||
|
ld a, [wd35b]
|
||||||
|
ld b, a
|
||||||
|
call Func_2385
|
||||||
|
jr c, .asm_2351
|
||||||
|
.asm_234c
|
||||||
|
ld a, [wcfca]
|
||||||
|
cp b
|
||||||
|
ret z
|
||||||
|
.asm_2351
|
||||||
|
ld a, c
|
||||||
|
ld [wMusicHeaderPointer], a
|
||||||
|
ld a, b
|
||||||
|
ld [wcfca], a
|
||||||
|
ld [wc0ee], a
|
||||||
|
jp PlaySound
|
||||||
|
|
||||||
|
Func_235f:: ; 235f (0:235f)
|
||||||
|
ld a, [wc0ef]
|
||||||
|
ld b, a
|
||||||
|
cp $2
|
||||||
|
jr nz, .checkForBank08
|
||||||
|
.bank02
|
||||||
|
ld hl, Func_9103
|
||||||
|
jr .asm_2378
|
||||||
|
.checkForBank08
|
||||||
|
cp $8
|
||||||
|
jr nz, .bank1F
|
||||||
|
.bank08
|
||||||
|
ld hl, Func_21879
|
||||||
|
jr .asm_2378
|
||||||
|
.bank1F
|
||||||
|
ld hl, Func_7d177
|
||||||
|
.asm_2378
|
||||||
|
ld c, $6
|
||||||
|
.asm_237a
|
||||||
|
push bc
|
||||||
|
push hl
|
||||||
|
call Bankswitch
|
||||||
|
pop hl
|
||||||
|
pop bc
|
||||||
|
dec c
|
||||||
|
jr nz, .asm_237a
|
||||||
|
ret
|
||||||
|
|
||||||
|
Func_2385:: ; 2385 (0:2385)
|
||||||
|
ld a, [wd35c]
|
||||||
|
ld e, a
|
||||||
|
ld a, [wc0ef]
|
||||||
|
cp e
|
||||||
|
jr nz, .asm_2394
|
||||||
|
ld [wc0f0], a
|
||||||
|
and a
|
||||||
|
ret
|
||||||
|
.asm_2394
|
||||||
|
ld a, c
|
||||||
|
and a
|
||||||
|
ld a, e
|
||||||
|
jr nz, .asm_239c
|
||||||
|
ld [wc0ef], a
|
||||||
|
.asm_239c
|
||||||
|
ld [wc0f0], a
|
||||||
|
scf
|
||||||
|
ret
|
||||||
|
|
||||||
|
PlayMusic:: ; 23a1 (0:23a1)
|
||||||
|
ld b, a
|
||||||
|
ld [wc0ee], a
|
||||||
|
xor a
|
||||||
|
ld [wMusicHeaderPointer], a
|
||||||
|
ld a, c
|
||||||
|
ld [wc0ef], a
|
||||||
|
ld [wc0f0], a
|
||||||
|
ld a, b
|
||||||
|
|
||||||
|
; plays music specified by a. If value is $ff, music is stopped
|
||||||
|
PlaySound:: ; 23b1 (0:23b1)
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
ld b, a
|
||||||
|
ld a, [wc0ee]
|
||||||
|
and a
|
||||||
|
jr z, .asm_23c8
|
||||||
|
xor a
|
||||||
|
ld [wc02a], a
|
||||||
|
ld [wc02b], a
|
||||||
|
ld [wc02c], a
|
||||||
|
ld [wc02d], a
|
||||||
|
.asm_23c8
|
||||||
|
ld a, [wMusicHeaderPointer]
|
||||||
|
and a
|
||||||
|
jr z, .asm_23e3
|
||||||
|
ld a, [wc0ee]
|
||||||
|
and a
|
||||||
|
jr z, .asm_2425
|
||||||
|
xor a
|
||||||
|
ld [wc0ee], a
|
||||||
|
ld a, [wcfca]
|
||||||
|
cp $ff
|
||||||
|
jr nz, .asm_2414
|
||||||
|
xor a
|
||||||
|
ld [wMusicHeaderPointer], a
|
||||||
|
.asm_23e3
|
||||||
|
xor a
|
||||||
|
ld [wc0ee], a
|
||||||
|
ld a, [H_LOADEDROMBANK]
|
||||||
|
ld [$ffb9], a
|
||||||
|
ld a, [wc0ef]
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [$2000], a
|
||||||
|
cp $2
|
||||||
|
jr nz, .checkForBank08
|
||||||
|
.bank02
|
||||||
|
ld a, b
|
||||||
|
call Func_9876
|
||||||
|
jr .asm_240b
|
||||||
|
.checkForBank08
|
||||||
|
cp $8
|
||||||
|
jr nz, .bank1F
|
||||||
|
.bank08
|
||||||
|
ld a, b
|
||||||
|
call Func_22035
|
||||||
|
jr .asm_240b
|
||||||
|
.bank1F
|
||||||
|
ld a, b
|
||||||
|
call Func_7d8ea
|
||||||
|
.asm_240b
|
||||||
|
ld a, [$ffb9]
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [$2000], a
|
||||||
|
jr .asm_2425
|
||||||
|
.asm_2414
|
||||||
|
ld a, b
|
||||||
|
ld [wcfca], a
|
||||||
|
ld a, [wMusicHeaderPointer]
|
||||||
|
ld [wcfc8], a
|
||||||
|
ld [wcfc9], a
|
||||||
|
ld a, b
|
||||||
|
ld [wMusicHeaderPointer], a
|
||||||
|
.asm_2425
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ret
|
73
home/fade.asm
Normal file
73
home/fade.asm
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
; These routines manage gradual fading
|
||||||
|
; (e.g., entering a doorway)
|
||||||
|
LoadGBPal::
|
||||||
|
ld a, [wd35d] ;tells if cur.map is dark (requires HM5_FLASH?)
|
||||||
|
ld b, a
|
||||||
|
ld hl, FadePal4
|
||||||
|
ld a, l
|
||||||
|
sub b
|
||||||
|
ld l, a
|
||||||
|
jr nc, .ok
|
||||||
|
dec h
|
||||||
|
.ok
|
||||||
|
ld a, [hli]
|
||||||
|
ld [rBGP], a
|
||||||
|
ld a, [hli]
|
||||||
|
ld [rOBP0], a
|
||||||
|
ld a, [hli]
|
||||||
|
ld [rOBP1], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
GBFadeOut1::
|
||||||
|
ld hl, FadePal1
|
||||||
|
ld b, 4
|
||||||
|
jr GBFadeOutCommon
|
||||||
|
|
||||||
|
GBFadeOut2::
|
||||||
|
ld hl, FadePal6
|
||||||
|
ld b, 3
|
||||||
|
|
||||||
|
GBFadeOutCommon::
|
||||||
|
ld a, [hli]
|
||||||
|
ld [rBGP], a
|
||||||
|
ld a, [hli]
|
||||||
|
ld [rOBP0], a
|
||||||
|
ld a, [hli]
|
||||||
|
ld [rOBP1], a
|
||||||
|
ld c, 8
|
||||||
|
call DelayFrames
|
||||||
|
dec b
|
||||||
|
jr nz, GBFadeOutCommon
|
||||||
|
ret
|
||||||
|
|
||||||
|
GBFadeIn1::
|
||||||
|
ld hl, FadePal4 + 2
|
||||||
|
ld b, 4
|
||||||
|
jr GBFadeInCommon
|
||||||
|
|
||||||
|
GBFadeIn2::
|
||||||
|
ld hl, FadePal7 + 2
|
||||||
|
ld b, 3
|
||||||
|
|
||||||
|
GBFadeInCommon::
|
||||||
|
ld a, [hld]
|
||||||
|
ld [rOBP1], a
|
||||||
|
ld a, [hld]
|
||||||
|
ld [rOBP0], a
|
||||||
|
ld a, [hld]
|
||||||
|
ld [rBGP], a
|
||||||
|
ld c, 8
|
||||||
|
call DelayFrames
|
||||||
|
dec b
|
||||||
|
jr nz, GBFadeInCommon
|
||||||
|
ret
|
||||||
|
|
||||||
|
FadePal1:: db %11111111, %11111111, %11111111
|
||||||
|
FadePal2:: db %11111110, %11111110, %11111000
|
||||||
|
FadePal3:: db %11111001, %11100100, %11100100
|
||||||
|
FadePal4:: db %11100100, %11010000, %11100000
|
||||||
|
; rBGP rOBP0 rOBP1
|
||||||
|
FadePal5:: db %11100100, %11010000, %11100000
|
||||||
|
FadePal6:: db %10010000, %10000000, %10010000
|
||||||
|
FadePal7:: db %01000000, %01000000, %01000000
|
||||||
|
FadePal8:: db %00000000, %00000000, %00000000
|
139
home/init.asm
Normal file
139
home/init.asm
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
SoftReset::
|
||||||
|
call StopAllSounds
|
||||||
|
call GBPalWhiteOut
|
||||||
|
ld c, $20
|
||||||
|
call DelayFrames
|
||||||
|
; fallthrough
|
||||||
|
|
||||||
|
Init::
|
||||||
|
; Program init.
|
||||||
|
|
||||||
|
rLCDC_DEFAULT EQU %11100011
|
||||||
|
; * LCD enabled
|
||||||
|
; * Window tile map at $9C00
|
||||||
|
; * Window display enabled
|
||||||
|
; * BG and window tile data at $8800
|
||||||
|
; * BG tile map at $9800
|
||||||
|
; * 8x8 OBJ size
|
||||||
|
; * OBJ display enabled
|
||||||
|
; * BG display enabled
|
||||||
|
|
||||||
|
di
|
||||||
|
|
||||||
|
xor a
|
||||||
|
ld [rIF], a
|
||||||
|
ld [rIE], a
|
||||||
|
ld [$ff43], a
|
||||||
|
ld [$ff42], a
|
||||||
|
ld [$ff01], a
|
||||||
|
ld [$ff02], a
|
||||||
|
ld [$ff4b], a
|
||||||
|
ld [$ff4a], a
|
||||||
|
ld [$ff06], a
|
||||||
|
ld [$ff07], a
|
||||||
|
ld [$ff47], a
|
||||||
|
ld [$ff48], a
|
||||||
|
ld [$ff49], a
|
||||||
|
|
||||||
|
ld a, rLCDC_ENABLE_MASK
|
||||||
|
ld [rLCDC], a
|
||||||
|
call DisableLCD
|
||||||
|
|
||||||
|
ld sp, wStack
|
||||||
|
|
||||||
|
ld hl, $c000 ; start of WRAM
|
||||||
|
ld bc, $2000 ; size of WRAM
|
||||||
|
.loop
|
||||||
|
ld [hl], 0
|
||||||
|
inc hl
|
||||||
|
dec bc
|
||||||
|
ld a, b
|
||||||
|
or c
|
||||||
|
jr nz, .loop
|
||||||
|
|
||||||
|
call ClearVram
|
||||||
|
|
||||||
|
ld hl, $ff80
|
||||||
|
ld bc, $ffff - $ff80
|
||||||
|
call FillMemory
|
||||||
|
|
||||||
|
call ClearSprites
|
||||||
|
|
||||||
|
ld a, Bank(WriteDMACodeToHRAM)
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [MBC3RomBank], a
|
||||||
|
call WriteDMACodeToHRAM
|
||||||
|
|
||||||
|
xor a
|
||||||
|
ld [$ffd7], a
|
||||||
|
ld [$ff41], a
|
||||||
|
ld [$ffae], a
|
||||||
|
ld [$ffaf], a
|
||||||
|
ld [$ff0f], a
|
||||||
|
ld a, 1 << VBLANK + 1 << TIMER + 1 << SERIAL
|
||||||
|
ld [rIE], a
|
||||||
|
|
||||||
|
ld a, 144 ; move the window off-screen
|
||||||
|
ld [$ffb0], a
|
||||||
|
ld [rWY], a
|
||||||
|
ld a, 7
|
||||||
|
ld [rWX], a
|
||||||
|
|
||||||
|
ld a, $ff
|
||||||
|
ld [$ffaa], a
|
||||||
|
|
||||||
|
ld h, vBGMap0 / $100
|
||||||
|
call ClearBgMap
|
||||||
|
ld h, vBGMap1 / $100
|
||||||
|
call ClearBgMap
|
||||||
|
|
||||||
|
ld a, rLCDC_DEFAULT
|
||||||
|
ld [rLCDC], a
|
||||||
|
ld a, 16
|
||||||
|
ld [hSoftReset], a
|
||||||
|
call StopAllSounds
|
||||||
|
|
||||||
|
ei
|
||||||
|
|
||||||
|
ld a, $40 ; PREDEF_SGB_BORDER
|
||||||
|
call Predef
|
||||||
|
|
||||||
|
ld a, $1f
|
||||||
|
ld [wc0ef], a
|
||||||
|
ld [wc0f0], a
|
||||||
|
ld a, $9c
|
||||||
|
ld [$ffbd], a
|
||||||
|
xor a
|
||||||
|
ld [$ffbc], a
|
||||||
|
dec a
|
||||||
|
ld [wcfcb], a
|
||||||
|
|
||||||
|
ld a, $32 ; PREDEF_INTRO
|
||||||
|
call Predef
|
||||||
|
|
||||||
|
call DisableLCD
|
||||||
|
call ClearVram
|
||||||
|
call GBPalNormal
|
||||||
|
call ClearSprites
|
||||||
|
ld a, rLCDC_DEFAULT
|
||||||
|
ld [rLCDC], a
|
||||||
|
|
||||||
|
jp SetDefaultNamesBeforeTitlescreen
|
||||||
|
|
||||||
|
ClearVram:
|
||||||
|
ld hl, $8000
|
||||||
|
ld bc, $2000
|
||||||
|
xor a
|
||||||
|
jp FillMemory
|
||||||
|
|
||||||
|
|
||||||
|
StopAllSounds::
|
||||||
|
ld a, Bank(Func_9876)
|
||||||
|
ld [wc0ef], a
|
||||||
|
ld [wc0f0], a
|
||||||
|
xor a
|
||||||
|
ld [wMusicHeaderPointer], a
|
||||||
|
ld [wc0ee], a
|
||||||
|
ld [wcfca], a
|
||||||
|
dec a
|
||||||
|
jp PlaySound
|
591
home/pic.asm
Normal file
591
home/pic.asm
Normal file
|
@ -0,0 +1,591 @@
|
||||||
|
; bankswitches and runs _UncompressSpriteData
|
||||||
|
; bank is given in a, sprite input stream is pointed to in W_SPRITEINPUTPTR
|
||||||
|
UncompressSpriteData:: ; 24fd (0:24fd)
|
||||||
|
ld b, a
|
||||||
|
ld a, [H_LOADEDROMBANK]
|
||||||
|
push af
|
||||||
|
ld a, b
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [$2000], a
|
||||||
|
ld a, $a
|
||||||
|
ld [$0], a
|
||||||
|
xor a
|
||||||
|
ld [$4000], a
|
||||||
|
call _UncompressSpriteData
|
||||||
|
pop af
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [$2000], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; initializes necessary data to load a sprite and runs UncompressSpriteDataLoop
|
||||||
|
_UncompressSpriteData:: ; 251a (0:251a)
|
||||||
|
ld hl, S_SPRITEBUFFER1
|
||||||
|
ld c, (2*SPRITEBUFFERSIZE) % $100
|
||||||
|
ld b, (2*SPRITEBUFFERSIZE) / $100
|
||||||
|
xor a
|
||||||
|
call FillMemory ; clear sprite buffer 1 and 2
|
||||||
|
ld a, $1
|
||||||
|
ld [W_SPRITEINPUTBITCOUNTER], a
|
||||||
|
ld a, $3
|
||||||
|
ld [W_SPRITEOUTPUTBITOFFSET], a
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITECURPOSX], a
|
||||||
|
ld [W_SPRITECURPOSY], a
|
||||||
|
ld [W_SPRITELOADFLAGS], a ; wd0a8
|
||||||
|
call ReadNextInputByte ; first byte of input determines sprite width (high nybble) and height (low nybble) in tiles (8x8 pixels)
|
||||||
|
ld b, a
|
||||||
|
and $f
|
||||||
|
add a
|
||||||
|
add a
|
||||||
|
add a
|
||||||
|
ld [W_SPRITEHEIGHT], a
|
||||||
|
ld a, b
|
||||||
|
swap a
|
||||||
|
and $f
|
||||||
|
add a
|
||||||
|
add a
|
||||||
|
add a
|
||||||
|
ld [W_SPRITEWITDH], a
|
||||||
|
call ReadNextInputBit
|
||||||
|
ld [W_SPRITELOADFLAGS], a ; initialite bit1 to 0 and bit0 to the first input bit
|
||||||
|
; this will load two chunks of data to S_SPRITEBUFFER1 and S_SPRITEBUFFER2
|
||||||
|
; bit 0 decides in which one the first chunk is placed
|
||||||
|
; fall through
|
||||||
|
|
||||||
|
; uncompresses a chunk from the sprite input data stream (pointed to at wd0da) into S_SPRITEBUFFER1 or S_SPRITEBUFFER2
|
||||||
|
; each chunk is a 1bpp sprite. A 2bpp sprite consist of two chunks which are merged afterwards
|
||||||
|
; note that this is an endless loop which is terminated during a call to MoveToNextBufferPosition by manipulating the stack
|
||||||
|
UncompressSpriteDataLoop:: ; 2556 (0:2556)
|
||||||
|
ld hl, S_SPRITEBUFFER1
|
||||||
|
ld a, [W_SPRITELOADFLAGS] ; wd0a8
|
||||||
|
bit 0, a
|
||||||
|
jr z, .useSpriteBuffer1 ; check which buffer to use
|
||||||
|
ld hl, S_SPRITEBUFFER2
|
||||||
|
.useSpriteBuffer1
|
||||||
|
call StoreSpriteOutputPointer
|
||||||
|
ld a, [W_SPRITELOADFLAGS] ; wd0a8
|
||||||
|
bit 1, a
|
||||||
|
jr z, .startDecompression ; check if last iteration
|
||||||
|
call ReadNextInputBit ; if last chunk, read 1-2 bit unpacking mode
|
||||||
|
and a
|
||||||
|
jr z, .unpackingMode0 ; 0 -> mode 0
|
||||||
|
call ReadNextInputBit ; 1 0 -> mode 1
|
||||||
|
inc a ; 1 1 -> mode 2
|
||||||
|
.unpackingMode0
|
||||||
|
ld [W_SPRITEUNPACKMODE], a
|
||||||
|
.startDecompression
|
||||||
|
call ReadNextInputBit
|
||||||
|
and a
|
||||||
|
jr z, .readRLEncodedZeros ; if first bit is 0, the input starts with zeroes, otherwise with (non-zero) input
|
||||||
|
.readNextInput
|
||||||
|
call ReadNextInputBit
|
||||||
|
ld c, a
|
||||||
|
call ReadNextInputBit
|
||||||
|
sla c
|
||||||
|
or c ; read next two bits into c
|
||||||
|
and a
|
||||||
|
jr z, .readRLEncodedZeros ; 00 -> RLEncoded zeroes following
|
||||||
|
call WriteSpriteBitsToBuffer ; otherwise write input to output and repeat
|
||||||
|
call MoveToNextBufferPosition
|
||||||
|
jr .readNextInput
|
||||||
|
.readRLEncodedZeros
|
||||||
|
ld c, $0 ; number of zeroes it length encoded, the number
|
||||||
|
.countConsecutiveOnesLoop ; of consecutive ones determines the number of bits the number has
|
||||||
|
call ReadNextInputBit
|
||||||
|
and a
|
||||||
|
jr z, .countConsecutiveOnesFinished
|
||||||
|
inc c
|
||||||
|
jr .countConsecutiveOnesLoop
|
||||||
|
.countConsecutiveOnesFinished
|
||||||
|
ld a, c
|
||||||
|
add a
|
||||||
|
ld hl, LengthEncodingOffsetList
|
||||||
|
add l
|
||||||
|
ld l, a
|
||||||
|
jr nc, .noCarry
|
||||||
|
inc h
|
||||||
|
.noCarry
|
||||||
|
ld a, [hli] ; read offset that is added to the number later on
|
||||||
|
ld e, a ; adding an offset of 2^length - 1 makes every integer uniquely
|
||||||
|
ld d, [hl] ; representable in the length encoding and saves bits
|
||||||
|
push de
|
||||||
|
inc c
|
||||||
|
ld e, $0
|
||||||
|
ld d, e
|
||||||
|
.readNumberOfZerosLoop ; reads the next c+1 bits of input
|
||||||
|
call ReadNextInputBit
|
||||||
|
or e
|
||||||
|
ld e, a
|
||||||
|
dec c
|
||||||
|
jr z, .readNumberOfZerosDone
|
||||||
|
sla e
|
||||||
|
rl d
|
||||||
|
jr .readNumberOfZerosLoop
|
||||||
|
.readNumberOfZerosDone
|
||||||
|
pop hl ; add the offset
|
||||||
|
add hl, de
|
||||||
|
ld e, l
|
||||||
|
ld d, h
|
||||||
|
.writeZerosLoop
|
||||||
|
ld b, e
|
||||||
|
xor a ; write 00 to buffer
|
||||||
|
call WriteSpriteBitsToBuffer
|
||||||
|
ld e, b
|
||||||
|
call MoveToNextBufferPosition
|
||||||
|
dec de
|
||||||
|
ld a, d
|
||||||
|
and a
|
||||||
|
jr nz, .continueLoop
|
||||||
|
ld a, e
|
||||||
|
and a
|
||||||
|
.continueLoop
|
||||||
|
jr nz, .writeZerosLoop
|
||||||
|
jr .readNextInput
|
||||||
|
|
||||||
|
; moves output pointer to next position
|
||||||
|
; also cancels the calling function if the all output is done (by removing the return pointer from stack)
|
||||||
|
; and calls postprocessing functions according to the unpack mode
|
||||||
|
MoveToNextBufferPosition:: ; 25d8 (0:25d8)
|
||||||
|
ld a, [W_SPRITEHEIGHT]
|
||||||
|
ld b, a
|
||||||
|
ld a, [W_SPRITECURPOSY]
|
||||||
|
inc a
|
||||||
|
cp b
|
||||||
|
jr z, .curColumnDone
|
||||||
|
ld [W_SPRITECURPOSY], a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR]
|
||||||
|
inc a
|
||||||
|
ld [W_SPRITEOUTPUTPTR], a
|
||||||
|
ret nz
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR+1]
|
||||||
|
inc a
|
||||||
|
ld [W_SPRITEOUTPUTPTR+1], a
|
||||||
|
ret
|
||||||
|
.curColumnDone
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITECURPOSY], a
|
||||||
|
ld a, [W_SPRITEOUTPUTBITOFFSET]
|
||||||
|
and a
|
||||||
|
jr z, .bitOffsetsDone
|
||||||
|
dec a
|
||||||
|
ld [W_SPRITEOUTPUTBITOFFSET], a
|
||||||
|
ld hl, W_SPRITEOUTPUTPTRCACHED
|
||||||
|
ld a, [hli]
|
||||||
|
ld [W_SPRITEOUTPUTPTR], a
|
||||||
|
ld a, [hl]
|
||||||
|
ld [W_SPRITEOUTPUTPTR+1], a
|
||||||
|
ret
|
||||||
|
.bitOffsetsDone
|
||||||
|
ld a, $3
|
||||||
|
ld [W_SPRITEOUTPUTBITOFFSET], a
|
||||||
|
ld a, [W_SPRITECURPOSX]
|
||||||
|
add $8
|
||||||
|
ld [W_SPRITECURPOSX], a
|
||||||
|
ld b, a
|
||||||
|
ld a, [W_SPRITEWITDH]
|
||||||
|
cp b
|
||||||
|
jr z, .allColumnsDone
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR+1]
|
||||||
|
ld h, a
|
||||||
|
inc hl
|
||||||
|
jp StoreSpriteOutputPointer
|
||||||
|
.allColumnsDone
|
||||||
|
pop hl
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITECURPOSX], a
|
||||||
|
ld a, [W_SPRITELOADFLAGS] ; wd0a8
|
||||||
|
bit 1, a
|
||||||
|
jr nz, .done ; test if there is one more sprite to go
|
||||||
|
xor $1
|
||||||
|
set 1, a
|
||||||
|
ld [W_SPRITELOADFLAGS], a ; wd0a8
|
||||||
|
jp UncompressSpriteDataLoop
|
||||||
|
.done
|
||||||
|
jp UnpackSprite
|
||||||
|
|
||||||
|
; writes 2 bits (from a) to the output buffer (pointed to from W_SPRITEOUTPUTPTR)
|
||||||
|
WriteSpriteBitsToBuffer:: ; 2649 (0:2649)
|
||||||
|
ld e, a
|
||||||
|
ld a, [W_SPRITEOUTPUTBITOFFSET]
|
||||||
|
and a
|
||||||
|
jr z, .offset0
|
||||||
|
cp $2
|
||||||
|
jr c, .offset1
|
||||||
|
jr z, .offset2
|
||||||
|
rrc e ; offset 3
|
||||||
|
rrc e
|
||||||
|
jr .offset0
|
||||||
|
.offset1
|
||||||
|
sla e
|
||||||
|
sla e
|
||||||
|
jr .offset0
|
||||||
|
.offset2
|
||||||
|
swap e
|
||||||
|
.offset0
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR+1]
|
||||||
|
ld h, a
|
||||||
|
ld a, [hl]
|
||||||
|
or e
|
||||||
|
ld [hl], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; reads next bit from input stream and returns it in a
|
||||||
|
ReadNextInputBit:: ; 2670 (0:2670)
|
||||||
|
ld a, [W_SPRITEINPUTBITCOUNTER]
|
||||||
|
dec a
|
||||||
|
jr nz, .curByteHasMoreBitsToRead
|
||||||
|
call ReadNextInputByte
|
||||||
|
ld [W_SPRITEINPUTCURBYTE], a
|
||||||
|
ld a, $8
|
||||||
|
.curByteHasMoreBitsToRead
|
||||||
|
ld [W_SPRITEINPUTBITCOUNTER], a
|
||||||
|
ld a, [W_SPRITEINPUTCURBYTE]
|
||||||
|
rlca
|
||||||
|
ld [W_SPRITEINPUTCURBYTE], a
|
||||||
|
and $1
|
||||||
|
ret
|
||||||
|
|
||||||
|
; reads next byte from input stream and returns it in a
|
||||||
|
ReadNextInputByte:: ; 268b (0:268b)
|
||||||
|
ld a, [W_SPRITEINPUTPTR]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEINPUTPTR+1]
|
||||||
|
ld h, a
|
||||||
|
ld a, [hli]
|
||||||
|
ld b, a
|
||||||
|
ld a, l
|
||||||
|
ld [W_SPRITEINPUTPTR], a
|
||||||
|
ld a, h
|
||||||
|
ld [W_SPRITEINPUTPTR+1], a
|
||||||
|
ld a, b
|
||||||
|
ret
|
||||||
|
|
||||||
|
; the nth item is 2^n - 1
|
||||||
|
LengthEncodingOffsetList:: ; 269f (0:269f)
|
||||||
|
dw %0000000000000001
|
||||||
|
dw %0000000000000011
|
||||||
|
dw %0000000000000111
|
||||||
|
dw %0000000000001111
|
||||||
|
dw %0000000000011111
|
||||||
|
dw %0000000000111111
|
||||||
|
dw %0000000001111111
|
||||||
|
dw %0000000011111111
|
||||||
|
dw %0000000111111111
|
||||||
|
dw %0000001111111111
|
||||||
|
dw %0000011111111111
|
||||||
|
dw %0000111111111111
|
||||||
|
dw %0001111111111111
|
||||||
|
dw %0011111111111111
|
||||||
|
dw %0111111111111111
|
||||||
|
dw %1111111111111111
|
||||||
|
|
||||||
|
; unpacks the sprite data depending on the unpack mode
|
||||||
|
UnpackSprite:: ; 26bf (0:26bf)
|
||||||
|
ld a, [W_SPRITEUNPACKMODE]
|
||||||
|
cp $2
|
||||||
|
jp z, UnpackSpriteMode2
|
||||||
|
and a
|
||||||
|
jp nz, XorSpriteChunks
|
||||||
|
ld hl, S_SPRITEBUFFER1
|
||||||
|
call SpriteDifferentialDecode
|
||||||
|
ld hl, S_SPRITEBUFFER2
|
||||||
|
; fall through
|
||||||
|
|
||||||
|
; decodes differential encoded sprite data
|
||||||
|
; input bit value 0 preserves the current bit value and input bit value 1 toggles it (starting from initial value 0).
|
||||||
|
SpriteDifferentialDecode:: ; 26d4 (0:26d4)
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITECURPOSX], a
|
||||||
|
ld [W_SPRITECURPOSY], a
|
||||||
|
call StoreSpriteOutputPointer
|
||||||
|
ld a, [W_SPRITEFLIPPED]
|
||||||
|
and a
|
||||||
|
jr z, .notFlipped
|
||||||
|
ld hl, DecodeNybble0TableFlipped
|
||||||
|
ld de, DecodeNybble1TableFlipped
|
||||||
|
jr .storeDecodeTablesPointers
|
||||||
|
.notFlipped
|
||||||
|
ld hl, DecodeNybble0Table
|
||||||
|
ld de, DecodeNybble1Table
|
||||||
|
.storeDecodeTablesPointers
|
||||||
|
ld a, l
|
||||||
|
ld [W_SPRITEDECODETABLE0PTR], a
|
||||||
|
ld a, h
|
||||||
|
ld [W_SPRITEDECODETABLE0PTR+1], a
|
||||||
|
ld a, e
|
||||||
|
ld [W_SPRITEDECODETABLE1PTR], a
|
||||||
|
ld a, d
|
||||||
|
ld [W_SPRITEDECODETABLE1PTR+1], a
|
||||||
|
ld e, $0 ; last decoded nybble, initialized to 0
|
||||||
|
.decodeNextByteLoop
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR+1]
|
||||||
|
ld h, a
|
||||||
|
ld a, [hl]
|
||||||
|
ld b, a
|
||||||
|
swap a
|
||||||
|
and $f
|
||||||
|
call DifferentialDecodeNybble ; decode high nybble
|
||||||
|
swap a
|
||||||
|
ld d, a
|
||||||
|
ld a, b
|
||||||
|
and $f
|
||||||
|
call DifferentialDecodeNybble ; decode low nybble
|
||||||
|
or d
|
||||||
|
ld b, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR+1]
|
||||||
|
ld h, a
|
||||||
|
ld a, b
|
||||||
|
ld [hl], a ; write back decoded data
|
||||||
|
ld a, [W_SPRITEHEIGHT]
|
||||||
|
add l ; move on to next column
|
||||||
|
jr nc, .noCarry
|
||||||
|
inc h
|
||||||
|
.noCarry
|
||||||
|
ld [W_SPRITEOUTPUTPTR], a
|
||||||
|
ld a, h
|
||||||
|
ld [W_SPRITEOUTPUTPTR+1], a
|
||||||
|
ld a, [W_SPRITECURPOSX]
|
||||||
|
add $8
|
||||||
|
ld [W_SPRITECURPOSX], a
|
||||||
|
ld b, a
|
||||||
|
ld a, [W_SPRITEWITDH]
|
||||||
|
cp b
|
||||||
|
jr nz, .decodeNextByteLoop ; test if current row is done
|
||||||
|
xor a
|
||||||
|
ld e, a
|
||||||
|
ld [W_SPRITECURPOSX], a
|
||||||
|
ld a, [W_SPRITECURPOSY] ; move on to next row
|
||||||
|
inc a
|
||||||
|
ld [W_SPRITECURPOSY], a
|
||||||
|
ld b, a
|
||||||
|
ld a, [W_SPRITEHEIGHT]
|
||||||
|
cp b
|
||||||
|
jr z, .done ; test if all rows finished
|
||||||
|
ld a, [W_SPRITEOUTPUTPTRCACHED]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTRCACHED+1]
|
||||||
|
ld h, a
|
||||||
|
inc hl
|
||||||
|
call StoreSpriteOutputPointer
|
||||||
|
jr .decodeNextByteLoop
|
||||||
|
.done
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITECURPOSY], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; decodes the nybble stored in a. Last decoded data is assumed to be in e (needed to determine if initial value is 0 or 1)
|
||||||
|
DifferentialDecodeNybble:: ; 276d (0:276d)
|
||||||
|
srl a ; c=a%2, a/=2
|
||||||
|
ld c, $0
|
||||||
|
jr nc, .evenNumber
|
||||||
|
ld c, $1
|
||||||
|
.evenNumber
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEFLIPPED]
|
||||||
|
and a
|
||||||
|
jr z, .notFlipped ; determine if initial value is 0 or one
|
||||||
|
bit 3, e ; if flipped, consider MSB of last data
|
||||||
|
jr .selectLookupTable
|
||||||
|
.notFlipped
|
||||||
|
bit 0, e ; else consider LSB
|
||||||
|
.selectLookupTable
|
||||||
|
ld e, l
|
||||||
|
jr nz, .initialValue1 ; load the appropriate table
|
||||||
|
ld a, [W_SPRITEDECODETABLE0PTR]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEDECODETABLE0PTR+1]
|
||||||
|
jr .tableLookup
|
||||||
|
.initialValue1
|
||||||
|
ld a, [W_SPRITEDECODETABLE1PTR]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEDECODETABLE1PTR+1]
|
||||||
|
.tableLookup
|
||||||
|
ld h, a
|
||||||
|
ld a, e
|
||||||
|
add l
|
||||||
|
ld l, a
|
||||||
|
jr nc, .noCarry
|
||||||
|
inc h
|
||||||
|
.noCarry
|
||||||
|
ld a, [hl]
|
||||||
|
bit 0, c
|
||||||
|
jr nz, .selectLowNybble
|
||||||
|
swap a ; select high nybble
|
||||||
|
.selectLowNybble
|
||||||
|
and $f
|
||||||
|
ld e, a ; update last decoded data
|
||||||
|
ret
|
||||||
|
|
||||||
|
DecodeNybble0Table:: ; 27a7 (0:27a7)
|
||||||
|
dn $0, $1
|
||||||
|
dn $3, $2
|
||||||
|
dn $7, $6
|
||||||
|
dn $4, $5
|
||||||
|
dn $f, $e
|
||||||
|
dn $c, $d
|
||||||
|
dn $8, $9
|
||||||
|
dn $b, $a
|
||||||
|
DecodeNybble1Table:: ; 27af (0:27af)
|
||||||
|
dn $f, $e
|
||||||
|
dn $c, $d
|
||||||
|
dn $8, $9
|
||||||
|
dn $b, $a
|
||||||
|
dn $0, $1
|
||||||
|
dn $3, $2
|
||||||
|
dn $7, $6
|
||||||
|
dn $4, $5
|
||||||
|
DecodeNybble0TableFlipped:: ; 27b7 (0:27b7)
|
||||||
|
dn $0, $8
|
||||||
|
dn $c, $4
|
||||||
|
dn $e, $6
|
||||||
|
dn $2, $a
|
||||||
|
dn $f, $7
|
||||||
|
dn $3, $b
|
||||||
|
dn $1, $9
|
||||||
|
dn $d, $5
|
||||||
|
DecodeNybble1TableFlipped:: ; 27bf (0:27bf)
|
||||||
|
dn $f, $7
|
||||||
|
dn $3, $b
|
||||||
|
dn $1, $9
|
||||||
|
dn $d, $5
|
||||||
|
dn $0, $8
|
||||||
|
dn $c, $4
|
||||||
|
dn $e, $6
|
||||||
|
dn $2, $a
|
||||||
|
|
||||||
|
; combines the two loaded chunks with xor (the chunk loaded second is the destination). The source chunk is differeintial decoded beforehand.
|
||||||
|
XorSpriteChunks:: ; 27c7 (0:27c7)
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITECURPOSX], a
|
||||||
|
ld [W_SPRITECURPOSY], a
|
||||||
|
call ResetSpriteBufferPointers
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR] ; points to buffer 1 or 2, depending on flags
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR+1]
|
||||||
|
ld h, a
|
||||||
|
call SpriteDifferentialDecode ; decode buffer 1 or 2, depending on flags
|
||||||
|
call ResetSpriteBufferPointers
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR] ; source buffer, points to buffer 1 or 2, depending on flags
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTR+1]
|
||||||
|
ld h, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTRCACHED] ; destination buffer, points to buffer 2 or 1, depending on flags
|
||||||
|
ld e, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTRCACHED+1]
|
||||||
|
ld d, a
|
||||||
|
.xorChunksLoop
|
||||||
|
ld a, [W_SPRITEFLIPPED]
|
||||||
|
and a
|
||||||
|
jr z, .notFlipped
|
||||||
|
push de
|
||||||
|
ld a, [de]
|
||||||
|
ld b, a
|
||||||
|
swap a
|
||||||
|
and $f
|
||||||
|
call ReverseNybble ; if flipped reverse the nybbles in the destination buffer
|
||||||
|
swap a
|
||||||
|
ld c, a
|
||||||
|
ld a, b
|
||||||
|
and $f
|
||||||
|
call ReverseNybble
|
||||||
|
or c
|
||||||
|
pop de
|
||||||
|
ld [de], a
|
||||||
|
.notFlipped
|
||||||
|
ld a, [hli]
|
||||||
|
ld b, a
|
||||||
|
ld a, [de]
|
||||||
|
xor b
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [W_SPRITECURPOSY]
|
||||||
|
inc a
|
||||||
|
ld [W_SPRITECURPOSY], a ; go to next row
|
||||||
|
ld b, a
|
||||||
|
ld a, [W_SPRITEHEIGHT]
|
||||||
|
cp b
|
||||||
|
jr nz, .xorChunksLoop ; test if column finished
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITECURPOSY], a
|
||||||
|
ld a, [W_SPRITECURPOSX]
|
||||||
|
add $8
|
||||||
|
ld [W_SPRITECURPOSX], a ; go to next column
|
||||||
|
ld b, a
|
||||||
|
ld a, [W_SPRITEWITDH]
|
||||||
|
cp b
|
||||||
|
jr nz, .xorChunksLoop ; test if all columns finished
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITECURPOSX], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; reverses the bits in the nybble given in register a
|
||||||
|
ReverseNybble:: ; 2837 (0:2837)
|
||||||
|
ld de, NybbleReverseTable
|
||||||
|
add e
|
||||||
|
ld e, a
|
||||||
|
jr nc, .asm_283f
|
||||||
|
inc d
|
||||||
|
.asm_283f
|
||||||
|
ld a, [de]
|
||||||
|
ret
|
||||||
|
|
||||||
|
; resets sprite buffer pointers to buffer 1 and 2, depending on W_SPRITELOADFLAGS
|
||||||
|
ResetSpriteBufferPointers:: ; 2841 (0:2841)
|
||||||
|
ld a, [W_SPRITELOADFLAGS] ; wd0a8
|
||||||
|
bit 0, a
|
||||||
|
jr nz, .buffer2Selected
|
||||||
|
ld de, S_SPRITEBUFFER1
|
||||||
|
ld hl, S_SPRITEBUFFER2
|
||||||
|
jr .storeBufferPointers
|
||||||
|
.buffer2Selected
|
||||||
|
ld de, S_SPRITEBUFFER2
|
||||||
|
ld hl, S_SPRITEBUFFER1
|
||||||
|
.storeBufferPointers
|
||||||
|
ld a, l
|
||||||
|
ld [W_SPRITEOUTPUTPTR], a
|
||||||
|
ld a, h
|
||||||
|
ld [W_SPRITEOUTPUTPTR+1], a
|
||||||
|
ld a, e
|
||||||
|
ld [W_SPRITEOUTPUTPTRCACHED], a
|
||||||
|
ld a, d
|
||||||
|
ld [W_SPRITEOUTPUTPTRCACHED+1], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; maps each nybble to its reverse
|
||||||
|
NybbleReverseTable:: ; 2867 (0:2867)
|
||||||
|
db $0, $8, $4, $c, $2, $a, $6 ,$e, $1, $9, $5, $d, $3, $b, $7 ,$f
|
||||||
|
|
||||||
|
; combines the two loaded chunks with xor (the chunk loaded second is the destination). Both chunks are differeintial decoded beforehand.
|
||||||
|
UnpackSpriteMode2:: ; 2877 (0:2877)
|
||||||
|
call ResetSpriteBufferPointers
|
||||||
|
ld a, [W_SPRITEFLIPPED]
|
||||||
|
push af
|
||||||
|
xor a
|
||||||
|
ld [W_SPRITEFLIPPED], a ; temporarily clear flipped flag for decoding the destination chunk
|
||||||
|
ld a, [W_SPRITEOUTPUTPTRCACHED]
|
||||||
|
ld l, a
|
||||||
|
ld a, [W_SPRITEOUTPUTPTRCACHED+1]
|
||||||
|
ld h, a
|
||||||
|
call SpriteDifferentialDecode
|
||||||
|
call ResetSpriteBufferPointers
|
||||||
|
pop af
|
||||||
|
ld [W_SPRITEFLIPPED], a
|
||||||
|
jp XorSpriteChunks
|
||||||
|
|
||||||
|
; stores hl into the output pointers
|
||||||
|
StoreSpriteOutputPointer:: ; 2897 (0:2897)
|
||||||
|
ld a, l
|
||||||
|
ld [W_SPRITEOUTPUTPTR], a
|
||||||
|
ld [W_SPRITEOUTPUTPTRCACHED], a
|
||||||
|
ld a, h
|
||||||
|
ld [W_SPRITEOUTPUTPTR+1], a
|
||||||
|
ld [W_SPRITEOUTPUTPTRCACHED+1], a
|
||||||
|
ret
|
50
home/predef.asm
Normal file
50
home/predef.asm
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
Predef::
|
||||||
|
; Call predefined function a.
|
||||||
|
; To preserve other registers, have the
|
||||||
|
; destination call GetPredefRegisters.
|
||||||
|
|
||||||
|
; Save the predef id for GetPredefPointer.
|
||||||
|
ld [wPredefID], a
|
||||||
|
|
||||||
|
; A hack for LoadDestinationWarpPosition.
|
||||||
|
; See Func_c754 (predef $19).
|
||||||
|
ld a, [H_LOADEDROMBANK]
|
||||||
|
ld [wPredefParentBank], a
|
||||||
|
|
||||||
|
push af
|
||||||
|
ld a, BANK(GetPredefPointer)
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [$2000], a
|
||||||
|
|
||||||
|
call GetPredefPointer
|
||||||
|
|
||||||
|
ld a, [wPredefBank]
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [$2000], a
|
||||||
|
|
||||||
|
ld de, .done
|
||||||
|
push de
|
||||||
|
jp [hl]
|
||||||
|
.done
|
||||||
|
|
||||||
|
pop af
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [$2000], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
GetPredefRegisters::
|
||||||
|
; Restore the contents of register pairs
|
||||||
|
; when GetPredefPointer was called.
|
||||||
|
ld a, [wPredefRegisters + 0]
|
||||||
|
ld h, a
|
||||||
|
ld a, [wPredefRegisters + 1]
|
||||||
|
ld l, a
|
||||||
|
ld a, [wPredefRegisters + 2]
|
||||||
|
ld d, a
|
||||||
|
ld a, [wPredefRegisters + 3]
|
||||||
|
ld e, a
|
||||||
|
ld a, [wPredefRegisters + 4]
|
||||||
|
ld b, a
|
||||||
|
ld a, [wPredefRegisters + 5]
|
||||||
|
ld c, a
|
||||||
|
ret
|
105
home/vblank.asm
Normal file
105
home/vblank.asm
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
VBlank::
|
||||||
|
|
||||||
|
push af
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
|
||||||
|
ld a, [H_LOADEDROMBANK]
|
||||||
|
ld [wd122], a
|
||||||
|
|
||||||
|
ld a, [$ffae]
|
||||||
|
ld [rSCX], a
|
||||||
|
ld a, [$ffaf]
|
||||||
|
ld [rSCY], a
|
||||||
|
|
||||||
|
ld a, [wd0a0]
|
||||||
|
and a
|
||||||
|
jr nz, .ok
|
||||||
|
ld a, [$ffb0]
|
||||||
|
ld [rWY], a
|
||||||
|
.ok
|
||||||
|
|
||||||
|
call AutoBgMapTransfer
|
||||||
|
call VBlankCopyBgMap
|
||||||
|
call RedrawExposedScreenEdge
|
||||||
|
call VBlankCopy
|
||||||
|
call VBlankCopyDouble
|
||||||
|
call UpdateMovingBgTiles
|
||||||
|
call $ff80 ; hOAMDMA
|
||||||
|
ld a, Bank(PrepareOAMData)
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [MBC3RomBank], a
|
||||||
|
call PrepareOAMData
|
||||||
|
|
||||||
|
; VBlank-sensitive operations end.
|
||||||
|
|
||||||
|
call Random
|
||||||
|
|
||||||
|
ld a, [H_VBLANKOCCURRED]
|
||||||
|
and a
|
||||||
|
jr z, .vblanked
|
||||||
|
xor a
|
||||||
|
ld [H_VBLANKOCCURRED], a
|
||||||
|
.vblanked
|
||||||
|
|
||||||
|
ld a, [H_FRAMECOUNTER]
|
||||||
|
and a
|
||||||
|
jr z, .decced
|
||||||
|
dec a
|
||||||
|
ld [H_FRAMECOUNTER], a
|
||||||
|
.decced
|
||||||
|
|
||||||
|
call Func_28cb
|
||||||
|
|
||||||
|
ld a, [wc0ef] ; music ROM bank
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [MBC3RomBank], a
|
||||||
|
|
||||||
|
cp BANK(Func_9103)
|
||||||
|
jr nz, .notbank2
|
||||||
|
.bank2
|
||||||
|
call Func_9103
|
||||||
|
jr .afterMusic
|
||||||
|
.notbank2
|
||||||
|
cp 8
|
||||||
|
jr nz, .bank1F
|
||||||
|
.bank8
|
||||||
|
call Func_2136e
|
||||||
|
call Func_21879
|
||||||
|
jr .afterMusic
|
||||||
|
.bank1F
|
||||||
|
call Func_7d177
|
||||||
|
.afterMusic
|
||||||
|
|
||||||
|
callba Func_18dee ; keep track of time played
|
||||||
|
|
||||||
|
ld a, [$fff9]
|
||||||
|
and a
|
||||||
|
call z, ReadJoypad
|
||||||
|
|
||||||
|
ld a, [wd122]
|
||||||
|
ld [H_LOADEDROMBANK], a
|
||||||
|
ld [MBC3RomBank], a
|
||||||
|
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
|
pop af
|
||||||
|
reti
|
||||||
|
|
||||||
|
|
||||||
|
DelayFrame::
|
||||||
|
; Wait for the next vblank interrupt.
|
||||||
|
; As a bonus, this saves battery.
|
||||||
|
|
||||||
|
NOT_VBLANKED EQU 1
|
||||||
|
|
||||||
|
ld a, NOT_VBLANKED
|
||||||
|
ld [H_VBLANKOCCURRED], a
|
||||||
|
.halt
|
||||||
|
halt
|
||||||
|
ld a, [H_VBLANKOCCURRED]
|
||||||
|
and a
|
||||||
|
jr nz, .halt
|
||||||
|
ret
|
450
home/vcopy.asm
Normal file
450
home/vcopy.asm
Normal file
|
@ -0,0 +1,450 @@
|
||||||
|
; this function seems to be used only once
|
||||||
|
; it store the address of a row and column of the VRAM background map in hl
|
||||||
|
; INPUT: h - row, l - column, b - high byte of background tile map address in VRAM
|
||||||
|
GetRowColAddressBgMap:: ; 1cdd (0:1cdd)
|
||||||
|
xor a
|
||||||
|
srl h
|
||||||
|
rr a
|
||||||
|
srl h
|
||||||
|
rr a
|
||||||
|
srl h
|
||||||
|
rr a
|
||||||
|
or l
|
||||||
|
ld l,a
|
||||||
|
ld a,b
|
||||||
|
or h
|
||||||
|
ld h,a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; clears a VRAM background map with blank space tiles
|
||||||
|
; INPUT: h - high byte of background tile map address in VRAM
|
||||||
|
ClearBgMap:: ; 1cf0 (0:1cf0)
|
||||||
|
ld a," "
|
||||||
|
jr .next
|
||||||
|
ld a,l
|
||||||
|
.next
|
||||||
|
ld de,$400 ; size of VRAM background map
|
||||||
|
ld l,e
|
||||||
|
.loop
|
||||||
|
ld [hli],a
|
||||||
|
dec e
|
||||||
|
jr nz,.loop
|
||||||
|
dec d
|
||||||
|
jr nz,.loop
|
||||||
|
ret
|
||||||
|
|
||||||
|
; When the player takes a step, a row or column of 2x2 tile blocks at the edge
|
||||||
|
; of the screen toward which they moved is exposed and has to be redrawn.
|
||||||
|
; This function does the redrawing.
|
||||||
|
RedrawExposedScreenEdge:: ; 1d01 (0:1d01)
|
||||||
|
ld a,[H_SCREENEDGEREDRAW]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld b,a
|
||||||
|
xor a
|
||||||
|
ld [H_SCREENEDGEREDRAW],a
|
||||||
|
dec b
|
||||||
|
jr nz,.redrawRow
|
||||||
|
.redrawColumn
|
||||||
|
ld hl,wScreenEdgeTiles
|
||||||
|
ld a,[H_SCREENEDGEREDRAWADDR]
|
||||||
|
ld e,a
|
||||||
|
ld a,[H_SCREENEDGEREDRAWADDR + 1]
|
||||||
|
ld d,a
|
||||||
|
ld c,18 ; screen height
|
||||||
|
.loop1
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
inc de
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
ld a,31
|
||||||
|
add e
|
||||||
|
ld e,a
|
||||||
|
jr nc,.noCarry
|
||||||
|
inc d
|
||||||
|
.noCarry
|
||||||
|
; the following 4 lines wrap us from bottom to top if necessary
|
||||||
|
ld a,d
|
||||||
|
and a,$03
|
||||||
|
or a,$98
|
||||||
|
ld d,a
|
||||||
|
dec c
|
||||||
|
jr nz,.loop1
|
||||||
|
xor a
|
||||||
|
ld [H_SCREENEDGEREDRAW],a
|
||||||
|
ret
|
||||||
|
.redrawRow
|
||||||
|
ld hl,wScreenEdgeTiles
|
||||||
|
ld a,[H_SCREENEDGEREDRAWADDR]
|
||||||
|
ld e,a
|
||||||
|
ld a,[H_SCREENEDGEREDRAWADDR + 1]
|
||||||
|
ld d,a
|
||||||
|
push de
|
||||||
|
call .drawHalf ; draw upper half
|
||||||
|
pop de
|
||||||
|
ld a,32 ; width of VRAM background map
|
||||||
|
add e
|
||||||
|
ld e,a
|
||||||
|
; draw lower half
|
||||||
|
.drawHalf
|
||||||
|
ld c,10
|
||||||
|
.loop2
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
inc de
|
||||||
|
ld a,[hli]
|
||||||
|
ld [de],a
|
||||||
|
ld a,e
|
||||||
|
inc a
|
||||||
|
; the following 6 lines wrap us from the right edge to the left edge if necessary
|
||||||
|
and a,$1f
|
||||||
|
ld b,a
|
||||||
|
ld a,e
|
||||||
|
and a,$e0
|
||||||
|
or b
|
||||||
|
ld e,a
|
||||||
|
dec c
|
||||||
|
jr nz,.loop2
|
||||||
|
ret
|
||||||
|
|
||||||
|
; This function automatically transfers tile number data from the tile map at
|
||||||
|
; wTileMap to VRAM during V-blank. Note that it only transfers one third of the
|
||||||
|
; background per V-blank. It cycles through which third it draws.
|
||||||
|
; This transfer is turned off when walking around the map, but is turned
|
||||||
|
; on when talking to sprites, battling, using menus, etc. This is because
|
||||||
|
; the above function, RedrawExposedScreenEdge, is used when walking to
|
||||||
|
; improve efficiency.
|
||||||
|
AutoBgMapTransfer:: ; 1d57 (0:1d57)
|
||||||
|
ld a,[H_AUTOBGTRANSFERENABLED]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld hl,[sp + 0]
|
||||||
|
ld a,h
|
||||||
|
ld [H_SPTEMP],a
|
||||||
|
ld a,l
|
||||||
|
ld [H_SPTEMP + 1],a ; save stack pinter
|
||||||
|
ld a,[H_AUTOBGTRANSFERPORTION]
|
||||||
|
and a
|
||||||
|
jr z,.transferTopThird
|
||||||
|
dec a
|
||||||
|
jr z,.transferMiddleThird
|
||||||
|
.transferBottomThird
|
||||||
|
FuncCoord 0,12
|
||||||
|
ld hl,Coord
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST]
|
||||||
|
ld l,a
|
||||||
|
ld de,(12 * 32)
|
||||||
|
add hl,de
|
||||||
|
xor a ; TRANSFERTOP
|
||||||
|
jr .doTransfer
|
||||||
|
.transferTopThird
|
||||||
|
FuncCoord 0,0
|
||||||
|
ld hl,Coord
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST]
|
||||||
|
ld l,a
|
||||||
|
ld a,TRANSFERMIDDLE
|
||||||
|
jr .doTransfer
|
||||||
|
.transferMiddleThird
|
||||||
|
FuncCoord 0,6
|
||||||
|
ld hl,Coord
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_AUTOBGTRANSFERDEST]
|
||||||
|
ld l,a
|
||||||
|
ld de,(6 * 32)
|
||||||
|
add hl,de
|
||||||
|
ld a,TRANSFERBOTTOM
|
||||||
|
.doTransfer
|
||||||
|
ld [H_AUTOBGTRANSFERPORTION],a ; store next portion
|
||||||
|
ld b,6
|
||||||
|
|
||||||
|
TransferBgRows:: ; 1d9e (0:1d9e)
|
||||||
|
; unrolled loop and using pop for speed
|
||||||
|
|
||||||
|
rept 20 / 2 - 1
|
||||||
|
pop de
|
||||||
|
ld [hl], e
|
||||||
|
inc l
|
||||||
|
ld [hl], d
|
||||||
|
inc l
|
||||||
|
endr
|
||||||
|
|
||||||
|
pop de
|
||||||
|
ld [hl], e
|
||||||
|
inc l
|
||||||
|
ld [hl], d
|
||||||
|
|
||||||
|
i ld a, 32 - (20 - 1)
|
||||||
|
add l
|
||||||
|
ld l, a
|
||||||
|
jr nc, .ok
|
||||||
|
inc h
|
||||||
|
.ok
|
||||||
|
dec b
|
||||||
|
jr nz, TransferBgRows
|
||||||
|
|
||||||
|
ld a, [H_SPTEMP]
|
||||||
|
ld h, a
|
||||||
|
ld a, [H_SPTEMP + 1]
|
||||||
|
ld l, a
|
||||||
|
ld sp, hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
; Copies [H_VBCOPYBGNUMROWS] rows from H_VBCOPYBGSRC to H_VBCOPYBGDEST.
|
||||||
|
; If H_VBCOPYBGSRC is XX00, the transfer is disabled.
|
||||||
|
VBlankCopyBgMap:: ; 1de1 (0:1de1)
|
||||||
|
ld a,[H_VBCOPYBGSRC] ; doubles as enabling byte
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld hl,[sp + 0]
|
||||||
|
ld a,h
|
||||||
|
ld [H_SPTEMP],a
|
||||||
|
ld a,l
|
||||||
|
ld [H_SPTEMP + 1],a ; save stack pointer
|
||||||
|
ld a,[H_VBCOPYBGSRC]
|
||||||
|
ld l,a
|
||||||
|
ld a,[H_VBCOPYBGSRC + 1]
|
||||||
|
ld h,a
|
||||||
|
ld sp,hl
|
||||||
|
ld a,[H_VBCOPYBGDEST]
|
||||||
|
ld l,a
|
||||||
|
ld a,[H_VBCOPYBGDEST + 1]
|
||||||
|
ld h,a
|
||||||
|
ld a,[H_VBCOPYBGNUMROWS]
|
||||||
|
ld b,a
|
||||||
|
xor a
|
||||||
|
ld [H_VBCOPYBGSRC],a ; disable transfer so it doesn't continue next V-blank
|
||||||
|
jr TransferBgRows
|
||||||
|
|
||||||
|
|
||||||
|
VBlankCopyDouble::
|
||||||
|
; Copy [H_VBCOPYDOUBLESIZE] 1bpp tiles
|
||||||
|
; from H_VBCOPYDOUBLESRC to H_VBCOPYDOUBLEDEST.
|
||||||
|
|
||||||
|
; While we're here, convert to 2bpp.
|
||||||
|
; The process is straightforward:
|
||||||
|
; copy each byte twice.
|
||||||
|
|
||||||
|
ld a, [H_VBCOPYDOUBLESIZE]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
|
||||||
|
ld hl, [sp + 0]
|
||||||
|
ld a, h
|
||||||
|
ld [H_SPTEMP], a
|
||||||
|
ld a, l
|
||||||
|
ld [H_SPTEMP + 1], a
|
||||||
|
|
||||||
|
ld a, [H_VBCOPYDOUBLESRC]
|
||||||
|
ld l, a
|
||||||
|
ld a, [H_VBCOPYDOUBLESRC + 1]
|
||||||
|
ld h, a
|
||||||
|
ld sp, hl
|
||||||
|
|
||||||
|
ld a, [H_VBCOPYDOUBLEDEST]
|
||||||
|
ld l, a
|
||||||
|
ld a, [H_VBCOPYDOUBLEDEST + 1]
|
||||||
|
ld h, a
|
||||||
|
|
||||||
|
ld a, [H_VBCOPYDOUBLESIZE]
|
||||||
|
ld b, a
|
||||||
|
xor a ; transferred
|
||||||
|
ld [H_VBCOPYDOUBLESIZE], a
|
||||||
|
|
||||||
|
.loop
|
||||||
|
rept 3
|
||||||
|
pop de
|
||||||
|
ld [hl], e
|
||||||
|
inc l
|
||||||
|
ld [hl], e
|
||||||
|
inc l
|
||||||
|
ld [hl], d
|
||||||
|
inc l
|
||||||
|
ld [hl], d
|
||||||
|
inc l
|
||||||
|
endr
|
||||||
|
|
||||||
|
pop de
|
||||||
|
ld [hl], e
|
||||||
|
inc l
|
||||||
|
ld [hl], e
|
||||||
|
inc l
|
||||||
|
ld [hl], d
|
||||||
|
inc l
|
||||||
|
ld [hl], d
|
||||||
|
inc hl
|
||||||
|
dec b
|
||||||
|
jr nz, .loop
|
||||||
|
|
||||||
|
ld a, l
|
||||||
|
ld [H_VBCOPYDOUBLEDEST], a
|
||||||
|
ld a, h
|
||||||
|
ld [H_VBCOPYDOUBLEDEST + 1], a
|
||||||
|
|
||||||
|
ld hl, [sp + 0]
|
||||||
|
ld a, l
|
||||||
|
ld [H_VBCOPYDOUBLESRC], a
|
||||||
|
ld a, h
|
||||||
|
ld [H_VBCOPYDOUBLESRC + 1], a
|
||||||
|
|
||||||
|
ld a, [H_SPTEMP]
|
||||||
|
ld h, a
|
||||||
|
ld a, [H_SPTEMP + 1]
|
||||||
|
ld l, a
|
||||||
|
ld sp, hl
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
VBlankCopy::
|
||||||
|
; Copy [H_VBCOPYSIZE] 2bpp tiles
|
||||||
|
; from H_VBCOPYSRC to H_VBCOPYDEST.
|
||||||
|
|
||||||
|
; Source and destination addresses
|
||||||
|
; are updated, so transfer can
|
||||||
|
; continue in subsequent calls.
|
||||||
|
|
||||||
|
ld a, [H_VBCOPYSIZE]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
|
||||||
|
ld hl, [sp + 0]
|
||||||
|
ld a, h
|
||||||
|
ld [H_SPTEMP], a
|
||||||
|
ld a, l
|
||||||
|
ld [H_SPTEMP + 1], a
|
||||||
|
|
||||||
|
ld a, [H_VBCOPYSRC]
|
||||||
|
ld l, a
|
||||||
|
ld a, [H_VBCOPYSRC + 1]
|
||||||
|
ld h, a
|
||||||
|
ld sp, hl
|
||||||
|
|
||||||
|
ld a, [H_VBCOPYDEST]
|
||||||
|
ld l, a
|
||||||
|
ld a, [H_VBCOPYDEST + 1]
|
||||||
|
ld h, a
|
||||||
|
|
||||||
|
ld a, [H_VBCOPYSIZE]
|
||||||
|
ld b, a
|
||||||
|
xor a ; transferred
|
||||||
|
ld [H_VBCOPYSIZE], a
|
||||||
|
|
||||||
|
.loop
|
||||||
|
rept 7
|
||||||
|
pop de
|
||||||
|
ld [hl], e
|
||||||
|
inc l
|
||||||
|
ld [hl], d
|
||||||
|
inc l
|
||||||
|
endr
|
||||||
|
|
||||||
|
pop de
|
||||||
|
ld [hl], e
|
||||||
|
inc l
|
||||||
|
ld [hl], d
|
||||||
|
inc hl
|
||||||
|
dec b
|
||||||
|
jr nz, .loop
|
||||||
|
|
||||||
|
ld a, l
|
||||||
|
ld [H_VBCOPYDEST], a
|
||||||
|
ld a, h
|
||||||
|
ld [H_VBCOPYDEST + 1], a
|
||||||
|
|
||||||
|
ld hl, [sp + 0]
|
||||||
|
ld a, l
|
||||||
|
ld [H_VBCOPYSRC], a
|
||||||
|
ld a, h
|
||||||
|
ld [H_VBCOPYSRC + 1], a
|
||||||
|
|
||||||
|
ld a, [H_SPTEMP]
|
||||||
|
ld h, a
|
||||||
|
ld a, [H_SPTEMP + 1]
|
||||||
|
ld l, a
|
||||||
|
ld sp, hl
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
UpdateMovingBgTiles::
|
||||||
|
; Animate water and flower
|
||||||
|
; tiles in the overworld.
|
||||||
|
|
||||||
|
ld a, [$ffd7]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
|
||||||
|
ld a, [$ffd8]
|
||||||
|
inc a
|
||||||
|
ld [$ffd8], a
|
||||||
|
cp $14
|
||||||
|
ret c
|
||||||
|
cp $15
|
||||||
|
jr z, .flower
|
||||||
|
|
||||||
|
ld hl, vTileset + $14 * $10
|
||||||
|
ld c, $10
|
||||||
|
|
||||||
|
ld a, [wd085]
|
||||||
|
inc a
|
||||||
|
and 7
|
||||||
|
ld [wd085], a
|
||||||
|
|
||||||
|
and 4
|
||||||
|
jr nz, .left
|
||||||
|
.right
|
||||||
|
ld a, [hl]
|
||||||
|
rrca
|
||||||
|
ld [hli], a
|
||||||
|
dec c
|
||||||
|
jr nz, .right
|
||||||
|
jr .done
|
||||||
|
.left
|
||||||
|
ld a, [hl]
|
||||||
|
rlca
|
||||||
|
ld [hli], a
|
||||||
|
dec c
|
||||||
|
jr nz, .left
|
||||||
|
.done
|
||||||
|
ld a, [$ffd7]
|
||||||
|
rrca
|
||||||
|
ret nc
|
||||||
|
xor a
|
||||||
|
ld [$ffd8], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
.flower
|
||||||
|
xor a
|
||||||
|
ld [$ffd8], a
|
||||||
|
|
||||||
|
ld a, [wd085]
|
||||||
|
and 3
|
||||||
|
cp 2
|
||||||
|
ld hl, FlowerTile1
|
||||||
|
jr c, .copy
|
||||||
|
ld hl, FlowerTile2
|
||||||
|
jr z, .copy
|
||||||
|
ld hl, FlowerTile3
|
||||||
|
.copy
|
||||||
|
ld de, vTileset + $3 * $10
|
||||||
|
ld c, $10
|
||||||
|
.loop
|
||||||
|
ld a, [hli]
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
dec c
|
||||||
|
jr nz, .loop
|
||||||
|
ret
|
||||||
|
|
||||||
|
FlowerTile1: INCBIN "gfx/tilesets/flower/flower1.2bpp"
|
||||||
|
FlowerTile2: INCBIN "gfx/tilesets/flower/flower2.2bpp"
|
||||||
|
FlowerTile3: INCBIN "gfx/tilesets/flower/flower3.2bpp"
|
Loading…
Reference in a new issue