Potřebuji zapakovat grafická data pro PMD o velikosti 1kb. Nejprve jsem použili RLE komprimaci, výsledek byl cca 125 bajtů. Ale raději bych něco mačkavějšího a tak jsem použil ZX7 komprimaci, výsledek 72 bajtů. A to je hezké
Adresa source na WOSu
http://www.worldofspectrum.org/infoseekid.cgi?id=0027996Následně jsem přepsal dekoder ZX7 pro i8080, a tím přepsal jako že doslova, prostě jsem nic nevymýšlel. Jenže kód se díky tomu dost protáhl a rozpakování dat něco trvá. Mohla by se nějaká dobrá duše na to podívat a poradit. Aby se nám to trochu zrychlilo.
Tady soubor
http://mujweb.cz/mmartinka/dzx7_turbo.a80a výpis:
Kód:
; -----------------------------------------------------------------------------
; ZX7 decoder by Einar Saukas & Urusergi
; "Turbo" version (88 bytes, 25% faster)
; -----------------------------------------------------------------------------
; Parameters:
; HL: source address (compressed data)
; DE: destination address (decompressing)
; -----------------------------------------------------------------------------
.org 0
zaloha .equ 0x0FFE ;zaloha reg A
snimek .equ 0x1000 ;rozbalena data
data .equ 0x2000 ;komprimovana data
lxi h,data
lxi d,snimek
dzx7_turbo:
mvi a,0x80
dzx7t_copy_byte_loop:
;ldi ; copy literal byte
sta zaloha
mov a,m
stax d
inx h
inx d
dcx b
lda zaloha
dzx7t_main_loop:
add a ; check next bit
cz dzx7t_load_bits ; no more bits left?
jnc dzx7t_copy_byte_loop ; next bit indicates either literal or sequence
; determine number of bits used for length (Elias gamma coding)
push d
lxi b, 1
mov d,b
dzx7t_len_size_loop:
inr d
add a ; check next bit
cz dzx7t_load_bits ; no more bits left?
jnc dzx7t_len_size_loop
jmp dzx7t_len_value_start
; determine length
dzx7t_len_value_loop:
add a ; check next bit
cz dzx7t_load_bits ; no more bits left?
sta zaloha
; rl c
mov a,c
ral
mov c,a
; rl b
mov a,b
ral
mov b,a
lda zaloha
jc dzx7t_exit ; check end marker
dzx7t_len_value_start:
dcr d
jnz dzx7t_len_value_loop
inx b ; adjust length
; determine offset
mov e,m ; load offset flag (1 bit) + offset value (7 bits)
inx h
; sll e ; opcode for undocumented instruction "SLL E" aka "SLS E"
sta zaloha
mov a,e
ral
jc ccr
ori 0x01
stc
cmc
mov e,a
lda zaloha
jnc dzx7t_offset_end ; if offset flag is set, load 4 extra bits
ccr:
ori 0x01 ; pridat 1 na konec dokončení SLL
mov e,a
lda zaloha
stc
add a ; check next bit
cz dzx7t_load_bits ; no more bits left?
; rl d ; insert first bit into D
sta zaloha
mov a,d
ral
mov d,a
lda zaloha
add a ; check next bit
cz dzx7t_load_bits ; no more bits left?
; rl d ; insert second bit into D
sta zaloha
mov a,d
ral
mov d,a
lda zaloha
add a ; check next bit
cz dzx7t_load_bits ; no more bits left?
; rl d ; insert third bit into D
sta zaloha
mov a,d
ral
mov d,a
lda zaloha
add a ; check next bit
cz dzx7t_load_bits ; no more bits left?
cmc ; negativní Carry Flag
jc dzx7t_offset_end
inr d ; equivalent to adding 128 to DE
dzx7t_offset_end:
; rr e ; insert inverted fourth bit into E
sta zaloha
mov a,e
rar
mov e,a
lda zaloha
; copy previous sequence
xthl ; store source, restore destination
push h ; store destination
; sbc hl, de ; HL = destination - offset - 1
sta zaloha
mov a,l
sub e
mov l,a
mov a,h
sbb d
mov h,a
lda zaloha
dcx h
pop d ; DE = destination
; ldir
sta zaloha
ldir:
mov a,m
stax d
inx h
inx d
dcx b
mov a,c
ora c
jnz ldir
lda zaloha
dzx7t_exit:
pop h ; restore source address (compressed data)
jnc dzx7t_main_loop
jmp end
dzx7t_load_bits:
jc jecarry
mov a,m ; load another group of 8 bits
inx h
ral ;rla
cmc ;vymazat carry flag
ret
jecarry:
mov a,m ; load another group of 8 bits
inx h
ral ;rla
ret