НОВЫЙ СПОСОБ КОМПРЕССИИ.
(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 хранится длина сжатого файла.
***************************************************************************