.z80 aseg org 100h ;::::: KOMPRIMATOR NA .COMY ! (??) ::::::::::: ;:: zatim se zarazkou ::::::::::::::::::::::: ;:: algoritmus : ; komprimace : FB,data,FB,data,FB,data,FB,data,FB,data......,FB,0 ; X : pocet nezkomprimovanych za sebou ; Y : pocet zkomprimovanych bloku za sebou ; FLAG BYTE : Y.Y.X.X.X.X.X.X ; 7 6 5 4 3 2 1 0 x e 0..63 ; h l h l y e 0..3 ;:::::::::::::: ZAR equ 033h ; inc sp , pote samozrejme ze fsynt BDOS equ 5 DELTAL equ DELIPS-DELIST ; offset pro ulozeni sizze rozbaleneho DELTUL equ DELIPU-DELIST DELFRM equ FRMDEL-DELIST START: jp MZLITE UNLSIZE: dw 0 VYRSP: dw 0 FCB1: db 0," ",0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0 FCB2: db 0," ",0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0 OKNADD: db 0 ACTADD: db 0 WPERCENT: db 8 VSVTL: db " options :",10,10,13 db " -p : relocate under CCP while extracting",10,13 db " -x : extract",10,13 db " -e : extra compression { for commercial version only }",10,13,36 MZLUVOD: db 10,13 db "MZlitå commanä compressor (c© 199³ Svatopluë Sveã, version 1.06b, 01-21-93" db 10,10,13,36,0,0,0,0 STACK: dw 0 COMPR: db 13," Compressing " INDRV: db " :" INNAME: db " to " OUTDRV: db " :" OUTNAME: db " $" CISLA1: db "($" PERC: db " $" PAST: db "%)$" ; cislo ,past NORML: db " " CISLA2: db " done. ($" STOPRO: db "100%)$" INAIR: db 1 UNCOMPR: db " Extracting " ;::::::: EXTRCT: ld hl,UNCOMPR ld de,COMPR+1 ld bc,EXTRCT-UNCOMPR ldir ld de,COMPR ld c,9 call 5 ld de,ENDMES ld c,9 call 5 ret KONVYSL: push hl ld hl,NORML ld de,PERC ld bc,5 ldir pop hl push hl push hl push hl jr PISPE9 PISPERC: push hl push de push bc ld de,(FROMLITE) or a sbc hl,de ; delka doposavad projeteho xor a rl l rl h rla ld l,h ld h,a ; hl / 128 PISPE9: ld (PCIT),hl call NASDEL ld a,l cp 101 jr c,PISPE4 ld a,100 PISPE4: ld hl,PERC call ATOASCI ld hl,PERC PISP1: ld a,(hl) cp " " jr z,PISP2 cp ")" jr z,PISP2 cp "%" jr z,PISP2 inc hl jr PISP1 PISP2: ex de,hl ld hl,PAST ld bc,3 ldir ld de,COMPR ld c,9 call 5 ld a,(INAIR) or a jr nz,PISPE8 ld de,CISLA2 jr PISPE5 PISPE8: ld de,CISLA1 PISPE5: ld c,9 call 5 ld de,PERC ld c,9 call 5 pop bc pop de pop hl ret ;::: ENDWO1: xor a ld (INAIR),a ld hl,STOPRO ld de,PERC ld bc,5 ldir ld de,COMPR ld c,9 call 5 ld de,CISLA1 ld c,9 call 5 ld de,PERC ld c,9 jp 5 ;::::::::::::::: PCIT: dw 0 ; aktualni delka DCIT: dw 100 PDEL: dw 0 ; maximalni delka ; ::::::::: NASDEL: ; pcit*dcit/pdel : pro c2gray : x*0.53 = x*53/100 ld hl,0 ld de,(PCIT) ld bc,(DCIT) ld a,d or e jr z,NASD01 NASD04: srl b rr c jr nc,NASD03 add hl,de jr c,NASD02 NASD03: ld a,b or c jr z,NASD02 sla e rl d jr c,NASD01 jr NASD04 NASD02: ; v hl vysledek nasobeni ld de,(PDEL) ld bc,0 NASD10: or a sbc hl,de inc bc jr nc,NASD10 ; podelit odcitavanim dec bc ld l,c ld h,b NASD01: ret ; hl = 0 ;:::::: vstup : a,^hl , nici vse krome ix,iy ATOASCI: ld (NUMERO),hl ld (hl),"0" or a ret z ; je to nula call ATOBCD ld b,0 ld a,h ld c,l or a ; >= 100 ? ld hl,(NUMERO) jr z,ATOA01 ; ne call ATOA10 ; ano,a=1 nebo 2 ld (hl),e ld b,1 inc hl ATOA01: ld a,c call ATOA10 ld a,d cp "0" jr nz,ATOA02 dec b inc b jr z,ATOA03 ATOA02: ld (hl),d inc hl ATOA03: ld (hl),e ret NUMERO: dw 0 ;: ATOA10: push af rrca rrca rrca rrca and 0Fh add a,"0" ld d,a pop af and 0Fh add a,"0" ld e,a ret ŠASCNUM: db " 0" ;-------- ATOBCD: ld hl,0 ld de,1 ld b,8 ATOB01: rrca jr c,ATOB02 ATOB03: ex af,af' ld a,e add a,e daa ld e,a ld a,d adc a,d daa ld d,a ex af,af' djnz ATOB01 ret ATOB02: ex af,af' ld a,l add a,e daa ld l,a ld a,h adc a,d daa ld h,a ex af,af' jr ATOB03 ;::: INITVYP: ld a,(SOURDRV) add a,"A" ld (INDRV),a ld a,(DESTDRV) add a,"A" ld (OUTDRV),a ld hl,FPAR1+1 ld de,INNAME call POZPREP ld hl,FPAR2+1 ld de,OUTNAME call POZPREP ld a,"0" ld (PERC),a ld hl,PAST ld de,PERC+1 ld bc,3 ldir ld de,COMPR ld c,9 call 5 ret POZPREP: ld bc,8 push hl POZPR1: ld a,(hl) cp " " ; jdu na ext jr z,POZPR2 ldi jp po,POZPR2 jr POZPR1 POZPR2: pop hl ld bc,8 add hl,bc ; najezd na .. ld a,"." ld (de),a inc de ld bc,3 ldir ret MZLITE: ;----------------- H L A V A ------------------ ld (VYRSP),sp ld sp,STACK call RDPARAM ; nacti parametry ; o.k. or a jp z,VYSVETLI call DOPARAMS rst 0 LITEIT: call RDUNLITED ; nacti nezlajtovany call LITE ; zlajtuj call WRLITED ; uloz zlajtovany ENDING: rst 0 ;------------------- P R O C E D U R Y -------------------- ;:::: VYSVETLI: ld de,VSVTL ld c,9 ld sp,(VYRSP) jp 5 ;:::: DOPARAMS: call INITVYP ; init pro vypocty procent ld a,(PARAMS) cp "P" ; relokace az pod ccp jr nz,DOPAR1 ; ne ld a,21h ld (DELITE+DELFRM),a ld hl,0D400h ld (DELITE+DELFRM+1),hl jr LITEIT ret EXTR: db 0 DOPAR1: cp "X" ; extrakce jr nz,DOPAR2 call EXTRCT ld a,1 ld (EXTR),a call RDUNLITED ; nacti zlajtovany ld hl,(FROMLITE) ld e,l ld d,h inc de ld bc,127 ld (hl),0 ldir ; setup : same nuly & vymaz rutiny ld (FROMLITE),de call EXTRACT ; rozbal ho ld hl,(TOLITE) ex de,hl or a sbc hl,de call WRUNLIT ; uloz rozlajtovany ret DOPAR2: or a jr nz,VYSVETLI ; zadny dalsi parametr byt nemuze jp LITEIT ; bez parametru : = lite it ;:::::: EXTRACT: ld hl,(UNLSIZE) ld bc,128 or a sbc hl,bc ; orizni ten prvni sektor ld c,l ld b,h push bc ld hl,(TOLITE) dec hl ld e,l ld d,h dec de ld bc,256 ld (hl),0 lddr ; vymaz pop bc ld hl,(FROMLITE) ld de,(TOLITE) EELI99: ld a,(hl) cp ZAR ; zarazka ? jr z,EELI20 ldi ; bez : ldi EELI21: inc b ret z dec b jr EELI99 EELI20: ; je to zarazka... dec bc ; zarazka inc hl ld a,(hl) ; za zarazkou dec bc ; za zarazkou inc hl or a ; jen zarazka samotna ? jr nz,EELI30 ; ne:komprese ! ld a,ZAR ld (de),a inc de jr EELI21 EELI30: push de exx pop hl ld e,l ld d,h ld c,a ld b,0 or a sbc hl,bc exx ld a,(hl) inc hl dec bc exx ldi ; ld c,8 ; hl : odkud,de : kam,b uz je = 0.. EELI40: rlca jr c,EELI41 inc hl EELI42: dec c jr nz,EELI40 push de exx pop de jr EELI21 EELI41: ldi inc c jr EELI42 ;:::::: WRUNLIT: push hl ld a,2 call CHDRV ; select destination drive ld hl,FPAR2 ld de,FCB2 ld bc,12 ldir ; spec do fcb ld de,FCB2 ld c,19 call BDOS ; pro jistotu ho zrus ld de,FCB2 ld c,22 call BDOS ; utvor ho cp -1 ; chyba ? jp z,VIF34 ; ANO pop bc ; delka rozbaleneho xor a rl c rl b rla ld c,b ld b,a ld a,(UNLSIZE) res 7,a or a jr z,WRUNL1 inc bc ; o sektor vice kvuli tem <128 bajtum WRUNL1: Š ld de,(TOLITE) ; start sbaleneho i s dep. sektorem na zacatku call WRITE ; uloz to od de do ++bc*128 ret ;:::::: RDUNLITED: ld a,1 call CHDRV ; vyber source ld hl,FPAR1 ld de,FCB1 ld bc,12 ldir ; presun parametru : source ld de,FCB1 ld c,35 call 5 ; spocti delku v sektorech ld a,(FCB1+34) or a ; > 32kB ? jr z,OPEN11 ; ne ld a,14 ld (WPERCENT),a OPEN11: ld hl,(FCB1+33) ; hl = delka v sektorech ld (PDEL),hl xor a srl h rr l rra ld h,l ld l,a ld (UNLSIZE),hl ; delka v bytech ld de,FCB1 ld c,15 call 5 ; otevri zdroj cp 0ffh ; je tam vubec ten soubor ? jr nz,OPEN99 ; ? je .. do roboty ! jp ERR_END ; normal shutdown INITPERC: ld a,(WPERCENT) ld (OKNADD),a xor a ld (ACTADD),a ret OPEN99: call INITPERC ld de,(FREEMEM) ; sem nacist cely soubor 32kB,pode mnou uz je push de RBYTE: READ4: ; --loop nacitajici bloky,dokud neni all file nebo fullmem-- push de ld c,26 call 5 ld c,20 ld de,FCB1 call 5 pop de or a ; konec souboru ? jr nz,READOUT ; ano : view a cekam... ld hl,80h add hl,de ex de,hl ; de /DMA/ += 80h jr READ4 READOUT: ; ::::::: vlastni rozbaleni :::::: pop de ex de,hl ; hl = start1 ld bc,(UNLSIZE) ; delka nesbaleneho add hl,bc ; hl = end1 ex de,hl ; de = end1 ld hl,(6) dec h dec h ; hl = end2 ex de,hl ; de=end2,hl=end1 inc bc ; bc =end1-start1 lddr ; start1 up to start2 inc de ; ldxx konci pri dalsim !! ld (FROMLITE),de ; odkud zacit balit ld hl,(FREEMEM) ld a,(EXTR) or a jr z,RDUN34 ld bc,256 add hl,bc RDUN34: ld (TOLITE),hl ; a kam balit ret ;:::::: WRLITED: call ENDWO1 ld hl,(UNLSIZE) ld (DELITE+DELTUL+1),hl ld hl,(LITESIZE) ; delka sbaleneho,ktery zacina na freemem ld (DELITE+DELTAL+1),hl ; uloz do prvniho sektoru xor a rl l rl h rla ld l,h ld h,a ; v sektorech ld a,l or h jr z,WRLI76 ; 0 : bylo to mensi,nez 1 sektor... ld a,l or a jr z,WRLI78 WRLI76: inc hl ; o ten,ktery tam ma nejake tititi WRLI78: inc hl ; + ten s rutinou push hl ; delka v sektorech ld a,2 call CHDRV ; select destination drive ld hl,FPAR2 ld de,FCB2 ld bc,12 ldir ; spec do fcb ld de,FCB2 ld c,19 call BDOS ; pro jistotu ho zrus ld de,FCB2 ld c,22 call BDOS ; utvor ho cp -1 ; chyba ? jp z,VIF34 ; ANO ld de,DELITE ; start sbaleneho i s dep. sektorem na zacatku pop bc push bc call WRITE ; uloz to od de do ++bc*128 pop hl call KONVYSL ld de,ENDMES ld c,9 call 5 ret VIF34: jp ERR_END ENDMES: db 10,10,13,36 ERR_END: rst 0 WRITE: ;:::::::: zapise file :::::::::::: WRIT4: push bc push de ld c,26 call BDOS ; setdma ld de,FCB2 ld c,21 call BDOS ; write pop de pop bc or a ; 0 - uspech jr nz,WIF34 ; neuspech ld hl,80h add hl,de ex de,hl dec bc ld a,b or c jr nz,WRIT4 ld de,FCB2 ld c,16 call BDOS ; zavri ten soubor ret WIF34: jp ERR_END ;--------------- V L A S T N I B A L I C I R U T I N A -------------- ;:::::: SUMSHODA: ; ::: KOLIK je pred de shod s hl ? ::: xor a ld (SECOND),a ld (VYRHL),hl ld (VYRDE),de ld (MAXLONG),a exx ; 1 ld hl,(VYRHL) ld bc,-255 add hl,bc ; startovni pozice prohledavani v predku ld bc,255-8 ; jeden byte musi zbyt na zar,0 = only zar SUMS06: exx ; 0 ld a,(hl) ; pro porovnani : zdroj exx ; 1 cpir ; hledam v minulem jp po,SUMS02 ; vubec se zde nenaleza,rovnou pryc SUMS01: ; naleza se aspon jednou ld (FROMZBYV),bc ; odkud zacit podruhe,potreti,... ld (FROMZAC),hl ; adresa za shodou,aut. inc hl xor a ld (LONG),a ; pocet dalsich : setup = 0 ld bc,8 ; zbyva 8,prvni je automaticky prenesen ukazatelem SUMS04: exx ; 0 inc hl ld a,(hl) ; beru dalsi bajt pro compare exx ; 1 cpir ; dalsi ? jp po,SUMS03 ; uz zadna dalsi shoda neni ld a,(LONG) inc a ld (LONG),a ; dalsi shoda, o.k. jr SUMS04 SUMS03: jr nz,SUMS10 ld a,(LONG) inc a ld (LONG),a SUMS10: ld a,1 ld (SECOND),a ld a,(MAXLONG) ld hl,LONG cp (hl) ; je ma shoda > maximalni ? jr c,SUMS05 ; je,prerad ld hl,(FROMZAC) ; neni,vem to,za cim jsem prestal jr SUMS07 ; a pokracuj SUMS05: ld a,(LONG) ld (MAXLONG),a ld hl,(FROMZAC) ld (MAXSADR),hl ; adresa max shody SUMS07: ld bc,(FROMZBYV) ; tolik jeste zbyva exx ld hl,(VYRHL) ; porovnani s exx jr SUMS06 SUMS02: exx ld a,(SECOND) or a ret z ld a,(MAXLONG) cp 3 ; i trojice : zvetsi delku,{ne o moc..} ale bit_tok.. jr nc,SUMS09 ld a,0FFh ; mensi nez 3 : nema smysl 8 -> 18 nebo 16 -> 18 SUMS09: ; ale : 24 -> 18 : -6 ( inc a ; zarucene > 0 ret ;:::: FROMLITE: dw 0 TOLITE: dw 0 LITESIZE: dw 0 ;::: LITE: ; ::::::::::::: zhusti od ^hl do ^(hl+bc) : do ^de :::::::::::::::: ld hl,(FROMLITE) push hl Š xor a dec hl ld b,0 LITE44: ld (hl),a dec hl djnz LITE44 ; vynuluj prvni pod nim pop hl ld de,(TOLITE) ld bc,(UNLSIZE) call LITE93 ; zabal to ld hl,(TOLITE) ex de,hl or a sbc hl,de ; delka zabaleneho inc hl ld (LITESIZE),hl ret ;:::: LITE93: call SUMSHODA ; zjisti shody v predeslem or a jr nz,DOLITE ; nektera stoji za to ! ld a,(hl) cp ZAR jr z,LITE01 ; zarazka: spec ldi ; bez spec jr LITE02 LITE01: ld a,ZAR ld (de),a inc de xor a ld (de),a inc de inc hl dec bc LITE02: ld a,b cp 0FFh ; muze se stat,ze prejedu o 1 az 8 ret z ld a,c or a call z,PISPERC ; napis,kolik uz procent je output,kazdych jr LITE93 ; 256 bajtu na 10kB : 40*{po 2 %} DOLITE: ld (VYRHL),hl ld (VYRDE),de dec bc ; o to prvni cislo shody ld (VYRBC),bc ld de,(VYRDE) ld a,ZAR ld (de),a inc de ld (VYRDE),de ld de,(MAXSADR) dec de ld hl,(VYRHL) or a sbc hl,de ld de,(VYRDE) ld a,l ld (de),a ; cislo bude vzdy o 8 vetsi inc de ld hl,(VYRHL) ; 0,zdroj inc hl ; on uz je nastaven tim ukazatelem !!! ld a,(hl) inc hl ld bc,(VYRBC) exx ; 1 ld hl,(MAXSADR); 1,compare , po cpir uz je ++... ld bc,8 ; az 8: 24 <- 64 : 1 : 2.67 !!! { 62.5 % uspora !!! } ld e,0 DOLI24: cp (hl) ; zdroj cp pred ? jr z,DOLI20 ; ano,shoda or a rl e ; pridej dalsi 0 jr DOLI23 DOLI20: scf rl e ; pridej dalsi bit nebo nulu exx ; 0 ld a,(hl) ; dalsi ze vstupu inc hl ; priprav pro priste dec bc exx ; 1 DOLI23: dec c jr z,DOLI21 inc hl ; dalsi z predku,ten predtim o.k. nebo ne jr DOLI24 DOLI21: ld a,e exx ; 0 ld (de),a inc de ld (VYRDE),de dec hl ; vybral jsem,ani jsem jeste nevedel,zda to bude on ld (VYRHL),hl jp LITE02 ;::: RDPARAM: ld de,MZLUVOD ld c,9 call 5 ld hl,80h ld a,(hl) or a ret z ; bez parametru exx ld hl,PARAMS exx inc hl call PRESKMEZ ; preskoc mezery ld a,(hl) cp "-" jr nz,RDPA01 ; ted : kdyz bez -x == komprese jr RDPA02 ; zatim je to tak xor a or a ret ; return zero = no params RDPA02: ld a,(hl) cp "-" jr nz,RDPA01 ; zadny dalsi parametr uz neni inc hl ; preskoc "-" ld a,(hl) inc hl and 5Fh exx ld (hl),a ; uloz dalsi parametr inc hl exx call PRESKMEZ ; -a-j nebo -a -j jr RDPA02 RDPA01: ld de,FPAR1 call RNAME ; nacti jmeno archivu - urcite na prvnim miste ld de,FPAR2 call RNAME ; nacti file - specifikaci + ?,* ld hl,FPAR1+12 xor a or (hl) ret z ld hl,FPAR2+12 xor a or (hl) ret nz ld a,(DESTDRV) cp 88 jr nz,RDPA03 ld a,(ACTDRV) ld (DESTDRV),a RDPA03: ld hl,FPAR1 ld de,FPAR2 ld bc,12 ldir xor a inc a ret ;:: RNAME: ; :::::::::: nacte jmeno souboru :::::: ld c,25 push de push hl call 5 pop hl pop de ld (ACTDRV),a ld (RDNFCB),de call PRESKMEZ ld a,(hl) or a ret z ld bc,9 ; ne delsi,nez name + "." call PRESKMEZ ; preskoc mezery inc hl ld a,(hl) cp ":" ; je specifikace drivu ? jr nz,WOC021 ; neni dec hl ld a,(hl) and 5Fh sub "A" ex af,af' ld a,(SOURDRV) cp 88 jr nz,WOC022 ; uz jedu na destin ex af,af' ld (SOURDRV),a jr WOC025 WOC022: ex af,af' ld (DESTDRV),a WOC025: inc hl ;za ni inc hl ; za: jr WOC023 WOC021: dec hl ld a,(ACTDRV) ex af,af' ld a,(SOURDRV) cp 88 jr nz,WOC024 ; uz jedu na destin ex af,af' ld (SOURDRV),a jr WOC023 WOC024: ex af,af' ld (DESTDRV),a WOC023: call PRESKMEZ ld a,(hl) or a ret z exx ld hl,(RDNFCB) ld bc,12 add hl,bc ld (hl),1 ; tato polozka je platna exx inc de WOC030: ld a,(hl) or a ret z cp " " ret z cp "." jr z,WOC031 and 5Fh ldi ld a,b or c ret z jr WOC030 WOC031: ex de,hl ld hl,(RDNFCB) ld bc,9 add hl,bc Š ex de,hl ld bc,3 inc hl ; preskoc "." jr WOC030 ;::: PRESKMEZ: ld a,(hl) or a ret z cp " " ret nz inc hl jr PRESKMEZ ;::: CHDRV: ; zmeni drive na : actual {0} ,source {1} nebo destin {2} or a jr nz,CHDR02 ld a,(ACTDRV) jr CHDR04 CHDR02: dec a jr nz,CHDR03 ld a,(SOURDRV) ; 0:source jr CHDR04 CHDR03: ld a,(DESTDRV) ; 1:destin CHDR04: ld e,a ld c,14 call 5 ; vyberdsk ret SOURDRV: db 88 ; int DESTDRV: db 88 ; int ACTDRV: db 88 ; int RDNFCB: dw 0 ; int PARAMS: db 0,0,0,0,0,0,0,0,0,0 ; parametry ... ODDELENE - : gfc -e -c par FPAR1: db 0," COM",0 ; prvni paramter FPAR2: db 0," COM",0 ; druhy parametr,usr + name[11]:12 bytu VYRBC: dw 0 FROMZBYV: dw 0 FROMZAC: dw 0 SECOND: db 0 LONG: db 0 ; aktualni shoda MAXLONG: db 0 ; maximalni shoda,clearuje head MAXSADR: dw 0 NOWOFS: db 0 ; kterou polozku prave zpracovavam VYRHL: dw 0 VYRDE: dw 0 FREEMEM: dw VOLNARAM ;::: STATIST: ; :: statistika ... ld hl,5000h ld a,33h ; soucet vsech zarazek ld bc,497Fh ld de,0 ; zarazek exx ld hl,0 ; zarazka - 0 exx MLIT02: cpir jp po,MLIT01 inc de ld a,(hl) or a jr nz,MLIT03 exx inc hl exx MLIT03: ld a,33h jr MLIT02 MLIT01: nop nop nop ret ;:::: rozbalovaci rutina v delce jednoho sektoru ! :::: db "HERE-" DELITE: ; rozbali,da se na zacatek,musi byt <= 128 b !? .phase 100h DELIST: db "MZ" DELI50: FRMDEL: ; kde ma zacinat rozbalovaci rutina;pod bdos nebo pod ccp ld hl,(6) dec h ex de,hl push de ld hl,DELI10 ld bc,DELI98-DELI10+1 ldir ; soupne nahoru depacker pop hl jp (hl) DELI10: ld de,DELI98 ; konstanta : kde zacinaji data,asi 161h..nebo 180h... DELIPS: ld bc,0 ; delka sbaleneho,to jedine doda pakovac ex de,hl add hl,bc ; konec1:hl,konec2:de inc bc push bc ; delka zabaleneho lddr ; presun nahoru inc de ; start hora ex de,hl ; do hl exx ld hl,1FFh ld b,0 xor a DELI78: ld (hl),a dec hl djnz DELI78 ; init prvniho pod nim exx pop bc ; delka zabaleneho ld de,200h ; kam DELI99: ld a,(hl) cp ZAR ; zarazka ? jr z,DELI20 ldi ; bez : ldi DELI21: inc b jr z,DELI65 dec b jr DELI99 DELI65: ld c,b push bc ld hl,200h ld de,100h DELIPU: ld bc,0 ; delka rozbaleneho, take doda pakovac ldir ; relokace dolu ke 100h jp 100h DELI20: ; je to zarazka... dec bc ; zarazka inc hl ld a,(hl) ; za zarazkou dec bc ; za zarazkou inc hl or a ; jen zarazka samotna ? jr nz,DELI30 ; ne:komprese ! ld a,ZAR ld (de),a inc de jr DELI21 DELI30: push de exx pop hl ld e,l ld d,h ld c,a ld b,0 or a sbc hl,bc exx ld a,(hl) inc hl dec bc exx ldi ; ld c,8 ; hl : odkud,de : kam,b uz je = 0.. DELI40: rlca jr c,DELI41 inc hl DELI42: dec c jr nz,DELI40 push de exx pop de jr DELI21 DELI41: ldi inc c jr DELI42 DELI98: .dephase ;::::::::: VOLNARAM: end