Tomcat
Professional
- Messages
- 2,689
- Reaction score
- 915
- Points
- 113
Транз 330 Файлы

Я разместил архив, содержащий дамп исходного файла программы Tranz 330, мою прокомментированную дизассемблирование оригинальной программы и две версии демо-версии Моцарта в исходной и двоичной форме. Если вам удастся приобрести Tranz 330 от поставщика излишков электроники, это доставит вам удовольствие на целый день! Вы можете взять файлы здесь .
Картирование Транз 330

Торговый терминал VeriFone Tranz 330 и его аналоги — отличные платформы для любителей электроники. Эти маленькие коробочки, которые обычно можно приобрести в магазинах излишних товаров или на eBay примерно за 10 долларов, содержат полноценный 8-битный компьютер с множеством интересных интерфейсов ввода-вывода и вакуумно-флуоресцентным дисплеем в ретро-стиле. В Tranz используется микропроцессор Z-80, такой же, как в почтенных TRS-80 и ZX Spectrum, поэтому процедуры программного обеспечения этих классических компьютеров часто можно использовать повторно.
Программа по умолчанию в ПЗУ терминала представляет собой довольно унылое приложение для обработки кредитных карт, но новую программу можно заменить, заменив исходный чип ПЗУ. Зная аппаратное обеспечение и ассемблер Z-80, вы можете написать новую программу, которая заставит Tranz делать любую сумасшедшую вещь, которую вы только можете себе представить, например, кредитную карту Моцарта: превращать данные магнитной полосы кредитной карты в музыку. Это руководство покажет вам, как это сделать.
Системные характеристики
- Процессор Z-80 на частоте 4 МГц
- 32 КБ ПЗУ, в разъеме для легкой замены
- 32 КБ ОЗУ
- 16-символьный, 16-сегментный вакуумно-люминесцентный буквенно-цифровой дисплей.
- 16-клавишная клавиатура 4×4
- Пьезодинамик
- Устройство считывания карт с магнитной полосой, формат ISO 7813 Track 2
- Z-80 PIO, интерфейс параллельного порта
- Z-80 DART, интерфейс последовательного порта
- Z-80 CTC, счетчик/таймер
- OKI M6242B Чип календаря/часов реального времени
- Контроллер дисплея Microl MIC10937
- Последовательный порт RS-232, 8-контактный разъем DIN
- Дополнительный последовательный порт, 6-контактный разъем DIN
- Одночиповый модем 73K212L-IP, 1200 бит/с
- Внутренняя резервная литиевая батарея для оперативной памяти
Соответствующие транзитные терминалы
VeriFone также выпустила несколько подобных моделей терминалов Tranz. Я ими не пользовался, но большая часть того, что здесь написано о Tranz 330, относится и к ним. Однако программное обеспечение, написанное для Tranz 330, возможно, потребует небольших модификаций, чтобы учесть аппаратные различия на других терминалах.- Tranz 380 – ЦП Z180 с частотой 6 МГц, ПЗУ 64 КБ, ОЗУ 64 КБ или 128 КБ, устройство считывания карт памяти 1/2/3
- Tranz 460 – Z80A на частоте 3,579 МГц, кардридер на 1/2 дорожки, встроенный принтер чеков
Требования к питанию
Подержанные терминалы Tranz 330 часто продаются дешево без адаптера переменного тока, но, к счастью, замена обходится недорого. Важно помнить, что для этого требуется адаптер переменного тока в переменный, а не переменный в постоянный. Стандартный адаптер VeriFone выдает 8,5 В переменного тока при силе тока 1 А. Я также успешно использовал адаптер Jameco с номером детали 1586154, который представляет собой адаптер на 9 В переменного тока, 1 А, за 7,95 долларов США. Любой другой аналогичный адаптер с внутренним диаметром 2,5 мм также подойдет.Почему Tranz 330 использует адаптер переменного тока вместо переменного тока в постоянный ток? Я не знаю, и я не исследовал. Встроенное регулирование мощности обеспечивается стабилизатором постоянного тока 5 В L387A с малым падением напряжения, а вся цифровая электроника использует источник питания 5 В постоянного тока. Может быть, это была какая-то мера экономии?
Интерфейс платы ввода-вывода

