From http://www.jwz.org/xscreensaver/xscreensaver-5.36.tar.gz
[xscreensaver] / hacks / images / m6502 / life.asm
1 ; Conway\'s Game of Life
2 ; http://rosettacode.org/wiki/Conway\'s_Game_of_Life
3 ; Submitted by Anonymous
4
5 randfill:   stx $01          ;$200 for indirect
6             ldx #$02         ;addressing
7             stx $02
8 randloop:   lda $fe          ;generate random
9             and #$01         ;pixels on the
10             sta ($01),Y      ;screen
11             jsr inc0103
12             cmp #$00
13             bne randloop
14             lda $02
15             cmp #$06
16             bne randloop
17  
18  
19 clearmem:   lda #$df         ;set $07df-$0a20
20             sta $01          ;to $#00
21             lda #$07
22             sta $02
23 clearbyte:  lda #$00
24             sta ($01),Y
25             jsr inc0103
26             cmp #$20
27             bne clearbyte
28             lda $02
29             cmp #$0a
30             bne clearbyte
31  
32  
33 starttick:
34 copyscreen: lda #$00         ;set up source
35             sta $01          ;pointer at
36             sta $03          ;$01/$02 and
37             lda #$02         ;dest pointer
38             sta $02          ;at $03/$04
39             lda #$08
40             sta $04
41             ldy #$00
42 copybyte:   lda ($01),Y      ;copy pixel to
43             sta ($03),Y      ;back buffer
44             jsr inc0103      ;increment pointers
45             cmp #$00         ;check to see
46             bne copybyte     ;if we\'re at $600
47             lda $02          ;if so, we\'ve
48             cmp #$06         ;copied the
49             bne copybyte     ;entire screen
50  
51  
52 conway:     lda #$df         ;apply conway rules
53             sta $01          ;reset the pointer
54             sta $03          ;to $#01df/$#07df
55             lda #$01         ;($200 - $21)
56             sta $02          ;($800 - $21)
57             lda #$07
58             sta $04
59 onecell:    lda #$00         ;process one cell
60             ldy #$01         ;upper cell
61             clc
62             adc ($03),Y
63             ldy #$41         ;lower cell
64             clc
65             adc ($03),Y
66 chkleft:    tax              ;check to see
67             lda $01          ;if we\'re at the
68             and #$1f         ;left edge
69             tay
70             txa
71             cpy #$1f
72             beq rightcells
73 leftcells:  ldy #$00         ;upper-left cell
74             clc
75             adc ($03),Y
76             ldy #$20         ;left cell
77             clc
78             adc ($03),Y
79             ldy #$40         ;lower-left cell
80             clc
81             adc ($03),Y
82 chkright:   tax              ;check to see
83             lda $01          ;if we\'re at the
84             and #$1f         ;right edge
85             tay
86             txa
87             cpy #$1e
88             beq evaluate
89 rightcells: ldy #$02         ;upper-right cell
90             clc
91             adc ($03),Y
92             ldy #$22         ;right cell
93             clc
94             adc ($03),Y
95             ldy #$42         ;lower-right cell
96             clc
97             adc ($03),Y
98 evaluate:   ldx #$01         ;evaluate total
99             ldy #$21         ;for current cell
100             cmp #$03         ;3 = alive
101             beq storex
102             ldx #$00
103             cmp #$02         ;2 = alive if
104             bne storex       ;c = alive
105             lda ($03),Y
106             and #$01
107             tax
108 storex:     txa              ;store to screen
109             sta ($01),Y
110             jsr inc0103      ;move to next cell
111 conwayloop: cmp #$e0         ;if not last cell,
112             bne onecell      ;process next cell
113             lda $02
114             cmp #$05
115             bne onecell
116             jmp starttick    ;run next tick
117  
118  
119 inc0103:    lda $01          ;increment $01
120             cmp #$ff         ;and $03 as 16-bit
121             bne onlyinc01    ;pointers
122             inc $02
123             inc $04
124 onlyinc01:  inc $01
125             lda $01
126             sta $03
127             rts