2. ПРОГРАММА ДЕКОМПРЕССИИ
Продолжение. Начало на стр. 6
Если Вы внимательно разобрали программу компрессии, то Вам не составит труда понять работу и этой программы, т.к. здесь зачастую повторяются некоторые фрагменты, которые мы подробно рассмотрели в прошлом выпуске. Приступаем к работе.
LD HL, 32768 LD BC,DLIN LD DE, 16334 L0 DEC C INC C JR NZ,L1 DEC B INC B RET Z
L1 LD A,(HL) LDI
CP (HL) JR NZ,L0 LDI
PUSH BC LD C,(HL) INC HL LD B,(HL) INC HL
L4 DEC C INC C JR NZ,L2 DEC B INC B JR Z,L3
L2 LD (DE),A INC DE DEC BC
JR L4 L3 POP BC DEC BC
JR L0
В HL-адрес скомпрессированного блока. DLIN - длина блока, взятая из программы компрессии. Адрес экрана в паре DE. Проверка BC на 0. Если 0, т.е. все коды декомпрессированы, то возврат.
B акк-р байт из скомпрессированной области. Перезапись байта в экран. следующий = предыдущему? если нет, то на L0 перезаписать еще 1 байт в экран. BC сохраняем в стеке. берем новое значение из области скомпрессированной, оно эквивалентно числу копирования байта А в экран.область. проверка BC на 0.
если 0, то идти на восстановление старого ВС,
т.к. мы уже скопировали A определенное число раз.
А копировать в экран еще раз.
счетчик адресов в экране увеличивается на 1.
счетчик количества оставшихся
копий аккумулятора уменьшить на 1
идти на проверку ВС.
восстановить прежнее BC.
увеличить BC на Е т.к. мы уже сняли 2 байта, которые указывали кол-во копий А. идти на L0
Теперь оттранслируем эту программу с адреса 31000.
Поле сод. памяти метки мнемокод памяти
7916 21 00 80 LD HL,32768
791B 01 91 0С LD BC,DLIN ; Здесь в качестве параметра DLIN стоит число
0С91, что конечно же является частным случаем. У Вас может стоять другое число,
зависящее от того, что Вы получите после того, как отработает программа компрессии.
791Е 11 00 40 LD DE,16384
7921 0D L0 DEC C
79Е2 |
0С |
|
|
INC C |
7923 |
20 |
03 |
|
JR NZ,L1 |
7925 |
05 |
|
|
DEC B |
7926 |
04 |
|
|
INC B |
7927 |
С8 |
|
|
RET Z |
7928 |
7Е |
|
L1 |
LD A,(HL) |
7929 |
ED |
A0 |
|
LDI |
792В |
BE |
|
|
CP (HL) |
792С |
20 |
F3 |
|
JR NZ,L0 |
792E |
ED |
A0 |
|
LDI |
7930 |
C5 |
|
|
PUSH ВС |
7931 |
4E |
|
|
LD C,(HL) |
7932 |
23 |
|
|
INC HL |
7933 |
46 |
|
|
LD B,(HL) |
7934 |
23 |
|
|
INC HL |
7935 |
0D |
|
L4 |
DEC C |
7936 |
0С |
|
|
INC C |
7937 |
20 |
04 |
|
JR NZ,L2 |
7939 |
05 |
|
|
DEC B |
793A |
04 |
|
|
INC B |
793В |
38 |
05 |
|
JR Z,L3 |
793D |
12 |
|
L2 |
LD (DE),A |
793E |
13 |
|
|
INC DE |
793F |
0B |
|
|
DEC ВС |
7940 |
18 |
F3 |
|
JR L4 |
7942 |
C1 |
|
L3 |
POP ВС |
7943 |
0B |
|
|
DEC ВС |
7944 |
0B |
|
|
DEC ВС |
7945 |
18 |
DA |
|
JR L0 |
Загрузите в память блок кодов, сброшенный программой компрессии, сделайте RANDOMIZE USR 31000. На экране та же картинка, но на ленте она занимает меньше места.
В заключении хочется отметить, что данный алгоритм не всегда приводит к требуемому результату (когда много последовательностей, где одинаковых 2-3 байта). В этом случае блок может даже увеличиться, но такие ситуации крайне редки, и как показала практика применения, обычно эффективность работы данного алгоритма компрессии высока и размер компрессированного блока более чем в два раза меньше исходного.