RareGame.ru by Sergi
RoboCop
 

Страница посвещена написанию игрового кода для приставок совместимых с NEO GEO

Это т.е. для NEO-GEO AES, MVS и CD версий приставки

Вот аппаратные возможности приставки в плане размера кода:

Поставили точку в графических характеристиках машины - это же игровой автомат, поэтому его настройки экрана не совсем совпадают с обычными настройками обычного телевизора, поэтому были неточности в разрешении приставки.

Разрешение приставки при правильной регулировке экрана (ведь игровые автоматы использовали другие стандарты экрана и даже переворачивали его на бок, чтобы в высоту разрешение было больше чем в ширину - для скрол-шутеров):

  • PAL - 320(up to 352)x256 50 Hz
  • NTSC - 320(up to 352)x224 60 Hz

На экран может выводить одновременно 4096 цветов, но т.к. 2 банка для цветов у машины, то можно их оба использовать и где-то посередине экрана отслеживая горизонтальное прерывание переключить на второй банк и будет 8192 цвета на экране что очень много, обычно использовалось до 256 цветов на экране или даже 64.
При обычных стандартных настройках экрана телевизора разрешение гдето 288x224, хотя в большинстве игр рассчитано на 320(+32 пикселя по 16 с каждой стороны, но разработчики прикрывали края черными квадратами, да и не всегда делали оптимизацию под 50 герц - игры медленно шли). Но если вы решили выжимать все по максимуму, то запросто можете рассчитывать на разрешение экрана в 320(352)x256 на полном серьезе, но телик придется настроить строго под вашу систему, иначе просто не увидите часть изображения. Что сопоставимо с различного рода игровыми системами типа CPS2 или PGM, у которых заявлено 384x224 разрешение.
Чисто в теории думается можно получить и полное разрешение в 384x256 пикселей, т.к. система на строку аппаратно делает 384 пикселя, но этим будет сложно пользоваться.

128 мегабайт графических данных - это квадратики размером 16х16 пикселей каждый из которых весит 128 байт (4 бита на пиксель) - это правда не совсем там прямая адресация, но фактически прямая - 8 мегабайт на 16 страниц, на экране если его нарисовать разными тайлами будет примерно следующее: 320х224 пикселей = 20х16 тайлов = 35840 байт, далее умножаем на 30 кадров в секунду будет 1075200 байт на 1 секунду видео типа AVI или для всего объема памяти графики будет 124 секунды чистого видео, а если не 30 а как обычно 15 кадров то в 2 раза больше т.е. порядка 4 минут видео безо всякого сжатия, а если пожать то в зависимости от качества размер можно уменьшить и в 10 раз, а длительность соответственно раз 10 длинее, в общем колосальные возможности для картриджа просто.

8 мегабайт графических данных но статичного экрана или бэкграунда - это квадратики 8х8 пикселей каждый весит 32 байта (4 бита на пиксель) - ну в этом случае идет переключение страниц на самом деле - каждая страница по 128 килобайт всего, но их может быть 32 страницы запросто (а на самом деле хоть 40х32=1280 страниц, но тогда без этого статичного экрана придется обойтись) - в основном используется этот бэкграунд для текста, ну и иконок, цифорок, жизней и прочей статичной информации на экране

32 мегабайта звуковых голосовых ADPCM данных, при этом 16 мегабайт на 6 звуковых каналов с фиксированной частотой дискретизации 18,5 KHz с максимальной длинной звукового трэка не более 1 мегабайта, и 16 мегабайт для 1 звукового канала с изменяемой частотой дискретизации вплоть до 55,5 KHz и максимальной длинной трэка до 16 мегабайт - фезически это можно просто песню туда вкатить длинной не менее 3-х минут с качеством 48 килогерц, тоже рассчитать можно 48000 раз в секунду умножить на 4 бита на изменение звука (формат ADPCM такой) = 24000 байт в секунду битрейт звукового сэмпла, тогда песня длинной 1 минуту будет весить в 60 раз больше, т.е. 1440000 байт на минуту качественного звучания сэмпла, хоть и в моно режиме и тогда порядка 12 минут может длиться звуковой трэк с этим качеством, если стерео то соответственно в 2 раза меньше, т.к. 2 канала.

