
Существует расхожее мнение, что Doom можно запустить на чем угодно. Легендарная игра отличается компактным, модульным и эффективным кодом, который поддается портированию практически на любые системы. Энтузиасты переносят шутер даже на платформы, появившиеся задолго до его релиза, порой задействуя аппаратные ускорители, как в случае с версией для SNES. Исходный код на языке C лаконичен и лишен громоздких современных надстроек, что делает его крайне неприхотливым при компиляции. Кроме того, проект отлично адаптирован под различные архитектуры, включая особенности порядка байтов, что критически важно для портируемости.
Тем более удивительно, что Doom до сих пор не обрел жизни на Neo Geo. Консоль базируется на процессоре Motorola 68000 — том же «двигателе», что стоит в Sega Genesis и Commodore Amiga, для которых, при всех их скромных ресурсах, портирование Doom состоялось. Однако для Neo Geo рабочего порта не существует. Многие разработчики, знакомые с архитектурой системы, утверждали, что перенос Doom сюда практически невозможен. Но в чем именно кроется проблема? Ведь консоль обладает всеми необходимыми компонентами: видеосистемой, центральным процессором и памятью. Давайте разбираться.

Технически Neo Geo оснащена процессором Motorola 68000 с тактовой частотой 12 МГц, имеет 64 КБ системной памяти, 84 КБ видеопамяти и 2 КБ аудиопамяти. Разрешение экрана составляет 320×224 при возможности отображения 3840 цветов одновременно из палитры в 65 536 оттенков. На первый взгляд, ограничения выглядят существенными, но, учитывая опыт запуска Doom на куда более слабом железе, этого явно недостаточно для окончательного «нет».
Основной барьер заключается в специализации Neo Geo на 2D-графике, основанной исключительно на спрайтах. Система генерирует изображение, собирая экран из вертикальных полос тайлов 16×16 пикселей. Существует лимит в 96 спрайтов на строку, а максимальный размер одного элемента ограничен 16×512 пикселями. Подобно Amiga, консоль не поддерживает прямой битовый доступ к видеопамяти — вы не можете просто отрисовать пиксели в буфер. Но если Doom работает на Amiga, то в чем разница? Секрет Amiga в использовании «chunky-to-planar» преобразования, которое адаптирует графику под архитектуру системы. Однако этот процесс крайне ресурсоемок и требует разгона процессора или использования более мощной 030-й модели. Neo Geo же лишена возможности аппаратного апгрейда — ее конфигурация жестко зафиксирована.
Сильная сторона Neo Geo — это чистый 2D-мир. Здесь отсутствуют аппаратные средства для рендеринга 3D-примитивов, линий или векторной графики. В свое время для Amiga выпускались симуляторы вроде Starglider 2, так как ее блиттер мог оперативно рисовать линии. На Neo Geo подобные эффекты (как в *The Super Spy* или *Viewpoint*) достигались за счет заранее отрендеренных спрайтовых массивов, записанных на картридж.
*The Super Spy* создает иллюзию вида от первого лица благодаря продвинутой функции масштабирования спрайтов. Это «фирменная» черта Neo Geo, позволяющая динамически изменять размер спрайтов с высокой точностью, что часто использовалось в файтингах для придания глубины кадрам.
Тем не менее, даже эти ограничения можно было бы попытаться обойти. Истинная проблема, на мой взгляд, кроется в отсутствии у CPU доступа к графическим данным картриджа. C-ROM со спрайтами подключен напрямую к видеоконтроллеру LSPC и недоступен для центрального процессора. Процессор не может «видеть» пиксели или текстуры — он лишь передает видеочипу команды-ссылки: какие тайлы, где и с каким коэффициентом масштабирования отрисовать. Видеосистема сама берет данные из памяти, не позволяя CPU влиять на процесс на уровне отдельных точек.

Такая архитектура радикально отличается от систем с классическим фреймбуфером или той же Amiga. Реализовать программный рендерер невозможно: консоли негде хранить итоговое изображение, а процессору не дано считывать данные из источника.
Итак, если полноценный Doom недостижим, можно ли реализовать хотя бы простую технику рейкастинга, как в *Wolfenstein 3D*?

Поскольку Neo Geo умеет мастерски масштабировать спрайты, это можно использовать для отрисовки вертикальных полос стен. В моем прототипе рейкастера экран поделен на 80 столбцов-спрайтов. В каждом кадре их горизонтальное положение фиксировано, а меняется лишь вертикальный масштаб, создавая иллюзию движения и изменения глубины. Фактически, мы не рисуем графику, а просто управляем параметрами 80 спрайтов.

Алгоритм работает просто: система «выпускает» лучи по сетке 2D-карты, определяя расстояние до препятствий. Для каждого столбца вычисляется высота, цвет и параметры масштабирования. Эти данные записываются в массив, а затем передаются в Sprite Control Block. Мини-карту я добавил через фиксированный слой, предназначенный для элементов интерфейса, так как он всегда отображается поверх игрового поля.

Прототип выдает около 8 кадров в секунду, но это лишь вопрос оптимизации, а не архитектурный тупик. Тем не менее, полноценный *Doom* здесь реализовать почти невозможно. В отличие от *Wolfenstein*, уровни *Doom* содержат сложные перепады высот, лестницы и лифты. Потребовалось бы отрисовывать множество накладывающихся друг на друга спрайтов с попиксельной точностью, что за пределами возможностей консоли. К тому же, диагональные стены требуют сложной перспективной трансформации, которая аппаратным масштабатором Neo Geo не поддерживается.
Другая проблема — полы и потолки. В нашем рейкастере это лишь залитые цветом области. В *Doom* же текстурированные поверхности с динамическим освещением — это стандарт. Конечно, можно попробовать найти обходные пути, но без специализированного «железа» это будет лишь стилизация, а не полноценный порт.
Дополнение: настоящее безумие
Через неделю после выхода моего видео сообщество совершило прорыв. Пользователи не просто проверили мой код, но и значительно его оптимизировали.
Разработчик под ником Meson.ninja удвоил частоту кадров, проведя глубокую оптимизацию алгоритмов, что доказало: движок уровня *Wolfenstein 3D* вполне жизнеспособен на Neo Geo. Более того, проект *Doom Geo AES* от разработчика Sabino пошел дальше, используя данные оригинальных WAD-файлов игры для построения уровней внутри сетки Neo Geo.

Результаты выглядят впечатляюще: в игре уже есть арсенал (от пистолета до BFG), монстры и рабочая механика уровней. Разумеется, это все еще рейкастинг-стилизация, а не полноценный *Doom*, и самая большая проблема — статические полы и потолки, которые разрушают ощущение глубины. Однако факт остается фактом: сообщество энтузиастов вдохнуло жизнь в проект, доказав, что рамки возможного на Neo Geo куда шире, чем казалось изначально.



