diff options
-rw-r--r-- | home/cry.asm | 104 | ||||
-rw-r--r-- | home/map.asm | 416 | ||||
-rw-r--r-- | home/tileset.asm | 419 | ||||
-rw-r--r-- | shim.sym | 2 | ||||
-rw-r--r-- | wram.asm | 20 |
5 files changed, 541 insertions, 420 deletions
diff --git a/home/cry.asm b/home/cry.asm new file mode 100644 index 0000000..b018ac7 --- /dev/null +++ b/home/cry.asm @@ -0,0 +1,104 @@ +include "constants.asm" + +SECTION "Cry Home", ROM0 [$39b1] + +Function39b1:: + push af + ld a, $1 + ld [wc1b9], a + pop af + jr asm_39c3 + +PlayCry:: ; 00:39ba + push af + xor a + ld [wc1b9], a + ld [wc1ba], a + pop af +asm_39c3: ; 00:39c3 + push hl + push de + push bc + call GetCryIndex + ld e, c + ld d, b + call PlayCryHeader + call WaitSFX + pop bc + pop de + pop hl + ret + +LoadCryHeader:: + call GetCryIndex + ldh a, [hROMBank] + push af + ld a, BANK(CryHeaders) + call Bankswitch + ld hl, CryHeaders + add hl, bc + add hl, bc + add hl, bc + add hl, bc + add hl, bc + add hl, bc + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld a, [hli] + ld [wCryPitch], a + ld a, [hli] + ld [wCryPitch + 1], a + ld a, [hli] + ld [wCryLength], a + ld a, [hl] + ld [wCryLength + 1], a + pop af + call Bankswitch + ret + +GetCryIndex:: ; 00:3a02 + ld d, a + ld a, [wce37] + push af + ld a, d + ld [wce37], a + callba Function40b45 + ld a, [wce37] + dec a + ld c, a + ld b, $0 + pop af + ld [wce37], a + ret + +Function3a1f:: + ld a, $6e + ld [hli], a + ld c, $2 + ld a, [wcd9e] + cp $64 + jr c, asm_3a37 + dec hl + inc c + jr asm_3a37 + +Function3a2f:: + ld a, $6e + ld [hli], a + ld c, $3 + ld a, [wcd9e] +asm_3a37: ; 00:3a37 + ld [wce37], a + ld de, wce37 + ld b, $41 + jp PrintNumber + +Function3a42:: + ld hl, wce2e + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + ret diff --git a/home/map.asm b/home/map.asm index c07bc96..9078f64 100644 --- a/home/map.asm +++ b/home/map.asm @@ -1734,419 +1734,3 @@ Function2be5:: ; 00:2be5 .Return: ; 00:2c04 ret - -SECTION "LoadTilesetGFX", ROM0[$2D26] -LoadTilesetGFX:: ; 2d26 - call GetMapEnvironment - cp 1 ; TODO: constantify this - jr z, .exterior - cp 2 ; TODO: constantify this - jr z, .exterior - ld a, [wMapTileset] - cp $1B ; TODO: constantify this - jr z, .exterior - - ld a, [wTilesetTilesAddress] - ld e, a - ld a, [wTilesetTilesAddress + 1] - ld d, a - ld hl, vTileset - ld a, [wTilesetBank] - ld b, a - ld c, $60 - call Get2bpp - xor a - ldh [hTileAnimFrame], a - ret - -.exterior - ld de, CommonExteriorTiles ; TODO: maybe find a better name - ld hl, vTileset - lb bc, BANK(CommonExteriorTiles), $20 - call Get2bpp - - ld a, [wTilesetTilesAddress] - ld e, a - ld a, [wTilesetTilesAddress + 1] - ld d, a - ld hl, vExteriorTileset - ld a, [wTilesetBank] - ld b, a - ld c, $40 - call Get2bpp - xor a - ldh [hTileAnimFrame], a - ret - - -RefreshPlayerCoords:: ; 2d74 - ld a, [wXCoord] - add a, 4 - ld d, a - ld hl, wPlayerStandingMapX - sub [hl] - ld [hl], d - ld hl, wPlayerObjectXCoord - ld [hl], d - ld hl, wPlayerLastMapX - ld [hl], d - ld d, a - ld a, [wYCoord] - add a, 4 - ld e, a - ld hl, wPlayerStandingMapY - sub [hl] - ld [hl], e - ld hl, wPlayerObjectYCoord - ld [hl], e - ld hl, wPlayerLastMapY - ld [hl], e - ld e, a - - ld a, [wObjectFollow_Leader] - cp 1 - ret nz - ld a, [wObjectFollow_Follower] - and a - ret z - - ; This piece of code has been removed in pokegold (note that the conditions above were altered, as well) - call GetObjectStruct - ld hl, 16 ; TODO: constantify this - add hl, bc - ld a, [hl] - add a, d - ld [hl], a - ld [wMap1ObjectXCoord], a - ld hl, 18 ; TODO: constantify this - add hl, bc - ld a, [hl] - add a, d - ld [hl], a - ld hl, 17 ; TODO: constantify this - add hl, bc - ld a, [hl] - add a, e - ld [hl], a - ld [wMap1ObjectYCoord], a - ld hl, 19 - add hl, bc - ld a, [hl] - add a, e - ld [hl], a - ret - - -BufferScreen:: ; 2dcd - ld hl, wOverworldMapAnchor - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wScreenSave - ld c, 5 - ld b, 6 -.row - push bc - push hl -.col - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .col - pop hl - ld a, [wMapWidth] - add a, 6 - ld c, a - ld b, 0 - add hl, bc - pop bc - dec c - jr nz, .row - ret - -SaveScreen:: ; 2df1 - ld hl, wOverworldMapAnchor - ld a, [hli] - ld h, [hl] - ld l, a - ld de, wScreenSave - ld a, [wMapWidth] - add 6 - ldh [hMapObjectIndexBuffer], a - ld a, [wPlayerStepDirection] - and a - jr z, .down - cp UP - jr z, .up - cp LEFT - jr z, .left - cp RIGHT - jr z, .right - ret - -.up - ld de, wScreenSave + 6 - ldh a, [hMapObjectIndexBuffer] - ld c, a - ld b, 0 - add hl, bc - jr .vertical - -.down - ld de, wScreenSave -.vertical - ld b, 6 - ld c, 4 - jr .load_neighbor - -.left - ld de, wScreenSave + 1 - inc hl - jr .horizontal - -.right - ld de, wScreenSave -.horizontal - ld b, 5 - ld c, 5 - -.load_neighbor ; 2e35 -.row - push bc - push hl - push de -.col - ld a, [de] - inc de - ld [hli], a - dec b - jr nz, .col - pop de - ld a, e - add a, 6 - ld e, a - jr nc, .okay - inc d - -.okay - pop hl - ldh a, [hConnectionStripLength] - ld c, a - ld b, 0 - add hl, bc - pop bc - dec c - jr nz, .row - ret - - -RefreshTiles:: ; 2e52 - call .left_right - call .up_down - ld a, [wPlayerStandingMapX] - ld d, a - ld a, [wPlayerStandingMapY] - ld e, a - call GetCoordTile - ld [wPlayerStandingTile], a - ret - -.up_down ; 2e67 - ld a, [wPlayerStandingMapX] - ld d, a - ld a, [wPlayerStandingMapY] - ld e, a - push de - inc e - call GetCoordTile - ld [wTileDown], a - pop de - dec e - call GetCoordTile - ld [wTileUp], a - ret - -.left_right ; 2e80 - ld a, [wPlayerStandingMapX] - ld d, a - ld a, [wPlayerStandingMapY] - ld e, a - push de - dec d - call GetCoordTile - ld [wTileLeft], a - pop de - inc d - call GetCoordTile - ld [wTileRight], a - ret - - -GetFacingTileCoord:: ; 2e99 - ld a, [wPlayerWalking] ; TODO: wPlayerDirection in Crystal. Not here? - and %1100 - srl a - srl a - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld de, .directions - add hl, de - - ld d, [hl] - inc hl - ld e, [hl] - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - - ld a, [wPlayerStandingMapX] - add a, d - ld d, a - ld a, [wPlayerStandingMapY] - add a, e - ld e, a - ld a, [hl] - ret - -.directions - db 0, 1 - dw wTileDown - - db 0, -1 - dw wTileUp - - db -1, 0 - dw wTileLeft - - db 1, 0 - dw wTileRight - -GetCoordTile:: ; 2ece -; Get the collision byte for tile d, e - call GetBlockLocation - ld a, [hl] - and a - jr z, .nope - ld l, a - ld h, 0 - add hl, hl - add hl, hl - ld a, [wTilesetCollisionAddress] - ld c, a - ld a, [wTilesetCollisionAddress + 1] - ld b, a - add hl, bc - rr d - jr nc, .nocarry - inc hl - -.nocarry - rr e - jr nc, .nocarry2 - inc hl - inc hl - -.nocarry2 - ld a, [wTilesetBank] - call GetFarByte - ret - -.nope - ld a, -1 - ret - -GetBlockLocation:: ; 2ef8 - ld a, [wMapWidth] - add a, 6 - ld c, a - ld b, 0 - ld hl, wOverworldMap + 1 - add hl, bc - ld a, e - srl a - jr z, .nope - and a -.loop - srl a - jr nc, .ok - add hl, bc - -.ok - sla c - rl b - and a - jr nz, .loop - -.nope - ld c, d - srl c - ld b, 0 - add hl, bc - ret - -GetFacingSignpost:: ; 00:2f1d - call GetFacingTileCoord - ld b, a - ld a, d - sub $4 - ld d, a - ld a, e - sub $4 - ld e, a - ld a, [wCurrMapSignCount] - and a - ret z - ld c, a - ld hl, wCurrMapSigns -.asm_2f32: ; 00:2f32 - ld a, [hli] - cp e - jr nz, .asm_2f3e - ld a, [hli] - cp d - jr nz, .asm_2f3f - ld a, [hli] - cp b ; useless comparison - jr .asm_2f46 - -.asm_2f3e: ; 00:2f3e - inc hl -.asm_2f3f: ; 00:2f3f - inc hl - inc hl - dec c - jr nz, .asm_2f32 - xor a - ret - -.asm_2f46: ; 00:2f46 - scf - ret - -LoadTileset:: ; 2f48 - push hl - push bc - - ld hl, Tilesets - ld bc, wTilesetEnd - wTileset - ld a, [wMapTileset] - call AddNTimes - - ld de, wTileset - ld bc, wTilesetEnd - wTileset - - ld a, BANK(Tilesets) - call FarCopyBytes - - ld a, 1 - ldh [hMapAnims], a - xor a - ldh [hTileAnimFrame], a - - pop bc - pop hl - ret diff --git a/home/tileset.asm b/home/tileset.asm new file mode 100644 index 0000000..e3093c9 --- /dev/null +++ b/home/tileset.asm @@ -0,0 +1,419 @@ +include "constants.asm" + + +SECTION "LoadTilesetGFX", ROM0[$2D26] + +LoadTilesetGFX:: ; 2d26 + call GetMapEnvironment + cp 1 ; TODO: constantify this + jr z, .exterior + cp 2 ; TODO: constantify this + jr z, .exterior + ld a, [wMapTileset] + cp $1B ; TODO: constantify this + jr z, .exterior + + ld a, [wTilesetTilesAddress] + ld e, a + ld a, [wTilesetTilesAddress + 1] + ld d, a + ld hl, vTileset + ld a, [wTilesetBank] + ld b, a + ld c, $60 + call Get2bpp + xor a + ldh [hTileAnimFrame], a + ret + +.exterior + ld de, CommonExteriorTiles ; TODO: maybe find a better name + ld hl, vTileset + lb bc, BANK(CommonExteriorTiles), $20 + call Get2bpp + + ld a, [wTilesetTilesAddress] + ld e, a + ld a, [wTilesetTilesAddress + 1] + ld d, a + ld hl, vExteriorTileset + ld a, [wTilesetBank] + ld b, a + ld c, $40 + call Get2bpp + xor a + ldh [hTileAnimFrame], a + ret + + +RefreshPlayerCoords:: ; 2d74 + ld a, [wXCoord] + add a, 4 + ld d, a + ld hl, wPlayerStandingMapX + sub [hl] + ld [hl], d + ld hl, wPlayerObjectXCoord + ld [hl], d + ld hl, wPlayerLastMapX + ld [hl], d + ld d, a + ld a, [wYCoord] + add a, 4 + ld e, a + ld hl, wPlayerStandingMapY + sub [hl] + ld [hl], e + ld hl, wPlayerObjectYCoord + ld [hl], e + ld hl, wPlayerLastMapY + ld [hl], e + ld e, a + + ld a, [wObjectFollow_Leader] + cp 1 + ret nz + ld a, [wObjectFollow_Follower] + and a + ret z + + ; This piece of code has been removed in pokegold (note that the conditions above were altered, as well) + call GetObjectStruct + ld hl, 16 ; TODO: constantify this + add hl, bc + ld a, [hl] + add a, d + ld [hl], a + ld [wMap1ObjectXCoord], a + ld hl, 18 ; TODO: constantify this + add hl, bc + ld a, [hl] + add a, d + ld [hl], a + ld hl, 17 ; TODO: constantify this + add hl, bc + ld a, [hl] + add a, e + ld [hl], a + ld [wMap1ObjectYCoord], a + ld hl, 19 + add hl, bc + ld a, [hl] + add a, e + ld [hl], a + ret + + +BufferScreen:: ; 2dcd + ld hl, wOverworldMapAnchor + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wScreenSave + ld c, 5 + ld b, 6 +.row + push bc + push hl +.col + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .col + pop hl + ld a, [wMapWidth] + add a, 6 + ld c, a + ld b, 0 + add hl, bc + pop bc + dec c + jr nz, .row + ret + +SaveScreen:: ; 2df1 + ld hl, wOverworldMapAnchor + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wScreenSave + ld a, [wMapWidth] + add 6 + ldh [hMapObjectIndexBuffer], a + ld a, [wPlayerStepDirection] + and a + jr z, .down + cp UP + jr z, .up + cp LEFT + jr z, .left + cp RIGHT + jr z, .right + ret + +.up + ld de, wScreenSave + 6 + ldh a, [hMapObjectIndexBuffer] + ld c, a + ld b, 0 + add hl, bc + jr .vertical + +.down + ld de, wScreenSave +.vertical + ld b, 6 + ld c, 4 + jr .load_neighbor + +.left + ld de, wScreenSave + 1 + inc hl + jr .horizontal + +.right + ld de, wScreenSave +.horizontal + ld b, 5 + ld c, 5 + +.load_neighbor ; 2e35 +.row + push bc + push hl + push de +.col + ld a, [de] + inc de + ld [hli], a + dec b + jr nz, .col + pop de + ld a, e + add a, 6 + ld e, a + jr nc, .okay + inc d + +.okay + pop hl + ldh a, [hConnectionStripLength] + ld c, a + ld b, 0 + add hl, bc + pop bc + dec c + jr nz, .row + ret + + +RefreshTiles:: ; 2e52 + call .left_right + call .up_down + ld a, [wPlayerStandingMapX] + ld d, a + ld a, [wPlayerStandingMapY] + ld e, a + call GetCoordTile + ld [wPlayerStandingTile], a + ret + +.up_down ; 2e67 + ld a, [wPlayerStandingMapX] + ld d, a + ld a, [wPlayerStandingMapY] + ld e, a + push de + inc e + call GetCoordTile + ld [wTileDown], a + pop de + dec e + call GetCoordTile + ld [wTileUp], a + ret + +.left_right ; 2e80 + ld a, [wPlayerStandingMapX] + ld d, a + ld a, [wPlayerStandingMapY] + ld e, a + push de + dec d + call GetCoordTile + ld [wTileLeft], a + pop de + inc d + call GetCoordTile + ld [wTileRight], a + ret + + +GetFacingTileCoord:: ; 2e99 + ld a, [wPlayerWalking] ; TODO: wPlayerDirection in Crystal. Not here? + and %1100 + srl a + srl a + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, .directions + add hl, de + + ld d, [hl] + inc hl + ld e, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + + ld a, [wPlayerStandingMapX] + add a, d + ld d, a + ld a, [wPlayerStandingMapY] + add a, e + ld e, a + ld a, [hl] + ret + +.directions + db 0, 1 + dw wTileDown + + db 0, -1 + dw wTileUp + + db -1, 0 + dw wTileLeft + + db 1, 0 + dw wTileRight + +GetCoordTile:: ; 2ece +; Get the collision byte for tile d, e + call GetBlockLocation + ld a, [hl] + and a + jr z, .nope + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld a, [wTilesetCollisionAddress] + ld c, a + ld a, [wTilesetCollisionAddress + 1] + ld b, a + add hl, bc + rr d + jr nc, .nocarry + inc hl + +.nocarry + rr e + jr nc, .nocarry2 + inc hl + inc hl + +.nocarry2 + ld a, [wTilesetBank] + call GetFarByte + ret + +.nope + ld a, -1 + ret + +GetBlockLocation:: ; 2ef8 + ld a, [wMapWidth] + add a, 6 + ld c, a + ld b, 0 + ld hl, wOverworldMap + 1 + add hl, bc + ld a, e + srl a + jr z, .nope + and a +.loop + srl a + jr nc, .ok + add hl, bc + +.ok + sla c + rl b + and a + jr nz, .loop + +.nope + ld c, d + srl c + ld b, 0 + add hl, bc + ret + +GetFacingSignpost:: ; 00:2f1d + call GetFacingTileCoord + ld b, a + ld a, d + sub $4 + ld d, a + ld a, e + sub $4 + ld e, a + ld a, [wCurrMapSignCount] + and a + ret z + ld c, a + ld hl, wCurrMapSigns +.asm_2f32: ; 00:2f32 + ld a, [hli] + cp e + jr nz, .asm_2f3e + ld a, [hli] + cp d + jr nz, .asm_2f3f + ld a, [hli] + cp b ; useless comparison + jr .asm_2f46 + +.asm_2f3e: ; 00:2f3e + inc hl +.asm_2f3f: ; 00:2f3f + inc hl + inc hl + dec c + jr nz, .asm_2f32 + xor a + ret + +.asm_2f46: ; 00:2f46 + scf + ret + +LoadTileset:: ; 2f48 + push hl + push bc + + ld hl, Tilesets + ld bc, wTilesetEnd - wTileset + ld a, [wMapTileset] + call AddNTimes + + ld de, wTileset + ld bc, wTilesetEnd - wTileset + + ld a, BANK(Tilesets) + call FarCopyBytes + + ld a, 1 + ldh [hMapAnims], a + xor a + ldh [hTileAnimFrame], a + + pop bc + pop hl + ret @@ -5,7 +5,6 @@ 00:3233 Function3233 00:323E Function323e 00:3240 Function3240 -00:39BA PlayCry 00:3CA8 InitSpriteAnimStruct 00:3D86 WaitSFX 00:3D87 WaitSFX.wait @@ -159,6 +158,7 @@ 10:4000 Function40000 10:40A6 ShowPokedexMenu 10:4AC7 Function40ac7 +10:4B45 Function40b45 10:4B5C Function40b5c 10:5FA1 Function41fa1 10:61F8 Function421f8 @@ -62,10 +62,15 @@ wIncrementTempo: dw ; c1ab wMapMusic:: db ; c1ad wCryPitch:: dw ; c1ae wCryLength:: dw ; c1b0 +; c1b2 + ds 7 ; TODO - ds 10 ; TODO - +wc1b9:: db ; c1b9 +wc1ba:: db ; c1ba ; either wChannelsEnd or wMusicEnd, unsure + + ds 1 ; TODO + wMusicInitEnd:: ; c1bc @@ -436,6 +441,11 @@ SECTION "CD7D", WRAM0[$CD7D] wItemQuantity:: db ; cd7d wItemQuantityBuffer:: db ; cd7e +SECTION "CD9E", WRAM0 [$CD9E] + +wcd9e:: + db + SECTION "CDB0", WRAM0 [$CDB0] wcdb0:: ; bit 0 = has engaged NPC in dialogue (?) db @@ -530,9 +540,13 @@ wMonHGrowthRate:: ; ce1d wMonHLearnset:: ; ce1e ; bit field - flag_array 50 + 5 + flag_array 50 + 5 ; size = 7 ds 1 +SECTION "CE2E", WRAM0[$CE2E] +wce2e:: ; ce2e + ds 9 + SECTION "CE37", WRAM0[$CE37] wNamedObjectIndexBuffer:: |