Здравствуйте! Это вводная статья для тех кто хотел бы создать свою игру для приставки nes более известную у нас как dendy. На этом канале будут выходить не только статьи о программирование на ассемблере 6502 но и разбор тех или иных фишек игр.
Когда начинаешь программировать на ассемблере для денди, то сначала возникает вопрос а какая парадигма в разработке? И в отличие от высокоуровневых языков ассемблер работает напрямую с железом приставки которое состоит из:
- PPU - pictures processor unit - графический процессор
- CPU - central processor unit - центральный процессор
- APU - audio processor unit - аудиопроцессор (модулятор частоты)
- DMA - ввод/вывод джойстики модуляция видео сигнала
Что бы до конца понимать как все работает надо рассмотреть устройство простейшего картриджа без использования маппера (микросхемы которая переключает участки памяти картриджа). Картридж сам по себе это ПЗУ, хотя по смыслу больше похож на ОЗУ, так как современные программы по факту загружают свой код в ОЗУ и процессор уже читает этот код из оперативной памяти и выполняет его. Картридж как раз содержит этот участок кода постоянно, и процессор непосредственно читает код с него. В состав картриджа входит всего две микросхемы:
- PRG память - там где храниться код
- CHR память - память графического процессора
Для понимания сам разъем картриджа это по факту набор 8 битных портов с лева для кода с права для графики, если на ножке контакта есть напряжение значит бит равен 1 если нет соответственно 0. Таким образом процессор может считывать данные с картриджа.
Обычно chr содержит 8кб памяти и в нем вшит 2-е обычные 3 цветные bitmap картинки с разрешением 256х256 точек. В свою очередь изображение разбито на спрайты по 8х8 пикселя. первый набор изображения содержит спрайты, второй фон. Но может быть и наоборот это определяется программно. К примеру приведу chr из игры super mario bros
PRG содержит собственно программный код. Который непосредственно говорит процессору возьми картинку 8х8 из графики и отрисуй его в фоне, или же нарисуй спрайт. И собственно это вся логика кода, вычислить что будет в кадре и отрисовать. И это базовая логика разработки игры на денди, вычислить и отрисовать в определенном кадре.
Под капотом игры существует несколько векторов прерывания, это собственно некие тригеры по которым отрабатывает код, часто используемые это
- RESET - этот участок кода запускается при загрузке
- NMI - запускается каждый раз при отрисовки кадра, таких кадров возьмем 60 потому что частота отличается в зависимости PAL или NTSC система развертки.
Наверное вы задаетесь вопросом почему ассемблер а не си ведь есть программный комплекс cc65 способный транслировать код си в ассемблер? Ответ прост, платформа очень ограниченна, только представьте 8кб графики и 8 кб кода. По этому каждый байт на вес золота, а си транслирует не в оптимизированный код. При этом сам ассемблер транслируется в машинные коды (по сути каждая команда это набор бит) к примеру LDA #$10 в машинном коде будет выглядеть так $A9 $10 , об этом мы чуть позже поговорим.
Немного об особенностях, нету деления и умножения максимум умножить/разделить на 2 путем смещения в лево либо в право.
В качестве заключения Я разрабатываю игру вы ее можете скачать и попробовать запустить в эмуляторе вот ссылка https://disk.yandex.ru/d/LHm2Gs7pMP0Kvw .
В конце ознакомительной статьи хочу сказать что у меня есть:
- telegram - https://t.me/dendydevelop
- Донаты donationalert - https://www.donationalerts.com/r/nesdeveloper
- Донаты yoomoney - https://yoomoney.ru/fundraise/3tjwOQQwKPk.230209