Сегодня речь пойдёт о совершенно нетипичном для раздела ретро-железа оборудовании. Встречаются такие девайсы достаточно редко, а интересующихся ими ещё меньше.
Итак, сегодня мы вам расскажем об антикварном представителе банковского оборудования — POS-terminal'е VeriFone TRANZ 460. Постараемся собрать вместе всю информацию по данным устройствам.
О чём я?
Загуглив «VeriFone Tranz», можно найти немало материалов по теме. Различные демки, фотографии внутренностей, даже полный реверс-инжиниринг прошивки. Но большинство проектов так или иначе связаны с написанием собственной прошивки и её загрузкой в EPROM терминала или даже с разборкой устройства и использованием только части компонентов от него. Тем не менее, если этот вариант вам нравится больше, ссылки будут представлены в конце поста.
Я же хочу рассказать вам о том, как написать что-либо под данное устройство без потери аутентичности, используя штатные программные средства производителя. Попутно узнаем, как выглядело типичное платёжное приложение, как загрузить программу в POS-terminal, где ещё применялись эти устройства, кроме как в платёжных решениях, и ещё много чего интересного.
Также рекомендую прочитать вот эту статью товарища begoon: Платёжный терминал OMNI-395 изнутри.
Немного истории
Компания VeriFone появилась в 1981 году и является детищем Уильяма «Билла» Мелтона. Первым её продуктом стало некое устройство, позволявшее проверять подлинность чеков по телефону (отсюда и название компании — Verification Telephone). А уже в 1984 был выпущен POS-terminal VeriFone ZON. Позже появились и другие аналогичные модели — ZON JR XL, ZON II, TRANZ. Их всех объединяло очень многое: процессор от Zilog, небольшой объём памяти, вакуумно-люминесцентный сегментный индикатор, идентичная раскладка клавиатуры. А также и методика программирования, о которой и пойдёт речь в данной статье. TRANZ 330 и ZON JR XL стали едва ли не самыми массовыми и наиболее долго эксплуатировавшимися POS-terminal'ами в истории: появившись в середине восьмидесятых, полностью исчезли они лишь в конце нулевых.
Обзор оборудования
Ни ZON JR XL, ни TRANZ 330 найти мне так и не удалось. Объявлений достаточно много на eBay, однако с учётом доставки в Россию это будет не совсем дешёвым удовольствием. Вообще, выпускалось много моделей: TRANZ 380 (с увеличенным объёмом памяти) TRANZ 380 X2 (с поддержкой двух приложений и переключения между ними), TRANZIT и PNC (для работы в локальной сети проприетарной системы), TRANZ 340 (тоже что-то околосетевое).
Я раздобыл TRANZ 460. По сути он представляет собой TRANZ 380 с интегрированным принтером. Была также модель 420, это такая же модификация TRANZ 330.
Устройство в весьма средненьком состоянии: после списания аппарат несколько дней валялся на улице под дождём, но до электроники вода так и не добралась, что очень радует.
Спереди у него находятся клавиатура и экран (ВЛИ, на шестнадцать знакомест). Сверху индикатор питания и кнопка протяжки бумаги.
Сзади ничего интересного, лишь выштамповка в корпусе, выполняющая роль ручки для переноски. В отдельных модификациях TRANZ 460 там располагался свинцово-кислотный аккумулятор для резервного питания.
Сзади разъёмы для телефонной линии и БП (в хлам окисленные). Изначально терминал работал от двадцати четырёх вольт переменного тока, но опыт показал, что двенадцать вольт тоже отлично подойдут, даже при печати не было никаких проблем.
Разбираем. На обратной стороне платы микросхемы конвертеров уровней RS-232 и чуть-чуть дискретной логики.
Материнская плата отдельно. В панельке, собственно, сам процессор Zilog Z180. Из других микросхем тут есть:
- Z86C1112PSC — микроконтроллер семейства Z8;
- Z84C4006PEC — контроллер последовательных портов;
- Z84C3006PEC — системный таймер;
- Z84C2006PEC — контроллер параллельных портов;
- 73K224L — модем;
- OKI M6242B — часы реального времени.
На верхней части находится плата с ВЛИ, динамиком, клавиатурой и F/2F-декодером магнитного считывателя. Чуть выше — принтер.
Магнитный считыватель достаточно простой, читает только вторую дорожку.
Плата с кнопками отдельно. Микросхема от Micrel — контроллер ВЛИ.
Сбоку два порта RS-232 с разъёмами MDN-8P и MDN-6. В отличие от TRANZ 330, распиновка их в мануале скромно опущена. Распиновка тут такая:
DTR GND TX
RX CTS RTS
DCD GND
Принтер, разумеется, матричный. VeriFone продавала для него свои картриджи (с собственным P/N), но мы таки нашли, как называется оригинальный: Epson ERC-09B. Новый такой был без проблем приобретён в «Ситилинке», на момент написания статьи они были в свободной продаже.
Новый картридж Cactus CS-ERC09.
Снимем пластмассовую крышку. Принтер здесь не совсем типичной конструкции: иглы в головке расположены горизонтально. Мотор протяжки бумаги — обычный коллекторник. На его валу находится червячная муфта, рассчитанная так, чтобы при полном проходе головки бумага сдвигалась на расстояние одной точки. В качестве датчика нулевого положения головки — обычный геркон. Шестерни обмазаны густой липкой смазкой.
Первое включение
Скорее всего, ваш аппарат будет с разряженной батарейкой, поэтому при включении на экране загорится PROGRAMING ERR0. Зажимаем Function+1, терминал должен запуститься. Далее жмём *+3, загорится DIAGNOSTICS, на что нажимаем ALPHA. Выставляем дату и время. Или просто нажимаем CLEAR, этого достаточно для инициализации памяти и RTC.
При желании можно разобрать аппарат и припаять новую батарейку, в противном случае эти действия придётся производить каждый раз при включении аппарата.
Пароли
Возможно, что этот пункт никогда вам не понадобится, но не будет лишним указать.
Стандартный пароль: Z66831 (вводится как 1 ALPHA ALPHA 66831).
Очистка памяти: зажать *+CLEAR, ввести следующую комбинацию: 8 ALPHA 0 ALPHA 8 ALPHA 5361041 ALPHA ENTER.
Других паролей в терминале нет (но они могут быть предусмотрены прошивкой).
Меню
Без прошивки можно воспользоваться следующими функциями:
Function+7 — просмотр содержимого памяти;
Function+8 — редактирование содержимого памяти;
Function+ALPHA — изменить пароль;
Function+* — выгрузка ПО;
Function+0 — загрузка по модему
Function+# — локальная загрузка.
Сочетания клавиши Function с цифрами от 1 до 6 не используются и могут быть задействованы в программе.
На чём вообще под них писали?
Нее. Если вы думали, что для него были компиляторы для C, вы глубоко ошибаетесь. Такого для него не предоставлялось. Как, впрочем, для BASIC, Pascal или какого-то другого языка общего пользования. Программа для любого устройства серии ZON или TRANZ писалась на проприетарном языке TCL (Terminal control language). К более известному в широких кругах Tcl (Tool command language) никакого отношения он, понятное дело, не имеет.
По сути TCL является скриптовым языком. Программу можно набивать прямо с клавиатуры терминала, хоть это и очень неудобно. Сама VeriFone рекомендует для этого использовать свой софт для ПК, который загружает программу в память. При этом интерпретацией занимается всё равно сам POS-terminal, никаких действий с кодом на компьютере не производится.
Язык специально создан с учётом предельно малых объёмов памяти: каждая команда занимает один-два символа. Это очень неудобно, а также нисколько не интуитивно, но другого выхода тогда не было.
TCLOAD
Существует три основных варианта загрузки ПО в терминал.
- Удалённый. На сервере банка установлено ПО ZonTalk. Терминал совершает звонок на модемный пул и получает прошивку. Собственно, этот способ и был самым распространённым: достаточно разместить короткую инструкцию с требованием ввести номер телефона и ID терминала, и пользователь сможет без труда загрузить прошивку сам.
- Локальный. Самой компанией VeriFone он позиционировался как вариант для разработчиков. Терминал подключается к компьютеру кабелем (распиновка была приведена чуть ранее), а загрузка производится при помощи ПО TCLOAD.
- От устройства к устройству. Два терминала соединяются нуль-модемным кабелем, после чего один передаёт свою прошивку на другой.
Наибольший интерес представляет, конечно, второй вариант. Для него нам понадобятся только кабель, компьютер с COM-портом и само ПО (разумеется, под DOS).
Первоначально в поисках проги я отправился на сайт VeriFone. Точнее, конечно, на его архивную копию из конца девяностых, где был раздел с материалами для ZON/TRANZ. Увы, TCLOAD'а там не обнаружилось, зато «всплыли» мануалы: руководства пользователя для Tranz'ов, TCLOAD Reference Manual, TCL Terminal Control Language Programmer's Manual. В принципе, ПО для загрузки прошивки можно написать самому, так как в мануалах описан формат пакетов данных и значение полинома для расчёта CRC-16. Но я хотел найти тот самый, аутентичный софт.
Далее я отправился на Yahoo.com, где после непродолжительных поисков TCLOAD был найден.
Если что, валялся он на файлообменнике 4shared.com, где также обнаружился TCLOAD.DBS — вспомогательный файл к данной программе, представляющий собой базу моделей терминалов.
И вот эта находка подводит нас к ещё одной области применения данных устройств.
Что такое PunchPlus?
TRANZ — это по сути программируемый контроллер. Не самый мощный, но идеально подходящий для целого ряда задач. Помимо платёжных решений он также использовался, к примеру, в системах контроля доступа на объект или в качестве таймера учёта рабочего времени. Одной из таких систем стал PunchPlus от компании Service Info-Rapide (inforap.com). На её сайте (если открыть французскую версию) были обнаружены и оригинальный TCLOAD, и TCL-файл с программой. Скачать дистрибутив можно тут: ссылка на дистрибутив (все ссылки будут продублированы в конце поста).
Программа предназначена для работы с TRANZ 330, но прекрасно запускается на любых устройствах этой серии.
А как насчёт банковского ПО?
Всё печально. Увы. Локальная загрузка вообще не была распространена, так что всё распространялось исключительно через модем. Каких-либо прямых ссылок на скачивание текста программы найдено не было.
Также следует отметить, что с завода терминалы поставлялись уже с прошивкой (она описывается в мануале к терминалу). Для большинства банков она полностью подходила и в модификации не нуждалась. Прошивку легко считать (опять таки потому что формат пакетов данных описан в TCLOAD Reference Manual), другое дело, что терминалов с прошивкой уже не осталось из-за разряда внутренней батарейки.
На момент написания статьи ничего подходящего найти так и не вышло (но был бы очень рад что-либо найти).
Впрочем, для желающих посмотреть, что представляло собой это самое ПО, вариант один таки есть. О нём будет рассказано чуть позже.
TCL-файлы
TCLOAD не требует никакой установки (достаточно просто закинуть в рабочую папку), а также ничуть не критичен к процессору (ошибками типа Runtime error при запуске не сыпет). Запускать можно хоть в DOSbox с пробросом портов. Каких-то специальных режимов работы порта тоже не выставляется.
TCL-файл состоит из заголовка (номер модели, без которого TCLOAD не будет ничего загружать, список есть в мануале) и строчек с командами. Каждая строка представляет собой номер ячейки памяти, после которой стоят сами команды, отделённые знаком равенства. Если вместо "=" написать "$", команды можно писать с переводом строки, что сильно облегчает работу со скриптом. Также поддерживаются комментарии, выделяемые точкой с запятой в начале.
Перед выбором ячейки памяти откройте мануал и посмотрите её предназначение: некоторые из них зарезервированы и для размещения в них команд или данных не подходят.
Итак, открываем папку с ПО, где создаём текстовый документ, скажем, 1111.txt. Название и расширение значения не имеют. Открываем наш файл и пишем там:
%9EAEU123
0030=HELLO WORLD
Подключаем девайс кабелем к ПК, запускаем режим загрузки (на дисплее должно гореть UNIT RECEIVE), вводим команду:
tcload 1111.txt /t1
После этого файл должен немедленно загрузиться в память устройства. И после нажатия на «Cancel» на экране появится указанная в файле строка.
Разумеется, данный файл — это не совсем программа. В данном файле мы просто записали строку в ячейку памяти №30. Это IDLE PROMPT, то есть строка, отображающаяся на экране в режиме ожидания (если оставить её пустой, будут выводиться дата и время).
О значении других зарезервированных ячеек памяти можно посмотреть в документе TCLOAD Reference Manual.
Всего в Tranz 380/460 две тысячи ячеек памяти (0000-1999), в Tranz 330/420 их в два раза меньше (000-999). ZON имеет всего 478. Каждая ячейка памяти, в зависимости от версии ПО в EPROM устройства, вмещает в себя шестьдесят или сто двадцать байт, при этом «лишние» байты при загрузке отбрасываются.
Начало исполнения
Начальным адресом для выполнения программы является ячейка памяти № 981. В ней могут быть прописаны какие-либо команды или же перенаправление на другую ячейку памяти. То, что записано в данной ячейке повторяется постоянно. При нажатии кнопки Clear и выходе из программы или же при её завершении она будет запущена заново через N секунд, где N — число, записанное в ячейке № 980. Если эти две ячейки памяти останутся пустыми, терминал будет показывать просто дату и время или строку IDLE PROMPT.
Также программу можно запустить сочетанием клавиш Function+N, где N — кнопки от 1 до 6. За это отвечают ячейки 31-36. Принцип их использования точно такой же.
Помимо функций, выполняют команды и простые нажатия клавиш в нормальном состоянии. Для этого служат ячейки N07, где N — номер кнопки от 1 до 9.
Если не задействовать ни одну из указанных ячеек, программа работать не будет.
Пишем первую программу
Итак, ознакомившись со структурой TCL-файлов, можно и написать что-то своё.
Создаём текстовый документ и пишем там примерно следующее:
%9EAEU123
231=HELLO HABRAHABR
31$ L446
446$
B.5
G
A231
V
G
Загружаем программу, жмём Function+1. После чего на экране появится примерно следующее:
Теперь разберёмся, что тут вообще происходит. В отдельной ячейке памяти указана наша строка. Нажатие Function+1 выполняет команду L446 — переход к адресу 446, где и находится наша программа (следует отметить, что если программа занимает больше одной ячейки памяти, в конце каждого блока нужно указывать адрес следующего при помощи команды L).
На всякий случай отмечу: адреса для строки и команд взяты произвольно из списка таковых общего пользования, который есть в мануале. Можно использовать и другие подходящие, никаких проблем это не вызовет.
По адресу 446 находится, собственно, программа, состоящая из следующих команд:
B.5 — выбрать буфер №5;
G — удалить его содержимое;
A231 — поместить в буфер содержимое ячейки памяти № 231 (где и лежит наша строка);
V — вывести буфер на экран;
G — очистить буфер.
Достаточно просто, хоть и неудобно. Правда, из-за такого языка справиться с чтением программы на пару сотен строк (особенно если все ячейки памяти записаны в одну строчку) неподготовленному пользователю решительно невозможно.
Печать
Ну, где дисплей, там и принтер. И программа, в общем-то, похожа:
%9EAEU123
231=HELLO HABRAHABR
31$ L446
446$
B.5
G
A231
N
G
Итак, за печать отвечает команда N. В терминалах со встроенным принтером печатается выбранный буфер, а в экземплярах без такового — буфер отправляется в последовательный порт, после чего туда же кидается управляющий символ Line Feed.
Более правильным вариантом будет такой:
%9EAEU123
231=HELLO HABRAHABR
31$ L446
446$
B.5
G
A231
Z40.2
W
N1.1.2
G
Здесь также используются команды Z и W (дополнить буфер пробелами для его выравнивания и приостановить выполнение программы до конца печати).
Итак, загружаем, нажимаем Function+1, после чего на дисплее загорится OUT OF PAPER наша строка будет распечатана.
У команды N здесь также используются несколько аргументов: один отступ при печати, печатать немедленно и при печати выводить на экран PRINTING, при отсутствии бумаги печатать через полсекунды после вставки (последний аргумент — число секунд / 2).
Аргументы разделяются между собой точками.
Спикер
Ну, тут вообще всё очень и очень просто:
%9EAEU123
31$ *G0
32$ *G1
Аргумент «0» команды *G позволяет вызвать высокий звук, аргумент «1» — низкий.
Клавиатура
Для ввода данных с клавиатуры существует команда K.
Собственно, пример:
%9EAEU123
231=ENTER DATA
31$ L446
446$
B.5
G
A231
V
G
K
N
G
Вначале мы выводим строку «ENTER DATA». После нажатия клавиши Enter начнётся ожидание ввода с клавиатуры. А после подтверждения введённое значение будет занесено в буфер и отправлено на принтер.
Магнитный считыватель
Теперь попробуем прочитать карту:
%9EAEU123
231=SWIPE CARD
31$ L446
446$
B.5
G
A231
V
G
M
N
G
Для ввода данных с магнитного считывателя существует команда M.
Также можно использовать команду E, позволяющую задействовать сразу магнитный считыватель или клавиатуру. Например, чтобы обеспечить возможность ввести номер или сразу провести картой.
Предустановленные сообщения
Разумеется, в VeriFone понимали, что куча сообщений для всех пунктов меню займёт кучу памяти, которую можно было бы использовать более рационально. Поэтому в EPROM зашит целый ряд системных сообщений, которые можно выводить на экран командой F. Полный список приведён в мануале.
DDSTRANZ
«Это, конечно, хорошо, но что делать, если такого терминала под рукой нет?» — скажете вы. Кое-что в данном случае можно предложить. На просторах был обнаружен некий DDSTRANZ — ПО за авторством Dave Dunfield, представляющее собой симулятор терминала, пин-пада и процессингового центра. Свободно распространяемая версия имеет некоторые ограничения, но вполне подходит, чтобы вдоволь наиграться. Также в комплекте имеются и тестовые прошивки. Для запуска потребуется DOSbox и программа наподобие Virtual Serial Port Driver.
Я записал видео с демонстрацией работы тестовой прошивки:
Также демо-режим есть и в самом терминале — нажимаем *+3, на экране загорится DIAGNOSTICS, затем жмём 9.
Ну и что же теперь делать?
Собственно, практического применения всё это уже давно не имеет. Сами терминалы в этой стране уже являются достаточной редкостью (впрочем, на eBay их ещё полно), да и какими-то невероятными возможностями они не обладают. Тем не менее, попробовать что-то написать под них или посмотреть, как устроены имеющиеся прошивки, может быть интересно.
Такие дела.
Ссылки
- DDSTRANZ, TCLOAD, мануалы
- TRANZ/TCL Information
- рекламный каталог целого модельного ряда антикварных POS-terminal'ов
- система контроля рабочего времени на базе TRANZ
- дистрибутив этой системы
- типичная инструкция по загрузке ПО через телефонную линию (самого ПО не нашлось. Увы)
- материалы по реверс-инжинирингу TRANZ 330 и демка для него
- обзор внутренностей ZON JR XL
- ещё реверс-инжиниринг
- разборка TRANZ 330
- разборка TRANZ 330
- разборка ZON JR XL
Автор:
MaFrance351