Начал "портировать" игру River Raid для УКНЦ.
Изначально была небольшая тестовая демка со скроллингом 50fps для проверки нормального конвертирования/отображения видеосигнала компьютера на современном видеомониторе/ТВ. Просто фигурки скроллились вниз и проверял плавность отображения.
Через какое-то время стало занятно сделать рандомные берега "речки" как в игре River Raid. А потом добавил кораблики и т.д...
Ради истории:
Оригинал вышел в далеком 1982 году на "приставке" Atari 2600. От игры есть разобранный с комментариями код под вариант процессора MOS 6502 и TIA чип этого Atari. (https://github.com/johnidm/asm-atari.../RiverRaid.asm). Вся игра в оригинале занимает 4 килобайта и довольствуется кажется 128-ю байтами ОЗУ.
Теоретически ее алгоритм формирования "берега речки" и прочего (кроме отображения/звука/хардварный check collision) можно портировать. Правда это будет некоторый гимор (команды типа SBC байтовые и прочая байтовая арифметика и работа с флагами).
Я не стал заморачиваться с портом, взял общую концепцию (и своровал некоторые спрайты). Поэтому у меня игра занимает вовсе не 4 килобайта, а целый вагон килобайт (прешифтованные спрайты, тупой код и т.д.)
Управление:
В принципе в самое игре описано.
Из того что не описано - К2 сделает рестарт с показом дебаговых циферок. Левая binary - скан коды кнопок нажатия и отжатия. Две циферки посредине - некоторое значение в у.е. процессорного времени по CPU и PPU которое осталось "лишним" до очередного прерывания вертикальной развертки экрана. Также по К2 самолет перестает "умирать". Можно использовать как тест 50Гц скроллинга пока настраивается телевизор. (еще раз К2 - возврат к "нормальной" игре)
Игрушка понемногу доделывается и осталось:
- багов еще добавить
- ускорение (стрелка вверх)
- мосты (не знаю важны-ли.. похоже не добавлю)
Вопросы на которые сразу можно ответить:
- Почему игра не полноцветная? Даже 8-ми цветов нет! Не то что 128...
+ (для предыдущей игры Krakout то-же самое) Мне лень заморачиваться с фреймбуферами, палитрами на каждую строку и рисовать лишнее в PPU. Бит в плане-0 который рисует только PPU всегда белого цвета чтобы не влиять на планы 1/2. Поэтому кроме белого остается 4 цвета. Я выбрал цвета те .. которые выбрал. 5 цветов (включая белый и черный, увы).
- Самолет "тормозит" на поворотах, но если держать кнопки и не отпускать - скорость на максимуме
+ "Ориджинал код" уж насколько смог его портировать с переносом байтовых операций. На оригинале атари самолет будет гонзать вправо влево примерно так-же (чуть иначе, но я постарался скопировать поведение). Единственно что не скопировано - даже при самом мелком нажатии вправо/влево на атари - самолет будет двигаться хотя-бы на один пиксель - у меня это нереализовано, поэтому "инерция"
- Ракеты в ориджинал могли быть "самонаводящиеся" (X-ракеты соответствует X-самолета)
+ Усложнил геймплей на УКНЦ, сделать можно, не вижу смысла, это скорее демо чем игра
Технически:
RIV.SAV банальный лоадер который считывает файл RIVBIN.DAT в котором код для двух процессоров. Сначала записывает его в планы ВОЗУ скрыв отображение. Потом раскидывает по двум процессорам и запускает вычистив все что было там до этого. Процессоры общаются между собой через команды CPU -> PPU без использования байтовых каналов обмена и прерываний. Тупо по ячейкам памяти CPU и по ожиданиям в циклах. Видеопамять скидывается на адреса >=100000 CPU (два плана) и >=40000 PPU план 0. Туда они и рисуют немного пожертвовав (сильно пожертвовав) доступным ОЗУ для исполнения кода. (спасибо соседнему треду, не знал что так можно). Но поскольку разрешение 320х288 - то вроде как не сильно критична потеря ОЗУ для исполняемого кода. Тем-более что оригинальное ВОЗУ можно использовать и дальше под прешифт спрайтов on-demand и видеобуфера в этой игре ненужные (игра очень маленькая) и т.д.
Поведение в эмуляторах:
UKNCBTL - не слишком парится с vsync и выдает 25 кадров/с (примерно). У вертолета не будет "вращаться винт". Также некоторые ноты музыки звучат "кривовато".
EmuStudio - в плане vsync получше, хотя странным образом скушало/размножило нижние стро.. UPD: Titus прояснил ситуацию, надо нажать LShift+Del
(на реальной УКНЦ вроде более-менее)
Сама игра и ее исходники:
(для компиляции исходников нужно будет доложить php и rt11.exe которые по понятным причинам я не добавляю. Компиляется последовательно 0_.. 1_.. 2_.. 3_... bat. Думаю программист быстро разберется. За код не ругать плз.)
uknc_river_src.zip
Для игры взять оттуда riv.dsk, в нем старт игры прописан в автозагрузке, сама игра это два файла RIV.SAV, RIVBIN.DAT которые внутри riv.dsk находятся.