;; Jeremy English 01-December-2008
;; Snowflakes
;; Main loop Count
lda #7
sta $f
;; pattern number
lda #0
sta $10
;;Cells
lda #$00
sta $4
lda #$10
sta $5
;;Tmp
lda #$00
sta $6
lda #$11
sta $7
;;Init Cells Buffer
;;------------------------------------------------------------
ldy #$ff
initCells:
lda #0
sta ($4),y
sta ($6),y
dey
bne initCells
;;Set start position
ldy #115
lda #1
sta ($4),y
;;Setup offset
lda #15
sta $d
lda #16
sta $e
;;Start of main loop
;;------------------------------------------------------------
mainloop:
;;init indent
;;We want to indent every other line
lda #0
sta $a
lda #0
sta $9
;; Display Cells
;;------------------------------------------------------------
;; 248 is the total number of cells
ldy #248
display:
lda #0
sta $8
lda $a
beq stop16
lda #15
sta $b
lda #1
sta $8
jmp toggle
stop16:
lda #16
sta $b
toggle:
lda $a
eor #1
sta $a
;; Set the stop position
ldx $b
inner_display:
dex
txa
pha
dey
tya
pha
lda ($4),y
beq display_continue
ldx $8
ldy $9
lda #1
jsr paint
ldx $8
ldy $9
inx
jsr paint
ldx $8
ldy $9
iny
jsr paint
ldx $8
ldy $9
inx
iny
jsr paint
display_continue:
inc $8
inc $8
;;Life Cycle
;;------------------------------------------------------------
pla
tay
pha ;;Store y on the stack
tax
dey
lda ($4),y
iny
iny
clc
adc ($4),y
sta $c
txa
sec
sbc $d
tay
lda $c
clc
adc ($4),y
sta $c
txa
sec
sbc $e
tay
lda $c
clc
adc ($4),y
sta $c
txa
clc
adc $d
tay
lda $c
clc
adc ($4),y
sta $c
txa
clc
adc $e
tay
lda $c
clc
adc ($4),y
sta $c
pla
tay ;;Pull Y off of the stack
lda $c
and #1
beq dontset
sta ($6),y
dontset:
pla
tax ;;Pull x off of the stack
beq exit_inner_display
jmp inner_display
exit_inner_display:
inc $9
inc $9
tya
beq display_exit
jmp display
display_exit:
;;Copy Temporary Buffer
;;------------------------------------------------------------
ldy #248
copybuf:
dey
lda ($6),y
sta ($4),y
tya
bne copybuf
dec $f
lda $f
beq reset_main
jmp mainloop
;;Reset main counter
;;------------------------------------------------------------
reset_main:
lda #7
sta $f
lda #$ff ;;Delay Count
sta $11
delay:
ldy #$a0
inner_delay:
nop
dey
bne inner_delay
dec $11
lda $11
bne delay
;; init buffer
;; and clear screen
clrscr:
lda $fe
and $f
cmp #1
beq clrscr ;We don't want a white background
ldy #$00
ldx #$0
cs_loop:
sta $200,x
sta $300,x
sta $400,x
sta $500,x
pha
lda #0
sta ($6),y
sta ($4),y
pla
inx
dey
bne cs_loop
;; Setup new pattern
;;------------------------------------------------------------
inc $10
lda $10
and #3
sta $10
cmp #0
beq pattern1
cmp #1
beq pattern2
cmp #2
beq pattern3
cmp #3
beq pattern4
pattern1:
ldy #114
lda #1
sta ($4),y
ldy #115
lda #1
sta ($4),y
ldy #116
lda #1
sta ($4),y
jmp mainloop
pattern2:
ldy #113
lda #1
sta ($4),y
ldy #118
lda #1
sta ($4),y
jmp mainloop
pattern3:
ldy #115
lda #1
sta ($4),y
jmp mainloop
pattern4:
ldy #102
lda #1
sta ($4),y
ldy #128
lda #1
sta ($4),y
jmp mainloop
;;Paint subroutine
;;------------------------------------------------------------
paint:
pha
lda yl,y
sta $2
lda yh,y
sta $3
txa
tay
pla
sta ($2),y
rts
;; Y cord MSB
yh:
dcb $02, $02, $02, $02, $02, $02, $02, $02
dcb $03, $03, $03, $03, $03, $03, $03, $03
dcb $04, $04, $04, $04, $04, $04, $04, $04
dcb $05, $05, $05, $05, $05, $05, $05, $05
;; Y cord LSB
yl:
dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
dcb $00, $20, $40, $60, $80, $a0, $c0, $e0
dcb $00, $20, $40, $60, $80, $a0, $c0, $e0