Эксперт
  
Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва
Репутация: нет Всего: 18
|
В твоем вопросе есть "ответ": НА ЛЮБОЙ ? НИКАК  Потому, что все девайсы разные ... Нет, разумеется, есть общие принципы. Например, пусть есть некое у-во, которое ты подключил таким образом, что оно будет способно выдавать сигнал прерывания. Возьмем ту же мышь. Подключаем ее к COM-2. Хрен знает как и почему(я никогда этим не интересовался = смотри эл.схемы и тп), но извесетно, что она подключена к COM-2 порту и будет вызывать перерывание N = 0Bh (или 0Ch - точно не помню). Смотрим по справочнику* и видим, что COM2 это порты(обычно около 10 адресов - байт) начиная с 2F8h, т.е. порты типа 2F8h, 2F9h, 2FAh,2FBh,... По умолчанию обычно нет никаких прерываний - необходимо инициализировать уст-во. Раз ты с ним общаешься через порты такие-то, то инициализация заключается, как правило, в отсылке/чтении из портов нескольких байтиков. Ну что-то вроде: Код | COM equ 3F8h IRQ equ 0Ch; IRQ4 ... mov dx,COM+1 mov al,0 out dx,al mov dx,COM+4 out dx,al mov dx,COM+5 in al,dx mov dx,COM+0 in al,dx mov dx,COM+6 in al,dx mov dx,COM+2 mov al,0 out dx,al ; speed mov dx,COM+3 mov al,80h out dx,al
|
... После такой инициализации девайс станет дергать процессор прерываниями, а процессор - вызывать обработчик. Те брать свою таблицу прерываний, умножать номер на 4 (если это COM1, то прерывание 0Ch, те таблица из 256 адресов обработчиков) и адрес обработчика = 0Ch*4 + Начало таблицы (в досе 0000  000). А ты в нем уже можешь делать то, что хочешь. Вот пример простейшего терминала - соединяешь два компа COM-COM портами и получаешь связь (по мотивам книги Зубкова): Код | .286 text segment byte public assume cs:text,ds:text org 100h COM equ 3F8h IRQ equ 0Ch; IRQ4 E_BITMASK equ 11101111b D_BITMASK equ 00010000b begin: mov ax,0003h int 10h call init main_loop: ; mov ah,8 ; int 21h mov ah,1 int 16h jnz done cmp byte ptr cs:break_flag,1 jnz @@NoBreakStatus mov dx,offset BreakMess call @@Message jmp @@Exit BreakMess db 'Break !',13,10,'$' @@NoBreakStatus: call delay mov al,'Z' test al,al jnz send_char int 21h cmp al,2Dh jnz main_loop done: call shutdown jmp @@Exit send_char: mov dx,COM out dx,al mov byte ptr MessSend+6,al mov dx,offset MessSend call @@Message jmp short main_loop MessSend db 'Send: ?',13,10,'$' @@Exit: mov ax,4C00h int 21H ; BACK TO DOS irq_handler proc pusha mov dx,COM+2 in al,dx repeat_handler: and ax,0110b mov di,ax call word ptr cs:handlers[di] cmp di,4 jz @@DataRecived mov dx,COM+2 in al,dx cmp byte ptr cs:break_flag,1 jz @@BreakSignaled test al,1 jz repeat_handler @@BreakSignaled: @@DataRecived: mov al,20h out 20h,al popa iret break_flag db 0 irq_handler endp handlers dw offset line_h, offset trans_h dw offset recv_h, offset modem_h line_h proc near mov dx,COM+5 in al,dx test al,11110b jz @@NoBreak mov byte ptr cs:break_flag,1 @@NoBreak: ret line_h endp trans_h proc near ret trans_h endp recv_h proc near mov dx,COM in al,dx push ax mov al,'R' int 29h mov al,'e' int 29h mov al,'c' int 29h mov al,'v' int 29h mov al,':' int 29h pop ax int 29h mov al,13 int 29h mov al,10 int 29h ret recv_h endp modem_h proc near mov dx,COM+6 in al,dx ret modem_h endp init proc near mov ax,3500h+IRQ int 21h mov word ptr old_irq,bx mov word ptr old_irq+2,es mov ax,2500h+IRQ mov dx,offset irq_handler int 21h mov dx,COM+1 mov al,0 out dx,al mov dx,COM+4 out dx,al mov dx,COM+5 in al,dx mov dx,COM+0 in al,dx mov dx,COM+6 in al,dx mov dx,COM+2 mov al,0 out dx,al ; speed mov dx,COM+3 mov al,80h out dx,al mov dx,COM+0 mov al,2 out dx,al mov dx,COM+1 mov al,0 out dx,al ; init line mov dx,COM+3 mov al,0011b out dx,al ; init modem ? mov dx,COM+4 mov al,1011b out dx,al ; enable interrupts mov dx,COM+1 mov al,1101b out dx,al in al,21h and al,E_BITMASK out 21h,al ret init endp shutdown proc near ; disable interrupts in al,21h or al,D_BITMASK out 21h,al mov dx,COM+1 mov al,0 out dx,al ; mov dx,COM+4 mov al,0 out dx,al ; old handler mov ax,2500h+IRQ lds dx,dword ptr ds:old_irq int 21h ret shutdown endp HexChar proc near pusha mov cx,4 mov bx,offset TabHex @GetHex: rol ax,4 push ax and al,0fh xlat mov [di],al inc di pop ax loop @GetHex popa retn TabHex db '0123456789abcdef' HexChar endp DecChar proc near pusha mov cx,5 mov bx,10000 @GetDec: xor dx,dx div bx add al,'0' mov [di],al inc di push dx xor dx,dx mov ax,bx mov bx,10 div bx mov bx,ax pop ax loop @GetDec popa retn DecChar endp @@Message: pusha mov ah,09h int 21h popa retn delay proc near @@delay: mov ah,02Ch; Read current time int 21h ; CALL DOS cmp byte ptr last_sec,dh jz @@delay mov byte ptr last_sec,dh ret delay endp last_sec db ? old_irq dd ? Text Ends end begin
|
*Ральф Браун и т.п.
--------------------
I don't like the drugs (but the drugs like me). M.Manson.
|