
Сообщение от
Destr
На реале всегда так, если зажать некоторые комбинации клавиш - будет читатся что зажат например весь полуряд.
Это из-за буферизации что-ли (или её отсутствия).
Электронщики объясняли как-то почему такой баг и даже как-то пытались фиксить.
SpeccyWiki:
Аппаратно кнопки клавиатуры представляют собой матрицу восемь на пять линий — восемь полурядов по пять кнопок. В зависимости от адреса, использованного при обращении к порту клавиатуры, в младших пяти битах возвращается состояние клавиш одного из восьми полурядов. Такая схема создаёт "эффект матрицы" (matrix effect) — при нажатии двух клавиш (одного полуряда) одновременно с третьей клавишей (в одном столбце с первой) возникает паразитное нажатие в полуряду третьей клавиши, соответствующее столбцу второй. Этот эффект можно ликвидировать размещением диода на каждой клавише.

Сообщение от
ALKO
Да, надо опросить одновременно три клавиши.
A+K+J
И вторая комбинация
D+K+J
А эта прога не детектит, если A (D) +K нажаты, то нажатие J игнорит.
Понять как работает прога по приведённому огрызку вообще нереально. Я удивлён что вообще как-то работает ))
Прежде всего неясно почему таблица берётся со стека, но это ладно может там всё продумано, а дальше ...
По (hl) вначале читается старший байт порта, затем читается порт, а следующий байт по (hl) инверсное выделение бита клавиатуры. Затем вы кидаете в (_KEYPRESSED) : 0 - не нажата, 1 - нажата, и уходите на адрес обработки который тоже берётся из таблицы.
Что и как у вас прописано по таблице фиг его знает. Показанный элемент может работать корректно только с одной кнопкой, как вы обрабатываете несколько этим куском кода не описывается ))
- - - Добавлено - - -
А пардон ступил, не из таблицы, у вас вызов проги с указанием за вызовом старшего байта порта и выделения бита )))
Не понятно только почему используется паразитный inc hl за съёмом адреса со стека
Но то же самое, это только для одной клавиши
- - - Добавлено - - -
Наваял на вскидку, за отсутствие ляпов не поручусь ))
Код:
KEYTEST3 pop hl ; проверка 3-х портов клавиатуры;
call KEYTEST_
jr z,1F
inc hl
inc hl
jr 2F
KEYTEST2 pop hl ; проверка 2-х портов клавиатуры
1 call KEYTEST_
jr z,1F
2 inc hl
inc hl
jr 2F
KEYTEST pop hl ; проверка порта клавиатуры
1 call KEYTEST_
2 ld (_KEYPRESSED),a
jp (hl)
KEYTEST_
ld a,(hl) ; старший байт порта
inc hl
in a,(#FE)
or #E0
cp (hl) ; проверка нажатия одной или нескольких клавиш в одном полуряде
inc hl
ld a,1
ret z
xor a
ret
_KEYPRESSED defw 0
Применение:
Код:
call KEYTEST3
DB #XX , # YY ; #XX - старший байт адреса порта, #YY - код одной или нескольких клавиш в полуряде ( бит 0 - клавиша нажата бит 1 -нет )
DB #XX , # YY
DB #XX , # YY
; дальнейшие инструкции
call KEYTEST2
DB #XX , # YY
DB #XX , # YY
; дальнейшие инструкции
call KEYTEST
DB #XX , # YY
; дальнейшие инструкции
Для вашего случая KEYTEST3 не нужен, у вас две клавиши в одном полуряде, только соответственный параметр нужен.
Да ещё момент, при опросе не стоит в старшем байте порта использовать больше одного нуля. Есть контроллеры PC клавы такие (по крайней мере у меня был) которые понимают либо 0 во всех разрядах сразу, либо только в одном. Поэтому у меня на профике некоторые игры не слушались управления ))