2021-11-07 17:14:59 +00:00
|
|
|
SEG zeropageSegment
|
|
|
|
; Pointer to video memory used in the level loading routine
|
|
|
|
levelVideoPointer WORD
|
|
|
|
levelColorPointer WORD
|
2021-11-07 19:35:46 +00:00
|
|
|
; 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
|
|
|
|
2020-04-08 09:36:18 +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:
|
2021-04-12 21:28:34 +00:00
|
|
|
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)
|
2020-04-02 14:17:48 +00:00
|
|
|
ldy #39
|
2020-04-02 15:09:57 +00:00
|
|
|
sty levelVideoPointer
|
2020-04-02 14:17:48 +00:00
|
|
|
ldy #$04
|
2020-04-02 15:09:57 +00:00
|
|
|
sty levelVideoPointer + 1
|
|
|
|
|
2020-04-02 16:12:39 +00:00
|
|
|
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:
|
2020-04-06 20:53:28 +00:00
|
|
|
; +---+---+---+---+--..--+---+---+
|
|
|
|
; | T | N | T | N | .. | 0 | 0 |
|
|
|
|
; +---+---+---+---+--..--+---+---+
|
2020-04-02 15:09:57 +00:00
|
|
|
; T tile char
|
2020-04-02 16:12:39 +00:00
|
|
|
; N count (how many repeated tile chars)
|
2020-04-02 15:09:57 +00:00
|
|
|
; 0 end of level
|
2020-04-02 14:17:48 +00:00
|
|
|
|
|
|
|
writeLevelLoop:
|
2020-04-02 16:12:39 +00:00
|
|
|
; read `T`
|
2020-04-02 14:17:48 +00:00
|
|
|
ldy #0
|
|
|
|
lda (levelPointer),y
|
2020-04-02 16:12:39 +00:00
|
|
|
sta levelT
|
2020-04-02 14:17:48 +00:00
|
|
|
|
2020-04-02 16:12:39 +00:00
|
|
|
; read `N`
|
|
|
|
iny
|
2020-04-02 14:17:48 +00:00
|
|
|
lda (levelPointer),y
|
2020-04-02 16:12:39 +00:00
|
|
|
sta levelN
|
2020-04-02 14:17:48 +00:00
|
|
|
|
2020-04-02 15:09:57 +00:00
|
|
|
; increment array pointer
|
2020-04-02 16:12:39 +00:00
|
|
|
iny
|
|
|
|
tya
|
|
|
|
tax
|
2020-04-02 14:17:48 +00:00
|
|
|
lda #levelPointer
|
|
|
|
sta nextPointerPointer
|
|
|
|
jsr nextPointer
|
|
|
|
|
2020-04-02 16:12:39 +00:00
|
|
|
; check for array end
|
|
|
|
lda levelN
|
2020-04-02 14:17:48 +00:00
|
|
|
cmp #0
|
|
|
|
beq writeLevelEnd
|
2020-04-02 15:09:57 +00:00
|
|
|
|
2020-04-02 16:12:39 +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
|
2020-04-02 14:17:48 +00:00
|
|
|
writeLevelElement:
|
2020-04-02 16:12:39 +00:00
|
|
|
lda levelT
|
2020-04-02 15:09:57 +00:00
|
|
|
sta (levelVideoPointer),y
|
2020-04-06 20:53:28 +00:00
|
|
|
; tiles colors can be found in an array
|
2021-04-12 21:28:34 +00:00
|
|
|
; position in array = tile value - $e0
|
2020-04-06 20:53:28 +00:00
|
|
|
sec
|
2021-04-12 21:28:34 +00:00
|
|
|
sbc #$e0
|
2020-04-06 20:53:28 +00:00
|
|
|
tax
|
|
|
|
lda tilesColors,x
|
2020-04-02 16:12:39 +00:00
|
|
|
sta (levelColorPointer),y
|
2020-04-02 14:17:48 +00:00
|
|
|
dey
|
|
|
|
bne writeLevelElement
|
|
|
|
|
2020-04-02 16:12:39 +00:00
|
|
|
; increment dest video memory pointer
|
2020-04-02 15:09:57 +00:00
|
|
|
lda #levelVideoPointer
|
2020-04-02 14:17:48 +00:00
|
|
|
sta nextPointerPointer
|
2020-04-02 16:12:39 +00:00
|
|
|
ldx levelN
|
2020-04-02 14:17:48 +00:00
|
|
|
jsr nextPointer
|
2020-04-02 16:12:39 +00:00
|
|
|
|
|
|
|
lda #levelColorPointer
|
|
|
|
sta nextPointerPointer
|
|
|
|
ldx levelN
|
|
|
|
jsr nextPointer
|
|
|
|
|
2020-04-02 14:17:48 +00:00
|
|
|
jmp writeLevelLoop
|
|
|
|
|
|
|
|
writeLevelEnd:
|
|
|
|
lda #ST_PLAY
|
|
|
|
sta status
|
|
|
|
rts
|