Newsgroup: it.comp.lang.pascal
Titolo: TSR e la tastiera....

const Tastiint = $09 ;   { interrupt tastiera }
var   Tastiintorig : pointer ;
      tasto : char ;
procedure sti;
 inline($fa);
Ciao a tutti , ho un problemino con i TSR :
procedure chiamaorigint(sub : pointer);
 begin
  inline($9c/$ff/$5e/$06);
 end;
procedure tastiera (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
interrupt;
 begin
 Chiamaorigint (tastiintorig);
 {tasto := readkey ;
 if tasto = 'p'then
 begin ;}
  sound (800);
  delay (80);
  nosound ;
{ end;}
 end;
Begin { programma }
 getintvec (tastiint,tastiintorig) ;
 setintvec (tastiint,@tastiera);
 keep(0);
end .
Questo programmino rimane residente in memoria in modo "trasparente"
e genera un suono alla pressione di qualsiasi tasto.
Sin qui tutto ok, ma come posso forlo suonare SOLO quando premo un
determinato tasto (es F12) ???
in pratica, una volta chiamata la procedura,come posso sapere qual'č
il tasto premuto ?
Grazie Niki .
--
Automatic posted from 
ro...@virtual.zia.ms.it
 [195.103.158.42]
via Mailgate Server - 
http://www.mailgate.org

Ho provato ad eseguire il programma cosi' come l'hai scritto, ma da me non
funziona. Anche aggiungendo la direttiva {$M ..} (secondo me
indispensabile), ottengo risultati analoghi.
A parte questo mio problema gia' discusso in questo newsgroup, la soluzione
alla tua domanda e' teoricamente semplice.
Per vedere cosa viene premuto, basta andare a vedere il buffer circolare
della tastiera posto all'indirizzo 40H:40H (sul secondo 40H non ci giurerei,
dovrei andare a vedere sul manuale).
In tutti i modi ti consiglio un libro della Hoepli intitolato
"Interfacciamento". Viene spiegato come interfacciarsi a tutte le
periferiche del pc (quindi anche la tastiera) agendo sugli indirizzi ai
quali le periferiche sono mappate.
Se non riesci a trovare l'indirizzo, dimmi qualcosa che provo a cercare sul
manuale.
Buone Vacanze   :-)
Ciao
  Carlo

 funziona...
Scusa ma ho fatto un pò di casino con il messaggio
Prova così :
{$m 2000,0,0}
{$r-,s-,i-,d+,f+,v-,b-,n-,l+}
program Provatsr ;
Uses dos,crt ;
const Tastiint = $09 ;   { interrupt tastiera }
var   Tastiintorig : pointer ;
      tasto : char ;
procedure sti;
 inline($fa);
procedure chiamaorigint(sub : pointer);
 begin
  inline($9c/$ff/$5e/$06);
 end;
procedure tastiera (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
interrupt;
 begin
 Chiamaorigint (tastiintorig);
 {tasto := readkey ;
 if tasto = 'p'then
 begin ;}
  sound (800);
  delay (80);
  nosound ;
{ end;}
 end;
Begin { programma }
 getintvec (tastiint,tastiintorig) ;
 setintvec (tastiint,@tastiera);
 keep(0);
end .
Ciao e grazie , intanto provo a fare quello che mi hai detto...
poi vi faccio sapere, nel frattempo se qualcuno....



Sostituisci la procedura 'tastiera' con questa:
procedure tastiera (flags,cs,ip,ax,bx,cx,dx,si,di,ds,es,bp : word);
interrupt;
begin
     Chiamaorigint (tastiintorig);
     if port[$60]=88 then begin
         sound (1000);
         delay (100);
         nosound ;
     end;
end;
 ---------------------
Per far contento Carlo metto ben 4 righe di commento-))))
$60 e' la locazione che contiene il tasto che e' in pressione.
se il valore e' maggionre di 127 allora il valore-127 e' l'ultimo
tasto che e' stato premuto.
88 e' il valore che assume port[$60] quando viene premuto F12.
Vorrei chiedervi io qualcosa. Come si fa a rimuovere dalla memoria il
TRS in questione.
Ciao,   Fabio.
fabi...@rocketmail.com


