From http://www.jwz.org/xscreensaver/xscreensaver-5.36.tar.gz
[xscreensaver] / hacks / images / m6502 / life.asm
diff --git a/hacks/images/m6502/life.asm b/hacks/images/m6502/life.asm
new file mode 100644 (file)
index 0000000..6454812
--- /dev/null
@@ -0,0 +1,127 @@
+; Conway\'s Game of Life
+; http://rosettacode.org/wiki/Conway\'s_Game_of_Life
+; Submitted by Anonymous
+
+randfill:   stx $01          ;$200 for indirect
+            ldx #$02         ;addressing
+            stx $02
+randloop:   lda $fe          ;generate random
+            and #$01         ;pixels on the
+            sta ($01),Y      ;screen
+            jsr inc0103
+            cmp #$00
+            bne randloop
+            lda $02
+            cmp #$06
+            bne randloop
+clearmem:   lda #$df         ;set $07df-$0a20
+            sta $01          ;to $#00
+            lda #$07
+            sta $02
+clearbyte:  lda #$00
+            sta ($01),Y
+            jsr inc0103
+            cmp #$20
+            bne clearbyte
+            lda $02
+            cmp #$0a
+            bne clearbyte
+starttick:
+copyscreen: lda #$00         ;set up source
+            sta $01          ;pointer at
+            sta $03          ;$01/$02 and
+            lda #$02         ;dest pointer
+            sta $02          ;at $03/$04
+            lda #$08
+            sta $04
+            ldy #$00
+copybyte:   lda ($01),Y      ;copy pixel to
+            sta ($03),Y      ;back buffer
+            jsr inc0103      ;increment pointers
+            cmp #$00         ;check to see
+            bne copybyte     ;if we\'re at $600
+            lda $02          ;if so, we\'ve
+            cmp #$06         ;copied the
+            bne copybyte     ;entire screen
+conway:     lda #$df         ;apply conway rules
+            sta $01          ;reset the pointer
+            sta $03          ;to $#01df/$#07df
+            lda #$01         ;($200 - $21)
+            sta $02          ;($800 - $21)
+            lda #$07
+            sta $04
+onecell:    lda #$00         ;process one cell
+            ldy #$01         ;upper cell
+            clc
+            adc ($03),Y
+            ldy #$41         ;lower cell
+            clc
+            adc ($03),Y
+chkleft:    tax              ;check to see
+            lda $01          ;if we\'re at the
+            and #$1f         ;left edge
+            tay
+            txa
+            cpy #$1f
+            beq rightcells
+leftcells:  ldy #$00         ;upper-left cell
+            clc
+            adc ($03),Y
+            ldy #$20         ;left cell
+            clc
+            adc ($03),Y
+            ldy #$40         ;lower-left cell
+            clc
+            adc ($03),Y
+chkright:   tax              ;check to see
+            lda $01          ;if we\'re at the
+            and #$1f         ;right edge
+            tay
+            txa
+            cpy #$1e
+            beq evaluate
+rightcells: ldy #$02         ;upper-right cell
+            clc
+            adc ($03),Y
+            ldy #$22         ;right cell
+            clc
+            adc ($03),Y
+            ldy #$42         ;lower-right cell
+            clc
+            adc ($03),Y
+evaluate:   ldx #$01         ;evaluate total
+            ldy #$21         ;for current cell
+            cmp #$03         ;3 = alive
+            beq storex
+            ldx #$00
+            cmp #$02         ;2 = alive if
+            bne storex       ;c = alive
+            lda ($03),Y
+            and #$01
+            tax
+storex:     txa              ;store to screen
+            sta ($01),Y
+            jsr inc0103      ;move to next cell
+conwayloop: cmp #$e0         ;if not last cell,
+            bne onecell      ;process next cell
+            lda $02
+            cmp #$05
+            bne onecell
+            jmp starttick    ;run next tick
+inc0103:    lda $01          ;increment $01
+            cmp #$ff         ;and $03 as 16-bit
+            bne onlyinc01    ;pointers
+            inc $02
+            inc $04
+onlyinc01:  inc $01
+            lda $01
+            sta $03
+            rts