Автор Тема: Вопросы по дизазму SNES  (Прочитано 1451 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« : 24 Декабрь 2020, 16:12:30 »
Привет всем,

у меня есть множество вопросов по дизазму снес. В частности, по поводу выхлопа IDA:
95 00       STA     D, word_7E0000, XЧто делает данная инструкция? Судя по другим дизассемблерам, 95 00 декодируются не так. Или я ошибаюсь?

Добавлено позже:
Судя по всему, выхлоп должен быть:
sta $00,X
« Последнее редактирование: 24 Декабрь 2020, 16:26:05 от DrMefistO »

Оффлайн Nemesis_c

  • Пользователь
  • Сообщений: 1341
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #1 : 24 Декабрь 2020, 16:26:52 »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #2 : 24 Декабрь 2020, 16:34:03 »
Nemesis_c, не, это не викинги:) это Thunder Spirits:) Викинги пока в долгом ящике. До лучших времён:)

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #3 : 24 Декабрь 2020, 17:04:16 »
есть три типа адресации:
1. с полным 24-битным офсетом DDDD BB, который однозначно определяет офсет без альтернативы
2. сокращенная 16-битная, где старшая часть в 8-бит берется из ДАТА БАНК регистра.
3. короткая 8-битная, что-то вроде ЗЕРО ПЕЙДЖ, но до полного 24-битного офсета дополняется из ДИРЕКТ ДАТА регистра, он 16-битный.

вот этот вот опкод STA     D, word_7E0000, X, это значит офсет 00 дополняется текущим значением регистра ДРЕКТ ПЕЙДЖ (и он скорее всего 0000, как ида продедуктирует). а адрес 000000 - это в карте памяти окно в 8 кило с миррором озу, которая логически сидит на 7Е0000, потому ида ее дедуктирует.

программа может путем стековых манипуляций засовывать в ДИРЕКТ другие офсеты, и ида уже обкакается жидко, куда ее направлять, а все офсеты будут в 7Е0000 по умолчанию

вот потому, при дизасме снеса надо знать где и когда какое значение у регистров ДАТА БАНК и ДИРЕКТ ПЕЙЖ.

их можно в частных случаях сдедуктировать, когда они явно задаются вначале каждой функции (типа PEA 7E7E; PLB / PLD) но часто они задаются где-то много выше по дереву вызов и найти это сложнее, тем более найти для всех веток от верхнего узла. лодырь в иде очень примитивненький. он тупо по коду вверх трассирует опкоды и скажем пару PHA PHA PLB PLB уже не умеет трейсить.

бывает на этом дирест регистре делают скажем обработчики объектов, только на денди если офсет каждого объекта дается в каком-нибудь индексном регистре, то тут они могут один и тот же код использовать на разные блоки объектов путем просто смены ДИРЕКТ ПЕЙДЖА и в коде без рилтаймового трейса еще сложнее найти и отдизасмить правильно.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #4 : 24 Декабрь 2020, 17:06:20 »
Но у иды же неправильный выхлоп дизазма. Он не соберётся ничем.

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #5 : 24 Декабрь 2020, 17:10:12 »
я четно говоря сам еще не до конца разобрался с этой тряхомудией, чего вот этот директ пейдж может адресовать, а чего нет... не наработал статистики лол

Добавлено позже:
Но у иды же неправильный выхлоп дизазма. Он не соберётся ничем.
я не проверял, но все можно поправить и сконвертить. у меня пока такой задачи не стояло, так что не особо актуально. главное, чтобы было понятно, какой опкод и что он делает. 95 00 - это именно что STA D,X, а не  STA 00,X например.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #6 : 24 Декабрь 2020, 17:12:43 »
я четно говоря сам еще не до конца разобрался с этой тряхомудией, чего вот этот директ пейдж может адресовать, а чего нет... не наработал статистики лол
Вот та же фигня. Просто я думаю, может поправить исходники проц-модуля (они в SDK есть), чтобы выдавало корректный выхлоп. Кстати, Dispel выдаёт как раз корректный: https://github.com/pelrun/Dispel
А то получается нихрена не понятный листинг.

