Автор Тема: Simple Tools  (Прочитано 2354 раз)

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

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« : 22 Сентябрь 2019, 15:23:53 »


Порой, когда разбираешь ресурсы той или иной старой консольной игры, натыкаешь на сжатую графику. Это событие всегда вызывает негативные эмоции, так как влечёт за собой много лишней работы по распаковке / запаковке данных. Сам процесс поиска процедуры распаковки в коде игры не составляет особых проблем (для матёрых кодеров). Да и написание распаковщика путём конвертации оригинального кода на ассемблере в код на языке высокого уровня тоже не слишком трудоёмкий, но занимает время. А вот разбор оригинального алгоритма сжатия и написания упаковщика ресурсов может вылиться в долгую песню. В таком случае начитаешь искать различные пути, дабы как-то обойти стороной работу с упакованными данными. При наличии сводного места в исполняемом файле игры или других файлах (если речь идёт о консолях, использующие оптические носители), можно использовать трюк с предварительно распакованными данными. Суть его в том, чтобы грузить ранее распакованную графику, запретив переход к процедуре распаковки. Но такие манипуляции могут привести к увеличению времени загрузки данных с оптического носителя, так как объём считываемых данных изменился в большую сторону. Хорошо, если разница между сжатым и распакованным блоком небольшая (полтора-два раза). Но если это десятки раз? Вот тут то и может пригодиться утилита «Simple Tools».
«Simple Tools» - это набор, состоящий из двух простых программ (упаковщика и распаковщика). Алгоритм сжатия очень простой и эффективный в случае, когда изображение содержит много повторяющихся байт, идущих подряд (картинки с одноцветным фонов, например). Компрессии подвергаются только повторяющиеся подряд байты, в то время как остальные данные не сжимаются. За счёт этого изображения с палитрой до 256 цветов, можно неплохо ужать (в 4-7 раз) и соответственно сэкономить на времени загрузки таких данных. В комплекте с утилитой идёт описание алгоритма сжатия и готовые решения (код для распаковки) для процессоров MIPS-R3000A (используемый в Sony Playstation) и Super Hitachi 2 (установленный в Sega Saturn). Код распаковщика немного переваливает за десяток инструкций и в случае с процессором SH-2, например, займёт чуть больше 30 байт.
Подводя итоги, если вы столкнулись с упакованными данными и вам жутко не хочется возиться с разбором оригинального алгоритма упаковки / распаковки (или напрягать кого-то с этим делом) и имеется некое свободное место в ресурсах игры, то можно воспользоваться «Simple Tools». Даже в случае, когда консоль использует отличный от выше описанных процессор, зная алгоритм сжатия и ассемблер текущего процессора, можно написать собственный код и при желании добавить его к уже существующим. Достаточно создать текстовый файл с описанием и положить его в корневую папку утилиты, тем самым внеся свою лепту в проект «Simple Tools».

Версия (v1.3.).
« Последнее редактирование: 28 Сентябрь 2019, 22:47:35 от paul_met »

Оффлайн CaH4e3

  • Пользователь
  • Сообщений: 3587
    • Twitter
    • Просмотр профиля
Simple Tools
« Ответ #1 : 22 Сентябрь 2019, 19:05:26 »
Компрессии подвергаются только повторяющиеся подряд байты
это называется RLE

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #2 : 22 Сентябрь 2019, 19:24:41 »
это называется RLE
Я в курсе, но другие могут и не знать. Так что, лучше сразу разжевать, чем использовать эти "ругательные сокращения".

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9369
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Simple Tools
« Ответ #3 : 22 Сентябрь 2019, 19:34:10 »
ну, те кто хоть немножко интересовался алгоритмами наверняка знают что такое RLE, но не факт что слышали русское "кодирование длин серий" :)

по существу - код распаковщиков лучше сделать с учётом calling conventions (соглашений о вызовах функций) этих архитектур, чтоб было удобнее встраивать в код.
к примеру у SuperH аргументы передаются в регистрах 4-7 (если нужно больше то через стек), регистры 0-3 "рабочие" и могут меняться внутри функции, регистры 8-14 меняться не должны (если в функции они используются то в начале функции нужно их сохранить на стек или еще куда, а в конце восстановить)
в MIPS по идее тоже должно быть что-то подобное.

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #4 : 22 Сентябрь 2019, 19:42:18 »
по существу - код распаковщиков лучше сделать с учётом calling conventions (соглашений о вызовах функций) этих архитектур, чтоб было удобнее встраивать в код.
к примеру у SuperH аргументы передаются в регистрах 4-7 (если нужно больше то через стек), регистры 0-3 "рабочие" и могут меняться внутри функции, регистры 8-14 меняться не должны (если в функции они используются то в начале функции нужно их сохранить на стек или еще куда, а в конце восстановить)
в MIPS по идее тоже должно быть что-то подобное.
Мне кажется, тот, кто знает как встраивать сторонние рутины в код, в любом случае будет смотреть, какие регистры можно использовать сразу, а какие потребуется восстановить. Всё же зависит в каком месте вклиниться.

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Simple Tools
« Ответ #5 : 22 Сентябрь 2019, 22:29:04 »
Всё же зависит в каком месте вклиниться.

для SH архитектуры всё как сказал MetalliC, R0-R3 можно менять как угодно, R4-R7 это аргументы, если требуется изменение R8-R14 MACL MACH, то необходимо сохранить в стек и восстанавливать перед возвратом, R15 это стек, R0 - возвращаемое значение если это не void функция

я знаю только одно исключение где регистры имеют другое назначение, это bleemcast, но не на все 100, потому что в нём используются KATANA библиотеки

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #6 : 22 Сентябрь 2019, 23:16:02 »
для SH архитектуры всё как сказал MetalliC, R0-R3 можно менять как угодно, R4-R7 это аргументы, если требуется изменение R8-R14 MACL MACH, то необходимо сохранить в стек и восстанавливать перед возвратом, R15 это стек, R0 - возвращаемое значение если это не void функция
По опыту общения с  SH-2, разработчики не особо то и придерживаются  данного распределения. Используют любые регистры (кроме R15), когда они свободны. Что мне мешает использовать регистры R4-R7 в подпрограмме, если я вижу, что далее по коду значения в этих регистрах обновляются?

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9369
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Simple Tools
« Ответ #7 : 22 Сентябрь 2019, 23:35:54 »
paul_met, по опыту общения с суперхитачами от 1го до 4го - оно везде одинаково. к примеру, последний месяц занимался ковырянием кода SH-2 (Capcom CPS-3) - всё то же самое.
потому что на ассемблере никто игр не пишет уже более четверти века как, всё пишется на C или C++, а их компиляторы используют соглашение о вызове функций, так что везде аргументы передаются в R4/R5/итп, а результат (если он есть) возвращается в R0.

исключение составляют лишь некоторые вшитые в либу компилятора оптимизированные функции, типа memcpy() фиксированного числа выровненных данных, либо функции деления или остатка, там да, аргументы могут передаваться в R0/R1. видимо аналог __fastcall

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #8 : 23 Сентябрь 2019, 08:28:52 »
потому что на ассемблере никто игр не пишет уже более четверти века как, всё пишется на C или C++, а их компиляторы используют соглашение о вызове функций, так что везде аргументы передаются в R4/R5/итп, а результат (если он есть) возвращается в R0.
Может, я чего-то не понимаю, но почему речь зашла о разработке игр? В данном случае хакинг и перекомпиляция кода не предусматривается. Мы просто добавляем новую рутину в свободное место и делаем её вызов в нужный момент. Так зачем заботится о всяких соглашениях, если я пишу код на ассемблере и вижу какие регистры можно использовать в конкретный момент?

Оффлайн megavolt85

  • Пользователь
  • Сообщений: 1464
  • Пол: Мужской
    • Просмотр профиля
Simple Tools
« Ответ #9 : 23 Сентябрь 2019, 13:44:21 »
Так зачем заботится о всяких соглашениях, если я пишу код на ассемблере и вижу какие регистры можно использовать в конкретный момент?

потому что так удобней, когда придерживаешься стандарта не нужно держать в голове много лишнего

Онлайн Mr2

  • Пользователь
  • Сообщений: 1476
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Simple Tools
« Ответ #10 : 24 Сентябрь 2019, 05:07:43 »
На winXP, после сжатия файла, выскакивает браузер папок, вместо браузера сохранения файла. Это баг или фитча? :?

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #11 : 24 Сентябрь 2019, 07:13:49 »
На winXP, после сжатия файла, выскакивает браузер папок, вместо браузера сохранения файла. Это баг или фитча? :?
Так и должно быть, так как имя файла и расширение генерируется автоматически.

Онлайн Mr2

  • Пользователь
  • Сообщений: 1476
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Simple Tools
« Ответ #12 : 24 Сентябрь 2019, 12:16:22 »
Так и должно быть, так как имя файла и расширение генерируется автоматически.
Тогда путь к файлу неверный, так как файл сохраняется не в выбранную папку, а до неё. А имя папки копируется в имя файла.
Также файл не сохраняется на рабочий стол, через браузер папок.

