Порт классической Mac OS для GameCube и Wii дошёл до рабочего стола
В гостевом посте на virtuallyfun.com автор под именем Rairii рассказывает о важной вехе: его порт классической Mac OS на PowerPC-системы с чипсетами ArtX (Nintendo GameCube, Wii и в перспективе Wii U) впервые дошёл до рабочего стола. По словам автора, это, скорее всего, первый случай со времён клонов на платформе CHRP, когда кто-то вне Apple довёл классическую Mac OS на новой системе до рабочего стола. Публичный релиз пока далёк: проект, по оценке автора, ещё «нигде не близок» к нему.
Зачем всё это: автор раньше портировал Windows NT, в ходе той работы обзавёлся PowerPC-ноутбуками Mac и тоже перенёс на них NT, а заодно близко познакомился с классической Mac OS и полюбил её «халтурность», наслоение хаков с 1980-х. Он отдельно подчёркивает: проект начат 22 июня 2025 года (с форка upstream-версии OpenBIOS), ни кодирующие агенты, ни LLM не использовались, весь код, реверс-инжиниринг и отладка сделаны вручную, потому что это хобби и способ учиться.
Загрузка. Новая «New World» Mac OS стартует с загрузчика Trampoline, которому нужна среда Open Firmware, поэтому автор портировал OpenBIOS. Часть драйверов он взял из порта OpenBIOS, который для своего порта Mac OS X на Wii сделал Goldfish64, но использовать его целиком не стал: тот нацелен только на Wii и Wii U, а автору нужен ещё и GameCube. Чтобы переиспользовать код дисплейного драйвера, он переделал свой загрузчик прошивки NT ARC так, чтобы тот грузил big-endian ELF. Для первых экспериментов написаны драйверы двух устройств на шине EXI: SD Gecko (адаптер слота карты памяти GameCube для SD по SPI) и EXI-IDE (корректный не для реального железа, а для неточной эмуляции в собственной сборке Dolphin, зато удобный для отладки в эмуляторе). Файл «Mac OS ROM» (TBXI) автор положил прямо на FAT как \ppc\bootinfo.txt. Идея: применять патчи к образу как можно ближе к времени запуска, чтобы в итоге годились почти нетронутые образы CD.
Патчи Trampoline. Загрузчик предполагает иную раскладку физической памяти: адрес буфера считается неверно (патч подставляет заведомо допустимый), а физические адреса от 0x8000_0000 он принимает за память, отображённую на ввод-вывод (на прежних системах это адресное пространство шины PCI), тогда как на Wii U там часть ОЗУ. Кроме того, между областями ОЗУ есть «дыры», частично занятые MMIO. Решение: в списке областей памяти ядра автор заменил отображение MMIO на физический 0x0100_0000 → виртуальный 0xE000_0000 длиной 0x1000_0000. Он может изменить это в будущем, потому что на Wii U диапазон 0xD000_0000-0xEFFF_FFFF отображён на часть GPU Radeon R7xx под названием HDP. В Trampoline также пришлось распознавать и подменять старую версию функции инициализации отображения (ранние версии используют 16-битный счётчик страниц, поздние 32-битный) и убирать безусловные отображения 1:1 для памяти выше 0x8000_0000, конфликтующие с ранее заданными. Дополнительно вырезаны настройки под микроконтроллер, присутствующий во всех PowerPC-Macintosh, пересчёт частоты шины по аппаратному таймеру и обращения к контроллеру прерываний шины PCI.
Дерево устройств и ядро. Контроллер прерываний в дереве устройств подменён на один из распознаваемых (little-endian PCI-контроллер, который на уровне регистров ближе всего к контроллеру прерываний Flipper), адрес кадрового буфера заменён на некэшируемый виртуальный, добавлено фальшивое Mac99-совместимое устройство управления питанием. В ядре патчится один из драйверов контроллера прерываний под Flipper (ради места пожертвован неиспользуемый), а прерывания приходится маскировать в ядре и размаскировывать в обработчиках драйверов, потому что ожидаемый контроллер имеет режим, где прерывание процессора вызывается при любом изменении набора прерываний.
Код SuperMario (m68k) и нативный код. В m68k-части правятся обращения к регистрам контроллера прерываний, заглушаются указатели включения и выключения аудиопрерываний, исправляется функция ранней инициализации ADB и микроконтроллера питания, которая не проверяет наличие железа и затирает низкую память. Нашёлся и баг копипаста: при отсутствии последовательного порта 2 функция инициализации прерываний уходит в бесконечный цикл, потому что разработчики не поменяли метку перехода, скопировав код для порта 1. В нативном коде тоже правятся обращения к контроллеру прерываний; драйвер USBShimKeyboard не обрабатывает отсутствие USB-контроллера и вызывает нулевой указатель внутри эмулятора m68k. Драйвер питания заменён заглушкой из BlueBox; автор планирует написать свой, чтобы заработали выключение и перезагрузка.
Дальнейший путь. Этого хватило, чтобы загрузка дошла до мигающей дискеты. Затем автор написал дисплейный драйвер (помог virtio-драйвер Elliott Nunn) и драйвер портов контроллеров GameCube, чтобы двигать курсор без USB. Потом он застрял на вопросе формата диска, после чего дампнули Mac OS для CHRP, он отвлёкся на патчи для загрузки более поздних образов TBXI (считая, что 7.x полезнее для GameCube, которому не хватает ОЗУ даже под минимальные требования 8.0) и на другие проекты. Почти через год он вернулся к работе, реализовал выбранный формат диска в OpenBIOS и написал драйвер, имитирующий SCSI. Пришлось добавить патч m68k, чтобы дисковый драйвер загружался как новый тип, а не устаревший (старые вызовы в его драйвере не поддерживаются), и реализовать поддержку scatter-gather при чтении: драйвер оптического диска эмулирует 512-байтные сектора на устройствах с секторами 2048 или 2352 байта через чтение с тремя scatter-gather-буферами и не проверяет, поддерживает ли их нижележащий SCSI-драйвер. Мигающая дискета оставалась: функция StartLib!GetStartupDevice делала предположения о дереве устройств и о встроенном SCSI-устройстве, из-за чего индекс пришлось исправить в трёх местах, включая дерево устройств. После этого автор впервые увидел значок счастливого Mac, но загрузочный сектор HFS отверг запуск. Дальше доступный текст обрывается, поэтому описание финального шага к рабочему столу в него не вошло.
Ключевые факты
- Порт классической Mac OS на PowerPC-системы с чипсетами ArtX (GameCube, Wii, в перспективе Wii U) впервые дошёл до рабочего стола; по словам автора, вероятно, впервые со времён клонов CHRP, когда кто-то вне Apple сделал это на новой системе.
- Проект начат 22 июня 2025 года с форка OpenBIOS; автор утверждает, что не использовал ни кодирующих агентов, ни LLM. До публичного релиза, по его словам, ещё далеко.
- Чтобы запустить загрузчик Trampoline, пришлось патчить предположения об адресном пространстве: MMIO переотображено на физический 0x0100_0000 → виртуальный 0xE000_0000 (длина 0x1000_0000), подправлены дерево устройств, ядро, код m68k и нативный код.
- В коде Apple нашлись баги: бесконечный цикл при отсутствии последовательного порта 2 (ошибка копипаста метки перехода) и вызов нулевого указателя в USBShimKeyboard при отсутствии USB-контроллера.
- Для загрузки с диска написан драйвер, имитирующий SCSI, и добавлена поддержка scatter-gather; после правки индекса в трёх местах появился значок счастливого Mac, затем загрузочный сектор HFS отверг запуск.
Почему это важно
Это нишевая, но показательная веха ретрокомпьютинга. По словам автора, классическую Mac OS на новой системе до рабочего стола, вероятно, не доводил никто вне Apple со времён клонов CHRP. Пост интересен и как подробный технический разбор: он показывает, какие допущения о железе заложены в загрузчик, ядро и код m68k классической Mac OS и как их обходят патчами.
Кому это важно
Энтузиастам ретрокомпьютинга и эмуляции, разработчикам прошивок и загрузчиков (Open Firmware, OpenBIOS), тем, кто интересуется внутренним устройством классической Mac OS и портированием ОС на нестандартное PowerPC-железо вроде GameCube и Wii.
Как это применить
Готового продукта нет: автор подчёркивает, что проект далёк от публичного релиза, а сведений о репозитории и сроках в доступном тексте нет. Практическая польза сейчас в самом разборе: подходы с подменой отображения MMIO, правкой дерева устройств, применением патчей к образу максимально близко ко времени запуска и драйвером, имитирующим SCSI, можно изучать как рабочие приёмы.
Можно ли доверять
Это личный технический рассказ автора гостевого поста на virtuallyfun.com, и громкое утверждение «вероятно, впервые со времён CHRP» принадлежит ему самому, а не независимой проверке. Заявление о том, что LLM не использовались, тоже его собственное. Доступная версия статьи обрывается на проблеме с загрузочным сектором HFS, поэтому как именно достигнут рабочий стол, и на какой именно консоли и версии Mac OS, из текста не видно.
Риски и подводные камни
Проект на ранней стадии: автор сам говорит, что до публичного релиза далеко, а часть решений (например, отображение MMIO на Wii U, где диапазон 0xD000_0000-0xEFFF_FFFF занят областью GPU) он может пересмотреть. Выключение и перезагрузка пока держатся на заглушке драйвера питания из BlueBox. Патчи завязаны на особенности конкретных версий Trampoline и образов TBXI, так что на других версиях Mac OS всё может сработать иначе.
«Я делаю эти проекты ради удовольствия и чтобы учиться; если бы я использовал «ИИ», это не было бы весело, и я бы ничему не научился.»
— Rairii, автор гостевого поста на virtuallyfun.com