Прерывания таймера и клавиатуры

Тема в разделе "WASM.OS.DEVEL", создана пользователем BVOG, 12 мар 2011.

  1. BVOG

    BVOG Владислав

    Публикаций:
    0
    Регистрация:
    12 мар 2011
    Сообщения:
    15
    А как вы руками вызываете это прерывание?
     
  2. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    У вас в коде четыре ошибки.
    1я, возможно не ошибка, а недостаточно данных вами приведенных. В частности, вы уверены что ES равен НУЛЮ?

    2я, вы не ознакомилась с литературой по низкоуровневому программированию ни контролера прерываний, ни клавиатуры.

    Нужно, чуть потеснить код.
    И для точной диагностики, нужно точно знать, сколько раз вызывается ваш обработчик прерывания клавиатуры. И вызывается ли он вообще. Если вызывается только один раз, то копать в одну сторону. Если вообще не вызывается, то в другую.
     
  3. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    1)Ручками прерывание вызывается int 9h и прекрасно отрабатывает.
    2)Изучал по книгам Юрова и Кулакова.
    В смысле? Это аппаратное прерывание. Как была нажата клавиша, так прерывание и происходит. Проблема в том, что прерывание для клавы вообще не вызывается.
    MisHel64, из-за того, что это кусок кода, у вас возникли такие вот сомнения.
     
  4. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    MisHel64
    Я написал уже, что если прерывание вызвать руками, то всё работает=> прерывание удачно подменено=> es по-любому 0.
    Это вы про оформление?
    А где же ошибки №3 и №4?
     
  5. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    Откуда вы знаете, что внутри прерывания ES равен нулю. Это вторая ошибка.

    Третья ошибка, ну посчитайте, куда будет указывать ES:BX в вашем коде, даже если предположить, что ES=0, а BX=0xB800. Линейный адрес напишите.

    Откуда знаете?

    Или вы не все прочитали, или эти книжки в топку. 3я и 4я ошибки тут.

    Или вы не видите, что оно вызывается.

    И еще, поменяйте код не mov [es:bx], ax
    А inc [es:bx], так веселее будет.
    А перед установкой прерывания в это место выведите символ НУЛЯ.
     
  6. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Да. Писал я далеко, далеко. Но это ничего не изменило.
    Проглядел, что писал не по тому адресу.
     
  7. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Всё обрабатывается, только нужно приоритеты расставить.
    Прерывание от клавы срабатывает 1 раз, потом её перебивает таймер... Во всяком случае мне так кажется.
     
  8. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    Тебе не правильно кажется. Клавиатурный контролер не знает, что вы обработали прерывании, и можно вызывать следующее. Я же не зря в книжку тыкал, и спрашивал сколько раз вызывается.

    И еще. Зачем вы сообщаете второму контролеру, что обработали его прерывание? Он то тут причем?
     
  9. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Да, 2 контроллер здесь совсем не при делах... Это я уже и так, и сяк пробовал, вот и написал...

    Значит нужно послать 20h в порт 20h , для того, чтобы показать, что прерывание от клавы мы таки обработали.
    P.S
    Вот вчера я понаписал (я про 1кб и запись в "видеопамять"), так что прошу прощения за такие грубые оплошности и мою тупость.
     
  10. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Шлём 20h в порт 20h... но ситуация не меняется.
     
  11. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    Ответе на один простой вопрос, а это кому вы говорите?

    Еще подсказка нужна?
     
  12. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Думаю нет.
     
  13. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    То сеть, вы решили свою проблему, и теперь все работает как надо?

    И совет на всякий случай. Всегда явно задавайте значения регистров с своих обработчиках прерывания. Я про ES в обработчике. Это может привести к очень серьезным багам, на отлов которых вы может потратить недели. Нельзя быть уверенным, что ES всегда будет равен НУЛЮ, если вы этого не указали явно.

    Второй совет, обработка прерывания от клавиатуры, несколько отличается от обработки других прерываний. По этому типичная логика скорее вредна.
     
  14. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Нет, проблему я ещё не решил.
    Насколько понимаю, нужно послать 0xF4 в порт 60h для того, чтобы продолжилась передача данных. Ничего более подходящего по работе с клавой я не нашёл.
    Обрабатывается только 1 прерывание от клавы и всё. Буду искать в других справочниках что же за команду нужно послать, чтобы уведомить контроллер клавы о завершении прерывания.
     
  15. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Совсем с клавой запутался.
    Итак. В конце обработчика прерывания, перед iret нужно отправить EOI и записать в порт 60h F4h (разрешить передачу данных).
    MisHel64, поправьте раз я и сейчас не прав...
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    А ничего посылать не надо достаточно считать из 60h порта.
     
  17. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Pavia
    это же таки просто чтение (или я опять что-то не то сказал?). А как корректно завершить прерывание?
     
  18. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    В обычных условиях кроме EOI ничего посылать не надо.
     
  19. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Этим чтением вы сигнализируете о том, что данные считаны хостом.
     
  20. BVOG

    BVOG Владислав

    Публикаций:
    0
    Регистрация:
    12 мар 2011
    Сообщения:
    15
    Вот, что делаю я(у меня работает):
    Код (Text):
    1. use32
    2. keyboard:
    3.     pusha
    4.     xor ax, ax
    5.     in  al, 0x60 ;al - код символа по ASCII
    6.    
    7.              mov       ax, 0x0
    8.              mov       ds, ax
    9.     mov ebx, 0xB8000 + 6
    10.     mov esi, ebx
    11.     mov ebx, ascii
    12.     add ebx, eax
    13.     mov edi, ebx
    14.     mov al, byte [edi]
    15.     mov byte [esi], al
    16.    
    17.     ; с этого начинается завершение
    18.     in  al, 0x61
    19.     mov ah, al
    20.     or  al, 0x80
    21.     out 0x61, al
    22.     xchg    ah, al
    23.     out 0x61, al
    24.    
    25.     mov al, 0x20
    26.     out 0x20, al
    27.     popa
    28.    
    29.     jmp int_EOI
    30. ascii   db  0,0,'1234567890-+',0,0,'QWERTYUIOP[]',0,0,'ASDFGHJKL;',"'`",0,0,'ZXCVBNM,./',0,'*',0,' ',0,0,0,0,0,0,0,0,0,0,0,0,0,'789-456+1230.',0,0
    31. int_EOI:
    32.     mov al, 20h
    33.     out 020h, al
    34.     out 0a0h, al
    35.     iretd
    Основной смысл такой, если ошибся скажите - могла быть опечатка.