632 lines
12 KiB
NASM
632 lines
12 KiB
NASM
; =========================================================
|
|
; World Map Module
|
|
|
|
|
|
WorldMapIcon_AdjustCoordinate = $0AC589
|
|
WorldMap_HandleSpriteBlink = $0AC51C
|
|
|
|
pullpc
|
|
|
|
DrawWisdomPendant:
|
|
{
|
|
; X position
|
|
LDA.b #$08 : STA.l $7EC10B
|
|
LDA.b #$30 : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$07 : STA.l $7EC109
|
|
LDA.b #$01 : STA.l $7EC108
|
|
|
|
LDA.b #$60 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0D : STA.l $7EC025
|
|
RTL
|
|
}
|
|
|
|
DrawPowerPendant:
|
|
{
|
|
; X position
|
|
LDA.b #$08 : STA.l $7EC10B
|
|
LDA.b #$0D : STA.l $7EC10A ; Upper nybble control Zoomed low X pos
|
|
; Y position
|
|
LDA.b #$02 : STA.l $7EC109
|
|
LDA.b #$84 : STA.l $7EC108 ; Upper nybble control Zoomed low Y pos
|
|
|
|
LDA.b #$60 : STA.b $0D
|
|
LDA.b #$32 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$08 : STA.l $7EC025
|
|
RTL
|
|
}
|
|
|
|
DrawCouragePendant:
|
|
{
|
|
; X position
|
|
LDA.b #$00 : STA.l $7EC10B
|
|
LDA.b #$87 : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$04 : STA.l $7EC109
|
|
LDA.b #$01 : STA.l $7EC108
|
|
; Tile GFX
|
|
LDA.b #$60 : STA.b $0D
|
|
LDA.b #$38 : STA.b $0C
|
|
; Tile Size
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0A : STA.l $7EC025 ; OAM Slot used
|
|
RTL
|
|
}
|
|
|
|
DrawMasterSwordIcon:
|
|
{
|
|
; X position
|
|
LDA.b #$02 : STA.l $7EC10B
|
|
LDA.b #$FD : STA.l $7EC10A ; Upper nybble control Zoomed low X pos
|
|
; Y position
|
|
LDA.b #$00 : STA.l $7EC109
|
|
LDA.b #$E4 : STA.l $7EC108 ; Upper nybble control Zoomed low Y pos
|
|
|
|
LDA.b #$62 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0B : STA.l $7EC025
|
|
RTL
|
|
}
|
|
|
|
DrawFortressOfSecretsIcon:
|
|
{
|
|
; X position
|
|
LDA.b #$0E : STA.l $7EC10B
|
|
LDA.b #$5E : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$06 : STA.l $7EC109
|
|
LDA.b #$68 : STA.l $7EC108
|
|
|
|
LDA.b #$66 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0B : STA.l $7EC025
|
|
|
|
RTL
|
|
}
|
|
|
|
DrawFinalBossIcon:
|
|
{
|
|
; X position
|
|
LDA.b #$0E : STA.l $7EC10B
|
|
LDA.b #$5E : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$04 : STA.l $7EC109
|
|
LDA.b #$68 : STA.l $7EC108
|
|
; Tile GFX (Skull Icon)
|
|
LDA.b #$66 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C
|
|
; Tile Size
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0E : STA.l $7EC025 ; OAM Slot used
|
|
RTL
|
|
}
|
|
|
|
DrawHallOfSecretsIcon:
|
|
{
|
|
; X position
|
|
LDA.b #$0D : STA.l $7EC10B
|
|
LDA.b #$34 : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$03 : STA.l $7EC109
|
|
LDA.b #$0E : STA.l $7EC108
|
|
; Tile GFX
|
|
LDA.b #$68 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C
|
|
; Tile Size
|
|
LDA.b #$00 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$07 : STA.l $7EC025
|
|
RTL
|
|
}
|
|
|
|
DrawPyramidIcon:
|
|
{
|
|
; X position
|
|
LDA.b #$05 : STA.l $7EC10B
|
|
LDA.b #$00 : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$00 : STA.l $7EC109
|
|
LDA.b #$54 : STA.l $7EC108
|
|
|
|
LDA.b #$68 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$00 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$07 : STA.l $7EC025
|
|
RTL
|
|
}
|
|
|
|
DrawEonEscapeIcon:
|
|
{
|
|
LDA.b #$04 : STA.l $7EC10B
|
|
LDA.b #$F4 : STA.l $7EC10A
|
|
|
|
LDA.b #$0B : STA.l $7EC109
|
|
LDA.b #$0E : STA.l $7EC108
|
|
|
|
LDA.b #$68 : STA.b $0D
|
|
LDA.b #$36 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$00 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$06 : STA.l $7EC025
|
|
RTL
|
|
}
|
|
|
|
pushpc
|
|
|
|
; Removed mirror portal draw and pyramid open code
|
|
org $0ABF90
|
|
MapIconDraw:
|
|
{
|
|
; .dont_draw_link
|
|
LDA.l $7EC108 : PHA
|
|
LDA.l $7EC109 : PHA
|
|
LDA.l $7EC10A : PHA
|
|
LDA.l $7EC10B : PHA
|
|
|
|
.draw_prizes
|
|
LDA.b $8A : AND.b #$40 : BEQ .lwprizes
|
|
LDA.l OOSPROG : AND.b #$02 : BNE .check_pendants
|
|
JSL DrawEonEscapeIcon
|
|
JSR HandleMapDrawIcon
|
|
JMP restore_coords_and_exit
|
|
.check_pendants
|
|
LDA.l OOSPROG : AND.b #$10 : BEQ .check_master_sword
|
|
JSL DrawPowerPendant
|
|
JSR HandleMapDrawIcon
|
|
|
|
JSL DrawWisdomPendant
|
|
JSR HandleMapDrawIcon
|
|
|
|
JSL DrawCouragePendant
|
|
JSR HandleMapDrawIcon
|
|
.check_master_sword
|
|
LDA.l OOSPROG : AND.b #$20 : BEQ .check_fortress
|
|
JSL DrawMasterSwordIcon
|
|
JSR HandleMapDrawIcon
|
|
JMP restore_coords_and_exit
|
|
.check_fortress
|
|
LDA.l OOSPROG : AND.b #$40 : BEQ .check_final_boss
|
|
JSL DrawFortressOfSecretsIcon
|
|
JSR HandleMapDrawIcon
|
|
JMP restore_coords_and_exit
|
|
.check_final_boss
|
|
LDA.l OOSPROG : AND.b #$80 : BEQ .exit_dw
|
|
JSL DrawFinalBossIcon
|
|
JSR HandleMapDrawIcon
|
|
.exit_dw
|
|
JMP restore_coords_and_exit
|
|
.lwprizes
|
|
|
|
LDA.l OOSPROG : CMP.b #$02 : BNE +
|
|
JSL DrawHallOfSecretsIcon
|
|
JSR HandleMapDrawIcon
|
|
JMP .main_quest
|
|
+
|
|
LDA.l OOSPROG : AND.b #$10 : BEQ .main_quest
|
|
; Pyramid of Power
|
|
JSL DrawPyramidIcon
|
|
JSR HandleMapDrawIcon_noflash
|
|
.main_quest
|
|
|
|
LDA.l MapIcon : CMP.b #$01 : BEQ .draw_crystal_1
|
|
CMP.b #$02 : BEQ .draw_crystals
|
|
JSL DrawEonEscapeIcon
|
|
JSR HandleMapDrawIcon
|
|
JMP restore_coords_and_exit
|
|
|
|
.draw_crystal_1
|
|
; Draw Crystal 1
|
|
LDA.l $7EF37A : AND #$02 : BNE .skip_draw_0
|
|
; X position
|
|
LDA.b #$00 : STA.l $7EC10B
|
|
LDA.b #$87 : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$04 : STA.l $7EC109
|
|
LDA.b #$01 : STA.l $7EC108
|
|
; Tile GFX
|
|
LDA.b #$64 : STA.b $0D
|
|
LDA.b #$38 : STA.b $0C
|
|
; Tile Size
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0E : STA.l $7EC025 ; OAM Slot used
|
|
JSR HandleMapDrawIcon
|
|
.skip_draw_0
|
|
JMP restore_coords_and_exit
|
|
|
|
.draw_crystals
|
|
; Draw Crystal 2
|
|
LDA.l $7EF37A : AND #$10 : BNE .skip_draw_1
|
|
; X position (2)
|
|
LDA.b #$1E : STA.l $7EC10B
|
|
LDA.b #$A0 : STA.l $7EC10A
|
|
; Y position (2)
|
|
LDA.b #$09 : STA.l $7EC109
|
|
LDA.b #$74 : STA.l $7EC108
|
|
|
|
LDA.b #$64 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$08 : STA.l $7EC025
|
|
|
|
JSR HandleMapDrawIcon
|
|
.skip_draw_1
|
|
|
|
; Draw Crystal 3
|
|
LDA.l $7EF37A : AND #$40 : BNE .skip_draw_2
|
|
; X position
|
|
LDA.b #$08 : STA.l $7EC10B
|
|
LDA.b #$10 : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$04 : STA.l $7EC109
|
|
LDA.b #$0E : STA.l $7EC108
|
|
|
|
LDA.b #$64 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0D : STA.l $7EC025
|
|
|
|
JSR HandleMapDrawIcon
|
|
.skip_draw_2
|
|
|
|
; Draw Crystal 4
|
|
LDA.l $7EF37A : AND #$20 : BNE .skip_draw_3
|
|
; X position
|
|
LDA.b #$0E : STA.l $7EC10B
|
|
LDA.b #$5E : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$06 : STA.l $7EC109
|
|
LDA.b #$68 : STA.l $7EC108
|
|
|
|
LDA.b #$64 : STA.b $0D
|
|
LDA.b #$3C : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0B : STA.l $7EC025
|
|
|
|
JSR HandleMapDrawIcon
|
|
.skip_draw_3
|
|
|
|
; Draw Crystal 5
|
|
LDA.l $7EF37A : AND #$04 : BNE .skip_draw_4
|
|
; X position
|
|
LDA.b #$0C : STA.l $7EC10B
|
|
LDA.b #$34 : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$00 : STA.l $7EC109
|
|
LDA.b #$0E : STA.l $7EC108
|
|
|
|
LDA.b #$64 : STA.b $0D
|
|
LDA.b #$34 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$09 : STA.l $7EC025
|
|
|
|
JSR HandleMapDrawIcon
|
|
.skip_draw_4
|
|
|
|
; Draw Crystal 6
|
|
LDA.l $7EF37A : AND #$01 : BNE .skip_draw_5
|
|
; X position (6)
|
|
LDA.b #$0D : STA.l $7EC10B
|
|
LDA.b #$05 : STA.l $7EC10A
|
|
; Y position (6)
|
|
LDA.b #$0D : STA.l $7EC109
|
|
LDA.b #$09 : STA.l $7EC108
|
|
|
|
LDA.b #$64 : STA.b $0D
|
|
LDA.b #$32 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0A : STA.l $7EC025
|
|
|
|
JSR HandleMapDrawIcon
|
|
.skip_draw_5
|
|
|
|
; Draw Crystal 7
|
|
LDA.l $7EF37A : AND #$08 : BNE .skip_draw_6
|
|
; X position
|
|
LDA.b #$00 : STA.l $7EC10B
|
|
LDA.b #$F4 : STA.l $7EC10A
|
|
; Y position
|
|
LDA.b #$0D : STA.l $7EC109
|
|
LDA.b #$0E : STA.l $7EC108
|
|
|
|
LDA.b #$64 : STA.b $0D
|
|
LDA.b #$32 : STA.b $0C ; Tile GFX
|
|
|
|
LDA.b #$02 : STA.b $0B ; 02 = 16x16, 00 = 8x8
|
|
LDA.b #$0C : STA.l $7EC025
|
|
|
|
JSR HandleMapDrawIcon
|
|
.skip_draw_6
|
|
|
|
JMP restore_coords_and_exit
|
|
}
|
|
|
|
HandleMapDrawIcon:
|
|
{
|
|
; Timer to make it flash
|
|
LDA.b $1A : AND.b #$10 : BNE .skip_draw
|
|
.noflash ; ALTERNATE ENTRY POINT
|
|
JSR WorldMapIcon_AdjustCoordinate
|
|
LDA.l $7EC025 : TAX
|
|
JSR WorldMap_CalculateOAMCoordinates
|
|
|
|
BCC .skip_draw
|
|
LDA.l $7EC025 : TAX
|
|
LDA.b #$02
|
|
JSR WorldMap_HandleSpriteBlink
|
|
.skip_draw
|
|
RTS
|
|
}
|
|
|
|
FixMaskPaletteOnExit:
|
|
{
|
|
JSL Palette_ArmorAndGloves
|
|
LDA.l $7EC229
|
|
RTL
|
|
}
|
|
|
|
assert pc() <= $0AC387
|
|
|
|
org $0ABC76
|
|
JSL FixMaskPaletteOnExit
|
|
|
|
org $0AC589
|
|
RTS
|
|
|
|
org $0AC38A
|
|
restore_coords_and_exit:
|
|
{
|
|
PLA : STA.l $7EC10B
|
|
PLA : STA.l $7EC10A
|
|
PLA : STA.l $7EC109
|
|
PLA : STA.l $7EC108
|
|
RTS
|
|
}
|
|
|
|
WorldMap_CalculateOAMCoordinates:
|
|
|
|
; =========================================================
|
|
; 0x0C4000 to 0x0C8000 for the map gfx
|
|
; patch a new rom with your map data/gfx
|
|
; create a new bin file out of these bytes
|
|
; 0AC727 (pc: 054727) to 0AD726 (pc: 055726) 0x1000 bytes
|
|
|
|
; =========================================================
|
|
; LW OVERWORLD MAP
|
|
; =========================================================
|
|
|
|
org $008E54 ;STZ $2115
|
|
JSL DMAOwMap
|
|
RTS
|
|
|
|
org $00E399
|
|
JSL DMAOwMapGfx
|
|
RTL
|
|
|
|
; =========================================================
|
|
; DW OVERWORLD MAP
|
|
; =========================================================
|
|
org $008FF3
|
|
RTS ; do nothing during DW update, we'll handle it in the LW routine
|
|
|
|
org $408000
|
|
LWWorldMap_Tiles:
|
|
incbin world_map/LwMapTileset.bin
|
|
|
|
LWWorldMap_Gfx:
|
|
incbin world_map/LwMapGfx.bin
|
|
|
|
org $418000
|
|
DWWorldMap_Tiles:
|
|
incbin world_map/DwMapTileset.bin
|
|
|
|
DWWorldMap_Gfx:
|
|
incbin world_map/DwMapGfx.bin
|
|
|
|
DMAOwMap:
|
|
{
|
|
JSL Palette_ArmorAndGloves
|
|
LDA $8A : AND #$40 : BEQ .LWMAP
|
|
JMP .DWMAP
|
|
.LWMAP
|
|
|
|
STZ.w $2115
|
|
|
|
LDA.b #LWWorldMap_Tiles>>16
|
|
STA.w $4304
|
|
|
|
REP #$20
|
|
|
|
LDA.w #$1800
|
|
STA.w $4300
|
|
|
|
STZ.b $04
|
|
STZ.b $02
|
|
|
|
LDY.b #$01
|
|
LDX.b #$00
|
|
|
|
.next_quadrant
|
|
|
|
LDA.w #$0020
|
|
STA.b $06
|
|
|
|
LDA.l .vram_offset,X
|
|
STA.b $00
|
|
|
|
.next_row
|
|
|
|
LDA.b $00
|
|
STA.w $2116
|
|
|
|
CLC
|
|
ADC.w #$0080
|
|
STA.b $00
|
|
|
|
LDA.b $02
|
|
CLC
|
|
ADC.w #LWWorldMap_Tiles
|
|
STA.w $4302
|
|
|
|
LDA.w #$0020
|
|
STA.w $4305
|
|
|
|
STY.w $420B
|
|
|
|
CLC
|
|
ADC.b $02
|
|
STA.b $02
|
|
|
|
DEC.b $06
|
|
BNE .next_row
|
|
|
|
INC.b $04
|
|
INC.b $04
|
|
|
|
LDX.b $04
|
|
CPX.b #$08
|
|
BNE .next_quadrant
|
|
|
|
SEP #$20
|
|
|
|
RTL
|
|
|
|
.vram_offset
|
|
dw $0000, $0020, $1000, $1020
|
|
|
|
.DWMAP
|
|
|
|
STZ.w $2115
|
|
|
|
LDA.b #DWWorldMap_Tiles>>16
|
|
STA.w $4304
|
|
|
|
REP #$20
|
|
|
|
LDA.w #$1800
|
|
STA.w $4300
|
|
|
|
STZ.b $04
|
|
STZ.b $02
|
|
|
|
LDY.b #$01
|
|
LDX.b #$00
|
|
|
|
.next_quadrant2
|
|
|
|
LDA.w #$0020
|
|
STA.b $06
|
|
|
|
LDA.l .vram_offset,X
|
|
STA.b $00
|
|
|
|
.next_row2
|
|
|
|
LDA.b $00
|
|
STA.w $2116
|
|
|
|
CLC
|
|
ADC.w #$0080
|
|
STA.b $00
|
|
|
|
LDA.b $02
|
|
CLC
|
|
ADC.w #DWWorldMap_Tiles
|
|
STA.w $4302
|
|
|
|
LDA.w #$0020
|
|
STA.w $4305
|
|
|
|
STY.w $420B
|
|
|
|
CLC
|
|
ADC.b $02
|
|
STA.b $02
|
|
|
|
DEC.b $06
|
|
BNE .next_row2
|
|
|
|
INC.b $04
|
|
INC.b $04
|
|
|
|
LDX.b $04
|
|
CPX.b #$08
|
|
BNE .next_quadrant2
|
|
|
|
SEP #$20
|
|
|
|
RTL
|
|
}
|
|
|
|
|
|
DMAOwMapGfx:
|
|
{
|
|
LDA $8A : AND #$40 : BNE .DWMAP
|
|
LDA.b #LWWorldMap_Gfx>>16 : STA $02
|
|
|
|
LDA.b #$80 : STA $2115
|
|
|
|
STZ $2116 : STZ $2117
|
|
|
|
REP #$10
|
|
|
|
LDY.w #LWWorldMap_Gfx : STY $00
|
|
|
|
LDY.w #$0000
|
|
|
|
.writeChr
|
|
|
|
LDA [$00], Y : STA $2119 : INY
|
|
LDA [$00], Y : STA $2119 : INY
|
|
LDA [$00], Y : STA $2119 : INY
|
|
LDA [$00], Y : STA $2119 : INY
|
|
CPY.w #$4000 : BNE .writeChr
|
|
|
|
SEP #$10
|
|
|
|
RTL
|
|
|
|
.DWMAP
|
|
|
|
LDA.b #DWWorldMap_Gfx>>16 : STA $02
|
|
|
|
LDA.b #$80 : STA $2115
|
|
|
|
STZ $2116 : STZ $2117
|
|
|
|
REP #$10
|
|
|
|
LDY.w #DWWorldMap_Gfx : STY $00
|
|
|
|
LDY.w #$0000
|
|
|
|
.writeChr2
|
|
|
|
LDA [$00], Y : STA $2119 : INY
|
|
LDA [$00], Y : STA $2119 : INY
|
|
LDA [$00], Y : STA $2119 : INY
|
|
LDA [$00], Y : STA $2119 : INY
|
|
CPY.w #$4000 : BNE .writeChr2
|
|
|
|
SEP #$10
|
|
|
|
RTL
|
|
}
|
|
|
|
org $0ADC27
|
|
DWPalettes:
|
|
incbin world_map/dw_palette.bin
|