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

Читатель - читателю - новый способ компрессии.


                       НОВЫЙ СПОСОБ КОМПРЕССИИ.
(C) А. Васильев г. Скалистый.

      Пишу я Вам о новом способе компрессии  данных. По сути дела, это
вновь усовершенствованная RLE-компрессия.
      Но ближе к сути дела. Как всем давно известно, файл после RLE-сжатия, 
состоит из двух чередующихся друг за другом ячеек (я не говорю "байтов", потому 
что это не всегда так). Так вот, в первой из них хранится количество повторений  
некоего значения, а во втором - непосредственно само значение. Но нередко 
встречаются такие паразитные случаи, когда в первую ячейку попадает единица. И 
если таковых больше, то может произойти совсем не компрессия, а сами знаете что. 
Но раз эти случаи, как я сказал, паразитные, то с ними надо бороться, как и со 
всеми паразитами. Именно это и делает моя прцедурка. Каким образом? Сейчас 
объясню.
      Самое  главное здесь - это информационный или справочный (кому, как 
больше нравится)  файл. Информация в него будет заносится не байт за байтом, а 
бит за битом (слева направо).
      Если в нашем сжатом RLE-файле в первой ячейке будет стоять единица, то мы
ее "уберем" а в справочном файле, чтобы помнить об этом, включим левый бит. 
Затем перейдем к следующей паре ячеек. Если здесь первая ячейка также будет 
содержать единицу, то мы поступим так же: "вытащим" ее и включим второй слева 
бит. А если там не паразитная единица, то ничего вытаскивать не будем, а в 
справочном файле тогда ничего не будем включать.
      Дальше будем рассматривать 3 пару ячеек и третий слева бит и так далее 
до конца RLE-файла. В конце концов чего-то там да уменьшится.
      Приведенная ниже процедура компрессии не содержит в себе RLE-компресии. 
Таким образом она будет работать с уже сжатым RLE-методом файлом. А 
декомпиляция - вернет файл в первоночальное положение перед RLE-сжатием.

 Процедура компрессии (длина = 95 байт):

;COMPRESSOR - 3
;special for "INFORCOM"
;(C) Vasilyev Alexey, 1996
         LD    HL,ADR1
         LD    DE,ADR2
         LD    BC,ADR3
BEGIN    LD    A,(HL)
         CP    1
         JR    Z,CONT
         XOR   A
         RLA
         LD    A,(INF)
         RLA
         LD    (INF),A
         CALL  P1
         LD    A,(HL)
         LD    (DE),A
         INC   HL
         INC   DE
         LD    A,(HL)
         LD    (DE),A
         INC   HL
         INC   DE
         JR    P2
CONT     LD    A,#80
         RLA
         LD    A,(INF)
         RLA
         LD    (INF),A
         CALL  P1
         INC   HL
         LD    A,(HL)
         LD    (DE),A
         INC   HL
         INC   DE
P2       PUSH  BC
         LD    BC,(LARGE)
         DEC   BC
         DEC   BC
         LD    (LARGE),BC
         LD    A,B
         OR    C
         JR    NZ,BEGIN
         LD    A,(INF)
         LD    (BC),A
         RET
P1       LD    A,(DINF)
         INC   A
         LD    (DINF),A
         CP    8
         RET   NZ
         XOR   A
         LD    (DINF),A
         LD    A,(INF)
         LD    (BC),A
         INC   BC
         RET
INF      DEFB  0
DINF     DEFB  0
LARGE    DEFW  NN

Здесь 
      ADR1 - адрес начала сжимаемого фай-
             ла;
      ADR2 - куда писать сжатый файл;
      ADR3 - куда писать инфо-файл,
    в LARGE указывается длина файла.

         Декомпрессор:   (89 байт)

         LD    HL,ADR1
         LD    DE,ADR2
         LD    BC,ADR3
START    LD    A,(BC)
         LD    (NUM),A
         INC   BC
BEGIN    LD    A,(NUM)
         RLA
         LD    (NUM),A
         LD    A,0
         RLA
         CP    1
         JR    Z,CONT
         PUSH  BC
         LD    B,(HL)
         INC   HL
         LD    A,(HL)
MET      LD    (DE),A
         INC   DE
         DJNZ  MET
         INC   HL
         POP   BC
         CALL  PP1
         CALL  PP1
         LD    A,B
         OR    C
         RET   Z
         JR    PP2
CONT     LD    A,(HL)
         LD    (DE),A
         INC   HL
         INC   DE
         CALL  PP1
         LD    A,B
         OR    C
         RET   Z
PP2      LD    A,(DNUM)
         INC   A
         LD    (DNUM),A
         CP    8
         JR    NZ,BEGIN
         XOR   A
         LD    (DNUM),A
         JR    START
PP1      PUSH  BC
         LD    BC,(LAR)
         DEC   BC
         LD    (LAR),BC
         POP   BC
         RET
NUM      DEFB  0
DNUM     DEFB  0
LAR      DEFW  NN

Здесь
      ADR1 - адрес сжатого файла;
      ADR2 - адрес справочного файла;
      ADR3 - куда писать декомпр. файл,
      в LAR хранится длина сжатого файла.
***************************************************************************



СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Письмо №287 - Ханты-Мансийский Автономный округ - Югра АО, Кондинский р-н, пгт Междуреченский
Металлургия - Как расширить память компьютера "БАЛТИКА" до 512 Кб.
Непонятка - список программ написанных рязанской группой Invaders 8.
Merlin - Волшебная Melin против NT.
Игрушки - секрет успеха игры Jet Set Willy выпущенной в 1984 году.

В этот день...   21 ноября