§ О клавиатуре ZX Spectrum
Конечно, сразу можно сказать, что клавиатура Спектрума - это своего рода новое чудо в мире программирования. Неизвестно, делал ли так кто-то до, либо после, но как и сам Спектрум, клавиатура от него - это явление уникальное. Ознакомиться с ней можно на отдельно для этой цели созданной страницей.Да, клавиатура спектрума позволяла одним нажатием, одним жестким, уверенным касанием написать сразу же одно слово, но, конечно же, это делала не сама клавиатура, а именно записанный Бейсик в ПЗУ (ROM размером 16кб). Да, а именно то, как с клавиатуры читать данные, как раз и расскажу в этой статье.
Для того, чтобы каким-то образом получить данные о том, какая клавиша была нажата, существует возможность прочитать определенный порт и узнать об этом. Причем это делается очень интересным способом, о котором далее расскажу.
Для начала надо рассмотреть то, как расположены кнопки на клавиатуре. Их всего 40, то есть:
- 26 это буквы английского алфавита
- 10 цифр
- Пробел (Space)
- Enter
- Symbol Shift
- Caps Shift
Линия | Биты | Биты | Линия | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 4 | 3 | 2 | 1 | 0 | |||
A11 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | A12 | |
A10 | Q | W | E | R | T | Y | U | I | O | P | A13 | |
A9 | A | S | D | F | G | H | J | K | L | ENT | A14 | |
A8 | CS | Z | X | C | V | B | N | M | SYM | SPC | A15 |
§ Как работает ввод
В спектруме есть порты для чтения клавиш. Сам порт является 16-битным, но он устроен особо. Нижние 8 бит порта - это именно сам порт, то есть номер порта $FE, который между прочим, еще не только для клавиатуры предназначен, а еще и для магнитофона, а старшие 8 бит порта как раз и отвечают за выбор строки, с которой будет сканироваться.Вот так выглядит номер порта на чтение ряда:
A15 A14 A13 A12 A11 A10 A9 A8 A7-0 x x x x x x x x $FEВместо "x" тут может быть либо 0, либо 1. Если мы указываем 0, то тогда эта строка АКТИВИРУЕТСЯ, если же 1 - то остается безо всяких изменений. Что значит активируется? Это значит, что при нажатии какой-нибудь кнопки на этой строке у нас будет это отображаться в данных, которые мы получим из порта
Если клавиша не нажата - то в данных будет единица (1), если клавиша НАЖАТА - то в данных появится 0. В данных это имеется в определенном бите. Давайте примеры.
Допустим, мы читаем из порта #FEFE. Это значит, что если #FE нижние - то читаем мы данные с клавиатуры. Ок. Разбираем старшие #FE:
#FE = 1111 1110Что мы видим? На месте A8 стоит 0, а значит, реагировать будет на A8 строку. Смотрим, какие именно кнопки находятся на строке A8? Там находятся кнопки "CS","Z","X","C","V". Ну ок... Допустим, пришел ответ из порта #EA:
#EA = 1110 1100Теперь разбираем по битам (слева направо читаем каждый бит):
- 0 - бит 0, клавиша нажата, этот бит 0 соответствует в таблице клавише "1" (см. таблицу сверху)
- 0 - бит 1, клавиша нажата, это клавиша "2"
- 1 - бит 2, клавиша нажата, ну смысла нет, хотя это клавиша "3" (как помним, мы сканируем A8 линию!)
- 1 - бит 3, клавиша отпущена, это клавиша "4"
- 0 - бит 4, клавиша нажата, это клавиша "5"
Вот еще примерчики
#FE = 1111 1101 – чтение из линии A9 #FE = 1111 0111 – чтение из линии A11 #FE = 1110 1110 – чтение из линии A8 и A12Если читаем из двух или более линии сразу, то при нажатии кнопок на одной из этих линии будет выставлять нули в соответствующих битах. То есть если я нажал на кнопку "0" или на кнопку "CS", то и в том и в том случае бит 0 будет сброшен (равен 0). Так что можно сканировать сразу несколько строк (если это требуется например).
Если у вас возникли проблемы с пониманием этой статьи, просто перечитайте внимательно снова, попробуйте потренироваться и все получится. Усердие и труд все перетрут. Это правда. Я проверял.