This commit is contained in:
U-Fish-PC\Daniel 2014-06-09 15:10:49 -04:00
commit d266f788b4
18 changed files with 5384 additions and 5227 deletions

View file

@ -50,7 +50,7 @@ $(all_obj): $$*.tx $$(patsubst %.asm, %.tx, $$($$*_dep))
@$(gfx) 2bpp $(2bppq); $(eval 2bppq :=)
@$(gfx) 1bpp $(1bppq); $(eval 1bppq :=)
@$(pic) compress $(picq); $(eval picq :=)
rgbasm -o $@ $*.tx
rgbasm -h -o $@ $*.tx
link := rgblink -n $*.sym -m $*.map

View file

@ -28,6 +28,8 @@ STARYU EQU $1B
BLASTOISE EQU $1C
PINSIR EQU $1D
TANGELA EQU $1E
GROWLITHE EQU $21
ONIX EQU $22
FEAROW EQU $23
@ -45,17 +47,26 @@ PARASECT EQU $2E
PSYDUCK EQU $2F
DROWZEE EQU $30
GOLEM EQU $31
MAGMAR EQU $33
ELECTABUZZ EQU $35
MAGNETON EQU $36
KOFFING EQU $37
MANKEY EQU $39
SEEL EQU $3A
DIGLETT EQU $3B
TAUROS EQU $3C
FARFETCH_D EQU $40
VENONAT EQU $41
DRAGONITE EQU $42
DODUO EQU $46
POLIWAG EQU $47
JYNX EQU $48
@ -65,16 +76,23 @@ ZAPDOS EQU $4B
DITTO EQU $4C
MEOWTH EQU $4D
KRABBY EQU $4E
VULPIX EQU $52
NINETALES EQU $53
PIKACHU EQU $54
RAICHU EQU $55
DRATINI EQU $58
DRAGONAIR EQU $59
KABUTO EQU $5A
KABUTOPS EQU $5B
HORSEA EQU $5C
SEADRA EQU $5D
SANDSHREW EQU $60
SANDSLASH EQU $61
OMANYTE EQU $62
@ -94,29 +112,38 @@ POLIWRATH EQU $6F
WEEDLE EQU $70
KAKUNA EQU $71
BEEDRILL EQU $72
DODRIO EQU $74
PRIMEAPE EQU $75
DUGTRIO EQU $76
VENOMOTH EQU $77
DEWGONG EQU $78
CATERPIE EQU $7B
METAPOD EQU $7C
BUTTERFREE EQU $7D
MACHAMP EQU $7E
GOLDUCK EQU $80
HYPNO EQU $81
GOLBAT EQU $82
MEWTWO EQU $83
SNORLAX EQU $84
MAGIKARP EQU $85
MUK EQU $88
KINGLER EQU $8A
CLOYSTER EQU $8B
ELECTRODE EQU $8D
CLEFABLE EQU $8E
WEEZING EQU $8F
PERSIAN EQU $90
MAROWAK EQU $91
HAUNTER EQU $93
ABRA EQU $94
ALAKAZAM EQU $95
@ -126,8 +153,13 @@ STARMIE EQU $98
BULBASAUR EQU $99
VENUSAUR EQU $9A
TENTACRUEL EQU $9B
GOLDEEN EQU $9D
SEAKING EQU $9E
PONYTA EQU $A3
RAPIDASH EQU $A4
RATTATA EQU $A5
@ -137,12 +169,16 @@ NIDORINA EQU $A8
GEODUDE EQU $A9
PORYGON EQU $AA
AERODACTYL EQU $AB
MAGNEMITE EQU $AD
CHARMANDER EQU $B0
SQUIRTLE EQU $B1
CHARMELEON EQU $B2
WARTORTLE EQU $B3
CHARIZARD EQU $B4
FOSSIL_KABUTOPS EQU $B6
FOSSIL_AERODACTYL EQU $B7
MON_GHOST EQU $B8
@ -151,4 +187,4 @@ GLOOM EQU $BA
VILEPLUME EQU $BB
BELLSPROUT EQU $BC
WEEPINBELL EQU $BD
VICTREEBEL EQU $BE
VICTREEBEL EQU $BE

24
data/collision.asm Normal file
View 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"

View file

