Ecco la versione più recente del programma T.I.M. ovvero "The incredible Machine", nome di una fantasia estrema....
Ora vi spiego cosa serve e cosa fa il programma basic che allego al messaggio, basta fare un drag e drop dentro al VICE e poi con esc fermarlo per vedere il listato...
Prima un po' di info anche sull'hardware, TIM è un sequencer di luci per discoteca, con 12 canali a 220 volt a cui connettere le classiche lampade colorate, utile per creare una discoteca molto anni 80.
L'hardware è collegato alla user port del C-64 tramite una interfaccia isolata da fotoaccoppiatori, ora vediamo come ottenere 12 luci indipendenti con la user port.
La porta ha 8 linee programmabili come in o out, ne usiamo una come input ( l'ultima) e 7 come output, la linea di input la uso per leggere una linea audio AUX dalla quale ottenere i picchi della musica per far avanzare le luci a ritmo, le altre 7 sono usate così: 6 linee per gestire le luci e una per gestire il multiplexer, ovvero se la linea è a 0 comando le luci da 1 a 6 poi
portando la linea del multillexer ad 1 (alto) mando i segnali per le seconde 6 luci, così facendo ho 12 luci indipendenti.
da qui si capisce che per gestire le 12 luci devo sempre mandare una coppia di dati sulla porta, una con il multiplexer basso e una col multiplexer alto.
Le sequenze, per usare la centralina come luci da discoteca bisogna gestire degli effetti, ad esempio una lampada che viene accesa una dopo l'altra, luce 1 accesa, le altre 11 spente, poi spengo la 1 accendendo la 2 e le altre sempre spente.... ecc, così il punto luminoso scorre per le 12 luci, sempre col sistema delle 6 + 6 luci.
Le poke usate sono solo 2, all'inizio si setta la porta con poke 56579,127, poi con poke 56577,x ripetuta mando le 2 data per le 12 luci (6+6)
i valori usati sono da 0 a 63 per le prime 6 luci e da 64 a 127 per le altre 6, i codici sono ripetuti se le posizioni delle luci sono simmetriche, basta mandare il primo valore e poi il primo valore +64.
Mi spiego:
luci tutte spente poke 56579,0: poke 56577,64 (64=0+64)
luci tutte accese: poke 56579,63: poke 56579,127 (63+64=127)
Quante comnbinazioni ottengo con 12 luci= 4096 combinazioni ( 64 per ogni banco, quindi 64 *64= 4096)
Per leggere i picchi della musica basta leggere con peek sempre la locazione 56577, se il valore è maggiore di 127 il picco è presente e il programma reagisce facendo avanzare le sequenze delle luci.
quindi per gestire le luci ed ottenere degli effetti è sufficiente mandare alla user port delle sequenze di poke, sempre a coppie e si ottiene il movimento delle luci, più è veloce l'invio e più veloce è l'effetto ottenuto, l'importante è avere la fantasia giusta per creare inseguimenti, lampi scie e quant'altro.
E qui la cosa si fa complessa, per ottenere velocità ho fatto si che il programma carichi i valore da dare alle poke in una variabile bidimensionale DIMensionata DIM A%(5000,1) così abbiamo la possibilità di gestire 5000,0 valori per il primo banco e 5000,1 per il secondo, vi sembrerà strano ora ma non è grande la variabile, definiti gli effetti forse sarà da ingrandire, leggete fino in fondo prima di tirare conclusioni....
Ora bisogna capire come passare al prg le sequenze numeriche, usando le linee di DATA è la soluzione più veloce, ovvio che bisogna creare a penna le sequenze perchè per ottenere solo un punto luminoso che scorre ci vogliono 24 valori, per farlo continuo si ripete la stessa sequenza all'infinito, non bisogna scrive infinite volte la sequenza.
Un problema che si è posto è come gestire la lunghezza delle sequenze perchè è una cosa che può variare spesso in base all'idea che ci viene, ho realizzato sequenze da 400 step che corrispondono a 800 DATA da leggere, quindi ogni sequenza avrà un inizio e una fine e questo crea pasticci perche la lettura dei DATA è sequenziale, quindi se vogliamo mettere 3 sequenze dobbiamo sapere esattamente dove ognuna inizia e finisce all'interno della sequenza dei data, ma se vogliamo inserire altri step in una sequenza dobbiamo ricalcolare ogni inzio e fine.
Quindi ?? ho creato un formato da leggere nei data affinche il prg sappia da solo capire l'inizio, il nome, la lunghezza e la fine di ogni sequenza così non devo ricalcolare ogni volta il tutto, poi la READ dei data non deve andare in errore quindi va messo un qualcosa che dica che si è letto l'ultimo valore dell'ultima sequenza e non si deve READ altri DATA.
ecco un esempio:
DATA 150,"strobo",63,127,0,64,250
150 definisce l'inzio della sequenza ed è sempre seguito dal nome, poi ci sono le coppie di valori e poi il valore 250 dice che la sequenza è finita, se dopo ci fosse un 255 vuol dire che non c'è più nulla da leggere.
Nell'esempio la macchina accende e poi spegne le 12 luci, ripetendo si ottiene un effetto strobo su tutti i 12 canali.
Le sequenze hanno un nome, come si vede, e questo viene mostrato a video nell'elenco delle sequenze disponibili così si ricorda l'effetto mnemonicamente.
Il programma mostra il numero della sequenza in esecuzione.
Sapendo l'inizio e la fine di ogni sequenza si può far andare indietro il ciclo con uno STEP-1 e l'effetto della sequenza è al contrario...
Un ciclo for next su se stesso crea un ritardo se le luci sono troppo veloci, ovvio che il valore si cambia in real time...
Il monitor delle luci, per non dover collegare la macchina ogni volta ci vuole il monitor che mostra lo stato delle 12 luci esattamente come sono al vero, anche qui sono ricorso ai data dove ho creato le 64 possibili condizioni per ogni 6 banchi di luci e ripetendole per il secondo banco ho un monitor in real time che reagisce agli stessi valori di POKE inviati alla porta, così si vede se l'effetto è corretto o da problemi.
Altre cose sono banali, con f1 accendo tutte le luci e f3 le spengo, utile per illuminare fisso il locale in caso di allestimenti o problemi... idem spegnere tutto se si vuole passare ad altri effetti presenti in sala tipo laser o altro.
Poi.. il programma può passare da automatico a sincronizzato con la musica con la sola pressione di un tasto, NON passate a sincronizzato se testate il mio prg su un c-64 vero perchè senza l'audio in ingresso si ferma in attesa del picco musicale che non gli arriverà mai, sul vice non succede nulla....
Dopo un bel po di teoria passiamo al programma vero e proprio.
Alla partenza viene presentata una schermata di transizione dove il programma è impegnato nella creazione del banco monitor, ovvero la lettura dei data, la macchina esegue la sequenza dei poke per vedere il funzionamento, poi le luci sono spente.
Ora parte la compilazione della variabile a%(5000,1) che contiene le sequenze che sono variabili in numero da 1 a 30.
Il programma mostra il progressivo della sequenza in compilazione e il relativo nome, una specie di ventola mostra che il prg NON è piantato, ci mette un po, ma leggere qualche centinaio di data e separare le sequenze ci vuole un po...
Poi terminata la compilazione la schermata cambia e il prg mostra le sequenze compilate associandole ai relativi tasti di selezione, le sequenze sono in numero variabile a scelta da 1 a 30, ci pensa il programma a mostrare i nomi a video per un max di 30 sequenze.
poi il programma si setta con le luci tutte accese fisse e attiva il monitor.
Il programma è in modalità automatica e il reverse delle sequenze è disinserito, il ritardo sulle sequanze è posto a 0 ( zero).
Ora basta premere i tasti mostrati sullo schermo per vedere il monitor mostrare i giochi di luci che sono gli stessi che vedremmo sulle 12 luci se fosse collegata la Incredible Machine.
Vi sembreranno strane alcune cose come il modo in cui il prg mette i nomi delle sequnze a video, siccome lo spazio di ogni nome è di 10 caratteri il prg ne tiene conto e se il nome è più lungo lo tronca senza variare l'incolonnamento delle 3 colonne dei nomi.
Idem per mostrare il numero o lettera della sequenza in uso, che corrisponde al carattere della tastiera associato, uso una poke con il valore del carattere e non una print che deve tener presente posizione di riga e colonna ogni volta.
Se vi sembra lungo il tempo di compilazione delle sequenze campione che ci sono nel programma potete limitarlo ad usare le prime 4 mettendo un 255 alla fine dell'utima sequenza che volete usare senza cancellare le DATA successive, noterete che sullo schermo anche i nomi delle sequenze non usate non saranno presenti, le sequenze non assegnate sono come la 1
Importante è lasciare sempre fissa e non modificata la prima sequenza definita STROBO perchè uso i relativi valori per avere con F1 ed F3 le luci accese o spente.
Vi accorgerete che in alcune righe di codice supero gli 80 caratteri di testo, è una forzatura, sto risolvendo il problema perchè senò diventa difficile modificarle dentro al vice o su un c-64 vero.
Se volete vedere come si comporta la velocità delle luci usando il BLITZ! compiler... beh provate !!! ecco perchè vorrei passare all'assembly !!
Sperando di avervi incuriosito vi saluto
RAZ
qui sotto grazie alla dritta di eregil trovate il link al sorgente per il VICE
http://www.megaupload.com/?d=5E79LRML