
Парадоксально, но факт: классическая консоль Nintendo Wii ближе к старым Mac, чем может показаться. Внутри процессор IBM Broadway с архитектурой PowerPС 750 подобные чипы использовались в iMac G3 и iBook G3. Эти компьютеры работали под управлением ранних версий MacOS X, что упрощает задачу — не надо ничего эмулировать. Код ОС будет выполняться процессором нативно, без лишних абстракций.
Однако есть и ряд сложностей: все же Wii не является Macintosh, а следовательно, большая часть компонентов взаимодействуют иначе. У консоли другой загрузчик, видеоподсистема и периферия. Так что запуск на ней MacOS X — задача со звездочкой. Поэтому наливайте себе холодный чай, доставайте фрукты и добро пожаловать под кат.
От BootMii до wiiMac
Чтобы получить возможность запуска любого пользовательского кода на Wii, придется обойти фундаментальные ограничения консоли. Я намеренно не стану подробно рассказывать о том, как это сделать, — информации полно на сторонних ресурсах. Лично у меня консоль с прошивкой 4.3E, так что сработало сочетание LetterBomb + HackMii.
Смысл в том, чтобы при открытии специально сформированного «письма» вызвать переполнение буфера и заставить консоль выполнить произвольный код в роли которого используется HackMii. Последний добавляет BootMii- и Homebrew-канал для запуска приложений с SD-карты или USB-флешки.
После того как я получил «разблокированную» консоль, пришла пора задуматься — как именно происходит загрузка старой MacOS. В обычном PowerMac первым слоем ПО выступает Open Firmware, изначально разработанная Sun Microsystems для своих рабочих станций на базе SPARC. Физически эта прошивка находилась в BootROM (да-да, в те годы EFI еще не изобрели). Заданные функции просты — определить все установленное оборудование, построить соответствующее древо устройств, найти загрузчик и передать ему управление.
И вот именно тут у Wii возникают сложности: в ней нет Open Firmware, а следовательно, всю вышеперечисленную работу должен выполнять отдельный код. Благо, нашелся один энтузиаст — Брайан Келлер (Bryan Keller), разработчик из Сан-Франциско, который взялся за реализацию этого этапа загрузки. Результат получил название wiiMac и был в 2025 году выложен на GitHub.

В составе SoC на Wii есть ARM-сопроцессор, названный Starlet. В обычном режиме на Starlet исполняется служебная операционная система Nintendo IOS, контролирующая низкоуровневое общение с устройствами — от NAND до USB.
BootMii выполняет свой запуск в два этапа:
Вначале загружается бинарник /bootmii/armboot.bin
ARM-код стартует /bootmii/ppcboot.elf.
Файл armboot.bin — это альтернативная прошивка, названная разработчиками рекурсивной аббревиатурой MINI (MINI is Not IOS). Да, она не столь функциональна и крута, как оригинал, но со своей задачей — стартануть — ppcboot.elf справляется отлично. Последний прорисовывает меню с четырьмя иконками, откуда мы можем выполнить любой произвольный ELF-файл с SD-карты. Перемещение и выбор делается через аппаратные кнопки на лицевой панели (Power — Right, Reset — Select):

В репозитории wiiMac можно найти ZIP-архивы каждой версии. Внутри будет лежать нужный нам wiiMac.elf и его конфигурационный файл config.txt. Для них надо создать отдельную директорию wiiMac в корне SD-карты. Полная цепочка выглядит следующим образом:

В сухом остатке мы приходим к этапу, когда у нас на Wii запущена альтернативная реализация Open Firmware, которая взаимодействует с MINI, обеспечивая доступ к железу. Более того, это еще и загрузчик, умеющий работать с HFS+ разделами и способный выполнить запуск нативного инсталлятора MacOS:

