
Сообщение от
S_V_B
На реале все правильно работает, с него и считывал..
Код:
; Подпрограмма: Опрос клавиатуры; клавиша есть: Z=0, клавиши нет: R0=0 и Z=1
MOV #PKEY/2,@#177010 ;ячейка PKEY в памяим ЦП для кода клавиши
TSTB @#177700 ; тестировать регистр состояния клавиатуры
BPL 77$ ; нет символа => выходим
TSTB @#177702
BMI 777$
MOVB @#177702,R0 ; поместить полученный скэн-код в R0
Ну кто же так делает. Контроллер клавиатуры сканирует матрицу клавиш каждые 64 мкс. И счетчик прокручивается в регистре 0177702. Как только зарегистрировано событие нажатия или отжатия клавиши, то значение в регистре 0177702 замораживается, а в регистре 0177700 устанавливается признак готовности (бит 7). Как только регистр 0177702 считан, то в регистре 0177700 сбрасывается признак готовности и счетчик начинает считать дальше. Поэтому если сразу же после этого прочесть регистр 0177702, то там оказывается уже значение на один больше. Командой TSTB @#177702 вы уже прочитываете регистр данных клавиатуры, потому следующая команда MOVB @#177702,R0 уже читает неверные данные.
Так что надо делать так:
Код:
; Подпрограмма: Опрос клавиатуры; клавиша есть: Z=0, клавиши нет: R0=0 и Z=1
MOV #PKEY/2,@#177010 ;ячейка PKEY в памяим ЦП для кода клавиши
TSTB @#177700 ; тестировать регистр состояния клавиатуры
BPL 77$ ; нет символа => выходим
MOVB @#177702,R0 ; поместить полученный скэн-код в R0
BMI 777$
Ну и если вы таким образом опрашиваете клавиатуру, то флаг разрешения прерывания должен быть сброшен, ну а при завершении программы установлен.
В UKNCBTL работает, потому что там эмуляция клавиатуры максимально приближена к оригиналу.