OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 21:31

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 76 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6  Další
Autor Zpráva
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 02.02.2021, 12:07 
Offline
Radil

Registrován: 18.10.2014, 23:10
Příspěvky: 377
Has thanked: 28 times
Been thanked: 120 times
Neuveritelné, môj rýchly test ukázal, že každý súbor spakoval lepšie ako prvá verzia.
Neporovnával som dĺžky depakovacích rutín, ale vyzerá to podobne, LZX_2 má o niečo dlhšie rutinky.
V súboroch spd0lens a spd1lens sa píše o dvoch stĺpcoch (compression a length), ale sú tri.

A dosť ma zaujala voľba -e "nastavenie dodatočného úsilia pre čo najlepší kompresný pomer".
Čo to znamená? Keď sa testuje skoro 3000 kompresných typov (počet je asi závislý od dĺžky pakovaného súboru)
a vyberie sa najlepší, ako sa môže vybrať ešte lepší? No podarilo sa mi takto na jednom súbore ušetriť 1 bajt.

Každopádne díky za skvelý program.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 02.02.2021, 12:39 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18.05.2013, 14:56
Příspěvky: 2331
Has thanked: 303 times
Been thanked: 637 times
z00m píše:
Priložený zdroják a gcc -o lzxpack LzxPack.cpp ti nestačí?
Asi stačí. Zmátla mě absence Makefile, takže mě ani nenapadlo to zkusit.

_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 02.02.2021, 12:54 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
zxcygnus píše:
Pěkné a lákavé... bude i varianta pro skutečný operační systém, nebo jen pro spouštěč her a offisů z Redmondu?
Ale tych skutocnych operacnych systemov je spusta (linux, unix, ultrix, bsd, macos....) a zial nie je v mojich silach pre kazdy z nich vyrabat binarku.
Ale ako pisal z00m, zdrojaky su prilozene, pre ten tvoj konkretny skutocny operacny system, ktory pouzivas, si zdrojak mozes skompilovat.
Zdrojaky sice primarne pisem a ladim vo Visual Studiu (momentalne verzia 2015) ale pisem ich portable a finalny exac pre spustac hier kompilujem v gcc. Takze by to nemal byt problem skompilovat kdekolvek.
zxcygnus píše:
Zmátla mě absence Makefile, takže mě ani nenapadlo to zkusit.
No, zase na druhej strane, pisat makefile kvoli kompilacii jedneho suboru (1 subor/projekt) mi pride tak trosku ako skrabat sa lavou rukou na pravom uchu, a aj to este trikrat obtocenou okolo hlavy :)
Ale verim, ze ak je niekto na makefile zvyknuty (ja moc nie), nebude pre neho problem si ho vyrobit ;)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 02.02.2021, 13:32 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Antony/DTA píše:
Neuveritelné, môj rýchly test ukázal, že každý súbor spakoval lepšie ako prvá verzia.
Neporovnával som dĺžky depakovacích rutín, ale vyzerá to podobne, LZX_2 má o niečo dlhšie rutinky.
Jednoduche kompresie (napr. 2 a 4) maju depakery podobne dlhe, a zlozite sofistikovane kompresie (od 6 vyssie), pokryvajuce velmi vela moznosti a tym schopne dosiahnut lepsie kompresne pomery, maju (logicky) depakery dlhsie.
Pre pakovanie dlhych suborov (napr. nejaka hra na celu 48kB pamet) dlhsie depakery nevadia, lebo usetrena dlzka na lepsie spakovanych datach je (obvykle) vecsia nez strata na dlzke depakera, a zase pri kratkych suboroch (napr. 1k intro) je vyhodnejsie stratit par bajtov na horsom kompresnom pomere, ale s podstatne kratsim depakerom.
Antony/DTA píše:
V súboroch spd0lens a spd1lens sa píše o dvoch stĺpcoch (compression a length), ale sú tri.
Aha, vdaka za podnet, popis na zaciatku tychto suborov som zabudol updatnut. Treti stlpec su dlzky depakerov urcenych pre depak od konca (volba -tr.. a nastavenie revers=1). Dlzky sa mozu mierne lisit napriklad preto, lebo pri normalnom depaku je pre urcenie adresy pouzite SBC HL,DE kdezto pri depaku od konca staci o bajt kratsie ADD HL,DE.
Antony/DTA píše:
A dosť ma zaujala voľba -e "nastavenie dodatočného úsilia pre čo najlepší kompresný pomer".
Čo to znamená? Keď sa testuje skoro 3000 kompresných typov (počet je asi závislý od dĺžky pakovaného súboru)
a vyberie sa najlepší, ako sa môže vybrať ešte lepší? No podarilo sa mi takto na jednom súbore ušetriť 1 bajt.
Toto je trosku na dlhsie vysvetlovanie, zatial to ber ako taky tajny magicky parameter vdaka ktoremu sa spakovane data este lepsie "utrasu" :)
Zatial len tolko, ze to sa netyka vyberu najlepsej kompresie, ale je to nastavenie vyhodnocovania vyhodnosti sekvencii, a tyka sa to vsetkych cca 3000 kompresii, takze to moze zlepsit kompresny pomer ktorejkolvek z nich.
Antony/DTA píše:
Každopádne díky za skvelý program.
Vdaka :thumbup:


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 31.08.2021, 18:51 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Po dlhsom case dve male zmeny v programe LzxPack02:

