Wolfenstein 3D на Game Boy Color

Куда уже только не добрались любительские порты Wolfenstein 3D. Мы уже видели впечатляющие результаты на ZX Spectrum 48K, Atari XL, Sega Genesis. Все эти проекты объединяет стремление адаптировать или написать новый код, работающий в рамках оригинальных возможностей ретро-платформ.

Game Boy Color, с его недо-Z80 на частоте 8.3 МГц с сочетании с маленьким разрешением экрана — довольно интересная платформа для подобных экспериментов. Попытки реализовать игры, аналогичные Wolf 3D, уже были, но они отличались графикой совершенно без текстур с не очень высокой скоростью работы.

Автор находящегося в процессе разработки нового порта Wolfenstein 3D для GBC решил пойти нетрадиционным путём — получить полноценную графику и высокую частоту кадров за счёт применения сопроцессора в картридже. Игра работает на 32-битном микроконтроллере производства NXP с ядром ARM Cortex-M0 на частоте 48 МГц, 16КБ ОЗУ и 128КБ ПЗУ. Интерфейс с GBC представляет собой двухпортовое статическое ОЗУ объёмом 8КБ, в которое с одной стороны идёт рендер видеобуфера от микроконтроллера, а с другой GBC забирает готовые тайлы для отображения. Также на плате присутствует 8-битное ПЗУ объёмом 512 килобайт для обычного GBC кода и маппер MBC1 для работы с ним.

Больше подробностей на странице проекта.

44 комментария

avatar
Плавно так работает, круто. А где можно почитать про «GBC забирает готовые тайлы для отображения»? Это какой-то известный хак или человек сам придумал решение? Звучит очень круто
avatar
основа графики GBC — тайлы.
wolf3d уже портировали на Enterprise, вроде на движке алонештейна.
avatar
Я в курсе про тайлы, мне интересно была инфа о перегенерации. Про GBC ничего не знаю, вот на NES, насколько я помню, такое провернуть нельзя — нет доступа к редактированию набора тайлов во время выполнения.
avatar
рендер битмапа+DMA для переброски. Наверное так.
avatar
Это относительно известный хак. Проблема одновременного доступа к тайлам решается в лоб — использованием двухпортовой памяти, т.е. памяти, которая даёт два полноценных канала для доступа к её содержимому, не мешающих друг другу. В староглиняные времена это было непозволительной роскошью, а сейчас вполне доступно.
avatar
Вот хорошая и наглядная схема:
www.happydaze.se/wp-content/uploads/2016/10/frame-overview.png

На спекки подобное делал Alone Coder, используя General Sound для дополнительных вычислений. Там правда, для обмена данными нет шареной памяти, только порты.
avatar
В General Sound тоже нет шареной памяти :) Трюк Alone Coder работает только с NGS.
avatar
Не знал, спасибо! Оказывается, на NGS есть DMA доступ.
avatar
Ну понятно же, что любители запрещать использование технологий XXI века сами себе ни в чём отказать не могут :)
avatar
Автор находящегося в процессе разработки нового порта Wolfenstein 3D для GBC решил пойти нетрадиционным путём — получить полноценную графику и высокую частоту кадров за счёт применения сопроцессора в картридже.
Ну, это читерство уже :-) Один «камень» ARM Cortex-M0 мощнее, чем весь GBC. Зато на GBA, например, Wolf портирован официально. И Doom тоже. Это так, к слову.
avatar
<blockquoteGame Boy Color, с его недо-Z80 на частоте 8.3 МГц с сочетании с маленьким разрешением экрана>
не понял, где тут «читерство» и почему «недо-z80»
avatar
Игра работает на 32-битном микроконтроллере производства NXP с ядром ARM Cortex-M0 на частоте 48 МГц, 16КБ ОЗУ и 128КБ ПЗУ.
Вот поэтому и читерство. Почему процессор в GBC назван «недо-Z80» — неужели тоже объяснять нужно? Потому что может меньше чем #Z80 (хотя в плане оптимизации для него нужно так много переосмысливать, что лично я даже не вполне уверен, какой набор команд окажется более производительным).
avatar
я не согласен с таким термином.
А по сути это недо-GBC.
avatar
Да нечего там особо переосмысливать — это немного расширенный 8080 с аппаратными глюками. Там даже банальный инкремент регистровых пар надо использовать с осторожностью, т.к. он может приводить к порче списка спрайтов при определённых условиях. А 8080 по любому менее гибкий, чем Z80 — мало регистров, нет индексных.
avatar
А вот интересно — у Амстрада z80 работает по-другому. Это недо-z80?
у Mattel Aquarius нет прерываний IM2 — это недо-z80?
у 8080 похожий набор команд — что недо- тогда?
КР580ВМ80, копия 8080 — это недо 8080?
кстати, порча спрайтов при инкременте пар неясно чей глюк — процессора или конструкции?
avatar
привычка называть что-то «недо» — от «НедоПиСи».
традиция, пожалуй.

