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

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

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

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

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

Addr  00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
----  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
0000  00 01 02 03 0d 1e 49 54 6f 92 9c a5 b7 d2 db f7  |......ITo.......|

0010  00 00 00 ff 00 ff 00 87 10 82 19 12 02 13 82 19  |................|
0020  1d 0d 19 1d 05 06 82 16 1a 1b 01 0d 06 02 07 01  |................|

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

4d80  82 10 00 10 00 40 70 50 20 10 30 80 00 10 0d 20  |.....@pP .0.... |
4d90  82 10 00 02 20 83 30 40 50 b0 70 05 f0 96 c0 83  |.... .0@P.p.....|
4da0  a0 01 20 82 00 82 40 01 00 ff 00 ff 00 84        |.. ...@.......  |

                                                00 00  |              ..|
4db0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
4dc0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
4dd0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
4de0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
4df0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|

С адреса 0000-000f (16 байт) - Цвета SPR-файла.
С адреса 0010-4dad           - SPR-данные (изображение).
С адреса 4dae-4dff           - Нулевые байты, они не нужны (их нужно пропустить).

Распаковка (распаковка начинается с конца):
----------
                                7   6   5   4   3   2   1   0
                              ---------------------------------
Шаг 1. Адрес 4dad, байт 84H = | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | <= Информационный байт.
                              ---------------------------------
                                |
    Старший бит установлен в единицу, значит байт 00H по адресу 4dac
    нужно записать в экранную область Вектор'a-06Ц 4-ре раза
    (берутся 7 бит: 0000100 = 4 раза).

                                7   6   5   4   3   2   1   0
                              ---------------------------------
Шаг 2. Адрес 4dab, байт FFH = | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <= Информационный байт.
                              ---------------------------------
                                |
    Старший бит установлен в единицу, значит байт 00H по адресу 4daa
    нужно записать в экранную область Вектор'а-06Ц 127 раз
    (берутся 7 бит: 1111111 = 127 раз).

                                7   6   5   4   3   2   1   0
                              ---------------------------------
Шаг 3. Адрес 4da9, байт FFH = | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | <= Информационный байт.
                              ---------------------------------
                                |
    Старший бит установлен в единицу, значит байт 00H по адресу 4da8
    нужно записать в экранную область Вектор'а-06Ц 127 раз
    (берутся 7 бит: 1111111 = 127 раз).


                                7   6   5   4   3   2   1   0
                              ---------------------------------
Шаг 4. Адрес 4da7, байт 01H = | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | <= Информационный байт.
                              ---------------------------------
                                |
    Старший бит установлен в ноль, значит байт 40H по адреса 4da6
    нужно переписать в экранную область Вектор'а-06Ц - переписать
    только один байт (берутся 7 бит: 0000001 = переписать 1 байт).

...
...
...

И так далее, пока не будет заполнена вся экранная область (адреса 8000-FFFF,
32768 байт) Вектор'а-О6Ц. Бит 7 информационного байта указывает есть ли 
повторяющиеся байты, бит 7 установлен в 1 - есть, бит 7 установлен в 0 - нет. 

Структура:

    ------------------- ---------- -----------------------
    | Цвета (16 байт) | | Данные | | Информационный байт | =>
    ------------------- ---------- -----------------------

       ---------- -----------------------     -----------------
    => | Данные | | Информационный байт | ... | Нулевые байты |
       ---------- -----------------------     -----------------

Cобственно сам TEST1.SPR:

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

;
; Распаковщик графики формата SPR (для процессора КР580ВМ80А, Intel 8080).
; В "HL" - конечный адрес SPR-файла в памяти.
;
        PUBLIC DSPR                                         ; ---
;                                                           ;
DSPR:                                                       ; Логическое "И"
        DCX    H    ;                                       ; Команды: ANA, ANI
        MOV    A,M  ; -> Пропустить нули.                   ;
        ORA    A    ;                                       ;    0 0 | 0
        JZ     DSPR ;                                       ;    0 1 | 0
;                                                           ;    1 0 | 0
        LXI    D,0FFFFH ; Экран с 8000H по FFFFH.           ;    1 1 | 1
GOTO1:                                                      ;
        MOV    A,D                                          ; Логическое "ИЛИ"
        CPI    080H                                         ; Команды: ORA, ORI
        RC     ; Распаковка закончена, выйти из п/п.        ;
;                                                           ;    0 0 | 0
        MOV    A,M                                          ;    0 1 | 1
        ANA    A                                            ;    1 0 | 1
        JM     GOTO3 ; Перейти (повтор байта).              ;    1 1 | 1
;                                                           ;
        MOV    B,A ; В регистре "B" сколько байт переслать. ; Исключающее "ИЛИ"
        DCX    H                                            ; Команды: XRA, XRI
:                                                           ;
; Неповторяющиеся байты.                                    ;    0 0 | 0 
; Пересылка байт.                                           ;    0 1 | 1 
GOTO2:                                                      ;    1 0 | 1 
        MOV    A,M                                          ;    1 1 | 0 
        STAX   D                                            ;
        DCX    D                                            ; ---
        DCX    H
        DCR    B ; В "B" сколько байт осталось. ; ---
        JNZ    GOTO2                            ;
        JMP    GOTO1                            ; Бит 7 - признак отрицательного результата.
;                                               ; S = 0 - команда JP.
; Повторяющиеся байты.                          ; S = 1 - команда JM.
; Повтор байта.                                 ;
GOTO3:                                          ; ---
        ANI    07FH
        MOV    B,A ; В регистре "B" сколько раз повторить байт.
        DCX    H
        MOV    A,M ; Взять байт из памяти, адрес в "HL".
GOTO4:
        STAX   D ; Записать в экранную область.     ; ---
        DCX    D                                    ;
        DCR    B ; В "B" сколько повторов осталось. ; Бит 6 - признак нулевого результата.
        JNZ    GOTO4                                ; Команды JZ и JNZ.
;                                                   ;
        DCX    H                                    ; ---
        JMP    GOTO1
        END

Примечание.
Ассемблер - красивый компактный язык программирования.

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


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

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


Удачного творчества!

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