sierpinski: optimize

This commit is contained in:
Vince Weaver 2021-01-31 01:25:34 -05:00
parent de91828502
commit ac2fc918f4
2 changed files with 134 additions and 42 deletions

View File

@ -1,18 +1,16 @@
10 GR
20 FOR X=0 TO 39:FOR Y=0 TO 39
30 YY=Y:XX=(20-X)
80 C1=(YY-(XX*T/256))
85 C2=(YY*T/256+XX)
87 A=C1:B=C2:GOSUB 120
88 C=C-(INT(C/4)*4)
95 COLOR=C:PLOT X,Y
100 NEXT Y,X
110 END
120 C=0
140 FOR S =0 TO 7
150 A = INT(A)/2 : ABIT = ( A-INT(A) ) * 2
160 B = INT(B)/2 : BBIT = ( B-INT(B) ) * 2
170 IF ABIT + BBIT > 1 THEN C = C + 256
180 C = C / 2 : NEXT
190 RETURN
1 GOTO 10
5 SPEED=$)%DEL$LRUSR
10 HGR
20 FOR X=0 TO 256:FOR Y=0 TO 191
40 C1=(Y-(X*T/256))
45 IF C1<0 THEN C1=C1+256
50 C2=(Y*T/256+X)
55 IF C2<0 THEN C2=C2+256
60 POKE 2062,C1
70 POKE 2064,C2:CALL 2061
75 POKE 2062,PEEK(36):POKE 2064,252:CALL 2061
80 HCOLOR=0
85 IF PEEK(36) THEN HCOLOR=1
87 HPLOT X,Y
90 NEXT Y,X
95 T=T+10:GOTO 20

View File

@ -2,9 +2,22 @@
; just plot X AND Y
.include "zp.inc"
;.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
;================================
@ -13,44 +26,125 @@ 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
lda #39*2
sta XX
sier_xloop:
lda #47*2
sta YY
sier_yloop:
; 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
and XX
and #$FE
sec
sbc XX_T
and SAVED
; and #$ff
beq red
black:
lda #00
beq do_color
lda #00 ; black
.byte $2C ; bit trick
red:
lda #$11
do_color:
lda #$11 ; red
sta COLOR
lda XX
lsr
tay
; ldy XX
lda YY
lsr
jsr PLOT1 ; PLOT AT (GBASL),Y
jsr PLOT ; PLOT AT Y,A
dey
bpl sier_xloop
dec YY
bne sier_yloop
bpl sier_yloop
dec XX
bne sier_xloop
inc mul_smc+1
inc mul_smc+1
inc mul_smc+1
inc mul_smc+1
done:
jmp done
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