@ -1,142 +1,298 @@
ATTR_BLK: MACRO
; This is a command macro.
; Use ATTR_BLK_DATA for data sets.
db ($4 << 3) + ((\1 * 6) / 16 + 1)
db \1
ENDM
ATTR_BLK_DATA: MACRO
db \1 ; which regions are affected
db \2 + (\3 << 2) + (\4 << 4) ; palette for each region
db \5, \6, \7, \8 ; x1, y1, x2, y2
ENDM
PAL_SET: MACRO
db ($a << 3) + 1
dw \1, \2, \3, \4
ds 7
ENDM
PAL_TRN: MACRO
db ($b<< 3) + 1
ds 15
ENDM
MLT_REQ: MACRO
db ($11 << 3) + 1
db \1 - 1
ds 14
ENDM
CHR_TRN: MACRO
db ($13 << 3) + 1
db \1 + (\2 << 1)
ds 14
ENDM
PCT_TRN: MACRO
db ($14 << 3) + 1
ds 15
ENDM
MASK_EN: MACRO
db ($17 << 3) + 1
db \1
ds 14
ENDM
DATA_SND: MACRO
db ($f << 3) + 1
dw \1 ; address
db \2 ; bank
db \3 ; length (1-11)
ENDM
BlkPacket_WholeScreen: ; 7219e (1c:619e)
db $21,$01,$03,$00,$00,$00,$13,$11,$00,$00,$00,$00,$00,$00,$00,$00
ATTR_BLK 1
ATTR_BLK_DATA %011, 0,0,0, 00,00, 19,17
ds 8
db $03,$00,$00,$13,$11,$00,$00
BlkPacket_Battle: ; 721b5 (1c:61b5)
db $22,$05,$07,$0a,$00,$0c,$13,$11,$03,$05,$01,$00,$0a,$03,$03,$00
db $0a,$07,$13,$0a,$03,$0a,$00,$04,$08,$0b,$03,$0f,$0b,$00,$13,$06
db $03,$00,$00,$13,$0b,$00,$03,$00,$0c,$13,$11,$02,$03,$01,$00,$0a
db $03,$01,$03,$0a,$08,$13,$0a,$00,$03,$00,$04,$08,$0b,$02,$03,$0b
db $00,$13,$07,$03,$00
ATTR_BLK 5
ATTR_BLK_DATA %111, 2,2,0, 00,12, 19,17
ATTR_BLK_DATA %011, 1,1,0, 01,00, 10,03
ATTR_BLK_DATA %011, 0,0,0, 10,07, 19,10
ATTR_BLK_DATA %011, 2,2,0, 00,04, 08,11
ATTR_BLK_DATA %011, 3,3,0, 11,00, 19,06
db $03,$00,$00,$13,$0b,$00
db $03,$00,$0c,$13,$11,$02
db $03,$01,$00,$0a,$03,$01
db $03,$0a,$08,$13,$0a,$00
db $03,$00,$04,$08,$0b,$02
db $03,$0b,$00,$13,$07,$03
db $00
BlkPacket_StatusScreen: ; 721fa (1c:61fa)
db $21,$01,$07,$05,$01,$00,$07,$06,$00,$00,$00,$00,$00,$00,$00,$00
db $02,$00,$00,$11,$00,$03,$01,$00,$07,$06,$01,$03,$01,$07,$13,$11
db $00,$03,$08,$00,$13,$06,$00,$00
ATTR_BLK 1
ATTR_BLK_DATA %111, 1,1,0, 01,00, 07,06
ds 8
db $02,$00,$00,$11,$00,$03
db $01,$00,$07,$06,$01,$03
db $01,$07,$13,$11,$00,$03
db $08,$00,$13,$06,$00,$00
BlkPacket_Pokedex: ; 72222 (1c:6222)
db $21,$01,$07,$05,$01,$01,$08,$08,$00,$00,$00,$00,$00,$00,$00,$00
db $02,$00,$00,$11,$00,$01,$00,$01,$13,$00,$03,$01,$01,$08,$08,$01
db $03,$01,$09,$08,$11,$00,$03,$09,$01,$13,$11,$00,$00
ATTR_BLK 1
ATTR_BLK_DATA %111, 1,1,0, 01,01, 08,08
ds 8
db $02,$00,$00,$11,$00,$01
db $00,$01,$13,$00,$03,$01
db $01,$08,$08,$01,$03,$01
db $09,$08,$11,$00,$03,$09
db $01,$13,$11,$00,$00
BlkPacket_Slots: ; 7224f (1c:624f)
db $22,$05,$03,$05,$00,$00,$13,$0b,$03,$0a,$00,$04,$13,$09,$02,$0f
db $00,$06,$13,$07,$03,$00,$04,$04,$0f,$09,$03,$00,$00,$0c,$13,$11
db $03,$00,$00,$13,$0b,$01,$03,$00,$04,$13,$09,$02,$03,$00,$06,$13
db $07,$03,$03,$04,$04,$0f,$09,$00,$03,$00,$0c,$13,$11,$00,$00
ATTR_BLK 5
ATTR_BLK_DATA %011, 1,1,0, 00,00, 19,11
ATTR_BLK_DATA %011, 2,2,0, 00,04, 19,09
ATTR_BLK_DATA %010, 3,3,0, 00,06, 19,07
ATTR_BLK_DATA %011, 0,0,0, 04,04, 15,09
ATTR_BLK_DATA %011, 0,0,0, 00,12, 19,17
db $03,$00,$00,$13,$0b,$01
db $03,$00,$04,$13,$09,$02
db $03,$00,$06,$13,$07,$03
db $03,$04,$04,$0f,$09,$00
db $03,$00,$0c,$13,$11,$00
db $00
BlkPacket_Titlescreen: ; 7228e (1c:628e)
db $22,$03,$03,$00,$00,$00,$13,$07,$02,$05,$00,$08,$13,$09,$03,$0a
db $00,$0a,$13,$11,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $03,$00,$00,$13,$07,$00,$03,$00,$08,$13,$09,$01,$03,$00,$0a,$13
db $11,$02,$00
ATTR_BLK 3
ATTR_BLK_DATA %011, 0,0,0, 00,00, 19,07
ATTR_BLK_DATA %010, 1,1,0, 00,08, 19,09
ATTR_BLK_DATA %011, 2,2,0, 00,10, 19,17
ds 12
db $03,$00,$00,$13,$07,$00
db $03,$00,$08,$13,$09,$01
db $03,$00,$0a,$13,$11,$02
db $00
BlkPacket_NidorinoIntro: ; 722c1 (1c:62c1)
db $22,$03,$03,$05,$00,$00,$13,$03,$03,$00,$00,$04,$13,$0d,$03,$05
db $00,$0e,$13,$11,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $03,$00,$00,$13,$03,$01,$03,$00,$04,$13,$0d,$00,$03,$00,$0e,$13
db $11,$01,$00
ATTR_BLK 3
ATTR_BLK_DATA %011, 1,1,0, 00,00, 19,03
ATTR_BLK_DATA %011, 0,0,0, 00,04, 19,13
ATTR_BLK_DATA %011, 1,1,0, 00,14, 19,17
ds 12
db $03,$00,$00,$13,$03,$01
db $03,$00,$04,$13,$0d,$00
db $03,$00,$0e,$13,$11,$01
db $00
BlkPacket_PartyMenu: ; 722f4 (1c:62f4)
db $23,$07,$06,$10,$01,$00,$02,$0c,$02,$00,$05,$01,$0b,$01,$02,$00
db $05,$03,$0b,$03,$02,$00,$05,$05,$0b,$05,$02,$00,$05,$07,$0b,$07
db $02,$00,$05,$09,$0b,$09,$02,$00,$05,$0b,$0b,$0b,$00,$00,$00,$00
db $02,$00,$00,$11,$01,$03,$01,$00,$02,$0c,$00,$03,$01,$0d,$02,$11
db $01,$03,$03,$00,$13,$11,$01,$03,$0c,$00,$12,$01,$00,$03,$0c,$02
db $12,$03,$00,$03,$0c,$04,$12,$05,$00,$03,$0c,$06,$12,$07,$00,$03
db $0c,$08,$12,$09,$00,$03,$0c,$0a,$12,$0b,$00,$00
ATTR_BLK 7
ATTR_BLK_DATA %110, 0,0,1, 01,00, 02,12
ATTR_BLK_DATA %010, 0,0,0, 05,01, 11,01
ATTR_BLK_DATA %010, 0,0,0, 05,03, 11,03
ATTR_BLK_DATA %010, 0,0,0, 05,05, 11,05
ATTR_BLK_DATA %010, 0,0,0, 05,07, 11,07
ATTR_BLK_DATA %010, 0,0,0, 05,09, 11,09
ATTR_BLK_DATA %010, 0,0,0, 05,11, 11,11
ds 4
db $02,$00,$00,$11,$01,$03
db $01,$00,$02,$0c,$00,$03
db $01,$0d,$02,$11,$01,$03
db $03,$00,$13,$11,$01,$03
db $0c,$00,$12,$01,$00,$03
db $0c,$02,$12,$03,$00,$03
db $0c,$04,$12,$05,$00,$03
db $0c,$06,$12,$07,$00,$03
db $0c,$08,$12,$09,$00,$03
db $0c,$0a,$12,$0b,$00,$00
BlkPacket_TrainerCard: ; 72360 (1c:6360)
db $24,$0a,$02,$00,$03,$0c,$04,$0d,$02,$05,$07,$0c,$08,$0d,$02,$0f
db $0b,$0c,$0c,$0d,$02,$0a,$10,$0b,$11,$0c,$02,$05,$0e,$0d,$0f,$0e
db $02,$0f,$10,$0d,$11,$0e,$02,$0a,$03,$0f,$04,$10,$02,$0f,$07,$0f
db $08,$10,$02,$0a,$0b,$0f,$0c,$10,$02,$05,$0f,$0f,$10,$10,$00,$00
db $03,$03,$0c,$04,$0d,$00,$03,$07,$0c,$08,$0d,$01,$03,$0b,$0c,$0c
db $0d,$03,$03,$10,$0b,$11,$0c,$02,$03,$0e,$0d,$0f,$0e,$01,$03,$10
db $0d,$11,$0e,$03,$03,$03,$0f,$04,$10,$02,$03,$07,$0f,$08,$10,$03
db $03,$0b,$0f,$0c,$10,$02,$03,$0f,$0f,$10,$10,$01,$00
ATTR_BLK 10
ATTR_BLK_DATA %010, 0,0,0, 03,12, 04,13
ATTR_BLK_DATA %010, 1,1,0, 07,12, 08,13
ATTR_BLK_DATA %010, 3,3,0, 11,12, 12,13
ATTR_BLK_DATA %010, 2,2,0, 16,11, 17,12
ATTR_BLK_DATA %010, 1,1,0, 14,13, 15,14
ATTR_BLK_DATA %010, 3,3,0, 16,13, 17,14
ATTR_BLK_DATA %010, 2,2,0, 03,15, 04,16
ATTR_BLK_DATA %010, 3,3,0, 07,15, 08,16
ATTR_BLK_DATA %010, 2,2,0, 11,15, 12,16
ATTR_BLK_DATA %010, 1,1,0, 15,15, 16,16
ds 2
db $03,$03,$0c,$04,$0d,$00
db $03,$07,$0c,$08,$0d,$01
db $03,$0b,$0c,$0c,$0d,$03
db $03,$10,$0b,$11,$0c,$02
db $03,$0e,$0d,$0f,$0e,$01
db $03,$10,$0d,$11,$0e,$03
db $03,$03,$0f,$04,$10,$02
db $03,$07,$0f,$08,$10,$03
db $03,$0b,$0f,$0c,$10,$02
db $03,$0f,$0f,$10,$10,$01
db $00
BlkPacket_GameFreakIntro: ; 723dd (1c:63dd)
db $22,$03,$07,$05,$05,$0b,$07,$0d,$02,$0a,$08,$0b,$09,$0d,$03,$0f
db $0c,$0b,$0e,$0d,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $03,$00,$00,$13,$0a,$00,$03,$00,$0b,$04,$0d,$00,$03,$05,$0b,$07
db $0d,$01,$03,$08,$0b,$13,$0d,$00,$03,$00,$0e,$13,$11,$00,$03,$08
db $0b,$09,$0d,$02,$03,$0c,$0b,$0e,$0d,$03,$00
ATTR_BLK 3
ATTR_BLK_DATA %111, 1,1,0, 05,11, 07,13
ATTR_BLK_DATA %010, 2,2,0, 08,11, 09,13
ATTR_BLK_DATA %011, 3,3,0, 12,11, 14,13
ds 12
PalPacket_Empty: ; 72428 (1c:6428)
db $51,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $03,$00,$00,$13,$0a,$00
db $03,$00,$0b,$04,$0d,$00
db $03,$05,$0b,$07,$0d,$01
db $03,$08,$0b,$13,$0d,$00
db $03,$00,$0e,$13,$11,$00
db $03,$08,$0b,$09,$0d,$02
db $03,$0c,$0b,$0e,$0d,$03
db $00
PalPacket_PartyMenu: ; 72438 (1c:6438)
db $51,PAL_MEWMON,$00,PAL_GREENBAR,$00,PAL_YELLOWBAR,$00,PAL_REDBAR,$00,$00,$00,$00,$00,$00,$00,$00
PalPacket_Black: ; 72448 (1c:6448)
db $51,PAL_BLACK,$00,PAL_BLACK,$00,PAL_BLACK,$00,PAL_BLACK,$00,$00,$00,$00,$00,$00,$00,$00
PalPacket_Empty: PAL_SET 0, 0, 0, 0
PalPacket_PartyMenu: PAL_SET PAL_MEWMON, PAL_GREENBAR, PAL_YELLOWBAR, PAL_REDBAR
PalPacket_Black: PAL_SET PAL_BLACK, PAL_BLACK, PAL_BLACK, PAL_BLACK
PalPacket_TownMap: PAL_SET PAL_TOWNMAP, 0, 0, 0
PalPacket_Pokedex: PAL_SET PAL_BROWNMON, 0, 0, 0
PalPacket_Slots: PAL_SET PAL_SLOTS1, PAL_SLOTS2, PAL_SLOTS3, PAL_SLOTS4
PalPacket_Titlescreen: PAL_SET PAL_LOGO2, PAL_LOGO1, PAL_MEWMON, PAL_PURPLEMON
PalPacket_TrainerCard: PAL_SET PAL_MEWMON, PAL_BADGE, PAL_REDMON, PAL_YELLOWMON
PalPacket_Generic: PAL_SET PAL_MEWMON, 0, 0, 0
PalPacket_NidorinoIntro: PAL_SET PAL_PURPLEMON, PAL_BLACK, 0, 0
PalPacket_GameFreakIntro: PAL_SET PAL_GAMEFREAK, PAL_REDMON, PAL_VIRIDIAN, PAL_BLUEMON
PalPacket_TownMap: ; 72458 (1c:6458)
db $51,PAL_TOWNMAP,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PalTrnPacket: PAL_TRN
MltReq1Packet: MLT_REQ 1
MltReq2Packet: MLT_REQ 2
ChrTrnPacket: CHR_TRN 0, 0
PctTrnPacket: PCT_TRN
PalPacket_Pokedex: ; 72468 (1c:6468)
db $51,PAL_BROWNMON,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
MaskEnFreezePacket: MASK_EN 1
MaskEnCancelPacket: MASK_EN 0
PalPacket_Slots: ; 72478 (1c:6478)
db $51,PAL_SLOTS1,$00,PAL_SLOTS2,$00,PAL_SLOTS3,$00,PAL_SLOTS4,$00,$00,$00,$00,$00,$00,$00,$00
PalPacket_Titlescreen: ; 72488 (1c:6488)
db $51,PAL_LOGO2,$00,PAL_LOGO1,$00,PAL_MEWMON,$00,PAL_PURPLEMON,$00,$00,$00,$00,$00,$00,$00,$00
; These are DATA_SND packets containing SNES code.
; This set of packets is found in several Japanese SGB-compatible titles.
; It appears to be part of NCL's SGB devkit.
PalPacket_TrainerCard: ; 72498 (1c:6498)
db $51,PAL_MEWMON,$00,PAL_BADGE,$00,PAL_REDMON,$00,PAL_YELLOWMON,$00,$00,$00,$00,$00,$00,$00,$00
DataSnd_72548: DATA_SND $85d, $0, 11
db $8C ; cpx #$8c (2)
db $D0, $F4 ; bne -$0c
db $60 ; rts
ds 7
PalPacket_Generic: ; 724a8 (1c:64a8)
db $51,PAL_MEWMON,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DataSnd_72558: DATA_SND $852, $0, 11
db $A9, $E7 ; lda #$e7
db $9F, $01, $C0, $7E ; sta $7ec001, x
db $E8 ; inx
db $E8 ; inx
db $E8 ; inx
db $E8 ; inx
db $E0 ; cpx #$8c (1)
PalPacket_NidorinoIntro: ; 724b8 (1c:64b8)
db $51,PAL_PURPLEMON,$00,PAL_BLACK,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DataSnd_72568: DATA_SND $847, $0, 11
db $C4 ; cmp #$c4 (2)
db $D0, $16 ; bne +$16
db $A5 ; lda dp
db $CB ; wai
db $C9, $05 ; cmp #$05
db $D0, $10 ; bne +$10
db $A2, $28 ; ldx #$28
PalPacket_GameFreakIntro: ; 724c8 (1c:64c8)
db $51,PAL_GAMEFREAK,$00,PAL_REDMON,$00,PAL_VIRIDIAN,$00,PAL_BLUEMON,$00,$00,$00,$00,$00,$00,$00,$00
DataSnd_72578: DATA_SND $83c, $0, 11
db $F0, $12 ; beq +$12
db $A5 ; lda dp
db $C9, $C9 ; cmp #$c9
db $C8 ; iny
db $D0, $1C ; bne +$1c
db $A5 ; lda dp
db $CA ; dex
db $C9 ; cmp #$c4 (1)
PalPacket_724d8: ; 724d8 (1c:64d8)
db $59,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DataSnd_72588: DATA_SND $831, $0, 11
dbw $0C, $CAA5 ; tsb $caa5
db $C9, $7E ; cmp #$7e
db $D0, $06 ; bne +$06
db $A5 ; lda dp
db $CB ; wai
db $C9, $7E ; cmp #$7e
PalPacket_724e8: ; 724e8 (1c:64e8)
db $89,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DataSnd_72598: DATA_SND $826, $0, 11
db $39 ; bne +$39 (2)
dbw $CD, $C48 ; cmp $c48
db $D0, $34 ; bne +$34
db $A5 ; lda dp
db $C9, $C9 ; cmp #$c9
db $80, $D0 ; bra -$30
PalPacket_724f8: ; 724f8 (1c:64f8)
db $89,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DataSnd_725a8: DATA_SND $81b, $0, 11
db $EA ; nop
db $EA ; nop
db $EA ; nop
db $EA ; nop
db $EA ; nop
; $820:
db $A9,$01 ; lda #01
dbw $CD,$C4F ; cmp $c4f
db $D0 ; bne +$39 (1)
PalPacket_72508: ; 72508 (1c:6508)
db $99,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PalPacket_72518: ; 72518 (1c:6518)
db $A1,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PalPacket_72528: ; 72528 (1c:6528)
db $B9,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PalPacket_72538: ; 72538 (1c:6538)
db $B9,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
PalPacket_72548: ; 72548 (1c:6548)
db $79,$5D,$08,$00,$0B,$8C,$D0,$F4,$60,$00,$00,$00,$00,$00,$00,$00
PalPacket_72558: ; 72558 (1c:6558)
db $79,$52,$08,$00,$0B,$A9,$E7,$9F,$01,$C0,$7E,$E8,$E8,$E8,$E8,$E0
PalPacket_72568: ; 72568 (1c:6568)
db $79,$47,$08,$00,$0B,$C4,$D0,$16,$A5,$CB,$C9,$05,$D0,$10,$A2,$28
PalPacket_72578: ; 72578 (1c:6578)
db $79,$3C,$08,$00,$0B,$F0,$12,$A5,$C9,$C9,$C8,$D0,$1C,$A5,$CA,$C9
PalPacket_72588: ; 72588 (1c:6588)
db $79,$31,$08,$00,$0B,$0C,$A5,$CA,$C9,$7E,$D0,$06,$A5,$CB,$C9,$7E
PalPacket_72598: ; 72598 (1c:6598)
db $79,$26,$08,$00,$0B,$39,$CD,$48,$0C,$D0,$34,$A5,$C9,$C9,$80,$D0
PalPacket_725a8: ; 725a8 (1c:65a8)
db $79,$1B,$08,$00,$0B,$EA,$EA,$EA,$EA,$EA,$A9,$01,$CD,$4F,$0C,$D0
PalPacket_725b8: ; 725b8 (1c:65b8)
db $79,$10,$08,$00,$0B,$4C,$20,$08,$EA,$EA,$EA,$EA,$EA,$60,$EA,$EA
DataSnd_725b8: DATA_SND $810, $0, 11
dbw $4C, $820 ; jmp $820
db $EA ; nop
db $EA ; nop
db $EA ; nop
db $EA ; nop
db $EA ; nop
db $60 ; rts
db $EA ; nop
db $EA ; nop

