Хочу движущейся пиксель, в БИОС.

Тема в разделе "WASM.BEGINNERS", создана пользователем wcools, 24 сен 2008.

  1. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Хочу сделать программу , чтобы по нажатию на клавишу пиксель смещался. В винде-могу, а под БИОС сложновато :|

    Основные вопросы такие:
    1. Как "поймать" нажатие клавиши на клаве??? Т.е. в любой момент нажал, программа это узнала и выполняет определенные действвия. Ну как в винде.
    2. Как лучше отчищать экран???

    Попробовал, получилось вот что:

    use16
    org 7e00h
    mov dx,100

    met1:
    mov ah,00h
    int 16h
    cmp al,119
    jne met1

    mov ah,00h
    mov al,0dh
    int 10h

    add dx,10
    mov ah,0ch
    mov bh,0
    mov cx,100
    mov al,3
    int 10h

    jmp met1
    jmp $

    PS: Как в фасме из этого закомпилить ехе или сом, если можно.
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    1. Функция 01h (11h). Можешь сравнивать указатели начала и конца клавиатурной очереди в BIOS Data Area. Если они равны, то вроде бы очередь пуста, если нет, то можно прочесть функцией 00h (10h). По хорошему нужно перехватывать прерывание от клавиатуры и в его обработчике слать событийное сообщение, а в естественном потоке команд получать это сообщение и обрабатывать.

    2. Известно как. Прямой записью в видеопамять.

    P.S. com-файл в fasm'е делается так:
    Код (Text):
    1. org 100h
    2. ... ; здесь текст программы
    exe-файл - смотри "format MZ" в описании.
     
  3. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Подскажи пожалуйста как.
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    лучше всего средством для очистки экранов и специальной тряпкой.
    а под BIOS вот это оно
    Код (Text):
    1. mov ax, 12h
    2. int 10h
    и все будет чисто, и функции 12 и 13 заработают
    обратно
    Код (Text):
    1. mov ax, 2
    2. int 10h
    прерывание от клавиатуры №9
    скорее всего так
    Код (Text):
    1. xor ax, ax
    2. mov es, ax
    3. mov bx, 9*4
    4. mov ax, [es:bx+0]
    5. mov dx, [es:bx+2]
    6. mov [old9o], ax
    7. mov [old9s], dx
    8. mov ax, new9o
    9. mov dx, cs
    10. mov [es:bx+0], ax
    11. mov [es:bx+2], dx
    обратно сам сообрази как восстановить - это очевидно
    Код (Text):
    1. new9o:
    2. ;To do place here
    3. jmp far dword [old9o]
    или
    Код (Text):
    1. new9o:
    2. ;To do place here
    3. pushf
    4. call far dword [old9o]
    5. ;or here
    6. iret
    естественно регистры до=регистрам после
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Древнее подробное описание работы с BIOS
     
  6. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Обьясните пожалуйста Как можно поймать irq1, т.е. выполняется себе программма(например цикл какой нибудь делает), я клавишу нажал , программа перестает делаться ............ программа снова получает системные ресурсы и делается дальше. Как программа вообще может узнать что произошло прерывание????
     
  7. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    wcools
    Перехватываешь irq.
    IRQ 0 будет по int 8
    IRQ 1 будет по int 9
    ...
    IRQ 7 будет по int 0Fh
    IRQ 8 будет по int 70h
    ...
    IRQ 15 будет по int 77h
    Перехватываешь обработчик.
    Делается это просто. Копируешь вектор старого оброботчика в замен него вешаешь свой в своем делаешь обработку и передаешь орегинальному обработчику.
    Начиная с 00 адресса идет таблица прерываний в которых записанн вектор на обработчик прерывания.
     
  8. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Народ не спите - начинающему помогите :)
    В интернете шарюсь - потихоньку просвящаюсь :)

    Прочитал статейку в нете и понял так:
    Когда происходит прерывание irq1 В порт 60h записывается скан-код клаввиши. Затем процессор вызывает обработчик клавы вшитый в биос через вектор 09h. Чтобы моей программе поймать irq1 нужно изменить таблицу векторов прерывания, чтоб она указывала не на 09h а на мою программу. Правильно ли я понял????
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    wcools
    При нажатии клавиши происходит запись скан код в буффер контроллера клавиотуры. После чего контроллер клавиотуры вызывается прерывание IRQ 1. Процессор по приходу сигнала о прерывании выясняет что это за прерывание и вызывает код соответствующего обработчика. Не обязательно биоса.
    Да верно, надо заменить вектор 09 на свой.
    В конце обработчика аппоратного прерывания должен быть послать сигнал конца прерывания. Собтвенно это можно доверить старому обработчику.

    PS. Не спим.
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Чтобы не выполнять трансляцию полностью самому, можно сделать так: в новом обработчике сначала вызвать старый, а потом проанализировать содержимое клавиатурной очереди BIOS. Там будут практически всегда такие же значения, что и после использования функций, вызываемых по int 16h. Чтобы получить абсолютно такие же значения, можно подсмотреть, что происходит с извлекаемыми значениями внутри обработчика все того же int 16h (я когда-то делал именно так, но давно это было), или просто вызвать какую-либо "неожидающую" функцию BIOS (int 16h 01h/11h) в самом обработчике int 9. Собственно, если кроме клавиатурных событий никакие другие события обрабатывать не планируется (мышь, таймер) и нет стремления максимально быстро выявлять факт наличия "свободного времени" для выполнения в программе каких-то "параллельных" вычислений, то можно обойтись и использованием какой-либо "неожидающей" функции BIOS в естественном потоке команд.
     
  11. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Предпологалось, что програмка заменяет вектор прерывания на NEW и когда срабатывает irq1, программа выполняется начиная с NEW: т.е. выводит пиксель, по нажатии на клаву пиксель должен смещатся. Пиксель не смещается, почему???

    org 100h
    use16
    jmp start

    old9o dw ?
    old9s dw ?


    start:
    ;------------Замена вектора обработчика-------------
    xor ax, ax ;обнуление
    mov es, ax ;
    mov bx, 9*4 ;копируем адрес 9-го вектора из таблици прерываний
    mov ax, [es:bx+0] ;копируем в ах два старшие байта вектора из адреса 0:вх+0
    mov dx, [es:bx+2] ;копируем в bх два младшие байта вектора из адреса 0:вх+2
    mov [old9o], ax ;запоминаем вектор
    mov [old9s], dx ;запоминаем вектор
    mov ax, NEW ;копируем новый адрес вектора
    mov dx, cs ;копируем номер секции, где вылнен текущий код.
    mov [es:bx+0], ax ;копируем в таблицу прерываний новый адрес
    mov [es:bx+2], dx ;
    ;-----------оооооооооооооооооооооооооо-------------


    NEW:

    mov dx,0
    mov cx,0
    ;Выбор видеорежима
    mov ah,00h
    mov al,0dh
    int 10h

    add dx,1
    mov ah,0ch
    mov bh,0
    mov cx,100
    mov al,3
    int 10h
    iret

    jmp $
     
  12. airyashov

    airyashov New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2008
    Сообщения:
    12
    Вот пример не совсем в БИОСе, но в чистом ДОСе
     
  13. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Мне надо только в биосе, дос не подходит.

    PS: Что ни у кого подобной программы нету что ли???
     
  14. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    1. jmp $ поставлен не там.
    2. в клаву надо посылать EOI после каждого срабатывания прерывания.
    3. в контроллер PIC надо посылать EOI перед выходом из обработчика.
    4. в нормальных программах адрес старого обработчика сохраняется, и при завершении ваш обработчик должен передавать управление тому обработчику, адрес которого вы сохранили. Тогда пункты 2 и 3 будут ненужны.
    5. Каждый раз устанавливать видеорежим в обработчике прерывания не есть гуд.
     
  15. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Каким образом, и для чего это нужно ???
    Это 20h в 20h ???
    Да мне главное чтов вообще хоть что-нибудь работало, когда это сделаю, можно будет и старый обработчик возвращать и другие навороты...
    На этой стадии мне это не важно, эта программа для теста работы с прерыванием, а вывод на экран, чтобы я увидел, что она работает.

    ..............
    mov al,20h
    out 20h,al
    iret
    m1:
    jmp m1
    Попробовал так, всеравно не нработает :dntknw:
     
  16. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    wcools
    У тебя после строчки
    ;-----------оооооооооооооооооооооооооо-------------
    идет выполнения обработчика прерывания вот он на iret и сыпиться.

    jmp $ нужно поставить перед этой строчкой.
     
  17. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Сделал так
    ;-----------îîîîîîîîîîîîîîîîîîîîîîîîîî--------------
    mov dx,10
    mov cx,10
    mov ah,00h
    mov al,0dh
    int 10h
    jmp $

    NEW:
    add dx,10
    mov ah,0ch
    mov bh,0
    mov cx,100
    mov al,3
    int 10h

    in al, 61h
    or al, 80h
    out 61h, al
    mov al,20h
    out 20h,al
    iret

    m1:
    jmp m1

    Программа очень странно работает: Под виндой запускается и при нажатии клавиши пиксель смещается не на 1 пункт, а на неколько(от энтера на 5, от букв на 2).При эмуляции дос и под биосом вообще не робит. Почему такие глюки???
     
  18. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Добавил
    cli
    mov [es:bx+0], ax ;
    mov [es:bx+2], dx ;
    sti
    Теперь в досе программа выводит пиксель и на нажатия кнопок не реагирует. Что делать???
     
  19. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а ты не думал над моими словами
    т.е. в твоем обработчике тебе надо сохранить пользовательские регистры и для восстановления данных обработчика использовать глобальные переменные, адресуемые через cs. например.
    Код (Text):
    1. x dw 0
    2. y dw 0
    3. . . .
    4. int09:
    5. pusha
    6. mov dx, [cs:x]
    7. mov cx, [cs:y]
    8. popa
    9. jmp dword [old09o]
    +
    зачем видео режим задавать каждый раз. не пробовал запомнить цвет пикселя до рисования и для стирания нарисовать пиксель со старым цветом?
     
  20. wcools

    wcools New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2008
    Сообщения:
    89
    Но я не использую стандартный обработчик, и не передаю ему в конце управление
    Почему каждый раз, только 1, потом я экран не отчищаю вообще, т.е по нажатию кнопок должна выводится полоска из пикселей.