Товарищи!тут прогу пишу, работающая напрямую через порты ввода/вывода с клавой и на одном моменте совсем застопорился- теоретически вроде все понятн и читал много всякой доки, а прогр так и не пашет: вылетает на вводе последнего символа. Мож кто смекнет че здесь не так: use16 vvod: xor dx,dx WaitLoop: in al,64h test al,1 jz WaitLoop ; Wait for IBF = 1 in al, 60h ; Read input buffer cmp al,0Bh jne ne_nol ;спец для 0 -чтобы его в ASCII перевести sub al,0Ah ne_nol: ;перевод в ASCII add al,2Fh cmp al,30h jl WaitLoop ;чтобы не обрабатывать отжатие inc edi mov [VIDEO_RAM+edi*2],al ;копирование в видеопамять cmp dx,3 je nakonec ;надо 4 символа получить inc dx jmp WaitLoop nakonec: ..........код..........
Подобный код очень сильно зависит от того, где он запущен, в частности, это host OS и hardware. Например, если запущен из-под NTVDM, то бит 0 порта 64h не везде транслируется в NTVDM. Т.е. ядро win считывает код, и бит этот сбрасывается, т.о. события нажатия/отпускания клавиши можно и не получить вообще. О наличии каких-либо событий от клавиатуры приходится выяснять косвенными путями, к примеру, нажатие клавиш отлавливать функциями BIOS, а отпускание - изменением значения порта 60h. Но тут другая проблема - если прочитать порт 60h в то время, как в порту 64h был установлен бит 5 (т.е. событие от PS/2 мыши, а не клавиатуры), в host OS может заколдобиться дальнейшая работа с мышью, вплоть до перезагрузки. В чистом DOS с не-USB клавой приведенный код должен работать, но для этого желательно запретить обработчик int 9, чтобы он при прерывании от клавы не читал порт 60h и таким образом не сбрасывал бит 0 порта 64h. Все понятно?