256 килобайт программного кода для звукового движка - это FM-сэмплы и SGG- сэмплы, но это тоже через переключение страниц, т.к. на самом деле это 32 килобайта на 8 страниц, либо 64 килобайта минус 2 килобайта сверху, выделенных под оперативу, но уже прямой адресации без маппера - кому как нравиться - в старых играх так используется.

64 гигабайта програмной части, ну тоже на самом деле это 1 мегабайт умноженный на 2^16 страниц, т.е. на самом деле практически безгранично, рядовая крутая игра типа KOF 2000 использует не более 8 мегабайт програмной части, а такие игры типа метал слага и того меньше - 2-5 мегабайт. В общем если вам будет мало из вышеперечисленных возможностей приставки - то вы либо гений, либо у вас руки из задницы растут.

NEO-GEO поддерживала локальную сеть, можно было 2-4 различные приставки объединять в единую сеть и играть соответственно на разных экранах. Объединение происходило обычным стерео-кабелем от наушников, т.к. обмен данными происходил по битам последовательно, при чем ведущей или главной системой была та, у котой номер выпуска был раньше( у всех систем номер приставки вшит в систему).

У домашней консоли AES была возможность подключения только 2-х систем, у аркадных автоматов MVS до 4-х. Кабели втыкались прям в картридж, для чего там был соответсвующий разъем. Требование было обязательно стерео-кабель иметь до 9-ти метров длинной, но для AES на самом деле пойдет и моно-кабель, т.к. задействован только один вывод.

Игры поддерживающие фичу:

  • Riding Hero
  • Trash Rally
  • League Bowling

Сега к примеру всего имеет возможность адресоватся только в пределах 4-х мегабайт, да и то там все вместе и графика, и музыка и сэмплы и програмный код для обоих процессоров, практически тоже и снес - поэтому становится понятным почему NEO-GEO игры такие крутые.

Почему NEO-GEO обладает такими характеристиками?

Да все потому что она активно использует мапперы или так называемый Bankswitching - переключение страниц памяти.

Как и в денди, SNK поставила у своей приставки приоритет не на охрененные вычислительные мощности приставки, а на охрененную возможность адресоваться к практически гигабайтным размерам памяти - кстати она появилась в 1989 году - нехило в те годы было рассуждать о размере памяти в гигабайт, когда жесткие диски имели размер мегабайт 20 и это было очень круто. Даже само название приставки 330 MEGA означает 40 мегабайт не маппируемой памяти, а если мапперы использовать то будет то что перечисленно выше.

Принцип работы любого маппера - да все просто, процессор не может адресовать в случае Z80 больше 64 килобайт памяти, в случае с M68K не более 32 магабайт. Это значит что просто так вы и не сможете больше ничего сделать, а еще нужно управлять портами приставки, а еще память оперативная гдето должна быть в адресном пространстве и другие жизненные системы. В мегадрайве ограничили размер памяти рома 4-мя мегабайтами. Все, выше уже нельзя просто так - только через маппер, но их в нем не использовали. В денди потолок это 32 килобайта PRG часть и 8 килобайт графическая часть, оставшиеся 24 килобайта адресного пространства процессора управляют прочими системами приставки как вывод звука, прорисовка экрана, порты ввода-вывода и прочее.

