Автор Тема: Ассемблер для PS2.  (Прочитано 927 раз)

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

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« : 20 Октябрь 2024, 11:58:20 »
Решил туточки написать модуль Emotion Engine для очень любимого мной ассемблера ASMX за авторством Брюса Томлина - инструмента очень, я бы так сказал, уютного: сверхпортативного, с простым синтаксисом, не склонного, в отличие от gas'а, перевирать набранный в исходнике код при сборке, и транслирующий его сразу в бинарник без посредства объектных файлов.

Работа ведётся на основе модифицированного asmarm.c, поскольку ARM пока что в списке архитектур ASMX - единственный RISC, и вот от него-то и приходится плясать, делая поправки на все архитектурные различия с MIPS (причём, что самое смешное, у последнего структура опкода даже проще, чем у ARM). Выложенный ниже вариант - он пока ещё сильно-сильно промежуточный, где и "хвосты" от ARM далеко не все подтёрты, и ряд команд ещё только предстоит добавить. Работа ведётся в режиме реального времени, и если где-то чего-то упущу - сигнальте. Опирался я главным образом на официальные доки самой Sony (см. последние 2 прикрепления).

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5106
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #1 : 20 Октябрь 2024, 18:00:23 »
Стоит сравнить с armips.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #2 : 20 Октябрь 2024, 19:08:54 »
Чистка продолжается.

Оффлайн perfect_genius

  • Пользователь
  • Сообщений: 1176
    • ВКонтакте
    • Steam
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #3 : 20 Октябрь 2024, 22:11:43 »
Я правильно понял, что ASMX - это общий синтаксис ассемблера для разных архитектур? Типа, пишешь MOV, и для каждой архитектуры создаётся своя инструкция копирования?
Если так, что с инструкциями, которые есть только в определённых архитектурах?

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

Добавлено позже:
Оказывается, даже тут в 2016 упоминалась эта штука: emu-land.net/forum/index.php?topic=76637.0
Цитата
This is a multi-CPU macro assembler for many major 8-bit and 16-bit CPUs, which can assemble code for multiple CPUs in the same source file.
Странно, что со временем не появился x86, ведь 68k есть, а он тоже сложный.
А отсутствующие инструкции можно было бы автоматически заменять на несколько более простых, наверно. Эмулировать, т.е.
« Последнее редактирование: 20 Октябрь 2024, 22:39:09 от perfect_genius »

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #4 : 21 Октябрь 2024, 05:25:16 »
И ещё.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #5 : 21 Октябрь 2024, 15:51:00 »
Привёл в собирабельный вид и интегрировал в ASMX, однако ждать адекватной работы пока рано - впереди ещё длинная полоса тестов.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1297
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #6 : 21 Октябрь 2024, 15:59:50 »
Сорсы не хочешь выложить на Github в виде форка?) Так может какие умельцы ещё подтянутся.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #7 : 22 Октябрь 2024, 05:49:44 »
Команды перехода по абсолютному адресу работают как надо. Проверялось, если кому любопытно, через подставной псевдобиос, специально занесённый в базу биосов приватной сборки MAME, где дебаггер, на мой взгляд, самый удобный.

А вот вполне прописанные регистры MIPS мой ассемблер почему-то воспринимает как несуществующие. Где тут я и чего напортачил?

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #8 : 25 Октябрь 2024, 15:44:00 »
Тааааак, дела вроде пошли на лад - хоть для этого и пришлось скачать изначальный сорс asmarm.c ещё раз и взяться за его переписку заново, в истерическом темпе, почти в мыле, несколько раз оказавшись в шаге от закипания мозга и выкрутив всю свою личную память и внимательность на максимум. Проверка на работоспособность идёт не для каждой команды в отдельности, а по типам опкода. Если удастся довести до конца, следующей архитектуркой подвезут PowerPC - для Sega Model 3 и всего 7-го поколения консолей.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Re: Ассемблер для PS2.
« Ответ #9 : 25 Октябрь 2024, 15:51:12 »
и прям будет что любые математические операции в виде параметров - все сожрет и неподавится?

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Re: Ассемблер для PS2.
« Ответ #10 : 25 Октябрь 2024, 16:20:23 »
и прям будет что любые математические операции в виде параметров - все сожрет и неподавится?

