diff --git a/graphics/hgr/tiny_triangles/Makefile b/graphics/hgr/tiny_triangles/Makefile index 9f104928..0bd6dc9e 100644 --- a/graphics/hgr/tiny_triangles/Makefile +++ b/graphics/hgr/tiny_triangles/Makefile @@ -8,7 +8,8 @@ EMPTY_DISK = ../../../empty_disk/empty.dsk all: triangles.dsk triangles.dsk: HELLO TINY_TRIANGLES XOR MOD9 MOD9_64 WRITING MOVE_RIGHT \ - SIER_HGR SIER_HPLOT SIER_MOVERIGHT SIER_INLINE RAINBOW_SQUARES + SIER_HGR SIER_HPLOT SIER_MOVERIGHT SIER_INLINE SIER_INTERLACE \ + RAINBOW_SQUARES cp $(EMPTY_DISK) triangles.dsk $(DOS33) -y triangles.dsk SAVE A HELLO $(DOS33) -y triangles.dsk BSAVE -a 0x070 TINY_TRIANGLES @@ -21,6 +22,7 @@ triangles.dsk: HELLO TINY_TRIANGLES XOR MOD9 MOD9_64 WRITING MOVE_RIGHT \ $(DOS33) -y triangles.dsk BSAVE -a 0x300 SIER_INLINE $(DOS33) -y triangles.dsk BSAVE -a 0x300 SIER_MOVERIGHT $(DOS33) -y triangles.dsk BSAVE -a 0x300 SIER_HPLOT + $(DOS33) -y triangles.dsk BSAVE -a 0x300 SIER_INTERLACE $(DOS33) -y triangles.dsk BSAVE -a 0x300 RAINBOW_SQUARES ### @@ -62,6 +64,15 @@ sier_hgr.o: sier_hgr.s ### +SIER_INTERLACE: sier_interlace.o + ld65 -o SIER_INTERLACE sier_interlace.o -C $(LINKER_SCRIPTS)/apple2_300.inc + +sier_interlace.o: sier_interlace.s + ca65 -o sier_interlace.o sier_interlace.s -l sier_interlace.lst + + +### + SIER_INLINE: sier_inline.o ld65 -o SIER_INLINE sier_inline.o -C $(LINKER_SCRIPTS)/apple2_300.inc @@ -129,5 +140,5 @@ move_right.o: move_right.s clean: rm -f *~ *.o *.lst HELLO TINY_TRIANGLES XOR MOD9 MOD9_64 WRITING \ MOVE_RIGHT SIER_HGR SIER_HPLOT SIER_MOVERIGHT \ - SIER_INLINE \ + SIER_INLINE SIER_INTERLACE \ RAINBOW_SQUARES diff --git a/graphics/hgr/tiny_triangles/sier_interlace.s b/graphics/hgr/tiny_triangles/sier_interlace.s new file mode 100644 index 00000000..3a0bd51b --- /dev/null +++ b/graphics/hgr/tiny_triangles/sier_interlace.s @@ -0,0 +1,253 @@ +; sierpinski-like demo +; based on the code from Hellmood's Memories demo + +; by Vince `deater` Weaver + +; the simple sierpinski you more or less just plot +; X AND Y + +; Hellmood's you plot something more or less like +; COLOR = ( (Y-(X*T)) & (X+(Y*T) ) & 0xf0 +; where T is an incrementing frame value + +; to get speed on 6502/Apple II we change the multiplies to +; a series of 16-bit 8.8 fixed point adds + +; TODO: +; HPLOT: roughly 30s / frame +; MOVERIGHT: roughly 14s / frame +; MOVERIGHT NO COLORSHIFT:roughly 11s / frame +; MOVERIGHT MOVEDOWN roughly 11s / frame +; INLINE HPLOT roughly 9s / frame +; INLINE EVERYTHING roughly 7s / frame +; XT/YT lookup tables roughly 6s / frame +; only write 1/7 of time roughly 3s / frame +; only draw 128 lines roughly 2s / frame + +; zero page + +HGR_BITS = $1C +GBASL = $26 +GBASH = $27 +MASK = $2E +COLOR = $30 +HGR_HMASK = $30 +HGR_X = $E0 +HGR_Y = $E2 +HGR_COLOR = $E4 +HGR_HORIZ = $E5 + +SEVEN = $F6 +NEXTCOL = $F7 +XX_TH = $F8 +XX_TL = $F9 +YY = $FA +YY_TH = $FB +YY_TL = $FC +T_L = $FD +T_H = $FE +SAVED = $FF + +; Soft switches +FULLGR = $C052 +PAGE1 = $C054 +PAGE2 = $C055 +LORES = $C056 ; Enable LORES graphics + +; ROM routines +HGR = $F3E2 +HGR2 = $F3D8 +HPOSN = $F411 +HPLOT0 = $F457 +HPLOT1 = $F45A ; skip the HPOSN call +COLOR_SHIFT = $F47E ; shift color for odd/even Y (0..7 or 7..13) +MOVE_RIGHT = $F48A ; move next plot location one to the right +MOVE_DOWN = $F504 ; clc at f504, needed? + ; f505 is applesoft entry point but assumes c? + ; move next plot location one to the right + + ; note moveright/movedown respect HGR_PAGE + +COLORTBL = $F6F6 + +XT_LOOKUP_TABLE = $1000 +YT_LOOKUP_TABLE = $1100 + +;.zeropage +;.globalzp T_L,T_H + + ;================================ + ; Clear screen and setup graphics + ;================================ +sier: + jsr HGR2 ; set FULLGR, sets A=0 + + sta T_L ; start with multiplier 0 + sta T_H + +sier_outer: + + ldx #0 ; get X 0 for later + stx YY ; YY starts at 0 + + ; create XX_T lookup table + ; note, same as YY_T lookup table? + + stx XX_TL ; start at 0 + stx XX_TH + + ; calc XX*T + ; only really care about XX_TH +xt_table_loop: + clc ; 2 + lda XX_TL ; 3 +tl_smc: + adc T_L ; 2 + sta XX_TL ; 3 + lda XX_TH ; 3 +th_smc: + adc T_H ; 3 + sta XX_TH ; 3 + sta YT_LOOKUP_TABLE,X ; 5 + eor #$ff ; negate, as we subtract ; 2 + sta XT_LOOKUP_TABLE,X ; 5 + inx ; 2 + bne xt_table_loop ; 3/2 + + + ; inc T +; clc + lda T_L +speed_smc: + adc #2 + sta T_L + bcc no_carry + inc T_H +no_carry: + + ; speed up the zoom as it goes + inc speed_smc+1 + + ; interlace (start at line 32 or 33) + + lda blah_smc+1 + eor #$4 + sta blah_smc+1 + + lda #$1 ; center + sta GBASL + +blah_smc: + lda #$42 ; start on page2 line 32 ($4200) + sta GBASH + + + +sier_yloop: + + ; GBASH is in A here + +; lda GBASH ; update output pointer + sta gb_smc+2 + + lda GBASL ; adjust so centered + clc + adc #$1 + sta gb_smc+1 + + + + ldx YY ; 3 + stx add_yy_smc+1 ; 4 + lda YT_LOOKUP_TABLE,X ; 4 + sta yy_th_smc+1 ; 4 + + ; reset XX to 0 + + ldx #0 ; XX + +seven_loop: + ldy #7 + +sier_xloop: + + ; want (YY-(XX*T)) & (XX+(YY*T) + + + ; SAVED = XX+(Y*T) + clc ; needed for colors ; 2 + txa ; XX ; 2 +yy_th_smc: + adc #$dd ; 2 + sta SAVED ; 3 + + lda XT_LOOKUP_TABLE,X ; ~(XX*T) ; 4 + ; calc (YY-XX*T) + sec ; 2 +add_yy_smc: + adc #$dd ; 2 + + ; want (YY-(XX*T)) & (XX+(YY*T) + + and SAVED ; 3 + ;============ + ; 20 + + clc ; 2 + beq black ; 2/3 +white: + sec ; 2 +black: + ;===== + ; 5/6 + + + ror NEXTCOL ; rotate in next bit ; 5 + + inx ; increment x ; 2 + + dey ; dec seven count ; 2 + bne sier_xloop ; 2/3 + + ;=========================================================== + + + lda NEXTCOL ; sign extend top bit, ; 3 + cmp #$80 ; matches earlier cool colors ; 2 + ror ; 2 + +gb_smc: + sta $4000 ; 4 + inc gb_smc+1 ; increase GBASL ; 6 + + cpx #248 ; 2 + bcc seven_loop ; 3/2 + + + ;================= + ; total roughly ??? + ; 49152 per inside *80 = 3,145,728 + ; apple II cyles/frame = 17,030 + ; 1FPS = 1,021,800 + + + ;================================== + + jsr MOVE_DOWN ; X/Y left alone + jsr MOVE_DOWN ; X/Y left alone + ; returns with GBASH in A + + inc YY ; + inc YY ; repeat until YY=128 + bpl sier_yloop + +;flip_pages: +; TODO if frame rate ever gets fast enough + + jmp sier_outer ; branch always + + + ; $386, want to be at $3F5 + ; load at $36F??? + +; jmp sier