Casio PD‑700 — Часть 2: подключение клавиатуры и знакомство с системой

    После того, как стало ясно, как привести Casio PD‑700B в рабочее состояние для работы в режиме простого калькулятора, я стал разглядывать его изнутри, чтобы найти зацепки о том, как он программируется. Быстро стало ясно, что распиновка процессора совпадает с HD62002, использующимся в FX‑880P и подобных, а также в FX‑603P. Даже время до автоотключения полностью совпало (5мин 58сек). Инструкции этого процессора не описаны, и понимая сходство, можно косвенно сделать вывод, что в данной модели не будет предусмотрена возможность писать в машинных кодах.
    Из сервис-мануала FX‑850P видно, что для клавиатуры используются пины 3-18, а для включения - пин 19.

    Тут так же: некоторые из этих пинов идут на клавиатуру, а некоторые не используются. Кроме того, на плате есть контактные площадки для этих пинов, а рядом с ними в корпусе имеется щель, как будто для вывода на внешнюю клавиатуру.

    Я подпаял к ним тонкие провода (мне очень нравятся провода из шлейфов экрана ноутбука) и вывел на маленькую внешнюю плату. Собрал калькулятор, закрутив несколько необходимых винтов и начал поочерёдно замыкать их пинцетом.

    Некоторые комбинации отрабатывали как нажатие имеющихся клавиш, но многие не вызывали никакой реакции. Как оказалось, это потому что они не функционируют в режиме простого калькулятора. При замыкании пинов 10 и 18 произошло то, на что я так надеялся: он вошёл в режим программирования, и отобразил привычный нам список программ!

За одним исключением: кроме стандартных программ 0‑9 тут видна одиннадцатая программа - "PA". Но сенсорных клавиш всего десять. Как выяснилось позже, она запускается сразу при включении калькулятора. Именно из-за неё он и не включается без сброса, в отличие от FX‑880P и других подобных моделей. В момент включения вместо привычного режима запускается программа "PA", а так как без сброса в памяти находится мусор, в том числе на местах адресов программы, калькулятор зависает, не успев что-либо отобразить. И именно поэтому RESET на нём предусмотрено выполнять в момент включения, до запуска "PA". Возможность установки программы на автозагрузку есть в некоторых устройствах, к примеру, в PB‑1000, но там это устроено по-другому. Подобное я нашёл только на ES‑160 - IC-карте с языком программирования BASIC для органайзеров Casio.

    Дальнейшими перемыканиями я подобрал все комбинации для полной клавиатуры, а также команды на клавишах для быстрого ввода во время программирования.

    Теперь, сидя с пинцетом в руках, я мог писать на нём программы, как, например, на FX‑880P. Интересно, что ввод цифр в режиме простого калькулятора и в режиме программирования выведен на разные клавиши (разные комбинации пинов). Уже понятно, что тут применяется BASIC, но имеется ранее не виданная на калькуляторах Casio команда "WIDTH". Судя по символам на верхнем ряду буквенных клавиш (QWERTY) и командам BASIC на нижних, если для него и существовала дополнительная клавиатура, она была QWERTY, а не вертикальная, как у PB‑240 и подобных. После этого я собирался переделывать под него механическую клавиатуру, даже купил на местной барахолке две Cherry ML4100 и прикинул удобное расположение клавиш. Но как выяснилось в последствии, в этом не было необходимости.
    Я начал долгие эксперименты, проверяя его возможности и поддерживаемые команды. Пересматривал мануалы к разным подобным устройствам, и не только Casio, записывал все команды, которые отрабатывали. Больше ощущалась схожесть с C61‑BASIC. Стоит обратить внимание на то, что режим простого калькулятора и режим программирования на нем – это два совершенно разных состояния. В режиме калькулятора невозможно вводить текст, следовательно, команды вроде FRE или SIN и COS выполнить невозможно. В режиме программирования же сами по себе подобные команды приводят к ошибке: перед ними необходимо писать PRINT. Даже для выполнения простой арифметической операции, такой как "2+2 ", нужно писать "PRINT 2+2 ". Это чем-то похоже на "Электроника МК‑90 ", только с отдельно прикрученным режимом простого калькулятора.

    Для отображения информации о состоянии памяти тут, как и в FX‑880P, используется команда FRE (работает только в виде PRINT FREX). Можно увидеть выделенную и свободную память отдельных областей:
  • FRE0 – Оставшаяся память для переменных.
  • FRE1 – Оставшаяся память для программ (всего доступно 59043 Б).
  • FRE2 – Оставшаяся память для стека.
  • FRE3 – Память, выделенная для переменных (по умолчанию 1536 Б).
  • FRE4 – Память, выделенная для стека (по умолчанию 768 Б).
