Прерывание от клавиатуры в защищённом режиме

Тема в разделе "WASM.ASSEMBLER", создана пользователем the_player, 14 июл 2006.

  1. the_player

    the_player New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2006
    Сообщения:
    12
    Продолжаю писать программу, переходящую в защищённый режим.. =)
    Следующий пункт, вызвавший затруднения - обработка прерываний. В мануале Intel я прочитал, что все аппаратные прерывания надо расположить в области (надеюсь, я правильно выразился) от int 20h и выше. Для этого я попытался перепрограммировать контроллер прерываний следующим образом:
    Код (Text):
    1. 00000190              C HalRemapDeviceInterrupts PROC stdcall, bMasterControllerBase: BYTE, bSlaveControllerBase: BYTE
    2.                   C
    3.                   C     ; Initialize PICs
    4.                   C     HalWritePortUchar   PIC0_PORT1, ICW1_ISSUED OR ICW1_4BYTES_VECTOR_SIZE OR ICW1_ICW4_NEEDED
    5.  00000193  B0 15         1C     mov     al, ICW1_ISSUED OR ICW1_4BYTES_VECTOR_SIZE OR ICW1_ICW4_NEEDED
    6.  00000195  E6 20         1C     out     PIC0_PORT1, al
    7.                   C     HalWritePortUchar   PIC1_PORT1, ICW1_ISSUED OR ICW1_4BYTES_VECTOR_SIZE OR ICW1_ICW4_NEEDED
    8.  00000197  B0 15         1C     mov     al, ICW1_ISSUED OR ICW1_4BYTES_VECTOR_SIZE OR ICW1_ICW4_NEEDED
    9.  00000199  E6 A0         1C     out     PIC1_PORT1, al
    10.                   C    
    11.                   C     ; Remap PICs
    12.                   C     HalWritePortUchar   PIC0_PORT2, bMasterControllerBase
    13.  0000019B  8A 45 08      1C     mov     al, bMasterControllerBase
    14.  0000019E  E6 21         1C     out     PIC0_PORT2, al
    15.                   C     HalWritePortUchar   PIC1_PORT2, bSlaveControllerBase
    16.  000001A0  8A 45 0C      1C     mov     al, bSlaveControllerBase
    17.  000001A3  E6 A1         1C     out     PIC1_PORT2, al
    18.                   C    
    19.                   C     ; Slave controller is attached
    20.                   C     HalWritePortUchar   PIC0_PORT2, 1 SHL ICW3_SLAVE_CONTROLLER_PIN0
    21.  000001A5  B0 04         1C     mov     al, 1 SHL ICW3_SLAVE_CONTROLLER_PIN0
    22.  000001A7  E6 21         1C     out     PIC0_PORT2, al
    23.                   C     HalWritePortUchar   PIC1_PORT2, 1 SHL ICW3_SLAVE_CONTROLLER_PIN1
    24.  000001A9  B0 02         1C     mov     al, 1 SHL ICW3_SLAVE_CONTROLLER_PIN1
    25.  000001AB  E6 A1         1C     out     PIC1_PORT2, al
    26.                   C    
    27.                   C     HalWritePortUchar   PIC0_PORT2, ICW4_BUFFERED_MODE OR ICW4_MASTER_BUFFERED OR ICW4_8086_MODE
    28.  000001AD  B0 0D         1C     mov     al, ICW4_BUFFERED_MODE OR ICW4_MASTER_BUFFERED OR ICW4_8086_MODE
    29.  000001AF  E6 21         1C     out     PIC0_PORT2, al
    30.                   C     HalWritePortUchar   PIC1_PORT2, ICW4_BUFFERED_MODE OR ICW4_8086_MODE
    31.  000001B1  B0 09         1C     mov     al, ICW4_BUFFERED_MODE OR ICW4_8086_MODE
    32.  000001B3  E6 A1         1C     out     PIC1_PORT2, al
    33.                   C
    34.                   C     ret
    35.  000001B9             C HalRemapDeviceInterrupts EndP
    , а после чего написал следующий обработчик прерывания от клавиатуры:

    Код (Text):
    1. 000003C7              C         _KiKeyboardInterrupt:
    2.  000003C7  50             C             push    eax
    3.                   C            
    4.                   C             ; Print the pressed key
    5.                   C             HalReadPortUchar    KEYBOARD_DATA_BUFFER_PORT
    6.  000003C8  E4 60         1C     in      al, KEYBOARD_DATA_BUFFER_PORT
    7.                   C             Invoke  ExConvertScanCodeToASCIIChar, al
    8.                   C             Invoke  VidWriteConsoleChar, al, CA_DEFAULT
    9.                   C            
    10.                   C             ; Reset keyboard interrupt
    11.                   C             HalReadPortUchar    KEYBOARD_SYSTEM_CONTROL_PORT
    12.  000003D8  E4 61         1C     in      al, KEYBOARD_SYSTEM_CONTROL_PORT
    13.  000003DA  0C 80          C             or  al, SCP_IRQ1_RESET
    14.                   C             HalWritePortUchar   KEYBOARD_SYSTEM_CONTROL_PORT, al
    15.  000003DC  8A C0         1C     mov     al, al
    16.  000003DE  E6 61         1C     out     KEYBOARD_SYSTEM_CONTROL_PORT, al
    17.                   C            
    18.                   C             ; Send EOI 
    19.                   C             HalWritePortUchar   PIC0_PORT1, OCW2_NONSPECIFIC_EOI
    20.  000003E0  B0 02         1C     mov     al, OCW2_NONSPECIFIC_EOI
    21.  000003E2  E6 20         1C     out     PIC0_PORT1, al
    22.  000003E4  58             C             pop     eax
    23.  000003E5  CF             C             iretd
    и по каким-то причинам потерпел фиаско =) - буковки на экране не появляются. В чём может быть проблема? Заранее спасибо!
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Вот как было у Финогенова (16 битные сегменты!!)

    Код (Text):
    1. new_09 proc
    2. cli
    3. in al,60h
    4. mov kode,al
    5. ; Запись AL в глобальную переменную и вывод на экран
    6. xor ah,ah
    7. mov gs:[0],ax
    8. mov place,860
    9. call dword ptr task1_offs
    10. ; Запись AL в глобальную переменную и вывод на экран: done
    11. sti
    12. in al,61h
    13. or al,80h
    14. out 61h,al
    15. and al,7fh
    16. out 61h,al
    17. mov al,20h
    18. out 20h,al
    19. db 66h
    20. iret
    21. new_09 endp
     
  3. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    [deleted]
     
  4. the_player

    the_player New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2006
    Сообщения:
    12
    Chingachguk

    А можно попросить ссылочку на полный исходник? Спасибо!
     
  5. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    "Ссылку" дать не могу - могу прикрепить файл - я когда изучал PM, перебивал с книги руками. В аттаче немного модифицированный пример, там еще установлена ловушка на доступ к портам IN/OUT.
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    могу прикрепить пример своей лабы.. там обработка прерываний идет . в некоторых дефолт , а из аппаратных обрабатывается таймер и клавиатура. Код не ахти. Но писал чтоб препод понял .. а то задолбался бы ему вдалбливать что там делаю, а то там.
    компилить тасмом.
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    еще макрос к проге:
     
  8. the_player

    the_player New Member

    Публикаций:
    0
    Регистрация:
    24 июн 2006
    Сообщения:
    12
    Chingachguk
    TermoSINteZ

    Спасибо за исходники, буду разбираться..