Newsgroup: it.comp.lang.c
Titolo: Interrupt

Come posso creare i miei interrupts senza utilizzare gli int del Dos?
Grazie.
anNOSPA...@tin.it

Grazie.
La prendo larga perche' non sono certo di aver capito quale sia il tuo
problema.
Nel PC esistono interrupt software (256) e hardware (16)
I primi vengono richiamati tramite una chiamata assembler int XX o tramite
chiamate analoghe effettuate tramite altri linguaggi menter gli INT HW
vengono scatenati da eventi come ad esempio il tick dell'orologio di sistema
o un nuovo dato sulla parallela ecc.
Gli int del Dos sono INT software e per rifarmi alla tua domanda,
permettono di definire un nuovo vettore di interruzione tramite un'apposita
chiamata (E' questa chiamata che tu  non vuoi utilizzare ???)
Se è cosi' allora va bene ... puoi definire un nuovo vettore di interruzione
anche senza il Dos e la procedura è la seguente.
1)Disabilita gli int (csi)
2)Leggi il vecchio vettore delle interruzioni (Ogni vettore è di 4 byte
SEG:OFF e partono dall'indirizzo 0:0 in successione)
3)Inserisci il puntatore alla tua funzione di interrupt
4)Riabilita gli int (sti)
Per tornare alla configurazione iniziale non devi fare altro che reinserire
il vecchio vettore precedentemente salvato in qualche variabile.
Un semplice esempio ti dovrebbe chiarire come fare in assembler
csi                                  'Disabilita le interruzioni
mov es,0
mov ax,es:[0]                'Offset vecchia vettore interruzione
mov bx,es:[2]                'Segmento vecchia vettore interruzione
mov OffOldVec,ax        'Salva il vecchio vettore
mov SegOldVec,bx
mov ax,OffNewVec       'Carica il nuovo vettore
mov bx,SegNewVec
mov es:[0],OffNewVec
mov es:[2],SegNewVec
sti                                    'Riabilita le interruzioni
Spero di esserti stato utile
Ciao
    Alessio C.

 wrote in message
85767d$qgl$1...@nslave2.tin.it...
[zak]
:
: Un semplice esempio ti dovrebbe chiarire come fare in assembler
:
:
: csi                                  'Disabilita le interruzioni
:
: mov es,0
: mov ax,es:[0]                'Offset vecchia vettore interruzione
: mov bx,es:[2]                'Segmento vecchia vettore interruzione
: mov OffOldVec,ax        'Salva il vecchio vettore
: mov SegOldVec,bx
:
: mov ax,OffNewVec       'Carica il nuovo vettore
: mov bx,SegNewVec
: mov es:[0],OffNewVec
: mov es:[2],SegNewVec
:
: sti                                    'Riabilita le interruzioni
visto il nome del NG, penso sia piu' utile un esempio in c:
typedef struct {
#ifdef __TURBOC__            // VERSIONE BORLAND
    unsigned short bp, di, si, ds, es, dx, cx, bx, ax;
#else                        // micro$oft
    unsigned short es, ds, di, si, bp, sp, bx, dx, cx, ax;     // come
PUSHA
#endif
} REG_PARAMS;
static void (interrupt far old_2f)();
void interrupt far int_2f(REG_PARAMS r){
    // nuovo codice interrupt
    // se devi chiamare anche il vecchio:
    _chain_int(old_2f);
    // altrimenti no
}
...
int main(int argc, char** argv){
    old_2f = _dos_getvect(0x2f);        // vecchio puntatore
    _dos_setvect(0x2f, int_2f);         // nuovo codice
    ...
    // all'uscita, ripristinare!!!
    _dos_setvect(0x2f, old_2f);
    exit(0);
}

 4)Riabilita gli int (sti)
Ho già provato in questo modo, scrivendo un semplice programmino in
Assembler e facendolo girare in una finestra della Shell Dos di Windows 98.
Il risultato è che Windows mi segnala un errore e mi chiude il programma.
Qual è il problema, allora? Forse il fatto che l'ho eseguito sotto Win98?

: Ho già provato in questo modo, scrivendo un semplice programmino in
: Assembler e facendolo girare in una finestra della Shell Dos di Windows
98.
: Il risultato è che Windows mi segnala un errore e mi chiude il programma.
: Qual è il problema, allora? Forse il fatto che l'ho eseguito sotto Win98?
in Win9x, gli interrupt vengono gestiti da vpicd.vxd, contenuto in
vmm32.vxd, e che a volte non esegue l'interrupt in quanto, anche se in
finestra dos, il codice e' eseguito in modalità V86.
per saperne di più:
modalità V86:
   leggiti il manuale assembler INTEL
gestione int in Win9x:
   Windows Internals

}
Scusa ma se ho capito bene la domanda lui non vuole usare gli int DOS dunque
credo che non voglia neanche la _dos_getvect() che credo utilizzi proprio
l'INT DOS che lui non vuole usare.
Comunque hai ragione visto che il tutto è OT
Riscusa
Ciao
    Alessio C.

 Grazie.
devi andare a modificare il valore di un puntatore nel vettore degli
interrupt per farlo puntare alla tua funzione

 wrote in message
1e3xztc.1c0...@ppp-20-3-37.libero.it...

L'ho già fatto!
Ho creato un programmino .COM in Assembler in cui era presente una semplice
procedura che stampava sullo schermo il carattere A usando solo la memoria
video. Tuttavia, quando, dopo aver fatto puntare il vettore al segmento e
all'offset della mia procedura, chiamavo l'Int che avevo ridefinito, Windows
mi segnalava un errore.