| Разработка и ромхакинг > Ромхакинг и программирование |
| Simple Tools |
| (1/2) > >> |
| paul_met:
Порой, когда разбираешь ресурсы той или иной старой консольной игры, натыкаешь на сжатую графику. Это событие всегда вызывает негативные эмоции, так как влечёт за собой много лишней работы по распаковке / запаковке данных. Сам процесс поиска процедуры распаковки в коде игры не составляет особых проблем (для матёрых кодеров). Да и написание распаковщика путём конвертации оригинального кода на ассемблере в код на языке высокого уровня тоже не слишком трудоёмкий, но занимает время. А вот разбор оригинального алгоритма сжатия и написания упаковщика ресурсов может вылиться в долгую песню. В таком случае начитаешь искать различные пути, дабы как-то обойти стороной работу с упакованными данными. При наличии сводного места в исполняемом файле игры или других файлах (если речь идёт о консолях, использующие оптические носители), можно использовать трюк с предварительно распакованными данными. Суть его в том, чтобы грузить ранее распакованную графику, запретив переход к процедуре распаковки. Но такие манипуляции могут привести к увеличению времени загрузки данных с оптического носителя, так как объём считываемых данных изменился в большую сторону. Хорошо, если разница между сжатым и распакованным блоком небольшая (полтора-два раза). Но если это десятки раз? Вот тут то и может пригодиться утилита «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.). |
| CaH4e3:
--- Цитата: paul_met от 22 Сентябрь 2019, 15:23:53 --- Компрессии подвергаются только повторяющиеся подряд байты --- Конец цитаты --- это называется RLE |
| paul_met:
--- Цитата: CaH4e3 от 22 Сентябрь 2019, 19:05:26 ---это называется RLE --- Конец цитаты --- Я в курсе, но другие могут и не знать. Так что, лучше сразу разжевать, чем использовать эти "ругательные сокращения". |
| MetalliC:
ну, те кто хоть немножко интересовался алгоритмами наверняка знают что такое RLE, но не факт что слышали русское "кодирование длин серий" :) по существу - код распаковщиков лучше сделать с учётом calling conventions (соглашений о вызовах функций) этих архитектур, чтоб было удобнее встраивать в код. к примеру у SuperH аргументы передаются в регистрах 4-7 (если нужно больше то через стек), регистры 0-3 "рабочие" и могут меняться внутри функции, регистры 8-14 меняться не должны (если в функции они используются то в начале функции нужно их сохранить на стек или еще куда, а в конце восстановить) в MIPS по идее тоже должно быть что-то подобное. |
| paul_met:
--- Цитата: MetalliC от 22 Сентябрь 2019, 19:34:10 ---по существу - код распаковщиков лучше сделать с учётом calling conventions (соглашений о вызовах функций) этих архитектур, чтоб было удобнее встраивать в код. к примеру у SuperH аргументы передаются в регистрах 4-7 (если нужно больше то через стек), регистры 0-3 "рабочие" и могут меняться внутри функции, регистры 8-14 меняться не должны (если в функции они используются то в начале функции нужно их сохранить на стек или еще куда, а в конце восстановить) в MIPS по идее тоже должно быть что-то подобное. --- Конец цитаты --- Мне кажется, тот, кто знает как встраивать сторонние рутины в код, в любом случае будет смотреть, какие регистры можно использовать сразу, а какие потребуется восстановить. Всё же зависит в каком месте вклиниться. |
| megavolt85:
--- Цитата: paul_met от 22 Сентябрь 2019, 19:42:18 ---Всё же зависит в каком месте вклиниться. --- Конец цитаты --- для SH архитектуры всё как сказал MetalliC, R0-R3 можно менять как угодно, R4-R7 это аргументы, если требуется изменение R8-R14 MACL MACH, то необходимо сохранить в стек и восстанавливать перед возвратом, R15 это стек, R0 - возвращаемое значение если это не void функция я знаю только одно исключение где регистры имеют другое назначение, это bleemcast, но не на все 100, потому что в нём используются KATANA библиотеки |
| paul_met:
--- Цитата: megavolt85 от 22 Сентябрь 2019, 22:29:04 ---для SH архитектуры всё как сказал MetalliC, R0-R3 можно менять как угодно, R4-R7 это аргументы, если требуется изменение R8-R14 MACL MACH, то необходимо сохранить в стек и восстанавливать перед возвратом, R15 это стек, R0 - возвращаемое значение если это не void функция --- Конец цитаты --- По опыту общения с SH-2, разработчики не особо то и придерживаются данного распределения. Используют любые регистры (кроме R15), когда они свободны. Что мне мешает использовать регистры R4-R7 в подпрограмме, если я вижу, что далее по коду значения в этих регистрах обновляются? |
| MetalliC:
paul_met, по опыту общения с суперхитачами от 1го до 4го - оно везде одинаково. к примеру, последний месяц занимался ковырянием кода SH-2 (Capcom CPS-3) - всё то же самое. потому что на ассемблере никто игр не пишет уже более четверти века как, всё пишется на C или C++, а их компиляторы используют соглашение о вызове функций, так что везде аргументы передаются в R4/R5/итп, а результат (если он есть) возвращается в R0. исключение составляют лишь некоторые вшитые в либу компилятора оптимизированные функции, типа memcpy() фиксированного числа выровненных данных, либо функции деления или остатка, там да, аргументы могут передаваться в R0/R1. видимо аналог __fastcall |
| paul_met:
--- Цитата: MetalliC от 22 Сентябрь 2019, 23:35:54 ---потому что на ассемблере никто игр не пишет уже более четверти века как, всё пишется на C или C++, а их компиляторы используют соглашение о вызове функций, так что везде аргументы передаются в R4/R5/итп, а результат (если он есть) возвращается в R0. --- Конец цитаты --- Может, я чего-то не понимаю, но почему речь зашла о разработке игр? В данном случае хакинг и перекомпиляция кода не предусматривается. Мы просто добавляем новую рутину в свободное место и делаем её вызов в нужный момент. Так зачем заботится о всяких соглашениях, если я пишу код на ассемблере и вижу какие регистры можно использовать в конкретный момент? |
| megavolt85:
--- Цитата: paul_met от 23 Сентябрь 2019, 08:28:52 ---Так зачем заботится о всяких соглашениях, если я пишу код на ассемблере и вижу какие регистры можно использовать в конкретный момент? --- Конец цитаты --- потому что так удобней, когда придерживаешься стандарта не нужно держать в голове много лишнего |
| Mr2:
На winXP, после сжатия файла, выскакивает браузер папок, вместо браузера сохранения файла. Это баг или фитча? :? |
| paul_met:
--- Цитата: Mr2 от 24 Сентябрь 2019, 05:07:43 ---На winXP, после сжатия файла, выскакивает браузер папок, вместо браузера сохранения файла. Это баг или фитча? :? --- Конец цитаты --- Так и должно быть, так как имя файла и расширение генерируется автоматически. |
| Mr2:
--- Цитата: paul_met от 24 Сентябрь 2019, 07:13:49 ---Так и должно быть, так как имя файла и расширение генерируется автоматически. --- Конец цитаты --- Тогда путь к файлу неверный, так как файл сохраняется не в выбранную папку, а до неё. А имя папки копируется в имя файла. Также файл не сохраняется на рабочий стол, через браузер папок. --- Цитата: paul_met от 22 Сентябрь 2019, 19:24:41 ---Я в курсе, но другие могут и не знать. Так что, лучше сразу разжевать, чем использовать эти "ругательные сокращения". --- Конец цитаты --- В описании к программе, стоит указать формат сжатия, так как искать будут RLE, а не Simple Tools. |
| paul_met:
--- Цитата: Mr2 от 24 Сентябрь 2019, 12:16:22 ---В описании к программе, стоит указать формат сжатия, так как искать будут RLE, а не Simple Tools. --- Конец цитаты --- Это ты просто знаешь, что там RLE. А так искать будут просто по категории. Но я в любом случае будут корректировать описание. |
| Mr2:
--- Цитата: paul_met от 24 Сентябрь 2019, 16:52:10 ---А так искать будут просто по категории. --- Конец цитаты --- Я говорю о том случае, когда кому-то конкретно нужен RLE архиватор. Ещё было бы неплохо, если бы по умолчанию в браузере была выбрана папка Simple Tools. И выбор другой папки, сохранялся до завершения программы. ;) |
| Sharpnull:
--- Цитата: Mr2 от 27 Сентябрь 2019, 05:34:47 ---Ещё было бы неплохо, если бы по умолчанию в браузере была выбрана папка Simple Tools. И выбор другой папки, сохранялся до завершения программы. ;) --- Конец цитаты --- Мимо проходил, думаю может опять кто-то использует раздражающий меня диалог выбора и правда тот самый, в котором нельзя вставить путь. Я обычно копирую в проводнике путь и вставляю, а здесь неудобно выбирать: А вот хороший диалог: "Плохой" почему-то вылезает при использовании флагов OFN_ENABLEHOOK | OFN_EXPLORER в GetOpenFileName(). Сейчас определил, что можно вставить адрес в "Имя файла", чтобы выбрать папку, это правда контринтуитивно и не так удобно как адрес у нормального диалога. Зачем в данной программе хук, тоже интересно. |
| paul_met:
--- Цитата: Mr2 от 27 Сентябрь 2019, 05:34:47 ---Ещё было бы неплохо, если бы по умолчанию в браузере была выбрана папка Simple Tools. И выбор другой папки, сохранялся до завершения программы. --- Конец цитаты --- Первое предложение я считаю признаком дурного тона - зачем засорять рабочий каталог программы "левыми" файлами? Их там насобирается тонна, а потом чисти его, боясь зацепить ненароком файлы самой программы. А над вторым предложением можно подумать. |
| Mr2:
--- Цитата: paul_met от 27 Сентябрь 2019, 08:23:05 ---Первое предложение я считаю признаком дурного тона - зачем засорять рабочий каталог программы "левыми" файлами? Их там насобирается тонна, а потом чисти его, боясь зацепить ненароком файлы самой программы. --- Конец цитаты --- Проблема раздута, пользователь может создать папку Simple Tools\files для работы, и никакой проблемы с чисткой не возникнет. Это удобнее чем сохранять на рабочий стол, а потом копировать в нужную папку, или добираться до нужной папки через браузер. --- Цитата: Sharpnull от 27 Сентябрь 2019, 07:22:39 ---Мимо проходил, думаю может опять кто-то использует раздражающий меня диалог выбора и правда тот самый, в котором нельзя вставить путь. --- Конец цитаты --- В браузере папок, именно так.(открывается после сжатия файла) |
| paul_met:
--- Цитата: Mr2 от 28 Сентябрь 2019, 05:11:43 ---Проблема раздута, пользователь может создать папку Simple Tools\files для работы, и никакой проблемы с чисткой не возникнет. --- Конец цитаты --- У меня другая точка зрения - в каталоге любой программы ничего не должно быть, кроме её файлов. В любом случае файлы придётся копировать - так зачем мешать мух с котлетами? --- Цитата: Mr2 от 28 Сентябрь 2019, 05:11:43 ---Это удобнее чем сохранять на рабочий стол, а потом копировать в нужную папку, или добираться до нужной папки через браузер. --- Конец цитаты --- Про рабочий стол вообще не было разговора. Лично я никогда ничего туда не сохраняю. Проще сохранять просто в корень любого диска и ходить далеко не надо. |
| SeregaZ:
помница для своего редактора, который вроде как портабельный, решил сделать общую папку в моих документах. ведь у ромхакера может быть несколько версий игры, которые он ведет, а программа скачивает с тырнета архивы с музыкой. вот я и подумал пусть во всех версиях читается из этой общей папки, то есть единожды скаченный архив с музыкой будет доступен для добавления в любой версии ромхака пользователя. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |