© А. Шокало, г. Тернополь.
В ZX 95/4, в этюдах, прочитал статью о процедурах KEY-INPUT. Хорошее начинание. Алексей Артамонов предложил свою процедуру опроса клавиатуры. Сейчас я работаю над одной небольшой игрушкой, и там я применил такой же метод, хотя сама процедура у меня больше. Вы говорите, что эта программа "явно не удовлетворяет требованиям, предъявляемым к такого рода процедурам". Так вот можно сделать по другому. По очереди запуская процедуры и накладывая результаты друг на друга (OR). Но зачем делать управление от нескольких интерфейсов. Ведь в таком варианте процедуры может быть случай, когда указатель должен передвинуться вверх, вниз, влево и вправо одновременно, и при этом нажата клавиша огонь.
А сейчас, в продолжение данной темы, я хочу добавить процедуру, которую можно использовать
совместно с процедурой Алексея. Она предназначена для выбора клавиш. Et я тоже использую в своей игре.
Немного о самой программе. Точка входа REDEF. Никаких входных данных не требуется. После запуска программа ожидает нажатия на любую клавишу. После выхода из процедуры в регистрах: H - старший байт адреса порта, L - маска бита нажатой кнопки.
; Redefine keys (C) FREE Group 1995
BC,#7FFE A, (C) %11111 %11111 NZ,KEY_PR
B
C,KEY_L REDEF %11111 L,A H, B
LD
IN
AND
CP
JR
SCF
RR
JR
JR
XOR
LD
LD
RET
Но если Вы предлагаете пользователю выбрать клавиши, то нужно показывать, какую именно он нажал. Поэтому у меня есть процедура, которая, по выходным данным предыдущей, в регистре А выдает код символа на данной клавише.
TRANSF CALL COUNN
E,A A, 4 E
E,A A, H 255 COUNN
LD D,A
LD A, 7
SUB D
SLA E
SLA E
SLA E
ADD A,E
LD E,A
LD D, 0
LD HL,#2 05
ADD HL, DE
LD A,(HL) RET
PUSH BC
LD B, 0 RRA
JR C,COU_E
INC B
JR COU_L
LD A, B
POP BC RET
Данная программа просто делает необходимые пересчеты, и по таблице в ПЗУ выбирает код нажатой клавиши.