А как быть дальше если хочется больше? Да просто - назначается или выделяется еще один сигнальный вывод для управления маппером. А маппер это такой регистр в котором сохраняется значение текущей страницы. Т.е. для маппера нужно обязательно наличие свободного управляемого программой вывода и наличие регистра на какое угодно количество бит для сохранения. В качестве управляющего вывода можно использовать либо /WE сигнал к записи, но только если он не занят управлением записи в сейв или графический RAM как у денди. А второй вариант это взять один из выводов из адресации шины данных PRG. Т.е. было 2^15=32768 байт адресное пространство максимальное, а заберем один верхний бит и будет 2^14=16384 байта - в 2 раза меньше, зато будет свободный сигнальный вывод для маппера. И далее если хотим переключить страницу записав в регистр маппера номер страницы. То просто подаем на A14 вывод лог. "1" и это означает обращение к мапперу а не рому. Далее регистр маппера просто подключен к шине данных рома, а значение на нем можно сделать любое, и тогда можно иметь 2^8=256 страниц памяти. Т.е. в конечном итоге у нас будет 16 килобайт умноженное на 256 страниц памяти или 4194304 байт памяти - вот сколько может адресовать та же Денди если сильно нужно. Но таких игр чегото не наблюдается к сожалению. Практически тоже в NEO-GEO сделано, ну за исключением что в некоторых случаях управляющие выводы для маппера специально предусмотрены архитектурой приставки, а в некоторых не предусмотрены - так в случае с программной частью для управления звука или так называемым звуковым движком на Z80 у приставки - там или 64 килобайта прямой адресации или 256 килобайт уже через маппер.

У Денди применялись разные мапперы и конечно по-разному переключают страницы, но принцип всегда один и тотже - это и позволяет китайцам хачить игры с одного на другой маппер, да и не только китайцам.

Вот документ который был сделан самостоятельно, т.к. орегинальный документ или даташит так сказать на японский синтезатор YM2610 как ни странно на японском языке, в этом же документе выписана только та информация которая понятна будет любому разработчику - YM2610 Datasheet

Также имеется не так давно переведенный документ про предыдущий и во многих случаях сходный по характеристикам синтазатор YM2608, в нем более подробное описани функций и как они работают - YM2608 Datasheet

M68K Opcodes

Z80 Opcodes

 А вот уже что получилось при дизасемблировании кода:

Guurin P. asm

NEO-GEO Startup - это уже готовый блок программы начала игры, там отображается логотип и идет заставка с музыкой где вращается NEO-GEO надпись и появляеся снизу в зависимости от контента тайлов неподвижного бэкграунда надпись: MEGA 330 или GIGAPOWER, далее программа зацикливается.

Объясняем здесь как работает, т.к. там возможно непонятно будет или не совсем понятно:

В биосе есть блоки - ну можно сказать подпрограммы которые облегчают работу - в них какие-то системные действия уже заранее прописаны и тогда не нужно самому писать что вы хотите опросить мемку или джойстик, а просто делаете системный вызов в биос:

Вот некоторые из них:

  • $00C00438 - это подпрограмма отображения на экране логотипа NEO-GEO при самом начальном включении приставки
  • $00C00444 - это подпрограмма уже начальной заставки - когда надпись NEO-GEO вращается и появляется надпись MEGA 330 или GIGAPOWER

Проблема что выход из этих подпрограмм не человеческий а через анальное отверстие сделан, вот поэтому тот код который окружает эти вызовы обеспечивает нормальную работу этих служб, если по-другому то может перегружаться постоянно или наоборот не выходить из биоса, а тут уже все готовое - после этих вхождений в биос программа позволяет дальше уже исполнять нужный код.

Главная деталь при написании кода для NEO-GEO, помните что вам не принадлежит весь машинный цикл программы, ну это в эмуляторе можно написать код, а эмулятор уже исполнет в лучшем виде, машина имеет кучу аппаратных прерываний - это когда в процессе исполнения кода происходит прерывание и машина ложит хрен на ваш код и идет исполнять сначала то что вызвало прерывание, а уже потом продолжает исполнять ваш код и то если найдет его, а может и не найти кстати.