- Mala korekcia v LzxList pri statistike nespakovanych blokov pri pouziti volby -s
- Do include suboru pribudol label deplen = dlzka depakovacej rutinky

Dlzka depakera sa berie zo suborov "spd*lens" ak je subor spakovany s prepinacom -d. Ak nie, nastavi sa na nulu. Depaker sam ju k nicomu nepotrebuje, ale programator ju moze pouzit k rychlemu urceniu kolko bajtov mu zaberie spakovany subor aj s depakerom dokopy (aj bez toho, aby musel depaker kompilovat).


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 02.09.2021, 08:54 
Offline
Profík

Registrován: 26.11.2018, 16:59
Příspěvky: 580
Bydliště: Holešov
Has thanked: 13 times
Been thanked: 90 times
zkoušel někdo tu depakovací rutinu předělat ze Z80 kódu na i8080 pro použití na CS 8-bitech? (PMD/PP01/IQ151)
případně dotaz na BUSYho, je to vůbec reálné?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 02.09.2021, 13:53 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
l00k píše:
zkoušel někdo tu depakovací rutinu předělat ze Z80 kódu na i8080 pro použití na CS 8-bitech? (PMD/PP01/IQ151)
případně dotaz na BUSYho, je to vůbec reálné?
Ak si dobre pametam, pre LzxPack01 rutinky na 8080 kedysi prerabal rombor, ale pre tuto verziu 02 neviem ci existuje nejaky port.

V kazdom pripade, realne to urcite je, a ak ma nikto nepredbehne, mam v plane to spravit ja (ked budem potrebovat nieco vecsie zapakovat na 8080 pocitacoch).

Avsak ak by niekto potreboval, tak na 6502 je depaker preportovany uz davno, portoval ho Loki.
Stahujte tu: https://server.loksa.sk/temp/declzx02.asm


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 12.09.2021, 21:33 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Zda ze ma nikto nepredbehol (a ak ano, nedal to na sebe poznat), takze tuhla, Lzx depacker pre 8080:
https://busy.speccy.cz/tmp/declzx02i8080.zip
Rutinky su o kusok dlhsie nez Z80-kove, predsa len take veci ako LDIR alebo SBC HL,BC treba robit "rucne".
K depackeru som pribalil aj subory s dlzkami depakerov pre jednotlive kompresie, aby LzxPack aj pre 8080 vedel najst minimalnu velkost suctu depacker + spakovane data.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 13.09.2021, 12:44 
Offline
Profík

Registrován: 26.11.2018, 16:59
Příspěvky: 580
Bydliště: Holešov
Has thanked: 13 times
Been thanked: 90 times
super, vyzkouším, jen pár dotazů:
- je to psané pro Sjasm?
- dá se ze zkomprimovaných dat a typu komprese určit doba depacku? (třeba v taktech procesoru)
- šlo by upravit packer aby hledal N i R verze automaticky a vybral lepší z nich?
- jak to zautomatizovat - data -> packer -> výsledná binárka (tap/hex/bin) i s depack rutinou


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 13.09.2021, 14:27 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
l00k píše:
super, vyzkouším, jen pár dotazů:
- je to psané pro Sjasm?
Ano, vsetky svoje asemblerove programy pre Z80 aj 8080 kompilujem v SjASMPlus. Ten sice vie iba mnemoniku Z80 (mne to uplne staci) avsak ma prepinac --i8080 pri ktorom kontroluje ci programator pouziva iba instrukcie pre 8080. Ak v programe pouzije instrukciu ktoru ma iba Z80, ohlasi na nej chybu.
l00k píše:
- dá se ze zkomprimovaných dat a typu komprese určit doba depacku? (třeba v taktech procesoru)
Nad tymto som sa zatial nezamyslal, ale samotne jadro depakera, ktore kopiruje vsetky data, je na Z80 robene pomocou LDIR, na porte pre 8080 je to potom klasicka kopirovacia slucka:
Kód:
slucka:
ld a,(hl)
ld (de),a
inc hl
inc de
dec bc
ld a,b
or c
jp nz,slucka
Okolo slucky je nejaka pomocna rezia, ktora v podstate iba zabezpecuje parametre pre tuto slucku, takze ak su v datach bud velke pakovatelne bloky (obrazky s velkymi jednofarbenymi plochami) alebo su to hutne data v ktorych nie je vela co pakovat (napr. kod programu) tak sa rychlost depaku limitne blizi k rychlosti tejto slucky.
l00k píše:
- šlo by upravit packer aby hledal N i R verze automaticky a vybral lepší z nich?
Teoreticky samozrejme slo, aj som nad touto moznostou rozmyslal, ale obvykly scenar je taky, ze pakovane aj depakovane data sa naraz do pameti nevojdu a programator ma potom smer depaku urceny obvykle tym ci depakovane data su pred pakovanymi alebo az za nimi. Taktiez, ked sa skusa viac typov kompresii, niektore cinnosti (hladanie sekvenci...) sa robia spolocne raz a ich vysledky sa nasledne pouziju pre vsetky typy kompresii. Pri otocenom smere pakovania by toto nebolo mozne takto zoptimalizovat a vsetky kompresie pre opacny smer by bolo treba robit uplne odznovu, preto som to pre jednoduchost zatial neimplementoval. A v pripade, ze je programatorovi jedno, ktorym smerom sa data budu depakovat, a chce co najlepsi kompresny pomer, tak tie dve moznosti (-tn/-tr) bude moct vyskusat aj "rucne" :)
l00k píše:
- jak to zautomatizovat - data -> packer -> výsledná binárka (tap/hex/bin) i s depack rutinou
Aj na toto som myslel - pri volbe -i LzxPack generuje include subor, ktory je mozne priamo includnut do zdrojaku a v ktorom su informacie o pouzitej kompresii. Takze uzivatel sa uz nemusi o nic starat a skompilovanie binarky s vyberom najlepsej kompresie sa mu urobi v nejakom makefile automaticky. Vdaka tomuto suboru si potom depaker vie skontrolovat ci nahodou depakovane data neprepisu este neprecitane spakovane data. Vsetko je to popisane v prilozenom manuali. Ked budem mat chvilku cas, skusim vymysliet nejaky jednoduchy priklad a hodim ho sem.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 13.09.2021, 20:40 
Offline
Profík

