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 для работы с ним.
Больше подробностей на странице проекта.
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 комментария
wolf3d уже портировали на Enterprise, вроде на движке алонештейна.
www.happydaze.se/wp-content/uploads/2016/10/frame-overview.png
На спекки подобное делал Alone Coder, используя General Sound для дополнительных вычислений. Там правда, для обмена данными нет шареной памяти, только порты.
не понял, где тут «читерство» и почему «недо-z80»
А по сути это недо-GBC.
у Mattel Aquarius нет прерываний IM2 — это недо-z80?
у 8080 похожий набор команд — что недо- тогда?
КР580ВМ80, копия 8080 — это недо 8080?
кстати, порча спрайтов при инкременте пар неясно чей глюк — процессора или конструкции?
традиция, пожалуй.
но явно не моя.
Есть расхожее заблуждение, что процессор GB — урезанная версия Z80 или полноценный Z80; также местной аудитории легче ориентироваться относительно Z80; в формате новости лишний абзац с пояснением, что же там за процессор, не очень уместен. Поэтому вот так.
Демокодинг на Z80 приучает к некотором стандартным общим образам мысли: «стеком быстрее», «перекладывать байты эффективнее, если задействовать ldi» — базовые эвристики выглядят примерно в этом духе. А на GBC команды чтения и записи байтов с автоинкрементом настолько эффективны, что всякие решения, обычно отметаемые на Z80 становятся снова актуальными. Нужно заново продумывать на уровне эвристик, даже базовые операции.
Разумеется, багов процессора это всё не касается…
поэтому используется DMA. А если копнуть в демо, то найдутся и трюки со стеком и прочие.
gb cpu, посмотри.
я лично восторгов при первом рассмотрении не нашёл. очень порезано. но есть милейший маппинг :)
Примеры интересных команд: мы привыкли, что 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, и т.д. и т.п. Чисто на идеологическом уровне.
Не знаю, исходя из опыта написания кода для 8080/Z80 и 6502/65816/SPC700, я ничего особенно интересного в системе команд не заметил, никакой особенной парадигмы. Может она и есть, но мне кажется, что итоговый дизайн скорее следствие спешки, чем продуманных решений.
Для тебя, как я это понимаю, совладать с новой железкой — уже проект. А мне это не кажется интересным достижением. Мне нужно сказать что-то за пределами чисто технического результата. И у меня сейчас нет совершенно ничего такого, что я бы не мог сказать на спектруме, но смог бы на GBC. Поэтому осваивать GBC кажется мне глубоко бессмысленной затеей.
как то это… неправильно
и замусолить тему тоже интересно :)
Впрочем, соглашусь, что для хоббийного уровня это очень мощный проект.
Готовый ARM это, конечно, не так интересно, как разработка собственной архитектуры. Я бы больше порадовался чему-нибудь специализированному на, например, Xilinx Spartan 6 (LX4 стоит не дороже многих ARM-микроконтроллеров).
решение — отличное.
стоимость — мизерная.
результат — впечатляющ.
Давайте холиварить?
Я за такие расширения. оригинальная машина + дешёвый специализированный апгрейд.
который:
1. Защита от копирования
2. позволяет сделать именно то что задумано.
3. всё в результате — крайне дёшево.
Мне кажется несколько попроще было бы просто присобачить экран и джойстик, от того-же GBC
Ну т.е., возвращаясь к деме Alone Coder для NGS — что, не прикольно? очень прикольно. Но я сразу прикидываю кол-во работающих железок реальное, вспоминаю какие проблемы всякий раз запустить, даже в эмуляторе, и понимаю, что упражнение слишком академическое.
Т.е. люди на TS-Conf ругаются, что не тру, а между прочим, куда демократичнее по железу выходит, нежели NGS.