процедурины для пакрвки-распаковки одного знакоместа
1.
Код:
; hl - адрес на экране
; de - куда пакуем
PACK1 push de
inc de
ld bc,#8000
xor a
lab_1 cp (hl)
jr z,lab_2
ld a,(hl)
ld (de),a
inc de
scf
lab_2 rr b
inc h
jr nc,lab_1
ex (sp),hl
ld (hl),b
pop hl
ret
; de - адрес на экране, куда распаковываем
; hl - откуда распаковываем
DEPACK1 ld b,(hl)
inc hl
ld c,8
xor a
depa_1 rr b
jr nc,depa_2
ld a,(hl)
inc hl
depa_2 ld (de),a
inc d
dec c
jr nz,depa_1
ret
этим лучше пакуются последовательности одинаковых байт
Дальше буду оъяснять на пальцах, потому как то, что я накодил под этот вариант не вполне понимаемо даже мной самим, да к тому же объёмно
и в варианте Vitamin'а, и в написаном выше упакованое знакоместо представляет собой следующее: (флаги,[данные])
если знакоместо пустое, оно представлено только одним нулевым байтом. У меня родилась следующая идея - берём 8 знакомест подряд, пакуем их (любым из двух методов) и составляем ещё один флаговый байт (обозначим flag2) - если знакоместо пустое (флаг=0), то мы сбрасываем бит в flag2 и данное знакоместо в поток не выводим (т.о пустое знакоместо у нас стягивается в 1 бит), а если не пустое - устанавливаем бит в flag2 и выдаём упакованое знакоместо в поток целиком.
поток тогда будет выглядеть так:
flag2,([флаги],[данные] - до 8 раз),flag2,...
На этом делается ещё 2 метода упаковки
и ещё один. экспериментальный, в теории жмёт лучше остальных.
берём 4 знакоместа и составляем flag2 таким образом
- если знакоместо пустое, в flag2 пихаем 00 и в поток ничего не идёт
- если знакоместо полное (8 байт #ff), в flag2 ложим 01, в поток - ничего
- ? по идее надо найти ещё одно распространённое знакоместо, которому будет соответствовать 10 в flag2
- иначе пакуем знакоместо (выбраным методом), ложим в flag2 11 и выдаём упакованое знакоместо в поток
Э... сам плохо понял, что сказал, но если что неясно - попробую вспомнить подробнее
Во вложении - прога упаковки ещё одним сумашедшим форматом
1. картинка сканируется на предмет полных знакомест
2. на основе скана создаётся 1й слой (битовый)
3. все продетектеные знакоместа из картинки стираются
4. остальное пакуется одним из двух методов (а потому как пустых знакомест стало больше, а они пакуются лучше всего, то и коэффициент сжатия увеличивается)