Форум PSCD.ru

Игровые приставки и Эмуляция => Ромхакинг и программирование => Уроки / Документация => Тема начата: SPOT от 25 ноября 2016, 19:18

Название: Хранение сжатой графики 1BBP
Отправлено: SPOT от 25 ноября 2016, 19:18
Хранение сжатой графики 1BBP
 
В этой статье я хочу рассмотреть один из примеров сжатия графики в играх. В частности, мы будем рассматривать игру Altered Beast для Sega Master System (SMS).
 
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-52922700-1480093878.png)
В игре сжат шрифт, он хранится в формате 1BPP.
 
1BPP (Метод хранение несжатой графики 1BPP) (http://pscd.ru/forum/index.php?/topic/316-khranenie-neszhatoi-grafiki-na-razlichnykh-igrovy/?p=3277)
 
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-85636000-1480093878.png)
Шрифт хранится в роме по адресу $1BFE4
 
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-10213800-1480093879.png)
Оранжевым цветом выделены байты, имеющие отношение к сжатию.
 
Чтобы не забыть сразу скажу, что «архив» начинается со «служебного байта».
 
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-27998200-1480093879.png)
Рассмотрим первый кусок сжатой графики 09 00 90
 
 
Первый байт (09) – сколько раз повторить второй байт. В нашем случае 9 раз.
В несжатом виде это выглядело бы следующим образом: 00 00 00 00 00 00 00 00 00.
 
Второй байт (00) – собственно говоря, сама графика. Этот байт будет повторён 9 раз.
 
Третий байт (90) – указывает через какое расстояние будет следующий блок сжатой графики.
 
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-82584100-1480094444.png)
А следующий блок будет через 16 байт (0x90 - 0x80 = 0x10). Он расположен по адресу $1BFF7 (04 DA 86)
Отсчёт начинается с 80, максимальное значение FF.
 
Для наглядности:
81 смещение на 1 байт.
82 смещение на 2 байт.
...
FF смещение на 127 байт.
 
Все числа до 0x80, код игры воспринимает как количество повторов следующего байта.
 
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-45974500-1480093879.png)
Рассмотрим ещё один кусок сжатой графики расположенный по адресу $1C01F (02 34 04 18 89)
 
Первый байт (02) – сколько раз повторить второй байт. В нашем случае 2 раза.
Второй байт (34) - графика. Этот байт будет повторён 2 раза.
Третий байт (04) – сколько раз повторить второй байт. В нашем случае 4 раза.
Четвёртый байт (18) - графика. Этот байт будет повторён 4 раза.
Пятый байт (89) – указывает через какое расстояние будет следующий блок сжатой графики.
0x90 - 0x80 = 0x09 (через 9 байт)
 
В распакованном виде дынные имеют следующий вид 34 34 18 18 18 18
Название: Re: Хранение сжатой графики 1BBP
Отправлено: SPOT от 25 ноября 2016, 19:39
(http://pscd.ru/forum/uploads/monthly_11_2016/post-95-0-10213800-1480093879.png)
Хочу обратить внимание читателей на недоработку данного метода.  
 
Адрес: $1C000
Дынные: 03 66 8F
В распакованном виде: 66 66 66
То есть что запакованные данные, что распакованные, они занимают один размер 3 байта.
Но это ещё не самый худший случай.
 
Адрес: $1C07F
Дынные: 02 C2 02 64 94
В распакованном виде: C2 C2 64 64
Сжатые данные занимают 5 байт, а расжатые 4 байта. Превышение в 1 байт.
Название: Re: Хранение сжатой графики 1BBP
Отправлено: Greengh0st от 26 ноября 2016, 05:44
Малорик)))
Название: Re: Хранение сжатой графики 1BBP
Отправлено: PSXDev от 26 ноября 2016, 14:30
Я примерно так себе и представлял самое простое сжатие графики. Спасибо, что всё объясняете очень понятно и буквально на пальцах так сказать, что это становится понятным даже домохозяйке.
 
Хорошо, что вы дали ответ на то, как разжать сжатую графику.