Постепенно в дороге дочитал 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 байт страницы происходит циклический возврат на её начало (в случае с выходом за границы банка данных произойдёт временное увеличение номера банка).