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

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

  1. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Странно, что работает.

    Код (Text):
    1.     ; с этого начинается завершение
    2.     in    al, 0x61
    3.     mov    ah, al
    4.     or    al, 0x80
    5.     out    0x61, al
    6.     xchg    ah, al
    7.     out    0x61, al
    Реликтовая конструкция. Нужно ориентироваться на PS/2.

    Код (Text):
    1.     mov    al, 0x20
    2.     out    0x20, al
    3.     popa
    4.     ...    
    5.     jmp    int_EOI
    6. int_EOI:
    7.     mov    al, 20h
    8.     out    020h, al
    9.     out    0a0h, al
    10.     iretd
    Дважды EOI в один чип, один раз в другой, который по идее вообще здесь ни причем, кКому-то подпортили значение ds и al - без комментариев.
     
  2. BVOG

    BVOG Владислав

    Публикаций:
    0
    Регистрация:
    12 мар 2011
    Сообщения:
    15
    Это всё для совмещения со старыми платформами, а int_EOI я сделал отдельно потому что он вызывается у меня из разных прерываний. а ту строку забыл убрать(я про повторение), говорил же опечатки)
     
  3. BVOG

    BVOG Владислав

    Публикаций:
    0
    Регистрация:
    12 мар 2011
    Сообщения:
    15
    Кстати понял почему может быть ошибка, Igor1024 у тебя ведь комп скорее всего далеко от 386, следовательно стоит контроллер прерываний APIC, а он насколько мне известно работает чуть по-другому, поэтому вариант либо его disable:
    Код (Text):
    1.     mov ecx, 1bh
    2.     rdmsr
    3.     test    ah, 1000b
    4.     jz  dapic_end
    5.     and ah, 11110111b
    6.     wrmsr
    7.     dapic_end:
    Либо, читай документацию по APIC. http://ru.wikipedia.org/wiki/APIC
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Вот код для штатного отладчика в виндоусе.
    Код (Text):
    1. mov ax,0
    2. mov ds,ax
    3. mov ds[26],cs
    4. mov ds[24],112
    5. jmp 10f
    6. nop
    7. push ds
    8. push ax
    9. mov ax,b800
    10. mov ds,ax
    11. inc ds[0]
    12. in al,60
    13. mov al,a0
    14. out 20,al
    15. pop ax
    16. pop ds
    17. iret
    Код (Text):
    1. mov ax,0 //устанавливаем обработчик
    2. mov ds,ax
    3. mov ds[26],cs                                               cs - сегмент адреса обработчика
    4. mov ds[24],112 //24h=36=9*4-  9 прерывание.  Где 112 это смещение адрес   обработчика
    5. jmp 10f  // вечный цикл
    6. nop      
    7. push ds // начало обработчика прерывания сохраняем регистры
    8. push ax
    9. mov ax,b800  //устанавливаем адрес вывода. Сегмент видео памяти.
    10. mov ds,ax
    11. inc ds[0]     // увеличиваем счётчик для наглядности
    12. in al,60        // читаем код из клавиатуры. Что говорит ей что выходной буфер свободен.
    13. mov al,a0    // EOI с вращением приоритетов
    14. out 20,al     // Посылаем ведущему контроллеру ПКП
    15. pop ax       //восстанавливаем регистры
    16. pop ds
    17. iret           // выходим из прерывания, возвращаем управление программе
    сокращение EOI -переводится как конец операции прерывания
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Phantom_84
    Про порт 61h. Оно не то что реликтовое. Оно не корректное, так как относится к другому контроллеру. Да я больше боюсь что это код может вызвать не предсказуемые действия на современных ПК.
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    BVOG
    Не надо его трогать. Если система содержит APIC, то она подпадает под мультипроцессорную спецификацию. А там черным по белому написанно что котролле APIC при загрузке запускается в режиме совместимости с PIC.
     
  7. BVOG

    BVOG Владислав

    Публикаций:
    0
    Регистрация:
    12 мар 2011
    Сообщения:
    15
    Pavia
    У кого как, у меня нет)
     
  8. Igor1024

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

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    BVOG
    Ваш вариант завершения прекрасно сработал :)
     
  9. BVOG

    BVOG Владислав

    Публикаций:
    0
    Регистрация:
    12 мар 2011
    Сообщения:
    15
    Вот и прекрасно:)
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    BVOG
    Настоятельно рекомендую в обработчике прерывания сделать настройку ds. У меня тоже без настройки работало. А потом занялся с vm-86 и долго отлаживал ошибки.
     
  11. BVOG

    BVOG Владислав

    Публикаций:
    0
    Регистрация:
    12 мар 2011
    Сообщения:
    15
    На самом деле у меня настраиваются все используемые регистры, просто я не привожу весь код обработчика
    , т.к. там ещё соддержится код обработки спец клавиш, занесение символа в кэш и т.п.
    З.Ы. Я работаю в P-Mode, и у меня все сегментные регистры предопределены)
     
  12. MisHel64

    MisHel64 Member

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

    Данный вопрос действительно не во всех источниках разобран. Я вроде только у Jourdain'а видел хороший алгоритм.

    Во первых стоит определится, а нужен ли тебе собственный обработчик, может будет достаточно использовать обработчик от BIOS. INT 0x16 с AH равным 0x00 и 0x01 посмотри. Написание собственного обработчика, уж слишком специфичная, и практически не нужная задача. То есть не нужно изобретать велосипед, когда есть более удобный мопед.

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

    Но если все таки, решил, что свой собственный обработчик единственное решение твоей проблемы, то делай что-то приблизительно следующее:

    В _начале_ обработчика, сообщаешь только первому контролеру прерываний, что можно вызывать другие прерывания:
    mov al, 0x20
    out 0x20, al
    sti

    и в конец
    Push Ax
    cli
    mov ah, 0x80
    in Al, 0x61
    or Al, Ah
    Out 0x61, Al
    jMp $
    jMp $
    Xor Al, Ah
    Out 0x61, Al
    Pop Ax
    iRet
     
  13. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Непонятные ошибки начнешь ловить, не удивляйся )))

    Опять 25. Порт 61h, насколько я помню, сейчас используется для спикера и для маскирования отдельных источников NMI. Порты PS/2 - 60h и 64h. Прерывания разрешать в обработчике тоже ни к чему.
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Не только сейчас. Но и когда IBM свой PS/2 делала.
     
  15. BVOG

    BVOG Владислав

    Публикаций:
    0
    Регистрация:
    12 мар 2011
    Сообщения:
    15
    Да не у меня всё пучком)
     
  16. MisHel64

    MisHel64 Member

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

    Спорное утверждение, и чисто дело вкуса.

    А это лесом идет, пока не никто не отменял режима принудительной совместимости с 8042/8047. Это раз.
    Ни в одной спецификации не указано, что чтение 0x60 снимает запрос на прерывание. Это два.
     
  17. Pavia

    Pavia Well-Known Member

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

    Note that previous PIIXn devices internally latched IRQ12 and IRQ1 and required a port 60h read
    to clear the latch. The ICH5 can be programmed to latch IRQ12 or IRQ1 (see bit 11 and bit 12 in
    General Control Register, D31:F0, offset D0h).


    PIIX
    0060h1 RO Reset X-Bus IRQ12/M and IRQ1 PCI/ISA

    SMSC LPC47U33x
    OBF flag and set the KIRQ output if enabled. A
    read of this register will read the data from the
    Keyboard Data or Command Write Buffer and
    clear the IBF flag.


    IBM ps/2
    http://www.mcamafia.de/pdf/ibm_hitrc07.pdf
    Страница 11 по счётчику pdf или 7 по орегинальной нумирации.
    Читать про Бит 4.

    Дальше продолжать не буду.
     
  18. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Ну так об этом и речь. 61h порт не относится к 8042
     
  19. MisHel64

    MisHel64 Member

    Публикаций:
    0
    Регистрация:
    9 мар 2011
    Сообщения:
    182
    Pavia И не нужно продолжать. Возможно вы и читали, то что цитируете, но боюсь не поняли. Но по сути вопроса там нет ни слова.
    http://www.mcamafia.de/pdf/ibm_hitrc07.pdf
    Вот тут в частности, про бит 4 сказано, что это бит - индикатор наличия прерывания. Но ни слова не сказано, что этот бит отвечает за разрешения прерывания. Прочувствуйте разницу.

    Что бы не провоцировать дальнейший спор, сделаем проще. Попросим ответить Igor1024 всего на три вопроса. И ответить коротко, только да или нет.
    1) Обработчик клавиатуры сейчас работает нормально?
    2) В нем используется команда IRQ RESET (Запись 1, а потом 0 в 7й бит порта 0x61)?
    3) Если отключить использование этой команды, обработчик продолжает работать нормально?
     
  20. MisHel64

    MisHel64 Member

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