По крайней мере известны 2 прерывания именно для M68K процессора в NEO-GEO: VBlank (IRQ4), HBlank (IRQ2), всего их 4 прерывания, но пока только про эти.
Собственно это прерывание вызванное обновлением кадра - кадровая синхронизаций, в течении которой программа проверяет а не отображается ли сейчас логотип NEO-GEO, возникающий при первоначальном запуске программы и если нет то тогда возвращается обратно, обычно перед возвращением еще производятся некоторые пометки в память о том что прерывание было.

И второе прерывание это строковое - строковая синхронизация - обычно не используется, а если и нужно то для определения текущего положения луча по строке - для световых пистолетов это нужно.

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

За один кадр NEO-GEO способна обновить все спрайты по графике, но к сожалению только половину палитр - т.е. только 128 палитр из 256. Что к сожалению ограничивает возможности по обновлению всего изображения на экране если оно использует большую часть палитр.

Но тем не менее, т.к. обычно палитры загружаются предварительно и не меняются по ходу то можно сказать что обновить можно на экране что угодно.
Одновременно за 1 кадр NEO-GEO способна отрисовать 96 спрайтов на строку, больше не получится. Ну а так все 381 спрайт разумеется доступны если сможете их расположить правильно на экране, при этом нужно помнить что спрайт это не квадратик, а вертикальная полоска ВСЕГДА, но просто от того какими тайлами она заполнена - так и выглядит на экране, это может быть 7 тайлов, это может быть 14 тайлов, максимально это 32 тайла.

Собственно для создания своей игры вам не понадобится больше 96 спрайтов на экране - это уже охрененно много, бэкграунд можно отрисовать 18-20 спрайтами, да и каждый персонаж может быть те же 20 спрайтов - т.е. во весь экран, но т.к. обычно действующих персонажей на экране либо не так много при таком размере либо они явно меньше, то вписаться в 96 спрайтов не сложно. При этом разумеется масштабировать можно как угодно любой из объектов.

В NEO-GEO как таковая речь не ведется о спрайтах и бэкграунде - тут речь ведется всегда об ОБЪЕКТАХ, объект это либо персонаж, либо бэкграунд. Просто их размер и порядок следования на экране определяют их месторасположение друг над другом и создается впечатление единого целого.

На один объект обычно не тратится более 16 цветов - это можно увидеть в любой игре, даже меньше тратят, т.к. сложно человеку рисовать и придумывать более цветастые картинки. Тоже самое можно увидеть и в той же сеге и той же супернинтендо - в Mortal Kombat абсолютно тоже самое - каждые герой это 16 цветов, один из которых прозрачный. Бэкграунд это еще 16 цветов, ну т.к. их там несколько то по 2 палитры на бэкграунд и по палитре на персонаж, в NEO-GEO можно назначить любому объекту свою палитру или несколько палитр если кто исхитрится применить 2 палитры или более на одном объекте, но это сложно довольно, так изголялись только на Денди когда нужно было главному персонажу иметь более 4-х цветов - пример в Duck Tales Скрудж использует 3 палитры, а четвертая для противников, хотя они же могут использовать те же палитры что и Скрудж.

Но в любом случае не обольщаятесь, сделать на персонаж более 16 цветов это анриал - ни один Donkey Kong или Killer Instinkt не использует больше 16 - этого больше чем достаточно, да и в играх NEO-GEO обычно даже по 8 цветов на персонаж выделяли - ну чтобы не перегружать палитры видать.