Вот ещё пример (хрен поймёшь, как JUMP тут работает в понимании Иды):
.80:8216             Native_mode_NMI:
.80:8216 08          PHP                     ; Push processor status
.80:8217 C2 20       REP     #$20 ; ' '      ; Reset status bits
.80:8219 48          PHA                     ; Push A
.80:821A 4B          PHK                     ; Push K (program bank register)
.80:821B A9 21 82    LDA     #$8221          ; Load A from memory
.80:821E 48          PHA                     ; Push A
.80:821F DC 0D 00    JMP     [word_7E000C+1] ; Jump
.80:821F             ; End of function Native_mode_NMI

Добавлено позже:
95 00 - это именно что STA D,X, а не  STA 00,X например.
Другие дизазмы тоже говорят, что sta $00,X
Добавлено позже:
Например: http://oxyron.de/html/opcodes816.html
« Последнее редактирование: 24 Декабрь 2020, 17:24:40 от DrMefistO »

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #7 : 24 Декабрь 2020, 17:40:24 »
другие дизасмы говорят ерунду. главное, какой финальный адрес операнда у этой команды с т.з. процессора. а он будет либо 00000, либо 7Е0000, что есть один и тот же байт в ОЗУ снеса. лодырь иды просто пытается придать этому сразу человеческий вид. врядли в сорсах люди писали "00,Х" а потом вспоминали бы, что куда там ссылается у них.

я пока не проверял, но вижу по некоторым сорсам старых игорей, что возможно снесовый асм автоматом сам оптимизирует какие опкоды делать в зависимости от офсета, а ты можешь всегда указать в коде программы STA ASS,X даже не заботясь, какой тебе опкод асм сгенерит.

Добавлено позже:
Например: http://oxyron.de/html/opcodes816.html
по этой ссылке опкод пишется как "STA dpx" лол т.е. с регистром DP - директ пейдж

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

кстати, у идового модуля проца для снеса пять вариантов форматов дизасма, по умолчанию стоит "CA65" и видимо он какраз такую нотацию понимает. попробуй остальные четыре. обычно, у лодырей всегда больше одного вида дизасма для разных таргетов.
« Последнее редактирование: 24 Декабрь 2020, 17:51:19 от CaH4e3 »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #8 : 24 Декабрь 2020, 18:18:02 »
попробуй остальные четыре
Да уже попробовал. Разница лишь в выводе хексов, считай.

Добавлено позже:
В общем, мне важно соответствие оригинальному азму. Чем точнее, тем лучше.

Оффлайн UnderCrops

  • Пользователь
  • Сообщений: 326
  • Пол: Мужской
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #9 : 24 Декабрь 2020, 19:58:29 »
Привет всем,

у меня есть множество вопросов по дизазму снес. В частности, по поводу выхлопа IDA:
95 00       STA     D, word_7E0000, XЧто делает данная инструкция? Судя по другим дизассемблерам, 95 00 декодируются не так. Или я ошибаюсь?

Добавлено позже:
Судя по всему, выхлоп должен быть:
sta $00,X
Если ты сам пишешь лодера, то можно STA     D, word_7E0000, X заменить на STA dword_7E0000,X, например. Санчез, наверное, уже расписал про все это (но мне в лом читать). Рам лежит или в 7Е0000 или в 7F0000 (в зависимости от DB. но если банков не больше 64 (кажется), то только в 7Е0000). А банки в 800000+ .

То есть, не лодер, а тип процессора.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #10 : 24 Декабрь 2020, 20:14:14 »
UnderCrops, а как в исходниках игр делается? Если можно, то с примерами. Просто, там же нет инструкций в формате как у иды? Нету, и ни один азм такое не соберёт.

Оффлайн UnderCrops

  • Пользователь
  • Сообщений: 326
  • Пол: Мужской
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #11 : 24 Декабрь 2020, 20:29:49 »
В лс ответил.

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #12 : 25 Декабрь 2020, 11:15:40 »
мнемоники опкодов и их формат - это специфическая часть какого-то конкретного ассемблера. могут быть некоторые стандарты на наименование опкодов, но всякие там спецсимволы - это каждый ассемблер может делать как хочет. и запись мнемоники зависит от того, какой ты ассемблер возьмешь. вот это STA D,LABEL,X не более чем идентификатор, явно указывающий ассемблеру, какой именно опкод генерировать. при использовании STA LABEL,X тупой ассемблер может в лучшем случае генерить 16-битные опкоды, так что ему надо указывать иногда, какой конкретно опкод ты хочешь.