Ээээээм... Немножко не понял.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #11 : 25 Октябрь 2024, 16:29:07 »
ну типа move a1, d1 как бы простое и понятное. а что насчет сложных случаев типа move a1, d1 + 100 + (a3 / 2) * 8 ? вот такого плана. а то я тоже хотел для своего дизассемблера сразу и ассемблер чтоб был... и как бы простые базовые случае регуляркой вполне себе... но когда начинается всякая порнография с математическими операциями внутри одного параметра, то я расстраиваюсь :)

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #12 : 25 Октябрь 2024, 16:40:25 »
ну типа move a1, d1 как бы простое и понятное. а что насчет сложных случаев типа move a1, d1 + 100 + (a3 / 2) * 8 ? вот такого плана. а то я тоже хотел для своего дизассемблера сразу и ассемблер чтоб был... и как бы простые базовые случае регуляркой вполне себе... но когда начинается всякая порнография с математическими операциями внутри одного параметра, то я расстраиваюсь :)

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

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5106
    • Просмотр профиля
Re: Ассемблер для PS2.
« Ответ #13 : 25 Октябрь 2024, 17:32:43 »
что насчет сложных случаев типа move a1, d1 + 100 + (a3 / 2) * 8 ?
Используйте компилятор C. Обычно ассемблеры не генерируют инструкции, не считая псевдоинструкций и макросов. Но вычислимые выражения на основе меток и констант должны поддерживаться как (пример для armips):
a equ 0x13
.org 800121C0h
  lui v0, 0x800d + 100 + (a / 2) * 8 ; На выходе lui v0, 0x80b9
Можете поискать промежуточный язык, который сложнее ассемблера, но проще C и поэтому быстрее, для NES есть https://pubby.games/nesfab.html, для 6502, Z80 и др. https://github.com/KarolS/millfork.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Re: Ассемблер для PS2.
« Ответ #14 : 25 Октябрь 2024, 17:33:18 »
блин... сложно спросить то, чего не понимаю толком сам :) попытаюсь еще раз: тут не про разные функции - как бы функция всего одна, просто параметр должен быть результатом каких-то математических вычислений. вот будет ли это тут работать? а то было бы интересно как этот просчет реализован... чтобы потом спереть в свой проект

типа как для ASM68K.exe можно указать что-то типа такого:
units_vram1: dc.w units_vram
units_size1: dc.w units_spr_end-units_spr
units_vram2: dc.w base2*32
score_pics_gfx: dc.w (scend-scptr)/32
cmpa.l    #(Z80RAM+$2000),a1
типа первая строчка все понятно. а вот вторая и далее - швах :) в качестве параметра - математические операции. и это причем ладно еще простые операции, но ведь математика может быть гораздо сложнее. вот по идее нужен алгоритм, который бы читал параметр, и делал вывод - это просто одиночный параметр, а это математическая операция, которую надо посчитать, причем еще и в правильном порядке - типа сначала умножение, а плюс минус во вторую очередь. или если там есть скобки - в скобках отдельно...

Добавлено позже:
Используйте компилятор C.
тото и оно что хотелось бы свою реализацию, ну или в крайнем случае библиотеку, чтоб типа послал ей строчку в качестве параметра "0x800d + 100 + (a / 2) * 8" а она посчитала и вернула, без необходимости городить свой огород по просчету. вот что меня опечалило, когда начал писать ассемблер.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5106
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #15 : 25 Октябрь 2024, 17:50:54 »
типа первая строчка все понятно. а вот вторая и далее - швах
Это обычные возможности нормального ассемблере. Скачайте asmx и проверьте, какие-то операции поддерживаются https://github.com/db-electronics/asmx/blob/master/asmx-doc.html.
тото и оно что хотелось бы свою реализацию, ну или в крайнем случае библиотеку, чтоб типа послал ей строчку в качестве параметра "0x800d + 100 + (a / 2) * 8" а она посчитала и вернула, без необходимости городить свой огород по просчету. вот что меня опечалило, когда начал писать ассемблер.
Есть ассемблеры, остаётся интегрировать в вашу программу. Если хотите сами написать, то учитесь писать ассемблеры (парсеры и т. п.). Не вижу проблем.

Онлайн Mr2

  • Пользователь
  • Сообщений: 1610
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #16 : 25 Октябрь 2024, 19:56:18 »
параметр должен быть результатом каких-то математических вычислений.
Это хорошо в плане ускорения записи, но плохо в плане сопровождения:
 
lui v0, 0x80b9
lui v0, 0x800d + 100 + (a / 2) * 8