но явно не моя.
avatar
Z80 всё же всегда работает как Z80 соответствующей версии, а не по-другому.

Есть расхожее заблуждение, что процессор GB — урезанная версия Z80 или полноценный Z80; также местной аудитории легче ориентироваться относительно Z80; в формате новости лишний абзац с пояснением, что же там за процессор, не очень уместен. Поэтому вот так.
avatar
Я не согласен и всё потому, что мне интересно думать в терминах демокодинга.

Демокодинг на Z80 приучает к некотором стандартным общим образам мысли: «стеком быстрее», «перекладывать байты эффективнее, если задействовать ldi» — базовые эвристики выглядят примерно в этом духе. А на GBC команды чтения и записи байтов с автоинкрементом настолько эффективны, что всякие решения, обычно отметаемые на Z80 становятся снова актуальными. Нужно заново продумывать на уровне эвристик, даже базовые операции.

Разумеется, багов процессора это всё не касается…
avatar
у GBC есть свои особенности — запись в видеопамять недоступна напрямую, а после:

lcd_WaitVRAM: MACRO
        ld      a,[$FF41]       ; <---+
        and     2;STATF_BUSY      ;     |
        jr      nz,@-4          ; ----+
        ENDM


поэтому используется DMA. А если копнуть в демо, то найдутся и трюки со стеком и прочие.
avatar
introspec, мы недавно рассматривали в чате проц гб.
gb cpu, посмотри.
я лично восторгов при первом рассмотрении не нашёл. очень порезано. но есть милейший маппинг :)
avatar
Немного бестолковое руководство в том разрезе, о котором я говорил. Вот таблица с времянками команд.

Примеры интересных команд: мы привыкли, что ld a,(hl): ld (de),a: inc hl: inc de — слишком медленно, нужно либо делать ldi/ldd, либо, как минимум, пытаться экономить на инкрементах (всякие спрайты раскранченные чтобы ходить по ним inc h или inc l, рисование змейкой и т.д. и т.п.). А на GBC у нас есть ldi a,(hl) — за 8 тактов всего, с бесплатным инкрементом!!!

Или, мы привыкли что заливать стеком — эффективнее всего. push hl работает 11 тактов, т.е. заливает по 5.5 такта на байт. А на GBC push hl — это уже целых 16 тактов, считай что ldi (hl),a даёт тебе ту же скорость, что и стек.

Или, мы привыкли, что JR занимает меньше памяти, но работает чуть помедленнее чем JP (12 тактов против 10). Т.е. оптимизация по скорости — это почти всегда JP, оптимизация по памяти — почти всегда JR. А на GBC JR работает за те же 12 тактов, в то время как JP — целых 16!

Т.е. мораль такая: наши привычки с Z80 во-многом неприменимы более. Я могу себе представить заливку стеком на GBC, но моё ощущение сейчас такое, что опытный GBC кодер вряд ли будет делать это автоматически стеком, как мы привыкли у себя.

И ещё есть ощущение, что процессор у GBC более сбалансирован. Т.е. сам факт, что для пересылки команд поэффективнее всё же использовать команды для пересылки команд, или что локальные переходы пошустрее, он говорит о том, что кодирование не настолько через жопу, как у нас, где заливают стеком, ходят по экрану дикой комбинацией стека и ldi, и т.д. и т.п. Чисто на идеологическом уровне.
avatar
Вообще, существует мнение, что GB изначально делался под 6502. Остальное железо очень сильно похоже на NES. Кто-то из железячников где-то говорил, что внешняя шина у процессора GB по устройству близка или совпадает с 6502, а не 8080/Z80. Но в какой-то момент разработки процессор предположительно был заменён, по неизвестным соображениям. Возможно, у Sharp для была лицензия на 8080/Z80, но не было на 6502, или они решили применить свой уже существующий промышленный контроллер, который проще интегрировался с драйвером LCD.