Объём памяти, выделенный для переменных и для стека можно менять командой CLEAR X,Y (в FX‑880P объём стека фиксирован).

    Я попытался связаться с ним через 30-пиновый коннектор переходником, который я когда-то сделал для FX‑880P. Ведь если он использовал принтер FP‑50, то велика вероятность того, что пины последовательного порта тоже совпадут с FX‑603P. Попытка загрузки программ как на FX‑880P (LOAD "COM0:6") выдавала "BF error" - Illegal filename specification (всё тот же PB‑2000C Owners Manual, страница 92). Перепробовав множество вариантов, я пришёл к выводу, что единственный способ связаться с ним - это использовать дескриптор "COM0:". При этом связь устанавливается на скорости 300 bps с параметрами STOP BIT=1, DATA LENGTH=8, PARITY EVEN, XON/XOFF ON. Любые параметры после двоеточий вызывают ошибку, и кажется, что скорость или что-либо ещё изменить невозможно, по крайней мере из BASIC. Распиновка последовательного порта, ожидаемо, совпала с FX‑880P, и я мог свободно использовать свой переходник. Для удобства я использовал программу MB‑notepad.

    Я продолжил погружаться в возможности Casio PD‑700B и написал небольшую тестовую программку для вывода символов:
10 FOR I=32 TO 255
20 PRINT I;CHR$(I)
30 IF INKEY$="";GOTO 30
40 NEXT I
    Строка 30 понадобилась, так как изображение не останавливалось после PRINT. А если вывод находился в конце программы, то она завершалась, экран очищался и происходил возврат в режим простого калькулятора.
    При запуске программы сразу после включения калькулятора символы отображаются увеличенными (8x16). Но стоит перейти в режим программирования и вернуться обратно, как вывод переключается на стандартный размер символов 5x7, или с учётом отсутствия зазоров между сегментами экрана - 6x8. Кажется, я начинаю понимать, для чего на клавиатуре присутствует команда "WIDTH". Также поэкспериментировав с номерами 0‑32, я собрал таблицу кодов символов. Это кодировка JIS X 0201 с дополнительными символами, и за некоторыми исключениями таблица практически полностью совпадает с используемой в PB‑1000.

    Символы, которых нет на клавиатуре, можно выводить с помощью PRINT CHR$(X). Хотя 0x88, 0x89 и 0x8A выглядят одинаково, в мануале PB‑1000 сказано, что они печатаются принтером по-разному. В режиме вывода увеличенных символов всё повторяется, за исключением того, что отсутствуют символы 8X, 9X и EX. Их в таблице я отметил голубым цветом.
    Хорошо, я разобрался, вроде как, со всеми символами, которые он способен отображать. Но где же иероглифы, которые мы видели на фотографии в каталоге? Касательно следующих моделей, таких как PD‑1000 и PD‑2000, о которых также известно очень мало, нашлись хотя-бы ссылки с описанием того, что они способны выводить, но и там не объясняется, как именно это происходит. CHR$ выдаёт ошибку на любой аргумент больше 255. В ходе дальнейших экспериментов я случайно обнаружил, что если выводить строку из двух символов в увеличенном режиме, иногда можно получить символ Кандзи в размере 16x16 пикселей, и стало ясно, что у него в памяти имеется двухбайтовая кодировка. Для этого первый байт должен быть между 0x81 и 0x9F, а второй – не меньше 0x40. Теперь ясно, почему некоторые символы отсутствуют при увеличенном выводе. Например, следующий код отображал иероглиф "猿", означающий "обезьяна".