вот у https://bisqwit.iki.fi/source/snescom.html#opsize этого ассемблера, эти модификаторы ставятся перед лейблом и могут быть "!", "@" и просто #. на таком асме написан F-ZERO.

в исохдниках, которые я тебе дал, почти везде (я покрайне мере навскидку не нашел), используется тупо "STA LABEL,X" везде, но в листингах бывают и 24-битные и 16-битные опкоды сгенерены. т.е. там все отдано на откуп только ассемблеру.

ну как пример, мой любмый DASM для денди, сам определяет, 16-битный операнд или 8-битный ставить в зависимости от записи числа или просто от его размера - все, что меньше 256, будет в 8-битный операнд сгенерено по умолчанию. но иногда тебе надо 16битный опкод явно там, где операнд меньше 256, тогда ты ставишь STA.W LABEL,X и это специфика этого конкретного ассемблера, причем ида такого синтаксиса конечно же не знает и кстати вообще не отражает в опкодах размер операндов по умолчанию, что иногда дает глюки при пересборке, потому что порой некоторые игры на денди написаны как-то вручную и там рандомно могут встречаться 16-битные операнды, там, где можно и надо ставить 8-битные.

в общем, если сделать в иде асмовый файл и потом удалить "D," по всему тексту, ты получишь код, который съест любой ассемблер. (кстати, ида генерит опять же для денди опкоды свдигов с явным операндом А всегда, хотя это не характерно для обычных асмов, которые подразумевают, что А там всегда и его просто не воспринимают - т.е. опкод вообще везде обычно без операнда, а тут он как бы есть!)

Добавлено позже:
короче конкретный пример. игра F-ZERO

оригинальный код:
;=============== Check pass word =======================================
Check_passwd200
LDY   #0004H
Check_passwd210
LDA   !Pass_word_data,Y
CMP   >Backup_RAM,X
BNE   Check_passwd300     ; different pass word
DEX
DEY
BPL   Check_passwd210
;-----------------------------------------------------------------------
INC   <param0
RTS
;
;=============== Copy pass word ========================================
Check_passwd300
Check_passwd310
LDA   !Pass_word_data,Y
STA   >Backup_RAM,X
DEX
DEY
BPL   Check_passwd310
RTS

дизасм иды

.A8
.I16

; =============== S U B R O U T I N E =======================================
sub_82C4E9:
LDY #4
loc_82C4EC:
LDA aFzero, Y
CMP byte_700000, X
BNE loc_82C4FC
DEX
DEY
BPL loc_82C4EC
INC D, word_7E00F8
RTS
; ---------------------------------------------------------------------------
loc_82C4FC:
LDA aFzero, Y
STA byte_700000, X
DEX
DEY
BPL loc_82C4FC
RTS
; End of function sub_82C4E9

смотрим внимательно. в асме       

LDA     !Pass_word_data,Y
CMP     >Backup_RAM,X

разного размера операнды - ! - 16-битный, > - полный 24-битный.

в иде между ними нет разницы, только по хексу можно посмотреть, какого размера операнд

в иде
INC   D, word_7E00F8   
в асме
INC     <param0

т.е. модификатор 8-битного операнда - <.
автозамена "D," на "<" дает тебе ассемблируемый код при условии, что асм сам определит, какие опкоды сделать 16, а какие 24битными (а он сможет, если будет знать, какой текущий банк данных используется)

в данном конкретном случае, банк кода 82, а банк данных 00, т.е. для программы ниже 8000 адреса - это банк программы 80. значит 16-битный операнд будет из 82 банка ссылаться всегда в 80. а вот офсет бекаповой рамы в банке 70 он уже не достанет. так что 24-битный офсет указан явно программистом.
« Последнее редактирование: 25 Декабрь 2020, 11:44:43 от CaH4e3 »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #13 : 25 Декабрь 2020, 17:31:21 »
Немного разобрался. В общем, ида плохо следит за регистрами DB и PB и везде выставляет банк 0x7E. Из-за этого кривые адреса рефов. Лучше проставить самому.

Оффлайн UnderCrops

  • Пользователь
  • Сообщений: 326
  • Пол: Мужской
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #14 : 25 Декабрь 2020, 20:46:30 »
автозамена "D," на "<"Сюда можно еще попробовать прилепить макросы, если компилятор знает, что это такое.