На скриншоте видно, что если подсунуть отформатированную в HFS+ карту памяти, то он сможет с нее загрузиться. Так что достаем вторую SD — и давайте сформируем на ней нужные разделы.
Подготовка накопителя
На Wii нет смысла гнаться за скоростью. Лично я взял запасную карту памяти от старенькой цифровой камеры Panasonic объемом 32 Гб — более чем достаточно для инсталлятора, кастомного ядра, кекстов (драйверы в формате kext, то есть kernel extension) и корня, куда ОС будет установлена.
Удобнее всего подготовить карту, используя современный Mac, — в моем случае это Mac Mini M2. Вначале надо посмотреть, какие разделы присутствуют, и узнать номер подключенной карты памяти:
diskutil list
В моем случае это был disk4, поэтому создал три раздела:
diskutil partitionDisk diskX APM \ HFS+ "Macintosh HD" R \ HFS+ "Install" 1G\ FAT32 "Support" 64M
Ответ команды:
Started partitioning on disk4 Unmounting disk Creating the partition map Waiting for partitions to activate Formatting disk4s3 as Mac OS Extended with name Macintosh HD Initialized /dev/rdisk4s3 as a 28 GB case-insensitive HFS Plus volume Mounting disk Formatting disk4s4 as Mac OS Extended with name Install Initialized /dev/rdisk4s4 as a 954 MB case-insensitive HFS Plus volume Mounting disk Formatting disk4s5 as MS-DOS (FAT32) with name Support 512 bytes per physical sector /dev/rdisk4s5: 122958 sectors in 122958 FAT32 clusters (512 bytes/cluster) bps=512 spc=1 res=32 nft=2 mid=0xf8 spt=32 hds=16 hid=61739008 drv=0x80 bsec=124912 bspf=961 rdcl=2 infs=1 bkbs=6 Mounting disk Finished partitioning on disk4 /dev/disk4 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: Apple_partition_scheme *31.7 GB disk4 1: Apple_partition_map 32.3 KB disk4s1 2: Apple_HFS Macintosh HD 30.5 GB disk4s3 3: Apple_HFS Install 1.0 GB disk4s4 4: DOS_FAT_32 SUPPORT 64.0 MB disk4s5
Нас пока что интересует только раздел disk4s4, так как в него мы запишем образ из установочного DMG-файла операционной системы MacOS 10.0.3. Сразу стоит сделать оговорку — взять его можно беспрепятственно в Архиве интернета. Как только файл был скачан, я смонтировал его в систему, получив disk5 c девятью разделами. Но меня интересовал из них лишь один — имеющий маркировку Apple_HFS Install (у меня это disk5s9).
Теперь надо аккуратно размонтировать оба раздела. Действуем поочередно:
diskutil unmount disk4s4
И раздел из образа:
diskutil unmount disk5s9
Остается лишь выполнить побитовое копирование образа в раздел на диске:
sudo dd if=/dev/rdisk5s9 of=/dev/rdisk4s4 bs=512k status=progress
Несколько минут ожидания — и инсталлятор благополучно занял свое место. Пришла пора добавить пропатченное ядро XNU 124.13 и кексты. Здесь ничего придумывать не надо — прямо из Finder переходим в раздел SUPPORT и размещаем там файлы, непосредственно в директории /wiiMac:
mach_kernel — гибридное ядро XNU (Mach + BSD).
NintendoWiiPE.kext — корневой драйвер платформы (PE = Platform Expert).
NintendoWiiHollywood.kext — драйвер SoC Hollywood.
NintendoWiiIPC.kext — драйвер межпроцессорной коммуникации (Broadway — Starlet).
NintendoWiiSDCard.kext — драйвер контроллера SD.
NintendoWiiPIC0.kext — драйвер контроллера прерываний 0.
NintendoWiiPIC1.kext — драйвер контроллера прерываний 1.
NintendoWiiFramebuffer.kext — софтверный видеодрайвер.
NintendoWiiNVRAM.kext — драйвер энергонезависимой памяти NVRAM (правда ее в Wii нет — эту роль исполняет Open Firmware), который требуется для многих подсистем MacOS.
NintendoWiiEXI.kext — драйвер шины EXI, дающий доступ к часам реального времени.
IOUSBFamily.kext — патченный стек USB, чтобы ОС могла корректно выполнять обнаружение USB-устройств.
Стоит понимать, что в загрузчике автор не захардкодил какой-то конкретный список кекстов: система рекурсивно ищет их в этой директории, и если распознает новый, то пытается его загрузить. С одной стороны, это пространство для экспериментов, но с другой — есть ряд сложностей, препятствующих этому.
Как пишет автор проекта в своем блоге, чтобы условный AppleUSBOHCI запустился, необходим был провайдер класса IOPCIDevice. На Wii его не было по банальной причине — ну нет там таких устройств. В итоге пришлось создавать фейковый nub (объект, служащий точкой подключения конкретного драйвера устройства) с именем NintendoWiiHollywoodDevice, а также само фейковое устройство NintendoWiiHollywoodPCIDevice с сабклассом IOPCIDevice.
Далее следите за руками… Разработчик заставил NintendoWiiHollywood публиковать созданный nub (наследующий от IOPCIDevice), а также отредактировал driver personality в его Info.plist таким образом, чтобы в качестве провайдера указывался NintendoWiiHollywoodPCIDevice. Этим получилось добиться фактического совпадения в древе устройств и, как следствие, запуска драйвера. Однако это лишь верхушка айсберга — автору еще пришлось повозиться с байт-свопами (little-endian / reverse little-endian).
Даже после успешного старта инсталлятора и установки MacOS на Nintendo Wii большая часть устройств (звук, беспроводные сети, оптический привод и ускорение графики) не будут работать. Отличный шанс проявить себя тем, кому интересно изучить архитектуру этой старой ОС — можно попробовать создать свое решение, протестировать и предложить в качестве пулл-реквеста.
Запуск инсталлятора
Вторая SD-карта готова — можно стартовать. Когда вы дойдете до этапа с надписью No partitions found, просто замените саму SD-карту, после чего начнется отсчет 10 секунд — и установщик будет запущен. Обратите внимание, что тут порядок загрузки меняется с помощью кнопок на лицевой панели консоли.
Например, Power перебирает разделы (из тех, которые удалось определить инсталлятору), Reset становится аналогом Enter, а Eject добавит к строке дополнительные параметры. Все это автору пришлось намеренно прописать в коде, так как реализовать ввод с клавиатуры попросту не был бы возможным. Спустя пару минут на экране появится штатный установщик ОС:

