From cda2f2dc5d2444b5feb8ec16b577b18accbe5154 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sat, 28 Oct 2023 23:16:35 -0400 Subject: [PATCH] second: hook up plasma --- demos/second/Makefile | 7 +- demos/second/TODO | 7 + demos/second/part12_plasma/Makefile | 27 ++ demos/second/part12_plasma/plasma.s | 473 ++++++++++++++++++++++++++++ demos/second/part12_plasma/tables | Bin 0 -> 768 bytes demos/second/start.s | 15 +- demos/second/zp.inc | 11 +- 7 files changed, 531 insertions(+), 9 deletions(-) create mode 100644 demos/second/part12_plasma/Makefile create mode 100644 demos/second/part12_plasma/plasma.s create mode 100644 demos/second/part12_plasma/tables diff --git a/demos/second/Makefile b/demos/second/Makefile index a76fcbf2..ea48e440 100644 --- a/demos/second/Makefile +++ b/demos/second/Makefile @@ -13,6 +13,7 @@ second_d1.dsk: QBOOT QLOAD music.inc \ MUSIC \ ./part01_intropan/INTRO \ ./part05_dot_tunnel/TUNNEL \ + ./part12_plasma/PLASMA \ ./part13_plasmacube/PLASMACUBE \ ./part14_dotbounce/DOTS \ ./part15_transmission/SPHERES \ @@ -31,7 +32,7 @@ second_d1.dsk: QBOOT QLOAD music.inc \ # $(DOS33_RAW) second_d1.dsk 19 0 ./part08_gorilla/GORILLA 0 0 # $(DOS33_RAW) second_d1.dsk 21 0 ./part09_leaves_rotozoom/LEAVES 0 0 # $(DOS33_RAW) second_d1.dsk 23 0 ./part10_lens_rotozoom/LENS 0 0 -# $(DOS33_RAW) second_d1.dsk 24 0 ./part12_plasma/PLASMA 0 0 + $(DOS33_RAW) second_d1.dsk 24 0 ./part12_plasma/PLASMA 0 0 $(DOS33_RAW) second_d1.dsk 25 0 ./part13_plasmacube/PLASMACUBE 0 0 $(DOS33_RAW) second_d1.dsk 26 0 ./part14_dotbounce/DOTS 0 0 $(DOS33_RAW) second_d1.dsk 27 0 ./part15_transmission/SPHERES 0 0 @@ -41,6 +42,9 @@ second_d1.dsk: QBOOT QLOAD music.inc \ #### +part12_plasma/PLASMA: + cd part12_plasma && make + part13_plasmacube/PLASMACUBE: cd part13_plasmacube && make @@ -281,6 +285,7 @@ generate_common.o: generate_common.c clean: rm -f *~ *.o *.lst HELLO SECOND QBOOT QLOAD MUSIC START + cd part12_plasma && make clean cd part13_plasmacube && make clean cd part14_dotbounce && make clean cd part15_transmission && make clean diff --git a/demos/second/TODO b/demos/second/TODO index 731e28bf..d26487d6 100644 --- a/demos/second/TODO +++ b/demos/second/TODO @@ -2,6 +2,13 @@ DISK I ++ Plasma + - switch to purple green + - do the weird vertical wipe + ++ Plasmacube + - have cube mask with different color sides + + Dot Bounce - slowly spool them out diff --git a/demos/second/part12_plasma/Makefile b/demos/second/part12_plasma/Makefile new file mode 100644 index 00000000..bae67890 --- /dev/null +++ b/demos/second/part12_plasma/Makefile @@ -0,0 +1,27 @@ +include ../../../Makefile.inc + +DOS33 = ../../../utils/dos33fs-utils/dos33 +DOS33_RAW = ../../../utils/dos33fs-utils/dos33_raw +EMPTY_DISK = ../../../empty_disk/empty.dsk +TOKENIZE = ../../../utils/asoft_basic-utils/tokenize_asoft +LINKER_SCRIPTS = ../../../linker_scripts/ + + +all: PLASMA + +#### + +PLASMA: plasma.o + ld65 -o PLASMA plasma.o -C $(LINKER_SCRIPTS)/apple2_8000.inc + +plasma.o: plasma.s \ + ../zp.inc ../hardware.inc ../qload.inc + ca65 -o plasma.o plasma.s -l plasma.lst + + +### + + +clean: + rm -f *~ *.o *.lst PLASMA +# cd graphics && make clean diff --git a/demos/second/part12_plasma/plasma.s b/demos/second/part12_plasma/plasma.s new file mode 100644 index 00000000..3953881a --- /dev/null +++ b/demos/second/part12_plasma/plasma.s @@ -0,0 +1,473 @@ +; PLASMAGORIA, hi-res version + +; based on code by French Touch + + +.include "../zp.inc" +.include "../hardware.inc" +.include "../qload.inc" + +mod7_table = $1c00 +div7_table = $1d00 +hposn_low = $1e00 +hposn_high = $1f00 + +;hposn_high=$6000 +;hposn_low =$6100 +hposn_high_div8=$6200 +hposn_low_div8 =$6300 + +hires_colors_even_l0=$7000 +hires_colors_odd_l0 =$7100 +hires_colors_even_l1=$7200 +hires_colors_odd_l1 =$7300 + +; was in page0, we don't really have room +Table1 = $74A0 ; 40 bytes +Table2 = $74D0 ; 40 bytes + + +; ============================================================================= +; ROUTINE MAIN +; ============================================================================= + +plasma_debut: + bit SET_GR + bit HIRES + bit FULLGR + bit PAGE1 + + lda #0 + jsr hgr_page1_clearscreen + jsr hgr_page2_clearscreen + + + +; jsr HGR2 +; jsr HGR ; have table gen appear on hgr page1 +; bit FULLGR + +; jsr build_tables + + ldx #23 + ldy #184 +div8_loop: + lda hposn_low,Y + sta hposn_low_div8,X + lda hposn_high,Y + sta hposn_high_div8,X + dey + dey + dey + dey + dey + dey + dey + dey + dex + bpl div8_loop + + lda #0 + sta PAGE + + + +; ============================================================================ +; init lores colors (inline) +; ============================================================================ + +init_hires_colors: + +;============================================== + +init_hires_colors_even_l0: + ldx #0 + ldy #0 +; 347 + +init_hires_colors_even_l0_loop: + lda hires_colors_even_lookup_l0,X + sta hires_colors_even_l0,Y + iny + sta hires_colors_even_l0,Y + iny + sta hires_colors_even_l0,Y + iny + sta hires_colors_even_l0,Y + iny + beq done_init_hires_colors_even_l0 + + inx + txa + and #$f + tax + jmp init_hires_colors_even_l0_loop + +done_init_hires_colors_even_l0: + +;============================ + +init_hires_colors_odd_l0: + ldx #0 + ldy #0 +; 347 + +init_hires_colors_odd_l0_loop: + lda hires_colors_odd_lookup_l0,X + sta hires_colors_odd_l0,Y + iny + sta hires_colors_odd_l0,Y + iny + sta hires_colors_odd_l0,Y + iny + sta hires_colors_odd_l0,Y + iny + beq done_init_hires_colors_odd_l0 + + inx + txa + and #$f + tax + jmp init_hires_colors_odd_l0_loop + +done_init_hires_colors_odd_l0: + +;============================================== + +init_hires_colors_even_l1: + ldx #0 + ldy #0 +; 347 + +init_hires_colors_even_l1_loop: + lda hires_colors_even_lookup_l1,X + sta hires_colors_even_l1,Y + iny + sta hires_colors_even_l1,Y + iny + sta hires_colors_even_l1,Y + iny + sta hires_colors_even_l1,Y + iny + beq done_init_hires_colors_even_l1 + + inx + txa + and #$f + tax + jmp init_hires_colors_even_l1_loop + +done_init_hires_colors_even_l1: + +;============================ + +init_hires_colors_odd_l1: + ldx #0 + ldy #0 +; 347 + +init_hires_colors_odd_l1_loop: + lda hires_colors_odd_lookup_l1,X + sta hires_colors_odd_l1,Y + iny + sta hires_colors_odd_l1,Y + iny + sta hires_colors_odd_l1,Y + iny + sta hires_colors_odd_l1,Y + iny + beq done_init_hires_colors_odd_l1 + + inx + txa + and #$f + tax + jmp init_hires_colors_odd_l1_loop + +done_init_hires_colors_odd_l1: + + + +; ============================================================================ + +; 26+( 24*(11+(40*(39+(38*2))) = 110,690 +2174 = 112,864 = 9fps +; 26+( 24*(11+(40*(39+(38*4))) = 183,650 +2174 = 185,824 = 5.5fps +; 26+( 24*(11+(40*(39+(38*8))) = 329,570 +2174 = = 3fps + +do_plasma: + ; init + + + +; lda #02 +; ldx #5 +;init_loop: +; sta COMPT1,X +; dex +; bne init_loop + +BP3: + +; ============================================================================ +; Precalculate some values (inlined) +; ROUTINES PRE CALCUL +; ============================================================================ +; +; cycles = 30 + (40*53) -1 + 25 = 2174 cycles + +precalc: +; 0 + lda PARAM1 ; self modify various parts ; 3 + sta pc_off1+1 ; 4 + lda PARAM2 ; 3 + sta pc_off2+1 ; 4 + lda PARAM3 ; 3 + sta pc_off3+1 ; 4 + lda PARAM4 ; 3 + sta pc_off4+1 ; 4 + +; 28 + + ; Table1(X) = sin1(PARAM1+X)+sin2(PARAM1+X) + ; Table2(X) = sin3(PARAM3+X)+sin1(PARAM4+X) + + ldx #$28 ; 40 ; 2 +; 30 + +precalc_loop: + +pc_off1: + lda sin1 ; 4 +pc_off2: + adc sin2 ; 4 + sta Table1,X ; 4 +; 12 + +pc_off3: + lda sin3 ; 4 +pc_off4: + adc sin1 ; 4 + sta Table2,X ; 4 +; 24 + + inc pc_off1+1 ; 6 + inc pc_off2+1 ; 6 + inc pc_off3+1 ; 6 + inc pc_off4+1 ; 6 +; 48 + dex ; 2 + bpl precalc_loop ; 2/3 +; 53 + + inc PARAM1 ; 5 + inc PARAM1 ; 5 + dec PARAM2 ; 5 + inc PARAM3 ; 5 + dec PARAM4 ; 5 +; 25 + +; ============================================================================ +; Display Routines +; ROUTINES AFFICHAGES +; ============================================================================ +; 26+( 24*(11+(40*(39+(38*2))) = 110,690 +; 26+( 24*(11+(40*(39+(38*4))) = 183,650 +; 26+( 24*(11+(40*(39+(38*8))) = 329,570 + +; Display "Normal" +; AFFICHAGE "NORMAL" + +display_normal: + + ldx #23 ; lines 0-23 lignes 0-23 ; 2 + +display_line_loop: +; 0 + lda hposn_low_div8,X ; setup line pointer ; 4 + sta GBASL ; 3 +; 7 + ldy #39 ; col 0-39 ; 2 + + lda Table2,X ; setup base sine value for row ; 4 + sta display_row_sin_smc+1 ; 4 +; 17 + +display_col_loop: + + lda Table1,Y ; load in column sine value ; 4 +display_row_sin_smc: + adc #00 ; add in row value ; 2 + sta display_lookup_smc+1 ; patch in low byte of lookup ; 4 +; 8 + ; pick 0/1 for odd even + lda display_lookup_smc+2 ; 4 + eor #$01 ; 2 + sta display_lookup_smc+2 ; 4 + +; 18 + +; lda hires_colors_even_l0 ; attention: must be aligned +; sta color_smc+1 + + lda hposn_high_div8,X ; 4 + clc ; 2 + adc PAGE ; 3 + sta GBASH ; 3 +; 30 + lda #1 ; 2 + sta COUNT ; 3 +; 35 +store_loop: +color_smc: + + lda display_lookup_smc+2 ; 4 + eor #$02 ; 2 + sta display_lookup_smc+2 ; 4 +; 10 + +display_lookup_smc: + lda hires_colors_even_l0 ; attention: must be aligned ; 4 +; lda #$fe + sta (GBASL),Y ; 6 + clc ; 2 + lda #$10 ; 2 + adc GBASH ; 3 + sta GBASH ; 3 + dec COUNT ; 5 + bpl store_loop ; 2/3 +; 38 + + dey ; 2 + bpl display_col_loop ; 2/3 + + dex ; 2 + bpl display_line_loop ; 2/3 + +; ============================================================================ + + lda PAGE ; 3 + beq was_page1 ; 2/3 +was_page2: + bit PAGE2 ; 4 + lda #0 ; 2 + beq done_pageflip ; 2/3 +was_page1: + bit PAGE1 ; 4 + lda #$20 ; 2 +done_pageflip: + sta PAGE ; 3 + + lda KEYPRESS + bpl wasnt_keypress + + jmp done_plasma + +wasnt_keypress: + + +; 15? + inc COMPT1 ; 6 + beq display_done2 ; 2/3 + +; bne BP3 + jmp BP3 ; 3 + +display_done2: + + dec COMPT2 ; 6 + beq display_done ; 2/3 +; bne BP3 + jmp BP3 ; 3 +display_done: + + jmp do_plasma +; beq do_plasma ; bra + + +done_plasma: + bit KEYRESET + rts + + +hires_colors_even_lookup_l0: +.byte $00 ; black +.byte $A2 ; 01 00 01 0 -> 1 01 00 01 0 = $A2 ; dark orange +.byte $A2 ; 01 00 01 0 -> 1 01 00 01 0 = $A2 ; med orange +.byte $88 ; 01 00 01 0 -> 1 01 00 01 0 = $A2 ; light orange +.byte $AA ; 01 01 01 0 -> 1 01 01 01 0 = $AA ; solid orange +.byte $EE ; 01 11 01 1 -> 1 11 01 11 0 = $EE ; white orange +.byte $EE ; 01 11 01 1 -> 1 11 01 11 0 = $EE ; med white/o +.byte $EE ; 01 11 01 1 -> 1 11 01 11 0 = $EE ; wwo +.byte $FF ; 11 11 11 1 -> 1 11 11 11 1 = $FF ; white +.byte $DD ; 10 11 10 1 -> 1 10 11 10 1 = $DD ; white/blue +.byte $DD ; 10 11 10 1 -> 1 10 11 10 1 = $DD ; med white/blue +.byte $DD ; 10 11 10 1 -> 1 10 11 10 1 = $DD ; blue/white +.byte $D5 ; 10 10 10 1 -> 1 10 10 10 1 = $D5 ; blue +.byte $91 ; 10 00 10 0 -> 1 00 10 00 1 = $91 ; black/blue +.byte $91 ; 10 00 10 0 -> 1 00 10 00 1 = $91 ; med +.byte $91 ; 10 00 10 0 -> 1 00 10 00 1 = $91 ; med/dark + +hires_colors_odd_lookup_l0: +.byte $00 ; black +.byte $91 ; 1 00 01 00 -> 1 00 10 00 1 = $91 ; dark orange +.byte $91 ; 1 00 01 00 -> 1 00 10 00 1 = $91 ; med orange +.byte $91 ; 1 00 01 00 -> 1 00 10 00 1 = $91 ; light orange +.byte $D5 ; 1 01 01 01 -> 1 10 10 10 1 = $D5 ; solid orange +.byte $DD ; 1 01 11 01 -> 1 10 11 10 1 = $DD ; white orange +.byte $DD ; 1 01 11 01 -> 1 10 11 10 1 = $DD ; med white/o +.byte $DD ; 1 01 11 01 -> 1 10 11 10 1 = $DD ; wwo +.byte $FF ; 1 11 11 11 -> 1 11 11 11 1 = $FF ; white +.byte $BB ; 1 10 11 10 -> 1 01 11 01 1 = $BB ; white/blue +.byte $BB ; 1 10 11 10 -> 1 01 11 01 1 = $BB ; med white/blue +.byte $BB ; 1 10 11 10 -> 1 01 11 01 1 = $BB ; blue/white +.byte $AA ; 0 10 10 10 -> 1 01 01 01 0 = $AA ; blue +.byte $A2 ; 0 10 00 10 -> 1 01 00 01 0 = $A2 ; black/blue +.byte $A2 ; 0 10 00 10 -> 1 01 00 01 0 = $A2 ; med +.byte $A2 ; 0 10 00 10 -> 1 01 00 01 0 = $A2 ; med/dark + +hires_colors_even_lookup_l1: +.byte $00 ; black +.byte $00 ; dark orange +.byte $88 ; 00 01 00 0 -> 1 00 01 00 0 = $88 ; med orange +.byte $AA ; 01 01 01 0 -> 1 01 01 01 0 = $AA ; light orange +.byte $AA ; 01 01 01 0 -> 1 01 01 01 0 = $AA ; solid orange +.byte $AA ; 01 01 01 0 -> 1 01 01 01 0 = $AA ; white orange +.byte $BB ; 11 01 11 0 -> 1 01 11 01 1 = $BB ; med white/o +.byte $FF ; 11 11 11 1 -> 1 11 11 11 1 = $FF ; wwo +.byte $FF ; 11 11 11 1 -> 1 11 11 11 1 = $FF ; white +.byte $FF ; 11 11 11 1 -> 1 11 11 11 1 = $FF ; white/blue +.byte $F7 ; 11 10 11 1 -> 1 11 10 11 1 = $F7 ; med white/blue +.byte $D5 ; 10 10 10 1 -> 1 10 10 10 1 = $D5 ; blue/white +.byte $D5 ; 10 10 10 1 -> 1 10 10 10 1 = $D5 ; blue +.byte $D5 ; 10 10 10 1 -> 1 10 10 10 1 = $D5 ; black/blue +.byte $C4 ; 00 10 00 1 -> 1 10 00 10 0 = $C4 ; med +.byte $00 ; med/dark + +hires_colors_odd_lookup_l1: +.byte $00 ; black +.byte $00 ; dark orange +.byte $91 ; 1 00 01 00 -> 1 00 10 00 1 = $91 ; med orange +.byte $D5 ; 1 01 01 01 -> 1 10 10 10 1 = $D5 ; light orange +.byte $D5 ; 1 01 01 01 -> 1 10 10 10 1 = $D5 ; solid orange +.byte $D5 ; 1 01 01 01 -> 1 10 10 10 1 = $D5 ; white orange +.byte $F7 ; 1 11 01 11 -> 1 11 10 11 1 = $F7 ; med white/o +.byte $FF ; 1 11 11 11 -> 1 11 11 11 1 = $FF ; wwo +.byte $FF ; 1 11 11 11 -> 1 11 11 11 1 = $FF ; white +.byte $FF ; 1 11 11 11 -> 1 11 11 11 1 = $FF ; white/blue +.byte $EE ; 0 11 10 11 -> 1 11 01 11 0 = $EE ; med white/blue +.byte $AA ; 0 10 10 10 -> 1 01 01 01 0 = $AA ; blue/white +.byte $AA ; 0 10 10 10 -> 1 01 01 01 0 = $AA ; blue +.byte $AA ; 0 10 10 10 -> 1 01 01 01 0 = $AA ; black/blue +.byte $A2 ; 0 10 00 10 -> 1 01 00 01 0 = $A2 ; med +.byte $00 ; med/dark + + +.include "../hgr_clear_screen.s" + +;.include "hgr_table.s" + +.align 256 +sin1: +.incbin "tables" +sin2=sin1+256 +sin3=sin2+256 diff --git a/demos/second/part12_plasma/tables b/demos/second/part12_plasma/tables new file mode 100644 index 0000000000000000000000000000000000000000..2449117f4372a2dd37952432c64a3c844fb10154 GIT binary patch literal 768 zcmZ9K*><8p6h+mvib|YNL_rV?4xpgmfPfPyiY6N8ba(9k|B9q>-BcKy?q0V>-BoMoKL6Y;qbcO?OvX@ zn~lF-dCP_CIP=+bG9KHOX^sqII2iQ%y`HXXS{LX5>i;PJ(FR(8EK5?e*=W@3HBo%3 zRt3IN;n*@m)1@L+AoDqb$Y#>1RPqtW6Y+Qq!=lk>BoYaK1B+-B!(#D70)I@V(wQug zBMVfCW>}6Fp2T`XlH002w5INAyE~k(Z@=E}_doah`|qE(%W?ngFP(`w&=jdAur!s= zrXCY<^a|V>OW?^gK~gj)hz(iQ`i3>0ISX&K_BRNW$HJLSY;)MxJ4#Dx)Sh4h7y!X? zm9Gyp<+jq%dSCI6C({`M;QFc^9WWAS7rS12)DML_Tz z%OE`zRfIi3Y%1CS()E036x77`+^KE!I&G;gf=`|os>ni90@IKW&(Z}Vg=67R;Pd0- zGY|@6csgG!3$JF^X4l|;T=B#8_(1C$ea Zk}5G}mPO4e7IMg83^~N&c$z3M{9oF+hk^hA literal 0 HcmV?d00001 diff --git a/demos/second/start.s b/demos/second/start.s index 262295c7..fdc81599 100644 --- a/demos/second/start.s +++ b/demos/second/start.s @@ -159,11 +159,22 @@ load_program_loop: ;========================== ;======================= - ; run PLASMACUBE (#9) + ; run PLASMACUBE (#7) + ;======================= + ; copy PLASMACUBE from AUX $3000 to MAIN $8000 + + lda #$30 ; AUX src $3000 + ldy #$80 ; MAIN dest $8000 + ldx #16 ; 16 pages + jsr copy_aux_main + jsr $8000 + + ;======================= + ; run PLASMACUBE (#8) ;======================= ; copy PLASMACUBE from AUX $2000 to MAIN $8000 - lda #$20 ; AUX src $1000 + lda #$20 ; AUX src $2000 ldy #$80 ; MAIN dest $8000 ldx #16 ; 16 pages jsr copy_aux_main diff --git a/demos/second/zp.inc b/demos/second/zp.inc index b2e29135..fac4175c 100644 --- a/demos/second/zp.inc +++ b/demos/second/zp.inc @@ -205,15 +205,14 @@ PARAM1 = $60 PARAM2 = $61 PARAM3 = $62 PARAM4 = $63 -;count = $64 -;count2 = $65 -GRLINE = $F2 -GRLINEH = $F3 -;IndexMask = $F4 -;Mask = $F5 +GRLINE = $F2 +GRLINEH = $F3 +; PLASMA + +PAGE = $F2