From ac2fc918f41e830c0b7887729ae70ca7b094e15f Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sun, 31 Jan 2021 01:25:34 -0500 Subject: [PATCH] sierpinski: optimize --- basic/appleiibot/sierpinski.bas | 34 ++++---- graphics/gr/sier/sier.s | 142 ++++++++++++++++++++++++++------ 2 files changed, 134 insertions(+), 42 deletions(-) diff --git a/basic/appleiibot/sierpinski.bas b/basic/appleiibot/sierpinski.bas index 4ea4f88c..7b1bb346 100644 --- a/basic/appleiibot/sierpinski.bas +++ b/basic/appleiibot/sierpinski.bas @@ -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 diff --git a/graphics/gr/sier/sier.s b/graphics/gr/sier/sier.s index 48bbfd59..ad14c181 100644 --- a/graphics/gr/sier/sier.s +++ b/graphics/gr/sier/sier.s @@ -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