Skip to content

Instantly share code, notes, and snippets.

@vk2gpu
Created September 15, 2019 07:44
Show Gist options
  • Save vk2gpu/db97dc6095574f1d4733e4d27ef3cb24 to your computer and use it in GitHub Desktop.
Save vk2gpu/db97dc6095574f1d4733e4d27ef3cb24 to your computer and use it in GitHub Desktop.
Commander x16 Fire Demo
!src "vera.inc"
SCREEN_WIDTH = 80
SCREEN_HEIGHT = 60
; Zero page
LOOP_X = $00
LOOP_Y = $01
RAND_SEED_LO = $02
RAND_SEED_HI = $03
CURSOR_X_LO = $10
CURSOR_X_HI = $11
CURSOR_Y_LO = $12
CURSOR_Y_HI = $13
PIXEL_CACHE = $20 ; $21
VERA_LO = $80
VERA_MI = $81
VERA_HI = $82
TEMP_A = $8C
TEMP_B = $8D
TEMP_C = $8E
TEMP_D = $8F
*=$0801
!byte $0b,$08,$01,$00,$9e,$32,$30,$36,$31,$00,$00,$00
+video_init
; Set pointer to layer 1 registers, increment of 1
lda #$14
sta verahi
lda #$00
sta veramid
sta veralo
; Setup mode 7 stuff.
lda #7 << 5 | 1; // mode=7, enabled=1
sta veradat ; 0
; ignore
sta veradat ; 1
; ignore
sta veradat ; 2
; ignore
sta veradat ; 3
lda #(0 >> 2) & 0xff; // map_base
sta veradat; 4
lda #0 >> 10;
sta veradat ; 5
; Display composer, setup scaling.
lda #$41
sta veralo
lda #16
sta veradat ; hscale=8x
sta veradat ; vscale=8x
lda #00
sta veradat ; bordercolor
; Setup pixel cache in fixed RAM
lda #$00
sta PIXEL_CACHE
lda #$90
sta PIXEL_CACHE+1
; Palette.
jsr createPalette
; Clear screen
jsr clearScreen
mainLoop:
; Write fire row in place.
jsr writeFireRow
; Set row to top
lda #$00
sta VERA_HI
lda #$00
sta VERA_MI
lda #$00
sta VERA_LO
lda #SCREEN_HEIGHT
sta LOOP_Y
_loop1_mainLoop:
jsr updateRow
jsr veraForward320
dec LOOP_Y
bne _loop1_mainLoop:
jmp mainLoop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
updateRow:
jsr veraForward320
jsr veraSetCursor
ldy #SCREEN_WIDTH
_loop1_updateRows:
lda veradat
sta (PIXEL_CACHE),Y
dey
bne _loop1_updateRows
; Move back to row above and calculate new value.
jsr veraBackward320
jsr veraSetCursor
; first column zero
lda #$00
sta veradat
ldy #SCREEN_WIDTH
dey
dey
_loop2_updateRows:
lda (PIXEL_CACHE),Y
sta TEMP_A
iny
lda (PIXEL_CACHE),Y
sta TEMP_B
sta TEMP_C
iny
lda (PIXEL_CACHE),Y
sta TEMP_D
lda TEMP_A
adc TEMP_B
adc TEMP_C
adc TEMP_D
lsr
lsr
sta veradat
dey
dey
dey
bne _loop2_updateRows
; last column zero
lda #$00
sta veradat
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
writeFireRow:
; Set row to bottom.
lda #$00
sta VERA_HI
lda #$49
sta VERA_MI
lda #$C0
sta VERA_LO
jsr veraSetCursor
lda #SCREEN_WIDTH
sta LOOP_X
_loop_writeFireRow:
lda RAND_SEED_LO
adc #$21
ror
sta RAND_SEED_LO
lda RAND_SEED_HI
rol
adc #$12
sta RAND_SEED_HI
eor RAND_SEED_LO
adc 1
sta RAND_SEED_LO
lsr
lsr
clc
sta veradat
dec LOOP_X
bne _loop_writeFireRow
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
createPalette:
lda #$14
sta verahi
lda #$02
sta veramid
lda #$00
sta veralo
ldy #00
_loop1_createPalette:
; ggggbbbb
tya
and #$f0
sta veradat
; TEMP_B : ----rrrr
tya
lsr
lsr
sta veradat
iny
bne _loop1_createPalette
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
clearScreen:
lda #$00
sta VERA_HI
sta VERA_MI
sta VERA_LO
lda #SCREEN_HEIGHT
sta LOOP_Y
_beginRow_clearScreen:
lda #SCREEN_WIDTH
sta LOOP_X
; set position
jsr veraSetCursor
jsr veraForward320
_beginCol_clearScreen:
lda #$00
sta veradat
dec LOOP_X
bne _beginCol_clearScreen:
dec LOOP_Y
bne _beginRow_clearScreen:
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
veraForward320:
clc
lda VERA_LO
adc #64
sta VERA_LO
lda VERA_MI
adc #1
sta VERA_MI
lda VERA_HI
adc #0
sta VERA_HI
rts
veraBackward320:
sec
lda VERA_LO
sbc #64
sta VERA_LO
lda VERA_MI
sbc #1
sta VERA_MI
lda VERA_HI
sbc #0
sta VERA_HI
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
veraSetCursor:
lda VERA_HI
ora #$10
sta verahi
lda VERA_MI
sta veramid
lda VERA_LO
sta veralo
rts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment