I've tried several attempts at getting a working metatile loader thrown together with very little success. Anyway, I have this routine here that should be taking the contents of a map data string and copying what should go into the nametable into RAM. I've tried many methods for this and the current is what I like best because it's sleek and nice looking. Anyway, I've tried debugging it and I'm still unsure where it's happening, but it seems like something is getting overwritten because when I ran the program it's showing the signs of going into an infinite loop.
Here is the routine:
Here are my tables:
Here is the routine:
Code:
Scratch .rs 2 ;reserve 2 bytes for scratch
Buffer .rs 64 ;reserve 64 bytes for level decompression
MetaTileData_Ptr .rs 2 ;2 bytes for the pointer currently proccessed metatile
ColumnNumX_Ptr .rs 2 ;2 bytes for column number
ColumnNumY_Ptr .rs 2 ;2 bytes for column number
[...]
;$00
InitMap:
LDY #$00
LDA #$03 ;Pos of buffer
STA ColumnNumX_Ptr
LDA ColumnNumX_Ptr+32
STA ColumnNumY_Ptr
LoadMap:
LDA LevelData,y
STY Scratch
JSR WriteTileToBuffer ;a = metatilenumber to process
LDY Scratch
INY
CPY #$15
BNE LoadMap
RTS
WriteTileToBuffer:
LDX MT_Table,y
STX MetaTileData_Ptr
LDA #HIGH(MT_Table)
STA MetaTileData_Ptr+1
LDY #$00 ;start at 0
LDX #$00
LDA [MetaTileData_Ptr],y ;do 1
STA [ColumnNumX_Ptr,x]
INY
INX
LDA [MetaTileData_Ptr],y ;do 2
STA [ColumnNumX_Ptr,x]
INY
INX
LDA [MetaTileData_Ptr],y ;do 3
STA [ColumnNumY_Ptr,x]
INY
INX
LDA [MetaTileData_Ptr],y ;and finally the 4th byte
STA [ColumnNumY_Ptr,x]
LDA ColumnNumX_Ptr
INC A ;\ We wrote 4 bytes so increase the ptrs accordingly
INC A ; |
STA ColumnNumX_Ptr ; |
LDA ColumnNumY_Ptr ; |
INC A ; |
INC A ;/
STA ColumnNumY_Ptr
RTS
Buffer .rs 64 ;reserve 64 bytes for level decompression
MetaTileData_Ptr .rs 2 ;2 bytes for the pointer currently proccessed metatile
ColumnNumX_Ptr .rs 2 ;2 bytes for column number
ColumnNumY_Ptr .rs 2 ;2 bytes for column number
[...]
;$00
InitMap:
LDY #$00
LDA #$03 ;Pos of buffer
STA ColumnNumX_Ptr
LDA ColumnNumX_Ptr+32
STA ColumnNumY_Ptr
LoadMap:
LDA LevelData,y
STY Scratch
JSR WriteTileToBuffer ;a = metatilenumber to process
LDY Scratch
INY
CPY #$15
BNE LoadMap
RTS
WriteTileToBuffer:
LDX MT_Table,y
STX MetaTileData_Ptr
LDA #HIGH(MT_Table)
STA MetaTileData_Ptr+1
LDY #$00 ;start at 0
LDX #$00
LDA [MetaTileData_Ptr],y ;do 1
STA [ColumnNumX_Ptr,x]
INY
INX
LDA [MetaTileData_Ptr],y ;do 2
STA [ColumnNumX_Ptr,x]
INY
INX
LDA [MetaTileData_Ptr],y ;do 3
STA [ColumnNumY_Ptr,x]
INY
INX
LDA [MetaTileData_Ptr],y ;and finally the 4th byte
STA [ColumnNumY_Ptr,x]
LDA ColumnNumX_Ptr
INC A ;\ We wrote 4 bytes so increase the ptrs accordingly
INC A ; |
STA ColumnNumX_Ptr ; |
LDA ColumnNumY_Ptr ; |
INC A ; |
INC A ;/
STA ColumnNumY_Ptr
RTS
Here are my tables:
Code:
MT_Table:
.db LOW(MetaTileBlock00),LOW(MetaTileBlock01),LOW(MetaTileBlock02),LOW(MetaTileBlock03)
MetaTileBlock00:
.db $23,$23,$23,$23
MetaTileBlock01:
.db $20,$21,$30,$31
MetaTileBlock02:
.db $22,$23,$32,$33
MetaTileBlock03:
.db $01,$01,$01,$01
LevelData:
.db $02,$02,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01
.db LOW(MetaTileBlock00),LOW(MetaTileBlock01),LOW(MetaTileBlock02),LOW(MetaTileBlock03)
MetaTileBlock00:
.db $23,$23,$23,$23
MetaTileBlock01:
.db $20,$21,$30,$31
MetaTileBlock02:
.db $22,$23,$32,$33
MetaTileBlock03:
.db $01,$01,$01,$01
LevelData:
.db $02,$02,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01