Еще раз про графическую систему - как уже более высокотехнологичная приставка, NEO-GEO уже отходит от привычного понятия спрайт и приходит к более удобному понятию ОБЪЕКТ. Собственно что за зверь - как известно в мегадрайве или в денди, да и в супернинтендо имеются отдельные бэкграунды и отдельные спрайты, что они делают - они формирую картинку на экране как мультфильм, есть фон и на него накладываются уже картинки, которые потом меняются создавая иллюзию движения объектов на фоне, а сам фон как таковой не меняется, просто он может двигаться в разные стороны. NEO-GEO решила проблему простым способом - отказалась от фона и от спрайтов и оставила только спрайты, но их можно объединять в огромные куски изображения - буквально 1 спрайт может быть величиной по горизонтали в 16 пикселей, а по вертикали 512 пикселей, при этом сами спрайты можно объединять в так называемые спарки - делаются т.е. монолитные прямоугольные блоки, где спрайты спарены друг с другом и упрявляются уже они не каждый в отдельности, а как единый блок и на него же распространяется масштабирование. Т.е. вы создаете объект размером в 288x224 пикселей или в 18 спрайтов в котором по 14 тайлов, то получаете бэкграунд, при чем не абы какой, а КАЖДЫЙ ТАЙЛ в нем размером 16х16 может иметь свои уникальные 16 цветов(первый это черный или прозрачный), да мало того еще можно их назначить автоматически переключаться без участия процессора - автоанимация (4 или 8 картинок будут переключаться последовательно) и к тому же можно буквально без каких либо затрат процессора в плане загонки в видеопамять менять тайлы на любые из доступных 128 мегабайт, размер тайла при этом всеголишь128 байт. Таким образом получается единый динамичный, способный масштабироваться и меняться буквально целиком или каждым тайлов в отдельности объект, разумеется перемещаться по экрану и при этом все это осуществляется за микросекунды, врядли на такое способны даже современные приставки.

Так как масштабирование объекта возможно с 16 до 1 пикселя, т.е. полный размер это F, а 1 это самый маленький, и учитывая что объект может состоять буквально хоть из всех 381 спрайтов в длинну и в 64 тайла в ширину(высоту), то получается очень широкий спект масштабирования, с учетом реального изображения на экране 288х224 это если масштаб спрайтов сделать 4х4 пикселя то всеравно будет еще данный объект закрывать собой экран. Поэтому масштабировать можно что угодно и как угодно и менять на бэкграунде что угодно на что угодно - это дает динамичный бэкграунд который меняется и переделывается постоянно что видно в таких играх как Metal Slug.

Ну а по поводу количества спрайтов - да всего на экране может быть 381 спрайт, самый первый спрайт он постоянно рисуется поверх других, а остальные в порядке живой очереди с 1 по 380 закрывают предыдущие собой - это типа аппаратный Z-буффер, его можно регулировать и переназначать, но это довольно накладно, поэтому проще даже каждый раз определять объекты их расположение и назначать номер соответствующего спрайта с которого нужно отрисовать объект на экране, ну разумеется бэкграунд имеет начальные спрайты, а уже персонажи последующие. Но к сожалению не отрисовывается на линию больше чем 96 спрайтов, если больше то как и в денди или в сеге это приводит к пропаданию кусков изображения или их мерцанию, графическая система не успевает их отрисовывать. Но как уже было сказано, на бэкграунд можно использовать 20-40 спрайтов, а оставшиеся 56 на персонажей и взрывы, ну если предполагается что они будут находится на одной экранной линии, если не, то там уже всеравно хоть все 380. спрайтов. В среднем на персонажа тратится не более 8 спрайтов, и то это уже буквально пол-экрана, поэтому 6-7 одновременно находящихся на экране персонажей удовлетворят вас во всех отношениях. 

Далее вот папку выкладываем там разные демки с сорсами и доки по программированию для NEO-GEO, это должно помочь вам, есть такие полезные доки как neogeo_spex.pdf и mvstech.txt - NEO-GEO Programming

Еще тут начали ковырять BIOS для NEO-GEO, ну нужно по-хорошему знать все системные вызовы, ими пользуются в программе игры довольно часто, а точно не известно куда чего они ложат и что выполняют - BIOS Disasm

Вот формат представления графических данных для Fix Layer - NEO-GEO Fix Layer Format
Вот формат представления графических данных для Sprite Tile - NEO-GEO Sprite Tile Format

А вот формат данных находящихся и сохраняющихся на меморикарте приставки - NEO-GEO Memcard Data Format

NEO-GEO BIOS Calls


Требуется зарплатодатель.
Работодателей просьба не беспокоить.