§ О клавиатуре ZX Spectrum

Конечно, сразу можно сказать, что клавиатура Спектрума - это своего рода новое чудо в мире программирования. Неизвестно, делал ли так кто-то до, либо после, но как и сам Спектрум, клавиатура от него - это явление уникальное. Ознакомиться с ней можно на отдельно для этой цели созданной страницей.
Да, клавиатура спектрума позволяла одним нажатием, одним жестким, уверенным касанием написать сразу же одно слово, но, конечно же, это делала не сама клавиатура, а именно записанный Бейсик в ПЗУ (ROM размером 16кб). Да, а именно то, как с клавиатуры читать данные, как раз и расскажу в этой статье.
Для того, чтобы каким-то образом получить данные о том, какая клавиша была нажата, существует возможность прочитать определенный порт и узнать об этом. Причем это делается очень интересным способом, о котором далее расскажу.
Для начала надо рассмотреть то, как расположены кнопки на клавиатуре. Их всего 40, то есть:
  • 26 это буквы английского алфавита
  • 10 цифр
  • Пробел (Space)
  • Enter
  • Symbol Shift
  • Caps Shift
В итоге получается 40 клавиш. Клавишей Symbol Shift на Бейсике спектрума выбирается линейка команды, а Caps Shift предназначена, чтобы переводить символы в верхний регистр, ну и еще для выборки линейки команд тоже. Это отдельная и довольно сложная тема для разговора, по этому можно даже целую книгу настрочить.
ЛинияБиты БитыЛиния
0123 4 432 10 
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
Как можно заметить, тут есть 2 части, на которые делится клавиатура - на левую и на правую часть. И еще левая и правая часть, если присмотреться, отзеркалена по битам. Не знаю, зачем все это сделано, но это сделано неспроста. В принципе, если захотеть, то можно схемотехнически в клавиатуру еще добавить кнопок, то есть вообще можно 64 кнопки сделать, 8 строк по 8 бит, но их тут всего 40 и ничего не поделать. С помощью этих 40 кнопок можно творить настоящие чудеса.

§ Как работает ввод

В спектруме есть порты для чтения клавиш. Сам порт является 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"
Биты от 5 до 7 нас не интересуют, они всегда будут 1, потому что для них не назначено никаких клавиш в спектруме. Вот так вот. Это далеко не просто.
Вот еще примерчики
#FE = 1111 1101 – чтение из линии A9
#FE = 1111 0111 – чтение из линии A11
#FE = 1110 1110 – чтение из линии A8 и A12
Если читаем из двух или более линии сразу, то при нажатии кнопок на одной из этих линии будет выставлять нули в соответствующих битах. То есть если я нажал на кнопку "0" или на кнопку "CS", то и в том и в том случае бит 0 будет сброшен (равен 0). Так что можно сканировать сразу несколько строк (если это требуется например).
Если у вас возникли проблемы с пониманием этой статьи, просто перечитайте внимательно снова, попробуйте потренироваться и все получится. Усердие и труд все перетрут. Это правда. Я проверял.