pokecrystal-board/engine/gfx/load_pics.asm

491 lines
7.2 KiB
NASM
Raw 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
ld [hDividend + 3], a
xor a
ld [hDividend], a
ld [hDividend + 1], a
ld [hDividend + 2], a
ld a, $ff / NUM_UNOWN + 1
2016-01-28 21:57:06 -08:00
ld [hDivisor], a
ld b, 4
call Divide
; Increment to get 1-26
ld a, [hQuotient + 2]
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
ld a, [rSVBK]
push af
call _GetFrontpic
pop af
ld [rSVBK], a
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
ld a, [rSVBK]
push af
xor a
ld [hBGMapMode], a
call _GetFrontpic
call GetAnimatedEnemyFrontpic
2016-01-28 21:57:06 -08:00
pop af
ld [rSVBK], a
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)
2016-01-28 21:57:06 -08:00
ld [rSVBK], a
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
ld a, [hROMBank]
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
ld hl, PokemonPicPointers ; UnownPicPointers
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 GetFarHalfword
pop bc
ret
2018-06-24 07:09:41 -07:00
GetAnimatedEnemyFrontpic:
2017-12-28 04:32:33 -08:00
ld a, BANK(vTiles3)
2016-01-28 21:57:06 -08:00
ld [rVBK], a
push hl
ld de, wDecompressScratch
ld c, 7 * 7
ld a, [hROMBank]
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
ld a, [hROMBank]
ld b, a
call Get2bpp
xor a
ld [rVBK], a
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
ld a, [rSVBK]
push af
ld a, BANK(wDecompressScratch)
2016-01-28 21:57:06 -08:00
ld [rSVBK], a
push de
; These are assumed to be at the same address in their respective banks.
ld hl, PokemonPicPointers ; UnownPicPointers
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 GetFarHalfword
ld de, wDecompressScratch
pop af
call FarDecompress
ld hl, wDecompressScratch
ld c, 6 * 6
call FixBackpicAlignment
pop hl
ld de, wDecompressScratch
ld a, [hROMBank]
ld b, a
call Get2bpp
pop af
ld [rSVBK], a
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
PICS_FIX EQU $36
GLOBAL PICS_FIX
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
Function511ec:
2016-01-28 21:57:06 -08:00
ld a, c
push de
ld hl, PokemonPicPointers
2016-01-28 21:57:06 -08:00
dec a
ld bc, 6
call AddNTimes
ld a, BANK(PokemonPicPointers)
2016-01-28 21:57:06 -08:00
call GetFarByte
call FixPicBank
push af
inc hl
ld a, BANK(PokemonPicPointers)
2016-01-28 21:57:06 -08:00
call GetFarHalfword
pop af
pop de
call FarDecompress
ret
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
ret nc
call WaitBGMap
xor a
ld [hBGMapMode], a
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
ld a, [rSVBK]
push af
ld a, BANK(wDecompressScratch)
2016-01-28 21:57:06 -08:00
ld [rSVBK], a
push de
ld a, BANK(TrainerPicPointers)
call GetFarByte
call FixPicBank
push af
inc hl
ld a, BANK(TrainerPicPointers)
call GetFarHalfword
pop af
ld de, wDecompressScratch
call FarDecompress
pop hl
ld de, wDecompressScratch
ld c, 7 * 7
ld a, [hROMBank]
ld b, a
call Get2bpp
pop af
ld [rSVBK], a
call WaitBGMap
ld a, $1
ld [hBGMapMode], a
ret
2018-06-24 07:09:41 -07:00
DecompressGet2bpp:
2016-01-28 21:57:06 -08:00
; Decompress lz data from b:hl to scratch space at 6:d000, then copy it to address de.
ld a, [rSVBK]
push af
ld a, BANK(wDecompressScratch)
2016-01-28 21:57:06 -08:00
ld [rSVBK], a
push de
push bc
ld a, b
ld de, wDecompressScratch
call FarDecompress
pop bc
ld de, wDecompressScratch
pop hl
ld a, [hROMBank]
ld b, a
call Get2bpp
pop af
ld [rSVBK], a
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