All'inizio hai fatto un setintvect...
appena prima dovresti aver fatto un GETintvect, ed aver salvato così
l'interrupt originale.
Basta rifare un setintvect e ripiazzare l'int. originale :-)
Non ricordo bene chi abbia iniziato questo thread, comunque, chi ha postato
il listato ha anche la soluzione alla tua domanda (sempre che non vada
errato, e cioè che il prog. sia stato copiato da Turbo Pascal 7, K. O'Brien
& Nameroff :-)) )
Ed intanto che ci siamo... nessuno sa come vedere se un tasto è premuto??
Nota: non quale tasto è premuto, ma «Il tasto [X] è premuto in questo
momento??»
Un po' come quello che si può fare con Ctrl, Alt, Shift, ecc.
Grazie a tutti e ciao
Emanuele Cesena
d.a.m...@iol.it
ICQ n° #10570672
"Un generatore di numeri casuali non puo' essere scelto a caso", Knuth

Grazie a tutti e ciao
Non ho capito quello che dici.
Prova a far girare questo programmino e forse da li troverai da solo
la soluzione, altrimenti cerca di spiegarti meglio.
Program	prova_tasto;
var	T:byte;
begin
	repeat
		T:=port[$60];
		writeln(T)
	until 1=2
end.
T assume un numero che e' associato al tasto premuto. Non e' il valore
ASCII. Quando il tasto viene rilasciato al valore precedente viene
aggiunto 128.
Caio,  Fabio
fabi...@rocketmail.com

Un po' come quello che si puň fare con Ctrl, Alt, Shift, ecc.
In un programma che avevo fatto un po' di tempo fa questo problema
l'avevo risolto creandomi un array di boolean contenente nella generica
cella i lo stato di un certo tasto (True se premuto, False altrimenti).
Ovvimente ogni qual volta un tasto veniva premuto settavo l'apposita
cella dell'array a True e quando il tasto veniva rilasciato la rimettevo
a False. Il controllo se il tasto veniva premuto o rilasciato lo effettuavo
leggento direttamente le porte dell'8255.
Se c'e' un metodo migliore e piu' elegante lo vorrei sapere anch'io :)
Bye, Mobius


E se premo 2 tasti contemporaneamente?? come faccio a sapere che sono
premuti entrambi??
Grazie
Ciao
Emanuele Cesena
d.a.m...@iol.it
ICQ n° #10570672
"Un generatore di numeri casuali non puo' essere scelto a caso", Knutdh


E' la solita port[$60]??
Ma se premi "a" e lo tieni premuto... poi premi"b", il codice che ritorna č
quello di "b"... come faccio a sapere in che stato si trova "a"??
Grazie e ciao
Emanuele Cesena
d.a.m...@iol.it
ICQ n° #10570672
"Un generatore di numeri casuali non puo' essere scelto a caso", Knuth


Ma vuoi fare una pianola????
Non so come si piu' fare quello che chiedi.
Utilizzando port[$60] si puo' risalire solo all'untimo evento
accaduto, qundi o l'ultimo tasto premuto o l'ultimo tasto rilasciato.
Ciao,   Fabio.
fabi...@rocketmail.com

...

Nessuna pianola... solo sapere quali tasti sono premuti e quali no... non
penso sia una cosa difficile.... altrimenti nei giochi come fanno??
Grazie
Ciao


altrimenti nei giochi come fanno??
Io nei giochi non ho mai visto che tu premi A e B e questo viene
interpretato come un'istruzione (ma non e' che si un esperto
giocatore).
BUONE VACANZE A TUTTI
Ciao,  Fabio
fabi...@rocketmail.com


Buone vacanze anche a te :-)


 
Non e' vero :)
Se premi 'a' viene segnalata la pressione di 'a', e quindi tu salvi lo stato
di 'a' nell'array. Se poi premi 'b' viene nuovamente segnalata la pressione
di un nuovo tasto, cioe' 'b', e quindi devi salvare anche il nuovo stato
del tasto 'b'. A questo punto se fai una scansione dell'array scopri che
i tasti 'a' e 'b' sono premuti, mentre gli altri tasti non lo sono.
Comunque se vuoi la mia versione del programmino in questione la ricerco
e te la spedisco :)
Bye, Mobius.


Ok... ho capito: provo a buttarmi giù io un programmino... poi se non riesco
ti faccio sapere :-)
Ciao e grazie
