Skip to content
Demidov Stanislav (St.) edited this page Oct 26, 2022 · 75 revisions

Вектор-06Ц. Конвертер графических файлов GRF в BMP.

Лицензия: GNU GPL V3.

Как устроен GRF-файл (в качестве примера взят файл TEST.GRF):

Примечание.
Этот материал не является полным руководством по распаковке GRF-файлов.

Addr  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
----  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
0000  ff f6 b6 ff 5b 00 9b 08 ad ad ad f6 08 00 00 00  |....[...........|

0010  c3 b7 ee fb ff ed 6e db bb 6c ff 7e ff 6e ee f6  |......n..l.~.n..|
0020  ff df fe db 77 dd 7e 76 77 fd dd b6 f7 b7 cd b7  |....w.~vw.......|

....  .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..  ..................
....  .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..  ..................
....  .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..  ..................

5f40  fd bf fe ff db fe 7e db ec ff fe dd db 7e db fb  |......~......~..|
5f50  6c bb bb ee b3 99 6c 74 64 f0 ec ec f2 d9 d1 e4  |l.....ltd.......|
5f60  b2 b1 cd b3 6c bb ec ec 93 cc cd 27 d9 91 4d 33  |....l......'..M3|
5f70  26 99 64 26 32 24 89 22 01 13 49 20 24 08 04 00  |&.d&2$."..I $...|
5f80  04 09 00 81 80 14 00 81 20 13 00 00 ff ff df ff  |........ .......|
5f90  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|
5fa0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|
5fb0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|
5fc0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|
5fd0  ff ff ff ff ff ff fe ff ff ff ff ff ff ff ff ff  |................|
5fe0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|
5ff0  ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  |................|

С адреса 0000-000f (16 байт) - Цвета GRF-файла.
С адреса 0010-5fff           - GRF-данные (изображение) с мусором в конце.

Конец GRF-данных, без мусора в конце, не известен!
Распаковка закончится, если распаковщик найдёт нулевой байт.
Распаковка начинается после пропуска 16 байт цветов.

Структура:

    ------------------- ---------------- ---------- ----------------
    | Цвета (16 байт) | | Информ. байт | | Данные | | Информ. байт | =>
    ------------------- ---------------- ---------- ----------------
       ----------     ---------------- -----------------
    => | Данные | ... | Нулевой байт | | Мусор в конце |
       ----------     ---------------- -----------------
    Примечание.
    Информ. байт - Информационный байт.

Информационный байт GRF-файла отличается от информационного байта SPR-файла.

    Информационный байт GRF-файла.

    Если 7 бит 0 - Повтор повторяющегося байта.
    Если 7 бит 1 - Пересылка неповторяющихся байт.
    Остальные биты (6, 5, 4, 3, 2, 1, 0) - сколько раз повторить байт или сколько переписать неповторяющихся байт.
    Информационный байт SPR-файла.

    Если 7 бит 0 - Пересылка неповторяющихся байт.
    Если 7 бит 1 - Повтор повторяющегося байта.
    Остальные биты (6, 5, 4, 3, 2, 1, 0) - сколько раз повторить байт или сколько переписать неповторяющихся байт.

Примечание.
GRF-файл не может быть больше 32 кб.
Это связано с алгоритмом, и архитектурой Вектор'а-06Ц (UKR).
С SPR-файлом дело обстоит чуть иначе.

Oops!

XX век, 90-е годы.

Распаковщик (ассемблер):

;
; Распаковщик графики формата GRF (для процессора КР580ВМ80А, Intel 8080).
; В "HL" - начальный адрес GRF-данных в памяти.
;

        PUBLIC DEPACK                                        ; ---
                                                             ;
DEPACK:                                                      ; Логическое "И"
        LXI     D,08000H                                     ; Команды: ANA, ANI
        LXI     H,DATA+010H ; Начальный адрес GRF-данных.    ;
;                                                            ;    0 0 | 0
LOOP1:                                                       ;    0 1 | 0
        MOV     A,M                                          ;    1 0 | 0
        ANA     A                                            ;    1 1 | 1
        JZ      EXIT ; Распаковка закончена.                 ;
        JP      FILL                                         ; Логическое "ИЛИ"
;                                                            ; Команды: ORA, ORI
        ANI     07FH                                         ;
        MOV     C,A ; В регистре "C" сколько байт переслать. ;    0 0 | 0
        INX     H                                            ;    0 1 | 1
;                                                            ;    1 0 | 1
; Неповторяющиеся байты.                                     ;    1 1 | 1
; Пересылка байт.                                            ;
LOOP2:                                                       ; Исключающее "ИЛИ"
        MOV     A,M                                          ; Команды: XRA, XRI
        STAX    D ; Записать байт в экранную область.        ;
        INX     H                                            ;    0 0 | 0
        INX     D                                            ;    0 1 | 1
        DCR     C ; В "C" сколько байт осталось.             ;    1 0 | 1
        JNZ     LOOP2                                        ;    1 1 | 0
        JMP     LOOP1                                        ;
;                                                            ; ---
; Повторяющиеся байты.
; Повтор байта.
FILL:
        MOV     C,A ; В регистре "C" сколько раз повторить байт.
        INX     H
        MOV     A,M ; Взять байт из памяти, адрес в "HL". ; ---
                                                          ;
LOOP3:                                                    ; Бит 7 - признак отрицательного результата.
        STAX    D ; Записать в экранную область.          ; S = 0 - команда JP.
        INX     D                                         ; S = 1 - команда JM.
        DCR     C ; В "C" сколько повторов осталось.      ;
        JNZ     LOOP3                                     ; ---
;                                           ; ---
        INX     H                           ;
        JMP     LOOP1                       ; Бит 6 - признак нулевого результата.
;                                           ; Команды JZ и JNZ.
EXIT:   RET                                 ;
                                            ; ---

Ассемблер в Русской Вики
Ассемблер в Украинской Вики

Биты они как искусство - вечны!
В первые это услышал от Рыкова В. в 90-х годах XX века.
Здорово!


Посмотрите ещё это: Как устроен SPR файл
И это: RLE кодирование/декодирование своими руками (VRLE8, VRLE16)

Дополнительно посмотрите ещё это:
RLE кодирование в Русской Вики, RLE кодирование в Украинской Вики


Ukraine (Украина). (C) Демидов С.В.