Registrován: 26.11.2018, 16:59
Příspěvky: 580
Bydliště: Holešov
Has thanked: 13 times
Been thanked: 90 times
Busy píše:
LzxPack generuje include subor, ktory je mozne priamo includnut do zdrojaku a v ktorom su informacie o pouzitej kompresii. Takze uzivatel sa uz nemusi o nic starat a skompilovanie binarky s vyberom najlepsej kompresie sa mu urobi v nejakom makefile automaticky. Vdaka tomuto suboru si potom depaker vie skontrolovat ci nahodou depakovane data neprepisu este neprecitane spakovane data. Vsetko je to popisane v prilozenom manuali. Ked budem mat chvilku cas, skusim vymysliet nejaky jednoduchy priklad a hodim ho sem.


toto jsem v popisu viděl, ale moc si to makefile nedokážu představit, stejně někde musím tomu překladači říct minimálně ORG pro překlad, dát tam INC na ten Include soubor a pak ještě druhej na data, přičemž sice vím jak asi bude dlouhá rutina ale musím to dohledat v dalším souboru (kvůli ORG), pak přeložit, a pak z toho udělat třeba intelhex, takže nic moc jednoduchého


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 15.09.2021, 13:31 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Skusim teda sem napisat tak "polopatisticky" take tri mozne sposoby, ako pouzit depaker.

Prvy sposob je vhodny, ked su uz data na spakovanie definitivne, a depaker sa vola napriklad z basicu. V takom pripade staci v zdrojaku depackera na potrebne hodnoty nastavit ORG,srcadd,dstadd,lzxspd a potom parametre kompresie od revers az po totlen. Zdrojak DecLzx02 je cely samostatny, sebestacny, staci doplnit v akej forme chceme binarku (SAVEBIN, SAVETAP...) a nasledne skompilovanim v SjASMPlus ziskame hotovy kod ktory staci so spakovanymi datami len umiestnit do pameti a zavolat (kludne aj z basicu).

Druhy sposob je ten isty ako prvy, akurat vsetky parametre kompresie (od revers az po totlen) sa automaticky doplnia z include suboru. V zdrojaku depakera staci odkomentovat riadky
Kód:
  INCLUDE filename.inc
  DEFINE  declzx_pack_params
a meno suboru v prikaze INCLUDE zmenit na to, co vygeneroval LzxPack spusteny s parametrom -i. Tento sposob je vhodny, ked sa pakovane data behom vyvoja menia, a tym padom sa moze zmenit aj typ kompresie optimalnej pre tieto data. Programator tak nemusi zakazdym tieto parametre rucne prepisovat, namiesto toho sa nacitaju automaticky.

Treti sposob je vhodny ked je depaker sucastou nejakeho vecsieho projektu ktory okrem depakera obsahuje aj ine casti pisane v asembleri. V takom pripade zdrojak dekapera vobec netreba menit, da sa rovno pouzit tak ako je, a vsetky parametre a nastavenia sa daju urobit mimo neho - v inom zdrojaku, napriklad takymto sposobom:
Kód:
  ORG ...
  ....
srcadd  =  ...
dstadd  =  ...
lzxspd  =  0 alebo 1
  DEFINE  declzx_user_params
  DEFINE  declzx_pack_params
  INCLUDE filename.inc
  INCLUDE DecLzx02.asm
Na zaklade definovanych symbolov declzx_user_params a declzx_pack_params depaker vie, ze ako uzivatelske a kompresne parametre ma brat uz existujuce definicie, vytvorene v zdrojakoch kam sa depaker includuje. Uzivatelske parametre (umiestnenie dat v pameti) sa urcia kompilaciou a kompresne parametre sa vezmu z include suboru vygenerovaneho LzxPack-om s prepinacom -i tak ako v predchadzajucom pripade. Samozrejme je treba vlozit meno include suboru do direktivy INCLUDE.

Este poznamka k menam include suborov generovanych LzxPack-om. Defaultne je meno rovnake ako vysledny spakovany subor, iba namiesto koncovky LZX ma koncovku INC. V pripade ze si nechavate generovat include subor, je vhodne pouzit aj prepinac -o <meno_suboru> ktory LzxPack-u povie aby spakovane data zapisal do tohto suboru. Include subor bude mat potom presne toto iste meno, akurat koncovka sa zmeni na INC. Dolezite je tu hlavne to, ze meno include suboru v takom pripade nebude obsahovat typ kompresie a bude rovnake pre akukolvek vybranu kompresiu.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 15.09.2021, 21:29 
Offline
Profík