Внутри корпуса Tranz 330 компоненты разделены на две печатные платы, наложены друг на друга и соединены только одним 20-контактным разъемом диаметром 0,1 дюйма. Материнская плата находится внизу и содержит процессор, вспомогательные микросхемы, блок питания, последовательные порты и модем. Плата ввода-вывода находится сверху и содержит клавиатуру, дисплей, контроллер дисплея MIC10937 и динамик.
Для людей, использующих микроконтроллер вместо Z-80, логическую плату можно выбросить, а плату ввода-вывода и корпус использовать отдельно. Соединение между платами не спаяно, поэтому их можно легко разъединить. Это создает хорошее автономное решение ввода-вывода для проекта микроконтроллера со всеми необходимыми сигналами, доступными на 20-контактном разъеме.
Распиновка разъема платы ввода-вывода
- верхний ряд клавиатуры
- клавиатура второй ряд сверху
- клавиатура третий ряд сверху
- нижний ряд клавиатуры
- клавиатура, крайний правый столбец
- клавиатура второй столбец справа
- клавиатура третий столбец справа
- клавиатура, крайний левый столбец
- Северная Каролина
- Северная Каролина
- Северная Каролина
- выход картридера
- сброс дисплея
- отображение ввода данных
- дисплей часов
- +5 В постоянного тока
- вход драйвера динамика
- -5 В постоянного тока
- динамик отключен?
- Земля
Создание замены ПЗУ

Если вы сохраните материнскую плату, вам придется заменить исходное ПЗУ на другое, содержащее вашу новую программу. Исходное ПЗУ представляет собой 28-контактную СППЗУ 27C256 с УФ-стиранием, 32 КБ (256 кбит). Предполагая, что у вас еще нет УФ-ластика и вам нравится тратить 15 минут на стирание EPROM каждый раз, когда вы меняете программу, вам захочется заменить его более современным 32-килобайтным EEPROM или флэш-ПЗУ.
Для создания нового ПЗУ вам понадобится универсальный программатор EPROM/EEPROM/Flash. Если у вас его еще нет, у MCUmall есть хороший выбор недорогих программистов. Я использую EasyPro 90B.
К сожалению, ни один из производимых в настоящее время EEPROM или Flash точно не соответствует емкости, физическому размеру и распиновке 27C256. Лучшее решение — использовать флэш-ПЗУ 27SF512. Это ПЗУ объемом 64 КБ, но если вы разместите свою программу в верхней половине (настройте программное обеспечение вашего программатора на размещение данных по цене 8000 долларов США), оно будет совместимо по выводам без какой-либо дополнительной работы. К сожалению, 27SF512 больше не производится, но по-прежнему широко доступен у вторичных источников и поставщиков автозапчастей, поскольку он является фаворитом людей, которые повторно чипуют электронный контроллер впрыска топлива своего автомобиля.
Альтернативным решением с использованием совершенно новых деталей является использование EEPROM 28C256. Это 32К ПЗУ, но распиновка немного другая, чем у 27C256. Чтобы всё заработало, после записи ПЗУ пин 27 следует загнуть вверх и припаять к пину 28. Следить, чтобы пин 27 не касался гнезда. Конечно, это делает невозможным перепрограммирование ПЗУ позже, поэтому вы можете захотеть выполнить эту модификацию низкопрофильного сокета ZIF вместо самого 28C256. Как и раньше, вы также должны разместить свою программу в верхней половине ПЗУ (настройте программное обеспечение вашего программатора так, чтобы данные размещались по цене 4000 долларов США). Поскольку 28C256 представляет собой устройство с 32 КБ, общий размер образа ПЗУ ограничивается 16 КБ. Я успешно использовал этот метод, пока не нашел запас микросхем 27SF512, но может быть сложно получить надежный электрический контакт между ZIF и базовым разъемом ПЗУ.
Программные инструменты
Ваша программа будет написана на языке ассемблера Z-80, поэтому вам понадобится ассемблер. Я использовал sjasm , но подойдет любой ассемблер Z-80. Вам также может понадобиться симулятор Z-80, который поможет протестировать ваш код перед записью его в ПЗУ. Я использовал ознакомительную версию Z80 Simulator IDE .В Интернете вы можете найти ссылки на «программирование» Tranz 330 на общепринятом языке под названием TCL. Не обращайте на это внимания. TCL — это уродливый интерпретируемый язык во время выполнения для создания пользовательских приложений для торговых точек, и интерпретатор является частью исходного ПЗУ. Программы TCL выполняются внутри «песочницы», предоставляемой интерпретатором. Вы будете создавать собственную программу для Z-80, имеющую прямой доступ ко всему оборудованию.
Транз 330 Библиотечные процедуры

