X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fimages%2Fm6502%2Flife.asm;fp=hacks%2Fimages%2Fm6502%2Flife.asm;h=645481278980c4e91edc56e9a95add6c72724031;hp=0000000000000000000000000000000000000000;hb=d6b0217f2417bd19187f0ebc389d6c5c2233b11c;hpb=aa75c7476aeaa84cf3abc192b376a8b03c325213 diff --git a/hacks/images/m6502/life.asm b/hacks/images/m6502/life.asm new file mode 100644 index 00000000..64548127 --- /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