diff --git a/graphics/gr/sier/Makefile b/graphics/gr/sier/Makefile index f14daaf6..172ef711 100644 --- a/graphics/gr/sier/Makefile +++ b/graphics/gr/sier/Makefile @@ -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 diff --git a/graphics/gr/sier/sier.s b/graphics/gr/sier/sier.s index ad14c181..12ca12ef 100644 --- a/graphics/gr/sier/sier.s +++ b/graphics/gr/sier/sier.s @@ -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 diff --git a/graphics/gr/sier/sier_multiply.s b/graphics/gr/sier/sier_multiply.s new file mode 100644 index 00000000..51e9ce6f --- /dev/null +++ b/graphics/gr/sier/sier_multiply.s @@ -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