[Перевод] Как я разработал самодельный девкит для Sega Mega Drive

Введение

Примерно тридцать лет назад (когда мне было около двадцати) я, как и многие другие разработчики, мечтал создавать игры. Однако оставался один нерешённый вопрос: для какой платформы их писать? Разумеется, я мог бы делать игры на Atari 1040 STE, который в то время у меня был, но мне хотелось достичь чего-то более крутого и сложного.

Позже я познакомился с Sega Mega Drive и меня сразу увлекла эта консоль, я играл в такие замечательные игры, как Sonic, Truxton, Revenge Of Shinobi и многие другие. Оборудование и графика консоли со встроенной программным параллаксным скроллингом были потрясающими.

У меня возникла безумная идея — я захотел разрабатывать игры для этой машины. Но ведь для этого наверняка для этого потребуется чудовищно дорогое оборудование, которое невозможно достать? У меня не было ни официального комплекта разработки, ни денег на его приобретение, ни документации, только сама Mega Drive.

Поэтому я подумал, а почему бы не собрать собственный девкит?

Но для начала нужно убедиться в реалистичности задачи

Неужели я сошёл с ума? Почему я решил, что смогу справиться с этим?

  • Sega Mega Drive работает на процессоре Motorola MC68000, с которым я был близко знаком на самом низком уровне чипа. Также у консоли был отдельный сопроцессор Z80 для звука и других задач, который был поверхностно мне известен.
  • Я хорошо знал язык ассемблера MC68000, потому что много лет программировал низкоуровневые ассемблерные демо на домашнем компьютере Atari ST. Я один из первых участников SYNC — шведской демо-группы Atari ST. Подробнее о SYNC можно прочитать здесь и здесь. В своё время мы творили на Atari ST довольно безумные вещи.

Мне нравилось экспериментировать с электроникой и я долгое время собирал небольшие компьютеры. На фотографии выше показана пара проектов того времени. Впрочем, я не помню, что они делают.

Как подойти к решению этой задачи?

Моя цель заключалась в проектировании и изготовлении комплекта, который без внесения модификаций в Sega Mega Drive позволил бы мне «симулировать» картридж при помощи статической ОЗУ. Комплект подключался бы к компьютеру Atari ST, на котором бы я писал программы. Общая структура комплекта:

Картриджи

Первая трудность заключалась в реверс-инжиниринге картриджа игры и в том, чтобы разобраться с расположением контактов в его разъёме. Печатная плата внутри картриджа выглядит вот так:

Проведя долгие исследования в различных справочниках по чипам, я наконец выяснил, что это обычный чип ROM. Благодаря этому знанию стало довольно легко разобраться с большинством контактов в разъёме картриджа.

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

Игровой разъём на консоли

Следующей трудностью стало то, что нужно было разораться со значением контактов на разъёме картриджа внутри Mega Drive. Внутри консоли разъём находится рядом с процессором 68K и выглядит вот так:

При помощи мультиметра мне удалось сопоставить большинство контактов с хорошо известной схемой контактов процессора.

Однако оставалось ещё один-два контакта, предназначение которых я не мог понять. И без настоящего логического анализатора мне бы довольно сложно было разобраться, что они делают. Так как мой бюджет был сильно ограничен, я решил изготовить анализатор самостоятельно. Насколько сложно это может быть? Поразмыслив, я понял, что мне достаточно только 8-битного чипа буфера FIFO на 2 КБ, который можно использовать для сэмплирования сигналов при запуске консоли после процесса сброса. Благодаря нему я мог изучить сигналы и расшифровать их связь с некоторыми другими хорошо известными контактами на шине процессора. Так как я хорошо разбирался в том, как работает шина MC68K, то был готов к этому испытанию.

По сути, мне нужно было следующее:

Но как мне раздобыть чип буфера FIFO? В то время я находился в Париже с другом, мы завершали создание аудиотрекера для Atari ST под названием Audio Sculpture, который затем продали французскому издателю.

Но вернёмся к приобретению чипа. Я каким-то образом узнал о ярмарке электроники в Париже, поэтому решил отправиться туда с целью попросить бесплатно опытный образец буфера FIFO. В результате мне удалось найти нужную компанию, и я получил бесплатный опытный образец чипа. Отлично!

Вот пара ссылок на опубликованные нами материалы об Audio Sculpture:

Но как извлечь данные из буфера FIFO? В моём Atari ST был разъём расширения, напрямую соединённый с шиной процессора внутри компьютера, поэтому добавив немного логики, я привязал буфер FIFO к этому разъёму. Я написал ПО для извлечения данных из буфера и отображения их на экране. При помощи этой методики мне наконец удалось разобраться с предназначением загадочных контактов.

И теперь у меня была полная схема разъёма для картриджей на консоли. Переходим к следующему испытанию!

Как передать мой код на Mega Drive

