Mefistotel
Парни, не могу вспомнить, где-то выкладывали пакер/анапкер для алгоритма RLE, применяемого фирмой Конами в своих играх на NES. Во вложении расжатая тайловая карта и пожатая алгоритмом RLE. Может у кого есть в загашнике упаковщик. Особенности местного алгоритма, что кодирует как цепочки из повторяющихся байтов, так и цепочки из последовательных байтов.
P. S. По-моему нашёл что-то нужно на
Zophar-e . Судя, по названию, похоже на какой-то развод.

Хотя...
Надо скачать питон, чтобы понять, работает ли это.
alex_231
Там же описан принцип сжатия, сам бы и написал. Алгоритм-то действительно простой.
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. Они в любом случае не навредят, так как распаковываются в ничто.
alex_231
В архиве неполные файлы, т. е. Packmap оборван, он должен заканчиваться флаговым байтом FF.
TrickZter
Цитата:В архиве неполные файлы, т. е. Packmap оборван, он должен заканчиваться флаговым байтом FF.
Да, и это надо учитывать при запаковке. Если количество разных байт превышает 7E, то флаговый байт следует ограничить этим значением (FE), иначе игрушка посчитает его концом RLE.
Mefistotel
Цитата:Возможно первые два байта и не предназначены для распаковки.
Я считал, что это размер архива, h0200 - 512 байт.
Парни, я знаю, как это работает, но научиться програмировать у меня банально не было времени и не будет. Это факт.
Поэтому и ищу готовый компрессор. Сейчас с этой кладбищенской уткой разберусь только.

Скачал 3 питон, ругается зараза на синтаксис.
Хотя всё понятно изложено:
CODE:graveduck.py -c [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:graveduck.py -d DandyENG.nes hFD72 map
pause
Причем адрес пробовал вводить и через 0x, $ и h, и в десятичной системе. Пока бесполезно.
P.S. Обновил архив от начала до hFF, убрав ненужные байты в начале.
Mefistotel
Ну вот. Джинни был написан декомпрессор и компрессор. Програмка то нужная. RLE алгоритм пожатия тайловых карт в каждой второй игре на НЕС. У меня карта разжатая без палитры была, то есть без 64 байт.
Во вложении программы. В архиве также находятся исходные коды для Дельфи, bat файлы для примера и прочее необходимое для понимания процесса.
P. S. Кстати, игрушка Adventures of Bayou Billy, The (U) [!]. :P
Mefistotel
Гайв, иконки намутишь? Ещё бы гуи нормальный.
Марат
Ну, пусть заодно и GUI версию сделает. Раз исходники есть.
Guyver
Как я понимаю, иконку нужно одну, ведь гуи можно сделать общим для 2 программ? Если не извращаться - можно сделать посторонний exe, а всё остальное будет в папке. И этот exe сам будет переписывать инфу в батники, сам их запускать - т.е. будет видимость того, что это этот exe всё и делает. Я так всегда делаю, если есть консольное приложение (например не моё) и батник для его запуска. Пишу нужную мне "оболочку" - и делов! Минут на 20 всего делов ;о)))))))))
Guyver
Короче, я уже почти всё сделал...
Марат
Может сразу оконную программу сделать? Без консолей. У тебя же исходники есть.
Guyver
Да просто мне так неохота в чужом коде копаться... Эх...
Вот сделал так, пока работает только если файлы лежат в той же директории, что и программа. Ещё и имена сохраняемым файлам надо давать на инглише (но это же и у Джинна так, ибо батники, и получается если файл даже исходный на кириллице - ничего работать не будет). Но это решаемо, дело 5 минут...
П.С. Я и свой-то код через пару дней уже не узнаю, а уж чужой ;о))) Тем более, если его автор, ну вы понимаете... ;о) Вы смотрели его код когда-нить? Это же ужас до чего непонятно всё ;о))))))))
Марат
Смотрел конечно. Уже сколько его программ у меня лежат.
Guyver
Такс, проблему с кириллицей решил!
alex_231
Цитата:Да просто мне так неохота в чужом коде копаться... Эх...
...
П.С. Я и свой-то код через пару дней уже не узнаю, а уж чужой ;о))) Тем более, если его автор, ну вы понимаете... ;о) Вы смотрели его код когда-нить? Это же ужас до чего непонятно всё ;о))))))))
А вот и неправда :P в Djinn Tile Mapper'е всё понятно написано было (до того, как я за него взялся

), и даже кодеки не стали большой проблемой.
Guyver
Такс, кое-как домой приплёлся, вот что успел доделать - сделал, вроде нормально, но не мешало бы потестить (особенно с разными папками в разных местах и с именами, в том числе с пробелами и кириллицей с латиницей)
По идее теперь косяков быть не должно... Можно брать файлы откуда угодно и с какими угодно именами (я надеюсь ;о)))). Если так покатит - то я уменьшу вес проги раз так в 10, если эта поделка того стоит и если уменьшение веса вообще нужно с исходным весом под 400 кБ. Перепишу на KOL.
KONAMI UP (unpacker/packer)
По-моему, даже хорошо, что остаются консольные версии и батники - как раз для любителей таких дел, коих порядочное количество. А для прочих - главный файл, а остальные файлы вынесены в отдельную папку и никому не мешают... Даже не видно что батники работают, я скрыл их запуск... И Джинни не будет нервничать и волноваться - это как с патчами получится. Его проги мы не трогали, код не изменяли и даже исходники не смотрели ;о))))))))))))))))))))
Только я вот про это не понял:
0xaddress - адрес начало сжатого блока в оригинальном файле. Если вы используете уже вынутый блок запакованных данных, то данный параметр можно опустить.
Какого вида число в батник надо вставлять? А то в примере адреса нет. В анпакере же такого адреса нет, да? Только в анпакере?
Т.е. вводить надо так: 0x5F к примеру? Шестнадцетиричный вид? Или как? Я сделал 16-ричный. Работает, кажется, но верный результат или нет - я точно не знаю... Надо протестировать на каком-нить роме, зная адрес начала пакета...
Mefistotel
Володя, "0x" в 0xaddress говорит об том, что адреса нужно вводить в шестнадцатиричном исчислении. Особенность синтаксиса некоторых языков.
То есть 0x5F - это правильно.
Вечерком проверю работу программы.
Guyver
Давай, лови баги. Надеюсь, она у тебя хотя бы 1 раз сработает как надо ;о)))
Mefistotel
Работает твой гуй как надо. Удивительно.)
Guyver
Самый для меня затык, обычно, в папках. Если разные вещи в разных папках находятся - это прямо беда. Пока все условия сделаешь - жесть. Я ещё прогу доделаю, поставлю ограничение на адрес, чтобы нельзя было ввести адрес больше, чем сам файл, и другие мелкие вещи надо доработать...
П.С. Это ещё что, видели бы вы что я понаписал для снятия дампов НЕС - у меня там автоматизированная прога, по звуковой волне контролирует запись с выводом графика в реальном времени. Жесткач полнейший ;о)))
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 в архиве с программой.
Исправил на самом сайте страницу с программой и картинку залил нормальную.
Прошу ещё раз потестить, кому не лень. А то мало ли что...
Марат
А почему кроме цифр ничего не вводится. Надо разрешить ввод букв ABCDEF и надо чтоб можно было обозначать в каком счислении вводится адрес. Либо знаком $, либо 0x.
Guyver
Можно вводить, только в английской раскладке и ЗАГЛАВНЫМИ. Значок 16-чный подрисую перед полем...
Guyver
Лан, сделаю и мелкими тогда.
Guyver
Перезалил на сайт.
Изменения:
1. В поле ввода можно вводить как мелкие, так и строчные буквы A B C D E F.
2. Если ввести в окно всякий шлак с помощью мыши и копирования-вставки, то при распаковке весь мусор из поля уберётся и останутся только 16-ричные значения...
3. Написал над полем ввода адреса "hex address"
Т.е. если ввести строку (копипастом, мышкой)
ПривеFG 90cSr шёлк)-=3.4
То в поле останется
F90C34
После нажатия кнопки распаковать...
Mefistotel
На повестке дня вопрос добавления в программу алгоритмов работы с пожатыми картами, в которых два старших бита указывают на режим распаковки.
Guyver
Ну... Исходники у вас есть, правьте в них. А Гуй можно прикрутить отдельно...