Registrován: 26.11.2018, 16:59
Příspěvky: 580
Bydliště: Holešov
Has thanked: 13 times
Been thanked: 90 times
návod super, mezitím jsem se s tím už popral, ještě bych doplnil že lze data přeložit zároveň s rutinou tak, že zakomentujeme

;srcadd = #6000 ;; Begin of source packed data

a tam kde chceme mít data přidáme

srcadd incbin jmeno.lzx

ještě mne potrápila neznalost sjasmplus a chvilku mi trvalo jak ho donutit uložit binárku přeloženého souboru - nutno použít přepínač --raw=jmeno.bin


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 15.09.2021, 23:39 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
l00k píše:
zakomentujeme
;srcadd = #6000 ;; Begin of source packed data
a tam kde chceme mít data přidáme
srcadd incbin jmeno.lzx
Ano, napriklad nieco take som myslel ked som napisal
Uzivatelske parametre (umiestnenie dat v pameti) sa urcia kompilaciou
l00k píše:
ještě mne potrápila neznalost sjasmplus a chvilku mi trvalo jak ho donutit uložit binárku přeloženého souboru - nutno použít přepínač --raw=jmeno.bin
Aj tak sa da :thumbup:
Dalsie sposoby som naznacil ked som napisal:
staci doplnit v akej forme chceme binarku (SAVEBIN, SAVETAP...)
Priklad:
Kód:
DEVICE ZXSPECTRUM48 ; Vytvori 64kB virtualny adresovy priestor do ktoreho sa bude ukladat kod
...kod...
SAVEBIN "jmeno.bin" , adresa , dlzka ; Ulozi do suboru danu cast adresoveho priestoru
Prikaz SAVEBIN v podstate presne zodpoveda basicovemu prikazu SAVE "jmeno.bin" CODE adresa,dlzka

Inak, prepinac --raw=jmeno.bin sa da nahradit aj direktivou OUTPUT priamo v zdrojaku:
Kód:
OUTPUT jmeno.bin
...kod...
Vsetok kod, tak ako sa vygeneruje kompilaciou, sa ulozi do binarky "jmeno.bin".


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Komprimacny program LZX
PříspěvekNapsal: 12.12.2021, 20:15 
Online
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Busy píše:
...takze tuhla, Lzx depacker pre 8080
A este pre uplnost Lzm depaker pre 8080
Kód:
;; Input:
;;  HL = address of source packed data
;;  DE = address of destination to depack data

depack
deplop  ld      a,(hl)          ;; Get identification of block
        inc     hl              ;; Move to next byte in packed data
        and     a
        ret     z               ;; Zero length means end mark
        rra
        ld      bc,deplop
        push    bc
        ld      c,a             ;; C = length of block or sequence
        jp      c,deprep        ;; If it is packed sequence then jump

ldir    ld      a,(hl)
        ld      (de),a
        inc     hl
        inc     de
        dec     c
        jp      nz,ldir
        ret

deprep  ld      a,e             ;; Determine address of source sequence
        sub     (hl)            ;; DE = destination address
        inc     hl
        push    hl
        ld      l,a
        ld      a,d
        sbc     a,0
        ld      h,a             ;; HL = begin of source sequence in already unpacked data
        call    ldir            ;; Copy sequence
        pop     hl
        ret
Tuto jednoduchu kompresiu Lzm je vhodne pouzit, ak je mala dlzka depakera dolezitejsia, nez kompresny pomer. Moze to byt pri pakovani nejakych malych dat, napriklad 256b alebo 1k intro, kde lepsi kompresny pomer Lzx sice usetri zopar bajtov naviac, ale ovela kratsi Lzm depaker usetri este viac bajtov v celkovej dlzke kodu depaker+data.

Dlzka povodneho Z80 depakera bola 26 bajtov, dlzka portu pre 8080 je 36 bajtov.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 76 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 8 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz