Это, без сомнения, тоже задача повседневной потребности. Сразу укажем на то, что существуют два различных метода опроса клавиатуры - один связан с приемом и анализом данных, поступающих от внешнего порта, а другой - с использованием системных переменных KSTATE или LASTK. Мы здесь рассмотрим оба метода, т.к. оба достаточно часто применяются в программах.
Рассмотрим задачу, аналогичную предыдущей. Допустим, нам надо, чтобы на экране рисовались синие квадраты при нажатии следующих клавиш:
"P" - в пр а в о " Q" - в в е рх
"О" - влево "А" - вниз
"0" - выход из программы Для усложнения задачи введем еще клавишу "ПРОБЕЛ" в качестве переключателя режимов "РИСОВАНИЕ/СТИРАНИЕ".
клавиатуры производится по внешнему порту 2 54 (FE поскольку адрес порта клавиатуры является двухбайтным
МЕТОД 1
числом, то FE - является младшим байтом адреса порта, а старший должен быть установлен предварительно в аккумуляторе.
Анализируются 5 младших битов. При этом если клавиша не нажата, то бит включен (в отличие от опроса Кемпстон-джойсти-ка). Поэтому, если ни одна клавиша не нажата, то должно бы выдаваться число 255, но оно не выдается, а выдается 191. Дело в том, что по 6-му биту анализируется состояние порта входа от магнитофона и если сигнал не поступает, то 6-ой бит выключен и поэтому Вы получаете 191, а не 255 (255-64 = 191) .
Адрес Метка Маш.код 6590 3E02
6592 CD 0116
6595 6597 65 9A 65 9C
659F 65A1
65A4
65A6
65A9
0618 CD440E 3E0F 325766
3E0B 325666
3E8F
CD4766
65AC REP 0E4F
65AE HERE 0 6FF
65B0 PAUSE 10 FE
65B2 0D
65B3 2 0F9
Мнемоника LD A, 02 CALL 1601
LD B,18 CALL 0E44 LD A, 0F LD (XPOS),A
LD A, 0B LD (YPOS) ,A
LD A, 8F
CALL PRINT
LD C, 4 F
LD B,FF
DJNZ PAUSE
DEC C
JR NZ,HERE
Комментарий
Открываем канал для печати на экране
Очистка экрана
Установка начальной колонки печати в переменной XPOS
Установка начальной строки печати в YPOS Аккумулятор указывает на символ | (143) Код символа отправляется в переменную SYM. Вызов процедуры печати символа
Установка параметра замедляющего цикла 1. Он взят меньше, чем в программе для джойстика, поэтому рисование здесь пойдет быстрее. Установка параметра замедляющего цикла 2. Второй замедляющий цикл
Первый замедляющий цикл
3EEF DBFE CB4 7 C8
3E7F DBFE CB47 CC2C66
65C5 65C7 65С9 65CB 65CD 65CF 65D1 65D3 65D5 65D7 65D9 65DB 65DD 65DF 65E1
3EDF DBFE СВ4 7 2817 CB4F 2825 3EFD DBFE CB47 2 82F 3EFB DBFE CB47 2839 C3AC65
LD IN BIT JR BIT JR LD IN BIT JR LD IN BIT JR JP
CALL Z , TOGGL
A, DF A, (FE)
0,A
Z,RIGHT
1,A
Z,LEFT A, FD A, (FE) 0,A
Z,DOWN A, FB A, (FE) 0,A Z,UP RET
65E4 RIGHT 3A5766 LD A, (XPOS)
3C INC A
FE1F CP 1F
CAAC65 JP Z,REP
325766 LD (XPOS), A
CD4766 CALL PRINT
65B5 65B7 65B9 65BB 65BC 65BE 65C0 65C2
A, (FE) 0, A Z
A,7F A, (FE) 0,A
Указание на 5-ый полуряд Опрос 5-го полуряда Проверка клавиши "0" Выход в БЕЙСИК, если нажата Указание на 8-ой полуряд Опрос 8-го полуряда Проверка клавиши "ПРОБЕЛ" Вызов подпрограммы на переключение печатаемого символа для обеспечения стирания Указание на 6-й полуряд Опрос 6-го полуряда Проверка клавиши "P" Вправо, если нажата Проверка клавиши "O" Влево, если нажата Указание на 2-й полуряд Опрос 2-го полуряда Проверка клавиши "A" Вниз, если нажата Указание на 3-й полуряд Опрос 3-го полуряда Проверка клавиши "Q" Вверх, если нажата Если ни одна клавиша не нажата, то сначала в акк-р идет последний столбец печати и увеличивается на 1 Проверка на достижение правого края Если да, то возврат на опрос клавиатуры Если нет, то запомнить новый столбец и вызвать подпрограмму печати
65F9 65FA
65FC
65FF
6602 CD4766
6605 C3AC65
6608 DOWN 3A5666
3C
FE16 CAAC 6 5
325666
CD4766 C3AC65
3A5 666 3D
FE0 0
CAAC 6 5 325666
660B 660C
660E
6611
6614 6617
6 61A UP
661D
661E
6620
6623
6626 CD4766
6629 C3AC65
662C TOGGL 3E7F
Адрес Метка Маш.код Мнемоника 65F3 C3AC65 JP REP
65F6 LEFT 3A5766 LD A, (XPOS)
DEC A CP 00
JP Z,REP
(XPOS),A
CALL PRINT
JP REP
LD A, (YPOS)
INC A
CP 16
JP Z,REP
LD A, (YPOS)
CALL PRINT
JP REP
LD A,(YPOS)
DEC A
CP 00
JP Z,REP
LD A, (YPOS)
CALL PRINT
JP REP
LD A, 7F
Возврат на новый опрос клавиатуры
Ввод текущего столбца печати
Уменьшить его номер на 1
Проверка на достижение
левого края
Если да, то возврат на
опрос клавиатуры
Если нет, запомнить новый
столбец
Вызов подпрограммы печати Возврат на опрос клавиатуры В акк-р идет последняя строка печати и увеличивается на 1 Проверка на достижение нижнего края Если да, то возврат на опрос клавиатуры Если нет, то запомнить новую строку и вызвать подпрограмму печати Возврат на новый опрос клавиатуры
Ввод текущей строки печати
Уменьшить номер строки на 1
Проверка на достижение
верхнего края
Если да, то возврат на
опрос клавиатуры
Если нет, то запомнить
новую строку
Вызов подпрограммы печати Возврат на опрос клавиатуры Вновь проверяем нажатие клавиши "ПРОБЕЛ", т. к. она
A, (FE) 0,A
JR Z,TOGGL
3A5A6 6 LD A, (SYM)
FE8F CP 8F
2 8 06 JR Z, NEXT
3E8F LD A,8 F
32 5A6 6 LD (SYM) , A
6640 C9
6641 NEXT 3E8 0
RET
LD B,FF
DJNZ WAIT
LD DE, TEXT
32 5A6 6 LD
6646 C9
6647 PRINT 06FF
6632
6634
6637 6 63 9
663B 6 63D
6649 WAIT 10 FE 664B 115566
010600 LD BC,0006 CD3C2 0 CALL 203C
RET
6655 |
TEXT |
16 |
DEFB |
16 |
6656 |
YPOS |
00 |
DEFB |
00 |
6657 |
XPOS |
00 |
DEFB |
00 |
6658 |
|
10 |
DEFB |
10 |
6659 |
|
01 |
DEFB |
01 |
6 65А |
SYM |
0 0 |
DEFB |
00 |
теперь должна быть отпущена иначе режимы будут переключаться многократно и выход будет неопределенным Возврат, если клавиша еще не отпущена
Чтобы переключить режим, надо сначала определить, какой символ установлен -синий квадрат (8F) или белый (80)
Поскольку был не синий, то устанавливаем в переменную SYM код синего квадрата Возврат
И, наоборот, раз был синий, то теперь устанавливаем белый квадрат ("СТИРАНИЕ") Возврат
Организация третьего замедляющего цикла Третий замедляющий цикл Регистр DE указывает на печатный текст Длина текста - 6 символов Вызов процедуры печати строки из ПЗУ Возврат в вызывающую процедуру
Символ управления печатью AT
Позиция печати по горизонт. Позиция печати по вертик. Управляющий символ INK Цвет символа - синий Код печатаемого символа.
МЕТОД 2
Можно проводить управление программой от клавиатуры и не опрашивая внешние порты, связанные с ней, а используя некоторые системные переменные "Спектрума". Поскольку программа при этом очень похожа на предыдущую, то мы ее текст приводить не будем, но некоторые существенные особенности имеются.
1. Использование системной переменной LAST K.
Эта системная переменная находится по адресу 23560. В ней запоминается код символа (токена) , находящегося на последней нажатой клавише. Причем, здесь есть различия, в зависимости от того, в каком клавиатурном регистре эта клавиша была нажата. Например, после нажатия клавиши "Р" там будет помещен код 7 0HEX (символ "р"), при нажатии CAPS SHIFT "P" - код 50HEX (символ "Р"), а при нажатии SYMB SHIFT "P" - код 22HEX (символ") .
Итак, первой особенностью является то, что одна и та же клавиша при использовании ее в разных режимах дает разные коды. поскольку в программе с равной вероятностью клавиатура может быть в режиме CAPS LOCK и в обычном режиме, то при определении перехода надо проверять оба кода. Например, для клавиши "Р" -переход на процедуру обработки движения вправо:
CP 70
JR Z,RIGHT
CP 50
JR Z,RIGHT
2. Вторая особенность состоит в том, что системная переменная "помнит" факт нажатия последней клавиши. Если при опросе клавиатуры через внешний порт мы имели сигнал только пока клавиша нажата, то здесь код сидит в переменной до тех пор, пока не будет нажата какая-либо другая клавиша, и тогда код сменится другим. Это означает, например для предыдущей программы, что стоит Вам только один раз коснуться клавиши "Р", как рисование синей полосы будет идти безостановочно, пока не будет достигнут край экрана или пока не произойдет нажатие другой клавиши. Но такое управление тоже часто применяется в программах, и об этом
3. Если этот недостаток является существенным, то можно воспользоваться системной переменной KSTATE. Она занимает 8 байтов, начиная с адреса 23552 по 23559. Строго говоря, это не просто переменная, а это небольшая область памяти, в которой процедуры ПЗУ, отвечающие за опрос клавиатуры, организуют свои временные хранилища информации. Наиболее интересен для нас адрес клавиши, причем он хоть и "запоминается" там, но ненадолго, в отличие от переменной LASTK. Здесь Вы можете прочитать код последней нажатой клавиши, причем он хоть и "запоминается" там, но ненадолго. Он хранится пять циклов прерываний, а поскольку в "Спектруме" прерывания происходят каждую 1/50 секунды, то код хранится в этой ячейке примерно 0.1 секунды.
4. И, наконец, последнее замечание. Для того, чтобы системные процедуры ПЗУ могли производить опрос клавиатуры и устанавливать системные переменные LASTK и KSTATE, необходимо, чтобы маскируемое прерывание было разрешено. Надо убедиться в этом, а лучше принудительно перед опросом клавиатуры дать команду EI (код FB HEX) .