; 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