Обнаружил вот такой отрывок кода в памяти приставки:
AA 55 55 AA AA 55 55 AA AA 55 55 AA AA 55 55 AA
В роме же эта последовательность сжата следующим образом:
AA 55 55 AA 94 7E
То есть здесь скопировали не один байт, как в разобранных выше примерах, а 4 байта.
1001 0100 0111 1110
С байтом 94 всё понятно, он действительно указывает на байт AA, а вот глядя на последние 5 бит становится уже не понятно:
11110=30
Прибавив 3, получаем 33.
Т.е. процесс копирования мне нужно повторить 33 раза (вместо положенных 3-х раз) =) Возможно немного неверно предположение, что последние 5 бит - это биты, отвечающие за кол-во циклов копирования..
И, исходя из того, что тут копируется сразу 4 байта, где-то здесь должно быть указание на кол-во копируемых байтов.
На написание распаковщика кол-во копируемых байт никак не повлияет, нужно лишь добавить некоторые условия. А вот написать запаковщик я пока затрудняюсь, т.к. чисто визуально-то видно что можно сжать представленную выше последовательность, но как это определить программно, я сказать затрудняюсь. Ведь в процессе запаковки я делаю проверку в цикле
пока[b] [/i]последующий бит равен предыдущему[/i] [b]начало
считаю кол-во одинаковых байт, увеличивая счётчик на 1.
конец цикла
если кол-во одинаковых байт больше 3 то
сжимаю данные
иначе
записываю их без изменения
конец условия
Можно попробовать реализовать проверку ещё и на наличие одинаковых байт через определённый интервал, но что-то я не понимаю как это реализовать...
p.s. Здесь начинает посещать мысль о том, что легче распаковать и запаковать все нужные данные вручную.. Причём распаковка - это просто копирование байт из памяти эмулятора.
Отредактировано Ace Lightning (2011-05-20 23:49:07)