Хранение сжатой графики 1BBP
В этой статье я хочу рассмотреть один из примеров сжатия графики в играх. В частности, мы будем рассматривать игру Altered Beast для Sega Master System (SMS).
В игре сжат шрифт, он хранится в формате 1BPP.
1BPP (Метод хранение несжатой графики 1BPP)
Шрифт хранится в роме по адресу $1BFE4
Оранжевым цветом выделены байты, имеющие отношение к сжатию.
Чтобы не забыть сразу скажу, что «архив» начинается со «служебного байта».
Рассмотрим первый кусок сжатой графики 09 00 90
Первый байт (09) – сколько раз повторить второй байт. В нашем случае 9 раз.
В несжатом виде это выглядело бы следующим образом: 00 00 00 00 00 00 00 00 00.
Второй байт (00) – собственно говоря, сама графика. Этот байт будет повторён 9 раз.
Третий байт (90) – указывает через какое расстояние будет следующий блок сжатой графики.
А следующий блок будет через 16 байт (0x90 - 0x80 = 0x10). Он расположен по адресу $1BFF7 (04 DA 86)
Отсчёт начинается с 80, максимальное значение FF.
Для наглядности:
81 смещение на 1 байт.
82 смещение на 2 байт.
…
FF смещение на 127 байт.
Все числа до 0x80, код игры воспринимает как количество повторов следующего байта.
Рассмотрим ещё один кусок сжатой графики расположенный по адресу $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