summaryrefslogtreecommitdiffstats
path: root/hacks/images/m6502/sierpinsky.asm
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/images/m6502/sierpinsky.asm')
-rw-r--r--hacks/images/m6502/sierpinsky.asm131
1 files changed, 131 insertions, 0 deletions
diff --git a/hacks/images/m6502/sierpinsky.asm b/hacks/images/m6502/sierpinsky.asm
new file mode 100644
index 0000000..6a67906
--- /dev/null
+++ b/hacks/images/m6502/sierpinsky.asm
@@ -0,0 +1,131 @@
+; 6502 assembler Sierpinsky Triangle ver.2
+; by Magnus Wedmark 2007-05-02
+; This program is especially written for
+; the 6502asm.com competition and
+; uses the 32*32 pixel display used in that
+; virtual platform. The sierpinsky
+; fractal is one of the simplest to
+; implement. Here is a walk-through:
+; 1) Specify 3 points that form a triangle
+; 2) Choose one of them as a starting point
+; 3) Choose one of them as targetpoint randomly
+; 4) Set the new current position half-way
+; between the current point and the target
+; point.
+; 5) Goto 3
+
+ LDX #0
+ LDY #0
+new_rnd:
+ LDA $FE ; random 0-255
+ AND #3 ; only 0-3 left
+ CMP #3
+ BNE good_rnd
+ JMP new_rnd
+good_rnd:
+; random = 0-2
+ PHA
+; transform X and Y values according to:
+; X=X/2+(P*8) and Y=Y/2+(P*16)
+ ASL
+ ASL
+ ASL
+ STA $F3 ; P*8
+ PLA
+ AND #1
+ ASL
+ ASL
+ ASL
+ ASL
+ STA $F4 ; (P AND 1)*16
+ TXA
+ LSR
+ ADC $F3
+ TAX
+ TYA
+ LSR
+ ADC $F4
+ TAY
+ JSR set_point ; use and restore regs
+ JMP new_rnd
+
+set_point: ; uses both X,Y,A and restores them
+ PHA ; backup all reg-value (X,Y,A)
+ TXA
+ PHA
+ TYA
+ PHA
+ PHA
+ PHA ; triple Y push, two for int. use
+ STX $F2 ; transfer X to Y using $F2
+ LDY $F2
+ LDA #0
+ STA $F0
+ LDA #$2
+ STA $F1 ; set base vector to $200
+ LDA #0
+ PLA ; transfer the pushed Y-coord to A
+ AND #$07 ; the value %0000'0111
+ ASL
+ ASL
+ ASL
+ ASL
+ ASL
+ CLC
+ ADC $F0
+ STA $F0
+ BCC no_carry
+ INC $F1
+no_carry:
+ CLC
+ PLA ; transfer the pushed Y-coord to A
+ AND #$18
+ LSR
+ LSR
+ LSR
+ ADC $F1
+ STA $F1
+
+ CLC
+ TYA
+ ADC $F0
+ ADC $F1
+
+ LDA #1 ;1 = white for trouble-shooting
+ JSR set_toning_point ; use for shading
+ STA ($F0),Y ; set pixel
+ PLA ; restore all reg-value (X,Y,A)
+ TAY
+ PLA
+ TAX
+ PLA
+ RTS
+
+; sub routine to shade the current pixel ($F0),Y
+; lighter on a scale: $0, $B, $C, $F, $1
+; Black, DarkGrey, Grey, LightGrey, White
+set_toning_point:
+ LDA ($F0),Y
+ CMP #$00
+ BNE not_black
+ LDA #$0B
+ RTS
+not_black:
+ CMP #$0B
+ BNE not_dgrey
+ LDA #$0C
+ RTS
+not_dgrey:
+ CMP #$0C
+ BNE not_grey
+ LDA #$0F
+ RTS
+not_grey:
+ CMP #$0F
+ BNE not_lgrey
+ LDA #$01
+ RTS
+not_lgrey:
+; white stays white
+ RTS
+