ZX-Ревю 1991 №2 1990 г.

Machine code - программа декомпрессии.


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

INC C

7923

20

03

JR NZ,L1

7925

05

DEC B

7926

04

INC B

7927

С8

RET Z

7928

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

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 байта). В этом случае блок может даже увеличиться, но такие ситуации крайне редки, и как показала практика применения, обычно эффективность работы данного алгоритма компрессии высока и размер компрессированного блока более чем в два раза меньше исходного.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Реклама - пpиобpету pазличную инфоpмацию по "железу" ZX Spectrum.
Разное - О, сколько нам открытий чудных готовит...
Iron - У ZX-Sрectrum объем оперативной памяти 48кб, а у современныx Пентиумов 32... 64 мегабайта. Причем занимает она одинаковую физическую площадь...
От редактора - ZXТime вeрнyлcя олдcкyльноe рycло.
Enlight'97 - Неофициальные итоги Enlight'a.

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