Autore Topic: Istruzione Wait  (Letto 4992 volte)

djwiper

  • Utente
  • **
  • Post: 197
  • Gioco Preferito: Sim City
Istruzione Wait
« il: 09 Giugno 2004, 12:05:09 »
 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:  
Ho capito di odiare le firme...

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Istruzione Wait
« Risposta #1 il: 09 Giugno 2004, 18:43:13 »
 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

  • Utente
  • **
  • Post: 197
  • Gioco Preferito: Sim City
Istruzione Wait
« Risposta #2 il: 09 Giugno 2004, 20:35:04 »
 E luce fu :hail:
Grazie Alberto, davvero grazie!

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

1)
Codice: [Seleziona]
10 WAIT 198,1
20 PRINT "COMMODORE"

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

Codice: [Seleziona]
10 WAIT 198,2
20 PRINT "COMMODORE"

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: [Seleziona]
10 WAIT 198,3
20 PRINT "COMMODORE"

 :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
Ho capito di odiare le firme...

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Istruzione Wait
« Risposta #3 il: 09 Giugno 2004, 21:35:33 »
 Andiamo per ordine ;)
Citazione
"Bene," -mi sono detto-"il primo parametro indica il numero di byte necessari (e di conseguenza i tasti da pigiare).
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è?
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
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?
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

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Istruzione Wait
« Risposta #4 il: 09 Giugno 2004, 21:37:01 »
 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.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Istruzione Wait
« Risposta #5 il: 09 Giugno 2004, 21:55:14 »
 
Citazione da: "Alberto"
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... )
 
Seguendo il disassemblato
Codice: [Seleziona]
; WAIT command

B82D   20 EB B7   JSR $B7EB
B830   86 49      STX $49
B832   A2 00      LDX #$00
B834   20 79 00   JSR $0079
B837   F0 03      BEQ $B83C
B839   20 F1 B7   JSR $B7F1
B83C   86 4A      STX $4A
B83E   A0 00      LDY #$00
B840   B1 14      LDA ($14),Y
B842   45 4A      EOR $4A
B844   25 49      AND $49
B846   F0 F8      BEQ $B840
B848   60         RTS
si evince che prima fa la XOR e poi la AND. Come risolvere il problema dei 3 tasti, a parte fare wait198,2:poke198,0:wait198,1 ?
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Istruzione Wait
« Risposta #6 il: 09 Giugno 2004, 22:17:49 »
 
Citazione
si evince che prima fa la XOR e poi la AND

...e,volendo essere precisi,la formalizzazione esatta sarebbe
IF ( ( locazione XOR param2 ) AND param1 ) == 0 then attendi
else sblocca
 :maximo:

Citazione
Come risolvere il problema dei 3 tasti, a parte fare wait198,2:poke198,0:wait198,1 ?
Sì,penso sia l'unico modo possibile se si attende la pressione di 3 tasti  :huh:

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Istruzione Wait
« Risposta #7 il: 09 Giugno 2004, 23:02:13 »
Citazione da: "Alberto"
Citazione
wait198,2:poke198,0:wait198,1 ?
Sì,penso sia l'unico modo possibile se si attende la pressione di 3 tasti  :huh:
Oppure lasciare perdere il basic una volta per tuttte:
Codice: [Seleziona]
   jsr clear
check    
    lda $c6
    cmp #$03
    bne check
    
clear
    lda #$00
    sta $c6
    rts
e buonanotte al secchio :ciapet:  
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Istruzione Wait
« Risposta #8 il: 09 Giugno 2004, 23:08:09 »
 Caro Ian,abbiamo parlato troppo presto!Si potrebbe fare

5 IF PEEK(198)<3 THEN 5
 :stordita:  

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Istruzione Wait
« Risposta #9 il: 10 Giugno 2004, 09:42:47 »
 Io mi trovo tanto bene con GET!

(ovviamente sto scherzando... qui si parlava del funzionamento di WAIT...) :overkiller:  
-=MarC=ellO=-

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Istruzione Wait
« Risposta #10 il: 10 Giugno 2004, 10:23:47 »
 
Peraltro mi sono accorto che cade in errore anche la stessa Guida del programmatore ( versione originale ). :(
Infatti dice che,quando la WAIT ha due parametri,si mette la memoria prima in AND col primo e poi in XOR col secondo,quando è esattamente il contrario.
A ben vedere,le due cose non sono equivalenti. :nonono:
Infatti,se si ha
MEMORIA = 0

e PAR1 = 0,PAR2 = 1

se si fa come dice la 64PRG,si ha 0 AND 0 XOR 1 = 1
invece,il C64 fa 0 XOR 1 AND 0 = 0

djwiper

  • Utente
  • **
  • Post: 197
  • Gioco Preferito: Sim City
Istruzione Wait
« Risposta #11 il: 10 Giugno 2004, 11:05:16 »
 Vi ringrazio!
Hihihihi  :D , fonderò la mia bella stampante laser con tutte queste pagine di documenti!

Ritornando all'istruzione WAIT credo di aver capito perfettamente il suo funzionamento. Ora tutto sta a comprendere le giuste locazioni e memorizzare la corretta sintassi. Che se ho capito bene è questa (lo riscrivo giusto per memorizzare)

WAIT locazione, para1, para2

IF (para2 XOR locazione) <> 0 THEN sblocca
ELSE
IF (para2 AND locazione) <> 0 THEN sblocca
ELSE ripeti il ciclo fino a quando una delle due IF sblocca

Traducendo in altro basic

10 WAIT 198,1
20 PRINT "OK"

=

5 POKE 198,0
10 IF PEEK(198) <> 1 THEN 10 oppure IF PEEK(198) <1 then 10
15 PRINT "OK"

Promosso?
Ho capito di odiare le firme...

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Istruzione Wait
« Risposta #12 il: 10 Giugno 2004, 14:05:24 »
 
Codice: [Seleziona]
IF ( ( locazione XOR param2 ) AND param1 ) == 0 then attendi
else sblocca
Questa è la formula esatta:prima una XOR col secondo parametro ( se il secondo parametro non c'è,fa la XOR con 0 ),poi una AND col primo;se risulta 0,aspetta, altrimenti sblocca.Facile no?? :D  ;)  

djwiper

  • Utente
  • **
  • Post: 197
  • Gioco Preferito: Sim City
Istruzione Wait
« Risposta #13 il: 10 Giugno 2004, 14:38:02 »
Citazione da: "Alberto"
Facile no??
 :P  
Ho capito di odiare le firme...