Введение
Примерно тридцать лет назад (когда мне было около двадцати) я, как и многие другие разработчики, мечтал создавать игры. Однако оставался один нерешённый вопрос: для какой платформы их писать? Разумеется, я мог бы делать игры на 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:
- Audio Sculpture Demo Disk by SYNC and Expose Software on Atari ST
- Audio Sculpture at Atari mania.
Но как извлечь данные из буфера 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. Вот результат:
Плата логики
Вторая плата этого комплекта состояла из следующих частей:
- Два чипа 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 годы. Надеюсь, в ближайшем будущем я смогу написать о нём пост.
Сегодня я работаю консультантом и преподавателем на фрилансе.