Пишем для 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 — ищем в интернете) или самодельного картриджа и программатора ПЗУ.

Успехов!

31 комментарий

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, ничего из этого до официального релиза не дошло.
avatar
Начал сам знакомится с программированием на ассемблере через Nesicide уже пару вечеров и уже начало получаться и начала складываться картинка как оно вообще происходит, что за куски памяти и сегменты описываются в одном файле, судя по всему начинаю уже догадываться как их натягивать на мапперы и на экране символ уже инкрементируется в цикле, после GBA в принципе это уже конечно детали и тонкости.
И вот тут возникает вопрос — есть смысл писать на русском введение в программирование на NES по лекалам как я написал про GBA — от скачивания среды и через поэтапную реализацию всех нужных техник для создания игры или что-то такое уже есть? Есть ли на английском даже — и то вопрос?
avatar
Со времён этой заметки появилось ещё некоторое количество статей и на английском и на русском. Но писать всё равно стоит. Во-первых, время идёт, инструменты меняются, обновляются и устаревают. Во-вторых, иметь варианты всегда хорошо, не пошло дело по одному гайду (автор непонятно объясняет, читатель почему-то не понимает) — хорошо иметь другой. Ну и просто лишнее напоминание публике о том, что есть такая возможность, писать под подобные старые платформы.
avatar
А есть на примете какие-нибудь русскоязычные руководства в том духе о котором я пишу — чтобы от установки Nesicide и по каждому аспекту отдельно и нудно проходилось? Просто чтобы не писать одно и то же, а как то изменить точку зрения по сравнению с существующими аналогами.
avatar
P.S.
Вот опять таки посмотрел статьи migera по ссылке из начала статьи — хорошая информация, но опять не про то как сесть и начать программировать конкретный код с конкретными эффектами конкретными инструментами, а больше справочная информация. Мне же хочется написать именно такую статью, что садишься за неё, а через несколько часов встаёшь уже с работающим кодом в работающей среде никуда больше не заглядывая особо.
avatar
… через Nesicide...
Весело девки пляшут. Довольно быстро обнаружил, что редактор Nesicide не воспринимает русские буквы ни под каким соусом — заменяет их на знаки вопроса хоть при вводе с клавиатуры хоть при загрузке из файла. А как мне комментарии писать для туториалов на русском то?
Залез на гитхаб в проект и посмотрел там на код. Оказалось, что для редактора используется компонента QsciScintilla у которой в документации по методу setUtf8 чёрным по белому написано:
Sets the current text encoding. If cp is true then UTF8 is used, otherwise Latin1 is used.
И конечно же оказалось, что нигде в коде инициализации setUtf8( true ) не вызывается.
Вот так да, все годы существования Nesicide автор похоже и не подозревал, что редактор в нём ничего кроме латиницы с некоторой диакритикой не воспринимает принципиально! И никто не пожаловался! =8()

В общем я сказал и автор пообещал исправить в следующих релизах. :)
avatar
NESICIDE крайне малопопулярен, за исключением автора его почти никто не использует, а процент русскоязычных разработчиков для NES сам по себе крайне невелик, так что наличие около нуля русскоязычных пользователей до настоящего момента было вполне ожидаемо. По причине непопулярности заточенных именно под него статей с пошаговыми инструкциями я не припоминаю.
avatar
Очень странно, ибо это реальный пакет где просто распаковываешь IDE, запускаешь, делаешь New->Project->From template и имеешь рабочий код который прямо в IDE же можно отлаживать проходясь отладчиком по реальным строкам кода, а не каким то там символам из отладочного файла. И всё это в ассемблере ca65 и всё это прям без проблем (ну кроме некоторых).
Может годы назад проект был глючным и не катил, да и сейчас вот глюки есть, но альтернатив я на горизонтах просто не заметил.
avatar
Как правильно сказал Shiru , туториалов много не бывает и не может быть по определению!
Чем больше, тем лучше. Обязательно пишите ещё!
  • sq
  • +3
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.