Разработка и ромхакинг > Программирование

Ребенок изучает asm [SMD]

<< < (5/11) > >>

SeregaZ:
и какая версия Doom Troopers правильная? чот я видимо не то скачал :) ида с ума сходит от этой игры :)

SeregaZ:
так-же Ида облажалась с Jungle Strike. блин... я же на неё ориентируюсь, а она заподлянки берет и подкидывает :)

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

--- Код: ---lea ($FFFF + $FFFF).l, a0
--- Конец кода ---
потому что если буду делать ассемблер (ну чтобы все было в одном флаконе и дизассемблер и ассемблер, так как ASM68K.exe, не смотря на всю мою лобовь, тоже сговорился с Идой и они вместе подсовывают подлянки) то там сами параметры то разобрать тот еще геморрой, а если в параметрах будут докучи еще и математические операции, то объем геморроя увеличится в разы. но по видимому выбора особо нет... ассемблер видимо пока откладывается. дизассемблер бы до ума довести. и вот для подобного случая, как в BattleTech:


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

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

Cyneprepou4uk:
SeregaZ, может этот LEA будет ссылаться на те байты внизу скрина, когда по итогу будет использован?

Марат:
Да всё там правильно. Там же цикл с предикрементом. Перед тем как в первый раз будет обращение к регистру а1, он будет увеличен на 4 и как раз будет указывать на первый longword из таблицы.

SeregaZ:
ну из десятка ромов, которые я грузил в свой дизассемблер - такие "битые" ссылки встречались раза два всего. поэтому то я и подумал о косяках разрабов.

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

Добавлено позже:

--- Цитата: Cyneprepou4uk от 24 Февраль 2024, 22:50:38 ---SeregaZ, может этот LEA будет ссылаться на те байты внизу скрина, когда по итогу будет использован?

--- Конец цитаты ---
этот плюсик +$2 и делает прыг LEA точно таким-же, как он и был в оригинальном коде рома. то есть с точки зрения рома ничего не изменилось, то есть мой дизассемблер делает асм код такой, который ASM68K.exe на выходе собирает 1 в 1 как оригинальный ром. то есть в этой метке, не смотря что она теперь указывает на другое место, из-за дополнительного +$2 получается значение, какое и должно было быть. сами то метки в ром не попадают - они лишь маркеры для ASM68K.exe откуда производить расчеты. поэтому тут все в порядке :)

Добавлено позже:
предварительно вроде горячее дизассемблирование по кнопке С сделал. и она даже ругается, когда в результате парсинга найдет ошибки и просит вернуть как было. и поскольку с функционалом отмены тут целая история... то как в Иде я не сделаю. нужно будет вручную кнопками R - reset или S - save подтверждать или сбрасывать результат парсинга. это не совсем удобно... и если было подтверждено сохранение, то потом уже нельзя будет откатить, как ида делает. типа превратить обратно код в сырые байты - undefine. пока без того правила четных байт. подожду отмашки, что это прям реально закон и сделаю, если смогу. а то могу и не смогу... ведь получается у меня "бэшки", с целью более быстрого сохранения - сохраняет в ряд по 16 штук. и первый байт это совсем не обязательно что четный. надо кумекать как это сделать...

Cyneprepou4uk:
SeregaZ, я понял что соберется как в оригинале  :)  я имел в виду что это не косяк разрабов. Такие места, где команда ссылается на операнд другой команды, надо как-то помечать дизассемблером, чтоб потом самому разбираться и вручную корректировать. Теоретически это действительно мог быть косяк

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

SeregaZ:
и рано я радовался :) показалось что горячее дизассемблирование работает шустро, хотя по прогнозам должно было тухло работать... а это я тестовой ром маленький гонял и радовался :) загрузил хак мк3у и все... затуп в этот момент неимоверный :)

Беларус:

--- Цитата: SeregaZ от 25 Февраль 2024, 05:23:00 ---из соседней темы я узнал, что у меня есть огромная семья... что команды надо читать из четного байта.
--- Конец цитаты ---
Из этой же своей темы мог узнать:

--- Цитата: MetalliC от 12 Июнь 2023, 00:26:32 ---при первой же попытке прыжка в подпрограмму проц улетит в исключение, от попытки записи 32бит значения по нечетному адресу
--- Конец цитаты ---
У Сеги код только по чётным адресам, да.

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

