Mefistotel
Парни, не могу вспомнить, где-то выкладывали пакер/анапкер для алгоритма RLE, применяемого фирмой Конами в своих играх на NES. Во вложении расжатая тайловая карта и пожатая алгоритмом RLE. Может у кого есть в загашнике упаковщик. Особенности местного алгоритма, что кодирует как цепочки из повторяющихся байтов, так и цепочки из последовательных байтов.
P. S. По-моему нашёл что-то нужно на Zophar-e . Судя, по названию, похоже на какой-то развод. Хотя...
Надо скачать питон, чтобы понять, работает ли это.
1. Mefistotel - 28 Февраля, 2016 - 03:18:31 - перейти к сообщению
2. alex_231 - 28 Февраля, 2016 - 03:18:45 - перейти к сообщению
alex_231
Там же описан принцип сжатия, сам бы и написал. Алгоритм-то действительно простой.
Там же описан принцип сжатия, сам бы и написал. Алгоритм-то действительно простой.
3. TrickZter - 28 Февраля, 2016 - 03:19:05 - перейти к сообщению
TrickZter
Я бы RLE не относил к экстриму
Рассмотрим первые несколько байт пожатого ресурса:
00 20 4B 00 8B 61 62 90 91 92 93 94 95 B3 B4 73 06 00
Смотрим первый бит первого байта, если он равен нулю, то идёт копирование нескольких байтов, если единице значит идёт несколько непожатых байтов.
Первый байт у нас 00, а его старший бит, соответственно - 0. Значит дальше идёт несколько одинаковых байт, длина определяется 7-ю младшими битами, то есть длина у нас будет 0. Дальше идёт байт, который у нас множится 0 раз. то есть пара 00 20 распаковывается в ничто
Смотрим следующий байт: 4B
У него старший бит равен нулю, значит будет множество одинаковых байтов, их количество берём из младших семи бит 01001011, то есть длина отрезка с одинаковыми байтами - 4B. За ним идёт байт из которого составляется этот отрезок - 00. То есть пара 4B 00 превращается в состоящий из 00 отрезок длиной в 4B (75 в десятичной системе).
Теперь опять идёт флаговый байт: 8B
Смотрим его старший бит - он равен 1, значит дальше идёт не пожатый отрезок. Его длину получаем из 7 младших битов 10001011, то есть длина получается 0B. Следующие 0B (11 в десятичной системе) байтов у нас не пожатые: 61 62 90 91 92 93 94 95 B3 B4 73
И снова идёт флаговый байт, на этот раз он 06.
Смотрим первый бит, он равен нулю, остальные 7 бит дают длину отрезка - 06. Следующий за ним байт говорит из какого байта состоит отрезок - 00. То есть пара 06 00 превращается в шесть нулей (00 00 00 00 00 00).
З.Ы.: Возможно первые два байта и не предназначены для распаковки. Они могут служить просто индикатором RLE сжатия. Так что, если перепакованный ресурс вдруг начнёт выглядеть в игре странно, можно будет попробовать подставить перед ним байты 00 20. Они в любом случае не навредят, так как распаковываются в ничто.
Я бы RLE не относил к экстриму
Рассмотрим первые несколько байт пожатого ресурса:
00 20 4B 00 8B 61 62 90 91 92 93 94 95 B3 B4 73 06 00
Смотрим первый бит первого байта, если он равен нулю, то идёт копирование нескольких байтов, если единице значит идёт несколько непожатых байтов.
Первый байт у нас 00, а его старший бит, соответственно - 0. Значит дальше идёт несколько одинаковых байт, длина определяется 7-ю младшими битами, то есть длина у нас будет 0. Дальше идёт байт, который у нас множится 0 раз. то есть пара 00 20 распаковывается в ничто
Смотрим следующий байт: 4B
У него старший бит равен нулю, значит будет множество одинаковых байтов, их количество берём из младших семи бит 01001011, то есть длина отрезка с одинаковыми байтами - 4B. За ним идёт байт из которого составляется этот отрезок - 00. То есть пара 4B 00 превращается в состоящий из 00 отрезок длиной в 4B (75 в десятичной системе).
Теперь опять идёт флаговый байт: 8B
Смотрим его старший бит - он равен 1, значит дальше идёт не пожатый отрезок. Его длину получаем из 7 младших битов 10001011, то есть длина получается 0B. Следующие 0B (11 в десятичной системе) байтов у нас не пожатые: 61 62 90 91 92 93 94 95 B3 B4 73
И снова идёт флаговый байт, на этот раз он 06.
Смотрим первый бит, он равен нулю, остальные 7 бит дают длину отрезка - 06. Следующий за ним байт говорит из какого байта состоит отрезок - 00. То есть пара 06 00 превращается в шесть нулей (00 00 00 00 00 00).
З.Ы.: Возможно первые два байта и не предназначены для распаковки. Они могут служить просто индикатором RLE сжатия. Так что, если перепакованный ресурс вдруг начнёт выглядеть в игре странно, можно будет попробовать подставить перед ним байты 00 20. Они в любом случае не навредят, так как распаковываются в ничто.
4. alex_231 - 28 Февраля, 2016 - 03:19:18 - перейти к сообщению
alex_231
В архиве неполные файлы, т. е. Packmap оборван, он должен заканчиваться флаговым байтом FF.
В архиве неполные файлы, т. е. Packmap оборван, он должен заканчиваться флаговым байтом FF.
5. TrickZter - 28 Февраля, 2016 - 03:19:34 - перейти к сообщению
TrickZter
Да, и это надо учитывать при запаковке. Если количество разных байт превышает 7E, то флаговый байт следует ограничить этим значением (FE), иначе игрушка посчитает его концом RLE.
Цитата:
В архиве неполные файлы, т. е. Packmap оборван, он должен заканчиваться флаговым байтом FF.
Да, и это надо учитывать при запаковке. Если количество разных байт превышает 7E, то флаговый байт следует ограничить этим значением (FE), иначе игрушка посчитает его концом RLE.
6. Mefistotel - 28 Февраля, 2016 - 03:19:52 - перейти к сообщению
Mefistotel
Я считал, что это размер архива, h0200 - 512 байт.
Парни, я знаю, как это работает, но научиться програмировать у меня банально не было времени и не будет. Это факт.
Поэтому и ищу готовый компрессор. Сейчас с этой кладбищенской уткой разберусь только. Скачал 3 питон, ругается зараза на синтаксис.
Хотя всё понятно изложено:
-c compresses BINARY and sticks it into FILENAME at OFFSET. Don't blame me if it overwrites stuff because the new compressed data is larger -- that is your own fault. My compression is 1-to-1 identical to Konami's and compresses data to exactly match Konami's version.
-d opens FILENAME, goes to OFFSET, decompressed everything and saves it to BINARY.
Соответсвенно, в батнике прописал:
P.S. Обновил архив от начала до hFF, убрав ненужные байты в начале.
Цитата:
Возможно первые два байта и не предназначены для распаковки.
Я считал, что это размер архива, h0200 - 512 байт.
Парни, я знаю, как это работает, но научиться програмировать у меня банально не было времени и не будет. Это факт.
Поэтому и ищу готовый компрессор. Сейчас с этой кладбищенской уткой разберусь только. Скачал 3 питон, ругается зараза на синтаксис.
Хотя всё понятно изложено:
CODE:
graveduck.py -c [FILENAME] [OFFSET] [BINARY]
graveduck.py -d [FILENAME] [OFFSET] [BINARY]
graveduck.py -d [FILENAME] [OFFSET] [BINARY]
-c compresses BINARY and sticks it into FILENAME at OFFSET. Don't blame me if it overwrites stuff because the new compressed data is larger -- that is your own fault. My compression is 1-to-1 identical to Konami's and compresses data to exactly match Konami's version.
-d opens FILENAME, goes to OFFSET, decompressed everything and saves it to BINARY.
Соответсвенно, в батнике прописал:
CODE:
Причем адрес пробовал вводить и через 0x, $ и h, и в десятичной системе. Пока бесполезно.graveduck.py -d DandyENG.nes hFD72 map
pause
pause
P.S. Обновил архив от начала до hFF, убрав ненужные байты в начале.
7. Mefistotel - 28 Февраля, 2016 - 03:20:07 - перейти к сообщению
Mefistotel
Ну вот. Джинни был написан декомпрессор и компрессор. Програмка то нужная. RLE алгоритм пожатия тайловых карт в каждой второй игре на НЕС. У меня карта разжатая без палитры была, то есть без 64 байт.
Во вложении программы. В архиве также находятся исходные коды для Дельфи, bat файлы для примера и прочее необходимое для понимания процесса.
P. S. Кстати, игрушка Adventures of Bayou Billy, The (U) [!]. :P
Ну вот. Джинни был написан декомпрессор и компрессор. Програмка то нужная. RLE алгоритм пожатия тайловых карт в каждой второй игре на НЕС. У меня карта разжатая без палитры была, то есть без 64 байт.
Во вложении программы. В архиве также находятся исходные коды для Дельфи, bat файлы для примера и прочее необходимое для понимания процесса.
P. S. Кстати, игрушка Adventures of Bayou Billy, The (U) [!]. :P
8. Mefistotel - 28 Февраля, 2016 - 03:20:21 - перейти к сообщению
Mefistotel
Гайв, иконки намутишь? Ещё бы гуи нормальный.
Гайв, иконки намутишь? Ещё бы гуи нормальный.
9. Марат - 28 Февраля, 2016 - 03:20:36 - перейти к сообщению
Марат
Ну, пусть заодно и GUI версию сделает. Раз исходники есть.
Ну, пусть заодно и GUI версию сделает. Раз исходники есть.
10. Guyver - 28 Февраля, 2016 - 03:20:49 - перейти к сообщению
Guyver
Иконка
Иконка
11. Guyver - 28 Февраля, 2016 - 03:21:16 - перейти к сообщению
Guyver
Как я понимаю, иконку нужно одну, ведь гуи можно сделать общим для 2 программ? Если не извращаться - можно сделать посторонний exe, а всё остальное будет в папке. И этот exe сам будет переписывать инфу в батники, сам их запускать - т.е. будет видимость того, что это этот exe всё и делает. Я так всегда делаю, если есть консольное приложение (например не моё) и батник для его запуска. Пишу нужную мне "оболочку" - и делов! Минут на 20 всего делов ;о)))))))))
Как я понимаю, иконку нужно одну, ведь гуи можно сделать общим для 2 программ? Если не извращаться - можно сделать посторонний exe, а всё остальное будет в папке. И этот exe сам будет переписывать инфу в батники, сам их запускать - т.е. будет видимость того, что это этот exe всё и делает. Я так всегда делаю, если есть консольное приложение (например не моё) и батник для его запуска. Пишу нужную мне "оболочку" - и делов! Минут на 20 всего делов ;о)))))))))
12. Guyver - 28 Февраля, 2016 - 03:21:28 - перейти к сообщению
Guyver
Короче, я уже почти всё сделал...
Короче, я уже почти всё сделал...
13. Марат - 28 Февраля, 2016 - 03:21:41 - перейти к сообщению
Марат
Может сразу оконную программу сделать? Без консолей. У тебя же исходники есть.
Может сразу оконную программу сделать? Без консолей. У тебя же исходники есть.
14. Guyver - 28 Февраля, 2016 - 03:21:55 - перейти к сообщению
Guyver
Да просто мне так неохота в чужом коде копаться... Эх...
Вот сделал так, пока работает только если файлы лежат в той же директории, что и программа. Ещё и имена сохраняемым файлам надо давать на инглише (но это же и у Джинна так, ибо батники, и получается если файл даже исходный на кириллице - ничего работать не будет). Но это решаемо, дело 5 минут...
П.С. Я и свой-то код через пару дней уже не узнаю, а уж чужой ;о))) Тем более, если его автор, ну вы понимаете... ;о) Вы смотрели его код когда-нить? Это же ужас до чего непонятно всё ;о))))))))
Да просто мне так неохота в чужом коде копаться... Эх...
Вот сделал так, пока работает только если файлы лежат в той же директории, что и программа. Ещё и имена сохраняемым файлам надо давать на инглише (но это же и у Джинна так, ибо батники, и получается если файл даже исходный на кириллице - ничего работать не будет). Но это решаемо, дело 5 минут...
П.С. Я и свой-то код через пару дней уже не узнаю, а уж чужой ;о))) Тем более, если его автор, ну вы понимаете... ;о) Вы смотрели его код когда-нить? Это же ужас до чего непонятно всё ;о))))))))
15. Марат - 28 Февраля, 2016 - 03:23:03 - перейти к сообщению
Марат
Смотрел конечно. Уже сколько его программ у меня лежат.
Смотрел конечно. Уже сколько его программ у меня лежат.
16. Guyver - 28 Февраля, 2016 - 03:23:16 - перейти к сообщению
Guyver
Такс, проблему с кириллицей решил!
Такс, проблему с кириллицей решил!
17. alex_231 - 28 Февраля, 2016 - 03:23:44 - перейти к сообщению
alex_231
А вот и неправда :P в Djinn Tile Mapper'е всё понятно написано было (до того, как я за него взялся ), и даже кодеки не стали большой проблемой.
Цитата:
Да просто мне так неохота в чужом коде копаться... Эх...
...
П.С. Я и свой-то код через пару дней уже не узнаю, а уж чужой ;о))) Тем более, если его автор, ну вы понимаете... ;о) Вы смотрели его код когда-нить? Это же ужас до чего непонятно всё ;о))))))))
...
П.С. Я и свой-то код через пару дней уже не узнаю, а уж чужой ;о))) Тем более, если его автор, ну вы понимаете... ;о) Вы смотрели его код когда-нить? Это же ужас до чего непонятно всё ;о))))))))
А вот и неправда :P в Djinn Tile Mapper'е всё понятно написано было (до того, как я за него взялся ), и даже кодеки не стали большой проблемой.
18. Guyver - 28 Февраля, 2016 - 03:24:08 - перейти к сообщению
Guyver
Такс, кое-как домой приплёлся, вот что успел доделать - сделал, вроде нормально, но не мешало бы потестить (особенно с разными папками в разных местах и с именами, в том числе с пробелами и кириллицей с латиницей)
По идее теперь косяков быть не должно... Можно брать файлы откуда угодно и с какими угодно именами (я надеюсь ;о)))). Если так покатит - то я уменьшу вес проги раз так в 10, если эта поделка того стоит и если уменьшение веса вообще нужно с исходным весом под 400 кБ. Перепишу на KOL.
KONAMI UP (unpacker/packer)
По-моему, даже хорошо, что остаются консольные версии и батники - как раз для любителей таких дел, коих порядочное количество. А для прочих - главный файл, а остальные файлы вынесены в отдельную папку и никому не мешают... Даже не видно что батники работают, я скрыл их запуск... И Джинни не будет нервничать и волноваться - это как с патчами получится. Его проги мы не трогали, код не изменяли и даже исходники не смотрели ;о))))))))))))))))))))
Только я вот про это не понял:
0xaddress - адрес начало сжатого блока в оригинальном файле. Если вы используете уже вынутый блок запакованных данных, то данный параметр можно опустить.
Какого вида число в батник надо вставлять? А то в примере адреса нет. В анпакере же такого адреса нет, да? Только в анпакере?
Т.е. вводить надо так: 0x5F к примеру? Шестнадцетиричный вид? Или как? Я сделал 16-ричный. Работает, кажется, но верный результат или нет - я точно не знаю... Надо протестировать на каком-нить роме, зная адрес начала пакета...
Такс, кое-как домой приплёлся, вот что успел доделать - сделал, вроде нормально, но не мешало бы потестить (особенно с разными папками в разных местах и с именами, в том числе с пробелами и кириллицей с латиницей)
По идее теперь косяков быть не должно... Можно брать файлы откуда угодно и с какими угодно именами (я надеюсь ;о)))). Если так покатит - то я уменьшу вес проги раз так в 10, если эта поделка того стоит и если уменьшение веса вообще нужно с исходным весом под 400 кБ. Перепишу на KOL.
KONAMI UP (unpacker/packer)
По-моему, даже хорошо, что остаются консольные версии и батники - как раз для любителей таких дел, коих порядочное количество. А для прочих - главный файл, а остальные файлы вынесены в отдельную папку и никому не мешают... Даже не видно что батники работают, я скрыл их запуск... И Джинни не будет нервничать и волноваться - это как с патчами получится. Его проги мы не трогали, код не изменяли и даже исходники не смотрели ;о))))))))))))))))))))
Только я вот про это не понял:
0xaddress - адрес начало сжатого блока в оригинальном файле. Если вы используете уже вынутый блок запакованных данных, то данный параметр можно опустить.
Какого вида число в батник надо вставлять? А то в примере адреса нет. В анпакере же такого адреса нет, да? Только в анпакере?
Т.е. вводить надо так: 0x5F к примеру? Шестнадцетиричный вид? Или как? Я сделал 16-ричный. Работает, кажется, но верный результат или нет - я точно не знаю... Надо протестировать на каком-нить роме, зная адрес начала пакета...
19. Mefistotel - 28 Февраля, 2016 - 03:24:26 - перейти к сообщению
Mefistotel
Володя, "0x" в 0xaddress говорит об том, что адреса нужно вводить в шестнадцатиричном исчислении. Особенность синтаксиса некоторых языков.
То есть 0x5F - это правильно.
Вечерком проверю работу программы.
Володя, "0x" в 0xaddress говорит об том, что адреса нужно вводить в шестнадцатиричном исчислении. Особенность синтаксиса некоторых языков.
То есть 0x5F - это правильно.
Вечерком проверю работу программы.
20. Guyver - 28 Февраля, 2016 - 03:24:43 - перейти к сообщению
Guyver
Давай, лови баги. Надеюсь, она у тебя хотя бы 1 раз сработает как надо ;о)))
Давай, лови баги. Надеюсь, она у тебя хотя бы 1 раз сработает как надо ;о)))
21. Mefistotel - 28 Февраля, 2016 - 03:24:55 - перейти к сообщению
Mefistotel
Работает твой гуй как надо. Удивительно.)
Работает твой гуй как надо. Удивительно.)
22. Guyver - 28 Февраля, 2016 - 03:25:12 - перейти к сообщению
Guyver
Самый для меня затык, обычно, в папках. Если разные вещи в разных папках находятся - это прямо беда. Пока все условия сделаешь - жесть. Я ещё прогу доделаю, поставлю ограничение на адрес, чтобы нельзя было ввести адрес больше, чем сам файл, и другие мелкие вещи надо доработать...
П.С. Это ещё что, видели бы вы что я понаписал для снятия дампов НЕС - у меня там автоматизированная прога, по звуковой волне контролирует запись с выводом графика в реальном времени. Жесткач полнейший ;о)))
Самый для меня затык, обычно, в папках. Если разные вещи в разных папках находятся - это прямо беда. Пока все условия сделаешь - жесть. Я ещё прогу доделаю, поставлю ограничение на адрес, чтобы нельзя было ввести адрес больше, чем сам файл, и другие мелкие вещи надо доработать...
П.С. Это ещё что, видели бы вы что я понаписал для снятия дампов НЕС - у меня там автоматизированная прога, по звуковой волне контролирует запись с выводом графика в реальном времени. Жесткач полнейший ;о)))
23. Guyver - 28 Февраля, 2016 - 03:25:33 - перейти к сообщению
Guyver
Залил на сайт последнюю версию программы: http://chief-net.ru/images/ostal noe/konami_up.rar
Изменения:
1. Программа при закрытии удаляет все временные файлы, которые появляются в папке dll в процессе работы.
2. Добавлено описание файла программы - щелчок правой кнопки мыши на файле программы - Свойства - вкладки Общие и Подробно.
3. Введена проверка адреса при распаковке, если он больше либо равен файлу - выводится предупреждение.
4. Пофиксил (надеюсь все!) грамматические ошибки.
5. Ввёл фильтр "все файлы" в диалоги открытия и сохранения файлов.
6. Сделал надпись внизу программы с копирайтами кликабельной, ссылка ведёт на наш сайт.
В самом архиве навёл порядок. В нём теперь 2 папки:
1. папка dll - в ней 2 джинновских ехе и 2 пустых (!) батника. Именно пустыми они и должны быть, чтобы не было в них следов предыдущего запуска. Точнее не пустыми, а с пятью строчками, заполненными пробелами.
2. папка source - содержит 2 папки:
Konami_packer и Konami_unpacker с исходными кодами Джинна и его пояснениями (с исправленными опечатками в батниках и описаниях!)
Дописал немного Readme.txt в архиве с программой.
Исправил на самом сайте страницу с программой и картинку залил нормальную.
Прошу ещё раз потестить, кому не лень. А то мало ли что...
Залил на сайт последнюю версию программы: http://chief-net.ru/images/ostal noe/konami_up.rar
Изменения:
1. Программа при закрытии удаляет все временные файлы, которые появляются в папке dll в процессе работы.
2. Добавлено описание файла программы - щелчок правой кнопки мыши на файле программы - Свойства - вкладки Общие и Подробно.
3. Введена проверка адреса при распаковке, если он больше либо равен файлу - выводится предупреждение.
4. Пофиксил (надеюсь все!) грамматические ошибки.
5. Ввёл фильтр "все файлы" в диалоги открытия и сохранения файлов.
6. Сделал надпись внизу программы с копирайтами кликабельной, ссылка ведёт на наш сайт.
В самом архиве навёл порядок. В нём теперь 2 папки:
1. папка dll - в ней 2 джинновских ехе и 2 пустых (!) батника. Именно пустыми они и должны быть, чтобы не было в них следов предыдущего запуска. Точнее не пустыми, а с пятью строчками, заполненными пробелами.
2. папка source - содержит 2 папки:
Konami_packer и Konami_unpacker с исходными кодами Джинна и его пояснениями (с исправленными опечатками в батниках и описаниях!)
Дописал немного Readme.txt в архиве с программой.
Исправил на самом сайте страницу с программой и картинку залил нормальную.
Прошу ещё раз потестить, кому не лень. А то мало ли что...
24. Марат - 28 Февраля, 2016 - 03:25:47 - перейти к сообщению
Марат
А почему кроме цифр ничего не вводится. Надо разрешить ввод букв ABCDEF и надо чтоб можно было обозначать в каком счислении вводится адрес. Либо знаком $, либо 0x.
А почему кроме цифр ничего не вводится. Надо разрешить ввод букв ABCDEF и надо чтоб можно было обозначать в каком счислении вводится адрес. Либо знаком $, либо 0x.
25. Guyver - 28 Февраля, 2016 - 03:25:59 - перейти к сообщению
Guyver
Можно вводить, только в английской раскладке и ЗАГЛАВНЫМИ. Значок 16-чный подрисую перед полем...
Можно вводить, только в английской раскладке и ЗАГЛАВНЫМИ. Значок 16-чный подрисую перед полем...
26. Марат - 28 Февраля, 2016 - 03:26:14 - перейти к сообщению
Марат
А почему только?
Цитата:
... ЗАГЛАВНЫМИ...
А почему только?
27. Guyver - 28 Февраля, 2016 - 03:26:26 - перейти к сообщению
Guyver
Лан, сделаю и мелкими тогда.
Лан, сделаю и мелкими тогда.
28. Guyver - 28 Февраля, 2016 - 03:26:39 - перейти к сообщению
Guyver
Перезалил на сайт.
Изменения:
1. В поле ввода можно вводить как мелкие, так и строчные буквы A B C D E F.
2. Если ввести в окно всякий шлак с помощью мыши и копирования-вставки, то при распаковке весь мусор из поля уберётся и останутся только 16-ричные значения...
3. Написал над полем ввода адреса "hex address"
Т.е. если ввести строку (копипастом, мышкой)
ПривеFG 90cSr шёлк)-=3.4
То в поле останется
F90C34
После нажатия кнопки распаковать...
Перезалил на сайт.
Изменения:
1. В поле ввода можно вводить как мелкие, так и строчные буквы A B C D E F.
2. Если ввести в окно всякий шлак с помощью мыши и копирования-вставки, то при распаковке весь мусор из поля уберётся и останутся только 16-ричные значения...
3. Написал над полем ввода адреса "hex address"
Т.е. если ввести строку (копипастом, мышкой)
ПривеFG 90cSr шёлк)-=3.4
То в поле останется
F90C34
После нажатия кнопки распаковать...
29. Mefistotel - 28 Февраля, 2016 - 03:26:52 - перейти к сообщению
Mefistotel
На повестке дня вопрос добавления в программу алгоритмов работы с пожатыми картами, в которых два старших бита указывают на режим распаковки.
На повестке дня вопрос добавления в программу алгоритмов работы с пожатыми картами, в которых два старших бита указывают на режим распаковки.
30. Guyver - 28 Февраля, 2016 - 03:27:12 - перейти к сообщению
Guyver
Ну... Исходники у вас есть, правьте в них. А Гуй можно прикрутить отдельно...
Ну... Исходники у вас есть, правьте в них. А Гуй можно прикрутить отдельно...