Разработка и ромхакинг > Программирование
Ассемблер для PS2.
(1/2) > >>
Томахомэ:
Решил туточки написать модуль Emotion Engine для очень любимого мной ассемблера ASMX за авторством Брюса Томлина - инструмента очень, я бы так сказал, уютного: сверхпортативного, с простым синтаксисом, не склонного, в отличие от gas'а, перевирать набранный в исходнике код при сборке, и транслирующий его сразу в бинарник без посредства объектных файлов.

Работа ведётся на основе модифицированного asmarm.c, поскольку ARM пока что в списке архитектур ASMX - единственный RISC, и вот от него-то и приходится плясать, делая поправки на все архитектурные различия с MIPS (причём, что самое смешное, у последнего структура опкода даже проще, чем у ARM). Выложенный ниже вариант - он пока ещё сильно-сильно промежуточный, где и "хвосты" от ARM далеко не все подтёрты, и ряд команд ещё только предстоит добавить. Работа ведётся в режиме реального времени, и если где-то чего-то упущу - сигнальте. Опирался я главным образом на официальные доки самой Sony (см. последние 2 прикрепления).
Sharpnull:
Стоит сравнить с armips.
Томахомэ:
Чистка продолжается.
Беларус:
Я правильно понял, что 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 есть, а он тоже сложный.
А отсутствующие инструкции можно было бы автоматически заменять на несколько более простых, наверно. Эмулировать, т.е.
Томахомэ:
И ещё.
Томахомэ:
Привёл в собирабельный вид и интегрировал в ASMX, однако ждать адекватной работы пока рано - впереди ещё длинная полоса тестов.
DrMefistO:
Сорсы не хочешь выложить на Github в виде форка?) Так может какие умельцы ещё подтянутся.
Томахомэ:
Команды перехода по абсолютному адресу работают как надо. Проверялось, если кому любопытно, через подставной псевдобиос, специально занесённый в базу биосов приватной сборки MAME, где дебаггер, на мой взгляд, самый удобный.

А вот вполне прописанные регистры MIPS мой ассемблер почему-то воспринимает как несуществующие. Где тут я и чего напортачил?
Томахомэ:
Тааааак, дела вроде пошли на лад - хоть для этого и пришлось скачать изначальный сорс asmarm.c ещё раз и взяться за его переписку заново, в истерическом темпе, почти в мыле, несколько раз оказавшись в шаге от закипания мозга и выкрутив всю свою личную память и внимательность на максимум. Проверка на работоспособность идёт не для каждой команды в отдельности, а по типам опкода. Если удастся довести до конца, следующей архитектуркой подвезут PowerPC - для Sega Model 3 и всего 7-го поколения консолей.
SeregaZ:
и прям будет что любые математические операции в виде параметров - все сожрет и неподавится?
Томахомэ:

--- Цитата: SeregaZ от 25 Октябрь 2024, 15:51:12 ---и прям будет что любые математические операции в виде параметров - все сожрет и неподавится?

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

Ээээээм... Немножко не понял.
SeregaZ:
ну типа move a1, d1 как бы простое и понятное. а что насчет сложных случаев типа move a1, d1 + 100 + (a3 / 2) * 8 ? вот такого плана. а то я тоже хотел для своего дизассемблера сразу и ассемблер чтоб был... и как бы простые базовые случае регуляркой вполне себе... но когда начинается всякая порнография с математическими операциями внутри одного параметра, то я расстраиваюсь :)
Томахомэ:

--- Цитата: SeregaZ от 25 Октябрь 2024, 16:29:07 ---ну типа move a1, d1 как бы простое и понятное. а что насчет сложных случаев типа move a1, d1 + 100 + (a3 / 2) * 8 ? вот такого плана. а то я тоже хотел для своего дизассемблера сразу и ассемблер чтоб был... и как бы простые базовые случае регуляркой вполне себе... но когда начинается всякая порнография с математическими операциями внутри одного параметра, то я расстраиваюсь :)

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

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

--- Цитата: SeregaZ от 25 Октябрь 2024, 16:29:07 ---что насчет сложных случаев типа 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:
блин... сложно спросить то, чего не понимаю толком сам :) попытаюсь еще раз: тут не про разные функции - как бы функция всего одна, просто параметр должен быть результатом каких-то математических вычислений. вот будет ли это тут работать? а то было бы интересно как этот просчет реализован... чтобы потом спереть в свой проект

типа как для 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
--- Конец кода ---
типа первая строчка все понятно. а вот вторая и далее - швах :) в качестве параметра - математические операции. и это причем ладно еще простые операции, но ведь математика может быть гораздо сложнее. вот по идее нужен алгоритм, который бы читал параметр, и делал вывод - это просто одиночный параметр, а это математическая операция, которую надо посчитать, причем еще и в правильном порядке - типа сначала умножение, а плюс минус во вторую очередь. или если там есть скобки - в скобках отдельно...

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

--- Цитата: Sharpnull от 25 Октябрь 2024, 17:32:43 ---Используйте компилятор C.
--- Конец цитаты ---
тото и оно что хотелось бы свою реализацию, ну или в крайнем случае библиотеку, чтоб типа послал ей строчку в качестве параметра "0x800d + 100 + (a / 2) * 8" а она посчитала и вернула, без необходимости городить свой огород по просчету. вот что меня опечалило, когда начал писать ассемблер.
Sharpnull:

--- Цитата: SeregaZ от 25 Октябрь 2024, 17:33:18 ---типа первая строчка все понятно. а вот вторая и далее - швах
--- Конец цитаты ---
Это обычные возможности нормального ассемблере. Скачайте asmx и проверьте, какие-то операции поддерживаются https://github.com/db-electronics/asmx/blob/master/asmx-doc.html.
--- Цитата: SeregaZ от 25 Октябрь 2024, 17:33:18 ---тото и оно что хотелось бы свою реализацию, ну или в крайнем случае библиотеку, чтоб типа послал ей строчку в качестве параметра "0x800d + 100 + (a / 2) * 8" а она посчитала и вернула, без необходимости городить свой огород по просчету. вот что меня опечалило, когда начал писать ассемблер.
--- Конец цитаты ---
Есть ассемблеры, остаётся интегрировать в вашу программу. Если хотите сами написать, то учитесь писать ассемблеры (парсеры и т. п.). Не вижу проблем.
Mr2:

--- Цитата: SeregaZ от 25 Октябрь 2024, 17:33:18 ---параметр должен быть результатом каких-то математических вычислений.
--- Конец цитаты ---
Это хорошо в плане ускорения записи, но плохо в плане сопровождения:
 

--- Код: --- lui v0, 0x80b9
lui v0, 0x800d + 100 + (a / 2) * 8
--- Конец кода ---

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

--- Цитата: SeregaZ от 25 Октябрь 2024, 20:16:09 ---что думать сразу уже и не хочется
--- Конец цитаты ---
Такое у тебя наблюдается в каждой теме. :lol:
SeregaZ:
это нормально  :blush: у творческого человека мысль должна вызреть, дойти до кондиции, и потом заночь забабахать. главное за это время пока оно который год уже зреет - все не забыть, что сделано было ранее. а то сто раз такое было - открываешь проект... это я написал? а что я хотел сказать этим участком кода? а вот этим? а это для чего?...
Навигация
Главная страница сообщений
Следующая страница

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