Добавлено позже:
хныыыыыыыы... никогда такого не было и вот опять! поскольку у нас тут теперича религия четности, то хотелось бы чтоб нераспарсенный код всегда начинался с четного. а то сейчас селектица криво, если метка пришлась на нечет... вот значит я думаю надо добавить проверку на метки. если метка летит на нечетный адрес - сдвигать метку на 1 байт влево, а в той команде где она использовалась, добавлять плюсиком +$1, так-же как в других мутных местах уже делаю. хотя визуальная ценность сего решения весьма сомнительная... в том плане, что жмакнув на такой ссылке с плюсом - окно перекинет именно что без плюса, то есть будет не точная адресация для глаз пользователя... голова то дырявая и не удержит заметку, что там на самом деле +1.



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

SeregaZ:
теперь дает заселектить только четные байты, и подсвечивает оба байта возможного опкода, если он разбит на строки или даже между ними метка. в случае если был нажат горячий дизасм - метка сама поменяется на метка+1 в том месте, откуда она ссылалась на этот адрес.

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

тут приспичило пользователю жмакнуть С - горячий дизасм на какой-то бэшке.
1. происходит восстановление копии первоначального парсинга кода в основной лист.
2. происходит добавление нового адреса, или даже адресов, что родились при горячем дизасме.
3. происходит добавление в лист бэшек.
4. сортировка листа по адресу.

пользователь остался недоволен и жмет R - reset, сброс, возврат к предыдущему состоянию.
1. происходит восстановление копии первоначального парсинга кода в основной лист.
2. происходит добавление в лист бэшек.
3. сортировка листа по адресу.
хотя пока писал и подумал что наверное надо делать копию текущего листа со всеми бэшками до нажатия C и восстанавливать её, если пользователь нажал R.

пользователь решил сохранить результат и жмет S - save.
1. к первоначальной копии листа "только код" добавляется новый адрес и код с этого адреса.
2. делается копия в базовую копию
3. происходит добавление в лист бэшек.
4. сортировка листа по адресу.
поэтому то и отмена, если пользователь все-таки сохранил результат - не возможна. то есть уже в сохраненную базовую копию были внесены изменения.

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

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

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

да и если много баловаться С и R - вылетает, зараза :)

SeregaZ:
пока тупик и продвижение в моих задумках нет - подумываю сделать сохранение ручного парсинга. наверное это будет текстовой файл, типа "название рома.adr", куда будут складываться все найденные адреса первый раз и добавленные вручную через С. соответственно при загрузке рома сначала будет произведена проверка: а не загружался ли данный ром ранее? если да, то загрузить лист адресов из этого файла. правда остается вопрос - исправленные адреса туда пихать, или все-таки оригинальные... то есть когда адрес прыгает не на начало команды, а на параметр.

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

Томахомэ:
Решил я тут начать пилить небольшую демку для Playmark'овского железа Excelsior, и тут вырисовалась небольшая проблема - вроде прерывание №2 для данной железки я уже разрешил, однако самого перескока к соответствующему адресу, когда приходит время прерывания, не происходит - только значение 3-го нибла регистра SR меняется с 1 на 2, и MAME'овский дебаггер тоже никакого прерывания не регистрирует.
Внизу прикреплены иллюстрирующий странность в работе M68000 тестовый набросок кода и полученный в результате его сборки ром (запускать через командную строку - mame excelsr -d). Что же я всё-таки упустил?

SeregaZ:
а чем собиралось? есть ли альтернатива? типа несколькими сборщиками один и тот-же код собрать и посмотреть?

Томахомэ:

--- Цитата: SeregaZ от 14 Декабрь 2024, 01:35:54 ---а чем собиралось? есть ли альтернатива? типа несколькими сборщиками один и тот-же код собрать и посмотреть?

--- Конец цитаты ---

Всё тем же нашим общим "старым знакомым" - asmx. И собрал он, судя по тому, как слабо разнятся исходник с листингом MAMEовского дебаггера, правильно.

SeregaZ:
а что значит

--- Код: ---bra $
--- Конец кода ---
не должно ли было быть после доллара какое-то значение?

Томахомэ:

--- Цитата: SeregaZ от 14 Декабрь 2024, 05:39:41 ---а что значит

--- Код: ---bra $
--- Конец кода ---
не должно ли было быть после доллара какое-то значение?

--- Конец цитаты ---

В синтаксисе asmx это - текущий адрес. По идее, программка должна тихонько стоять на месте в ожидании прерывания, вот только чё-то последнего не поступает. Точнее, поступает, но на него нет должной реакции.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Перейти к полной версии