pokecrystal-board/engine/gfx/load_pics.asm

473 lines
7.1 KiB
NASM
Raw Permalink Normal View History

2018-06-24 07:09:41 -07:00
GetUnownLetter:
2018-01-23 14:39:09 -08:00
; Return Unown letter in wUnownLetter based on DVs at hl
2016-01-28 21:57:06 -08:00
; Take the middle 2 bits of each DV and place them in order:
; atk def spd spc
; .ww..xx. .yy..zz.
; atk
ld a, [hl]
and %01100000
sla a
ld b, a
; def
ld a, [hli]
and %00000110
swap a
srl a
or b
ld b, a
; spd
ld a, [hl]
and %01100000
swap a
sla a
or b
ld b, a
; spc
ld a, [hl]
and %00000110
srl a
or b
; Divide by 10 to get 0-25
ldh [hDividend + 3], a
2016-01-28 21:57:06 -08:00
xor a
ldh [hDividend], a
ldh [hDividend + 1], a
ldh [hDividend + 2], a
ld a, $ff / NUM_UNOWN + 1
ldh [hDivisor], a
2016-01-28 21:57:06 -08:00
ld b, 4
call Divide
; Increment to get 1-26
ldh a, [hQuotient + 3]
2016-01-28 21:57:06 -08:00
inc a
2018-01-23 14:39:09 -08:00
ld [wUnownLetter], a
2016-01-28 21:57:06 -08:00
ret
2018-06-24 07:09:41 -07:00
GetMonFrontpic:
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
ld [wCurSpecies], a
2016-01-28 21:57:06 -08:00
call IsAPokemon
ret c
ldh a, [rSVBK]
2016-01-28 21:57:06 -08:00
push af
call _GetFrontpic
pop af
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
ret
2018-06-24 07:09:41 -07:00
GetAnimatedFrontpic:
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
ld [wCurSpecies], a
2016-01-28 21:57:06 -08:00
call IsAPokemon
ret c
ldh a, [rSVBK]
2016-01-28 21:57:06 -08:00
push af
xor a
ldh [hBGMapMode], a
2016-01-28 21:57:06 -08:00
call _GetFrontpic
call GetAnimatedEnemyFrontpic
2016-01-28 21:57:06 -08:00
pop af
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
ret
2018-06-24 07:09:41 -07:00
_GetFrontpic:
2016-01-28 21:57:06 -08:00
push de
call GetBaseData
2018-01-23 14:39:09 -08:00
ld a, [wBasePicSize]
2016-01-28 21:57:06 -08:00
and $f
ld b, a
push bc
call GetFrontpicPointer
2017-12-09 11:22:58 -08:00
ld a, BANK(wDecompressEnemyFrontpic)
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
ld a, b
2017-12-09 11:22:58 -08:00
ld de, wDecompressEnemyFrontpic
2016-01-28 21:57:06 -08:00
call FarDecompress
pop bc
ld hl, wDecompressScratch
2017-12-09 11:22:58 -08:00
ld de, wDecompressEnemyFrontpic
call PadFrontpic
2016-01-28 21:57:06 -08:00
pop hl
push hl
ld de, wDecompressScratch
ld c, 7 * 7
ldh a, [hROMBank]
2016-01-28 21:57:06 -08:00
ld b, a
call Get2bpp
pop hl
ret
2018-06-24 07:09:41 -07:00
GetFrontpicPointer:
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
2016-01-28 21:57:06 -08:00
cp UNOWN
jr z, .unown
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
ld d, BANK(PokemonPicPointers)
2016-01-28 21:57:06 -08:00
jr .ok
.unown
2018-01-23 14:39:09 -08:00
ld a, [wUnownLetter]
2016-01-28 21:57:06 -08:00
ld d, BANK(UnownPicPointers)
.ok
; These are assumed to be at the same address in their respective banks.
assert PokemonPicPointers == UnownPicPointers
ld hl, PokemonPicPointers
2016-01-28 21:57:06 -08:00
dec a
ld bc, 6
call AddNTimes
ld a, d
call GetFarByte
call FixPicBank
push af
inc hl
ld a, d
call GetFarWord
2016-01-28 21:57:06 -08:00
pop bc
ret
2018-06-24 07:09:41 -07:00
GetAnimatedEnemyFrontpic:
2017-12-28 04:32:33 -08:00
ld a, BANK(vTiles3)
ldh [rVBK], a
2016-01-28 21:57:06 -08:00
push hl
ld de, wDecompressScratch
ld c, 7 * 7
ldh a, [hROMBank]
2016-01-28 21:57:06 -08:00
ld b, a
call Get2bpp
pop hl
ld de, 7 * 7 tiles
add hl, de
push hl
2018-01-23 14:39:09 -08:00
ld a, BANK(wBasePicSize)
ld hl, wBasePicSize
2016-01-28 21:57:06 -08:00
call GetFarWRAMByte
pop hl
and $f
2017-12-09 11:22:58 -08:00
ld de, wDecompressEnemyFrontpic + 5 * 5 tiles
2016-01-28 21:57:06 -08:00
ld c, 5 * 5
cp 5
jr z, .got_dims
2017-12-09 11:22:58 -08:00
ld de, wDecompressEnemyFrontpic + 6 * 6 tiles
2016-01-28 21:57:06 -08:00
ld c, 6 * 6
cp 6
jr z, .got_dims
2017-12-09 11:22:58 -08:00
ld de, wDecompressEnemyFrontpic + 7 * 7 tiles
2016-01-28 21:57:06 -08:00
ld c, 7 * 7
.got_dims
push hl
push bc
call LoadFrontpicTiles
2016-01-28 21:57:06 -08:00
pop bc
pop hl
ld de, wDecompressScratch
ldh a, [hROMBank]
2016-01-28 21:57:06 -08:00
ld b, a
call Get2bpp
xor a
ldh [rVBK], a
2016-01-28 21:57:06 -08:00
ret
2018-06-24 07:09:41 -07:00
LoadFrontpicTiles:
2016-01-28 21:57:06 -08:00
ld hl, wDecompressScratch
swap c
ld a, c
and $f
ld b, a
ld a, c
and $f0
ld c, a
push bc
call LoadOrientedFrontpic
2016-01-28 21:57:06 -08:00
pop bc
.loop
2016-01-28 21:57:06 -08:00
push bc
2018-01-09 15:08:40 -08:00
ld c, 0
call LoadOrientedFrontpic
2016-01-28 21:57:06 -08:00
pop bc
dec b
jr nz, .loop
2016-01-28 21:57:06 -08:00
ret
2018-06-24 07:09:41 -07:00
GetMonBackpic:
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
2016-01-28 21:57:06 -08:00
call IsAPokemon
ret c
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
2016-01-28 21:57:06 -08:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wUnownLetter]
2016-01-28 21:57:06 -08:00
ld c, a
ldh a, [rSVBK]
2016-01-28 21:57:06 -08:00
push af
ld a, BANK(wDecompressScratch)
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
push de
; These are assumed to be at the same address in their respective banks.
assert PokemonPicPointers == UnownPicPointers
ld hl, PokemonPicPointers
2016-01-28 21:57:06 -08:00
ld a, b
ld d, BANK(PokemonPicPointers)
2016-01-28 21:57:06 -08:00
cp UNOWN
jr nz, .ok
ld a, c
ld d, BANK(UnownPicPointers)
.ok
dec a
ld bc, 6
call AddNTimes
ld bc, 3
add hl, bc
ld a, d
call GetFarByte
call FixPicBank
push af
inc hl
ld a, d
call GetFarWord
2016-01-28 21:57:06 -08:00
ld de, wDecompressScratch
pop af
call FarDecompress
ld hl, wDecompressScratch
ld c, 6 * 6
call FixBackpicAlignment
pop hl
ld de, wDecompressScratch
ldh a, [hROMBank]
2016-01-28 21:57:06 -08:00
ld b, a
call Get2bpp
pop af
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
ret
2018-06-24 07:09:41 -07:00
FixPicBank:
2016-01-28 21:57:06 -08:00
; This is a thing for some reason.
2017-09-24 00:15:01 -07:00
DEF PICS_FIX EQU $36
EXPORT PICS_FIX
2017-09-24 00:15:01 -07:00
2016-01-28 21:57:06 -08:00
push hl
push bc
2018-05-29 16:14:04 -07:00
sub BANK("Pics 1") - PICS_FIX
2016-01-28 21:57:06 -08:00
ld c, a
ld b, 0
ld hl, .PicsBanks
add hl, bc
ld a, [hl]
pop bc
pop hl
ret
2018-06-24 07:09:41 -07:00
.PicsBanks:
2018-06-03 20:18:31 -07:00
db BANK("Pics 1") ; BANK("Pics 1") + 0
db BANK("Pics 2") ; BANK("Pics 1") + 1
db BANK("Pics 3") ; BANK("Pics 1") + 2
db BANK("Pics 4") ; BANK("Pics 1") + 3
db BANK("Pics 5") ; BANK("Pics 1") + 4
db BANK("Pics 6") ; BANK("Pics 1") + 5
db BANK("Pics 7") ; BANK("Pics 1") + 6
db BANK("Pics 8") ; BANK("Pics 1") + 7
db BANK("Pics 9") ; BANK("Pics 1") + 8
db BANK("Pics 10") ; BANK("Pics 1") + 9
db BANK("Pics 11") ; BANK("Pics 1") + 10
db BANK("Pics 12") ; BANK("Pics 1") + 11
db BANK("Pics 13") ; BANK("Pics 1") + 12
db BANK("Pics 14") ; BANK("Pics 1") + 13
db BANK("Pics 15") ; BANK("Pics 1") + 14
db BANK("Pics 16") ; BANK("Pics 1") + 15
db BANK("Pics 17") ; BANK("Pics 1") + 16
db BANK("Pics 18") ; BANK("Pics 1") + 17
db BANK("Pics 19") ; BANK("Pics 1") + 18
db BANK("Pics 20") ; BANK("Pics 1") + 19
db BANK("Pics 21") ; BANK("Pics 1") + 20
db BANK("Pics 22") ; BANK("Pics 1") + 21
db BANK("Pics 23") ; BANK("Pics 1") + 22
db BANK("Pics 24") ; BANK("Pics 1") + 23
2016-01-28 21:57:06 -08:00
2018-06-24 07:09:41 -07:00
GetTrainerPic:
2018-01-23 14:39:09 -08:00
ld a, [wTrainerClass]
2016-01-28 21:57:06 -08:00
and a
ret z
cp NUM_TRAINER_CLASSES + 1
2016-01-28 21:57:06 -08:00
ret nc
call WaitBGMap
xor a
ldh [hBGMapMode], a
2016-01-28 21:57:06 -08:00
ld hl, TrainerPicPointers
2018-01-23 14:39:09 -08:00
ld a, [wTrainerClass]
2016-01-28 21:57:06 -08:00
dec a
ld bc, 3
call AddNTimes
ldh a, [rSVBK]
2016-01-28 21:57:06 -08:00
push af
ld a, BANK(wDecompressScratch)
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
push de
ld a, BANK(TrainerPicPointers)
call GetFarByte
call FixPicBank
push af
inc hl
ld a, BANK(TrainerPicPointers)
call GetFarWord
2016-01-28 21:57:06 -08:00
pop af
ld de, wDecompressScratch
call FarDecompress
pop hl
ld de, wDecompressScratch
ld c, 7 * 7
ldh a, [hROMBank]
2016-01-28 21:57:06 -08:00
ld b, a
call Get2bpp
pop af
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
call WaitBGMap
ld a, 1
ldh [hBGMapMode], a
2016-01-28 21:57:06 -08:00
ret
2018-06-24 07:09:41 -07:00
DecompressGet2bpp:
; Decompress lz data from b:hl to wDecompressScratch, then copy it to address de.
2016-01-28 21:57:06 -08:00
ldh a, [rSVBK]
2016-01-28 21:57:06 -08:00
push af
ld a, BANK(wDecompressScratch)
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
push de
push bc
ld a, b
ld de, wDecompressScratch
call FarDecompress
pop bc
ld de, wDecompressScratch
pop hl
ldh a, [hROMBank]
2016-01-28 21:57:06 -08:00
ld b, a
call Get2bpp
pop af
ldh [rSVBK], a
2016-01-28 21:57:06 -08:00
ret
2018-06-24 07:09:41 -07:00
FixBackpicAlignment:
2016-01-28 21:57:06 -08:00
push de
push bc
ld a, [wBoxAlignment]
and a
jr z, .keep_dims
ld a, c
cp 7 * 7
ld de, 7 * 7 tiles
jr z, .got_dims
cp 6 * 6
ld de, 6 * 6 tiles
jr z, .got_dims
ld de, 5 * 5 tiles
.got_dims
ld a, [hl]
2018-01-15 08:06:17 -08:00
ld b, 0
ld c, 8
2016-01-28 21:57:06 -08:00
.loop
rra
rl b
dec c
jr nz, .loop
ld a, b
ld [hli], a
dec de
ld a, e
or d
jr nz, .got_dims
.keep_dims
pop bc
pop de
ret
2018-06-24 07:09:41 -07:00
PadFrontpic:
; pads frontpic to fill 7x7 box
2016-01-28 21:57:06 -08:00
ld a, b
cp 6
jr z, .six
cp 5
jr z, .five
.seven_loop
2018-06-30 12:58:05 -07:00
ld c, 7 << 4
call LoadOrientedFrontpic
2016-01-28 21:57:06 -08:00
dec b
jr nz, .seven_loop
ret
.six
2018-06-30 12:58:05 -07:00
ld c, 7 << 4
2016-01-28 21:57:06 -08:00
xor a
call .Fill
.six_loop
2018-06-30 12:58:05 -07:00
ld c, (7 - 6) << 4
2016-01-28 21:57:06 -08:00
xor a
call .Fill
2018-06-30 12:58:05 -07:00
ld c, 6 << 4
call LoadOrientedFrontpic
2016-01-28 21:57:06 -08:00
dec b
jr nz, .six_loop
ret
.five
2018-06-30 12:58:05 -07:00
ld c, 7 << 4
2016-01-28 21:57:06 -08:00
xor a
call .Fill
.five_loop
2018-06-30 12:58:05 -07:00
ld c, (7 - 5) << 4
2016-01-28 21:57:06 -08:00
xor a
call .Fill
2018-06-30 12:58:05 -07:00
ld c, 5 << 4
call LoadOrientedFrontpic
2016-01-28 21:57:06 -08:00
dec b
jr nz, .five_loop
2018-06-30 12:58:05 -07:00
ld c, 7 << 4
2016-01-28 21:57:06 -08:00
xor a
call .Fill
ret
.Fill:
2016-01-28 21:57:06 -08:00
ld [hli], a
dec c
jr nz, .Fill
ret
2018-06-24 07:09:41 -07:00
LoadOrientedFrontpic:
2016-01-28 21:57:06 -08:00
ld a, [wBoxAlignment]
and a
jr nz, .x_flip
.left_loop
ld a, [de]
inc de
ld [hli], a
dec c
jr nz, .left_loop
ret
.x_flip
push bc
.right_loop
ld a, [de]
inc de
ld b, a
xor a
2018-01-15 08:06:17 -08:00
rept 8
2016-01-28 21:57:06 -08:00
rr b
rla
2018-01-15 08:06:17 -08:00
endr
2016-01-28 21:57:06 -08:00
ld [hli], a
dec c
jr nz, .right_loop
pop bc
ret