Не знаю, исходя из опыта написания кода для 8080/Z80 и 6502/65816/SPC700, я ничего особенно интересного в системе команд не заметил, никакой особенной парадигмы. Может она и есть, но мне кажется, что итоговый дизайн скорее следствие спешки, чем продуманных решений.
avatar
Так ты отказался от затеи что-либо написать? Есть еще один нюанс: модификация кода не прокатит ибо ROM.
avatar
Я и не собирался писать для GBC. Мне на спектруме хватает проектов!
avatar
Мало нам, больше от тебя спектрума хотим! =)
avatar
такты посчитал и отказался от затеи?(:
avatar
Да не было никакой затеи. Прочёл что там не Z80, а что-то другое, похожее, залез и посмотрел что именно. Запомнил, было прикольно разобраться. Но это никакая не идея для проекта. Это просто общее образование.
avatar
Короче, не разобрался, не зная железа и возможностей.
avatar
Нет, просто ты и я понимаем под «затеей» (я бы сказал, под «проектом») совершенно разные вещи.

Для тебя, как я это понимаю, совладать с новой железкой — уже проект. А мне это не кажется интересным достижением. Мне нужно сказать что-то за пределами чисто технического результата. И у меня сейчас нет совершенно ничего такого, что я бы не мог сказать на спектруме, но смог бы на GBC. Поэтому осваивать GBC кажется мне глубоко бессмысленной затеей.
avatar
Нет, прсто интересно, чтобы вышло, если бы ты к gbc применил свой подход к созданию дем.
avatar
совладать — не проект. Скорее всего интерес к ретрокомпам. Сделать что-то посерьезнее «Hello.world!» — это затея(:
avatar
ну да, выходит он заменил прикольный глючный процессор на неприкольный, мощный
как то это… неправильно
avatar
Лично мне показалось это спорным, но весьма занимательным решением (было столько аналогичных фантазий, а тут реально сделано), поэтому и запостил сюда. Судя по активной реакции на пост в самом непопулярном разделе сайта, не зря.
avatar
да все верно, интересно.
и замусолить тему тоже интересно :)
avatar
Решение интересное, но всё равно читерство :-) Если покопаться, то можно много похожих найти. Например, на GBA был официальный картридж Play-Yan от Nintendo, который играл mp3 и MPEG-4 видео, для чего использовался хардварный декодер VideoCore VC01.

Впрочем, соглашусь, что для хоббийного уровня это очень мощный проект.
avatar
Да и Badd Apple тоже (:
avatar
Классический пример сопроцессора для обработки видео в картридже это SuperFX, специализированный 16-битный RISC-процессор (корни его можно отследить в современной архитектуре ARC). Чип этот разработал, кстати говоря, Ben Cheese, который в свое время трудился и у Синклера.

Готовый ARM это, конечно, не так интересно, как разработка собственной архитектуры. Я бы больше порадовался чему-нибудь специализированному на, например, Xilinx Spartan 6 (LX4 стоит не дороже многих ARM-микроконтроллеров).
avatar
способ — супер.
решение — отличное.
стоимость — мизерная.
результат — впечатляющ.

Давайте холиварить?
Я за такие расширения. оригинальная машина + дешёвый специализированный апгрейд.
который:

1. Защита от копирования
2. позволяет сделать именно то что задумано.
3. всё в результате — крайне дёшево.
  • VBI
  • 0
avatar
Ключевое слово — «дешевый» — меня очень сомневает. Я думаю даже как любительский проект стило это не дешево, возможно он привлекал сторонние ресурсы, на работе или еще как. Ну а если он такой фанат что это на досуге делал… массу времени затрачено…
Мне кажется несколько попроще было бы просто присобачить экран и джойстик, от того-же GBC
avatar
Я не люблю такие решения из-за узкой аудитории. Мне интересно кодить чтобы другие могли посмотреть. Конечно, всегда можно записать youtube, как это делает тот же lft, но ты фактически гарантируешь, что это только на youtube и будут смотреть. А при таком раскладе возня с железом и т.д. становится слишком уж абстрактным упражнением на мой вкус.

Ну т.е., возвращаясь к деме Alone Coder для NGS — что, не прикольно? очень прикольно. Но я сразу прикидываю кол-во работающих железок реальное, вспоминаю какие проблемы всякий раз запустить, даже в эмуляторе, и понимаю, что упражнение слишком академическое.

Т.е. люди на TS-Conf ругаются, что не тру, а между прочим, куда демократичнее по железу выходит, нежели NGS.
avatar
Ну кое в чем не тру. Ответ давно известен.
avatar
идея-то игровая.
avatar
Так тем более на YouTube играть не очень выйдет.
avatar
я бы поиграл
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.