Устройство файла SNDVRAM.DAT
Начнём с краткого обзора файла SNDVRAM.DAT. Это файл в котором хранятся текстуры и звуки.
Файл разделён на две области, в одной хранятся текстуры, а в другой звуки.
Для примера будем рассматривать файл находящийся по адресу Q2DATA -> LEVELS -> QLOGOS2 -> SNDVRAM.DAT.
Открываем его в Hex-редакторе:
![post-95-0-10826400-1460450481.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-10826400-1460450481.png)
На рисунке изображён фрагмент файла (вид в Hex-редакторе), если быть более точным, то это «заголовок». Его-то в данном сообщение мы и рассмотрим.
![post-95-0-36260100-1460450481.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-36260100-1460450481.png)
Первые 4 байта всегда = 0x0C000000.
Это указатель на 0Ch, это первая часть файла, тут хранятся текстуры. Переворачиваем и получаем значение 0000000С.
![post-95-0-59803800-1460450481.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-59803800-1460450481.png)
Назначение следующих 4 байта.
Это указатель на следующую область файла, в ней хранятся звуки. Переворачиваем данные и получаем указатель на $45264.
![post-95-0-75472400-1460450481.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-75472400-1460450481.png)
Размер файла. Отсчёт начинается с самого начала 0h. Напомню, что данные хранятся в перевёрнутом виде. В файле данные имеют вид F8 C0 06 00. Мы их переворачиваем и получаем 00 06 C0 F8. Следовательно размер данных (файла) составляет 0x06C0F8.
![post-95-0-92470800-1460450481.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-92470800-1460450481.png)
Назначение следующих 4 байта.
![post-95-0-62791900-1461245340.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-62791900-1461245340.png)
Данный байт (02) обозначает сколько в файле (архиве) SNDVRAM.DAT хранится файлов с расширением *.opt. В нашем случае это два (2) файла tp0.opt и tp1.opt.
![post-95-0-79522600-1461245340.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-79522600-1461245340.png)
Далее так же идёт один байт (04). Он обозначает сколько в файле (архиве) SNDVRAM.DAT хранится файлов с расширением *. lbm. В нашем случае это четыре (4) файла chars.lbm, Legal.lbm, HamLogo.lbm и frontend.lbm.
![post-95-0-96904300-1461245340.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-96904300-1461245340.png)
Эти два байта (11 13) связаны с файлами *.opt. Что это конкретно, я пока не выяснил. Возможно количество элементов в одном изображении. Но данные байты нам важны для вычисления сколько место ниже отведено под *.opt.
Место, отведённое под *.opt, вычисляем по следующий формуле.
($F + $E - 16) * 0x20
В нашем случае:
(0x13 + 0x11 - 16) * 0x20 = 640 [280h]
0x20 в десятеричной системе равно 32. Видимо столько отведено под один элемент в изображении типа opt.
640 байт отведено тут под как-то данный для opt файлов.
![post-95-0-12017700-1460450482.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-12017700-1460450482.png)
Дальше идут данные по текстурам (графике).
![post-95-0-30249900-1460450482.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-30249900-1460450482.png)
Нас интересуют только текстуры, без пустого места под ними. Тут находится информация о шести текстурах с $10 по $3F включительно.
![post-95-0-48050300-1460450482.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-48050300-1460450482.png)
Информация об одной текстуре (графическом элементе) занимает 8 байт.
Если говорить коротко сначала идёт указатель (поинтер) на графические данные, а потом ширина и высота.
![post-95-0-69041800-1460450482.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-69041800-1460450482.png)
В начале идёт указатель на графику (текстуру), он занимает 4 байта. Напомню, что данные хранятся в перевёрнутом виде. В файле данные имеют вид F1 0C 00 00. Мы их переворачиваем и получаем 00 00 0C F1. Поинтер (указатель) имеет вид 0x0CF1.
Отсчёт указателя начинается с $C. То есть, чтобы узнать, где начало графики нам нужно к указателю добавить 0xС.
0x0CF1+0xС = 0xCFD [CFDh].
CFDh – тут начинаются «картинка».
![post-95-0-85507300-1460450482.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-85507300-1460450482.png)
2 байта = Ширина
Данные 2 байта обозначают Ширину изображения. В файле данные имеют вид 80 00. Мы их переворачиваем и получаем 00 80. Это 128 пикселей. То есть Ширина изображения = 128 пикселей.
![post-95-0-77996600-1460450489.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-77996600-1460450489.png)
2 байта = Высота
Данные 2 байта обозначают Высоту изображения. В файле данные имеют вид 00 01. Мы их переворачиваем и получаем 01 00. Это 256 пикселей. То есть Высота изображения = 256 пикселей.
![post-95-0-93326000-1461246393.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-93326000-1461246393.png)
После данных о текстурах идёт 512 байт пустоты с $40 по $240. Это конечно не буквальная пустота, а мусор из байт 00 80. Но никакого практического применения им нет.
![post-95-0-18820000-1461246394.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-18820000-1461246394.png)
Далее идут те самые данные об *.opt файлах, которые мы вычисляли выше по формуле. 640 байт с $240 по $4C0.
![post-95-0-95883400-1461247009.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-95883400-1461247009.png)
Далее идёт палитра первого изображения формата lbm. В нашем случае это палитра для файла chars.lbm. Палитра занимает 512 байт с $4C0 по $6C0. Эта палитра в формате TBGR / A1B5G5R5. Как её перевести в цвета написано в TIM 16-bit (actual colors) [TBGR / A1B5G5R5].
После идёт ещё три палитры для Legal.lbm, HamLogo.lbm и frontend.lbm.
После палитры идёт названия файлов.
По основной информации всё. Пожалуй, так же стоит упомянуть, что каждое из изображений имеет название (быть может это исходный файл).
![post-95-0-02432000-1460450490.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-02432000-1460450490.png)
Названия идут в том же порядке, что и изображения. Названия разделены между собой байтом 00.
![post-95-0-28747300-1460450490.png](http://pscd.ru/forum/uploads/monthly_04_2016/post-95-0-28747300-1460450490.png)
Видим что первому элементу соответствует название tp0.opt.
Прикрепленные изображения