В рамках нашего конкурса футболок в этом году в Pixels Camp мы решили, что один из шагов потребует от охотника доступа к какому-то ретро-компьютеру на месте проведения мероприятия, ввода секретных кодов и получения инструкций для следующий шаг, в случае успеха.

Как некоторые из вас знают, я любитель 8-битных вещей. В юности у меня было несколько машин Spectrum и C64 (несколько машин есть и сегодня), и в этом возрасте я немного разбирался в ассемблерном коде BASIC, Z80 и 6510. Я помню дни, когда все, что у нас было, - это случайный журнал программирования в киоске и помощь наших близких друзей из IRL. Не было ни Интернета, ни PDF-файлов в Интернете, ничего. Доступ к информации был дорогим и ограниченным.

Однажды родители предложили мне Библию, Книгу полной разборки Spectrum ROM. Они и представить себе не могли, что делают большую ошибку и вносят большой вклад в формирование моего острого INTP профиля Майерса Бриггса.

Очевидно, я практически исчез с планеты Земля на несколько месяцев вперед. То же самое произошло с C64, а затем и с Amiga.

Перенесемся в сегодняшний день по причинам, с которыми я не могу ни объяснить, ни согласиться, команда Bright Pixel давно лишила меня права писать код. Они спорят о чепухе вроде технических долгов, рисков рефакторинга, отсутствия тестирования и других отговорок. Кажется, они скорее видят, что я управляю компанией и управляю ею, чем отдаю свои современные технические таланты на службу нашим проектам. Иди разберись.

Но они не могли помешать мне написать код игры для ZX Spectrum, не так ли?

Нет, не могли.

Вот история

Во-первых, нам нужен был рабочий ZX Spectrum. Мы удалили пыль с нескольких машин, которые лежали у меня дома и в нашем музее оборудования. Итого мы изначально собрали оригинальный ZX Spectrum 48K, Sinclair ZX Spectrum + и мощный ZX Spectrum 128K.

Когда мы включили их, чтобы посмотреть, работают ли они, мы обнаружили, что они вроде как нет. Один загружался, но имел неисправную клавиатуру, другой не загружался вообще, а другой загружался, но требовал некоторого странного разогрева ULA, прежде чем он заработал должным образом (общая проблема некоторых моделей, как мы обнаружили).

Спустя несколько сеансов мусорщика, после замены мембран клавиатуры, отрезания и исправления их сломанных соединительных лент и изучения их трюков, мы наконец-то получили полностью работающие 48K и 128K.

Далее, лучшее качество изображения.

Нам нужно было избавиться от радиочастотного сигнала и вместо этого использовать композитный видеосигнал. Взломать 48K было несложно, это хорошо известный мод, требующий только паяльника, кусачки и немного терпения. 128К было даже проще. Оказывается, что в его разъеме DIN есть доступный композитный вывод видео, все, что нам нужно было сделать, это припаять простой кабель DIN к RC и вуаля, четкое видео.

Загрузка программы

Теперь загрузим программу в компьютер. Это оказалось непростой задачей. Вы, дети, не помните, но тогда большинство программ и игр загружались на 8-битные компьютеры, такие как ZX Spectrum, с использованием аудиокассет и магнитофонов, как показано на картинке.

Загрузка игры на кассету сама по себе была проблемой.

Во-первых, кассета должна быть в хорошем состоянии (лента имеет тенденцию к размагничиванию и ухудшению со временем очень легко, нам часто приходилось копировать наши любимые игры на резервные кассеты, на всякий случай); во-вторых, магнитофону нужны были правильные настройки громкости и высоты звука, чтобы хорошо работать с компьютерным модемом, и, наконец, азимут головки магнитофона должен быть правильно откалиброван. Если какой-либо из этих факторов не сработает, мы получим печально известное ужасное сообщение R Tape loading error, 0: 1, и нам придется перезапустить процесс заново. Примечание: для загрузки с ленты типичной игры 48K требуется около 5–10 минут.

Однако сегодня мы больше не используем магнитофоны или кассеты. Вместо этого мы декодируем и проигрываем файлы TZX (общий формат файлов для хранения компьютерных лент ZX Spectrum и C64) или просто воспроизводим аудиофайл WAV с современного компьютера или звукового выхода мобильного телефона. непосредственно к входному разъему модема ZX Spectrum, что означает, что нам больше не нужно беспокоиться о качестве ленты или азимуте.

Однако нам нужно беспокоиться о других вещах. Один из них - это ленточные провода, которые должны быть монофоническими, а не общедоступными стереофоническими, которые у нас есть сегодня, а другой - по-прежнему громкость и высота звука. Короче говоря, большинство мобильных телефонов, которые мы пробовали, не работали. Либо громкость слишком низкая, либо монофонический кабель не работает с телефонной розеткой.

Мы попробовали Raspberry Pi для этой работы, но он тоже не сработал. Громкость была слишком низкой, и, что еще хуже, качество звука ШИМ BCM2835 было ужасным (у RPi нет ЦАП. Он использует ШИМ, подаваемый в фильтр нижних частот для создания аналогового звука), и ZX Spectrum это не понравилось.

Потратив некоторое время на то, чтобы возиться с различными настройками, наконец-то мы сделали одну правильную:

  • Raspberry Pi с звуковым адаптером USB для лучшего качества, с максимальной громкостью, с использованием инструмента playtape из tape2wav utilities для воспроизведения файлов TZX непосредственно на выходе звука.
  • Подключается к столу микшера предусилителя с помощью соответствующих стерео- и монокабелей.
    Подключается к ушному входному разъему ZX Spectrum.
  • Подключен к монитору 1084S-D1 (лучший аналоговый компьютерный монитор из когда-либо созданных, без рук) через композитный видеосигнал.

Кодирование программы

Мой первый подход к написанию программы ZX Spectrum заключался в использовании ZX80Asm и полномасштабном использовании машинного кода низкого уровня, но я быстро понял, что этот путь потребует от меня больше недели, чтобы быть в курсе последних событий и завершить работу.

Затем я нашел ZXBasic, компилятор Sinclair ZX Spectrum BASIC для современных систем, где вы можете использовать как улучшенный язык BASIC, так и встроенную сборку Z80, где это имеет смысл, сгенерировать скомпилированный и оптимизированный двоичный файл и упаковать его в готовый к использованию файл TZX. . Довольно круто. Вокруг него тоже активное сообщество.

Я также нашел Colorator, графический редактор, который позволяет импортировать файлы PNG, раскрашивать их, а затем экспортировать в ZX Spectrum файлы экрана SCR.

Isa попробовала и разработала 8-битную графику, общий логотип Pixels Camp и два экрана в стиле Lost.

Мне пришлось пересмотреть, как работает компоновка экрана ZX Spectrum, и написать небольшой инструмент для преобразования файлов SCR в буферы, которые я мог бы использовать для подачи быстрых подпрограмм сборки для рисования и раскрашивания экрана; это заняло у меня время, но было весело. Низкий уровень - это весело.

Теперь, когда у меня были все части на своих местах, собрать их и закодировать остальную логику было несложно.

Здесь, в репозитории Github, вы можете найти код, ресурсы и рабочий файл TZX, который вы можете передать в эмулятор или реальную машину.

Вы также можете узнать больше о нашем испытании на футболке Pixels Camp v3.0 здесь.

Надеюсь, вам понравилась эта статья. Делать это было ностальгически и весело; это напомнило мне старые добрые времена, когда программирование требовало понимания внутреннего устройства машины, вплоть до кремниевых микросхем, инструкций ЦП, регистров, прерываний и карт памяти. Мне этого не хватает.

Если у меня будет время, я могу принять вызов и перейти к игре на C64.