Разобравшись с оборудованием, мне нужно было понять, как записывать ПО на консоль.

Я решил, что стоит написать небольшую загрузочную прошивку, которая при запуске будет ждать дампа двоичных данных с Atari ST. Я подключу комплект к Atari при помощи самодельного протокола передачи, который будет передавать данные по 8-битному параллельному кабелю, похожему на параллельный кабель для принтеров, имевшийся в то время у большинства PC.

При запуске Mega Drive загружается с игрового картриджа, поэтому мне достаточно было просто добавить небольшую прошивку, которая в процессе запуска принимала бы дамп двоичных данных, а после получения дампа приступала к исполнению кода. Для хранения прошивки я использовал два 8-битных чипа EPROM.

Недавно мне удалось найти исходный код для прошивки и я опубликовал его в виде GitHub GIST (не уверен, что он окончательный) и в этом GIST.

Плата памяти

Моя конструкция состояла из двух плат: платы памяти, на которой находилась только статическая ОЗУ, и платы логики для всего остального.

Для хранения игры я изготовил плату памяти, состоявшую из десяти чипов статичной ОЗУ по 128 КБ (KM681000LP-8) общей ёмкостью 1280 КБ. В то время большинство игр на Mega Drive требовали 256–512 КБ ёмкости, а некоторым требовалось и больше.

Наряду с чипами памяти я добавил на плату памяти следующие буферы, чтобы не перегружать системную шину на Mega Drive:

  • Два 74HC245 — 8-битных двунаправленных передатчика для шины данных
  • Три HC541 – 8-битный драйвер для адресной шины

Позже я спроектировал для карты памяти качественные печатные платы и даже создал несколько разных версий платы. Вот некоторые из них:

При помощи эмулятора DOS DOSBox-X мне удалось извлечь файлы схем печатных плат из старого ПО для проектирования плат, работавшего в DOS. Вот результат:

Ссылка на PDF

Плата логики

Вторая плата этого комплекта состояла из следующих частей:

  • Два чипа EPROM, на которой хранилась прошивка для запуска
  • Промежуточная логика для соединения несовместимых компонентов (на схеме выше обозначена как Glue logic)
  • Соединение с платой памяти
  • Соединение с компьютером-хостом

Плата подвергалась множеству переделок, на фотографии в середине находится последний и работающий прототип:

Для быстроты прототипирования я выполнял монтаж плат скруткой:

Как видно из скриншотов ниже, я начал проектировать реальную печатную плату, но, к сожалению, так её и не собрал.

Промежуточная логика

Чтобы связать всю необходимую логику, я добавил небольшой чип PAL (Programmable Array Logic), содержавший промежуточную логику (glue logic), необходимую для объединения всей системы.

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

Схемы

Схема конструкции находится здесь. Однако поскольку в те времена систем контроля версий не существовало, я не уверен, окончательная ли это схема.

Получилось ли у меня?

Да, в конечном итоге мне удалось заставить всё это работать и я смог, например, писать простые приложения, загружать их напрямую Mega Drive и запускать их. Постепенно я накопил достаточно подробной информации, чтобы управлять спрайтами на экране и пользоваться джойстиком.

Для создания программ на Atari ST я использовал инструмент Turbo Assembler. Turbo Assembler был совершенно уникальной IDE языка ассемблера, потому что он предварительно генерировал двоичные данные прямо в процессе набора. Второе преимущество Turbo Assembler заключалось в том, что он позволял мне разрабатывать собственные драйверы/целевые платформы. Благодаря этому я мог отправлять готовый ассемблерный код непосредственно на свой аппаратный комплект. Потрясающе!

Писал ли я игры? К сожалению, нет. Начав учиться в университете, я больше не мог продолжать заниматься разработкой игр. Но это был очень интересный проект и я многому из него научился.

Готовый результат

Итак, как же выглядел готовый проект? Вот его фотографии:

Более мощная прошивка

В качестве хобби-проекта я занялся написанием более сложной прошивки с расширенными функциями отладки и опубликовал исходный код здесь.

В ней есть такие функции, как отладка, задание контрольных точек, скачивание двоичных данных и другие удобные инструменты. Понятия не имею, работает ли она.

Об авторе

Меня заинтересовали компьютеры с тех пор, как примерно в 1981 году мне достался первый Commodore VIC-20. После него я последовательно переходил на Commodore C64, Atari ST, Atari ATW (да, у меня действительно был в своё время Atari ATW с пятью транспьютерными чипами внутри) с операционной системой Helios, а сегодня на PC!

После этого проекта следующей большой работой стало создание Programmers Heaven; изначально это были два CD-ROM, которые я издавал, но постепенно превратилось в крупное сообщество разработчиков, активное с 1996 по 2008 годы. Надеюсь, в ближайшем будущем я смогу написать о нём пост.

Сегодня я работаю консультантом и преподавателем на фрилансе.

 

Источник

Читайте также