ZX-Ревю 1996 №7-8 1995 г.

Форум - к вопросу о компрессии.


   (С) Light  Серпухов, 1996

                       И ЕЩЕ О КОМПРЕССИИ.

   Данный компрессор относится к программам, использующим метод RLE, однако
он имеет некоторые отличия от них. Как Вы уже знаете, метод RLE основан на том,
что вместо повторяющегося несколько раз символа, сначала записывают код
символа, а затем число его повторов. Данный компрессор действует на несколько
другом принципе (хотя в основу положен тот же самый метод RLE).
   Представим, что мы имеем следующую последовательность:
   1,1,1,2,3,3,3 HEX
в двоичном представлении:
00000001,00000001,00000001,00000010,00000011,00000011,00000011

При сжатии информации используются следующие условия:
1. Первый байт записывается без изменения.
2. Если последующий байт равен предыдущему, то вместо него записывается бит = 0.
3. Если последующий байт не равен предыдущему, то вместо него записывается бит
= 1, a затем записывается значение самого байта.

   Т.о приведенная выше последовательность запишется в виде:

       третий
       байт (1)
       равен    четвертый
       предыд.  байт (2)   пятый
       (бит=0)  |          байт (3)
          |     |          |
          - --------- ---------
00000001,00100000,01010000,001100 или 1,20,50,30
-------- - -         -         --
   |     | |         |          |
   |     | |         |          |
первый   | четвертый |          |
байт (1) | байт      |          шестой и
         | не равен  |          седьмой
         | предыд.   |          байты (3)
         | (бит=1)   пятйы      равны
         |           байт (3)   предыд.
       второй        не равен   (биты=0)
       байт (1)      предыд.
       равен         (бит=1)
       предыду-
       щему
       (бит=0)

T.е. мы получили 4 байта вместо 7. Следует обратить внимание на то, что
последний байт оказался незаполненным.

   Сравним этот подход с классическим методом RLE.

 Ъ---------------------В--------------В-----------------ї
 і последовательность  і классический і рассматриваемый і
 і                     і    метод     і      метод      і
 і                     і    (байт)    і      (байт)     і
 Г---------------------Е--------------Е-----------------ґ
 іQQQQQQQQQQQQQQQQQQQQ і       2      і         4       і
 іAAAAAAAAAAQQQQQQQBBB і       6      і         6       і
 іABBCCCDDDDEEEEEFFFFF і      12      і         9       і
 іQAQAQAQAQAQAQAQAQAQA і      40      і        23       і
 А---------------------Б--------------Б-----------------Щ

  Анализируя эту таблицу, можно сделать выводы о границах применения данного
метода: он наиболее эффективен для компрессии повторяющихся чисел с малым
периодом повторения.

  Для более полного понимания и испытания данного метода приводим программу
компрессии:

;       (C) Light, Серпухов 1996

        ORG     40000
        ENT     $
        LD      HL,0001
        LD      (INCR),HL       ;Счетчик длины закомпрессированного блока.
        LD      A,%11111111
        LD      (BITE),A        ;Контроль заполнения байта. Необходим, так как
                                ;информация записывается побитно.
        LD      HL,50000
        LD      (BUFF),HL       ;Адрес буфера для записи скомпрессированного
                                ;блока.
        LD      HL,16384
        LD      DE,6912
        PUSH    DE
        LD      A,(HL)          ;Читаем первый байт.
        LD      C,A             ;Дублируем для сравнения с ним
                                ;последующих байт, т.е. делаем его образцовым.
        LD      E,8             ;Записываем в буфер все 8 бит.
        CALL    MOVE            ;переход к П/П записи числа побитно в буфер.
L5      INC     HL              ;Переходим к след. байту экрана.
        POP     DE
        DEC     DE
        LD      A,E
        OR      D
        RET     Z               ;Если весь экран скомпрессирован, то выход.
;
        PUSH    DE
        LD      A,(HL)
        CP      C               ;Последующий байт равен предыдущему ?
        JR      NZ,L3           ;Если не равен, то переход на L3.
        LD      E,1             ;Записываем в буфер 1 бит.
        LD      A,%00000000     ;Этот бит = 0.
        CALL    MOVE
        JR      L4
L3      LD      E,1
        LD      A,%10000000     ;Записываем в буфер бит = 1.
        LD      E,8             ;Т.к. считанный байт не равен предыдущему, то
        LD      A,(HL)          ;
        LD      C,A             ;делаем его образцовым и
        CALL    MOVE            ;записываем в буфер целиком.
L4      JR      L5
;
MOVE    PUSH    HL              ;Подпрограмма побитной записи чисел
L1      LD      HL,BITE         ;в буфер.
        SLA     (HL)            ;Входные данные:
        JR      C,L2            ;Е - количество записываемых бит.
        LD      (HL),#FE        ;А - записываемое число.
        LD      HL,(INCR)       ;
        INC     HL              ;Примечание: Первым записывается 7
        LD      (INCR),HL       ;бит, последним 0 бит.
        LD      HL,BUFF
        INC     (HL)
        JR      NZ,L2
        INC     HL
        INC     (HL)
L2      LD      HL,(BUFF)
        SLA     A
        RL      (HL)
        DEC     E
        JR      NZ,L1
        POP     HL
        RET
;
BUFF    DEFW    #0000
BITE    DEFB    #00
INCR    DEFW    #0000

   По окончании работы программы длину скомпрессированного блока можно взять
из ячейки INCR.



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Обратная связь - контакты редакции.
Обзор игрушек - Обзор новых игровых программ: PRO GOLF SINULATOR
Тема - Беседа с известным художником Fil/Antares произощедшая на Chaos Construction 2000.
Прогаммистам - переброска SCR за INT.
Софт - ZX Terminal 97 - вaщ пyть в Интepнeт (пo мaтepиaлaм фиpмы Cкopnиoн).

В этот день...   28 марта