Создавая демо-версию «Кредитной карты Моцарта», я разработал набор повторно используемых библиотечных процедур для работы с оборудованием Tranz 330. Эти процедуры упрощают общие задачи, такие как вывод строки на дисплей, чтение с клавиатуры и воспроизведение сигнала на динамике. Файл tranz330.asm содержит все эти библиотечные процедуры, а также демонстрационную программу Моцарта, которая может служить рабочим примером. Используйте это как отправную точку для создания собственных программ Tranz 330. Части библиотечных процедур также представлены ниже в разделах, посвященных аппаратному обеспечению.
Вы также можете скачать архив, содержащий оригинальный дамп файлов программы Tranz 330, мою комментированную дизассемблирование оригинальной программы и две версии демо Моцарта в исходном и бинарном виде.
Библиотечные программы Tranz 330 Tranz 330 + архив Моцарта
Карта памяти
Z-80 имеет адресное пространство памяти 64 КБ. ПЗУ сопоставлено с адресами 0–$7FFF. При запуске выполнение программы начинается с адреса 0. ОЗУ отображается по адресам $8000 – $FFFF. Обычно стек начинается с $FFFF и растет вниз.Порты ввода/вывода
Z-80 также имеет отдельное пространство ввода-вывода на 256 портов. Для Tranz 330 эти порты отображаются следующим образом (все номера портов в шестнадцатеричном формате):- Порт $00 – параллельный порт A PIO.
- Биты 3-0: вывод, столбцы клавиатуры. Бит 3 — крайний правый столбец.
- Бит 4: выход, сброс контроллера дисплея
- Бит 5: вывод, отображение данных контроллера
- Бит 6: выход, часы контроллера дисплея
- Бит 7: вход, данные кард-ридера
- Порт $01 – регистр управления PIO для порта A.
- Порт $02 – параллельный порт B PIO.
- Биты 3-0: ввод, строки клавиатуры. Бит 3 — нижняя строка.
- Биты 7-4: не подключены
- Порт $03 – регистр управления PIO для порта B.
- Порт $10 – канал CTC 0
- Порт $11 — канал CTC 1
- Порт $12 – канал CTC 2. Выход канала 2 подключен к драйверу динамика.
- Порт $13 – CTC канал 3. Входной триггер канала 3 подключен к выходу канала 2.
- Порт $20 — последовательный порт DART A. 8-контактный порт DIN RS-232.
- Порт $21 — регистр управления DART для порта А.
- Порт $22 — последовательный порт DART B. 6-контактный дополнительный порт DIN.
- Порт $23 — регистр управления DART для порта B.
- Порты $30–$3F – регистры часов реального времени $0–$F
- Порты $40, $50, $60, $70 – Модем?
system_init:
LD A,0xCF ; control each port bit individually
OUT (0x01),A
LD A,0x80 ; bit 7 is input, others are outputs
OUT (0x01),A
LD A,0x18 ; use interrupt vector 18
OUT (0x01),A
LD A,0x97 ; generate interrupt if any masked bit is low
OUT (0x01),A
LD A,0x7F ; interrupt mask = bit 7
OUT (0x01),A
LD A,0x3F ; set the initial output values for port 0
OUT (0x00),A
RET
Отображать

16-символьный 16-сегментный VFD питается от контроллера дисплея Micrel 10937 . Он поддерживает прописные буквы, цифры 0–9 и небольшой набор символов.
Контроллер подключается к ЦП через последовательный интерфейс, используя биты 6–4 порта $0. Байты данных должны передаваться в контроллер по одному биту за раз. Последовательные часы также необходимо переключать с помощью программного обеспечения для каждого бита. Байты данных имеют длину 8 бит и передаются первым старшим битом. Старший бит, равный 1, указывает на управляющий байт, а старший бит, равный 0, указывает на отображаемый байт данных.
После сброса дисплей по умолчанию отключается. Прежде чем что-либо печатать, его необходимо сначала включить, установив рабочий цикл дисплея на значение выше нуля.
display_init:
IN A,(0x00) ; get current port state
AND 0xEF ; clear bit 4 (display reset)
OUT (0x00),A
LD B,0x1C ; wait 0x1C cycles
.L1 DJNZ .L1
OR 0x10 ; set bit 4 (display reset)
OUT (0x00),A
LD C,0xFF ; set the display duty cycle to 31 (maximum brightness)
CALL display_send_byte
RET
Отправка управляющего байта или байта данных на дисплей требует его смещения по одному биту в бите 5 порта $0 и одновременном переключении тактовой частоты последовательного порта в бите 6 порта $0:
display_send_byte:
; byte to be sent is in C
; note the display controller does not support lower-case letters!
LD B,0x08 ; 8 bits to send
.L1 IN A,(0x00) ; get current port state
RLA ; rotate the port word until the data bit is in the carry flag
RLA
RLA
RL C ; shift the next output data bit into the carry flag
RRA ; rotate the port word until the data bit is in bit 5
RRA
RRA
OUT (0x00),A ; setup the data output (bit 5)
OR 0x40 ; set clock high (bit 6)
OUT (0x00),A
AND 0xBF ; set clock low (bit 6)
OUT (0x00),A
DJNZ .L1 ; continue with the next bit
RET
Клавиатура

