From ecaa560381d57ca6cd4eda8fe18c927927464428 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 26 Oct 2021 15:05:14 -0400 Subject: [PATCH] plasma: more attempts --- graphics/hgr/plasma/Makefile | 34 ++- graphics/hgr/plasma/mirror.s | 191 +++++++++++++ graphics/hgr/plasma/moving.s | 191 +++++++++++++ .../hgr/plasma/{oval_bot.s => oval_flip.s} | 0 graphics/hgr/plasma/oval_unopt.s | 137 ++++++++++ graphics/hgr/plasma/rom_sine.s | 256 ++++++++++++++++++ utils/gr-sim/hgr/Makefile | 22 +- utils/gr-sim/hgr/plasma_test.c | 93 +++++++ utils/gr-sim/hgr/plasma_test64.c | 93 +++++++ 9 files changed, 1008 insertions(+), 9 deletions(-) create mode 100644 graphics/hgr/plasma/mirror.s create mode 100644 graphics/hgr/plasma/moving.s rename graphics/hgr/plasma/{oval_bot.s => oval_flip.s} (100%) create mode 100644 graphics/hgr/plasma/oval_unopt.s create mode 100644 graphics/hgr/plasma/rom_sine.s create mode 100644 utils/gr-sim/hgr/plasma_test.c create mode 100644 utils/gr-sim/hgr/plasma_test64.c diff --git a/graphics/hgr/plasma/Makefile b/graphics/hgr/plasma/Makefile index 112052c3..e745f9cb 100644 --- a/graphics/hgr/plasma/Makefile +++ b/graphics/hgr/plasma/Makefile @@ -7,7 +7,8 @@ EMPTYDISK = ../../../empty_disk/empty.dsk all: plasma_hgr.dsk -plasma_hgr.dsk: HELLO OVAL PURPLE_WAVES ZEBRA JAWS TWIST OVAL_BOT +plasma_hgr.dsk: HELLO OVAL PURPLE_WAVES ZEBRA JAWS TWIST OVAL_FLIP MOVING \ + MIRROR cp $(EMPTYDISK) plasma_hgr.dsk $(DOS33) -y plasma_hgr.dsk SAVE A HELLO $(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 OVAL @@ -15,7 +16,9 @@ plasma_hgr.dsk: HELLO OVAL PURPLE_WAVES ZEBRA JAWS TWIST OVAL_BOT $(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 ZEBRA $(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 JAWS $(DOS33) -y plasma_hgr.dsk BSAVE -a 0xc00 TWIST - $(DOS33) -y plasma_hgr.dsk BSAVE -a 0x3F5 OVAL_BOT + $(DOS33) -y plasma_hgr.dsk BSAVE -a 0x3F5 OVAL_FLIP + $(DOS33) -y plasma_hgr.dsk BSAVE -a 0x3F5 MOVING + $(DOS33) -y plasma_hgr.dsk BSAVE -a 0x3F5 MIRROR ### @@ -32,11 +35,28 @@ oval.o: oval.s ### -OVAL_BOT: oval_bot.o - ld65 -o OVAL_BOT oval_bot.o -C $(LINKERSCRIPTS)/apple2_3f5.inc +OVAL_FLIP: oval_flip.o + ld65 -o OVAL_FLIP oval_flip.o -C $(LINKERSCRIPTS)/apple2_3f5.inc + +oval_flip.o: oval_flip.s + ca65 -o oval_flip.o oval_flip.s -l oval_flip.lst + +### + +MOVING: moving.o + ld65 -o MOVING moving.o -C $(LINKERSCRIPTS)/apple2_3f5.inc + +moving.o: moving.s + ca65 -o moving.o moving.s -l moving.lst + +### + +MIRROR: mirror.o + ld65 -o MIRROR mirror.o -C $(LINKERSCRIPTS)/apple2_3f5.inc + +mirror.o: mirror.s + ca65 -o mirror.o mirror.s -l mirror.lst -oval_bot.o: oval_bot.s - ca65 -o oval_bot.o oval_bot.s -l oval_bot.lst ### @@ -76,5 +96,5 @@ purple_waves.o: purple_waves.s ### clean: - rm -f *~ *.o *.lst OVAL PURPLE_WAVES ZEBRA JAWS TWIST OVAL_BOT + rm -f *~ *.o *.lst OVAL PURPLE_WAVES ZEBRA JAWS TWIST OVAL_FLIP diff --git a/graphics/hgr/plasma/mirror.s b/graphics/hgr/plasma/mirror.s new file mode 100644 index 00000000..fed3bc3e --- /dev/null +++ b/graphics/hgr/plasma/mirror.s @@ -0,0 +1,191 @@ +; Moving +; moving, orange and green + + +; zero page +GBASL = $26 +GBASH = $27 +YY = $69 +ROW_SUM = $70 + +HGR_X = $E0 +HGR_XH = $E1 +HGR_Y = $E2 +HGR_COLOR = $E4 +HGR_PAGE = $E6 + +FRAME = $FC +SUM = $FD +SAVEX = $FE +SAVEY = $FF + +; soft-switches +FULLGR = $C052 +PAGE1 = $C054 + +; ROM routines + +HGR2 = $F3D8 +HPOSN = $F411 ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ;================================ + ; Clear screen and setup graphics + ;================================ +oval: + + jsr HGR2 ; set hi-res 140x192, page2, fullscreen + ; A and Y both 0 at end + ;================== + ; create sinetable + + ;ldy #0 ; Y is 0 +sinetable_loop: + tya ; 2 + and #$3f ; wrap sine at 63 entries ; 2 + + cmp #$20 + php ; save pos/negative for later + + and #$1f + + cmp #$10 + bcc sin_left ; blt + +sin_right: + ; sec carry should be set here + eor #$FF + adc #$20 ; 32-X +sin_left: + tax + lda sinetable_base,X ; 4+ + + plp + bcc sin_done + +sin_negate: + ; carry set here + eor #$ff + adc #0 + +sin_done: + sta sinetable,Y + + iny + bne sinetable_loop + + + ; NOTE: making gbash/gbasl table wasn't worth it + + ;============================ + ; main loop + ;============================ + +draw_oval: + inc FRAME + + lda #191 ; YY + +create_yloop: + ; HGR_Y (YY) is in A here + +; ldx #39 ; X is don't care? + ldy #0 + + jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ; restore values + + lda HGR_Y ; YY + +calcsine_div4: + lsr + lsr ; 2 + sec + sbc FRAME + tax + lda sinetable,X + sta row_sum_smc+1 + + ldx HGR_Y ; YY + + ldy #39 ; XX +create_xloop: + + ;===================== + ; critical inner loop + ; every cycle here is 40x192 cycles + ;===================== + +; clc + tya + adc FRAME + tax + lda sinetable,X + + adc sinetable,Y ; 4+ +row_sum_smc: + adc #$dd ; row base value ; 2 + + lsr ; double colors ; 2 + ; also puts bit in carry + ; which helps proper color gen + + tax ; 2 + lda colorlookup,X ; lookup in table ; 5 + +ror_nop_smc: + ror ; $6A/$EA ; 2 + sta (GBASL),Y ; 6 + + lda ror_nop_smc ; toggle ror/nop ; 4 + eor #$80 ; 2 + sta ror_nop_smc ; 4 + + dey ; 2 + bpl create_xloop ; 2/3 + + dec HGR_Y + lda HGR_Y + cmp #$ff ; blah want to draw line 0 + bne create_yloop + +flip_pages: + + ; Y should be $FF here + + lda HGR_PAGE ; will be $20/$40 + cmp #$20 + bne done_page + dey +done_page: + ldx PAGE1-$FE,Y ; set display page to PAGE1 or PAGE2 + + eor #$60 ; flip draw page between $2000/$4000 + sta HGR_PAGE + + bne draw_oval ; bra + + +colorlookup: +.byte $22,$aa,$ba,$ff,$ba,$aa,$22 ; use 00 from sinetable +;.byte $00 + +;.byte $11,$55,$5d,$7f,$5d,$55,$11 ; use 00 from sinetable +;.byte $00 + + +;sinetable_base = $F5BA + +sinetable_base: +; this is actually (32*sin(x)) +.byte $00,$03,$06,$09,$0C,$0F,$11,$14 +.byte $16,$18,$1A,$1C,$1D,$1E,$1F,$1F +.byte $20 + + ; for bot + ; 3F5 - 7d = 378 +; jmp oval + +sinetable=$6000 + + diff --git a/graphics/hgr/plasma/moving.s b/graphics/hgr/plasma/moving.s new file mode 100644 index 00000000..c56812ff --- /dev/null +++ b/graphics/hgr/plasma/moving.s @@ -0,0 +1,191 @@ +; Moving +; moving, orange and green + + +; zero page +GBASL = $26 +GBASH = $27 +YY = $69 +ROW_SUM = $70 + +HGR_X = $E0 +HGR_XH = $E1 +HGR_Y = $E2 +HGR_COLOR = $E4 +HGR_PAGE = $E6 + +FRAME = $FC +SUM = $FD +SAVEX = $FE +SAVEY = $FF + +; soft-switches +FULLGR = $C052 +PAGE1 = $C054 + +; ROM routines + +HGR2 = $F3D8 +HPOSN = $F411 ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ;================================ + ; Clear screen and setup graphics + ;================================ +oval: + + jsr HGR2 ; set hi-res 140x192, page2, fullscreen + ; A and Y both 0 at end + ;================== + ; create sinetable + + ;ldy #0 ; Y is 0 +sinetable_loop: + tya ; 2 + and #$3f ; wrap sine at 63 entries ; 2 + + cmp #$20 + php ; save pos/negative for later + + and #$1f + + cmp #$10 + bcc sin_left ; blt + +sin_right: + ; sec carry should be set here + eor #$FF + adc #$20 ; 32-X +sin_left: + tax + lda sinetable_base,X ; 4+ + + plp + bcc sin_done + +sin_negate: + ; carry set here + eor #$ff +; adc #0 ; FIXME: this makes things off by 1 + +sin_done: + sta sinetable,Y + + iny + bne sinetable_loop + + + ; NOTE: making gbash/gbasl table wasn't worth it + + ;============================ + ; main loop + ;============================ + +draw_oval: + inc FRAME + + lda #191 ; YY + +create_yloop: + ; HGR_Y (YY) is in A here + +; ldx #39 ; X is don't care? +; ldy #0 ; Y is also don't care? + + jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ; restore values + + lda HGR_Y ; YY + +calcsine_div4: + lsr + lsr ; 2 + sec + sbc FRAME + tax + lda sinetable,X + sta row_sum_smc+1 + + ldx HGR_Y ; YY + + ldy #39 ; XX +create_xloop: + + ;===================== + ; critical inner loop + ; every cycle here is 40x192 cycles + ;===================== + + clc + tya + adc FRAME + tax + lda sinetable,X + + adc sinetable,Y ; 4+ +row_sum_smc: + adc #$dd ; row base value ; 2 + + lsr ; double colors ; 2 + ; also puts bit in carry + ; which helps proper color gen + and #$7 ; 2 + tax ; 2 + lda colorlookup,X ; lookup in table ; 5 + +ror_nop_smc: + ror ; $6A/$EA ; 2 + sta (GBASL),Y ; 6 + + lda ror_nop_smc ; toggle ror/nop ; 4 + eor #$80 ; 2 + sta ror_nop_smc ; 4 + + dey ; 2 + bpl create_xloop ; 2/3 + + dec HGR_Y + lda HGR_Y + cmp #$ff ; blah want to draw line 0 + bne create_yloop + +flip_pages: + + ; Y should be $FF here + + lda HGR_PAGE ; will be $20/$40 + cmp #$20 + bne done_page + dey +done_page: + ldx PAGE1-$FE,Y ; set display page to PAGE1 or PAGE2 + + eor #$60 ; flip draw page between $2000/$4000 + sta HGR_PAGE + + bne draw_oval ; bra + + +colorlookup: +.byte $22,$aa,$ba,$ff,$ba,$aa,$22 ; use 00 from sinetable +;.byte $00 + +;.byte $11,$55,$5d,$7f,$5d,$55,$11 ; use 00 from sinetable +;.byte $00 + + +;sinetable_base = $F5BA + +sinetable_base: +; this is actually (32*sin(x)) +.byte $00,$03,$06,$09,$0C,$0F,$11,$14 +.byte $16,$18,$1A,$1C,$1D,$1E,$1F,$1F +.byte $20 + + ; for bot + ; 3F5 - 7d = 378 +; jmp oval + +sinetable=$6000 + + diff --git a/graphics/hgr/plasma/oval_bot.s b/graphics/hgr/plasma/oval_flip.s similarity index 100% rename from graphics/hgr/plasma/oval_bot.s rename to graphics/hgr/plasma/oval_flip.s diff --git a/graphics/hgr/plasma/oval_unopt.s b/graphics/hgr/plasma/oval_unopt.s new file mode 100644 index 00000000..a2226a41 --- /dev/null +++ b/graphics/hgr/plasma/oval_unopt.s @@ -0,0 +1,137 @@ +; Ovals + +; zero page +GBASL = $26 +GBASH = $27 +YY = $69 +ROW_SUM = $70 + +HGR_X = $E0 +HGR_XH = $E1 +HGR_Y = $E2 +HGR_COLOR = $E4 +HGR_PAGE = $E6 + +FRAME = $FC +SUM = $FD +SAVEX = $FE +SAVEY = $FF + +; soft-switches +FULLGR = $C052 +PAGE1 = $C054 + +; ROM routines + +HGR2 = $F3D8 +HPOSN = $F411 ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ;================================ + ; Clear screen and setup graphics + ;================================ +oval: + + jsr HGR2 ; set hi-res 140x192, page2, fullscreen + +draw_oval: + inc FRAME + + ldx #191 ; YY + stx HGR_Y + +create_yloop: + lda HGR_Y + ldx #39 + ldy #0 + + jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ; restore values + + ldy #39 ; XX + + lda FRAME + sta ROW_SUM + + lda HGR_Y ; YY + jsr calcsine_div2 + + ldx HGR_Y ; YY + + sta ROW_SUM + +create_xloop: + + tya ; XX ; 2 + jsr calcsine ; 6 + + lsr ; double colors ; 2 + and #$7 ; mask ; 2 + tax ; 2 + lda colorlookup,X ; lookup in table ; 5 + sta SAVEY ; save for later ; 3 + + tya ; 2 + ror ; 2 + bcc noshift ; 2/3 + ror SAVEY ; 5 +noshift: + lda SAVEY ; 3 +; and #$7f + sta (GBASL),Y ; 6 + + dey ; 2 + bpl create_xloop ; 2/3 + + dec HGR_Y + bne create_yloop + + ; X and Y both $FF + + beq draw_oval + + + ;============================== + ; calcsine + ;============================== + ; looks up sine of value in A + ; accumulates it with ROW_SUM + ; returns result in A + ; Y preserved + +calcsine_div2: + lsr ; 2 +calcsine: + and #$3f ; wrap sine at 63 entries ; 2 + + tax ; 2 + cmp #$20 ; see if negative ; 2 + bcc sinadd ; 2/3 + +sinsub: + ; carry already set + lda ROW_SUM ; 3 + sbc sinetable-32,X ; 4+ + jmp sindone ; 3 + +sinadd: + ; carry already clear + lda ROW_SUM ; 3 + adc sinetable,X ; 4+ + +sindone: + rts ; 6 + + +colorlookup: + +.byte $11,$55,$5d,$7f,$5d,$55,$11 ; use 00 from sinetable +;.byte $00 + +sinetable: +; this is actually (32*sin(x)) + +.byte $00,$03,$06,$09,$0C,$0F,$11,$14 +.byte $16,$18,$1A,$1C,$1D,$1E,$1F,$1F +.byte $20,$1F,$1F,$1E,$1D,$1C,$1A,$18 +.byte $16,$14,$11,$0F,$0C,$09,$06,$03 diff --git a/graphics/hgr/plasma/rom_sine.s b/graphics/hgr/plasma/rom_sine.s new file mode 100644 index 00000000..2c3e2db6 --- /dev/null +++ b/graphics/hgr/plasma/rom_sine.s @@ -0,0 +1,256 @@ +; Moving +; moving, orange and green + + +; zero page +GBASL = $26 +GBASH = $27 +YY = $69 +ROW_SUM = $70 + +HGR_X = $E0 +HGR_XH = $E1 +HGR_Y = $E2 +HGR_COLOR = $E4 +HGR_PAGE = $E6 + +FRAME = $FC +SUM = $FD +SAVEX = $FE +SAVEY = $FF + +; soft-switches +FULLGR = $C052 +PAGE1 = $C054 + +; ROM routines + +HGR2 = $F3D8 +HPOSN = $F411 ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ;================================ + ; Clear screen and setup graphics + ;================================ +oval: + + jsr HGR2 ; set hi-res 140x192, page2, fullscreen + + +.if 1 + + ;========================================== + ; create sinetable using ROM cosine table + + ldy #0 +sinetable_loop: + tya ; 2 + and #$3f ; wrap sine at 63 entries ; 2 + + cmp #$20 + php ; save pos/negative for later + + and #$1f + + beq sin_noadjust + + cmp #$10 + bcc sin_left ; blt + bne sin_right + + lda #$20 ; force sin(16) to $20 instead of $1F + bne sin_noadjust + +sin_right: + ; sec carry should be set here + sbc #$10 ; X-16 (x=16..31) + bne sin_both ; bra +sin_left: + ; clc ; carry should be clear + eor #$FF ; 16-X (but plus one twos complement) + adc #$11 +sin_both: + tax + lda sinetable_base,X ; 4+ + + lsr ; rom value is *256 + lsr ; we want *32 + lsr +sin_noadjust: + + plp + bcc sin_done + +sin_negate: + ; carry set here + eor #$ff +; adc #0 ; off by one, does it matter? + +sin_done: + sta sinetable,Y + + iny + bne sinetable_loop + +.else + + ;================== + ; create sinetable + + ldy #0 +sinetable_loop: + tya ; 2 + and #$3f ; wrap sine at 63 entries ; 2 + + cmp #$20 + php ; save pos/negative for later + + and #$1f + + cmp #$10 + bcc sin_left ; blt + +sin_right: + ; sec carry should be set here + eor #$FF + adc #$20 ; 32-X +sin_left: + tax + lda sinetable_base,X ; 4+ + + plp + bcc sin_done + +sin_negate: + ; carry set here + eor #$ff + adc #0 + +sin_done: + sta sinetable,Y + + iny + bne sinetable_loop +.endif + + ; NOTE: making gbash/gbasl table wasn't worth it + + ;============================ + ; main loop + ;============================ + +draw_oval: + inc FRAME + + lda #191 ; YY + +create_yloop: + ; HGR_Y (YY) is in A here + +; ldx #39 ; X is don't care? + ldy #0 + + jsr HPOSN ; (Y,X),(A) (values stores in HGRX,XH,Y) + + ; restore values + + lda HGR_Y ; YY + +calcsine_div4: + lsr + lsr ; 2 + sec + sbc FRAME + tax + lda sinetable,X + sta row_sum_smc+1 + + ldx HGR_Y ; YY + + ldy #39 ; XX +create_xloop: + + ;===================== + ; critical inner loop + ; every cycle here is 40x192 cycles + ;===================== + + clc + tya + adc FRAME + tax + lda sinetable,X + + adc sinetable,Y ; 4+ +row_sum_smc: + adc #$dd ; row base value ; 2 + + lsr ; double colors ; 2 + ; also puts bit in carry + ; which helps make blue + and #$7 ; mask ; 2 + tax ; 2 + lda colorlookup,X ; lookup in table ; 5 + +ror_nop_smc: + ror ; $6A/$EA ; 2 +; and #$7f ; make all purple + sta (GBASL),Y ; 6 + + lda ror_nop_smc ; toggle ror/nop ; 4 + eor #$80 ; 2 + sta ror_nop_smc ; 4 + + dey ; 2 + bpl create_xloop ; 2/3 + + dec HGR_Y + lda HGR_Y + cmp #$ff + bne create_yloop + + ; we skip drawing line 0 as it makes it easier + +flip_pages: + + ; Y should be $FF here + +; iny + lda HGR_PAGE + cmp #$20 + bne done_page + dey +done_page: + ldx PAGE1-$FE,Y ; set display page to PAGE1 or PAGE2 + + eor #$60 ; flip draw page between $400/$800 + sta HGR_PAGE + + bne draw_oval ; bra + + +colorlookup: +.byte $22,$aa,$ba,$ff,$ba,$aa,$22 ; use 00 from sinetable +.byte $00 + +;.byte $11,$55,$5d,$7f,$5d,$55,$11 ; use 00 from sinetable +;.byte $00 + + +sinetable_base = $F5BA + +;sinetable_base: +; this is actually (32*sin(x)) +;.byte $00,$03,$06,$09,$0C,$0F,$11,$14 +;.byte $16,$18,$1A,$1C,$1D,$1E,$1F,$1F +;.byte $20 +;,$1F,$1F,$1E,$1D,$1C,$1A,$18 +;.byte $16,$14,$11,$0F,$0C,$09,$06,$03 + + + ; for bot + ; 3F5 - 7d = 378 +; jmp oval + +sinetable=$6000 + + diff --git a/utils/gr-sim/hgr/Makefile b/utils/gr-sim/hgr/Makefile index c46ac97a..a9ff5f7c 100644 --- a/utils/gr-sim/hgr/Makefile +++ b/utils/gr-sim/hgr/Makefile @@ -7,7 +7,7 @@ SDL_INCLUDE= `sdl-config --cflags` GR_SIM = ../gr-sim.a all: fireworks fw_purple lines image_load hgr_view seven \ - random16 scroll scroll-asm plasma_new + random16 scroll scroll-asm plasma_new plasma_test plasma_test64 ### @@ -51,6 +51,23 @@ plasma_new.o: plasma_new.c ### +plasma_test64: plasma_test64.o $(GR_SIM) + $(CC) -o plasma_test64 plasma_test64.o $(GR_SIM) $(LFLAGS) $(SDL_LIBS) + +plasma_test64.o: plasma_test64.c + $(CC) $(CFLAGS) -c plasma_test64.c + +### + +plasma_test: plasma_test.o $(GR_SIM) + $(CC) -o plasma_test plasma_test.o $(GR_SIM) $(LFLAGS) $(SDL_LIBS) + +plasma_test.o: plasma_test.c + $(CC) $(CFLAGS) -c plasma_test.c + + +### + fw_purple: fw_purple.o $(GR_SIM) $(CC) -o fw_purple fw_purple.o $(GR_SIM) $(LFLAGS) $(SDL_LIBS) @@ -92,4 +109,5 @@ scroll-asm.o: scroll-asm.c clean: - rm -f *~ *.o fireworks lines image_load hgr_view fw_purple seven random16 scroll scroll-asm + rm -f *~ *.o fireworks lines image_load hgr_view fw_purple seven \ + random16 scroll scroll-asm plasma_text plasma_text64 diff --git a/utils/gr-sim/hgr/plasma_test.c b/utils/gr-sim/hgr/plasma_test.c new file mode 100644 index 00000000..e9486746 --- /dev/null +++ b/utils/gr-sim/hgr/plasma_test.c @@ -0,0 +1,93 @@ +/* for demoscene, you need a plasma effect... */ +/* https://rosettacode.org/wiki/Plasma_effect */ +/* https://www.bidouille.org/prog/plasma */ + +#include +#include +#include +#include + +#include "tfv_zp.h" +#include "gr-sim.h" + +#define PI 3.14159265358979323846264338327950 + + +int sine_lookup[64]; + +#if 0 +static unsigned char color_lookup[]={0x0, 0x0, 0x1, 0x1, + 0x2, 0x2, 0x3, 0x3, + 0x4, 0x4, 0x5, 0x5, + 0x6, 0x6, 0x7, 0x7}; +#else +static unsigned char color_lookup[]={0x0, 0x0, 0x0, 0x1, + 0x1, 0x1, 0x2, 0x2, + 0x2, 0x3, 0x3, 0x3, + 0x2, 0x2, 0x1, 0x1}; + +#endif + +int main(int argc, char **argv) { + + int ch,xx,yy,col; + + grsim_init(); + + home(); + + hgr(); + + soft_switch(MIXCLR); + + clear_screens(); + + ram[DRAW_PAGE]=0x0; + + for(xx=0;xx<64;xx++) { + + sine_lookup[xx]=32.0*sin( (xx*2*PI)/64); + + } + + int offset=0; + + while(1) { + + for(yy=0;yy<192;yy++) { + for(xx=0;xx<40;xx++) { + + col = (int) + ( 128.0 + sine_lookup[ (int)(xx+offset)&0x3f ] + + sine_lookup[ (int)(xx)&0x3f ] + + sine_lookup[ (int)((yy/4)-offset)&0x3f ] +// + sine_lookup[ (int)((xx + yy)/4)&0x3f ] + ) ; + + + col+=offset; + + hcolor_equals(color_lookup[col&0xf]); + + hplot(xx*7,yy); + hplot_to((xx*7)+6,yy); + } + } + offset++; + grsim_update(); + + ch=grsim_input(); + if (ch=='q') exit(0); + + if (ch==' ') { + while(1) { + ch=grsim_input(); + if (ch) break; + } + } + usleep(200000); + } + + + return 0; +} diff --git a/utils/gr-sim/hgr/plasma_test64.c b/utils/gr-sim/hgr/plasma_test64.c new file mode 100644 index 00000000..93c1485c --- /dev/null +++ b/utils/gr-sim/hgr/plasma_test64.c @@ -0,0 +1,93 @@ +/* for demoscene, you need a plasma effect... */ +/* https://rosettacode.org/wiki/Plasma_effect */ +/* https://www.bidouille.org/prog/plasma */ + +#include +#include +#include +#include + +#include "tfv_zp.h" +#include "gr-sim.h" + +#define PI 3.14159265358979323846264338327950 + + +int sine_lookup[64]; + +#if 0 +static unsigned char color_lookup[]={0x0, 0x0, 0x1, 0x1, + 0x2, 0x2, 0x3, 0x3, + 0x4, 0x4, 0x5, 0x5, + 0x6, 0x6, 0x7, 0x7}; +#else +static unsigned char color_lookup[]={0x0, 0x0, 0x0, 0x1, + 0x1, 0x1, 0x2, 0x2, + 0x2, 0x3, 0x3, 0x3, + 0x2, 0x2, 0x1, 0x1}; + +#endif + +int main(int argc, char **argv) { + + int ch,xx,yy,col; + + grsim_init(); + + home(); + + hgr(); + + soft_switch(MIXCLR); + + clear_screens(); + + ram[DRAW_PAGE]=0x0; + + for(xx=0;xx<64;xx++) { + + sine_lookup[xx]=64.0*sin( (xx*2*PI)/64); + + } + + int offset=0; + + while(1) { + + for(yy=0;yy<192;yy++) { + for(xx=0;xx<40;xx++) { + + col = (int) + ( 128.0 + sine_lookup[ (int)(xx+offset)&0x3f ] + + sine_lookup[ (int)(xx)&0x3f ] + + sine_lookup[ (int)((yy/4)-offset)&0x3f ] +// + sine_lookup[ (int)((xx + yy)/4)&0x3f ] + ) ; + + + col+=offset; + + hcolor_equals(color_lookup[col&0xf]); + + hplot(xx*7,yy); + hplot_to((xx*7)+6,yy); + } + } + offset++; + grsim_update(); + + ch=grsim_input(); + if (ch=='q') exit(0); + + if (ch==' ') { + while(1) { + ch=grsim_input(); + if (ch) break; + } + } + usleep(200000); + } + + + return 0; +}