10 A$=CHR$(&H89)+CHR$(&H88)
20 PRINT A$
30 GOTO 30
    Интересно, сколько же всего символов у него в памяти. Я записал номера некоторых полученных иероглифов и стал искать кодировки, в которых они бы совпадали. Оказалось, что это одна из версий кодировки Shift JIS. Кроме Кандзи в ней присутствуют математические и физические символы, римские цифры, хирагана, катакана, греческий и русский алфавиты, а также различные специальные символы и иконки. Я сразу проверил русские буквы, и они действительно отобразились.

    Я был очень удивлён: русские буквы в Casio! При этом наиболее схожая таблица всё равно совпадает не полностью, так как в самом наборе символов есть диапазоны "неопределённых" символов.

    Далее я решил считать всё содержимое RAM в надежде найти там что-нибудь интересное. Написал небольшую программку, выводящую по UART байт за байтом, в виде текста в шестнадцатеричном представлении:
10 DEFSEG=0:CLS
20 OPEN "COM0:" FOR OUTPUT AS #1
30 FOR I=0 TO 65535
40 PRINT #1, RIGHT$(HEX$(PEEK I),2);
50 NEXT I
60 CLOSE #1
70 BEEP:BEEP1:BEEP:BEEP1:BEEP:BEEP1
    Передача 64 кБ таким способом при скорости 300 bps заняла почти полтора часа. При первичном осмотре полученного дампа можно понять, что в самом конце хранятся адреса и имена программ "P0"-"PA". Интересно, что вместе с ними хранятся ещё десять аналогичных записей с именами "D0"-"D9".

    Оказалось, что объекты "D0"-"D9" – это файлы данных DATA, и к ним можно обращаться как к последовательным файлам в PB‑1000. Допустимы номера файлов от #1 до #15, как и в PB‑1000, в отличии от FX‑880P, в котором можно использовать только #1. Определение "FOR OUTPUT" очищает указанный файл и начинает заполнять сначала.
    Пример программы для записи данных в файлы DATA и их последующего считывания в переменную.
10 OPEN "D0" FOR OUTPUT AS #1
20 PRINT #1,123
30 PRINT #1,"ABC"
40 CLOSE #1
50 OPEN "D0" FOR INPUT AS #1
60 INPUT #1,A
70 INPUT #1,B$
80 CLOSE #1
90 PRINT A,B$
100 GOTO 100
    Как и у многих моделей только для выполнения программ, у PD‑700B есть клавиши "YES" и "NO". Но таковых нет в привычных нам моделях. Я задался вопросом, как же использовать их для взаимодействия с программой в BASIC. В PB‑1000, к примеру, каждой сенсорной клавише на дисплее присвоено значение кода символа, и их можно считывать с помощью оператора INKEY$. Чтобы получить кода этих клавиш я написал программу отображения кодов введённых символов:
10 IF INKEY$="";GOTO 10
20 PRINT ASC(INKEY$):GOTO 10
    В результате удалось получить кода не только клавиш "YES" и "NO", но и всех остальных, включая сенсорные клавиши, используемые для запуска программ:
CHR$(240) "YES"
CHR$(241) "NO"
CHR$(235) "CONT."
CHR$(13)  "="/"EXE"
CHR$(24)  "C" и "AC"
CHR$(145) "%"
CHR$(146) "MR"
CHR$(147) "MC"
CHR$(148) "M+"
CHR$(149) "M-"
CHR$(158) "000"
CHR$(3)   "CAL"/"BRK"
CHR$(224)-CHR$(233) "P0"-"P9"
Клавиша MR также позволяет выводить число из памяти режима простого калькулятора (Memory) в процессе ввода или выполнения программ.

    По ошибкам, которые я иногда получал, я часто заглядывал в мануал PB‑2000C, так как у них схожий формат карт ROM, и я думал, что сходство на этом не заканчивается. Но как оказалось, список ошибок в мануале PB‑1000 полнее и полезнее для PD‑700B.

    Теперь, наконец-то, можно писать программы, используя Casio PD‑700B в полной мере!😛

Комментарии