su un tutorial ho trovato questo codice.. in pratica emette un beep dalla tastiera ogni volta che premi un tasto
codice:
.MODEL SMALL
INTERRUPT_NUM EQU 9 ;Interrupt da intercettare
ROM_BIOS_DATA SEGMENT AT 40H ;Questi sono dati memorizzati
ORG 1AH ;nel BIOS all'ind. 0040:001A
HEAD DW ? ;Puntatore alla testa del buffer
TAIL DW ? ;Puntatore alla coda del buffer
BUFF DW 16 DUP(?);Buffer
BUFF_END LABEL WORD
ROM_BIOS_DATA ENDS
.CODE
ORG 100H
FIRST: JMP LOAD_PROG ;Carico in memoria il prg.
OLD_KEYBOARD_INT DD ? ;memorizza l'indirizzo al
;vecchio vettore di int.
PROG PROC
pusha ;salvo i registri
pushf
call OLD_KEYBOARD_INT ;chiamo la vecchia routine di int.
ASSUME ds:ROM_BIOS_DATA
push ds
mov bx,ROM_BIOS_DATA ;Questo gruppo di istruzioni
mov ds,bx ;mi serve per gestire il
mov bx,TAIL ;buffer dei caratteri letti
cmp bx,HEAD
je EXIT ;Non ci sono caratteri
sub bx,2 ;si sposta di due bytes
cmp bx,OFFSET BUFF ;controlla di non uscire
jae NO_WRAP
mov bx,OFFSET BUFF_END
sub bx,2 ;BX punta al carattere
NO_WRAP: mov dx,[bx] ;in DL c'è il carattere letto
;QUI CI VA IL PROGRAMMA: In questo esempio ho deciso di emettere un BEEP ma
;si può fare qualunque cosa. Tranne che chiamare un interrupt del DOS!!
;--------------------------------------------------------------------------
cmp dl,'b' ;il carattere letto è 'b' ?
jne EXIT ;se no esci
;altrimenti suona
;routine di beep col timer vista prima
in al,61h ;Per il BEEP programmo il Timer
test al,3
jne skippa
or al,3
out 61h,al
mov al,0B6h
out 43h,al
skippa: mov al,06h ;frequenza LSB
out 42h,al
mov al,01h ;frequenza MSB
out 42h,al
mov cx,0FFFFh
wait_loop:
loop wait_loop ;ciclo di attesa
in al,61h ;silenzio
and al,0FCh
out 061h,al
;--------------------------------------------------------------------------
EXIT: pop ds
popa
iret
PROG ENDP
LOAD_PROG PROC ;Procedura che carica in memoria il prg.
mov ah,35h
mov al,INTERRUPT_NUM
int 21h ;Prelevo il vecchio vettore
mov WORD PTR OLD_KEYBOARD_INT,bx
mov WORD PTR OLD_KEYBOARD_INT[2],es
mov al,INTERRUPT_NUM
mov ah,25h
lea dx,PROG
int 21h ;Imposto quello nuovo
mov dx,OFFSET LOAD_PROG ;in DX ci va l'ultimo byte
;del prg.+1
int 27h ;Termina ma rimani in memoria
LOAD_PROG ENDP
END FIRST
ma non so dirti come funziona perchè è pesantino da leggere