475 lines
6.4 KiB
NASM
475 lines
6.4 KiB
NASM
MapDrawingData:
|
|
.floor_data_offset
|
|
dw $0000, $0000
|
|
dw $0019, $000C
|
|
dw $0032, $0018
|
|
dw $004B, $0024
|
|
dw $0064, $0030
|
|
dw $007D, $003C
|
|
dw $0096, $0048
|
|
dw $00AF, $0054
|
|
dw $00C8, $0060
|
|
|
|
.row_data_offset
|
|
dw $0000, $0000
|
|
dw $0005, $0004
|
|
dw $000A, $0008
|
|
dw $000F, $000C
|
|
dw $0014, $0010
|
|
|
|
.corner_tile_address
|
|
dw $00E2, $0160
|
|
dw $00F8, $0178
|
|
dw $03A2, $03A0
|
|
dw $03B8, $03B8
|
|
|
|
.row_tile_address
|
|
dw $00E4, $0162
|
|
dw $03A4, $03A2
|
|
|
|
.row_tile_length
|
|
dw $0014, $0016
|
|
|
|
.column_tile_address
|
|
dw $0122, $01A0
|
|
dw $0138, $01B8
|
|
|
|
.column_tile_length
|
|
dw $0280, $0200
|
|
|
|
.floor_label_address
|
|
dw $035E, $035C
|
|
|
|
.row_start_address
|
|
dw $0124, $01A2
|
|
dw $01A4, $0262
|
|
dw $0224, $0322
|
|
dw $02A4, $03D2
|
|
dw $0324, $04A2
|
|
|
|
.column_count
|
|
dw $0005, $0004
|
|
|
|
.column_spacing
|
|
dw $0004, $0006
|
|
|
|
.row_count
|
|
dw $0005, $0003
|
|
|
|
.bg1_grid_start
|
|
dw $1091, $10D1
|
|
|
|
.sprite_offset_x_base
|
|
dw $0090, $0088
|
|
|
|
.sprite_offset_y_base
|
|
dw $001F, $002F
|
|
dw $007F, $008F
|
|
|
|
.entrance_sprite_offset_y_base
|
|
dw $0087, $0097
|
|
|
|
.supertile_pixel_spacing
|
|
dw $0010, $0018
|
|
|
|
.floor_pixel_column_wrap
|
|
dw $0040, $0048
|
|
|
|
.floor_pixel_row_wrap
|
|
dw $0040, $0030
|
|
|
|
CustomMapDrawingData:
|
|
.column_wrap
|
|
dw $0003
|
|
.column_count
|
|
dw $0004
|
|
.row_wrap
|
|
dw $0002
|
|
|
|
.floor_connection_data_offset
|
|
dw $0000
|
|
dw $0011
|
|
dw $0022
|
|
dw $0033
|
|
dw $0044
|
|
dw $0055
|
|
dw $0066
|
|
dw $0077
|
|
dw $0088
|
|
|
|
.row_connection_data_offset
|
|
dw $0000
|
|
dw $0007
|
|
dw $000E
|
|
dw $0015
|
|
|
|
macro LDA_MapMode()
|
|
LDA.l DungeonMapMode
|
|
ASL A
|
|
endmacro
|
|
|
|
macro LDX_MapMode()
|
|
%LDA_MapMode()
|
|
TAX
|
|
endmacro
|
|
|
|
macro LDY_MapMode()
|
|
%LDA_MapMode()
|
|
TAY
|
|
endmacro
|
|
|
|
macro ADD_MapMode()
|
|
CLC : ADC.l DungeonMapMode
|
|
ASL A
|
|
TAX
|
|
endmacro
|
|
|
|
macro Map_LDA(addr, label)
|
|
pushpc
|
|
org <addr>
|
|
JSR LDA_<label>
|
|
pullpc
|
|
|
|
if not(defined("LDA_<label>"))
|
|
!LDA_<label> = 1
|
|
LDA_<label>:
|
|
PHX
|
|
%LDX_MapMode()
|
|
LDA.l MapDrawingData_<label>, X
|
|
PLX
|
|
RTS
|
|
endif
|
|
endmacro
|
|
|
|
macro Map_LDAY(addr, label)
|
|
pushpc
|
|
org <addr>
|
|
JSR LDA_Y_<label>
|
|
pullpc
|
|
|
|
if not(defined("LDA_Y_<label>"))
|
|
!LDA_Y_<label> = 1
|
|
LDA_Y_<label>:
|
|
PHX
|
|
TYA
|
|
%ADD_MapMode()
|
|
LDA.l MapDrawingData_<label>, X
|
|
PLX
|
|
RTS
|
|
endif
|
|
endmacro
|
|
|
|
macro Map_LDAX(addr, label)
|
|
pushpc
|
|
org <addr>
|
|
JSR LDA_X_<label>
|
|
pullpc
|
|
|
|
if not(defined("LDA_X_<label>"))
|
|
!LDA_X_<label> = 1
|
|
LDA_X_<label>:
|
|
PHX
|
|
TXA
|
|
%ADD_MapMode()
|
|
LDA.l MapDrawingData_<label>, X
|
|
PLX
|
|
RTS
|
|
endif
|
|
endmacro
|
|
|
|
macro Map_CMP(addr, label)
|
|
pushpc
|
|
org <addr>
|
|
JSR CMP_<label>
|
|
pullpc
|
|
|
|
if not(defined("CMP_<label>"))
|
|
!CMP_<label> = 1
|
|
CMP_<label>:
|
|
PHX
|
|
PHA
|
|
%LDX_MapMode()
|
|
PLA
|
|
CMP.l MapDrawingData_<label>, X
|
|
BEQ .z_flag_set
|
|
.z_flag_clear
|
|
PLX
|
|
REP #$02
|
|
RTS
|
|
.z_flag_set
|
|
PLX
|
|
SEP #$02
|
|
RTS
|
|
endif
|
|
endmacro
|
|
|
|
macro Map_ADD(addr, label)
|
|
pushpc
|
|
org <addr>
|
|
JSR ADD_<label>
|
|
pullpc
|
|
|
|
if not(defined("ADD_<label>"))
|
|
!ADD_<label> = 1
|
|
ADD_<label>:
|
|
PHX
|
|
PHA
|
|
%LDX_MapMode()
|
|
PLA
|
|
CLC : ADC.l MapDrawingData_<label>, X
|
|
PLX
|
|
RTS
|
|
endif
|
|
endmacro
|
|
|
|
macro Map_ADDY(addr, label)
|
|
pushpc
|
|
org <addr>
|
|
JSR ADD_Y_<label>
|
|
pullpc
|
|
|
|
if not(defined("ADD_Y_<label>"))
|
|
!ADD_Y_<label> = 1
|
|
ADD_Y_<label>:
|
|
PHX
|
|
PHA
|
|
TYA
|
|
%ADD_MapMode()
|
|
PLA
|
|
CLC : ADC.l MapDrawingData_<label>, X
|
|
PLX
|
|
RTS
|
|
endif
|
|
endmacro
|
|
|
|
pushpc
|
|
|
|
org $8AE5DA
|
|
ADC.b $02 ; swap position of load and add for ease
|
|
|
|
org $8AE652 ; steal some space from the old map-drawing code we're no longer using
|
|
|
|
LoadDungeonMapRoomPointer_0A:
|
|
JSL LoadDungeonMapRoomPointer
|
|
RTS
|
|
|
|
%Map_LDAY($8AE45F, corner_tile_address)
|
|
%Map_LDAY($8AE489, row_tile_address)
|
|
%Map_CMP($8AE4B0, row_tile_length)
|
|
%Map_LDAY($8AE4C1, column_tile_address)
|
|
%Map_CMP($8AE4EA, column_tile_length)
|
|
%Map_LDA($8AE54A, floor_label_address)
|
|
%Map_LDAX($8AE5D7, row_data_offset)
|
|
%Map_LDAY($8AE5F7, floor_data_offset)
|
|
%Map_CMP($8AE5A2, row_count)
|
|
%Map_CMP($8AE7FA, column_count)
|
|
%Map_ADD($8AE896, sprite_offset_x_base)
|
|
%Map_ADDY($8AE8B5, sprite_offset_y_base)
|
|
%Map_ADD($8AE952, sprite_offset_y_base)
|
|
%Map_ADDY($8AEBDB, sprite_offset_y_base)
|
|
|
|
warnpc $8AE7F6
|
|
padbyte $EA
|
|
pad $8AE7F6
|
|
|
|
pullpc
|
|
|
|
incsrc data/doors_connections.asm
|
|
|
|
LoadDungeonMapRoomPointer:
|
|
LDA.l DungeonMapMode
|
|
BEQ .normal
|
|
LDA.w #bank(CustomMapPointers)
|
|
STA.b $74
|
|
LDA.l CustomMapPointers, X
|
|
RTL
|
|
|
|
.normal
|
|
LDA.w #bank(DungeonMapRoomPointers)
|
|
STA.b $74
|
|
LDA.l DungeonMapRoomPointers, X
|
|
RTL
|
|
|
|
PrepDrawRow:
|
|
%ADD_MapMode()
|
|
LDA.l MapDrawingData_row_start_address, X
|
|
CLC : ADC.b $06
|
|
AND.w #$0FFF
|
|
TAX
|
|
|
|
LDA.l DungeonMapMode
|
|
BEQ .done
|
|
|
|
JSR DrawRowOfRoomConnections
|
|
|
|
.done
|
|
RTL
|
|
|
|
ClearAdjacentConnections:
|
|
; Left
|
|
LDA.b $02
|
|
BEQ +
|
|
LDA.b $0E
|
|
BIT.w #$000A
|
|
BNE +
|
|
LDA.w #$0F00
|
|
STA.l $7F0000-$02, X
|
|
STA.l $7F0040-$02, X
|
|
+
|
|
|
|
; Top
|
|
LDA.b $00
|
|
BEQ +
|
|
LDA.b $0E
|
|
BIT.w #$000C
|
|
BNE +
|
|
LDA.w #$0F00
|
|
STA.l $7F0000-$40, X
|
|
STA.l $7F0002-$40, X
|
|
+
|
|
|
|
; Right
|
|
LDA.b $02
|
|
CMP.l CustomMapDrawingData_column_wrap
|
|
BCS +
|
|
LDA.b $0E
|
|
BIT.w #$0005
|
|
BNE +
|
|
LDA.w #$0F00
|
|
STA.l $7F0000+$04, X
|
|
STA.l $7F0040+$04, X
|
|
+
|
|
|
|
; Bottom
|
|
LDA.b $00
|
|
CMP.l CustomMapDrawingData_row_wrap
|
|
BCS +
|
|
LDA.b $0E
|
|
BIT.w #$0003
|
|
BNE +
|
|
LDA.w #$0F00
|
|
STA.l $7F0000+$80, X
|
|
STA.l $7F0002+$80, X
|
|
+
|
|
RTL
|
|
|
|
DrawRowOfRoomConnections:
|
|
PHB : PHK : PLB
|
|
PHX
|
|
|
|
LDX.w DungeonID
|
|
LDA.l DoorConnectionPointers, X
|
|
STA.b $04
|
|
|
|
LDA.l DungeonMapFloorCountData, X
|
|
AND.w #$000F
|
|
CLC : ADC.w DungeonMapCurrentFloor
|
|
AND.w #$00FF
|
|
ASL A
|
|
TAX
|
|
LDA.l CustomMapDrawingData_floor_connection_data_offset, X
|
|
CLC : ADC.b $04
|
|
STA.b $04
|
|
|
|
LDA.b $00
|
|
ASL A
|
|
TAX
|
|
LDA.l CustomMapDrawingData_row_connection_data_offset, X
|
|
CLC : ADC.b $04
|
|
STA.b $04
|
|
|
|
STZ.b $02
|
|
|
|
PLX : PHX
|
|
LDY.w #$0000
|
|
|
|
.next_horizontal
|
|
LDA.b ($04), Y
|
|
AND.w #$00FF
|
|
JSR DrawHorizontalConnector
|
|
INY
|
|
INX #6
|
|
|
|
INC.b $02
|
|
LDA.b $02
|
|
CMP.l CustomMapDrawingData_column_wrap
|
|
BCC .next_horizontal
|
|
|
|
LDA.b $00
|
|
CMP.l CustomMapDrawingData_row_wrap
|
|
BCS .done
|
|
|
|
PLX : PHX
|
|
|
|
STZ.b $02
|
|
|
|
.next_vertical
|
|
LDA.b ($04), Y
|
|
AND.w #$00FF
|
|
JSR DrawVerticalConnector
|
|
INY
|
|
INX #6
|
|
|
|
INC.b $02
|
|
LDA.b $02
|
|
CMP.l CustomMapDrawingData_column_count
|
|
BCC .next_vertical
|
|
|
|
.done
|
|
PLX
|
|
PLB
|
|
RTS
|
|
|
|
; A = connector index
|
|
; X = address
|
|
DrawHorizontalConnector:
|
|
PHY
|
|
ASL A : ASL A
|
|
TAY
|
|
|
|
LDA.w DoorConnectionTiles+0, Y
|
|
BEQ +
|
|
ORA.w #$1404
|
|
STA.l $7F0004, X
|
|
+
|
|
|
|
LDA.w DoorConnectionTiles+2, Y
|
|
BEQ +
|
|
ORA.w #$1404
|
|
STA.l $7F0044, X
|
|
+
|
|
|
|
PLY
|
|
RTS
|
|
|
|
; A = connector index
|
|
; X = address
|
|
DrawVerticalConnector:
|
|
PHY
|
|
ASL A : ASL A
|
|
TAY
|
|
|
|
LDA.w DoorConnectionTiles+0, Y
|
|
BEQ +
|
|
ORA.w #$1400
|
|
STA.l $7F0080, X
|
|
+
|
|
|
|
LDA.w DoorConnectionTiles+2, Y
|
|
BEQ +
|
|
ORA.w #$1400
|
|
STA.l $7F0082, X
|
|
+
|
|
|
|
PLY
|
|
RTS
|
|
|
|
GetLocationMarkerLeft:
|
|
LDA.b LinkQuadrantH
|
|
BEQ +
|
|
LDA.b #$F8
|
|
+
|
|
CLC : ADC.w $0215
|
|
AND.b #$F8
|
|
RTL
|