NES(6502 сборки) Движение спрайтов

В настоящее время я работаю над сборочной игрой для NES(6502), но я не понимаю, как сделать спрайт. Вот как я думаю, что он должен работать:

(loop)
LDA $200 ;will load into the A register the content of address $200,wich contain the Y postion of my sprite
INA ;Increment the A register wich would increment the content of A wich is the Y position of my sprite..?

Однако, кажется, что вы не можете увеличить накопитель регистра A, потому что я получаю ошибку при попытке собрать с инструкцией INA. Так что я немного заблудился в этом. Должен ли я использовать STA вместо LDA? Но я хочу использовать содержимое адреса $200 и не помещать в него значение, которое я выберу. Я не понимаю, как заставить мой спрайт двигаться.

Спасибо!

2 ответа

Там действительно нет INA В наличии имеется вариант 6502, используемый в РЭШ. Вы можете увеличить A по 1, используя следующую пару инструкций:

CLC     ; Clear carry
ADC #1  ; A = A + 1 + carry = A + 1

Или, если любой из регистров индекса свободен, вы можете использовать:

LDX $200  ; or LDY
INX       ; or INY

Имейте в виду, однако, что другие арифметические операции, такие как ADC, SBC, LSRи т. д., не могут быть выполнены на X или же Y,

Если графический чип ищет позицию спрайта в 200 долларов, вам нужно будет записать измененное значение после его вычисления. Если все, что вы хотите сделать, это увеличить его, вы можете сделать это напрямую, используя режим абсолютной адресации: INC:

INC $200

будет увеличивать любое значение, хранящееся в $200, без изменения значений регистра.

Имейте в виду, что обычно игры не редактируют спрайты напрямую. Обычный способ обновления позиции спрайта - сначала обновить позицию объекта, а затем использовать подпрограмму конструктора спрайта для сборки каждого спрайта 8x8 в правильную позицию относительно позиции объекта. У вас может быть таблица со списком всех спрайтов. В списке указывается тайл и относительное смещение для этого спрайта, поэтому вы можете просто добавить его к позиции объекта, чтобы получить позицию спрайта, который вы записываете в следующий свободный слот OAM.

Затем в начале NMI вы используете OAMDMA для копирования "теневого OAM" (обычно на странице 2) в PPU. Игры обычно не используют OAMADDR и OAMDATA, поскольку они могут повредить данные OAM.

Другие вопросы по тегам