51
engine/joypad.asm Normal file
View file

@ -0,0 +1,51 @@
_Joypad::
ld a, [hJoyInput]
cp A_BUTTON + B_BUTTON + SELECT + START ; soft reset
jp z, TrySoftReset
ld b, a
ld a, [hJoyHeldLast]
ld e, a
xor b
ld d, a
and e
ld [hJoyReleased], a
ld a, d
and b
ld [hJoyPressed], a
ld a, b
ld [hJoyHeldLast], a
ld a, [wd730]
bit 5, a
jr nz, DiscardButtonPresses
ld a, [hJoyHeldLast]
ld [hJoyHeld], a
ld a, [wJoyIgnore]
and a
ret z
cpl
ld b, a
ld a, [hJoyHeld]
and b
ld [hJoyHeld], a
ld a, [hJoyPressed]
and b
ld [hJoyPressed], a
ret
DiscardButtonPresses:
xor a
ld [hJoyHeld], a
ld [hJoyPressed], a
ld [hJoyReleased], a
ret
TrySoftReset:
call DelayFrame
; reset joypad (to make sure the
; player is really trying to reset)
ld a, $30
ld [rJOYP], a
ld hl, hSoftReset
dec [hl]
jp z, SoftReset
jp Joypad

View file

@ -396,21 +396,21 @@ LoadSGBBorderAndPalettes: ; 7202b (1c:602b)
ei
ld a, $1
ld [wcf2d], a
ld de, PalPacket_72508
ld de, ChrTrnPacket
ld hl, SGBBorderGraphics
call Func_7210b
xor a
ld [wcf2d], a
ld de, PalPacket_72518
ld de, PctTrnPacket
ld hl, BorderPalettes
call Func_7210b
xor a
ld [wcf2d], a
ld de, PalPacket_724d8
ld de, PalTrnPacket
ld hl, SuperPalettes
call Func_7210b
call ClearVram
ld hl, PalPacket_72538
ld hl, MaskEnCancelPacket
jp SendSGBPacket
Func_72075: ; 72075 (1c:6075)
@ -431,18 +431,18 @@ Func_72075: ; 72075 (1c:6075)
ret
PointerTable_72089: ; 72089 (1c:6089)
dw PalPacket_72528
dw PalPacket_72548
dw PalPacket_72558
dw PalPacket_72568
dw PalPacket_72578
dw PalPacket_72588
dw PalPacket_72598
dw PalPacket_725a8
dw PalPacket_725b8
dw MaskEnFreezePacket
dw DataSnd_72548
dw DataSnd_72558
dw DataSnd_72568
dw DataSnd_72578
dw DataSnd_72588
dw DataSnd_72598
dw DataSnd_725a8
dw DataSnd_725b8
Func_7209b: ; 7209b (1c:609b)
ld hl, PalPacket_724f8
ld hl, MltReq2Packet
di
call SendSGBPacket
ld a, $1
@ -493,7 +493,7 @@ Func_7209b: ; 7209b (1c:609b)
ret
Func_72102: ; 72102 (1c:6102)
ld hl, PalPacket_724e8
ld hl, MltReq1Packet
call SendSGBPacket
jp Wait7000

