snake6502/src/levels.asm

69 lines
1.3 KiB
NASM
Raw Normal View History

2020-04-02 15:09:57 +00:00
; 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
2020-04-02 15:09:57 +00:00
sty levelVideoPointer
ldy #$04
2020-04-02 15:09:57 +00:00
sty levelVideoPointer + 1
; Level data is compressed with RLE. Array example:
; +---+---+---+---+---+-..-+---+---+
; | T | C | T | C | . | | 0 | 0 |
; +---+---+---+---+---+-..-+---+---+
; T tile char
; C count (how many repeated tile chars)
; 0 end of level
writeLevelLoop:
2020-04-02 15:09:57 +00:00
; read `T`, and save onto stack
ldy #0
lda (levelPointer),y
pha
2020-04-02 15:09:57 +00:00
; increment array pointer
lda #levelPointer
sta nextPointerPointer
ldx #1
jsr nextPointer
2020-04-02 15:09:57 +00:00
; read `C`, and save onto stack
ldy #0
lda (levelPointer),y
pha
2020-04-02 15:09:57 +00:00
; increment array pointer
lda #levelPointer
sta nextPointerPointer
ldx #1
jsr nextPointer
2020-04-02 15:09:57 +00:00
; retrieve `C` from stack and put in X and Y
pla
tay
tax
2020-04-02 15:09:57 +00:00
; retrieve `T` from stack
pla
2020-04-02 15:09:57 +00:00
; check array end
cmp #0
beq writeLevelEnd
2020-04-02 15:09:57 +00:00
; unpack char from RLE to the screen
writeLevelElement:
2020-04-02 15:09:57 +00:00
sta (levelVideoPointer),y
dey
bne writeLevelElement
2020-04-02 15:09:57 +00:00
lda #levelVideoPointer
sta nextPointerPointer
2020-04-02 15:09:57 +00:00
; reg X is still holding the original `C`
jsr nextPointer
jmp writeLevelLoop
writeLevelEnd:
lda #ST_PLAY
sta status
rts