С той поры, как открыли исходный код Doom, портирование игры для самых разных устройств с дисплеем стало классным развлечением для программистов. Цифровые фотоаппараты, Nintendo Switch, браузеры — игра коснулась практически любого устройства, на котором можно запустить код.
В мае прошлого года NCommander выпустил видео на YouTube, в котором рассказал об опасности переноса Doom для запуска на компьютере IBM серии RS/6000 начала 2000-х годов, который на момент запуска стоил не менее 10 000 долларов США и работал под управлением AIX, разновидности ОС UNIX.
Раньше я не задумывалась о том, чтобы самостоятельно портировать Doom, но мне было любопытно, есть ли порт на моем любимом заброшенном варианте UNIX. После беглого поиска в Google и GitHub я пришла к выводу, что это маловероятно. А если такую штуку и делали, то о ней никогда не говорили.
Беспокойства это не вызывает: сами понимаете, такой порт не относится к жизненно необходимым вещам. И я, вероятно, первый человек, когда-либо портировавший игру на эту платформу.
Что такое A/UX
До Mac OS X (теперь macOS) у Apple была другая операционная система, построенная на основе UNIX. A/UX — UNIX-система, созданная корпорацией Apple для компьютеров Macintosh с платформой m68k. Она объединяла простоту интерфейса Finder с мощью UNIX.
A/UX (от англ. Apple Unix — «UNIX на компьютерах Apple») — это UNIX, но он запускает системное программное обеспечение Macintosh как отдельный поток. Файловая система A/UX выглядела как иконка с дисководом в System 7 Finder. Был возможен одновременный запуск приложения Macintosh, приложения Unix (командная строка и X Window) и даже приложений DOS. Можно было создавать «гибридные» приложения, которые могли использовать как интерфейс системы Unix, так и Macintosh Toolbox.
Apple поддерживала операционную систему с 1988 по 1995 год, после чего от неё отказались, поскольку она была написана исключительно для моделей компьютеров Motorola серии 68000, а компания перешла на PowerPC.
Аппаратные требования для ОС были довольно высокими. Большинство компьютеров начального уровня (и все PowerBook) не могли её запустить. Она никогда не предназначалась для использования широкой публикой. Другие проекты, такие как MkLinux и Copland, тоже были заброшены, когда Apple купила Next, а последующая разработка Rhapsody привела к выпуску Mac OS X, положив конец использованию устаревшей операционной системы, к которой Apple ранее была привязана.
Интересно, что Mac OS X и A/UX имеют одну общую черту: возможность запускать классические приложения Mac поверх многопоточной операционной системы. В системе Macintosh не было настоящей многозадачности, и её считали откровенно слабой операционной системой, но эти две ОС были довольно эффективны.
Подготовка к порту Doom
У меня уже давно в шкафу лежит Quadra 800 с 64 Мб ОЗУ. Я пользовалась им несколько раз, но никогда не использовала весь его потенциал. A/UX был тем, что меня всегда интересовало, и я уже несколько лет храню SD-карту с установщиком для моей Quadra — в этом помогает мой SCSI2SD. Увидев Doom, портированный на AIX со всеми его проблемами, я подумала о том, чтобы сделать это самой. Уверенности в том, что я точно добьюсь успеха не было, но казалось, что это мне по силам. Я пишу в основном на Python, но C мне тоже знаком. Так что я решила, что справлюсь, и принялась за дело.
Последняя версия A/UX 3.1.1 была выпущена в 1995 году. Doom появился несколькими годами ранее и был разработан на NeXTSTEP. Следовательно, код должен легко переноситься, так как использовал оконную систему X11, которую тогда использовало большинство операционных систем UNIX.
Спойлер
Я ошиблась с последним абзацем. NeXTSTEP использовал Display PostScript, который совсем не похож на X11. Я упустила из виду этот факт, но оставляю вышеизложенное как есть.
A/UX имеет одну из реализаций окружения X11, но я хотела использовать все её возможности, задействовав: системный файловый менеджер Finder, с которой она поставляется. Между ними можно легко переключаться при входе в систему.
Для этого потребовалось использование MacX, реализации X11, от которой также отказалась Apple. Это программное обеспечение позволяет беспрепятственно использовать систему на любом Mac в Finder — и оно не ограничивается только системами с A/UX, но это совсем другая история.
Помимо базовой системы, мне понадобились и некоторые другие инструменты, а именно GNU GCC и его различные компоненты.
К счастью, кто-то из сотрудников НАСА почти десять лет после кончины A/UX поддерживал порты современного программного обеспечения — зеркало доступно здесь. Это означало, что у меня была возможность использовать версию 2.7.2 GCC плюс множество других необходимых инструментов для компиляции программного обеспечения. Кроме того, можно найти другое полезное ПО, включая OpenSSH, через другие зеркала, что упрощает передачу файлов.
Что касается самого Doom, то исходный код находится в свободном доступе уже несколько десятилетий. Всё, что вам нужно для запуска игры после компиляции, — это файл WAD, содержащий всё необходимое для запуска игры. Большинство выпусков Doom за последние десятилетия включали этот файл в той или иной форме, и у меня были под рукой как условно-бесплатные, так и обычные версии.
Я собрала все нужные инструменты и компоненты, далее предстояла тяжёлая работа.
Нельзя просто так взять и портировать Doom
Когда вы получаете исходный код, то можете просто перейти в директорию и ввести «make» в командной строке, чтобы он скомпилировался во что-то полезное. В случае с Doom на A/UX, всё почти тоже самое, вот только очень быстро у вас возникнут проблемы.
Во-первых, поддержка звука была реализована для Linux, то есть не очень-то подходила для UNIX и UNIX-подобных операционных систем, OSS также не вариант. Мне не хотелось разбираться с этим бардаком, поэтому я закомментировала весь код, касающийся звуков и музыки. Можно было просто переписать эти моменты, но я искала быстрое решение, не собираясь разбираться со всеми сложностями сразу.
Поскольку A/UX является древней ОС, там отсутствуют многие функции, которые появились за последние тридцать лет. К счастью, у нас есть alloca, который можно заменить на malloc (с некоторым дополнительным кодом) и strcmpi, который я только что закомментировала.
Удаление последнего имело небольшое последствие: имя файла WAD, содержащего все ресурсы игры, теперь должно быть в нижнем регистре, поскольку задача этой функции — выполнять сравнение строк без учёта регистра. Doom выполняет проверку на наличие файлов, соответствующих расширению wad при запуске, поэтому мой вариант разумен, хотя и неидеален.
Существует шутка об архитектуре Motorola 68000: мол, она является антиподом “x86” — 68000 сокращается как “68k”, и если вы перевернёте её, то получите “k86”. Забавно, ведь на самом деле инструкции в них довольно похожи, но в одной архитектуре используется прямой порядок байтов, а в другой обратный. Вы же помните, да? Big Endian: наиболее значимый байт находится в левом конце слова. Little Endian: наиболее значимый байт находится в правом конце слова.
Это создаёт проблему с файлами WAD, так как их порядок байтов предназначен для системы little endian, что, работает для x86, но не для 68000. Мне пришлось добавить флаги компилятора, чтобы использовать встроенные модули, которые решают эту проблему. К счастью, это было последним препятствием для того, чтобы игра загрузилась и вроде бы даже работала.
Одна маленькая деталь: я оставила сеть в коде нетронутой, но отключила её во время компиляции, так как это создавало проблемы. Тем не менее, я думаю, что было бы неплохо принять предложение NCommander и попытаться сделать что-то вроде смертельной схватки между двумя разными архаичными системами.
Работает, но медленно и с багами
После двух дней внесения изменений в код и его последующего тестирования на реальном оборудовании, одна из сборок оказалась рабочей. Я не ожидала, что последнее исправление поможет решить задачу и заставить игру работать, но это произошло, и впервые мы запустили Doom на A/UX в окне X11 в Finder.
Помимо отсутствия звука и необходимости просить MacX разрешить мне использовать клавиши со стрелками, игра работала со скоростью где-то 2–3 кадра в секунду. Ухудшение графики чуть улучшило ситуацию, но настройка общего размера экрана в игре не дала никаких изменений.
Клавиатурные сложности ограничивали меня во всём, кроме перемещения, смены оружия, выбора опций меню и открытия дверей — я не могла стрелять по врагам. Но мне удалось пройти от начала первого уровня в эпизоде 1 до выхода, то есть кое-как, но можно было играть в Doom в режиме пацифиста.
Я дошла до конца уровня без убийств и даже открыла один секрет! Кто-то спросил, настоящее ли это оборудование, поэтому я заставила свой OSSC отображать параметры дисплея.
Но проблема с частотой кадров осталась. У меня было предположение что, поскольку MacX запускает игру в Finder, который сам является процессом в A/UX, игра должна проходить через сетевой стек TCP для вывода в Finder, что означает дополнительную нагрузку на процессор. Процессор с частотой 33 МГц одновременно обрабатывает операционную систему, Finder, MacX, сеть и Doom, поэтому страдает качество изображения.
Для решения проблемы сначала я установила флаги компилятора для автоматической оптимизации кода, чтобы хоть немного улучшить ситуацию. Всё это обрабатывается самим GCC с помощью простого флага, и последствия этого должны быть («должны быть» — это ключевое слово) дополнительным использованием памяти и более длительным временем компиляции.
Пользы от этого было с гулькин нос, но рендеринг графики сильно пострадал, хотя частота кадров повысилась. По сути, я превратила слайд-шоу, которое в остальном выглядело нормальным, в слайд-шоу, напоминающее киберпанк видео из 80-х. Так что давайте пока не будем использовать эту опцию.
Я пыталась найти причину, почему использование флага приводит к такому результату, но безуспешно. Слишком много вариантов. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что X11 не хочет быть единственным активным сеансом в моей установке A/UX, и я не могу понять, почему. Моё единственное предположение заключается в том, что, возможно ему не нравится моя видеокарта Radius, но у меня не было времени диагностировать это. Если у вас есть решение, не стесняйтесь сообщить мне об этом.
Почему я первая (вероятно), кто создал такой порт
Я думаю, на то есть две причины.
Во-первых, A/UX — не очень распространённая ОС. У неё не было рынка за пределами правительства США и связанных с ним организаций. Даже с такими крупными клиентами пользовательская база была крошечной. Сегодня вы с большей вероятностью найдёте RS/6000 с AIX, чем Quadra 900 с A/UX.
Неизвестность также усугубляется тем, что оборудование, на котором ОС работает, не предназначалось для внутреннего рынка. Единственным более-менее известным Mac, который мог её запускать и который я могу вспомнить, был SE/30.
Кроме того, предварительная установка A/UX на Macintosh, стоила почти 10 000 долларов США в конце 1980-х годов или примерно в 25 000 долларов США в 2022 году. Это никогда не предназначалось для рядового пользователя!
Вторая причина наименее вероятна: Doom вроде как уже может работать на A/UX. Когда я говорю «вроде бы», я имею в виду реализацию Finder в A/UX , которая предоставляет среду System 7.0.1. Да, Doom требует System 7.1, но с помощью нескольких хаков и настроек вы можете запустить более позднюю версию системного ПО, хотя и с потерей некоторых компонентов.
Процессор моей Quadra, хотя и дряхленький, но не должен быть проблемой при запуске этой игры. Doom может показаться действительно простой игрой по современным стандартам, но она была ультрасовременной, когда вышла в 1990-х годах.
В целом, из-за неизвестности ОС и специфических требований к оборудованию, а также дефициту эмуляторов, способных запускать ОС (на момент написания этой статьи единственными вариантами являются Shoebill и QEMU), вполне вероятно, что это была первая попытка портировать игру на новую платформу.
Где можно покопаться в коде
Исходный код доступен на моем GitHub, там же доступен и скомпилированный бинарник . У меня нет намерения выпускать дальнейшие обновления, кроме, может быть, нескольких настроек, чтобы сделать его более играбельным. Если вы хотите внести изменения самостоятельно, не стесняйтесь форкать или слать мне пулл реквесты.
Обязательно прочитайте README перед компиляцией, так как есть несколько шагов, которые вам, возможно, придётся предпринять, чтобы запустить его.
Я понятия не имею, могут ли эмуляторы, способные запускать A/UX, запускать эту игру, и я ещё меньше знаю, можно ли запустить её на чем-то более раннем, чем версия операционной системы 3.1.1.
Но в целом это был интересный опыт. Спасибо за внимание!
Что ещё интересного есть в блоге Cloud4Y
→ Как открыть сейф с помощью ручки
→ Сделайте Linux похожим на Windows 95
→ Как распечатать цветной механический телевизор на 3D-принтере
→ WD-40: средство, которое может почти всё
→ Взлёт и падение игрового чипа 6502
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем только по делу. А ещё напоминаем про второй сезон нашего сериала ITить-колотить. Его можно посмотреть на YouTube и ВКонтакте.
Свежая серия
Комментарии (3)
pda0
18.07.2022 13:25+3Комментарить всё, что ломает сборку, это теперь называется «портировать». Ну такое…
Lsh
19.07.2022 03:01Побольше бы про саму ОС. Интересно, как там сосуществовали программы для разных систем. Для программ Mac OS запускалась виртуальная машина? Как была организована работа с файловой системой? Вроде бы в Mac OS до версии X никаких прав не было. Что с множеством пользователей?
lealxe
Это же машинный перевод?..
Статью для перевода выбрали офигенную, за что так?..