Перевод второй главы почти закончен, готово все, кроме комментария к вот этом коду. Процедура отвечает за опрос клавиатуры. Т.е. можно опросить любые клавиши. Помогите, пожалуйста, понятно и правильно перевести комментарии к коду. Привожу два переведенных абзаца, предшествующих коду:
Мы можем установить необходимый адрес порта для каждой группы клавиш, используя формулу из руководства пользователя Спектрума. Адрес порта будет 254+256*(255-2^n), где n – это номер группы, принимающий значения от 0 до 7. Так же в ПЗУ, по адресу 654, есть очень полезная подпрограмма, которая возвращает код нажатой клавиши (от 0 до 39) в регистр e. Коды от 0 до 7 – это клавиши, которые в каждой группе ближе к середине (т.е. B, H, Y, 6, 5, T, G и V), 8-15 – следующие за ними, а 39 – крайняя клавиша последней группы – CAPS SHIFT. Кстати, статус клавиши SHIFT так же возвращается в регистр d. Значение 255 говорит о том, что не нажата ни одна клавиша.
Данная подпрограмма ПЗУ может возвращать код только одной клавиши, и не подходит для определения нескольких одновременных нажатий. Тогда для определения нажатия какой-либо клавиши в любой момент времени, нам необходимо конвертировать полученный код в адрес порта и номер бита, а затем считать оттуда значение. Для этого я использую одну очень удобную процедуру. Это единственная процедура в моих играх, написанная не мной. Выражаю за нее свою признательность Стивену Джонсу, программисту, который много лет назад писал отличные статьи для «Spectrum Discovery Club». Для работы с этой подпрограммой, загрузите в аккумулятор код клавиши, нажатие которой вы хотите проверить, вызовите ktest, и проверьте флаг переноса. Если он установлен, то клавиша не была нажата, если сброшен – то была. Если вам этот способ кажется запутанным и не слишком правильным, поставьте инструкцию ccf перед ret.
Код:
ktest ld c,a ; key to test in c.
and 7 ; mask bits d0-d2 for row.
inc a ; in range 1-8.
ld b,a ; place in b.
srl c ; divide c by 8,
srl c ; to find position within row.
srl c
ld a,5 ; only 5 keys per row.
sub c ; subtract position.
ld c,a ; put in c.
ld a,254 ; high byte of port to read.
ktest0 rrca ; rotate into position.
djnz ktest0 ; repeat until we've found relevant row.
in a,(254) ; read port (a=high, 254=low).
ktest1 rra ; rotate bit out of result.
dec c ; loop counter.
jp nz,ktest1 ; repeat until bit for position in carry.
ret