Что касается NES (и SNES тоже в основном), вот основной обзор. Я не писал ни одной игры для NES, но написал эмулятор NES (Graybox) и проделал довольно много рев-инжиниринга старых тележек.
Что касается языка программирования: да, это была вся сборка. Программирование NES означало работу непосредственно с аппаратными прерываниями, портами DMA, переключением банков и т. Д. К счастью, программирование 6502 (или, скорее, 2A03) довольно просто [1]:
- регистров немного: в основном A, X и Y, последние два можно использовать только для индексации и итерации
- набор инструкций небольшой и в основном простой
- не много памяти: основной объем оперативной памяти составляет 2 КБ, с дополнительным 8KB расширением с батарейным питанием. Из этих 2 КБ 256 байт зарезервированы для стека, а на странице 0 (первые 256 байтов) вы хотели бы хранить наиболее часто используемые указатели и значения из-за некоторых специальных режимов адресации.
Эти 3 вещи вместе создают среду, которую достаточно легко запомнить при работе с ней. Да, вы сами управляете всей памятью, но это по сути означало, что вы создаете полную карту, где все идет вперед, и эта карта не очень большая, потому что вам нужно беспокоиться только о 2К, так что вы можете построить это на куске миллиметровая бумага. Вы должны были распланировать вещи немного больше и статически назначить переменные и константы местам RAM и ROM (на картридже).
Это становится немного сложнее, когда данные вашего картриджа выходят за пределы адресуемой границы ЦП. Это 64 КБ, из которых нижние 32 КБ установлены в камне и сопоставлены со всеми видами аппаратных портов и оперативной памяти. Именно здесь в игру вступает переключение банков, что означает отображение раздела ПЗУ в (часть) более высокого адресного пространства 32 КБ.
Это можно использовать по желанию программиста, но в качестве примера можно использовать игру с 3 уровнями, в которой все данные уровней, метаданные и код для каждого уровня втиснуты в отдельные области памяти по 8 КБ на картридже. Уровень может иметь обратные вызовы, например, для инициализации, обновления для каждого кадра и т. Д. «Загрузка» уровня будет означать отображение фрагмента памяти размером 8 КБ, например, при 0xC000. Затем можно указать, что подпрограмма init всегда имеет значение 0xC000, подпрограмма обновления кадра - 0xC200, а данные уровня начинаются с 0xC800. Основной код игры, размещенный в другом блоке памяти, затем контролирует изменения уровня, просто меняя правый блок и переходя к абсолютным адресам 0xC000 и 0xC200 в соответствующее время.
По графическим данным: данные тайлов NES представляют собой 2-битные карты размером 8x8 пикселей. Для фона они сочетаются с 2-битным слоем с разрешением 1/4. Затем эти 4-битные значения были проиндексированы в палитру из 16 элементов, и я считаю, что доступно 53 эффективных уникальных цвета. Спрайты также использовали данные 2-битных пикселей, и каждый спрайт снова указывал свой собственный 2-битный индекс группы, образуя 4-битный индекс pal. BG-изображение на экране представляет собой массив индексов 32x30.
По сути, имея массу повторений и индексов в индексах, вы можете хранить данные очень маленькими. Данные об уровне часто сохранялись в виде вертикальных полос индексов листов, и поскольку эти вертикальные полосы также использовались повторно, они также были проиндексированы и сохранялись только один раз на картридже. Простые методы сжатия данных работают аналогично. Это позволило Mario 1 иметь 32 КБ данных (с запасом места) и 8 КБ растровых данных.
Что касается среды разработки, я видел несколько фотографий, где люди работали на некоторых древних компьютерах, подключенных к EEPROM для работы. Отладка с помощью инструмента не была действительно возможна до окончания возраста SNES [2]. Это главная причина, по которой во многих старых играх есть «очевидные» ошибки и почему такие вещи, как Gameshark, могут делать то, что делают; здоровье игрока всегда будет в mem-location X, так что вы можете сделать так, чтобы оно всегда было равно 100.
Если вы находите эти вещи интересными, я советую вам взглянуть, например, на http://wiki.nesdev.com/w/index.php/Nesdev_Wiki.
В Интернете также есть несколько курсов по программированию для NES.
Я надеюсь, что этот упрощенный обзор дал некоторое представление о разработке игр 80-х годов.
[1] Условно говоря. Кроме того, я предвзят, так как написал сам Graybox примерно на 85% сборки PowerPC. [2] См. Статью FF6: http://www.edge-online.com/features/the-making-of-final-fantasy-vi/.