summaryrefslogtreecommitdiffstats
path: root/hacks/images/m6502/life.asm
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/images/m6502/life.asm')
-rw-r--r--hacks/images/m6502/life.asm127
1 files changed, 127 insertions, 0 deletions
diff --git a/hacks/images/m6502/life.asm b/hacks/images/m6502/life.asm
new file mode 100644
index 0000000..6454812
--- /dev/null
+++ b/hacks/images/m6502/life.asm
@@ -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