diff --git a/graphics/gr/plasma/Makefile b/graphics/gr/plasma/Makefile index 27f4415b..db3e36f7 100644 --- a/graphics/gr/plasma/Makefile +++ b/graphics/gr/plasma/Makefile @@ -7,7 +7,9 @@ EMPTYDISK = ../../../empty_disk/empty.dsk all: plasma.dsk -plasma.dsk: HELLO PLASMA PLASMA_128 PLASMA_TINY PLASMA_BOT WIRES WIRES_BOT +plasma.dsk: HELLO PLASMA PLASMA2 \ + DIAMONDS STATIC \ + PLASMA_128 PLASMA_TINY PLASMA_BOT WIRES WIRES_BOT cp $(EMPTYDISK) plasma.dsk $(DOS33) -y plasma.dsk SAVE A HELLO $(DOS33) -y plasma.dsk BSAVE -a 0x70 PLASMA @@ -16,6 +18,9 @@ plasma.dsk: HELLO PLASMA PLASMA_128 PLASMA_TINY PLASMA_BOT WIRES WIRES_BOT $(DOS33) -y plasma.dsk BSAVE -a 0x36B PLASMA_BOT $(DOS33) -y plasma.dsk BSAVE -a 0xC00 WIRES $(DOS33) -y plasma.dsk BSAVE -a 0x36B WIRES_BOT + $(DOS33) -y plasma.dsk BSAVE -a 0xc00 PLASMA2 + $(DOS33) -y plasma.dsk BSAVE -a 0xc00 DIAMONDS + $(DOS33) -y plasma.dsk BSAVE -a 0xc00 STATIC ### @@ -30,6 +35,33 @@ PLASMA: plasma.o plasma.o: plasma.s ca65 -o plasma.o plasma.s -l plasma.lst +### + +PLASMA2: plasma2.o + ld65 -o PLASMA2 plasma2.o -C $(LINKERSCRIPTS)/apple2_c00.inc + +plasma2.o: plasma2.s + ca65 -o plasma2.o plasma2.s -l plasma2.lst + +### + +DIAMONDS: diamonds.o + ld65 -o DIAMONDS diamonds.o -C $(LINKERSCRIPTS)/apple2_c00.inc + +diamonds.o: diamonds.s + ca65 -o diamonds.o diamonds.s -l diamonds.lst + + +### + +STATIC: static.o + ld65 -o STATIC static.o -C $(LINKERSCRIPTS)/apple2_c00.inc + +static.o: static.s + ca65 -o static.o static.s -l static.lst + + + ### PLASMA_128: plasma_128.o diff --git a/graphics/gr/plasma/diamonds.s b/graphics/gr/plasma/diamonds.s new file mode 100644 index 00000000..e3563717 --- /dev/null +++ b/graphics/gr/plasma/diamonds.s @@ -0,0 +1,227 @@ +; more plasma + +; by Vince `deater` Weaver (vince@deater.net) / dSr +; with some help from qkumba + +; zero page +GBASL = $26 +GBASH = $27 +MASK = $2E +COLOR = $30 +;CTEMP = $68 +YY = $69 + +FRAME = $FC +SUM = $FD +SAVEX = $FE +SAVEY = $FF + +; soft-switches +FULLGR = $C052 +PAGE1 = $C054 + +; ROM routines +PLOT = $F800 ;; PLOT AT Y,A +PLOT1 = $F80E ;; PLOT at (GBASL),Y (need MASK to be $0f or $f0) +GBASCALC= $F847 ;; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear) +SETCOL = $F864 ;; COLOR=A*17 +SETGR = $FB40 + + + + ;================================ + ; Clear screen and setup graphics + ;================================ +plasma: + + jsr SETGR ; set lo-res 40x40 mode + bit FULLGR ; make it 40x48 + + + +draw_plasma: + ldx #39 +create_yloop: + ldy #47 +create_xloop: + lda #128 + sta SUM + txa + jsr calcsine + tya + jsr calcsine + + clc + adc FRAME + + jsr SETCOL + + stx SAVEX + sty SAVEY + + ldy SAVEX + lda SAVEY + + jsr PLOT ; PLOT Y,A + + ldx SAVEX + ldy SAVEY + + + dey + bpl create_xloop + + dex + bpl create_yloop + + ; X and Y both $FF + +create_lookup_done: + +forever_loop: + inc FRAME + + jmp draw_plasma + +.if 0 +cycle_colors: + + ; cycle colors + ; instead of advancing entire frame, do slightly slower route + ; instead now and just incrememnting the frame and doing the + ; adjustment at plot time. + + ; increment frame + + inc frame_smc+1 + + ; set/flip pages + ; we want to flip pages and then draw to the offscreen one + +flip_pages: + +; ldy #0 + +; iny ; y is $FF, make it 0 + + lda draw_page_smc+1 ; DRAW_PAGE + bne done_page + dey +done_page: +; ldx PAGE1,Y ; set display page to PAGE1 or PAGE2 + + ldx $BF56,Y ; PAGE1 - $FF + + eor #$4 ; flip draw page between $400/$800 + sta draw_page_smc+1 ; DRAW_PAGE + + + ; plot current frame + ; scan whole 40x48 screen and plot each point based on + ; lookup table colors +plot_frame: + + ldx #47 ; YY=47 (count backwards) +plot_yloop: + + txa ; get YY into A + pha ; save X for later + lsr ; call actually wants Ycoord/2 + + php ; save C flag for mask handling + + ; ugh can't use PLOT trick as it always will draw something + ; to PAGE1 even if we don't want to + + jsr GBASCALC ; point GBASL/H to address in (A is ycoord/2) + ; after, A is GBASL, C is clear + + lda GBASH ; adjust to be PAGE1/PAGE2 ($400 or $800) +draw_page_smc: + adc #0 + sta GBASH + + ; increment YY in top nibble of lookup for (yy<<16)+xx + ; clc from above, C always 0 + lda plot_lookup_smc+1 + adc #$10 ; no need to mask as it will oflo and be ignored + sta plot_lookup_smc+1 + + ;========== + + ldy #39 ; XX = 39 (countdown) + + ; sets MASK by calling into middle of PLOT routine + ; by Y being 39 draw in a spot that gets over-written + + plp + jsr $f806 + +plot_xloop: + + tya ; get XX & 0x0f + and #$f + tax + +plot_lookup_smc: + lda lookup,X ; load lookup, (YY*16)+XX + + clc +frame_smc: + adc #$00 ; add in frame + + and #$f + lsr ; we actually only have 8 colors + + tax + + lda colorlookup,X ; lookup color + + + sta COLOR ; each nibble should be same + + jsr PLOT1 ; plot at GBASL,Y (x co-ord goes in Y) + + dey + bpl plot_xloop + + pla ; restore YY + tax + dex + bpl plot_yloop + bmi forever_loop +.endif + + +calcsine_div_8: + lsr +calcsine_div_4: + lsr + lsr + lsr +calcsine: + stx SAVEX + and #$f + tax + lda sinetable,X + clc + adc SUM + sta SUM + ldx SAVEX + rts + + +colorlookup: + +; blue +.byte $55,$22,$66,$77,$ff,$77,$55,$00 + + + +sinetable: +; this is actually (32*sin(x)) +.byte $00,$0C,$16,$1D +.byte $20,$1D,$16,$0C +.byte $00,$F4,$EA,$E3 +.byte $E0,$E3,$EA,$F4 + diff --git a/graphics/gr/plasma/plasma2.s b/graphics/gr/plasma/plasma2.s new file mode 100644 index 00000000..6e213496 --- /dev/null +++ b/graphics/gr/plasma/plasma2.s @@ -0,0 +1,242 @@ +; more plasma + +; by Vince `deater` Weaver (vince@deater.net) / dSr +; with some help from qkumba + +; zero page +GBASL = $26 +GBASH = $27 +MASK = $2E +COLOR = $30 +;CTEMP = $68 +YY = $69 + +FRAME = $FC +SUM = $FD +SAVEX = $FE +SAVEY = $FF + +; soft-switches +FULLGR = $C052 +PAGE1 = $C054 + +; ROM routines +PLOT = $F800 ;; PLOT AT Y,A +PLOT1 = $F80E ;; PLOT at (GBASL),Y (need MASK to be $0f or $f0) +GBASCALC= $F847 ;; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear) +SETCOL = $F864 ;; COLOR=A*17 +SETGR = $FB40 + + + + ;================================ + ; Clear screen and setup graphics + ;================================ +plasma: + + jsr SETGR ; set lo-res 40x40 mode + bit FULLGR ; make it 40x48 + + + +draw_plasma: + ldx #39 +create_yloop: + ldy #47 +create_xloop: + lda #128 + sta SUM + txa + adc FRAME + jsr calcsine + + tya +; adc FRAME + jsr calcsine_div_2 + + clc + stx SAVEX + tya + adc SAVEX + jsr calcsine + + stx SAVEX + sty SAVEY + +; clc + adc FRAME + + and #$7 + tax + lda colorlookup,X + + jsr SETCOL + + + ldy SAVEX + lda SAVEY + + jsr PLOT ; PLOT Y,A + + ldx SAVEX + ldy SAVEY + + + dey + bpl create_xloop + + dex + bpl create_yloop + + ; X and Y both $FF + +create_lookup_done: + +forever_loop: + inc FRAME + + jmp draw_plasma +; jmp forever_loop + +.if 0 +cycle_colors: + + ; cycle colors + ; instead of advancing entire frame, do slightly slower route + ; instead now and just incrememnting the frame and doing the + ; adjustment at plot time. + + ; increment frame + + inc frame_smc+1 + + ; set/flip pages + ; we want to flip pages and then draw to the offscreen one + +flip_pages: + +; ldy #0 + +; iny ; y is $FF, make it 0 + + lda draw_page_smc+1 ; DRAW_PAGE + bne done_page + dey +done_page: +; ldx PAGE1,Y ; set display page to PAGE1 or PAGE2 + + ldx $BF56,Y ; PAGE1 - $FF + + eor #$4 ; flip draw page between $400/$800 + sta draw_page_smc+1 ; DRAW_PAGE + + + ; plot current frame + ; scan whole 40x48 screen and plot each point based on + ; lookup table colors +plot_frame: + + ldx #47 ; YY=47 (count backwards) +plot_yloop: + + txa ; get YY into A + pha ; save X for later + lsr ; call actually wants Ycoord/2 + + php ; save C flag for mask handling + + ; ugh can't use PLOT trick as it always will draw something + ; to PAGE1 even if we don't want to + + jsr GBASCALC ; point GBASL/H to address in (A is ycoord/2) + ; after, A is GBASL, C is clear + + lda GBASH ; adjust to be PAGE1/PAGE2 ($400 or $800) +draw_page_smc: + adc #0 + sta GBASH + + ; increment YY in top nibble of lookup for (yy<<16)+xx + ; clc from above, C always 0 + lda plot_lookup_smc+1 + adc #$10 ; no need to mask as it will oflo and be ignored + sta plot_lookup_smc+1 + + ;========== + + ldy #39 ; XX = 39 (countdown) + + ; sets MASK by calling into middle of PLOT routine + ; by Y being 39 draw in a spot that gets over-written + + plp + jsr $f806 + +plot_xloop: + + tya ; get XX & 0x0f + and #$f + tax + +plot_lookup_smc: + lda lookup,X ; load lookup, (YY*16)+XX + + clc +frame_smc: + adc #$00 ; add in frame + + and #$f + lsr ; we actually only have 8 colors + + tax + + lda colorlookup,X ; lookup color + + + sta COLOR ; each nibble should be same + + jsr PLOT1 ; plot at GBASL,Y (x co-ord goes in Y) + + dey + bpl plot_xloop + + pla ; restore YY + tax + dex + bpl plot_yloop + bmi forever_loop +.endif + + +calcsine_div_8: + lsr +calcsine_div_4: + lsr +calcsine_div_2: + lsr +calcsine: + stx SAVEX + and #$f + tax + lda sinetable,X + clc + adc SUM + sta SUM + ldx SAVEX + rts + + +colorlookup: + +; blue +.byte $55,$22,$66,$77,$ff,$77,$55,$00 + + + +sinetable: +; this is actually (32*sin(x)) +.byte $00,$0C,$16,$1D +.byte $20,$1D,$16,$0C +.byte $00,$F4,$EA,$E3 +.byte $E0,$E3,$EA,$F4 + diff --git a/graphics/gr/plasma/static.s b/graphics/gr/plasma/static.s new file mode 100644 index 00000000..6e213496 --- /dev/null +++ b/graphics/gr/plasma/static.s @@ -0,0 +1,242 @@ +; more plasma + +; by Vince `deater` Weaver (vince@deater.net) / dSr +; with some help from qkumba + +; zero page +GBASL = $26 +GBASH = $27 +MASK = $2E +COLOR = $30 +;CTEMP = $68 +YY = $69 + +FRAME = $FC +SUM = $FD +SAVEX = $FE +SAVEY = $FF + +; soft-switches +FULLGR = $C052 +PAGE1 = $C054 + +; ROM routines +PLOT = $F800 ;; PLOT AT Y,A +PLOT1 = $F80E ;; PLOT at (GBASL),Y (need MASK to be $0f or $f0) +GBASCALC= $F847 ;; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear) +SETCOL = $F864 ;; COLOR=A*17 +SETGR = $FB40 + + + + ;================================ + ; Clear screen and setup graphics + ;================================ +plasma: + + jsr SETGR ; set lo-res 40x40 mode + bit FULLGR ; make it 40x48 + + + +draw_plasma: + ldx #39 +create_yloop: + ldy #47 +create_xloop: + lda #128 + sta SUM + txa + adc FRAME + jsr calcsine + + tya +; adc FRAME + jsr calcsine_div_2 + + clc + stx SAVEX + tya + adc SAVEX + jsr calcsine + + stx SAVEX + sty SAVEY + +; clc + adc FRAME + + and #$7 + tax + lda colorlookup,X + + jsr SETCOL + + + ldy SAVEX + lda SAVEY + + jsr PLOT ; PLOT Y,A + + ldx SAVEX + ldy SAVEY + + + dey + bpl create_xloop + + dex + bpl create_yloop + + ; X and Y both $FF + +create_lookup_done: + +forever_loop: + inc FRAME + + jmp draw_plasma +; jmp forever_loop + +.if 0 +cycle_colors: + + ; cycle colors + ; instead of advancing entire frame, do slightly slower route + ; instead now and just incrememnting the frame and doing the + ; adjustment at plot time. + + ; increment frame + + inc frame_smc+1 + + ; set/flip pages + ; we want to flip pages and then draw to the offscreen one + +flip_pages: + +; ldy #0 + +; iny ; y is $FF, make it 0 + + lda draw_page_smc+1 ; DRAW_PAGE + bne done_page + dey +done_page: +; ldx PAGE1,Y ; set display page to PAGE1 or PAGE2 + + ldx $BF56,Y ; PAGE1 - $FF + + eor #$4 ; flip draw page between $400/$800 + sta draw_page_smc+1 ; DRAW_PAGE + + + ; plot current frame + ; scan whole 40x48 screen and plot each point based on + ; lookup table colors +plot_frame: + + ldx #47 ; YY=47 (count backwards) +plot_yloop: + + txa ; get YY into A + pha ; save X for later + lsr ; call actually wants Ycoord/2 + + php ; save C flag for mask handling + + ; ugh can't use PLOT trick as it always will draw something + ; to PAGE1 even if we don't want to + + jsr GBASCALC ; point GBASL/H to address in (A is ycoord/2) + ; after, A is GBASL, C is clear + + lda GBASH ; adjust to be PAGE1/PAGE2 ($400 or $800) +draw_page_smc: + adc #0 + sta GBASH + + ; increment YY in top nibble of lookup for (yy<<16)+xx + ; clc from above, C always 0 + lda plot_lookup_smc+1 + adc #$10 ; no need to mask as it will oflo and be ignored + sta plot_lookup_smc+1 + + ;========== + + ldy #39 ; XX = 39 (countdown) + + ; sets MASK by calling into middle of PLOT routine + ; by Y being 39 draw in a spot that gets over-written + + plp + jsr $f806 + +plot_xloop: + + tya ; get XX & 0x0f + and #$f + tax + +plot_lookup_smc: + lda lookup,X ; load lookup, (YY*16)+XX + + clc +frame_smc: + adc #$00 ; add in frame + + and #$f + lsr ; we actually only have 8 colors + + tax + + lda colorlookup,X ; lookup color + + + sta COLOR ; each nibble should be same + + jsr PLOT1 ; plot at GBASL,Y (x co-ord goes in Y) + + dey + bpl plot_xloop + + pla ; restore YY + tax + dex + bpl plot_yloop + bmi forever_loop +.endif + + +calcsine_div_8: + lsr +calcsine_div_4: + lsr +calcsine_div_2: + lsr +calcsine: + stx SAVEX + and #$f + tax + lda sinetable,X + clc + adc SUM + sta SUM + ldx SAVEX + rts + + +colorlookup: + +; blue +.byte $55,$22,$66,$77,$ff,$77,$55,$00 + + + +sinetable: +; this is actually (32*sin(x)) +.byte $00,$0C,$16,$1D +.byte $20,$1D,$16,$0C +.byte $00,$F4,$EA,$E3 +.byte $E0,$E3,$EA,$F4 + diff --git a/utils/gr-sim/plasma/plasma_new.c b/utils/gr-sim/plasma/plasma_new.c index 28d5b562..910454d2 100644 --- a/utils/gr-sim/plasma/plasma_new.c +++ b/utils/gr-sim/plasma/plasma_new.c @@ -62,7 +62,7 @@ int main(int argc, char **argv) { + 128.0 + (128.0 * sin((xx + yy) / 16.0)) + 128.0 + (128.0 * sin(sqrt( (double)(xx * xx + yy * yy)) / 8.0)) ) / 4; -#else +//#else col = (int) (( 4.0 + sin(xx / 16.0) @@ -71,10 +71,23 @@ int main(int argc, char **argv) { // + sin(sqrt(xx * xx + yy * yy) / 8.0) )*32) ; - printf("%d %d %d\n",xx,yy,col); + printf("%d %d %d %.2f %.2f %.2f\n",xx,yy,col, + sin(xx/16.0), sin(yy/8.0), sin((xx+yy)/16.0)); +//#endif +#else + col = (int) + ( + 128.0 + 32*sin(xx / 16.0) + + 32*sin(yy / 8.0) + + 32*sin((xx + yy) / 16.0) + ) ; + + printf("%d %d %d %.2f %.2f %.2f\n",xx,yy,col, + sin(xx/16.0), sin(yy/8.0), sin((xx+yy)/16.0)); #endif + offscreen[xx][yy]=col; } }