Работает это, мягко говоря, не быстро, однако далее начинается самое интересное. После завершения копирования файлов система сама уйдет в перезагрузку, что автоматически означает необходимость пройти всю цепочку запуска с нуля:
Wii — Homebrew — BootMii — wiiMac.elf — смена SD-карты
И вот тут нужно будет с помощью кнопки Power выбрать уже не раздел с Apple_HFS Install, а Apple_HFS Macintosh HD. Однако запуск требует минимального разрешения 800 × 600, а дефолтное 640 × 480. Так что надо добавить параметр Force800x600=1 нажатием кнопки Eject. Итоговый выбор выглядит так:

Обратите внимание, что этот режим, когда мы заставляем фреймбуфер прорисовать больший кадр, лишь разовый маневр, и нужен он исключительно для прохождения второго этапа инсталлятора.
Мои грабли
Казалось бы, вот и полдороги позади. К USB-портам подключена клавиатура и мышь, но что-то пошло не так:

Кнопка Continue находится где-то за пределами окна, и тут стоит сказать пару слов о том, как я вообще вижу изображение. Увы, у меня нет нормальной платы видеозахвата вроде Pinnacle, вместо этого я использую USB-брелок — китайский клон easyCAP, позволяющий отображать и транслировать видео с композитного выхода. В большинстве ситуаций его хватало, но в этом конкретном случае ничего не получилось.
Начнем с того, что в конфигурационном файле config.txt есть строчка:
video-mode = ntscp # options: ntscp, ntsci, pal60, pal50
Это задает режим отображения картинки в зависимости от используемого телевизора:
ntscp — NTSС с прогрессивной разверткой
ntsci — NTSC с чересстрочной разверткой
pal50 — истинный PAL (567i @ 50 Гц)
pal60 — гибридный PAL (480i @ 60 Гц, цвет кодируется по PAL)
Я перепробовал их все, одновременно пытаясь менять параметры консоли, однако мне так и не удалось добиться того, чтобы компоновка картинки на экране позволила добраться до кнопки Continue.
Сложность еще в том, что простого перемещения фокуса и Enter/Space тут недостаточно — поверьте, я все перепробовал, начиная от подключения разных клавиатур до жонглирования режимами. Дошло до того, что даже резервный easyCAP на другом чипе достал из закромов, — то же самое.
Теперь у меня есть два возможных пути: раздобыть где-то старый телевизор с поддержкой композитного входа или же попытаться найти проприетарный кабель Nintendo Wii — SCART (благо у меня есть SCART to HDMI конвертер). В любом случае дальнейшее продвижение по меню установщика и прохождение начального конфигурирования — вполне тривиальная задача, если отказаться от easyCAP.
Заключение
Без сомнения тут я бы хотел продемонстрировать интерфейс рабочего стола MacOS X, но сделать этого пока что нет технической возможности. Тем не менее способ запуска — точно рабочий: Wii стала думать, что она PowerPC Macintosh. Даже несмотря на то, что в полученной системе большая часть железа корректно работать не будет, это открывает путь к дальнейшему изучению и модификации.
Как только я смогу пройти через инсталлятор, обязательно поделюсь своим опытом, а также проверю, насколько трудно будет подключить эту операционную систему к Сети и увидеть, как выглядел ранний интернет глазами пользователя старого Mac.
Подписывайтесь на блог МТС, чтобы не пропустить новые материалы. Не стесняйтесь делиться собственным опытом, особенно если уже пробовали запускать MacOS на официально неподдерживаемом железе — будет интересно почитать. Удачи!