{{ proto002.spin }} CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 _stack = ($3000 + $3000 + 190) >> 2 'accomodate display memory and stack x_tiles = 16 y_tiles = 12 x_origin = 128 y_origin = 96 paramcount = 14 bitmap_base1 = $2000 bitmap_base2 = $5000 display_base1 = $2000 display_base2 = $5000 lines = 10 VAR long tv_status1, tv_enable1, tv_pins1, tv_mode1, tv_screen1 long tv_colors1, tv_hc1, tv_vc1, tv_hx1, tv_vx1, tv_ho1, tv_vo1 long tv_broadcast1, tv_auralcog1 long tv_status2, tv_enable2, tv_pins2, tv_mode2, tv_screen2 long tv_colors2, tv_hc2, tv_vc2, tv_hx2, tv_vx2, tv_ho2, tv_vo2 long tv_broadcast2, tv_auralcog2 word screen1[x_tiles * y_tiles] word screen2[x_tiles * y_tiles] long colors1[64] long colors2[64] byte x1[lines], y1[lines], xs1[lines], ys1[lines] byte x2[lines], y2[lines], xs2[lines], ys2[lines] OBJ midiIn : "MidiIn03" audio : "AudioOut06" tv[2] : "E_TV02" gr[2] : "E_Graphics02" PUB start | i, k, dx, dy, dummy, para, p1, p2, dark midiIn.start(27) audio.start(24, 25) longmove(@tv_status1, @tvparams1, paramcount) tv_screen1 := @screen1 tv_colors1 := @colors1 tv[0].start(@tv_status1) longmove(@tv_status2, @tvparams2, paramcount) tv_screen2 := @screen2 tv_colors2 := @colors2 tv[1].start(@tv_status2) repeat i from 0 to 63 colors1[i] := $00001010 * (i+4) & $F + $2B060C02 colors2[i] := $00001010 * (i+24) & $F + $2B060C02 repeat dx from 0 to tv_hc1 - 1 repeat dy from 0 to tv_vc1 - 1 screen1[dy * tv_hc1 + dx] := display_base1 >> 6 + dy + dx * tv_vc1 + ((dy & $3F) << 10) repeat dx from 0 to tv_hc2 - 1 repeat dy from 0 to tv_vc2 - 1 screen2[dy * tv_hc2 + dx] := display_base2 >> 6 + dy + dx * tv_vc2 + ((dy & $3F) << 10) gr[0].start gr[0].setup(x_tiles, y_tiles, x_origin, y_origin, bitmap_base1) gr[1].start gr[1].setup(x_tiles, y_tiles, x_origin, y_origin, bitmap_base2) dark := 0 p1 := 2 p2 := 0 repeat k++ if ++dark > 123 dark := 0 gr[0].clear gr[1].clear 'draw spinning triangles gr[0].colorwidth(3,0) repeat i from 1 to 8 gr[0].vec(0, 0, (k & $7F) << 3 + i << 5, k << 6 + i << 8, @vecdef) gr[1].colorwidth(p1,p2) repeat i from 1 to 8 gr[1].vec(0, 0, (k & $7F) << 3 + i << 5, k << 6 + i << 8, @vecdef) 'draw expanding pixel halo ' gr[0].colorwidth(1,k) ' gr[0].arc(0,0,80,30,-k<<5,$2000/9,9,0) gr[1].colorwidth(1,k) gr[1].arc(0,0,80,30,-k<<5,$2000/9,9,0) 'draw spinning stars gr.colorwidth(dark/30+1,0) repeat i from 0 to 7 gr[0].vecarc(0,0,30,30,-(i<<10+k<<6),$A0,-(k<<7),@vecdef2) dummy := midiIn.event if dummy <> -1 if (dummy & $FF00FF) == $900064 audio.change2(0) para := (dummy & $007F00) >> 8 para := f_number[ (para+4) // 12 ] >> ( (127-para) / 12 ) audio.change1(para) gr[0].clear gr[1].clear elseif (dummy & $FFFF00) == $B00000 para := dummy & $000007 audio.change2(para) elseif (dummy & $FFFF00) == $B00100 p1 := dummy & $00007F elseif (dummy & $FFFF00) == $B00200 p2 := dummy & $00007F DAT f_number long 1294309430,1371273070,1452813200,1539201960 long 1630727660,1727695770,1830429900,1939272920 long 2054588080,2176760240,2306197130,2443330740 tvparams1 long 0 'status long 1 'enable long %001_0000 'pins --- 8..10=[001_0000] , 12..14=[001_0101] long %0000 'mode long 0 'screen long 0 'colors long x_tiles 'hc long y_tiles 'vc long 10 'hx long 1 'vx long 0 'ho long 0 'vo long 0 'broadcast long 0 'auralcog tvparams2 long 0 'status long 1 'enable long %001_0101 'pins --- 8..10=[001_0000] , 12..14=[001_0101] long %0000 'mode long 0 'screen long 0 'colors long x_tiles 'hc long y_tiles 'vc long 10 'hx long 1 'vx long 0 'ho long 0 'vo long 0 'broadcast long 0 'auralcog vecdef word $4000+$2000/3*0, 50, $8000+$2000/3*1+1, 50 word $8000+$2000/3*2-1, 50, $8000+$2000/3*0, 50 word 0 vecdef2 word $4000+$2000/12*0, 50, $8000+$2000/12*1, 20 word $8000+$2000/12*2, 50, $8000+$2000/12*3, 20 word $8000+$2000/12*4, 50, $8000+$2000/12*5, 20 word $8000+$2000/12*6, 50, $8000+$2000/12*7, 20 word $8000+$2000/12*8, 50, $8000+$2000/12*9, 20 word $8000+$2000/12*10, 50, $8000+$2000/12*11, 20 word $8000+$2000/12*0, 50 word 0