5203
home.asm

File diff suppressed because it is too large Load diff

183
home/audio.asm Normal file
View 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
View 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
View 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

39
home/joypad.asm Normal file
View file

@ -0,0 +1,39 @@
ReadJoypad::
; Poll joypad input.
; Unlike the hardware register, button
; presses are indicated by a set bit.
ld a, 1 << 5 ; select direction keys
ld c, 0
ld [rJOYP], a
rept 6
ld a, [rJOYP]
endr
cpl
and %1111
swap a
ld b, a
ld a, 1 << 4 ; select button keys
ld [rJOYP], a
rept 10
ld a, [rJOYP]
endr
cpl
and %1111
or b
ld [hJoyInput], a
ld a, 1 << 4 + 1 << 5 ; deselect keys
ld [rJOYP], a
ret
Joypad::
; Update the joypad state variables:
; [hJoyReleased] keys released since last time
; [hJoyPressed] keys pressed since last time
; [hJoyHeld] currently pressed keys
homecall _Joypad
ret

2419
home/overworld.asm Normal file

File diff suppressed because it is too large Load diff

591
home/pic.asm Normal file
View 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
View 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

738
home/text.asm Normal file
View file

@ -0,0 +1,738 @@
TextBoxBorder::
; Draw a cxb text box at hl.
; top row
push hl
ld a, "┌"
ld [hli], a
inc a ; ─
call NPlaceChar
inc a ; ┐
ld [hl], a
pop hl
ld de, 20
add hl, de
; middle rows
.next
push hl
ld a, "│"
ld [hli],a
ld a, " "
call NPlaceChar
ld [hl], "│"
pop hl
ld de, 20
add hl, de
dec b
jr nz, .next
; bottom row
ld a, "└"
ld [hli], a
ld a, "─"
call NPlaceChar
ld [hl], "┘"
ret
NPlaceChar::
; Place char a c times.
ld d, c
.loop
ld [hli], a
dec d
jr nz, .loop
ret
PlaceString:: ; 1955 (0:1955)
push hl
PlaceNextChar:: ; 1956 (0:1956)
ld a,[de]
cp "@"
jr nz,.PlaceText
ld b,h
ld c,l
pop hl
ret
.PlaceText
cp $4E
jr nz,.next
ld bc,$0028
ld a,[$FFF6]
bit 2,a
jr z,.next2
ld bc,$14
.next2
pop hl
add hl,bc
push hl
jp Next19E8
.next
cp $4F
jr nz,.next3
pop hl
FuncCoord 1, 16
ld hl,Coord
push hl
jp Next19E8
.next3 ; Check against a dictionary
and a
jp z,Char00
cp $4C
jp z,Char4C
cp $4B
jp z,Char4B
cp $51
jp z,Char51
cp $49
jp z,Char49
cp $52
jp z,Char52
cp $53
jp z,Char53
cp $54
jp z,Char54
cp $5B
jp z,Char5B
cp $5E
jp z,Char5E
cp $5C
jp z,Char5C
cp $5D
jp z,Char5D
cp $55
jp z,Char55
cp $56
jp z,Char56
cp $57
jp z,Char57
cp $58
jp z,Char58
cp $4A
jp z,Char4A
cp $5F
jp z,Char5F
cp $59
jp z,Char59
cp $5A
jp z,Char5A
ld [hli],a
call PrintLetterDelay
Next19E8:: ; 19e8 (0:19e8)
inc de
jp PlaceNextChar
Char00:: ; 19ec (0:19ec)
ld b,h
ld c,l
pop hl
ld de,Char00Text
dec de
ret
Char00Text:: ; 0x19f4 “%d ERROR.”
TX_FAR _Char00Text
db "@"
Char52:: ; 0x19f9 players name
push de
ld de,W_PLAYERNAME
jr FinishDTE
Char53:: ; 19ff (0:19ff) ; rivals name
push de
ld de,W_RIVALNAME
jr FinishDTE
Char5D:: ; 1a05 (0:1a05) ; TRAINER
push de
ld de,Char5DText
jr FinishDTE
Char5C:: ; 1a0b (0:1a0b) ; TM
push de
ld de,Char5CText
jr FinishDTE
Char5B:: ; 1a11 (0:1a11) ; PC
push de
ld de,Char5BText
jr FinishDTE
Char5E:: ; 1a17 (0:1a17) ; ROCKET
push de
ld de,Char5EText
jr FinishDTE
Char54:: ; 1a1d (0:1a1d) ; POKé
push de
ld de,Char54Text
jr FinishDTE
Char56:: ; 1a23 (0:1a23) ; ……
push de
ld de,Char56Text
jr FinishDTE
Char4A:: ; 1a29 (0:1a29) ; PKMN
push de
ld de,Char4AText
jr FinishDTE
Char59:: ; 1a2f (0:1a2f)
; depending on whose turn it is, print
; enemy active monsters name, prefixed with “Enemy ”
; or
; player active monsters name
; (like Char5A but flipped)
ld a,[H_WHOSETURN]
xor 1
jr MonsterNameCharsCommon
Char5A:: ; 1a35 (0:1a35)
; depending on whose turn it is, print
; player active monsters name
; or
; enemy active monsters name, prefixed with “Enemy ”
ld a,[H_WHOSETURN]
MonsterNameCharsCommon:: ; 1a37 (0:1a37)
push de
and a
jr nz,.Enemy
ld de,W_PLAYERMONNAME ; player active monster name
jr FinishDTE
.Enemy ; 1A40
; print “Enemy ”
ld de,Char5AText
call PlaceString
ld h,b
ld l,c
ld de,W_ENEMYMONNAME ; enemy active monster name
FinishDTE:: ; 1a4b (0:1a4b)
call PlaceString
ld h,b
ld l,c
pop de
inc de
jp PlaceNextChar
Char5CText:: ; 1a55 (0:1a55)
db "TM@"
Char5DText:: ; 1a58 (0:1a58)
db "TRAINER@"
Char5BText:: ; 1a60 (0:1a60)
db "PC@"
Char5EText:: ; 1a63 (0:1a63)
db "ROCKET@"
Char54Text:: ; 1a6a (0:1a6a)
db "POKé@"
Char56Text:: ; 1a6f (0:1a6f)
db "……@"
Char5AText:: ; 1a72 (0:1a72)
db "Enemy @"
Char4AText:: ; 1a79 (0:1a79)
db $E1,$E2,"@" ; PKMN
Char55:: ; 1a7c (0:1a7c)
push de
ld b,h
ld c,l
ld hl,Char55Text
call TextCommandProcessor
ld h,b
ld l,c
pop de
inc de
jp PlaceNextChar
Char55Text:: ; 1a8c (0:1a8c)
; equivalent to Char4B
TX_FAR _Char55Text
db "@"
Char5F:: ; 1a91 (0:1a91)
; ends a Pokédex entry
ld [hl],"."
pop hl
ret
Char58:: ; 1a95 (0:1a95)
ld a,[W_ISLINKBATTLE]
cp 4
jp z,Next1AA2
ld a,$EE
FuncCoord 18, 16
ld [Coord],a
Next1AA2:: ; 1aa2 (0:1aa2)
call ProtectedDelay3
call ManualTextScroll
ld a,$7F
FuncCoord 18, 16
ld [Coord],a
Char57:: ; 1aad (0:1aad)
pop hl
ld de,Char58Text
dec de
ret
Char58Text:: ; 1ab3 (0:1ab3)
db "@"
Char51:: ; 1ab4 (0:1ab4)
push de
ld a,$EE
FuncCoord 18, 16
ld [Coord],a
call ProtectedDelay3
call ManualTextScroll
FuncCoord 1, 13
ld hl,Coord
ld bc,$0412
call ClearScreenArea
ld c,$14
call DelayFrames
pop de
FuncCoord 1, 14
ld hl,Coord
jp Next19E8
Char49:: ; 1ad5 (0:1ad5)
push de
ld a,$EE
FuncCoord 18, 16
ld [Coord],a
call ProtectedDelay3
call ManualTextScroll
FuncCoord 1, 10
ld hl,Coord
ld bc,$0712
call ClearScreenArea
ld c,$14
call DelayFrames
pop de
pop hl
FuncCoord 1, 11
ld hl,Coord
push hl
jp Next19E8
Char4B:: ; 1af8 (0:1af8)
ld a,$EE
FuncCoord 18, 16
ld [Coord],a
call ProtectedDelay3
push de
call ManualTextScroll
pop de
ld a,$7F
FuncCoord 18, 16
ld [Coord],a
;fall through
Char4C:: ; 1b0a (0:1b0a)
push de
call Next1B18
call Next1B18
FuncCoord 1, 16
ld hl,Coord
pop de
jp Next19E8
Next1B18:: ; 1b18 (0:1b18)
FuncCoord 0, 14
ld hl,Coord
FuncCoord 0, 13
ld de,Coord
ld b,$3C
.next
ld a,[hli]
ld [de],a
inc de
dec b
jr nz,.next
FuncCoord 1, 16
ld hl,Coord
ld a,$7F
ld b,$12
.next2
ld [hli],a
dec b
jr nz,.next2
; wait five frames
ld b,5
.WaitFrame
call DelayFrame
dec b
jr nz,.WaitFrame
ret
ProtectedDelay3:: ; 1b3a (0:1b3a)
push bc
call Delay3
pop bc
ret
TextCommandProcessor:: ; 1b40 (0:1b40)
ld a,[wd358]
push af
set 1,a
ld e,a
ld a,[$fff4]
xor e
ld [wd358],a
ld a,c
ld [wcc3a],a
ld a,b
ld [wcc3b],a
NextTextCommand:: ; 1b55 (0:1b55)
ld a,[hli]
cp a, "@" ; terminator
jr nz,.doTextCommand
pop af
ld [wd358],a
ret
.doTextCommand
push hl
cp a,$17
jp z,TextCommand17
cp a,$0e
jp nc,TextCommand0B ; if a != 0x17 and a >= 0xE, go to command 0xB
; if a < 0xE, use a jump table
ld hl,TextCommandJumpTable
push bc
add a
ld b,$00
ld c,a
add hl,bc
pop bc
ld a,[hli]
ld h,[hl]
ld l,a
jp [hl]
; draw box
; 04AAAABBCC
; AAAA = address of upper left corner
; BB = height
; CC = width
TextCommand04:: ; 1b78 (0:1b78)
pop hl
ld a,[hli]
ld e,a
ld a,[hli]
ld d,a
ld a,[hli]
ld b,a
ld a,[hli]
ld c,a
push hl
ld h,d
ld l,e
call TextBoxBorder
pop hl
jr NextTextCommand
; place string inline
; 00{string}
TextCommand00:: ; 1b8a (0:1b8a)
pop hl
ld d,h
ld e,l
ld h,b
ld l,c
call PlaceString
ld h,d
ld l,e
inc hl
jr NextTextCommand
; place string from RAM
; 01AAAA
; AAAA = address of string
TextCommand01:: ; 1b97 (0:1b97)
pop hl
ld a,[hli]
ld e,a
ld a,[hli]
ld d,a
push hl
ld h,b
ld l,c
call PlaceString
pop hl
jr NextTextCommand
; print BCD number
; 02AAAABB
; AAAA = address of BCD number
; BB
; bits 0-4 = length in bytes
; bits 5-7 = unknown flags
TextCommand02:: ; 1ba5 (0:1ba5)
pop hl
ld a,[hli]
ld e,a
ld a,[hli]
ld d,a
ld a,[hli]
push hl
ld h,b
ld l,c
ld c,a
call PrintBCDNumber
ld b,h
ld c,l
pop hl
jr NextTextCommand
; repoint destination address
; 03AAAA
; AAAA = new destination address
TextCommand03:: ; 1bb7 (0:1bb7)
pop hl
ld a,[hli]
ld [wcc3a],a
ld c,a
ld a,[hli]
ld [wcc3b],a
ld b,a
jp NextTextCommand
; repoint destination to second line of dialogue text box
; 05
; (no arguments)
TextCommand05:: ; 1bc5 (0:1bc5)
pop hl
FuncCoord 1, 16
ld bc,Coord ; address of second line of dialogue text box
jp NextTextCommand
; blink arrow and wait for A or B to be pressed
; 06
; (no arguments)
TextCommand06:: ; 1bcc (0:1bcc)
ld a,[W_ISLINKBATTLE]
cp a,$04
jp z,TextCommand0D
ld a,$ee ; down arrow
FuncCoord 18, 16
ld [Coord],a ; place down arrow in lower right corner of dialogue text box
push bc
call ManualTextScroll ; blink arrow and wait for A or B to be pressed
pop bc
ld a," "
FuncCoord 18, 16
ld [Coord],a ; overwrite down arrow with blank space
pop hl
jp NextTextCommand
; scroll text up one line
; 07
; (no arguments)
TextCommand07:: ; 1be7 (0:1be7)
ld a," "
FuncCoord 18, 16
ld [Coord],a ; place blank space in lower right corner of dialogue text box
call Next1B18 ; scroll up text
call Next1B18
pop hl
FuncCoord 1, 16
ld bc,Coord ; address of second line of dialogue text box
jp NextTextCommand
; execute asm inline
; 08{code}
TextCommand08:: ; 1bf9 (0:1bf9)
pop hl
ld de,NextTextCommand
push de ; return address
jp [hl]
; print decimal number (converted from binary number)
; 09AAAABB
; AAAA = address of number
; BB
; bits 0-3 = how many digits to display
; bits 4-7 = how long the number is in bytes
TextCommand09:: ; 1bff (0:1bff)
pop hl
ld a,[hli]
ld e,a
ld a,[hli]
ld d,a
ld a,[hli]
push hl
ld h,b
ld l,c
ld b,a
and a,$0f
ld c,a
ld a,b
and a,$f0
swap a
set 6,a
ld b,a
call PrintNumber
ld b,h
ld c,l
pop hl
jp NextTextCommand
; wait half a second if the user doesn't hold A or B
; 0A
; (no arguments)
TextCommand0A:: ; 1c1d (0:1c1d)
push bc
call Joypad
ld a,[hJoyHeld]
and a,%00000011 ; A and B buttons
jr nz,.skipDelay
ld c,30
call DelayFrames
.skipDelay
pop bc
pop hl
jp NextTextCommand
; plays sounds
; this actually handles various command ID's, not just 0B
; (no arguments)
TextCommand0B:: ; 1c31 (0:1c31)
pop hl
push bc
dec hl
ld a,[hli]
ld b,a ; b = command number that got us here
push hl
ld hl,TextCommandSounds
.loop
ld a,[hli]
cp b
jr z,.matchFound
inc hl
jr .loop
.matchFound
cp a,$14
jr z,.pokemonCry
cp a,$15
jr z,.pokemonCry
cp a,$16
jr z,.pokemonCry
ld a,[hl]
call PlaySound
call WaitForSoundToFinish
pop hl
pop bc
jp NextTextCommand
.pokemonCry
push de
ld a,[hl]
call PlayCry
pop de
pop hl
pop bc
jp NextTextCommand
; format: text command ID, sound ID or cry ID
TextCommandSounds:: ; 1c64 (0:1c64)
db $0B,(SFX_02_3a - SFX_Headers_02) / 3
db $12,(SFX_02_46 - SFX_Headers_02) / 3
db $0E,(SFX_02_41 - SFX_Headers_02) / 3
db $0F,(SFX_02_3a - SFX_Headers_02) / 3
db $10,(SFX_02_3b - SFX_Headers_02) / 3
db $11,(SFX_02_42 - SFX_Headers_02) / 3
db $13,(SFX_02_44 - SFX_Headers_02) / 3
db $14,NIDORINA ; used in OakSpeech
db $15,PIDGEOT ; used in SaffronCityText12
db $16,DEWGONG ; unused?
; draw ellipses
; 0CAA
; AA = number of ellipses to draw
TextCommand0C:: ; 1c78 (0:1c78)
pop hl
ld a,[hli]
ld d,a
push hl
ld h,b
ld l,c
.loop
ld a,$75 ; ellipsis
ld [hli],a
push de
call Joypad
pop de
ld a,[hJoyHeld] ; joypad state
and a,%00000011 ; is A or B button pressed?
jr nz,.skipDelay ; if so, skip the delay
ld c,10
call DelayFrames
.skipDelay
dec d
jr nz,.loop
ld b,h
ld c,l
pop hl
jp NextTextCommand
; wait for A or B to be pressed
; 0D
; (no arguments)
TextCommand0D:: ; 1c9a (0:1c9a)
push bc
call ManualTextScroll ; wait for A or B to be pressed
pop bc
pop hl
jp NextTextCommand
; process text commands in another ROM bank
; 17AAAABB
; AAAA = address of text commands
; BB = bank
TextCommand17:: ; 1ca3 (0:1ca3)
pop hl
ld a,[H_LOADEDROMBANK]
push af
ld a,[hli]
ld e,a
ld a,[hli]
ld d,a
ld a,[hli]
ld [H_LOADEDROMBANK],a
ld [$2000],a
push hl
ld l,e
ld h,d
call TextCommandProcessor
pop hl
pop af
ld [H_LOADEDROMBANK],a
ld [$2000],a
jp NextTextCommand
TextCommandJumpTable:: ; 1cc1 (0:1cc1)
dw TextCommand00
dw TextCommand01
dw TextCommand02
dw TextCommand03
dw TextCommand04
dw TextCommand05
dw TextCommand06
dw TextCommand07
dw TextCommand08
dw TextCommand09
dw TextCommand0A
dw TextCommand0B
dw TextCommand0C
dw TextCommand0D