Также вычисления будут замедлять компиляцию.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #17 : 25 Октябрь 2024, 20:16:09 »
ну а как по другому, если там будут, к примеру, сложены плавающие адреса, которые станут известны только после компиляции? после первого прохода в смысле. поэтому ладно уж скорость замедлится - главное чтобы система могла такое переварить и в итоге родить рабочий и верный код :) и все равно когда начинаю думать как реализовать такую поддержку математики в качестве параметра - попаболь начинается такая, что думать сразу уже и не хочется :) так и валяется недоделанным уже который год...

Онлайн Mr2

  • Пользователь
  • Сообщений: 1610
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #18 : 25 Октябрь 2024, 20:39:36 »
что думать сразу уже и не хочется
Такое у тебя наблюдается в каждой теме. :lol:

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #19 : 25 Октябрь 2024, 21:18:11 »
это нормально  :blush: у творческого человека мысль должна вызреть, дойти до кондиции, и потом заночь забабахать. главное за это время пока оно который год уже зреет - все не забыть, что сделано было ранее. а то сто раз такое было - открываешь проект... это я написал? а что я хотел сказать этим участком кода? а вот этим? а это для чего?...

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #20 : 26 Октябрь 2024, 11:47:05 »
Пошла полоса даже какого-то подозрительного везения. Ещё несколько типов инструкций подтвердили правильность своей работы.

Оффлайн dedok179

  • Пользователь
  • Сообщений: 497
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #21 : 26 Октябрь 2024, 15:39:38 »
это нормально  :blush: у творческого человека мысль должна вызреть, дойти до кондиции, и потом заночь забабахать. главное за это время пока оно который год уже зреет - все не забыть, что сделано было ранее. а то сто раз такое было - открываешь проект... это я написал? а что я хотел сказать этим участком кода? а вот этим? а это для чего?...
В принципе у меня так бывает. Заходишь в проект, и вообще не понимаешь как оно работает

Оффлайн Turbo2000

  • Пользователь
  • Сообщений: 103
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #22 : 28 Октябрь 2024, 13:30:36 »
и все равно когда начинаю думать как реализовать такую поддержку математики в качестве параметра - попаболь начинается такая, что думать сразу уже и не хочется
Да, есть такое, надо написать свой компилятор в m68k asm, но Sharpnull, как раз предлагал проекты для высокоуровневой разработки под консоли, там вроде была Nes, и дженерик под 8-и битные процессоры, но есть же SGDK. Или идея делать свои хаки со вставками на высокоуровневом языке?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #23 : 28 Октябрь 2024, 14:31:45 »
в моем случае он нужен тупо для того, чтобы собирал точно такой-же 100% ром один в один после разбора  :lol: когда вникал в вопрос дизасма и увидел эти костыли, что существуют сейчас - ужоснулся! захотел сделать свое - однокликовое, и чтоб ASM68K.exe совместимое. то есть именно что не правильное --хххххх, а совместимое с этим старым ассемблером - то есть хххххххх. но оказалось что помимо этой проблемы там еще пяток. уже не помню какая функция, но там что-то типа замена параметров друг на друга. типа Замена(а, б) - по логике никакой разницы нет что Замена(а, б) или Замена(б, а) - оба варианта будут правильные. но если в игре был Замена(а, б), то ассемблер соберет его как Замена(б, а) и тогда при сравнении байт в байт два рома - оригинальный и после разборки и сборки - будут различия. это меня огорчает. ну и дальше там тоже какие-то ошибки находил в каких-то функциях... не помню детали. там впрочем все косячники... и IDA и сам ASM68K.exe и даже в шелловском Gens - там вообще швах как команды разбирает. поэтому подумал хорошо бы чтоб в одном флаконе сразу и разбирало и собирало, и чтоб итоговый результат был один в один. ну а дальше уже настигла печаль работы с итоговым кодом... все работает супер медленно и раздражающе. и полетело оно, как обычно, ко всем другим проектам в долгий ящик. но это уже совсем другая история :)

Оффлайн Turbo2000

  • Пользователь
  • Сообщений: 103
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #24 : 28 Октябрь 2024, 18:07:31 »
Это невозможно из-за абсолютной адресации (+ может быть неоднозначная интерпретация кода и данных, + есть неиспользуемый код, или код, который косвенно вызывают, рассчитывают по адресу в рантайме), если бы можно было сделать трейс игры (и то это все не покроет), и восстановить код, может быть когда-нибудь будут такие инструменты, а пока есть ида :)

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