16-клавишная клавиатура имеет раскладку 4×4. Он содержит 12-клавишную секцию телефонного типа с цифрами 0–9, * и #, а также четыре специальные функциональные клавиши CLEAR, BACKSPACE, ALPHA и ENTER. Клавиатура является пассивным устройством, требующим работы ЦП для проверки состояния клавиатуры. Клавиатура имеет четыре линии столбцов и четыре линии строк, а линии строк имеют подтягивающие резисторы. При нажатии клавиши создается электрическое соединение между линиями строк и столбцов, которые перекрываются под этой клавишей.
Введя 0 в одну строку столбца и введя 1 в остальные, ЦП может активировать этот столбец. Текущее состояние четырех клавиш в этом столбце можно затем проверить, прочитав строки строк. Если нажата клавиша в активном столбце, значение соответствующей строки строки будет равно 0. Если ни одна клавиша не нажата, нагрузочный резистор выдаст значение 1 для этой строки. Чтобы обнаружить нажатия клавиш, ЦП должен по очереди активировать каждую из четырех строк столбцов и проверить строки строк на наличие 0.
Линии столбцов подключены к ЦП через порт $0, биты 3–0, а линии строк — к порту $2, биты 3–0.
Библиотечная функция keypad_read возвращает код клавиши в диапазоне от 1 до 16 в A или 0, если ни одна клавиша не нажата.
Для ввода многосимвольной строки, включающей буквы, цифры и символы, необходима процедура ввода более высокого уровня. Библиотечная функция keypad_get_string считывает полную строку от пользователя и предоставляет некоторые базовые возможности редактирования строк. Нажатия клавиш отображаются на дисплее. BACKSPACE можно использовать для исправления ошибок. Буквы и специальные символы можно вводить, сначала нажимая цифровую клавишу, а затем несколько раз нажимая АЛЬФА для переключения альтернативных символов для этой клавиши. Ввод строки завершается при нажатии клавиши ENTER.
СТС и спикер
Z-80 CTC имеет четыре независимых канала счетчика/таймера, адресуемые ЦП через порты $10–$13. Полную информацию об использовании CTC можно найти в Руководстве пользователя Z-80 CTC. Каналы можно настроить на вызов прерывания при возникновении тайм-аута. Каждый канал также имеет контакт тайм-аута и триггерный контакт для прямых аппаратных интерфейсов. В Tranz 330 вывод тайм-аута канала 2 подключен к тактовому входу триггера в драйвере динамика, а также к триггеру канала 3.Прямоугольный сигнал любой желаемой частоты можно воспроизводить через динамик, установив соответствующую постоянную времени на канале 2. К сожалению, нет возможности контролировать громкость или создавать другие звуковые сигналы.
Чтобы настроить канал 2 для использования динамика, его необходимо установить в режим таймера с автоматическим запуском. Желаемую частоту можно затем воспроизвести, загрузив соответствующую постоянную времени в канал 2:
speaker_beep_period:
; beep tone period time constant should be passed in C
LD A,0x07 ; disable interrupts, timer mode, prescale=16, auto-trigger, time constant follows
OUT (0x12),A
LD A,C ; time const
OUT (0x12),A ; speaker on
LD BC,0x0096 ; wait 150 ms
CALL wait_ms
LD A,0x03
OUT (0x12),A ; speaker off
RET
Кардридер
Устройство считывания карт поддерживает формат ISO 7813 Track 2, который содержит до 40 символов, где каждый символ представляет собой 4 бита данных и один бит нечетной четности. Он прочитает практически любую кредитную карту, водительские права, торговую карту, удостоверение личности или другую карту с магнитной полосой. Обычно данные на магнитной полосе совпадают с данными, напечатанными на карте: номер счета и срок действия. Во многих случаях, в зависимости от типа карты, на ней могут храниться и некоторые дополнительные данные. Магнитная полоса не содержит PIN-кодов или других личных данных.Устройство считывания карт подключено к ЦП через порт $0, бит 7. Порт настроен на запуск прерывания всякий раз, когда сигнал устройства считывания карт активен. На интерфейсе ЦП сигнал устройства считывания карт обычно равен 1, когда карта отсутствует, и быстро переключается между 1 и 0 при считывании карты. Если вы используете плату ввода-вывода с микроконтроллером и напрямую воспринимаете контакт 12 из 20-контактного разъема, тогда полярность меняется на обратную: сигнал обычно равен 0 и быстро переключается между 1 и 0 при считывании карты.
Интерпретация сигнала устройства считывания карт сложна, поскольку тактовый сигнал отсутствует, скорость изменения сигнала данных зависит от скорости считывания карты, а также потому, что сигнал даже напрямую не передает логические двоичные данные с карты.