Добавлено позже:
Кстати, есть еще одна проблема. ИДА, вроде как, определяет 8ми или 16ти битные режимы с помощью SEP и REP. Но если прыжок был совершен из другого места, ИДА может не правильно определить режим. Тут можно как раз и использовать Alt+G, потом (M для аккумулятора, X для индексных регистров) и напиши значение 1 (для 8 битного режима) или 0 (для 16 битного режима), про который я тебе писал, DrMefistO. Но опять же, весь код перебирать будет очень сложно. Я думаю, тут надо чтобы эмулятор писал дату логгер (как фсеух для НЭС, например) или чтобы снэсовский проц в ИДАе мог отслеживать это самостоятельно.
« Последнее редактирование: 25 Декабрь 2020, 20:56:58 от UnderCrops »

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #15 : 25 Декабрь 2020, 21:24:17 »
Кстати, есть еще одна проблема. ИДА, вроде как, определяет 8ми или 16ти битные режимы с помощью SEP и REP. Но если прыжок был совершен из другого места, ИДА может не правильно определить режим. Тут можно как раз и использовать Alt+G, потом (M для аккумулятора, X для индексных регистров) и напиши значение 1 (для 8 битного режима) или 0 (для 16 битного режима), про который я тебе писал, DrMefistO. Но опять же, весь код перебирать будет очень сложно. Я думаю, тут надо чтобы эмулятор писал дату логгер (как фсеух для НЭС, например) или чтобы снэсовский проц в ИДАе мог отслеживать это самостоятельно.
У меня планируется следить за банками и режимом во время отладки и применение этого на базу.

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #16 : 27 Декабрь 2020, 16:28:54 »
Я думаю, тут надо чтобы эмулятор писал дату логгер (как фсеух для НЭС, например) или чтобы снэсовский проц в ИДАе мог отслеживать это самостоятельно.

BSNES core BizHawk давно это делает, и себе я давно соответствующие скрипты написал. а так как я не дождался пока снес дизасма в иде лол, то попросил и вп и бд регистры логировать в бизхоке. в общем лично я могу сейчас любой снес на 95 процентов отдизасмить без сбоев по коду автоматом в один проход хех

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #17 : 28 Декабрь 2020, 16:45:53 »
Я бы заюзал бснес, но он такой говённый в плане исходников, что чертовски бесит.

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #18 : 29 Декабрь 2020, 20:29:59 »
я его пользую только потому, что в бизхоке именно к нему прикрутили основные функции дебага и логгера, а остальные ядра только подхукали базово, ничего больше к ним не прикрутив.

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

я бы не стал его советовать прямо вот для использования как базы для снесиды.

Добавлено позже:
чертовски бесит.
что характерно, "бывший" автор (дада, он "ушел из эмуляции" в очередной раз) всегда в преимуществах своего стиля кодописания указывал, что он у него "читаемый" и "интуитивно понятный". ну т.е. вместо какой-то там конструкции, которая бы быстро вычисляла какой-то параметр, он всегда предпочтет пятиэтажную трехслойную иф зен елз конструкцию, которую можно "читать как по английски" хех

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #19 : 29 Декабрь 2020, 20:42:30 »
что характерно, "бывший" автор (дада, он "ушел из эмуляции" в очередной раз) всегда в преимуществах своего стиля кодописания указывал, что он у него "читаемый" и "интуитивно понятный". ну т.е. вместо какой-то там конструкции, которая бы быстро вычисляла какой-то параметр, он всегда предпочтет пятиэтажную трехслойную иф зен елз конструкцию, которую можно "читать как по английски" хех
Поясню: есть нормальный кодинг, когда cpp, hpp самодостаточные, тупо взял компайл и он сбилдился, а есть как в bsnes и иде: инклуды cpp файлов прямо в другие hpp/cpp файлы, и без кроме как полного билда одиночные файлы не собрать.

Я пытался всё это барахло затащить в Visual Studio, чтобы из неё удобно собирать, дебажить, но, увы с такой архитектурой совладать не смог.

Добавлено позже:
я бы не стал его советовать прямо вот для использования как базы для снесиды.
А что есть другое? bsnes-plus единственный, который с отладчиком и исходниками. А с Mesen-S пока у меня затык случился.
« Последнее редактирование: 29 Декабрь 2020, 20:58:26 от DrMefistO »

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3588
    • Twitter
    • Просмотр профиля
Вопросы по дизазму SNES
« Ответ #20 : 31 Декабрь 2020, 17:56:04 »
сглазил