Мое реальное знакомство с «недо» PC случилось (случайно) в начале 2000-х, когда я устроился в отдел процессинга пластиковых карточек одного банка. А конкретнее, в разработку софта для платежных терминалов, POS-ов. ПОС для приема платежей пластиковыми карточками — это обычно законченный девайс, мини- или микро- компьютер, с экраном, клавиатурой, с читалкой магнитной полосы с карты, часто с принтером, а сейчас еще и ридером для чиповых карт.
Я начал с OMNI-395. Построен на Zilog Z180, имеет до 1М non-volatile памяти для хранения данных (журналов операций, например), AT-модем на 2400 (даже с какой-то коррекцией), двенадцативольтовые порты RS232 для PIN-клавиатуры, принтера и просто порт общего назначения (мы его использовали для подключения к мультипортовому шлюзу в TCP/IP) (увы, не все порты имеют полный набор линий RS232, что вынуждает изобретать программные велосипеды), ну и LCD экран.
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/097/12f/9e5/09712f9e575626b67f5d0e29b3931920.jpg)
Архитектура, кстати, интересная. Для выполнения пользовательского кода применялась виртуальная машина (видимо, так обходились ограничения в адресации, страницы и прочее). Это позволяло использовать для данных много памяти, но вот размер и скорость кода была весьма скромная. Приходилось, например, не использовать родной sprintf, а писать свой, чтобы избежать переполнение локального стека и т.д. Расчет табличного CRC по 5-10КБ данных работал видимые секунды.
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/46c/ae0/a5f/46cae0a5f845a34a418c703a2c16f287.jpg)
Хотя, положа руку на сердце, по сравнению с терминалами других фирм в то время (Injenico, Nurit и т.д.), где часто надо было заниматься ерундой типа ручного переключения страниц памяти и там хранить журналы, среда VeriFone (TXO) давала почти стандартную библиотеку C, где с портами и файлами можно было работать через read/write/ioctl и т.д. А то, что шаловливые умы разработчиков обычно хотят запихнуть в несчастный девайс слона — и вызывало проблемы. Когда со временем ограничения были более менее освоены, разработка стала почти беспроблемной.
Компилятор С поддерживал почти всю стандартную библиотеку и раздельную компиляцию модулей. Загрузочные же модули (R-модули), можно было динамически запускать прямо из пользователького кода (типа механизма оверлеев или CHAIN в классических бейсиках).
И тут дед мороз принес списанный старенький OMNI-395, и радости моей не было предела. Откупоривать будем? Конечно!
Включаем, на всякий случай, и, о чудо, там еще загружена одна из моих прошивок.
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/a4f/c83/a6a/a4fc83a6a52e1e4043efd992722f2b28.jpg)
Итак, вид изнутри.
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/0b0/8c4/097/0b08c4097201017e6263220ba741a201.jpg)
Два платы — верхняя, под клавиатурой, и нижняя, с разъемам.
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/a52/e13/d47/a52e13d47e12b1c13a17e52947954c9f.jpg)
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/c94/930/5c4/c949305c47f8f8af0442574c0bc25fb6.jpg)
Раскопаю компилятор и загрузчик в сусеках, попробую написать что-нибудь.
Увы, описания деталей аппаратной части я не нашел, а официальная документация описывает только стандартную библиотеку и немного виртуальную машину, в коды которой компилируется пользовательский код.
Конечно, OMNI-395 можно спокойно использовать в качестве НЕДО-PC как он есть. Например, как контроллер чего-либо. Если нужны порты общего назначения, то подходит RS-232 (DTR/RTS — вывод, CTS/DSR — ввод).
А идеале можно диассемблировать прошивку (там всего 64КБ), и поняв архитектуру, уже писать чисто на Z80, и тогда работать будет гораздо быстрее.
Надо сказать, что, несмотря на смену аппаратной платформы и компилятора (не один раз), у VefiFone отличная приемственность интерфейса библиотек, что позволяет портировать прошивки на последующие модели с минимальным изменениями. После 395-го я еще поработал с OMNI-3350, 3750, VX510, VX610.
Кстати, по тэгу #cardpayments в Твиттере я выкладываю фотографии ПОСов, пинпадов и прочих устройств приема банковских карточек, которые встречаю по жизни, если кому интересно.
Я начал с OMNI-395. Построен на Zilog Z180, имеет до 1М non-volatile памяти для хранения данных (журналов операций, например), AT-модем на 2400 (даже с какой-то коррекцией), двенадцативольтовые порты RS232 для PIN-клавиатуры, принтера и просто порт общего назначения (мы его использовали для подключения к мультипортовому шлюзу в TCP/IP) (увы, не все порты имеют полный набор линий RS232, что вынуждает изобретать программные велосипеды), ну и LCD экран.
![](https://habrastorage.org/getpro/habr/post_images/097/12f/9e5/09712f9e575626b67f5d0e29b3931920.jpg)
Архитектура, кстати, интересная. Для выполнения пользовательского кода применялась виртуальная машина (видимо, так обходились ограничения в адресации, страницы и прочее). Это позволяло использовать для данных много памяти, но вот размер и скорость кода была весьма скромная. Приходилось, например, не использовать родной sprintf, а писать свой, чтобы избежать переполнение локального стека и т.д. Расчет табличного CRC по 5-10КБ данных работал видимые секунды.
![](https://habrastorage.org/getpro/habr/post_images/46c/ae0/a5f/46cae0a5f845a34a418c703a2c16f287.jpg)
Хотя, положа руку на сердце, по сравнению с терминалами других фирм в то время (Injenico, Nurit и т.д.), где часто надо было заниматься ерундой типа ручного переключения страниц памяти и там хранить журналы, среда VeriFone (TXO) давала почти стандартную библиотеку C, где с портами и файлами можно было работать через read/write/ioctl и т.д. А то, что шаловливые умы разработчиков обычно хотят запихнуть в несчастный девайс слона — и вызывало проблемы. Когда со временем ограничения были более менее освоены, разработка стала почти беспроблемной.
Компилятор С поддерживал почти всю стандартную библиотеку и раздельную компиляцию модулей. Загрузочные же модули (R-модули), можно было динамически запускать прямо из пользователького кода (типа механизма оверлеев или CHAIN в классических бейсиках).
И тут дед мороз принес списанный старенький OMNI-395, и радости моей не было предела. Откупоривать будем? Конечно!
Включаем, на всякий случай, и, о чудо, там еще загружена одна из моих прошивок.
![](https://habrastorage.org/getpro/habr/post_images/a4f/c83/a6a/a4fc83a6a52e1e4043efd992722f2b28.jpg)
Итак, вид изнутри.
![](https://habrastorage.org/getpro/habr/post_images/0b0/8c4/097/0b08c4097201017e6263220ba741a201.jpg)
Два платы — верхняя, под клавиатурой, и нижняя, с разъемам.
![](https://habrastorage.org/getpro/habr/post_images/a52/e13/d47/a52e13d47e12b1c13a17e52947954c9f.jpg)
![](https://habrastorage.org/getpro/habr/post_images/c94/930/5c4/c949305c47f8f8af0442574c0bc25fb6.jpg)
Раскопаю компилятор и загрузчик в сусеках, попробую написать что-нибудь.
Увы, описания деталей аппаратной части я не нашел, а официальная документация описывает только стандартную библиотеку и немного виртуальную машину, в коды которой компилируется пользовательский код.
Конечно, OMNI-395 можно спокойно использовать в качестве НЕДО-PC как он есть. Например, как контроллер чего-либо. Если нужны порты общего назначения, то подходит RS-232 (DTR/RTS — вывод, CTS/DSR — ввод).
А идеале можно диассемблировать прошивку (там всего 64КБ), и поняв архитектуру, уже писать чисто на Z80, и тогда работать будет гораздо быстрее.
P.S.
Надо сказать, что, несмотря на смену аппаратной платформы и компилятора (не один раз), у VefiFone отличная приемственность интерфейса библиотек, что позволяет портировать прошивки на последующие модели с минимальным изменениями. После 395-го я еще поработал с OMNI-3350, 3750, VX510, VX610.
Кстати, по тэгу #cardpayments в Твиттере я выкладываю фотографии ПОСов, пинпадов и прочих устройств приема банковских карточек, которые встречаю по жизни, если кому интересно.