spiiin: (2D)
На основе конфигов Ti_ научился вставлять в ROM игры ассемблированные кусочки кода.
1. В качестве базового исходника можно копировать куски реверсированного кода из IDA.
2. Ассемблер 6502 - Asm6. Для сборки надо указать директивой .ORG место, в которое будет вставлен код (относительно адресного пространства процессора). Если собирается не целый банк, то в исходник дополнительно нужно будет скопировать из IDA имена переменных и меток.
3. После копирования кода рекомендуется собрать его для того, чтобы убедиться, чтобы он бинарно совпадает с кодом из ROM. В случае ошибок, проверить, что с помощью .ORG выставлен правильный адрес (правильный адрес можно проверить, загрузив ром в эмулятор и найти, по какому адресу будет загружен банк с кодом, или просто рассчитать его на основании адреса в роме и данных о маппере игры). Дальше можно переписывать код, в случае сборки отдельных кусков также надо следить за тем, чтобы не увеличить его размер.
4. Собранный бинарник нужно вставить в ром. asm6 для этого не годится, потому что он не умеет отмерять смещения больше FFFF (хотя судя по исходникам вроде должен), но для вставки одного бинарника в другой можно использовать любой другой инструмент, например, ассемблер сеги ASM68K.

Такой подход даёт:
модульность - разбиваем код и данные на части.
удобный контроль версий - текстовые файлы удобно диффить и хранить изменения.
навешивание тестовых скриптов для проверки целостности результата.
комментирование кода - без комментариев.

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

Для теста сделал пару конфигов на основе старых реверсов:

Выдернутая функция поведения для робота-стража из Чёрного Плаща - теперь не сторожит территорию, а сразу атакует ЧП.
Список позиций объектов для первого уровня Чипа и Дейла 2 - и измененная версия на основе хака врагов Roket'а.
Ну и потом еще переделаю на такой конфиг lua-скрипт для врагов New Ghostbusters 2.
Tags:
Sep. 6th, 2013 12:29 am

Asm 65816

spiiin: (2D)
Постепенно в дороге дочитал Programmanual - инструкцию от WDC по программированию процессоров 6502/65C02/65802/65816. Последний является наиболее полной версией 16-битного процессора и установлен в качестве CPU в консоль SNES от Nintendo. Теперь могу реверсить игры для этой платформы ^_^

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

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


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

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

4. Начало нулевой страницы можно перемещать с помощью регистра нулевой страницы DP (да и вообще называется она Direct Page, только непонятно, как это перевести), однако в отличии от других режимов адресации при выходе за 256 байт страницы происходит циклический возврат на её начало (в случае с выходом за границы банка данных произойдёт временное увеличение номера банка).
Tags:
spiiin: (Default)
https://github.com/jmechner/Prince-of-Persia-Apple-II
Кто еще не знает - автор Принца Персии нашёл исходники и выложил их. Написаны на асме 6502. Как будет время, сделаю по ним реверс NES-версии, язык то один и тот же.
Tags:
spiiin: (Default)
Инфа по процессорам Motorola 68000 и WDC 65816, управляющих приставками Sega Mega Drive и Super Nintendo
Tags:
spiiin: (Default)
Нашел редкую на просторах интернетов книгу:
Морер У. - Язык Ассемблера для персональных компьютеров ЭПЛ

Асм для процессора 6502 ^_^ . Того самого, что стоит здесь:
bender
здесь:

и здесь:


В книге есть главы, посвященные Apple Disk Operating System и ассемблеру LISA, они интереса не представляют, в отличие от разделов собственно о программировании и процессоре (статьи 1-32, 50-64, 67-68, 74-80).
Tags:
spiiin: (Default)
Нашел на винте скачанные когда-то доки и тулзы к приставке Nintendo Entertaiment System aka Денди.
Среди них был и ассемблер. Захотелось чего-нибудь написать попробовать на нем.

Read more... )
Tags:

Profile

spiiin: (Default)
spiiin

July 2017

S M T W T F S
      1
2345 678
9101112131415
16171819202122
23242526272829
3031     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 24th, 2017 06:43 am
Powered by Dreamwidth Studios