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

View File

@ -2,9 +2,22 @@
; just plot X AND Y ; just plot X AND Y
.include "zp.inc" ;.include "zp.inc"
.include "hardware.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 ; Clear screen and setup graphics
;================================ ;================================
@ -13,44 +26,125 @@ sier:
jsr SETGR ; set lo-res 40x40 mode jsr SETGR ; set lo-res 40x40 mode
bit FULLGR ; make it 40x48 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: sier_xloop:
lda #47*2 ; want (YY-(XX*T)) & (XX+(YY*T)
sta YY
sier_yloop: 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 lda YY
and XX sec
and #$FE sbc XX_T
and SAVED
; and #$ff
beq red beq red
black: black:
lda #00 lda #00 ; black
beq do_color .byte $2C ; bit trick
red: red:
lda #$11 lda #$11 ; red
do_color:
sta COLOR sta COLOR
lda XX ; ldy XX
lsr
tay
lda YY jsr PLOT1 ; PLOT AT (GBASL),Y
lsr
jsr PLOT ; PLOT AT Y,A dey
bpl sier_xloop
dec YY dec YY
bne sier_yloop bpl sier_yloop
dec XX inc mul_smc+1
bne sier_xloop inc mul_smc+1
inc mul_smc+1
inc mul_smc+1
done: flip_pages:
jmp done ; 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