sierpinski: roto

This commit is contained in:
Vince Weaver 2021-01-31 13:18:00 -05:00
parent ac2fc918f4
commit 79e68968be
3 changed files with 246 additions and 59 deletions

View File

@ -6,10 +6,11 @@ LINKERSCRIPTS = ../../../linker_scripts
all: sier.dsk
sier.dsk: HELLO SIER
sier.dsk: HELLO SIER SIER_TINY
cp empty.dsk sier.dsk
$(DOS33) -y sier.dsk SAVE A HELLO
$(DOS33) -y sier.dsk BSAVE -a 0x300 SIER
$(DOS33) -y sier.dsk BSAVE -a 0x300 SIER_TINY
###
@ -26,5 +27,14 @@ sier.o: sier.s
###
SIER_TINY: sier_tiny.o
ld65 -o SIER_TINY sier_tiny.o -C $(LINKERSCRIPTS)/apple2_300.inc
sier_tiny.o: sier_tiny.s
ca65 -o sier_tiny.o sier_tiny.s -l sier_tiny.lst
###
clean:
rm -f *~ *.o *.lst HELLO SIER
rm -f *~ *.o *.lst HELLO SIER SIER_TINY

View File

@ -1,5 +1,14 @@
; fake sierpinski
; x=0..39
; T =0 XX_T = 0 .. 0
; T =1 XX_T = 0 .. 39 ($0027)
; T =2 XX_T = 0 .. 78 ($004E)
; T =3 XX_T = 0 .. 117 ($0075)
; T = 128 XX_T = 0 .. 4992 ($1380)
; T = 255 XX_T = 0 .. 9945 ($26D9)
; just plot X AND Y
;.include "zp.inc"
@ -8,15 +17,18 @@
GBASH = $27
MASK = $2E
COLOR = $30
;XX = $F7
XX = $F5
XX_TH = $F6
XX_TL = $F7
YY = $F8
T = $F9
FACTOR1 = $FA
FACTOR2 = $FB
XX_T = $FC
YY_T = $FD
SAVED = $FE
SAVED2 = $FF
YY_TH = $F9
YY_TL = $FA
T_L = $FB
T_H = $FC
FACTOR1 = $FD
FACTOR2 = $FE
SAVED = $FF
;================================
; Clear screen and setup graphics
@ -26,20 +38,37 @@ sier:
jsr SETGR ; set lo-res 40x40 mode
bit FULLGR ; make it 40x48
lda #0 ; start with multiplier 0
sta T_L
sta T_H
sier_outer:
lda #47
lda #0
sta YY
sta YY_TL
sta YY_TH
sier_yloop:
ldy #39
; sta XX
; reset XX to 0
lda #0
sta XX
sta XX_TL
sta XX_TH
; calc YY_T
clc
lda YY_TL
adc T_L
sta YY_TL
lda YY_TH
adc T_H
sta YY_TH
lda YY
sta FACTOR1 ; T already in FACTOR2
lsr
bcc even_mask
@ -52,38 +81,40 @@ set_mask:
jsr GBASCALC ; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear)
jsr multiply ; finally finish mul from earlier
sta YY_T
lda GBASH
draw_page_smc:
adc #0
sta GBASH
sier_xloop:
; want (YY-(XX*T)) & (XX+(YY*T)
; SAVED = XX+(Y*T)
clc
tya ; XX
adc YY_T
; clc
; adc XX
lda XX ; XX
adc YY_TH
sta SAVED
; calc XX_T
sty FACTOR1 ; XX, T already in FACTOR2
jsr multiply
sta XX_T
; calc XX*T
clc
lda XX_TL
adc T_L
sta XX_TL
lda XX_TH
adc T_H
sta XX_TH
; calc (YY-X_T)
lda YY
sec
sbc XX_T
sbc XX_TH
; want (YY-(XX*T)) & (XX+(YY*T)
and SAVED
@ -98,20 +129,28 @@ red:
sta COLOR
; ldy XX
ldy XX
jsr PLOT1 ; PLOT AT (GBASL),Y
dey
bpl sier_xloop
inc XX
lda XX
cmp #40
bne sier_xloop
dec YY
bpl sier_yloop
inc YY
lda YY
cmp #48
bne sier_yloop
inc mul_smc+1
inc mul_smc+1
inc mul_smc+1
inc mul_smc+1
; inc T
clc
lda T_L
adc #1
sta T_L
lda T_H
adc #0
sta T_H
flip_pages:
; X already 0
@ -127,24 +166,3 @@ done_page:
jmp sier_outer
; factors in FACTOR1 and FACTOR2
multiply:
lda #0
ldx #8
lsr FACTOR1
mul_loop:
bcc mul_no_add
clc
mul_smc:
adc #$0 ; T
mul_no_add:
ror
ror FACTOR1
dex
bne mul_loop
; done, high result in A, low result in FACTOR1
; FACTOR2 preserved
rts

View File

@ -0,0 +1,159 @@
; fake sierpinski
; x=0..39
; T =0 XX_T = 0 .. 0
; T =1 XX_T = 0 .. 39 ($0027)
; T =2 XX_T = 0 .. 78 ($0027)
; T =3 XX_T = 0 .. 78 ($0027)
; T = 128 XX_T = 0 .. 4992 ($1380)
; T = 255 XX_T = 0 .. 9945 ($26D9)
; just plot X AND Y
;.include "zp.inc"
.include "hardware.inc"
GBASH = $27
MASK = $2E
COLOR = $30
;XX = $F7
YY = $F8
T = $F9
FACTOR1 = $FA
FACTOR2 = $FB
XX_T = $FC
YY_T = $FD
SAVED = $FE
SAVED2 = $FF
;================================
; Clear screen and setup graphics
;================================
sier:
jsr SETGR ; set lo-res 40x40 mode
bit FULLGR ; make it 40x48
sier_outer:
lda #47
sta YY
sier_yloop:
ldy #39
; sta XX
; calc YY_T
lda YY
sta FACTOR1 ; T already in FACTOR2
lsr
bcc even_mask
ldx #$f0
bne set_mask
even_mask:
ldx #$0f
set_mask:
stx MASK
jsr GBASCALC ; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear)
jsr multiply ; finally finish mul from earlier
sta YY_T
lda GBASH
draw_page_smc:
adc #0
sta GBASH
sier_xloop:
; want (YY-(XX*T)) & (XX+(YY*T)
clc
tya ; XX
adc YY_T
; clc
; adc XX
sta SAVED
; calc XX_T
sty FACTOR1 ; XX, T already in FACTOR2
jsr multiply
sta XX_T
lda YY
sec
sbc XX_T
and SAVED
; and #$ff
beq red
black:
lda #00 ; black
.byte $2C ; bit trick
red:
lda #$11 ; red
sta COLOR
; ldy XX
jsr PLOT1 ; PLOT AT (GBASL),Y
dey
bpl sier_xloop
dec YY
bpl sier_yloop
inc mul_smc+1
inc mul_smc+1
inc mul_smc+1
inc mul_smc+1
flip_pages:
; X already 0
lda draw_page_smc+1 ; DRAW_PAGE
beq done_page
inx
done_page:
ldy PAGE0,X ; set display page to PAGE1 or PAGE2
eor #$4 ; flip draw page between $400/$800
sta draw_page_smc+1 ; DRAW_PAGE
jmp sier_outer
; factors in FACTOR1 and FACTOR2
multiply:
lda #0
ldx #8
lsr FACTOR1
mul_loop:
bcc mul_no_add
clc
mul_smc:
adc #$0 ; T
mul_no_add:
ror
ror FACTOR1
dex
bne mul_loop
; done, high result in A, low result in FACTOR1
; FACTOR2 preserved
rts