hej!
nie wiem jak bardzo krytyczna jest prędkość dekompresji... jednak możnaby się pokusić o kompresję bitową... jeżeli to jest dla twojego zastosowania odpowiednie można podejsc do problemu nieco inaczej... w przypadku takiego rozkladu danych wejściowych, należałoby zastosować jakiś kod, w którym długość słowa okreslajacego dany znak, nie jest stała. Najbardziej logicznym wydaje się zastosowanie bardzo prostego kodowania bitowego, np. możemy zastosować taki algorytm...
potrzebujeby procedury get_bit, która umożliwia pobranie jednego bitu danych ze wejścia.
1. zerujemy "index"
2. pobieramy jeden bit
3. zwiekszamy index o 1
4. sprawdzamy czy pobrany bit=1, jeżeli nie wracamy do kroku #2
5. wartość index określa jednoznacznie daną ktory pobralismy, mozemy go wykorzystac do pobrania odpowiedniej wartosci z tablicy konwersji.
reasumujac, kodowanie bedzie wygladalo mniej wiecej tak:
1: kod oznaczajacy dana #1
01: kod oznaczajacy dana #2
001: kod oznaczajacy dana #3
0001: kod oznaczajacy dana #4
itd.
jak widac ilosc bitów przeznaczonych na zakodowania kolejnego symbolu rośnie dość szybko... jednak w przypadku twojego rozkładu danych (70% będzie reprezentowane przez pojedynczy bit). Ma to szanse sporej kompresji. Musisz sprobowac w praktyce. Zreszta istnieje bardzo duzko koów o zmiennej dlugosci slowa... mozesz sprobowac poczytac troche tu:
http://en.wikipedia.org/wiki/Prefix_code
i tu:
http://en.wikipedia.org/wiki/Universal_ … ression%29
procka dekompresji moze byc dosc krotka i przy dobrej implementacji get_bit, powinna byc szybka:
get_one_byte:
ldx #$00
loop:
jsr get_bit ; get bit w znaczniku "C" zwraca wartosc pobranego bitu
inx
bcc lopp
lda tab_cnv,x
rts
; tutaj tablica konwersj, najczesciej wystepujace elementy powinny byc kodowane najmniejsza iloscia bitów :)
; czyli będą się znajdowały na początk u tablicy... im dalej w tablicy tym wiecej bitów potrzeba :)
tab_cnv:
dta b($04),b($03),b($02),b($01)
get_bit:
; tutaj w/g twojego uznania... jest sporo sposobów :)
; a implementacja zalzey od tego czy uzyjesz rejestrow, lokacji na stronie zerowej... itd.
jest to jedno z prymitywniejszych kodowań o zmiennej długości słowa... i nie wiem czy to bedzie przydatne ze wzgledu na szybkosc, jednak kompresja powinna byc efektywna dla twoich danych :)
pozdrawiam
Seban/SLIGHT