Сообщение от
kgbplus
Код:
ktest ld c,a ; код клавиши помещаем в c.
and 7 ; оставляем только биты d0-d2 для получения номера ряда.
inc a ; прибавляем единицу, чтобы значение стало от 1 до 8.
ld b,a ; помещаем в b.
srl c ; делим c на 8,
srl c ; для того, чтобы найти позицию внутри ряда.
srl c
ld a,5 ; в ряду 5 клавиш.
sub c ; вычитаем из кода значение позиции.
ld c,a ; результат помещаем в c.
ld a,254 ; старший байт номера порта из которого будем читать.
ktest0 rrca ; с помощью сдвига вычисляем старший байт адреса порта.
djnz ktest0 ; повтор, пока не найдем соответствующий ряд.
in a,(254) ; читаем порт (a=старший байт, 254=младший).
ktest1 rra ; сдвигаем биты в прочитанном результате.
dec c ; счетчик цикла.
jp nz,ktest1 ; повторять пока нужный нам бит не окажется в флаге переноса.
ret
Спасибо большое. Попытался сам разобраться в коде, благодаря вашей правке. Нашел одну ошибку (выделил жирным в обоих вариантах комментариев), добавил дополнительные пояснения по регистрам, ну и поправил под свой стиль перевода. Так же инструкции ротации не стал называть сдвигом, т.к. имхо все-таки это разные вещи. Посмотрите, и поправьте, где нужно:
Код:
ktest ld c,a ; код клавиши помещаем в c.
and 7 ; оставляем только биты d0-d2,
; для определения номера группы.
inc a ; прибавляем 1 чтобы получить значение от 1 до 8.
ld b,a ; загружаем номер порта в b.
srl c ; делим c на 8,
srl c ; чтобы найти позицию клавиши внутри группы.
srl c ; значение позиции будет от 0 до 4.
ld a,5 ; в группе только пять клавиш.
sub c ; вычитаем из aккумулятора значение позиции,
ld c,a ; и помещаем его в регистр c (результатом
; будет число от 1 до 5).
ld a,254 ; старший байт порта, из которого будем читать.
ktest0 rrca ; с помощью ротации аккумулятора вычисляем
; старший байт адреса порта.
djnz ktest0 ; повторяем, пока не найдем соответствующую группу
; (номер группы у нас хранится в b).
in a,(254) ; читаем порт (a=старший байт, 254=младший).
ktest1 rra ; ротация бит в полученном результате.
dec c ; счетчик цикла (в регистре c значения от 1 до 5).
jp nz,ktest1 ; повторяем, пока нужный бит не окажется
; во флаге переноса.
ret