snake6502/src/levels.asm

174 lines
3.2 KiB
NASM
Raw Permalink Normal View History

2021-11-07 17:14:59 +00:00
SEG zeropageSegment
; Pointer to video memory used in the level loading routine
levelVideoPointer WORD
levelColorPointer WORD
; Pointer to level struct
levelPointer WORD
2021-11-07 17:14:59 +00:00
SEG programSegment
2020-04-02 15:09:57 +00:00
; load new level on the screen
2020-04-08 07:15:25 +00:00
statusLevelTitle SUBROUTINE
2021-04-13 22:30:42 +00:00
jsr multicolorOff
2020-04-08 07:15:25 +00:00
jsr clearScreen
; Print "Next Level"
lda #<levelIntroString
2020-04-08 09:03:03 +00:00
sta srcStringPointer
2020-04-08 07:15:25 +00:00
lda #>levelIntroString
2020-04-08 09:03:03 +00:00
sta srcStringPointer + 1
2020-04-08 07:15:25 +00:00
lda #$00
2020-04-08 09:03:03 +00:00
sta dstScreenPointer
2020-04-08 07:15:25 +00:00
lda #$04
2020-04-08 09:03:03 +00:00
sta dstScreenPointer + 1
jsr printString
2020-04-08 07:15:25 +00:00
; if levels are finished, reset list pointer
ldy #$0
lda (levelPointer),y
bne .continue
lda #<levelsList
sta levelPointer
lda #>levelsList
sta levelPointer + 1
.continue:
2020-04-08 07:15:25 +00:00
; Print level Title
lda levelPointer
2020-04-08 09:03:03 +00:00
sta srcStringPointer
2020-04-08 07:15:25 +00:00
lda levelPointer + 1
2020-04-08 09:03:03 +00:00
sta srcStringPointer + 1
2020-04-08 07:15:25 +00:00
lda #$e2
2020-04-08 09:03:03 +00:00
sta dstScreenPointer
2020-04-08 07:15:25 +00:00
lda #$05
2020-04-08 09:03:03 +00:00
sta dstScreenPointer + 1
jsr printString
2020-04-08 07:15:25 +00:00
; advance level pointer, based on title string length
iny
tya
tax
lda #levelPointer
sta nextPointerPointer
jsr nextPointer
; wait
lda #ST_LEVEL_LOAD
sta delayStatus
lda #ST_DELAY
sta status
rts
statusLevelLoad SUBROUTINE
2021-04-13 22:30:42 +00:00
jsr multicolorOn
2020-04-08 07:15:25 +00:00
; Upper bar -- fill with spaces, color yellow
ldx #39
2020-04-08 08:54:54 +00:00
.loop:
lda #$80
2020-04-08 07:15:25 +00:00
sta $400,x
lda #7
sta $d800,x
dex
cpx #$ff
2020-04-08 08:54:54 +00:00
bne .loop
2020-04-08 07:15:25 +00:00
2020-04-08 08:54:54 +00:00
; Set upper bar score/part text
2020-04-08 07:15:25 +00:00
lda #<scoreString
2020-04-08 09:03:03 +00:00
sta srcStringPointer
2020-04-08 07:15:25 +00:00
lda #>scoreString
2020-04-08 09:03:03 +00:00
sta srcStringPointer + 1
2020-04-08 08:54:54 +00:00
lda #$14
2020-04-08 09:03:03 +00:00
sta dstScreenPointer
2020-04-08 08:54:54 +00:00
lda #$04
2020-04-08 09:03:03 +00:00
sta dstScreenPointer + 1
jsr printString
2020-04-08 08:54:54 +00:00
; Set score
ldy #26
lda score + 1
jsr printByte
ldy #28
lda score
jsr printByte
2020-04-08 07:15:25 +00:00
2020-04-02 15:09:57 +00:00
; 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
ldy #39
sty levelColorPointer
ldy #$d8
sty levelColorPointer + 1
2020-04-02 15:09:57 +00:00
; Level data is compressed with RLE. Array example:
; +---+---+---+---+--..--+---+---+
; | T | N | T | N | .. | 0 | 0 |
; +---+---+---+---+--..--+---+---+
2020-04-02 15:09:57 +00:00
; T tile char
; N count (how many repeated tile chars)
2020-04-02 15:09:57 +00:00
; 0 end of level
writeLevelLoop:
; read `T`
ldy #0
lda (levelPointer),y
sta levelT
; read `N`
iny
lda (levelPointer),y
sta levelN
2020-04-02 15:09:57 +00:00
; increment array pointer
iny
tya
tax
lda #levelPointer
sta nextPointerPointer
jsr nextPointer
; check for array end
lda levelN
cmp #0
beq writeLevelEnd
2020-04-02 15:09:57 +00:00
; retrieve `N` and put in Y
ldy levelN
2020-04-02 15:09:57 +00:00
; unpack char from RLE to the screen
writeLevelElement:
lda levelT
2020-04-02 15:09:57 +00:00
sta (levelVideoPointer),y
; tiles colors can be found in an array
; position in array = tile value - $e0
sec
sbc #$e0
tax
lda tilesColors,x
sta (levelColorPointer),y
dey
bne writeLevelElement
; increment dest video memory pointer
2020-04-02 15:09:57 +00:00
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