Переход в PM (тема в BEGINNERS не прижилась)

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

  1. Igor1024

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

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Уточню. К примеру простейший обработчик для клавы:
    Код (Text):
    1. k_b:
    2.         pushad
    3.         xor eax,eax
    4.         in al,60h
    5.         mov al,'F'        ;сигнализируем что поступило прерывание от ;клавы
    6.         mov ah,07h     ;аттрибут
    7.         mov di,[cursor];cursor = 10
    8.         mov [es:di],ax ;es=18h;
    9.         inc [cursor]  
    10.         popad
    11.         jmp int_EOI
    es содержит селектор видеосегмента, проинициализирован правильно - проверял: mov [es:10],ax прекрасно работает. Обращения к памяти корректны (что-то я в предыдущем посте очень сильно сглупил).
    Что-то с di.
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Хорошо, пусть ты проигнорировал мои рекомендации:
    1) переустанавливать сегментные регистры в обработчиках;
    2) использовать флат-сегмент для обращения к видеобуферу.

    Но знать ассемблер, основные принципы программирования в PM, синтаксис fasm ты обязан (раз взялся за такое дело).

    "Уточню." Размерность cursor равна 1 байту. Какого фига ты пытаешься загрузить ее значение в di, не предприняв никаких доп. действий! При обращении к 32-битным сегментам забудь про 16-разрядную адресацию (используй при адресации только 32-разрядные регистры).
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Код (Text):
    1.   label videobuffer byte at 0B8000h
    2.  
    3. k_b:
    4.   push ds
    5.   push ss
    6.   pop ds
    7.   push edi
    8.   movzx edi,[superpos]
    9.   inc [superpos]
    10.   mov word [videobuffer+edi*2],700h+"F"
    11.   pop edi
    12.   pop ds
    13.   jmp int_EOI
    14.  
    15.   superpos dw 0
    Можно superpos хранить в двойном слове.
     
  4. Igor1024

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

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Phantom_84, я воспользовался Вашим советом - я сохраняю сегмент. регистры (по-моему именно там была ошибка и я не стал писать весь код... и как всегда у меня наиглупейшая)...
    Да. Здесь я полнейшим идиотом себя показал. Буду просветляться дальше.
    Phantom_84, cпасибо, что гоняете! Впредь буду стараться не задавать тупые вопросы.
     
  5. Phantom_84

    Phantom_84 New Member

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

    P.S. К коду не мешало бы добавить прокрутку экрана (хотя бы программную) и реальное перемещение курсора. Вообще уже можно реализовать практически полноценную putstr.
     
  6. JucED

    JucED New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2010
    Сообщения:
    23
    Извиняюсь с вопросом немного не в ту сторону. Вот у меня такая тема: собираюсь я например считать данные с диска через порты по протоколу DMA в защищенном режиме. Так вот - в структуре PRD в поле ADRESS нужно писать селектор дескриптора или просто линейный адрес памяти?
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Линейный физический адрес.
     
  8. Igor1024

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

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

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Одной переменной мало. Делай очередь.
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Про текстовый сервис не понял. Нужно извлекать код в "основной программе" и затем делать с ним все что угодно, пользуясь любыми сервисами.
     
  11. Igor1024

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

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

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Я тебе ответил. Было бы неплохо сделать еще проще. Как-то так:
    Код (Text):
    1. .next:
    2.   call wait_key
    3.   cmp eax,KEY_ENTER
    4.   je .break
    5.   ... ; обработка "несимвольных" клавиш
    6.   call translate ; при необходимости
    7.   ... ; обработка символов
    8.   jmp .next
    9. .break:
    translate можно вызывать и сразу после wait_key, если это необходимо.

    Кроме того, я к примеру вместе с виртуальным кодом клавиши передаю состояние управляющих клавиш (Shift, Ctrl, Alt) и индикаторов для полноценной символьной трансляции, а также тип события (KEYDOWN, KEYUP) - некоторым приложениям это тоже необходимо.
     
  13. Igor1024

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

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Я пока сделаю без упр. клавиш. Кстати, чем для отладки такого кода пользуетесь (в смысле кода вне оси)?
     
  14. Igor1024

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

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Пытался через Bochs, но он не находит boot_sevice. Тестю на vbox и на vmware, но там с отладчиками туго. Внешние нужны. Пробовал bochs'овский плагин debug через Иду, но опять не получилось.
     
  15. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Кстати, для разработки полноценного клавиатурного обработчика тебе не помешает что-то подобное:
    Код (Text):
    1. .next:
    2.   call wait_key
    3.   cmp al,KEY_ENTER
    4.   je .break
    5.   call displayscancode
    6.   jmp .next
    7. .break
    При этом следует учитывать, что существуют разные наборы скан-кодов - клавиатуру и контроллер следует настраивать на нужный набор или наоборот устанавливать подходящий для текущего набора обработчик.
     
  16. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Отладчиками я пользуюсь редко. Мне хватает процедур, выводящих информацию о текущем состоянии и размещенных в нужных местах.
     
  17. Igor1024

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

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Так, чтоб исправить баг, нужно мне стабы убрать, и написать нормальные информац. функции. Значит временно меняю приоритет на отладку.