1

Temat: kompresja

Mam sobie program, który zajmuje obszar $2000..$A10F. Potrzebuję skompresować ten program tak, żeby zajął maksymalnie obszar $2000..$9C1F.
Procedura dekompresji nie może używać obszaru pod jakimkolwiek ROM-em (ma to działać na Atari 400/800), jak i ekranu - najlepiej gdyby siedziała sobie na stosie, albo na stronie 6.
Ponieważ nie ma miejsca na osobny obszar danych skompresowanych, to najlepiej gdyby dekompresor podczas rozpakowywania nadpisywał obszar danych skompresowanych.
Czy możecie mi coś polecić i ew. objaśnić sposób używania (aż do dzisiaj nie miałem potrzeby używać takich narzędzi)?

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

2

Odp: kompresja

exomizer, w paczce z mads-em

albo Super Packer http://madteam.atari8.info/uzytki/sp.7z
masz wtedy możliwość przetestowania 3-ech wariantów (Deflater, Ezomizer, LZ4)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

3

Odp: kompresja

Dzięki tebe. Exomizer wystarczy w zupełności - robi dokładnie to, czego potrzebuję bez pisania jednej linijki kodu.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

4

Odp: kompresja

Dla potomnych: DJ Packer tez to potrafi (znaczy nadpisywac spakowane dane podczas rozpakowywania)

5

Odp: kompresja

to jeszcze przypomnę o starym pacekerze od SoTe...

http://atariki.krap.pl/index.php/Packer_v2.2

6

Odp: kompresja

exomizer 3.0

https://bitbucket.org/magli143/exomizer/wiki/Home

zmiana formatu zapisu danych, lepszy stopień kompresji, krótszy/szybszy dekompresor

dla zachowania kompatybilności z exomizer 2.0 należy użyć przełącznika -P0

exomizer mem -P0 -l0xLOAD_ADDRESS -c <INPUT_FILENAME> -o <OUTPUT_FILENAME>
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

7

Odp: kompresja

Tak w temacie: Tebe, może ty będziesz wiedział:
Nie za bardzo rozumiem, jak używać Exomizera do rozpakowywania plików z danymi w programie, chodzi mi o to, że najpierw pakuje na PC pliki z danymi i potem chce je wypakować w obszar niedostępny dla DOS. Nie widzę w pliku exodecrunch.asm możliwości ustawienia miejsca w pamięci w który ma się rozpakować plik.
Poza tym nie za bardzo rozumiem, czym jest "LOAD ADDRESS"
edit: chodzi mi o pliki z danymi, bez nagłówków dosowych

Ostatnio edytowany przez gorgh (2018-06-11 13:58:46)

8

Odp: kompresja

te informacje odczytuje depacker ze spakowanego pliku, konkretnie z jego końca

load address, dwa bajty nagłówka z adresem pod który mają się ładować dane, normalnie je pomijasz

ins 'filename',2

albo ustawiasz '-l none' i już ich nie ma

p.s.
w załączniku przykład dekompresji dla najnowszej wersji exomizera

Ostatnio edytowany przez tebe (2018-06-11 17:45:24)

Post's attachments

exo3.zip 113.05 kb, liczba pobrań: 8 (od 2018-06-11) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

9

Odp: kompresja

mam problem z tym exomizerem
pakuję plik o długości 727 bajtów w ten sposób

 exomizer -l none -c dane.dta -o dane.pck 

potem patrzę na ostatnie 2 bajty w pliku wynikowym i jest tam

 7e 06

a powinno być

 d7 02

Co robię nie tak?
p.s. ten plik to czyste dane bez nagłówka

edit: jak rozumiem z twojego przykładu powinny tam być bajty znaczące długość pliku po rozpakowaniu

Ostatnio edytowany przez gorgh (2018-06-11 20:43:52)

10

Odp: kompresja

spróbuj SUBSIZER, podobny stopień kompresji do EXOMIZER-a

subsizer -m -o filename.out filename.in

Ostatnio edytowany przez tebe (2018-06-12 21:48:17)

Post's attachments

subsizer.zip 40.57 kb, liczba pobrań: 6 (od 2018-06-12) 

Tylko zalogowani mogą pobierać załączniki.
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

11

Odp: kompresja

thnx

12

Odp: kompresja

z tego co zauważyłem dla kompresji MEM (-m) pakery rozpoznają nagłówek w stylu C64, 2 bajty z adresem pod który mają być ładowane dane, czyli próba kompresji pliku Atari $FFFF,adres,adres+len-1 skończy się obliczeniem adresu $FFFF+.....

musimy spreparować plik, dodać dwu-bajtowy nagłówek z adresem pod którym znajduje się blok danych, po kompresji otrzymamy blok z którego dwu-bajtowego nagłówka odczytamy pod jaki adres musimy załadować spakowany blok

teraz jedynie pozostaje wywołać SUBSIZER przez 'jsr decrunch' wszystkie informacje zostaną pobrane z końca spakowanego bloku, nie trzeba nic modyfikować jak w przykładzie który wyżej załączyłem (post #10)

Ostatnio edytowany przez tebe (2018-06-19 10:04:32)

*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

13

Odp: kompresja

@gorgh: Przećwiczone i działające (bo akurat potrzebowałem).
Mój plik.dta zawiera w jednym bloku dane i program który docelowo jest w $A000. I to są dane RAW bez żadnych nagłówków (nie używam kompresji raw, bo musiałbym użyć dekompresora strumieniowego, a to mi akurat nie odpowiada tutaj). Dekompresję przeprowadzam z pamięci w miejsce docelowe i ja akurat używam dekompresji wprzód.
Robię:

$ exomizer mem -f -l none -o plik.exo plik.dta@0xa000

A w kodzie wołam procedurę decompress z adresem danych wejściowych w YX:

        ldx #<data
        ldy #>data

decompress:
        stx get_crunched_byte.?addr+1
        sty get_crunched_byte.?addr+2
        jmp decrunch

get_crunched_byte:
?addr   lda $FFFF
        inc ?addr+1
        sne
        inc ?addr+2
        rts

        icl "krilldecr.asx"

data    ins "data.exo"

Dane wylądują w $A000, bo ten adres znajduje się na początku bloku danych (już skompresowanych - wstawia go kompresor).
Uwaga co do krilldecr.asx - adresy na ZPG możesz ustalić jak Ci się podoba.
Exomizer v2.0.11.

Ostatnio edytowany przez mono (2019-04-13 19:42:21)

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

14

Odp: kompresja

o super, podziękował

15

Odp: kompresja

Jeżeli komuś nie zależy na szybkości[jeśli potrzeba dekompresji strumieniowej(realtime depack podczas wczytywania ze stacji dyskietek) to są inne packery] to polecam powalczyć z Exomizerem, na C64 to złoty standard kompresji danych i nic do tej pory go nie przebiło. Myślę, że moją myśl można rozszerzyć na wszelakie platformy z 6502 na pokładzie.