Пишем для NES. Краткая версия.

Изложено в формате 'нет времени объяснять'. Подробное раскрытие каждого небольшого пункта потребует статьи большего объёма, чем этот обзор. Это будет сделано впоследствии, если у читателей обнаружатся конкретные интересы.

Хотите написать игру или демо для NES, Famicom, Денди?

Изучаем. Кладезь актуальной мудрости — NesDev Wiki. Вводные для начинающих — Nerdy Nights на английском, другая на русском. Помним, что старые описания неполны и неточны. Отдельно изучаем 6502. Книг и статей много, поиск начинаем отсюда.

Выбираем между ассемблером и C. Тысяча игр на ассемблере, десятки на C. Код на ассемблере в разы эффективнее, на C пишется в разы быстрее. С ассемлером проще получить помощь зала. Для отчаянных есть экзотика, от BASIC до минимальных Lisp и Python.

Выбираем ассемблер. Три популярных, десятки других. NESASM стар, имеет искусственные ограничения (пришёл с MS-DOS, перепилен с PCE/TG16) и мелкие глюки. Легко освоить, большинство старых уроков под него, выдержит средний проект. Современная альтернатива — ASM6, прост в освоении, но не так популярен. Выбор профессионала — CA65. Мощен и гибок, но сложен в освоении (линкер и конфигурация памяти).

Выбираем компилятор C — CC65. Для работы с железом есть библиотеки neslib и KNES, либо пишем свою. По скорости потолок чистого C — подобие Super Mario Bros. Можно писать частично на C, частично на ассемблере, переписывать фрагменты кода по ходу дела. Очень удобно для прототипирования.

Пишем код. Любимый текстовый редактор, bat или make файлы. Есть развитая IDE для CC65 — NESICIDE, но WIP и почти никем не используется.

Рисуем. Отдельные тайлы редактируем непосредственно в YY-CHR, NES Screen Tool, Tile Layer Pro и других, более сложные изображения импортируем из обычных форматов там же. Для сложных проектов может понадобиться свой велосипед. Без трюков NES не может отобразить полноценную картинку на весь экран, аналога Art Studio не ищите.

Музыка и звуки. Два основных трекера, но нужен проигрыватель, выбирается в зависимости от используемого ассемблера. Пишем в FamiTracker, играем FamiTone или Gradual Games Sound Engine. Пишем в Musetracker, играем MUSE. Штатного плеера FamiTracker хватит для простого демо, но не для игр. По желанию пишем свой плеер, оба трекера имеют текстовый экспорт. Для отчаянных есть древности и экзотика.

Делаем уровни. Готовых решений нет. Набираем вручную, пишем конвертер для универсальных редакторов, изобретаем свой редактор.

Для среднего или большого проекта наверняка понадобятся особые конвертеры и утилиты. Пишем на чём угодно, лишь бы работало. Обычно C++ или Python.

Отлаживаем в эмуляторах. Средства отладки развиты в FCEUX и NintendulatorDX. Высокая точность эмуляции в Nestopia и puNES, но отладчика в них нет. Даже самые точные эмуляторы не показывают всех глюков, проверяем во всех четырёх. Если пишем на C с готовой низкоуровневой библиотекой, на железе наверняка заработает. Выжимаем максимум на ассемблере — обязательно проверяем на железе при помощи Flash-картриджей (EverDrive N8, InviteNES, PowerPak — ищем в интернете) или самодельного картриджа и программатора ПЗУ.

Успехов!

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

avatar
Отличная шпаргалка, вопросов нет, теперь сразу ясно, где смотреть!
avatar
Немного погуглил, но не нашел готовых ответов. Интересуют fullscreen картинки для NES — каковы ограничения? Как я понимаю, всё упирается в количество памяти под тайлы, плюс какие-то детали можно поверх нарисовать в другой палитре спрайтами?
Было бы любопытно почитать про чей-то опыт, какие-то советы по трюкам, задействованным в конкретных случаях.
avatar
Ой, ограничений полно. Начнём с того, что у нас есть восемь палитр и в каждую можно запхать по четыре цвета! Круто, да? Но четыре палитры идут на задний фон. Другие четыре — на спрайты. При этом максимум одновременно находящихся на экране спрайтов — 64. На горизонтальной линии — 8. А если учесть то, что задник может использовать только один банк графики за раз, с планированием картинки начинается полная жопа…

Наглядный пример: battleofthebits.org/arena/Entry/Bo_OM/14745/

Картинка потеряла массу мелких деталей после конверсии. Забиты чуть ли не все спрайты в памяти (учитывая то, что я юзал спрайты 8х8, а не 8х16), а цветность картинки немного потеряла в том, что я использовал спрайты с теми же цветами, что и на заднике.

Если что, бомбу рисовал и потом планировал в GraphicsGale. И потом вручную переносил через редактор Ширу в неймтейбл. Спрайты уже накладывались поверх картинки говнокодом.
avatar
Отлично, спасибо, то, что надо!
Спрайты — 8*8 пикселей каждый?
avatar
Спрайты есть и по 8х8, и по 8х16, но я не нашёл, как в сборке от Ширу использовать последние.
avatar
Режим спрайтов устанавливается функцией oam_size, 0 для 8x8, 1 для 8x16.
avatar
Спасибо, на досуге попробую.
avatar
Поправка, в палитры запихивается по три цвета. Нулевой цвет каждой палитры 'прозрачный'. Нулевой цвет в памяти палитр (PPU $3F00) задаёт цвет фона. Таким образом получаем максимум 1+3*4+3*4=25 цветов на экране.
avatar
Развёрнуто ответил отдельным постом.
avatar
интересен ассемблер. синтаксис, детальное описание команд — примерно как в ларченко и родионове. карта памяти, общая архитектура тачки — наглядное описание, пусть даже в формате сухой выжимки, без вот этого вот гугления крупиц информации по частям на разных ресурсах… присоединяюсь к вопросам мороза по графике
  • bfox
  • +2
avatar
пардон, все нашел:) на мигере очень годно — спасибо, Shiru !
avatar
В NesDev Wiki собраны нагугленные и проверенные крупицы информации. Когда возникает нетривиальный вопрос, ответ наверняка найдётся там. Карты памяти тоже есть: wiki.nesdev.com/w/index.php/CPU_memory_map, wiki.nesdev.com/w/index.php/PPU_memory_map
avatar
Часть инфы я уже наглядно получил из редактора тайлов, но еще не всю.
Еще интересует вопрос — реально ли сделать гигаскрин на NES? Или только с кастомными мапперами? Или вообще никак?
avatar
Реально. И даже делали. Правда, там нужно либо дофига банков графики, либо очень шустрый код.
avatar
А если я хочу сделать дему для NES, мне подойдут эти туториалы? (вопрос без тени сарказма)
  • sq
  • +1
avatar
Если делать дему с кучей графики, то тут будет обломчик, ибо стандартный карик NES держит всего лишь 8 килобайт графики, которая впритык помещается в тайловую память приставки. Чтобы это дело как-то расширить, придётся ебаться с мапперами покруче. О которых я мало что знаю.
avatar
Первый шаг к расширению объёма графики — CNROM, очень простой маппер, даёт 32 килобайта CHR: wiki.nesdev.com/w/index.php/CNROM
avatar
Да, я ещё говорил исходя из своего опыта. То есть, я пока только пользовался набором Ширу для программирования на Си. Тем, кто больше шарит в АСМе, чем я, в этом отношении поймут больше. Если покурят материал, разумеется.
avatar
Shiru, подскажи пожалуйста, насколько подойдут граф.редакторы для работы с графикой TSconf?
я вчера посмотрел твой редактор и ещё один ипонский. твой довольно специфичен, чисто под платформу;
а ипонский без англ.версии…
  • VBI
  • +1
avatar
YY-CHR? Он есть и на инглише, просто там автодетект языка хуёво работает. Надо просто переименовать english.lng, или как он там называется, в russian.lng, и всё будет!

По поводу редакторов — именно для работы с графикой лучше этого редактора не найти, там сразу же импорт из готовых .bmp-файлов есть. Ширувский редактор используется в основном для рисования экранов из тайлов.
avatar
У NES довольно своеобразная графика, для которой плохо подходят редакторы общего назначения и редакторы для других платформ. Поэтому и пишут свои. Для платформ с 16-цветной графикой, типа Master System, Genesis, SNES, специализированных редакторов уже нет, обходятся конверсией из обычных форматов.
avatar
А доложи ка нам историю, чего стоит нарисовать точку? Линию? Фигуру векторную без заливки?
Или для любого из этих простых для обычных ПК действий нужно сначала рисовать свой ТАЙЛ, а потом печатать его в нужном месте экрана?

Я вспоминаю свой первый опыт ELITE (NES) под каким то древнем эмулятором в 2000-ом году. На стартовом экране при вращении COBRA MK5 изображение рассыпалось на прямоугольные фрагменты (ошибка эмуляции наверное). Из чего я сделал вывод тогда, что на NES все только через одно место — через тайл.

avatar
Всё так, на 8-16 битных приставках рисование точек, векторов и полигонов крайне неудобно и делается через то самое место, рисованием в тайлы и пересылкой их в видеопамять.

Что гораздо хуже, объём пересылаемых за кадр данных сильно ограничен, на NES это всего-то от силы 300 байт, на 16-битных приставках около 5 килобайт. И внешней видеопамяти у NES не хватит на весь экран, да и основного ОЗУ на буфер кадра тоже не хватит. Поэтому надо было очень сильно извернуться, например один тайл использовать дважды с разными палитрами — получится двухцветная графика, но зато тайлов хватит. Плюс Elite неспроста изначально сделана для PAL-версии приставки — там видеопамять доступна в три с лишним раза дольше, соответственно можно переслать втрое больше графики.

Тем не менее, и в таких ограничениях пытались выжать и векторное 3D (Elite, Battle Zone), и даже с заливкой (Chuck Yeager's Flight Combat, Hard Drivin'). Но кроме Elite, ничего из этого до официального релиза не дошло.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.