SpeccyBoot Печать
Добавил(а) microsin   

Проект SpeccyBoot [1] (автор Patrik Persson) позволяет загружать компьютер ZX Spectrum через сеть Ethernet. Сетевая загрузка использовалась для бездисковой загрузки рабочей станции несколько лет назад, но все еще используется для загрузки плат разработчика встраиваемых систем.

[Как работает сетевая загрузка]

Обычно процесс загрузки через сеть работает следующим образом:

1. Машина (компьютер, плата разработчика с микроконтроллером) запускается и использует протокол DHCP или BOOTP для получения сетевого адреса (IP).
2. Машина загружает с сервера исполняемый файл по протоколу TFTP.

SpeccyBoot это устройство, которое делает то же самое с домашним компьютером ZX Spectrum. Устройство подключается к порту расширения ZX Spectrum, и через него получает соединение с Вашей локальной сетью Ethernet. SpeccyBoot использует широко распространенные протоколы, основанные на протоколе IP, так что процедура загрузки работает со стандартным программным обеспечением.

SpeccyBoot concept

Это дает нам возможность виртуально загрузить в Spectrum любую программу за несколько секунд вместо утомительной и подверженной ошибкам загрузки с аудиокассеты. Программы упакованы как снапшоты памяти *.z80, которые можно создать из любого современного эмулятора Spectrum, или они могут быть получены из архивов сайта World of Spectrum [2].

Процедура загрузки через SpeccyBoot. Когда Вы включаете питание ZX Spectrum, оборудованного платой SpeccyBoot, то происходит следующее:

1. Если при этом была нажата кнопка Caps Shift, то машина загрузится в BASIC, и не будут произведены шаги конфигурирования, описанные далее.
2. Через DHCP будет получен сетевой адрес IP.
3. По протоколу TFTP с сервера загрузится файл snapshots.lst.
4. Содержимое файла snapshots.lst отобразится как меню. Когда был выбран нужный снапшот, он загружается по TFTP и затем запускается.

Имеются функциональные ограничения (хотя это и не критично):

1. Нет поддержки ручного (статического) назначения IP-адреса, возможно только динамическое назначение IP (через DHCP).
2. Сервер TFTP ищется широковещанием на начальном запросе чтения. Таким образом, в сети должен быть только один сервер TFTP.
3. Не поддерживается больше одного устройства SpeccyBoot в одной локальной сети, потому что MAC-адрес фиксирован.

Демонстрационное видео:

Как устроен SpeccyBoot. На рисунке ниже показана логика внутреннего устройства SpeccyBoot. Устройство подключается к стандартному коннектору расширения Spectrum (expansion bus), и для подключения к локальной сети использует Ethernet контроллер ENC28J60 [3] компании MicroChip. Контроллер через развязывающий трансформатор физически соединен с сетью Ethernet. Этот контроллер обменивается с компьютером ZX Spectrum по протоколу SPI, используя очень простой хост SPI. И наконец, в устройстве также есть память EEPROM на 8 килобайт (28C64 или аналогичная), предназначенная для поддержки стека используемых протоколов.

SpeccyBoot concept hw

Программно/аппаратный интерфейс. Железо SpeccyBoot управляется записями и чтением через один 8-битный управляющий регистр, размещенный по адресу 0x9F в адресном пространстве ввода/вывода Z80. Данные записываются в SpeccyBoot и читаются обратно через один и тот же адрес. Отдельные биты данных используются для следующих целей:

Бит Значение для записи Значение для чтения
0 SPI SCK: тактовый сигнал интерфейса SPI (строб данных). SPI MISO: данные SPI от ENC28J60.
1,2,4 Не используется: стек SpeccyBoot записывает 0 в эти биты. Не используется (биты игнорируются).
3 ETH CS: сигнал выборки чипа для ENC28J60 (активный уровень лог. 0).
5 EEPROM CS: сигнал выборки для EEPROM. Когда этот сигнал устанавливается в активное состояние (лог. 0), сигнал ROMCS (для Spectrum это внутреннее ROM) автоматически переходит в неактивное состояние (лог. 1).
6 ETH RESET: сигнал сброса для контроллера Ethernet ENC28J60 (активный уровень лог. 0).
7 SPI MOSI: данные SPI для ENC28J60.

Программное обеспечение (находящееся в ПЗУ EEPROM 28C64 устройства) использует следующие стандартные сетевые протоколы IETF:

Стандарт Для чего используется Время появления
RFC 768 UDP (User Datagram Protocol) Август 1980
RFC 791 IP (Internet Protocol) Сентябрь 1981
RFC 826 ARP (Address Resolution Protocol) Ноябрь 1982
RFC 906 Bootstrap Loading using TFTP (загрузка через сеть по протоколу TFTP) Июнь 1984
RFC 1350 TFTP (Trivial File Transfer Protocol) Июль 1992
RFC 2131 DHCP (Dynamic Host Configuration Protocol) Март 1997
RFC 3164 Протокол BSD Syslog Август 2001

Хотя эти протоколы такие же старые, как и Spectrum (и в некоторых случаях даже старше), они относятся к семейству IP-протоколово, поддерживаемых всеми персональными компьютерами начиная с середины 1990 годов.

Также в программном обеспечении SpeccyBoot присутствует SPI на основе программного управления ножками порта (bit-banged, который может предоставить скорость передачи порядка 45 килобит/сек), возможность выбора в меню, и поддержка загрузки и запуска снапшотов Z80 [4].

Исходный код SpeccyBoot доступен для загрузки на сайте github.com [5].

[Совместимость с разными версиями ZX Spectrum]

Автор SpeccyBoot использовал его вместе с ZX Spectrum 128. SpeccyBoot должен точно так же нормально работать и 48-килобайтной версией ZX Spectrum, и даже наверное с 16-килобайтной. Тестирование на эмуляторе Fuse (Free Unix Spectrum Emulator [6]) подтверждает это.

Поздние машины Amstrad Spectrum (+2A/+2B/+3) имеют другую цоколевку коннектора расширения (expansion connector), и не будут напрямую работать со SpeccyBoot так, как здесь описано. Конечно, можно слегка изменить плату SpeccyBoot, чтобы можно было подключить её к одной из этих машин, однако у автора SpeccyBoot не было такой возможности.

[Как самостоятельно собрать SpeccyBoot]

Для сборки SpeccyBoot нужно выполнить 3 основные шага: сделать плату и спаять схему, собрать программное обеспечение [5], прошить программное обеспечение в ПЗУ EEPROM SpeccyBoot.

SpeccyBoot schematic

Автор собрал схему на обычной плате для лабораторного макетирования. Для этого не нужно особо продвинутых навыков. Вот несколько замечаний по дизайну аппаратуры SpeccyBoot:

1. Для сетевого интерфейса Ethernet была использована плата разработчика ENC28J60-H компании Olomex [7]. Это значительно упрощает сборку конструкции. Можно использовать и другие аналогичные платы, которые доступны для покупки на сайте aliexpress.com.

2. Перемычка JP1, когда она установлена, запрещает EEPROM 28C64 (это полезно, когда в ней содержится мусор, например когда 28C64 не прошита).

В таблице приведена приблизительная стоимость компонентов (исключая плату, коннекторы и другую мелочь):

Компонент Цена (EUR)
Плата ENC28J60-H от Olimex [7] 15
28C64 EEPROM 2
Другое (элементы ИЛИ 74HCT32N, дешифратор 74HCT139N, буфер 74HCT244N, 8-битный регистр/защелка 74HCT273N, регуляторы 5V и 3.3V 2
Всего 20

Если Вы захотите вместо готового модуля Ethernet самому собрать его на микросхеме ENC28J60 (ИМХО это довольно бессмысленно при наличии дешевых аналогов модулей на сайте Aliexpress), то придется в таблицу добавить несколько дополнительных внешних компонентов (таких как коннектор Ethernet, согласующий трансформатор, кварцевый резонатор и т. п.). Это может снизить общую стоимость компонентов до примерно 10 евро (но только не в сравнении с китайскими дешевыми модулями ENC28J60). Подробную информацию по подключению микросхемы ENC28J60 и её цоколевке см. даташит [3].

Если у Вас есть Didaktik Gama (чехословацкий клон ZX Spectrum 48K), то плату ENC28J60 подключить даже проще. У этого клона ZX Spectrum есть несколько специальных особенностей, включающих параллельный порт 8255. Плату ENC28J60-H можно напрямую подключить к этому порту без необходимости добавлять какие-либо активные компоненты (за исключением источника питания 3.3V). При этом порт расширения (expansion connector) освобождается для других периферийных устройств.

Модифицированное программное обеспечение SpeccyBoot (см. ниже инструкции по сборке ПО) скомбинировано с оригинальным Didaktik Gama BASIC в ПЗУ двойной емкости EPROM (27C256, 32Kx8), которое заменяет оригинальный чип, установленный во внутренний сокет компьютера Didaktik Gama.

Проект DGBoot был любезно предоставлен Imrich Konkol. Дополнительную информацию, включая схему, можно найти в его блоге http://sindik.at/?p=929448 (к сожалению, на чешском языке, но можно для перевода использовать Google Translate).

Сборка программного обеспечения SpeccyBoot. Выполните в консоли следующие команды:

sudo apt-get install git make gcc sdcc
git clone https://github.com/patrikpersson/speccyboot.git
cd speccyboot
make

Это работает на любом современном дистрибутиве Debian Linux или Ubuntu Linux. Некоторые релизы sdcc имеют проблемы с компиляцией определенных макросов в исходном коде SpeccyBoot. Автор использовал для компиляции sdcc 3.4.0.

После того, как сборка завершится, в рабочем каталоге получится файл speccyboot.wav. Этот WAV-файл включает программу SpeccyBoot и приложение загрузчика, оба в формате, который принимает ZX Spectrum. Автор загружал WAV-файл с помощью телефона, запустив его в проигрывателе.

Если Вы хотите собрать ПО для DGBoot, используйте следующую команду make:

make clean && make DGBOOT=1

Получится двоичный образ, который должен быть записан в новое EEPROM (на 32 килобайта) следующим образом:

Диапазон адресов Содержимое
0..8191 ПО SpeccyBoot, собранное с DGBOOT=1
8192..16383 Заполнено байтами 0xFF
16384..32767 Didaktik Gama '89 ROM

Прошивка (установка ПО) устройства.

1. Запустите BASIC. Если у Вас уже установлена предыдущая версия SpeccyBoot, то удерживайте для этого клавишу CAPS SHIFT, когда сбрасываете или включаете питание ZX Spectrum. Иначе замкните JP1, чтобы запретить EEPROM, и включите питание ZX Spectrum.

2. Обычным образом загрузите в ZX Spectrum файл speccyboot.wav - так же, как загружаете любую программу с магнитофонной кассеты. После нескольких минут загрузки появится следующий экран:

SpeccyBoot fw loader 1

3. Снимите перемычку JP1, чтобы разрешить EEPROM (если это еще не было сделано).

4. Нажмите кнопку 1, 2 или 3 (в зависимости от модели EEPROM, которую Вы используете). Новое программное обеспечение будет записано в EEPROM. Если Вы хотите использовать защиту от записи, управляемую программным обеспечением, то этот шаг займет около 6 секунд, иначе завершится примерно за 1 секунду.

5. После успешного завершения процесса записи отобразится следующий экран:

SpeccyBoot fw loader 2

Если на этом шаге произошла ошибка, повторите все заново, начиная с шага 1, и убедитесь, что правильно устанавливаете перемычку JP1.

6. Перезагрузите Ваш Spectrum. Он должен запуститься теперь под управлением только что записанного ПО SpeccyBoot.

[Как использовать SpeccyBoot]

Конфигурация сервера TFTP. Вам потребуется установить и/или активировать сервер TFTP на компьютере в Вашей локальной сети. К счастью, ПО для сервера TFTP свободно доступно для большинства платформ. Ваш сервер TFTP должен уметь отвечать на широковещательные запросы, потому что их использует SpeccyBoot. Большинство серверов TFTP (но не все) поддерживают такую возможность, и у некоторых нужно явно разрешить эту опцию.

Большинство вариантов операционных систем UNIX либо по умолчанию имеют установленный сервер TFTP, либо позволяют очень просто его установить. Также есть серверы TFTP и для Microsoft Windows от сторонних производителей.

Под Ubuntu 12.04 автор рекомендует установить сервер NetKit tftpd:

sudo apt-get install xinetd tftpd

После этого, чтобы демон сервера tftpd автоматически запускался из xinetd, создайте файл /etc/xinetd.d/tftp следующего содержания:

service tftp
{
   protocol = udp
   port = 69
   socket_type = dgram
   wait = yes
   user = nobody
   server = /usr/sbin/in.tftpd
   server_args = var/lib/tftpboot -s
   disable = no
}

Примечание: сервер HPA TFTP server (пакет tftpd-hpa) почему-то не заработал со SpeccyBoot. Возможно, что в текущей версии SpeccyBoot вел себя каким-то несовместимым образом. В любом случае NetKit tftpd должен работать.

В операционной системе Mac OS X встроенный сервер TFTP можно разрешить следующим образом:

sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist

Подготовка директории для загрузки снапшотов. Ваши файлы снапшотов .z80 должны быть сохранены в определенном каталоге, чтобы SpeccyBoot и сервер TFTP могли их найти.

Создайте папку с именем speccyboot в основной директории сервера TFTP (NetKit tftpd, конфигурация которого была показана выше, использует для этого директорию /var/lib/tftpboot; Mac OS X 10.6 использует /private/tftpboot; некоторые другие серверы используют /tftpboot). Скопируйте снапшоты Z80 в эту папку speccyboot:

SNAPDIR=/var/lib/tftpboot/speccyboot   # < -- подстройте этот путь, чтобы
                                       # он соответствовал Вашему дистрибутиву
sudo mkdir -p $SNAPDIR
sudo chown < имя_пользователя > $SNAPDIR<
cp < путь_до_снапшотов >/*.z80 $SNAPDIR

Обновление индекса снапшотов. После того, как Вы создали директорию для снапшотов, как показано выше, и после того, как Вы добавили туда снапшоты и/или удалили некоторые из них, нужно обновить индекс SpeccyBoot. Это список (рассортированный по именам файлов без учета регистра), находящийся в текстовом файле с именем snapshots.lst. Протокол TFTP не имеет команды "list directory", поэтому этот файл нужен для того, чтобы SpeccyBoot мог получить список снапшотов с сервера TFTP.

На машине UNIX для обновления индекса можно использовать скрипт speccyboot-update. Он находится в директории utils пакета исходного кода SpeccyBoot [5], и устанавливается в каталог /usr/local/bin путем запуска make install из директории speccyboot/utils дерева каталогов исходного кода SpeccyBoot.

После того, как speccyboot-update установлен, Вы можете обновлять индекс снапшотов в любой момент (например, когда добавили новый снапшот) простым запуском команды:

speccyboot-update

Загрузка снапшотов. Если конфигурация TFTP сервера, как это описано выше, выполнена, то Вы можете попробовать, как работает SpeccyBoot. Подключите его в коннектор расширения ZX Spectrum и Ethernet к модулю ENC28J60, и включите питание. На экране ZX Spectrum Вы должны увидеть IP-адрес SpeccyBoot и сервера TFTP, и получить Ваш список снапшотов. Используйте кнопки со стрелками для навигации по списку снапшотов, и алфавитно-цифровые клавиши для прямого перемещения по списку к тому имени, которое начинается с буквы/цифры нажатой клавиши. Используйте клавишу Enter для загрузки выбранного снапшота.

Чтобы загрузить BASIC вместо меню SpeccyBoot удерживайте клавишу Caps Shift в момент сброса/включения питания ZX Spectrum.

[Устранение проблем]

Если SpeccyBoot испытывает проблемы, то цвет бордюра экрана покажет, что не так:

Цвет бордюра Ошибка
Красный Нет ответа от сервера (несмотря на несколько попыток связаться с ним)
Желтый Файл не найден на сервере
Циан Выбранный снапшот не совместим с этой аппаратурой

Этот шаг не обязателен. Функция syslog никак не влияет на ретро-игры с ZX Spectrum. Если Вы не знаете, что такое syslog, то Вам это и не надо. А если знаете, то эта возможность поможет в отладке SpeccyBoot.

SpeccyBoot использует (в либеральной интерпретации) протокол BSD syslog, чтобы отображать информацию о своем состоянии. Эти сообщения можно просмотреть с использованием подходящим образом сконфигурированной машины в Вашей локальной сети. Вывод syslog главным образом полезен в поиске проблем и отладке.

Просто как и TFTP, протокол syslog виртуально поддерживается всеми UNIX и UNIX-подобными операционными системами. Большинство UNIX-демонов syslog могут принимать вывод syslog output от других машин в сети. Однако большинство демонов syslog также запрещают такое поведение по умолчанию, так что Вам скорее всего придется явно разрешить просмотр сообщений от SpeccyBoot.

На Ubuntu 12.04 отредактируйте файл /etc/rsyslog.conf и убедитесь, что в нем не закомментированы 2 следующие строки:

$ModLoad imtcp
$InputTCPServerRun 514

На Mac OS X отредактируйте файл /System/Library/LaunchDaemons/com.apple.syslogd.plist (в нем Вы найдете много подробностей по конфигурированию).

Вот так в просмотрщике лога Ubuntu выглядят сообщения, которые SpeccyBoot выводит в syslog:

SpeccyBoot syslog

Другой способ увидеть вывод в syslog - использовать Wireshark. Он корректно интерпретирует сообщения syslog, и отображает их вместе с остальной частью обмена данными по сети.

Последние версии Fuse (Free Unix Spectrum Emulator [6]) включают поддержку эмуляции SpeccyBoot. Это позволяет попробовать, как работает SpeccyBoot в эмулируемом окружении - без необходимости наличия аппаратуры как самого ZX Spectrum, так и SpeccyBoot.

В настоящий момент Вам может понадобиться собрать Fuse из исходного кода, чтобы гарантировать добавление в нем эмуляции SpeccyBoot.

Эмуляция основана на сети Ethernet TAP. Имейте в виду, что эта эмуляция в настоящий момент работает только на Linux (автор проверил работоспособность совместно с Ubuntu 12.04). Другие варианты UNIX возможно будут поддерживать Ethernet TAP в будущем.

Конфигурация сети для TAP. В следующем примере показано создание отдельной сети для эмулируемого ZX Spectrum. Ваша машина Linux получит другой (виртуальный) сетевой интерфейс, и этот интерфейс подключается к эмулируемому ZX Spectrum. Тогда машина Linux должна будет взять на себя роль предоставления сервисов DHCP и TFTP для машины Spectrum.

Сначала Вам нужно создать интерфейс TAP и сконфигурировать Вашу сеть так, чтобы этот TAP-интерфейс можно было подключить к серверам DHCP и TFTP. Сначала убедитесь, что установлена утилита tapctl:

sudo apt-get install uml-utilities

Затем установите новый (TAP) сетевой интерфейс путем добавления следующей секции в файл /etc/network/interfaces:

auto fuse_tap
iface fuse_tap inet static
  address 192.168.100.1
  netmask 255.255.255.0
  pre-up tunctl -g adm -t fuse_tap
  post-down tunctl -d fuse_tap

Обратите внимание, что эта конфигурация подразумевает, что Ваш новый интерфейс fuse_tap использует подсеть 192.168.100.*. Если это невозможно (например, Вы уже используете эту подсеть для других целей), то нужно будет изменить эту конфигурацию (выбрать другую подсеть), и также конфигурацию DHCP, показанную ниже.

Конфигурирование серверов DHCP и TFTP для локальной сети TAP. Ваша машина Linux должна предоставить DHCP и TFTP для эмулируемого ZX Spectrum. Автор использовал NetKit tftpd (запускаемый через xinetd) и сервер ISC DHCP; как уже упоминалось, другие программные продукты возможно заработают, или возможно нет.

Сначала установите необходимые пакеты:

sudo apt-get install tftpd xinetd isc-dhcp-server

Измените конфигурацию сервера DHCP, чтобы он обслуживал только Ваш интерфейс TAP (если конечно Вы не хотите, чтобы DHCP раздавал адреса для других машин в локальной сети - скорее всего это не требуется). Сделайте это модификацией настроек INTERFACES в файле /etc/default/isc-dhcp-server:

INTERFACES="fuse_tap"

Также модифицируйте etc/dhcp/dhcpd.conf, чтобы обслуживать предоставление IP-адресов в той же подсети, которая настроена для fuse_tap:

ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
authoritative;
log-facility local7;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.100.255;
option routers 192.168.100.1;
subnet 192.168.100.0 netmask 255.255.255.0 {
  range 192.168.100.100 192.168.100.200;
}

Затем добавьте TFTP к сервисам xinetd путем создания файла /etc/xinetd.d/tftp со следующем содержимым:

service tftp
{
   protocol = udp
   port = 69
   socket_type = dgram
   wait = yes
   user = nobody
   server = /usr/sbin/in.tftpd
   server_args = var/lib/tftpboot -s
   disable = no
}

И наконец, Вам нужно подготовить директорию для снапшотов в /var/lib/tftpboot/speccyboot, как это было показано в разделе настройки конфигурации сервера TFTP.

Настройки интерфейса TAP, как и конфигурации TFTP и DHCP, вступят в силу после перезагрузки Linux.

Запуск FUSE с эмуляцией SpeccyBoot. Последние версии Fuse имеют несколько опций меню и параметров командной строки для разрешения эмуляции SpeccyBoot (они бегло описаны на страничке man Fuse). Если кратко, то следующая командная строка запустит SpeccyBoot в Fuse с использованием TAP Ethernet-интерфейса fuse_tap для подключения к сети:

fuse --speccyboot --speccyboot-tap=fuse_tap

Это будет выглядеть примерно так:

SpeccyBoot fuse

[Ссылки]

1. SpeccyBoot site:patrikpersson.github.io.
2. World of Spectrum site:worldofspectrum.org.
3. ENC28J60 - Ethernet Controller site:microchip.com.
4. Z80 File Format site:worldofspectrum.org.
5. patrikpersson/speccyboot site:github.com.
6. Fuse - the Free Unix Spectrum Emulator site:fuse-emulator.sourceforge.net.
7. ENC28J60-H site:olimex.com.