Commodore 64 > Programmazione, Grafica e Musica

Istruzione Wait

(1/3) > >>

djwiper:
 Visto che ancora non ho ben afferrato a cosa serva... Diciamo che non potendola inquadrare in alcun contesto di programmazione la sperimento in maniera "random" ma un buon 90% delle volte va a finire che si blocca l'emulatore. :huh:  

Alberto:
 Ciao

Premetto che,se non conosci un pò di algebra booleana,la mia spiegazione potrebbe sembrarti arabo. :doh:

WAIT è una funzione del Basic che,come dice il nome,"aspetta" qualcosa.
Ma che cosa aspetta?Che nella memoria del C64,una certa locazione contenga un valore che soddisfi certe condizioni.
La WAIT può accettare un parametro o due ( il secondo parametro è opzionale ).

il formato dell'istruzione è

WAIT ,,

quando si chiama la WAIT,l'esecuzione del programma Basic viene sospesa fino a che contiene un valore che,messo in AND con ,produce un risultato diverso da 0.
Ad esempio,poni di avere in memoria un listato del genere,e mandalo in esecuzione

5 WAIT 198,1
10 PRINT "COMMODORE 64"

Ti accorgerai che la stringa 'Commodore 64' non viene stampata a schermo finchè non premi un tasto ( tecnicamente,il programma sospende l'esecuzione fino a quando il buffer di tastiera contiene un carattere da stampare  ;) )

Invece,se la WAIT contiene 2 parametri,il programma viene sospeso fino a quando una certa locazione contiene un valore che,messo in XOR con ,e in AND con ,produce un valore diverso da 0.
Se provi a modificare il programma soprastante così
 
5 WAIT 198,1,1
10 PRINT "COMMODORE 64"

Ti accorgerai che la stringa 'Commodore 64' viene stampata immediatamente;infatti,il programma interrompe l'esecuzione per tutto il tempo in cui il buffer di tastiera non è vuoto ( il che significa che non bisogna premere alcun tasto per sbloccare il programma ).

Spero di essere stato sufficientemente chiaro.
Ciao
 :ciauz:

djwiper:
 E luce fu :hail:
Grazie Alberto, davvero grazie!

Se ti è possibile mi leveresti un'altra serie di curiosità?

1)

--- Codice: ---10 WAIT 198,1
20 PRINT "COMMODORE"
--- Termina codice ---

Aspetta che nel buffer della tastiera venga inserito qualche valore (o più semplicemente venga pigiato un tasto) prima di passare alla linea 20


--- Codice: ---10 WAIT 198,2
20 PRINT "COMMODORE"
--- Termina codice ---

In questo caso devo premere due tasti... "Bene," -mi sono detto-"il primo parametro indica il numero di byte necessari (e di conseguenza i tasti da pigiare). Perciò se volessi "aspettare" la pressione di tre tasti dovrei, semplicemente, programmare così:


--- Codice: ---10 WAIT 198,3
20 PRINT "COMMODORE"

--- Termina codice ---

 :nonono:  :confused: Non funge... Basta pigiare un solo tasto! Perchè?

2)
Sempre riguardo al WAIT, da quanto ho capito, una traduzione un pò grossolana sarebbe la seguente

WAIT locazione, para1, para2
=
IF (para1 AND locazione) 0 AND (para2 XOR locazione) 0 then
...

3)
Ma se l'interprete aspetta che una determinata condizione avvenga, ehm, non si blocca? Voglio dire che se:

10 WAIT fino a quando il colore dello sfondo sia diverso da, grigio
20 POKE 53281,grigio  :P

hai voglia di aspettare... Sono sicuro che ti/vi sembrerà una banalità ma ho una concezione di programmazione limitata allo step-by-step

4)
Come hai, egregiamente, spiegato WAIT aspetta il determinarsi di una condizione in una locazione di memoria. La locazione 198, ho appreso, è quella che in un certo senso monitora il keybuffer. Suppongo esistano centinaia di altre condizioni, ci sarà ad esempio una condizione di schermo grigio, bianco, viola, una condizione di presenza di un carattere nella prima linea, di un array e via dicendo (pardon per gli esempi, le prime cose che mi vengono in mente  :huh: )
Ma come posso desumere le corrette locazioni senza venire a rompere a voi?

Comunque voglio davvero ringraziarvi.
Ciauz

Alberto:
 Andiamo per ordine ;)

--- Citazione ---"Bene," -mi sono detto-"il primo parametro indica il numero di byte necessari (e di conseguenza i tasti da pigiare).
--- Termina citazione ---
Attento,non è proprio così.Il primo parametro dà il termine con cui mettere in AND il valore nella locazione esaminata.Qui serve conoscere i numeri binari

--- Citazione ---Perciò se volessi "aspettare" la pressione di tre tasti dovrei, semplicemente, programmare così:


CODE 
10 WAIT 198,3
20 PRINT "COMMODORE"
 



  Non funge... Basta pigiare un solo tasto! Perchè?

--- Termina citazione ---
Perchè la WAIT aspetta finchè il valore in 198,messo in AND con 3,dà un valore diverso da 0.
In questo caso,quindi,basta che il bit 0 o 1 del valore in 198 non sia nullo,affinchè l'esecuzione del programma venga sbloccata.E poichè il bit 0 di 1(cioè il numero di caratteri nel buffer) è pari a 1,è sufficiente premere un solo tasto perchè il programma venga sbloccato. :)

--- Citazione ---2)
Sempre riguardo al WAIT, da quanto ho capito, una traduzione un pò grossolana sarebbe la seguente

WAIT locazione, para1, para2
=
IF (para1 AND locazione) 0 AND (para2 XOR locazione) 0 then
...
3)
Ma se l'interprete aspetta che una determinata condizione avvenga, ehm, non si blocca? Voglio dire che se:

10 WAIT fino a quando il colore dello sfondo sia diverso da, grigio
20 POKE 53281,grigio 

hai voglia di aspettare... Sono sicuro che ti/vi sembrerà una banalità ma ho una concezione di programmazione limitata allo step-by-step

--- Termina citazione ---
Attento:innanzitutto,per formalizzare la WAIT,sarebbe più giusto scrivere

WAIT locazione, para1, para2
=
IF (para1 AND locazione ) 0 then sblocca
ELSE  
IF (para2 XOR locazione) 0 then sblocca
else ( ...ritesta il contenuto della locazione... )

L'interprete rimane bloccato per un tempo indeterminato,finchè il contenuto della locazione testata non contiene un valore che soddisfi una delle condizioni;nel tuo programma,ad esempio,il C64 rimane bloccato alla riga 10 all'infinito,a meno che tu non prema RUN-STOP/RESTORE o che,nel momento dell'esecuzione del programma,la locazione 53281 contenga già il valore corrispondente al colore grigio.
Detto questo,quindi,ovvio che se metti

WAIT ...,0

questa istruzione blocca l'esecuzione del programma all'infinito,finchè non si preme RUN-STOP/RESTORE;come è noto dall'algebra booleana,infatti,nessun valore in AND con 0 può dare un valore diverso da 0. ;)
Esistono locazioni che il C64 modifica con una certa frequenza,indipendentemente dal flusso del programma in esecuzione come,ad esempio il buffer di tastiera,o il rasterbeam,o ancora l'orologio di sistema;non ha molto senso,infatti,usare la WAIT per locazioni tipo il colore dello sfondo o il bordo,che possono essere modificate solo per volontà dell'utente,e di cui si conosce già a priori l'esito della computazione
 ;)
 

--- Citazione ---4)
Come hai, egregiamente, spiegato WAIT aspetta il determinarsi di una condizione in una locazione di memoria. La locazione 198, ho appreso, è quella che in un certo senso monitora il keybuffer. Suppongo esistano centinaia di altre condizioni, ci sarà ad esempio una condizione di schermo grigio, bianco, viola, una condizione di presenza di un carattere nella prima linea, di un array e via dicendo (pardon per gli esempi, le prime cose che mi vengono in mente  )
Ma come posso desumere le corrette locazioni senza venire a rompere a voi?
--- Termina citazione ---
Innanzitutto,per noi non è una rottura,bensì un piacere
Ad ogni modo,se per te l'inglese non è un problema,leggi
http://unusedino.de/ec64/technical/project...apping_c64.html
E' il massimo!
Ciao
 :ciauz:

iAN CooG:
 La loc. 198 contiene il numero di caratteri nel buffer di tastiera (max 10), ma non funziona come speri, nel buffer di tastiera rimangono solo i tasti che non riesce a processare perche' impegnato a far altro o perche' si e' bloccato l'interrupt per un istante etc.
In effetti un piu' corretto utilizzo in questo caso e':
poke198,0:wait198,1:poke198,0
Cioe' svuota il buffer*, senti se e' premuto un tasto e risvuotalo per sicurezza.
*o meglio, ignora i codici gia' presenti del buffer azzerando il contatore.

Non funziona con 3 perche' il bit 0 e' acceso con un solo tasto ( 198 AND 3 = vero )
prova con 4/8 e funziona :)

Per il fatto che puo' bloccare, beh, e' lasciato al programmatore il compito di controllare la locazione giusta col valore giusto, e ad imparare dai proprio sbagli ;)

Per le locazioni e il loro significato ovviamente bastano i dox su project 64, Programmer's reference guide e ML programming di Jim Butterfield in primis, e dato che non fa mai male, il disassemblato commentato dellla ROM del c64.

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa