Casio PD‑700 — Часть 13: чрезвычайно редкая производная модель PD‑400B
На этот раз я просматривал объявления на eBay и увидел очень интересный калькулятор - Casio PD‑400B. Особенно моё внимание привлекло его сходство с хорошо знакомым к тому моменту PD‑700B. Насколько мне известно, это первый такой экземпляр, всплывший в интернете. На некоторых сайтах коллекционеров упоминается существование этой модели, но нигде нет даже фото. По фотографиям в объявлении уже можно было предположить, чем именно он отличается, но я всё-таки не устоял перед возможностью изучить его детальнее. К тому же удалось договориться о хорошей скидке, а доставка службой KoliPlus оказалась дешевле предложенной eBay. А совсем недавно, спустя уже значительное время после моего исследования, фото родственной модели - PD‑400 (без суффикса "B") обнаружилось в этой базе, правда, невысокого качества, без какой-либо информации об источнике или о самом устройстве.
Получив его, я удивился превосходной упаковке и с нетерпением приступил к распаковке и осмотру.
Логотип, нанесённый на лицевой стороне чехла, принадлежит компании "M-I Drilling Fluids", что превращает данный экземпляр в интересный исторический артефакт вычислительной техники, предназначенной для нефтегазовой отрасли. Это также следует из названий использовавшихся в нём программ, но сами программы в нём до наших дней не сохранились. Ехал он ко мне из Техаса, и интересно, можно ли ещё распутать нити его истории, ведь их главный офис располагался в том же Техасе, а на задней крышке нацарапано имя предыдущего владельца. Эта компания специализировалась на разработке буровых растворов и химических технологий для бурения нефтяных и газовых скважин, а впоследствии вошла в состав M-I Swaco. Она была образована в 1986 году в результате объединения подразделений Magcobar (Magnet Cove Barium Corporation), принадлежащей Dresser Industries, и IMCO Services (Industrial Minerals Company), принадлежащей Halliburton. Свидетельства использования программируемых калькуляторов в Magcobar существуют и за более ранний период. Сегодня предметы этой компании, в том числе с таким логотипом и надписью "Magcobar/IMCO", встречаются на eBay и позиционируются как винтажные.
По сути, это всё тот же Casio PD‑700B, только для внешнего рынка. Названия программ на бумажке под сенсорным стеклом тут написаны на английском. Все информационные наклейки тоже выполнены на английском. Внешне он полностью повторяет PD‑700B, за исключением клавиши "00" вместо "000", а на задней крышке красуется надпись с названием модели - Casio PD‑400B. Обозначение VCCI тут отсутствует, что логично для версии, предназначенной не для японского рынка.
Судя по коду на обратной стороне задней крышки (9H508B), не исключено, что этот экземпляр произведён в 1999-м году, поскольку в 1989-м шрифт кодов был другим, а PD‑700 существовал только в версии без суффикса. Хотя используемые компоненты вполне могли быть произведены на много раньше.
Изначально он включался не с первой попытки, а когда включался, работали не все клавиши. Но первое отличие проявляется уже на этом этапе: запрос на регулировку контраста выводится на английском языке. Да и остальные запросы, хотя в PD‑700 и были на английском, тут выводятся с отступами в режиме WIDTH,4.
Эти неполадки и интерес к устройству заставили меня начать исследование с физического разбора. Первая странность, которая бросается в глаза, это высверленное отверстие в корпусе у крепления 30-пинового порта, установленный там более короткий винт и приклеенная в прорезь бумажка. По состоянию заглушек нижних винтов уже видно, что ранее его пытались ремонтировать. Неизвестно, высверлили ли это отверстие при попытке ремонта или оно сделано ещё на заводе, но это очень удобно: так этот винт не нужно откручивать при разборе, а он вкручен в пластик экранной части и удерживает экран неподвижно. При том, что в PD‑700B винты крепились лишь к гайке с обратной стороны, а крепление за пластик было в ранних PD‑700.
Конструкция корпуса и плата полностью повторяют PD‑700B, а единственное отличие - микросхема ROM, но об этом чуть позже. Включение было нестабильным из-за помятого контакта включателя, а неработающие клавиши, как и в прошлый раз, удалось восстановить прогревом места соединения клавиатуры с платой паяльником с Т-образным наконечником, хотя последний опыт показал, что это даёт лишь временный эффект.
После устранения этих мелких неполадок можно переходить к поиску программных отличий:
Первым делом я сравнил таблицу символов, и, как и ожидалось, вместо дополненной JIS X 0201 тут используется другая кодировка, а именно Code page 437 (CP437), знакомая многим по MS-DOS (IBM PC). То есть, вторая половина таблицы полностью отличается: присутствуют символы с диакритикой и некоторые греческие буквы, на вместе катаканы располагаются BOX CHARS, а под номерами 240-255 (включая переназначаемые) вместо Кандзи находятся математические символы. При этом символ под номером &H5C - это обратный слеш (\), а не символ йены (¥), а сам символ йены находится под номером &H7E.
Важно обратить внимание, что, несмотря на визуальное отличие, именно символ &H5C используется для целочисленного деления и в PD‑700, и в PD‑400.
Кроме того, тут отсутствует двухбайтовая кодировка, что сделало возможным наличие в режиме WIDTH,2 символов, начинающихся на &H80, &H90 и &HE0. Но процессор используется тот же, поэтому в нём также имеются операторы BASIC для работы с Кандзи, но они не выполняют ожидаемого.
- DEFKAN$ (создание символов Кандзи 16x16) - выполняется без ошибок, но вывести созданные символы в дальнейшем невозможно.
- KPRINT (вывод символов Кандзи) - выполняется без ошибок, но выводит два символа 8x16 вместо одного символа Кандзи.
- KCV$ (вывод символов по их коду) - если указан двухбайтовый код, выводит два символа 8x16.
После наблюдения за поведением калькулятора я ранее описанным методом считал содержимое внешней ROM и приступил к исследованию его отличий.
Содержимое заголовка с основной информацией:
- 43 — StartByte?
- 4D04
- 008000 — ROM upper bound: 32768 => 32 kB
- 0102 — Version for ROM Card
- 00003532382D3100 — Program name and version: 528-1
- 870929 — Program date: 1987, September 29
- FFFFFFFFFFFFFFFF
- 000304
- 000304 — address of "K0" program address
- 000304
Тут уже видно, что размер ROM - 32 кБ, ведь в отличие от PD‑700, тут не требуется большой объём памяти для двухбайтовой кодировки. Также отличается версия для совместимости ROM-карты, название и версия программы тут - "522-1", а написана она была 29 сентября 1987 года. Получается, что программа для PD‑400 была написана в том же году, всего через 6 месяцев и 26 дней после программы для PD‑700.
Если версия для совместимости ROM-карты у PD‑700 - "0101", у PD‑400 - "0102", а у PB‑2000C уже "0104", то можно предположить, что версия "0103" должна быть у карт для Sandvik Coromant TRIM 8401T.
Следующие различия можно увидеть в таблице назначений клавиш:
- Вместо кода &H9E, применяющегося для ввода "000", используется &H9F для ввода "00". Значит такой вариант был предусмотрен в прошивке процессора заранее.
- Вместо кода &H20 (пробел) в альтернативном режиме ввода используется код &A0. По имеющейся таблице это диакритический символ "á", но смысл замены вовсе не в этом, что станет понятно далее.
Прямо перед началом битовой карты символов, по адресу &H043900 лежит таблица из 64 байт, которой в PD‑700 не было:
ED 9D 9B 9C 9E E8 AC 83 88 8C 93 96 F8 E4 AE AF
E5 85 8A 8D 95 97 A0 82 A1 A2 A3 84 89 8B 94 81
91 86 A4 87 AB E0 E7 EB E9 E6 A6 90 A8 A7 AD 8E
E1 98 99 9A 92 8F A5 EC E2 F1 F6 FB 80 E3 EA F9
Сначала я решил, что это таблица исключений для парсера двухбайтовых символов Shift-JIS. Но из используемых в них первых байтов тут отсутствуют &H9F, &HEE и &HEF, а также присутствуют неиспользуемые - &HAx и &HFx. Для проверки своей теории я вывел символы "9F41", "EE41" и "EF41": в PD‑700 каждый из них - это пустой символ 16x16, но в PD‑400 - два символа 8x16. На такой случай у меня было ещё пару предположений, и я приступил к перемыканию пинов клавиатуры иголками, закрепив корпус и батарейки прищепками. Оказалось, что это таблица переназначения клавиш, а потребовалась она для назначения символов, номера которых в основной таблице соответствуют функциям. Очерёдность клавиш в ней определяется уже назначенными им кодами &HA0–&HDF в основной таблице, для этого пробел в альтернативном режиме и был заменён кодом &HA0. Таким образом, денежные символы вводятся некоторыми цифровыми клавишами с Shift, а в альтернативном режиме ввода применяются диакритические символы вместо BOX CHARS, находящихся под номерами символов катаканы.
Интересно, что в прошивке процессора PD‑700 с самого начала была заложена возможность переназначения вводимых символов при использовании других кодировок, и это говорит о том, что версии с внешней клавиатурой планировались всерьёз. А что касается исключений для парсера двухбайтовых символов, возможно, символ считается началом двухбайтового, если он пустой. Ведь, судя по маркировке на процессоре (A02), внутренний ROM не должен отличаться, а во внешней ROM других отличий не нашлось.
И наконец, системная программа "K0". Её адреса можно было бы прописать для "P0" и отправить на компьютер, но я предпочёл не разбирать его, чтобы лезть иголками к пинам клавиатуры, и снова детокенизировал вручную.
10 WIDTH 16,4
20 PRINT " ***CONTRAST***","DARK :PRESS YES","LIGHT:PRESS NO";
30 •$=INPUT$(1,@)
40 IF ASC(•$)=240 THEN CONTUP
50 IF ASC(•$)=241 THEN CONTDOWN
60 IF ASC(•$)=43 THEN 100
70 IF ASC(•$)=45 THEN 200
80 GOTO 30
100 CLS : PRINT," LOAD RAM"," OK ?";
110 •$=INPUT$(1)
120 IF ASC(•$)=42 THEN GOSUB 300 : GOTO 100
130 IF ASC(•$)=47 THEN 400
140 IF ASC(•$)=240 OR ASC(•$)=13 THEN PRINT CHR$(24); : LOAD @ :ELSE END
200 CLS : PRINT," SAVE RAM"," OK ?";
210 •$=INPUT$(1)
220 IF ASC(•$)=42 THEN GOSUB 300 : GOTO 200
230 IF ASC(•$)=47 THEN 400
235 ON ERROR GOTO 1000
240 IF ASC(•$)=240 OR ASC(•$)=13 THEN PRINT CHR$(24); : SAVE @ :ELSE END
250 ON ERROR GOTO 0
300 IF PEEK(&HD5F)=255 THEN CLS : PRINT, " 19200 BPS" : •$=INPUT$(1,@) : IF ASC(•$)=42 THEN POKE &HD5F,0 : GOTO 310 :ELSE RETURN
310 IF PEEK(&HD5F)><255 THEN CLS : PRINT, " 9600 BPS" : •$=INPUT$(1,@) : IF ASC(•$)=42 THEN POKE &HD5F,255 : GOTO 320 :ELSE RETURN
320 GOTO 300
400 CLS : PRINT," <CHECK SUM>"," PRESS(1-3)";
410 •$=INPUT$(1,@)
420 DEFSEG=0
430 ON ASC(•$)-48 GOTO 500,600,700,2000
440 END
500 CLS:PRINT," PROG:";LRC$(PEEK&HCC8*256+PEEK&HCC7-1,&HFA0)," DIR:";LRC$(PEEK&HCEF*256+PEEK&HCEE+87,PEEK&HCEF*256+PEEK&HCEE);
510 •$=INPUT$(1,@)
520 GOTO 400
600 CLS:PRINT," FILE:";LRC$(PEEK&HCCB*256+PEEK&HCCA-1,&HFA0)," DIR:";LRC$(PEEK&HCEC*256+PEEK&HCEB+167,PEEK&HCEC*256+PEEK&HCEB);
610 •$=INPUT$(1,@)
620 GOTO 400
700 INPUT ""+CHR$(24)+" START?";@5;⌜
710 IF ⌜ < 0 OR ⌜ > 65535 THEN 700
720 INPUT " END?";@5;⌟
730 IF ⌟ < 0 OR ⌟ > 65535 THEN 720
740 IF ⌜ >= ⌟ THEN 700
750 CLS:PRINT," ";HEX$(⌜);"-";HEX$(⌟)," SUM:";LRC$(⌟,⌜);
760 •$=INPUT$(1,@)
770 GOTO 400
1000 PRINT,"PR error";:•$=INPUT$(1,@):END
2000 WIDTH ,4
2010 PRINT "VX-528 A15/16"
2020 PRINT " Check Program"
2030 •$=INPUT$(1,@)
2040 DEFSEG=&H8000
2050 ⌜=PEEK0:CLS:PRINT "LED OFF OFF":GOSUB 2110
2060 ⌜=PEEK&H8000:CLS:PRINT "LED OFF ON":GOSUB 2110
2070 DEFSEG=&H9000
2080 ⌜=PEEK0:CLS:PRINT "LED ON OFF":GOSUB 2110
2090 ⌜=PEEK&H8000:CLS:PRINT "LED ON ON":GOSUB 2110
2100 END
2110 BEEP1
2120 IF INPUT$(1,@)<> CHR$(13) THEN 2120 :ELSE RETURN
Она также отличается, в первую очередь размером шрифта, английским текстом и некоторыми символами. В строке 710 изменено минимально допустимое для ввода значение адреса при вычислении чексуммы указанного диапазона с -32768 на 0. Но самое интересное - это скрытый пункт в меню "CHECK SUM". Хотя, как и раньше, выводится "PRESS(1-3)", в строке 430 добавлен четвёртый вариант для перехода - строка 2000, а с неё начинается код, который мы ещё не видели!
2000 WIDTH ,4
2010 PRINT "VX-528 A15/16"
2020 PRINT " Check Program"
2030 •$=INPUT$(1,@)
2040 DEFSEG=&H8000
2050 ⌜=PEEK0:CLS:PRINT "LED OFF OFF":GOSUB 2110
2060 ⌜=PEEK&H8000:CLS:PRINT "LED OFF ON":GOSUB 2110
2070 DEFSEG=&H9000
2080 ⌜=PEEK0:CLS:PRINT "LED ON OFF":GOSUB 2110
2090 ⌜=PEEK&H8000:CLS:PRINT "LED ON ON":GOSUB 2110
2100 END
2110 BEEP1
2120 IF INPUT$(1,@)<> CHR$(13) THEN 2120 :ELSE RETURN
2010 PRINT "VX-528 A15/16"
2020 PRINT " Check Program"
2030 •$=INPUT$(1,@)
2040 DEFSEG=&H8000
2050 ⌜=PEEK0:CLS:PRINT "LED OFF OFF":GOSUB 2110
2060 ⌜=PEEK&H8000:CLS:PRINT "LED OFF ON":GOSUB 2110
2070 DEFSEG=&H9000
2080 ⌜=PEEK0:CLS:PRINT "LED ON OFF":GOSUB 2110
2090 ⌜=PEEK&H8000:CLS:PRINT "LED ON ON":GOSUB 2110
2100 END
2110 BEEP1
2120 IF INPUT$(1,@)<> CHR$(13) THEN 2120 :ELSE RETURN
В этом меню при нажатии клавиши "4" программа выводит текст "VX-528 A15/16 Check Program" и ожидает нажатия любой клавиши. Далее после каждого нажатия выводится состояние светодиодов и издаётся звук, а внутри программы происходит обращение к адресам ROM-карты:
Code | Output | CS | Addr.L. |
DEFSEG=&H8000 PEEK 0
PEEK &H8000
DEFSEG=&H9000 PEEK 0
PEEK &H8000
| "LED OFF OFF" "LED OFF ON" "LED ON OFF" "LED ON ON" | CS6 CS6 CS6 CS6 | - - A15 - - A16 A15 A16 |
Видимо, существовала сервисная карта со светодиодами и триггерами для проверки верхних адресных линий, которые не используются при внутренней ROM на 32 кБ. Интересно, почему ограничились проверкой только A15 и A16 (128 кБ), если максимальный поддерживаемый объём карты - 512 кБ.
Так как в PD‑400 отсутствует двухбайтовая кодировка символов, ему достаточно объёма ROM в 32 кБ, но у таких микросхем отличается назначение пинов 1 и 22.
Пин 22 - это /OE, а не A16, но касательно этого в схеме изменений нет и при проектировке платы вариантов не предусмотрено. А всё потому, что при обращении к адресам менее 64 кБ адресная линия процессора A16 по совпадению выдаёт сигнал, требуемый для активации /OE. В связи с этим в диапазоне 040000-04FFFF (64 кБ) содержимое памяти дублируется, а при чтении с 05XXXX уже идут "FF".
А вот с пином 1 всё гораздо интереснее: в микросхемах на 64/128 кБ это A15, а на плате предусмотрены площадки для перемычек "C" и "D". При этом "C" соединяет его с адресной линией процессора A15, а "D" соединяет с +5V и требуется не для всех микросхем меньшего объёма, а только для тех, у которых пин 1 - это VPP. В моём экземпляре площадка "C" разомкнута, хотя и залужена - видимо, плату переделывали из уже готовой для PD‑700B, но площадка "D" тоже не замкнута. На ROM тут наклеена бумажка с номером "1222", маркировки микросхемы не видно, а пометка на плате, как это обычно и бывает, осталась для 128 кБ (TC531000AF). В связи с этим у меня возник вопрос: если пин 1 тут NC, то зачем размыкали "C", а если нет, то почему не замкнули "D"? Я даже допускал вариант, что реальный объём памяти больше, а площадку "C" могли использовать для "выбора банка". Но всё оказалось ещё страннее: под наклейкой располагается EPROM NEC D27C256AG-15, а не MASK ROM, как это чаще бывает.
Видимо, для такой маленькой партии было невыгодно заказывать производство MASK ROM на заводе со своей прошивкой, и в Casio решили использовать EPROM, чтобы прошивать самим, а в качестве маркировки клеили бумажный стикер с внутренним номером, означающим версию залитой прошивки. Также бумажка могла служить дополнительной защитой от повреждения данных при попадании УФ, хотя в этом типе корпуса окошко для этого и так не предусмотрено. Но вот что именно странно: в даташите на 27C256 от NEC, да и от некоторых других производителей (не всех) указано, что в режиме чтения пин 1 необходимо подключать к +5V. Площадка "D" как раз предусмотрена для такого случая, но её оставили разомкнутой. В редких случаях NEC D27C256AG можно встретить и в PB‑1000, причём с такой же наклейкой и с номером "1209". Но в случае PB‑1000 не предусматривалась возможность установки ROM более 32 кБ, и пин 1 там соединён с плюсом питания изначально.
Я даже замерил сопротивление между пинами 1 и 28 (VDD), и оно гуляет в мегаомах, то есть внутренней подтяжки точно нет. Получается, что она тут работает чисто случайно, и пин 1 оказывается в плавающем высоком состоянии только благодаря внутренним токам утечки и паразитным ёмкостям? Но в таком случае работа не может быть гарантированно стабильной, так как в условиях сильных помех наводки на висячем входе могут нарушить это состояние. Подобные рассуждения именно о NEC μPD27C256 уже возникали в интернете, и там выяснилось, что при низком уровне на VPP она возвращает нули, но при отключённом читается, хотя это считается плохой практикой.
А может быть, предыдущие вмешательства были связаны именно с этим? На заводе забыли установить перемычку, из-за чего иногда происходили сбои. Ведь не исключено, что этот калькулятор эксплуатировался в тяжёлых условиях, включая повышенную влажность, солёный воздух и перепады температур, где-нибудь на буровой установке на морской нефтяной платформе, вблизи двигателей и генераторов. А не из-за этой ли ошибки он вообще оказался за пределами предприятия, для которого был произведён, и в результате попал ко мне?







Комментарии
Отправить комментарий