105
home/vblank.asm Normal file
View 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
View 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"

106
main.asm
View file

@ -1,5 +1,16 @@
INCLUDE "constants.asm"
NPC_SPRITES_1 EQU $4
NPC_SPRITES_2 EQU $5
GFX EQU $4
PICS_1 EQU $9
PICS_2 EQU $A
PICS_3 EQU $B
PICS_4 EQU $C
PICS_5 EQU $D
INCLUDE "home.asm"
@ -1940,57 +1951,7 @@ Func_7c18: ; 7c18 (1:7c18)
SECTION "bank3",ROMX,BANK[$3]
_Joypad::
ld a, [hJoyInput]
cp A_BUTTON + B_BUTTON + SELECT + START ; soft reset
jp z, TrySoftReset
ld b, a
ld a, [hJoyHeldLast]
ld e, a
xor b
ld d, a
and e
ld [hJoyReleased], a
ld a, d
and b
ld [hJoyPressed], a
ld a, b
ld [hJoyHeldLast], a
ld a, [wd730]
bit 5, a
jr nz, DiscardButtonPresses
ld a, [hJoyHeldLast]
ld [hJoyHeld], a
ld a, [wJoyIgnore]
and a
ret z
cpl
ld b, a
ld a, [hJoyHeld]
and b
ld [hJoyHeld], a
ld a, [hJoyPressed]
and b
ld [hJoyPressed], a
ret
DiscardButtonPresses:
xor a
ld [hJoyHeld], a
ld [hJoyPressed], a
ld [hJoyReleased], a
ret
TrySoftReset:
call DelayFrame
; reset joypad (to make sure the
; player is really trying to reset)
ld a, $30
ld [rJOYP], a
ld hl, hSoftReset
dec [hl]
jp z, SoftReset
jp Joypad
INCLUDE "engine/joypad.asm"
INCLUDE "data/map_songs.asm"
@ -4657,7 +4618,7 @@ INCLUDE "engine/hp_bar.asm"
INCLUDE "engine/hidden_object_functions3.asm"
SECTION "bank4",ROMX,BANK[$4]
SECTION "NPC Sprites 1", ROMX, BANK[NPC_SPRITES_1]
OakAideSprite: INCBIN "gfx/sprites/oak_aide.2bpp"
RockerSprite: INCBIN "gfx/sprites/rocker.2bpp"
@ -4687,6 +4648,9 @@ SnorlaxSprite: INCBIN "gfx/sprites/snorlax.2bpp"
OldAmberSprite: INCBIN "gfx/sprites/old_amber.2bpp"
LyingOldManSprite: INCBIN "gfx/sprites/lying_old_man.2bpp"
SECTION "Graphics", ROMX, BANK[GFX]
PokemonLogoGraphics: INCBIN "gfx/pokemon_logo.2bpp"
FontGraphics: INCBIN "gfx/font.1bpp"
ABTiles: INCBIN "gfx/AB.2bpp"
@ -4701,6 +4665,9 @@ PokedexTileGraphics: INCBIN "gfx/pokedex.2bpp"
WorldMapTileGraphics: INCBIN "gfx/town_map.2bpp"
PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp"
SECTION "Battle (bank 4)", ROMX, BANK[$4]
INCLUDE "engine/battle/4.asm"
INCLUDE "engine/menu/status_screen.asm"
INCLUDE "engine/menu/party_menu.asm"
@ -4710,17 +4677,13 @@ ShrinkPic1:: INCBIN "pic/trainer/shrink1.pic"
ShrinkPic2:: INCBIN "pic/trainer/shrink2.pic"
INCLUDE "engine/turn_sprite.asm"
INCLUDE "engine/menu/start_sub_menus.asm"
INCLUDE "engine/items/tms.asm"
INCLUDE "engine/battle/4_2.asm"
INCLUDE "engine/random.asm"
SECTION "bank5",ROMX,BANK[$5]
SECTION "NPC Sprites 2", ROMX, BANK[NPC_SPRITES_2]
RedCyclingSprite: INCBIN "gfx/sprites/cycling.2bpp"
RedSprite: INCBIN "gfx/sprites/red.2bpp"
@ -4763,15 +4726,14 @@ BrunoSprite: INCBIN "gfx/sprites/bruno.2bpp"
LoreleiSprite: INCBIN "gfx/sprites/lorelei.2bpp"
SeelSprite: INCBIN "gfx/sprites/seel.2bpp"
INCLUDE "engine/load_pokedex_tiles.asm"
SECTION "Battle (bank 5)", ROMX, BANK[$5]
INCLUDE "engine/load_pokedex_tiles.asm"
INCLUDE "engine/overworld/map_sprites.asm"
INCLUDE "engine/overworld/emotion_bubbles.asm"
INCLUDE "engine/evolve_trade.asm"
INCLUDE "engine/battle/5.asm"
INCLUDE "engine/menu/pc.asm"
@ -5031,7 +4993,7 @@ INCLUDE "engine/menu/oaks_pc.asm"
INCLUDE "engine/hidden_object_functions7.asm"
SECTION "bank9",ROMX,BANK[$9]
SECTION "Pics 1", ROMX, BANK[PICS_1]
RhydonPicFront:: INCBIN "pic/bmon/rhydon.pic"
RhydonPicBack:: INCBIN "pic/monback/rhydonb.pic"
@ -5092,10 +5054,12 @@ PinsirPicBack:: INCBIN "pic/monback/pinsirb.pic"
TangelaPicFront:: INCBIN "pic/bmon/tangela.pic"
TangelaPicBack:: INCBIN "pic/monback/tangelab.pic"
SECTION "Battle (bank 9)", ROMX, BANK[$9]
INCLUDE "engine/battle/9.asm"
SECTION "bankA",ROMX,BANK[$A]
SECTION "Pics 2", ROMX, BANK[PICS_2]
GrowlithePicFront:: INCBIN "pic/bmon/growlithe.pic"
GrowlithePicBack:: INCBIN "pic/monback/growlitheb.pic"
@ -5162,10 +5126,12 @@ JynxPicBack:: INCBIN "pic/monback/jynxb.pic"
MoltresPicFront:: INCBIN "pic/bmon/moltres.pic"
MoltresPicBack:: INCBIN "pic/monback/moltresb.pic"
SECTION "Battle (bank A)", ROMX, BANK[$A]
INCLUDE "engine/battle/a.asm"
SECTION "bankB",ROMX,BANK[$B]
SECTION "Pics 3", ROMX, BANK[PICS_3]
ArticunoPicFront:: INCBIN "pic/bmon/articuno.pic"
ArticunoPicBack:: INCBIN "pic/monback/articunob.pic"
@ -5238,6 +5204,9 @@ BeedrillPicBack:: INCBIN "pic/monback/beedrillb.pic"
FossilKabutopsPic:: INCBIN "pic/bmon/fossilkabutops.pic"
SECTION "Battle (bank B)", ROMX, BANK[$B]
INCLUDE "engine/battle/b.asm"
TrainerInfoTextBoxTileGraphics: INCBIN "gfx/trainer_info.2bpp"
@ -5250,7 +5219,7 @@ INCLUDE "engine/battle/b_2.asm"
INCLUDE "engine/game_corner_slots2.asm"
SECTION "bankC",ROMX,BANK[$C]
SECTION "Pics 4", ROMX, BANK[PICS_4]
DodrioPicFront:: INCBIN "pic/bmon/dodrio.pic"
DodrioPicBack:: INCBIN "pic/monback/dodriob.pic"
@ -5314,10 +5283,12 @@ StarmiePicBack:: INCBIN "pic/monback/starmieb.pic"
RedPicBack:: INCBIN "pic/trainer/redb.pic"
OldManPic:: INCBIN "pic/trainer/oldman.pic"
SECTION "Battle (bank C)", ROMX, BANK[$C]
INCLUDE "engine/battle/c.asm"
SECTION "bankD",ROMX,BANK[$D]
SECTION "Pics 5", ROMX, BANK[PICS_5]
BulbasaurPicFront:: INCBIN "pic/bmon/bulbasaur.pic"
BulbasaurPicBack:: INCBIN "pic/monback/bulbasaurb.pic"
@ -5374,6 +5345,9 @@ WeepinbellPicBack:: INCBIN "pic/monback/weepinbellb.pic"
VictreebelPicFront:: INCBIN "pic/bmon/victreebel.pic"
VictreebelPicBack:: INCBIN "pic/monback/victreebelb.pic"
SECTION "Battle (bank D)", ROMX, BANK[$D]
INCLUDE "engine/titlescreen2.asm"
INCLUDE "engine/battle/d.asm"
INCLUDE "engine/slot_machine.asm"