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.