Я в курсе, но другие могут и не знать. Так что, лучше сразу разжевать, чем использовать эти "ругательные сокращения".
В описании к программе, стоит указать формат сжатия, так как искать будут RLE, а не Simple Tools.
« Последнее редактирование: 24 Сентябрь 2019, 12:25:13 от Mr2 »

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #13 : 24 Сентябрь 2019, 16:52:10 »
В описании к программе, стоит указать формат сжатия, так как искать будут RLE, а не Simple Tools.
Это ты просто знаешь, что там RLE. А так искать будут просто по категории. Но я в любом случае будут корректировать описание.

Онлайн Mr2

  • Пользователь
  • Сообщений: 1476
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Simple Tools
« Ответ #14 : 27 Сентябрь 2019, 05:34:47 »
А так искать будут просто по категории.
Я говорю о том случае, когда кому-то конкретно нужен RLE архиватор.

Ещё было бы неплохо, если бы по умолчанию в браузере была выбрана папка Simple Tools. И выбор другой папки, сохранялся до завершения программы. ;)

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 4605
    • Просмотр профиля
Simple Tools
« Ответ #15 : 27 Сентябрь 2019, 07:22:39 »
Ещё было бы неплохо, если бы по умолчанию в браузере была выбрана папка Simple Tools. И выбор другой папки, сохранялся до завершения программы. ;)
Мимо проходил, думаю может опять кто-то использует раздражающий меня диалог выбора и правда тот самый, в котором нельзя вставить путь. Я обычно копирую в проводнике путь и вставляю, а здесь неудобно выбирать:
А вот хороший диалог:
"Плохой" почему-то вылезает при использовании флагов OFN_ENABLEHOOK | OFN_EXPLORER в GetOpenFileName(). Сейчас определил, что можно вставить адрес в "Имя файла", чтобы выбрать папку, это правда контринтуитивно и не так удобно как адрес у нормального диалога. Зачем в данной программе хук, тоже интересно.

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #16 : 27 Сентябрь 2019, 08:23:05 »
Ещё было бы неплохо, если бы по умолчанию в браузере была выбрана папка Simple Tools. И выбор другой папки, сохранялся до завершения программы.
Первое предложение я считаю признаком дурного тона - зачем засорять рабочий каталог программы "левыми" файлами? Их там насобирается тонна, а потом чисти его, боясь зацепить ненароком файлы самой программы.
А над вторым предложением можно подумать.

Онлайн Mr2

  • Пользователь
  • Сообщений: 1476
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Simple Tools
« Ответ #17 : 28 Сентябрь 2019, 05:11:43 »
Первое предложение я считаю признаком дурного тона - зачем засорять рабочий каталог программы "левыми" файлами? Их там насобирается тонна, а потом чисти его, боясь зацепить ненароком файлы самой программы.
Проблема раздута, пользователь может создать папку Simple Tools\files для работы, и никакой проблемы с чисткой не возникнет. Это удобнее чем сохранять на рабочий стол, а потом копировать в нужную папку, или добираться до нужной папки через браузер.

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

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #18 : 28 Сентябрь 2019, 08:19:09 »
Проблема раздута, пользователь может создать папку Simple Tools\files для работы, и никакой проблемы с чисткой не возникнет.
У меня другая точка зрения - в каталоге любой программы ничего не должно быть, кроме её файлов. В любом случае файлы придётся копировать - так зачем мешать мух с котлетами?

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


Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2328
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #19 : 28 Сентябрь 2019, 12:08:44 »
помница для своего редактора, который вроде как портабельный, решил сделать общую папку в моих документах. ведь у ромхакера может быть несколько версий игры, которые он ведет, а программа скачивает с тырнета архивы с музыкой. вот я и подумал пусть во всех версиях читается из этой общей папки, то есть единожды скаченный архив с музыкой будет доступен для добавления в любой версии ромхака пользователя.

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4329
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
Simple Tools
« Ответ #20 : 28 Сентябрь 2019, 12:56:20 »
Я, собственно, подобного рода утилиты обычно копирую в папку с рабочим проектом. Потому папка по умолчанию в виде папки программы - идеальный вариант.

Оффлайн paul_met

  • Супермодератор
  • Сообщений: 8032
  • Пол: Мужской
  • Похититель эмуляции
    • Youtube
    • Просмотр профиля
Simple Tools
« Ответ #21 : 28 Сентябрь 2019, 22:49:11 »
Обновил прогу до версии 1.3.
- Добавлен альтернативный упаковщик / распаковщик (для 15bpp изображений).
- Изменено окно выбора места сохранения файла.