Salve a tutti. Ho scritto questo codice in assembly 8086 che devrebbe far suonare l'altoparlante finchč un tasto qualsiasi viene prenuto. In teoria mi sembra tutto giusto, ma non riesco a trivare cosa c'č che non vā.
Ecco il codice (ho anche allegato il file .asm pronto da compilare):
;************************************************* **********************************
;Programma residente in memoria che modifica la normale aquisizione dati dalla
;tastiera, in modo tale da far emettere un suono in corrispondenza alla pressione
;di ogni tasto. Il suono permane fino a quando il tasto non viene rilasciato.
;************************************************* **********************************
dosseg
.model tiny
.code
org 100h
main: jmp inizio
PortaA_Tastiera equ 60h
PortaB_Speaker equ 61h
Msg db "Programma residente attivato. Da questo momento in poi la tastiera é sonora.", 10, 13, '$'
int_9 label dword
Old_Vettore dw 2 dup(?)
;************************************************* **********************************
;Parte residente del programma. Attiva l'altoparlante mantenendolo attivo fino a
;quando il tasto non viene rilasciato.
;************************************************* **********************************
Parte_resid proc near
sti
push ax
in al, PortaA_Tastiera ;preleva il codice scansione del tasto
test al, 80h ;il tasto č rilasciato?
jz spegni ;se si disabilita l'altoparlante
suona: in al, PortaB_Speaker ;altrimenti legge lo stato dell'altoparlante
or al, 03h ;forza a 1 il bit0 e il bit1 del portB
out PortaB_Speaker, AL
jmp esci
spegni: in al, PortaB_Speaker ;tasto rilasciato. legge lo stato dell'altoparlante
and al, 11111101b ;forza a 0 il bit1 del portB
out PortaB_Speaker, AL ;disabilitandolo
esci: pop ax
jmp int_9
Parte_resid endp
;************************************************* **********************************
;Parte transiente del programma. Intercetta l'interput 9; salva il suo vettore
;in Old_vettore;inizializza il nuovo vettore con l'indirizzo della parte residente
;del programma usando le funzioni DOS "Get interput" e "Set interput" (35h e 25h).
;************************************************* **********************************
Parte_trans proc near
inizio: lea dx, msg
mov ah, 09h ;stampa il messaggio a video
int 21h
mov ah, 35h ;get interput
mov al, 9 ;interput da intercettare
int 21h
mov Old_Vettore, bx ;l'offset del vettore int9, restituito in bx dalla
;get interput, viene salvato in Old_Vettore
mov Old_Vettore + 2, es ;insieme al suo segmento
mov ah, 25h ;set interput
mov al, 9
lea dx, Parte_resid ;nuova routine di servizio
int 21h
lea dx, Parte_trans
int 27h ;termina e rimane residente
Parte_trans endp
end main