Spiiin's blog

Asm 65816

Постепенно в дороге дочитал Programmanual - инструкцию от WDC по программированию процессоров 6502/65C02/65802/65816.

Последний является наиболее полной версией 16-битного процессора и установлен в качестве CPU в консоль SNES от Nintendo. Теперь могу реверсить игры для этой платформы ^_^

Наиболее примечательные особенности процессора.

65816 может работать в режиме эмуляции 6502
процессора NES, в котором опкоды новых инструкций игнорируются.

Для выхода из режима эмуляции надо сбросить бит статуса процессора E, недоступный напрямую, но который можно обменять местами с битом переноса C: CLC XCE

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

Это добавляет путаницы при программировании:
LDA $32 - загрузка в A из [банк 0:регистр нулевой страницы:$32]
LDA !$32 - загрузка в A из [банк данных:$0032]
LDA >$32 - загрузка в A из [$00:$0032]

Регистры A,X,Y, в зависимости от флагов статуса процессора m и x.

При этом в зависимости от состояния флага, при непосредственном режиме адресации, одна и та же команда (с одним и тем же опкодом!), может занимать 2 или 3 байта памяти:
LDY #$56 - в режиме 16-битных индексных регистров генерирует опкод A05600 (загрузки в регистр 2 байт).
LDY #$56 - в режиме 8-битных индексных регистров генерирует опкод A056 (загрузка 1 байта).

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

Начало нулевой страницы можно перемещать с помощью регистра нулевой страницы DP.

Да и вообще называется она Direct Page, только непонятно, как это перевести, однако в отличии от других режимов адресации при выходе за 256 байт страницы происходит циклический возврат на её начало (в случае с выходом за границы банка данных произойдёт временное увеличение номера банка).