{{ proto003.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 bitmap_base1 = $2000 bitmap_base2 = $5000 VAR long tv_status1, tv_enable1, tv_pins1, tv_mode1, tv_screen1, tv_colors1 long tv_hc1, tv_vc1, tv_hx1, tv_vx1, tv_ho1, tv_vo1, tv_broadcast1, tv_auralcog1 long tv_status2, tv_enable2, tv_pins2, tv_mode2, tv_screen2, tv_colors2 long tv_hc2, tv_vc2, tv_hx2, tv_vx2, tv_ho2, tv_vo2, tv_broadcast2, tv_auralcog2 long colors[64] word screen1[x_tiles * y_tiles], screen2[x_tiles * y_tiles] OBJ midiIn : "MidiIn03" midiOut : "MidiOut01" audio : "AudioOut06" tv[2] : "E_TV02" gr[2] : "E_Graphics03" PUB start | i, k, dx, dy, dummy, para, dark, p[20], q[20] midiIn.start(27) midiOut.start(26) audio.start(24, 25) longmove(@tv_status1, @tvparams, 14) tv_screen1 := @screen1 tv_colors1 := @colors tv[0].start(@tv_status1) longmove(@tv_status2, @tvparams, 14) tv_status2[2] += %0101 tv_screen2 := @screen2 tv_colors2 := @colors tv[1].start(@tv_status2) gr[0].setup(x_tiles, y_tiles, x_origin, y_origin, bitmap_base1) gr[1].setup(x_tiles, y_tiles, x_origin, y_origin, bitmap_base2) repeat dx from 0 to tv_hc1 - 1 repeat dy from 0 to tv_vc1 - 1 screen1[dy * tv_hc1 + dx] := bitmap_base1 >> 6 + dy + dx * tv_vc1 + ((dy & $3F) << 10) screen2[dy * tv_hc1 + dx] := bitmap_base2 >> 6 + dy + dx * tv_vc1 + ((dy & $3F) << 10) repeat i from 0 to 63 colors[i] := $00001010 * ( (i+4) & $F ) + $2B060C02 p[0] := 1 repeat k++ if ++dark > 123 dark := 0 gr[0].clear gr[1].clear 'draw spinning triangles gr[0].colorwidth(3,0) gr[1].colorwidth(p[0],p[1]) repeat i from 1 to 8 gr[0].vec(0, 0, (k & $7F) << 3 + i << 5, k << 6 + i << 8, @vecdef) gr[1].vec(0, 0, (k & $7F) << 3 + i << 5, k << 6 + i << 8, @vecdef) 'draw expanding pixel halo 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 midiOut.fifoset(dummy) if (dummy & $FF00FF) == $900064 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 p[0] := dummy & $00007F elseif (dummy & $FFFF00) == $B00200 p[1] := dummy & $00007F elseif (dummy & $FFFF00) == $B00300 p[2] := dummy & $00007F repeat i from 0 to 63 colors[i] := p[2] * ( (i+4) & $F ) + $2B060C02 DAT f_number long 1294309430,1371273070,1452813200,1539201960 long 1630727660,1727695770,1830429900,1939272920 long 2054588080,2176760240,2306197130,2443330740 tvparams 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 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