Трек на магнитной полосе состоит из длинной серии магнитных доменов. Каждый домен поляризован магнитным севером или югом. Когда считывающая головка находится в области любой полярности, сигнал устройства считывания карт равен 1. Когда считывание проходит границу между областями противоположных полярностей, сигнал устройства считывания карт кратковременно переходит в 0. Длительность этого импульса составляет примерно 40 с. микросекунды.
Каждый логический бит данных на дорожке имеет одинаковую физическую длину на магнитной полосе. На краю бита всегда будет граница магнитного домена. Бит логической 1 также будет иметь границу магнитного домена в пределах длины бита, а логический 0 — нет. Таким образом, извлечение логических нулей и единиц представляет собой задачу измерения интервалов между импульсами сигнала устройства считывания карт. Два последовательных импульса каждый раз N, поскольку последний представляет логическую 1, и одиночный импульс 2N, поскольку последний представляет собой логический 0. Этот формат кодирования называется F2F или Aiken Biphase.
Данные начинаются с длинной строки логических нулей, что позволяет программному обеспечению калибровать значение N для этого считывания карты. Для большей надежности процедура библиотеки устройства чтения карт также корректирует значение N во время транскрипции битов, чтобы компенсировать ускоряющееся или замедляющееся движение во время считывания карты.
Использование библиотечных процедур для устройства чтения карт представляет собой многоэтапный процесс:
- При запуске system_init устанавливает обработчик прерывания, который будет вызываться, когда сигнал устройства считывания карт становится низким.
- Обработчик прерываний использует цикл занятости для измерения продолжительности каждого цикла от 0 до 1 сигнала устройства считывания карт, сохраняя данные о длительности в буфере. Когда обработчик завершает работу, управление возвращается подпрограмме got_card.
- card_parse_bits вызывается для выполнения F2F-декодирования измерений длительности, заполняя буфер логическими нулями и единицами.
- card_parse_characters вызывается для преобразования логических битов в символы ASCII, заполняя буфер строкой ASCII с нулевым завершением. Преобразование ASCII добавляет 30 долларов США (ASCII '0') к каждому 4-битному элементу данных. Если обнаружена ошибка четности, возвращается пустая строка.
Последовательные порты

Tranz 330 имеет два последовательных порта: порт RS-232 с 8-контактным разъемом DIN и дополнительный последовательный порт с 6-контактным разъемом DIN. Последовательные порты управляются Z-80 DART, который по сути представляет собой Z-80 SIO/0 без возможности синхронной синхронизации. Полную информацию об использовании DART можно найти в Руководстве пользователя Z-80 SIO .
Последовательные порты подключаются к ЦП через DART через порты $20 и $22. Порт $21 — это регистр управления для порта $20, а порт $23 — регистр управления для порта $22.
Я не экспериментировал с последовательными портами и не писал для них какие-либо библиотечные процедуры, поэтому людям, желающим использовать последовательные порты, необходимо будет обратиться к Руководству пользователя SIO и написать код самостоятельно. Использование довольно простое: запись в порт $21, чтобы установить направление и скорость последовательного порта, затем чтение/запись данных из/в порт $20.
Часы реального времени/календарь
Часы реального времени OKI M6242B обеспечивают механизм запроса и обновления секунд, минут, часов, дня, месяца и года. Поскольку Tranz 330 имеет внутреннюю резервную батарею, дата и время сохраняются даже при отключении внешнего питания. M6242B имеет 16 регистров управления, которые сопоставлены с портами ввода-вывода ЦП $30–$3F. Полную информацию об использовании RTC можно найти в техническом описании M6242B .Внутренний модем
Однокристальный модем 73K212L-IP обеспечивает интерфейс со скоростью 1200 бит/с для связи по коммутируемым телефонным линиям.Я не экспериментировал с модемом и не писал для него никаких библиотечных процедур. Изучив исходную программу Tranz 330 ROM, я пришел к выводу, что модем подключен к процессору через один или несколько портов ввода-вывода $40, $50, $60 и $70. Полную информацию по использованию модема можно найти в даташите 73K212L.
Обратная связь
Если эта техническая информация окажется для вас полезной и вы сделаете крутой проект на базе Транз 330, оставьте, пожалуйста, запись в комментариях!Ошибки
Следующую информацию предоставил Джон Бартол.Адреса портов в вашей документации верны, но порт SIOA сопоставлен с некоторыми контактами микросхемы модема (а не с 8-контактным DIN). Я обнаружил, что 8-контактный разъем DIN сопоставлен с SIOB. Порт контактной площадки (6-контактный DIN) сопоставлен с SYNCB на SIO и одним из контактов на PIO. Тактовая частота системы составляет 7159090, поэтому тактовая частота триггера CTC составляет 1/4 от нее или 1789772,5. Скорость передачи данных можно рассчитать по формуле BAUD = 1789772,5 / (CTC_TIME_CONSTANT * DART_SCALE_FACTOR). В итоге я использовал постоянную времени 186 и масштабный коэффициент 1, чтобы получить скорость 9600 бод. Фактическая скорость составляет 9622, но кажется достаточно близкой.
Кредитная карта Моцарта

Не так давно я купил старый торговый терминал в магазине электроники. Обнаружив внутри классный маленький компьютер на базе Z-80 и проведя реверс-инжиниринг оборудования, я решил перепрограммировать его, чтобы разблокировать музыку, спрятанную внутри карт с магнитной полосой. Я называю это чудо «Кредитная карта Моцарта».
Аппаратное обеспечение представляет собой POS-терминал Tranz 330 от VeriFone, выпущенный в 1980-х годах. Модель 330 и ее родственники отлично подходят для любителей электроники. Это автономные 8-битные компьютеры с множеством интересных интерфейсов ввода-вывода и вакуумно-флуоресцентными дисплеями в стиле ретро. Они используют тот же микропроцессор, что и TRS-80 и ZX Spectrum, поэтому удобные программные процедуры этих компьютеров можно использовать повторно. Терминалы обычно можно приобрести в магазинах излишков или на eBay по цене около 10 долларов.
Документация по модели 330 легко доступна в Интернете, но она касается только использования функций POS и содержит очень мало информации об аппаратном обеспечении. Z-80, его вспомогательные микросхемы и другие компоненты, такие как драйвер дисплея и часы реального времени, хорошо документированы, но для их использования пришлось провести реверс-инжиниринг аппаратной конструкции терминала. Мне нужно было знать, как интерфейсы ввода-вывода отображаются в адресном пространстве, какие микросхемы к каким контактам порта подключены и какие существуют требования к синхронизации и протоколу связи. Благодаря сочетанию отслеживания следов сигнала путем «подачи звуковых сигналов» на плату и изучения дизассемблирования программного обеспечения POS в ПЗУ терминала, я смог узнать то, что мне было нужно. Вскоре я опубликую еще больше технических данных о Tranz 330 в отдельном посте, чтобы любой, у кого есть одна из этих маленьких чудо-коробочек, мог перепрограммировать ее для новых творческих целей.
После должного размышления (и пары кружек пива) я решил сделать демо-версию, которая считывает данные с карт с магнитной полосой и использует их для воспроизведения музыки. Какую песню играет ваша Visa? А как насчет твоих водительских прав? Ох, у этой читательской карточки хороший ритм. Посмотрите видео, чтобы увидеть кредитную карту Моцарта в действии:
Кредитная карта Моцарта — это специальная программа, написанная на языке ассемблера Z-80. Я записал программу на флэш-ПЗУ и заменил новое ПЗУ на исходное ПЗУ терминала. К счастью, ПЗУ 330-го находится в разъеме, что упрощает замену. При считывании карты устройство считывания карт возвращает данные ISO 7813 Track 2, которые содержат до 40 символов BCD, с 4 битами данных и 1 битом четности на символ. Необработанные данные используют кодировку F2F, в которой все битовые интервалы имеют одинаковую длительность, но логическая 1 имеет переход от низкого к высокому или от высокого к низкому в течение битового интервала, а логический 0 имеет одинаковую полярность во время битового интервала. целый битовый интервал. Этот сигнал F2F необходимо преобразовать в двоичные данные с помощью программного обеспечения.
После считывания данных карты используется система, основанная на правилах, для превращения их в полуприемлемую музыку. Преобразование цифр карты непосредственно в ноты генерирует только случайный звуковой сигнал, поэтому была использована более сложная система, основанная на идеях генератора стохастических мелодий Melisma . Музыкальный движок Mozart генерирует случайные мелодии с заданной тональностью, ладом, длиной, темпом, диапазоном размеров интервалов и другими параметрами из теории музыки. Параметры используются для построения набора таблиц вероятностей, которые затем умножаются для построения итоговой таблицы, используемой для случайного выбора следующей ноты.
Выбор основного или второстепенного режима определяется годом истечения срока действия карты. Если срок действия карты скоро истечет, она будет играть минорную мелодию – жутковато! Тональность – фа, си-бемоль, что угодно – определяется месяцем истечения срока действия. В году двенадцать месяцев, а в октаве двенадцать полутонов, так что это подошло идеально. Количество байтов данных на карте определяет, сколько тактов воспроизводится музыки. Кредитная карта будет воспроизводить более длинную мелодию, чем карта продуктового клуба. Темп, ритм, размеры интервалов и фактические ноты поступают от генератора случайных чисел, начальным значением которого является номер счета карты.
Пишите свои идеи по улучшению Моцарта в комментариях. Спасибо!
Транз 330 Компьютер Прогресс

