snake6502/src/levels.asm

82 lines
1.5 KiB
NASM

; load new level on the screen
statusLevelSelect:
; initialize video pointer with first video memory address
; (skip first line, used for the status bar)
ldy #39
sty levelVideoPointer
ldy #$04
sty levelVideoPointer + 1
ldy #39
sty levelColorPointer
ldy #$d8
sty levelColorPointer + 1
; Level data is compressed with RLE. Array example:
; +---+---+---+---+--..--+---+---+
; | T | N | T | N | .. | 0 | 0 |
; +---+---+---+---+--..--+---+---+
; T tile char
; N count (how many repeated tile chars)
; 0 end of level
writeLevelLoop:
; read `T`
ldy #0
lda (levelPointer),y
sta levelT
; read `N`
iny
lda (levelPointer),y
sta levelN
; increment array pointer
iny
tya
tax
lda #levelPointer
sta nextPointerPointer
jsr nextPointer
; check for array end
lda levelN
cmp #0
beq writeLevelEnd
; retrieve `N` and put in Y
ldy levelN
; unpack char from RLE to the screen
writeLevelElement:
lda levelT
sta (levelVideoPointer),y
; tiles colors can be found in an array
; position in array = tile value - $60
sec
sbc #$60
tax
lda tilesColors,x
sta (levelColorPointer),y
dey
bne writeLevelElement
; increment dest video memory pointer
lda #levelVideoPointer
sta nextPointerPointer
ldx levelN
jsr nextPointer
lda #levelColorPointer
sta nextPointerPointer
ldx levelN
jsr nextPointer
jmp writeLevelLoop
writeLevelEnd:
lda #ST_PLAY
sta status
rts