PDP-11 Blinkenlights

Posted by Unik on 25.03.2014

Захотел недавно улучшить свой эмулируемый PDP-11 добавив ему панель со светодиодами как на реальных машинах. Для этого можно использовать оригинальную консоль, но её сложно достать и стоит дороговато. Поэтому я пошел по другому пути и буду делать панель сам, за основу возьму схему и патчи для simh с блога The Ancient Bits adventure. Получится хоть и не полная копия т.к. там только 16 светодиодов под data + два под ошибки, но мне этого достаточно.

Вот ссылка на проект - https://github.com/jguillaumes/retroutils

Панель я буду подключать к Raspbery PI, но можно собрать и на Arduino и подключать практически к любому ПК. Возможно это, благодаря клиент-серверной реализации, где simh будет в роли клиента, а сервер может быть и програмный, например есть версия на java

Так как сборка simh с патчем немного запутанная, то опишу как собирал я.

Качаем свежие исходники и распаковываем:

$wget https://github.com/simh/simh/archive/master.zip

Прежде чем собирать simh нужно собрать библиотеку libblinken.a из каталога retroutils/BlinkenServer/BlinkenClient Эта библиотека должна попасть в: /usr/local/include и /usr/local/lib

Ставим патч(https://github.com/jguillaumes/retroutils/blob/master/simh-patches/pdp11-blinken.patch) на Simh 4.0, скопировав в каталог simh/PDP11 . Патч для simh лучше ставить руками т.к. он рассчитан на бета версию в которой постоянно идут изменения и у меня он уже не ставился.

$patch < pdp11-blinken.patch
$nano pdp11_sys.c

Добавляем новое устройство, т.е. несколько строк из патча(куда добавлять нужно смотреть в патче)

+extern DEVICE blnk_dev;
+    &blnk_dev,
$nano makefile

Находим в makefile который идёт с simh это:

${PDP11D}/pdp11_io_lib.c
PDP11_OPT = -DVM_PDP11 -I ${PDP11D} ${NETWORK_OPT}

и меняем на это:

${PDP11D}/pdp11_io_lib.c ${PDP11D}/pdp11_blinken.c
PDP11_OPT = -DVM_PDP11 -I ${PDP11D} ${NETWORK_OPT} -lblinken -I/usr/local/include -L/usr/local/lib

Затем нужно в каталог simh/PDP11 закинуть файлы из каталога BlinkenClient т.к. некоторые файлы нужны оттуда для сборки.

Ну и собираем:

$make USE_NETWORK=1 pdp11

Если будут эти ошибки, то это нормально, всё будет работать:

PDP11/pdp11_blinken.c:69:9: warning: initialization from incompatible pointer type [enabled by default]
PDP11/pdp11_blinken.c:69:9: warning: (near initialization for ‘blnk_mods[0].valid’) [enabled by default]
PDP11/pdp11_blinken.c:69:9: warning: initialization from incompatible pointer type [enabled by default]
PDP11/pdp11_blinken.c:69:9: warning: (near initialization for ‘blnk_mods[0].disp’) [enabled by default]

PDP11/pdp11_blinken.c:72:9: warning: initialization from incompatible pointer type [enabled by default]
PDP11/pdp11_blinken.c:72:9: warning: (near initialization for ‘blnk_mods[1].valid’) [enabled by default]

PDP11/pdp11_blinken.c:122:5: warning: initialization from incompatible pointer type [enabled by default]
PDP11/pdp11_blinken.c:122:5: warning: (near initialization for ‘blnk_dev.attach’) [enabled by default]

Так как детали для панели я еще только заказал, то решил пока использовать JBlinkenServer на java который скомпилировал в Netbeans IDE под Win7

Теперь запускаем JBlinkenServer на ПК и он начинает слушать порт 11696 и запускаем на Raspbery PI simh. Включаем индикацию:
sim> SET BLNK ENABLE
sim> ATTACH BLNK udp:ip-address:11696

Грузим RSX-11M+ и любуемся :) Я так же сравнивал полученую индикацию с реальными машинами на видео с ютуба, похоже что все работает правильно.