Я наконец добился заметного прогресса в превращении этого торгового терминала Tranz 330 в компьютер Z-80 общего назначения. Он печатает мое имя на дисплее! Я могу упасть в обморок от волнения.
Хорошо, пока особо не на что смотреть, но чтобы добраться до этого места, потребовался значительный объем работы по реверс-инжинирингу аппаратного обеспечения Tranz 330. Прослеживая пути цепей на материнской плате и исследуя программу торговой точки в ПЗУ терминала, я медленно составил карту того, где периферийные устройства находятся в пространстве ввода-вывода и как с ними взаимодействовать. Затем, покопавшись в таблицах данных для процессора Z80, PIO, CTC и чипа контроллера дисплея VFD (к счастью, все они хорошо документированы), я был готов написать новую программу. Я на скорую руку составил крошечную программу «Привет, мир» с помощью ассемблера Z-80, записал ее в свою EEPROM, заменил оригинальное ПЗУ терминала и вуаля! Вот мое имя в прекрасном вакуумно-флуоресцентном великолепии цвета морской волны.
Я предоставлю больше технических подробностей в более крупной статье «Как сделать», как только у меня будет более полнофункциональный пример. А пока вот некоторые из мелких проблем, с которыми я столкнулся, помимо работы по изменению аппаратной конструкции:
Исходное ПЗУ терминала представляет собой 32K УФ-стираемый 27C256. Я уверен, что не буду ждать, пока произойдет УФ-стирание моего ПЗУ каждый раз, когда я хочу попробовать модифицировать программу, поэтому в качестве замены я получил более современную EEPROM 28C256. Проблема в том (и я сначала этого не заметил), что 28C256 не совсем совместим по выводам с 27C256. Два контакта поменяны местами. Там, где логическая плата Tranz подает +5 и A14, 28C256 ожидает A14 и /WE. Какого черта? Оказывается, вместо этого мне, вероятно, следовало приобрести 27SF512, который представляет собой деталь с разрешением 64 КБ, но совместим с дополнительными модулями, если вы поместите изображение 32 КБ в верхнюю половину.
Я почти мог исправить несоответствие контактов, согнув несколько контактов и добавив несколько перемычек, но модификация 28C256 не позволила бы мне перепрограммировать его позже. В конечном итоге я пожертвовал хорошим разъемом ZIF, отрезал контакт /WE, перемыкнул /WE на VCC и переместил данные своей программы в верхнюю половину ПЗУ, где A14 = 1.
Первоначальная цель ZIF заключалась в том, чтобы избежать необходимости подключать и повторно извлекать ПЗУ каждый раз, когда я хотел протестировать изменение в своей программе. ЗИФ я вставил в гнездо материнки, а ПЗУ в ЗИФ. К сожалению, ZIF довольно свободно прилегает к гнезду, а после того, как я его разрезал, еще сильнее, поэтому он не работает, если я не нажму на него большим пальцем во время работы. Ах, качество. Я не уверен, какое долгосрочное решение является лучшим.
И последняя головная боль: мой программатор EasyPro 90B EPROM, очевидно, не работает под 64-битной Windows 7. После недолгих поисков я пришел к выводу, что подходящего драйвера нет, и мне приходится загружаться в XP всякий раз, когда я хочу запрограммировать ПЗУ, а это очень муторно. Я знаю, что никого это не волнует, но я не могу удержаться от возможности пожаловаться! Если у вас есть рекомендации по достойному и не слишком дорогому программатору EPROM, работающему под Win 7, дайте мне знать.
Следующий шаг: несколько демонстраций с использованием клавиатуры и динамика. Может быть, игра в линкор?
Терминал для кредитных карт на базе Z-80

