Newsgroup: it.comp.lang.c++
Titolo: Tsr in DOS

OK, forse l'argomento e` vetusto, ma la curiosita` umana
va oltre ogni limite.
Vorre implementare un Tsr per DOS, che intercetti
l'INT 09h (e` necessario che sia 09), controlli
se i tasti premuti sono ALT+F1, e in caso
affermativo esegua un piccolo programma PROVA.EXE.
Il mio problema e` che non riesco ad eseguire degli
INT dentro la subroutine di interruzione.
Siccome non posso eseguire EXEC dentro la
subroutine di interruzione (la dentro gli INT
sono disabilitati....), come posso fare???
Se solo dovessi eseguire un accesso al disco???
Se solo dovessi disegnare a video usando altri INT???
Grazie anticipatamente.
-- 
Righetti Michele
University: Universita` degli studi di Padova (Italy)
E_mail address: 
so...@dei.unipd.it
--
Automatic posted from 
anna.dei.unipd.it
 [147.162.2.100]
via Mailgate Server - 
http://www.mailgate.org

Non č vero che in una TSR non puoi eseguire degli INT, devi solo ricordarti
prima di usarli che dato che la TSR č stata chiamata da un'altro INT , devi
riabilitare gli Interrupt, usa quindi ( STI ).
 Il tutto č poi un po vago, specifica meglio , per aiutarti.
leoo...@tin.it

Se solo dovessi disegnare a video usando altri INT???
l'argomento non e' dei piu' semplici, non e' che non puoi chiamare un
INT da una routine di interrupt, il problema e' molto piu' sottile.
Non puoi chiamare il dos mentre c'e' gia' un'altra chiamata in corso,
per cui dalla routine di interrupt bisogna per prima cosa riattivare
gli interrupt e poi solo se non c'e' una chiamata dos in corso
eseguire la exec. Ormai a distanza di anni non mi ricordo tutti i
dettagli della programmazione di un tsr per cui non posso essere piu'
preciso, ti conviene cercare un po' di documentazione e leggerla, io
all'epoca ho trovato molto utile il libro "Undocumented Dos".
Gianpaolo Bottin
- Live Long and Prosper -

 
Innanzitutto ii ringrazio per post che mi ha riportato indietro nel 
tempo di dieci anni ;) 
Come hai scoperto, il DOS non e' rientrante. Questo significa che, per
poter girare, il tuo codice  deve accertarsi di non stare interrompendo
nessun interrupt software. E' passato tanto tempo, ma quello che devi 
fare e' all'incirca questo:
1. Intercettare l'int 28h. Quest'interrupt non documentato e' chiamato 
   dal DOS quando e' "idle" (tipicamente quando e' in attesa di un 
   carattere da tastiera).
   Da questo interrupt e' possibile fare altre chiamate al DOS.
2. Intercettare l'interrupt hardware del timer di sistema (8 o 1Ch 
   mi pare).
3. Intercettare tutti i servizi del BIOS e l'int 21 (entry point per
   i servizi DOS). Mi pare che non sia necessario altro ma non sono
   sicuro.
La tua routine di gestione dell' int 28 chiamera' il TSR in ogni caso. 
La tua routine di gestione del timer (int 1C) chiamera' il TSR solo se
non sta interrompendo un servizio BIOS o DOS (per sapere questo ti serve
il punto 3). 
Scusa per la concisione e l'imprecisione, ma dopo tanti anni di Windows
queste sono tutte le informazioni rimaste (anzi mi stupisco di essermi
ricordato qualcosa :).
Antonello
--
// ------------------------------------------------------------
// Antonello Salvatucci
// Software Developer, Technical Writer
// LEGO A/S SPU-Darwin, Kloevermarken 120, 7190 Billund DENMARK
// 
// antonello at digi. lego. com             
http://www.lego.com

fare e' all'incirca questo:
Probabilmente sono io che non ho capito .... ,ma credo che un
programma TSR sia una cosa che deve funzionare in modo assolutamente
autonomo e non dipendere da nessun altro programma . 
Inoltre perche' gli interrupt sarebbero disabilitati ?
Io so che spetta al PIC assegnare le priorita' agli interrupt
hardware.
Inoltre mi sembra che l'istruzione "sti" abbia effetto sugli interrupt
hardware e non software .
Un'altro problema dei TSR potrebbe essere quello di poter accedere
correttamente ai propri dati .
Infatti quando si attiva un TSR ,il registro DS punta al segmento dati
del programma in corso . Penso si debba invece reindirizzare DS
affinche' il TSR abbia modo di poter leggere il proprio segmento dati
.
Purtroppo io non possiedo una conoscenza approfondita' riguardo
l'implementazione di TSR e tutte queste considerazioni le ho ricavate
dall'esperienza e da centinaia di prove effettuate .
Sono riuscito alla fine a creare  una routine che attiva una immagine
sullo schermo alla pressione di un determinato tasto usando l'Int 09h
ed una funzione assembly che carica il giusto valore di segmento .
Tuttavia devo ammettere che in moltissime prove ,in cui provo a
reindirizzare l'Int 08h ,ottengo il blocco del computer e mi
piacerebbe sapere il perche' ......... .
Sarei molto interessato ad approfondire l'argomento ed a saperne
qualcosa in piu . Trovo la programmazione a questi livelli veramente
affascinante .......
ciao ,
gianfranco

 
OK ma non ti aspettare repliche immediate -- Domani torno in Italia 
per le ferie e per un mesetto mi colleghero' solo saltuariamente.
Ciao,


 Grazie anticipatamente.
Se sei disposto a spendere 60 carte puoi comprarti il libro di Peter Norton
"Programmazione C avanzata" Jackson Libri.
Il questo libro vengono affrontati diversi argomenti, tra i quali anche
la progettazione e stesura di programmi TSR in C, io pero' non ho avuto
modo di testare il funzionamento dei programmi inclusi nel dischetto.
  ______ ___  _  ______ ______                   ___                          
   )    ) ) )/ )(___   ) )    )______ ______ _____) )  ________________....  .
  / // / /  __/  __/ _/ / // /  ) _  ) )    ) )    / ________________....  .
 / _/ / / _ \  _/  /_  / _/ /  / ___/ / // / / // /   ______________.... . .
(_____)(_/ \_)(______)(_____) (_____)(__/__)(_____) __________________....  .
<===========================================================================>
*T*h*e*   *M*a*g*i*c*   *I*s*   *E*v*e*r*y*t*h*i*n*g*   *Y*o*u*   *I*m*a*g*i*n*e*
		e-mail  
DK2...@cryogen.com
 
am57...@silab.dsi.unimi.it