Добавлено позже:
Понятно, что будут различия, но если смотреть секторами, то все будет одинаково

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2536
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #25 : 28 Октябрь 2024, 19:06:46 »
Это невозможно
в моем случае разбор был пока-что тот, что при старте игры начинается. а вот как раз те, что просчитываются - нет. остаются необработанными кусками. может быть когданибудь докручу эмулятор, чтоб как в Иде, тем более что были не так давно продвижки с влезанием в оперативку приставки в эмуляторе, то значит можно будет и найти тот кусман, где эти адреса рожаются в шелловском эмуляторе. там правда дизассемблит криво, но это уже хоть что-то - какая-то подсказка где эти адреса лежат, чем в слепую тыкать мышкой в необработанный кусман и жмакать "определить", в надежде что это код, а не данные или какой-то другой мусор. так вот с тем кодом, что изначальный - все хорошо разбирает, и после потом ASM68K.exe собирает и получается один в один... за исключением некоторых ошибок в самом ASM68K.exe, что я описал.

по моему видос еще до того как докрутил функцию разбора кода в ручную, тыкнув куда-то мышкой.
« Последнее редактирование: 28 Октябрь 2024, 19:20:17 от SeregaZ »

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #26 : 07 Декабрь 2024, 16:50:51 »
Вы таки будете смеятся, но то, что я принял за баги трансляции команд addis andis. оказалось вовсе не багами, а просто дурной привычкой MAME'овского дизассемблера упрощать некоторые команды.
else if ((op & ~(M_RT|M_RA|M_SIMM)) == D_OP(15))
{
if (G_RA(op) == 0)
{
mnem += "li"; // addis rT,0,value -> li rT,(value<<16)
oprs = util::string_format("r%d,0x%08X", G_RT(op), value << 16);
}
else
{
mnem += "addi";   // addis rT,rA,SIMM -> addi rT,rA,SIMM<<16
oprs = util::string_format("r%d,r%d,0x%08X", G_RT(op), G_RA(op), value << 16);
}
}
else if ((op & ~(M_RT|M_RA|M_UIMM)) == D_OP(29))
{
mnem += "andi.";  // andis. rA,rT,UIMM -> andi. rA,rT,UIMM<<16
oprs = util::string_format("r%d,r%d,0x%08X", G_RA(op), G_RT(op), G_UIMM(op) << 16);
}

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #27 : 09 Декабрь 2024, 14:18:43 »
Ну вот, братцы, допилил я таки свой ассемблер (в той, правда мере, в какой это касается общих для семейства MIPS в целом команд - специфические для Emotion Engine и спекоманды для сопроцессоров ещё только предстоит добавить) , испытал на работоспособность и подчистил "хвосты" от исходника ассемблера ARM, на который ориентировался, как на единственную дотоле присутствовавшую среди поддерживаемых ASMX RISC-архитектуру.

Исходник и готовый EXE-файл - в прикреплённом архиве.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 817
  • Пол: Мужской
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #28 : 19 Декабрь 2024, 12:13:30 »
Кстати, об ассемблере ARM - а у него есть вообще способ загрузить командой mov полноразмерное 32-битное число, где все 16-ричные цифры были бы разные?

Просто, как оказалось, соответствующий модуль у ASMX откровенно сырой и недопиленный - на данном этапе загрузить таким способом в регистр можно только однобайтные числа. Допилить за Томлином самому мешает тот факт, что структура такого типа опкодов у ARM специфическая (см. главу Data Processing), и далеко не всякое 32-битное число можно "ужать" до 8-битного методом банальной прокрутки.

long ARMImmed(unsigned long val)
{
    // note: can't abort assembling instruction because it may cause phase errors

    if ((val & 0xFFFFFF00) == 0)
        return (val & 0xFF);
    else
    {
        // FIXME: need to handle shifts
        // bit 25 (I) = 1
        // bits 8-11 = rotate (immed8 is rotated right by 2 * this value)
        // bits 0-7 = immed8
        // the smallest value of rotate should be chosen
    }

    Error("Invalid immediate constant");
    return 0;
}

Оффлайн Dyons

  • Пользователь
  • Сообщений: 7214
  • инфернальный колдун
    • Youtube
    • Просмотр профиля
Ассемблер для PS2.
« Ответ #29 : 19 Декабрь 2024, 12:26:25 »
Кстати, об ассемблере ARM - а у него есть вообще способ загрузить командой mov полноразмерное 32-битное число, где все 16-ричные цифры были бы разные?
тебе в какой регистр грузить то надо?