Недавно я нашел старый терминал для кредитных карт в магазине электроники и купил его, чтобы повозиться. 5 долларов в магазине Weird Stuff в Саннивейле! Этот Verifone Tranz 330 использовался для обработки транзакций по кредитным картам в 80-х и 90-х годах и, вероятно, в некоторых местах используется до сих пор. Однако меня не особо интересовал аспект кредитной карты, но я надеялся разобрать ее, узнать, как она работает, и посмотреть, смогу ли я сделать с ней что-нибудь интересное. Внутри находится простой, автономный 8-битный компьютер с большим хакерским потенциалом.
Tranz 330 имеет 16-клавишную клавиатуру, 16-символьный вакуумно-люминесцентный дисплей (каждый символ состоит из 16 буквенно-цифровых сегментов) и последовательный порт с 8-контактным разъемом DIN. Он также имеет внутренний модем, пару телефонных разъемов и специализированный 6-контактный последовательный порт DIN, предназначенный для использования с периферийными устройствами. Здесь много интересных интерфейсов для экспериментов.
Внутри находятся две сложенные друг на друга печатные платы. Логическая плата содержит процессор Z-80, работающий на частоте 4 МГц, с ПЗУ емкостью 32 КБ и SRAM 32 КБ. Плата дисплея содержит контроллер VFD и интерфейс клавиатуры, а также пьезодинамик.

Так что мне делать с этой штукой? Это полноценный компьютер на базе Z-80, способный на массу шалостей, ограниченный только ограниченной клавиатурой и дисплеем. Теоретически я мог бы сыграть Зорка на этом ящике. ПЗУ с сокетом позволит легко заменить программу терминала для кредитных карт на что-то свое.
Задача заключается в определении используемой памяти и сопоставления ввода-вывода. Как вы читаете клавиатуру? Как записать символ на дисплей? Как вы работаете с последовательным портом или управляете динамиком? Я мог бы сбросить содержимое ПЗУ и перепроектировать программу кредитных карт, чтобы найти ответы. Вероятно, это лучший способ, но это звучит как заноза в заднице. Я также мог подключить пробники и проверять шины с помощью логического анализатора во время работы терминала. Платы логики и дисплея соединены одним 20-контактным разъемом, поэтому анализировать особо нечего.

А пока давайте повнимательнее посмотрим на компоненты на платах, и посмотрим, что там. Сначала исследуя плату ЦП, в центре находится ЦП Z-80, PIO (параллельные порты, вероятно, используемые для клавиатуры и дисплея) и двойной UART (предположительно используемый для последовательных портов). В нижнем ряду слева направо расположены счетчик/таймер Z-80, 32 КБ SRAM, 32 КБ EPROM, микросхема часов реального времени, аккумулятор и однокристальный модем. Сверху есть несколько микросхем поменьше – мне ничего о них узнать не удалось, но по расположению я предполагаю, что они связаны с интерфейсом телефона.

На табло осмотрите фишки, движущиеся против часовой стрелки, начиная с самой большой фишки. Большой чип — это контроллер дисплея VFD, Micrel MIC10937. За ним следует чип двойного D-триггера, чип с четырьмя операционными усилителями и второй чип с четырьмя операционными усилителями другого типа. Я не уверен, для чего нужны восемь операционных усилителей – возможно, для питания ЧРП? Вождение динамика? Расшифровка нажатий клавиш клавиатуры?
Публикуйте свои лучшие идеи интересных лайфхаков в этой маленькой коробочке!