Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прерывания, Как программно назначить прерывание на Л 
:(
    Опции темы
nils
Дата 3.11.2002, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.11.2002

Репутация: нет
Всего: нет



Как программно назначить прерывание на ЛЮБОЙ девайс в компе?
PM MAIL   Вверх
Chingachguk
Дата 3.11.2002, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 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:0000). А ты в нем уже можешь делать то, что хочешь. Вот пример простейшего терминала - соединяешь два компа 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.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.