Login

Subversion Repositories NedoOS

Rev

Rev 609 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

sureLE=0
pakto=#C000 ;можно урезать (потом уходит в >0, что интерпретируется как pak9+)
CATBUF=#8000
CURBUF=#8900
CATGFX=#8A00
TCRC=#5000
svbfsz=#200
sets=17
pgTEXT=#10
pgLZ=#11
;коды Хаффмана<<:+#200/#400 (H/L)
ldbit=#4000 ;кратно 512!
        ;DISPLAY /T,ldbit,"..",ldbit+#5FF
bitlens=ldbit+#600;сколько листьев в ярусе
        ;DISPLAY /T,bitlens,"..",bitlens+#FF

bdbit=bitlens+#100
        ;DISPLAY /T,bdbit,"..",bdbit+#2FF

huff=bdbit
;узлы (frq,adrA(L))
;adrB=adrA+4 (если это не литерал)
;H,L!
;max=595
;+еще 1 до переноса
;+еще 1 для признака конца НЕЗАНЯТЫХ (-1)
huffend=597*4+huff
lens=-95*4+huffend-298-48-28
        ;DISPLAY /T,lens

;отсортированы по возрастанию frq
frqs=huffend ;декрементированные
        ;DISPLAY /T,frqs,">=#5000"
frqend=298*2+frqs
frq2end=298*4+1+frqs
        ;DISPLAY /T,frq2end

;коды Хаффмана<<:+#100/#200 (H/L)
ddbit=(frq2end+255)/256*256
ddfrq=ddbit
ddfrqend=ddbit+#300 ;сколько точно??? TODO
        ;DISPLAY /T,ddbit,"..",ddfrqend-1
LZCPtab=#5800;ddbit+256
rdbit=ddbit+48 ;литералы 48..75
rdfrq=ddfrq+96 ;!

OUTNAM
        db "mynewrar.rar",0 ;TODO сгенерировать из ARCNAME
ARCNAME;=#5CDD
        db "mynewrarrar"
;filez=fout-512
filez=#5D3B
;4 б/файл: paksz,unpsz

;from=-MAX..XXXX
ENTRCOP=23698 ;16 bytes
;ключи: 11bit
keys=#4000 ;делится на 512!
keymask=7
;переходы по ключам: pg3,4,6,7

;todo:read arc AFTER lz&huf constr
;todo:файл резать по переполнению lz buf
;todo:грузить 2ю часть файла во весь буфер
begin=#60D6+16 ;16=запас на левые досы
;em3d13=1
;h18=1;глючит выгрузка по 2 сект.на др.диск(496 в GO лечит?)
dolds=0;1 ;коды повтора смещений (невыгодные)
nastr=1 ;+174
;v1="3
;v2="3
;cache=1
adir=30 ;можно ввести название директории (без \), если нажать A/C с Caps Shift
k256=0;#56 ;1 pg keys winpgs=52..55
k3b=1 ;3bytes keys
filter=1
fast0s=8 ;-0.1%
fastCPIQ=1;0 ;+18
fastTREE=1;1 ;+9
fastWRI=1
skipnotree=1
;flash=1
;panel=1
zac=0 ;зачерк
;qc=1 ;+19
ay=1

opt2s=1&ramdisk

;RELDRV
;       LD (DRVLET),A
RELOAD
        LD SP,STACK
       CALL OUTpgTEXT
      ;A=16
       IF ay
        LD HL,AYREGE
        LD D,14
AY0     LD BC,-3
        DEC D
        DEC HL
        OUT (C),D
        LD B,#BF
        LD A,(HL)
        OUT (C),A
        jr NZ,AY0
       ELSE
        OUT (-2),A
       ENDIF
        ;EI
       ;HALT
       ;CALL 8020
       ;JNC $-4
       LD DE,0
       LD (selAsz),DE
        ;LD HL,CATBUF
        ;LD BC,#905
        ;CALL DOS
       XOR A
       LD (WYBRA),A
       IF adir
       LD HL,fdir
       LD (Lfname),HL
       ENDIF
;        LD HL,(CURENTR)
;        LD DE,ENTRCOP
;        LD B,16
;CP0     LD A,(DE)
;        CP (HL)
;        INC HL
;        inc DE
;        jr NZ,$+4
;        DJNZ CP0
        LD HL,CATGFX
       ;jr Z,NOINCAT
        LD DE,CATBUF
        LD (CURENTR),DE
        XOR A
        LD (CURCATY),A
        LD (CATTOP),HL
;NOINCAT
        PUSH HL
       ;LD DE,CATGFX+1
       ld d,h
       ld e,l
       inc de
        LD B,+(128*#50+1)/256 ;0.28
       LD (HL),L
       LDIR
       ;CALL CLSA0
        LD HL,CATBUF
        POP DE
       ;LD C,0
PRCAT0  LD A,(HL)
        OR A
        jr Z,PRCATQ
        PUSH BC
        LD B,8
PRCAT1 ;LD A,(HL)
       ;INC HL
        CALL PRGFXHL
        INC DE
        DJNZ PRCAT1
       INC E
       ;LD A,(HL)
        CALL PRGFXHL
       DEC E
        DEC HL
        LD A,(HL)
        INC HL
        INC HL
        inc HL
        LD C,(HL)
        INC HL
        LD B,(HL)
        INC HL
        CP "B"
        jr Z,PRCHOB
        DEC BC
        INC B
        LD A,(HL)
PRCHOB  CP B
        LD A,"$"
        CALL NZ,PRGFX
        INC HL
        inc HL
        inc HL
        POP BC
        LD A,E
        ADD A,#50-8
        LD E,A
        jr NC,$+3
        INC D
        INC C
        JR PRCAT0
SELHEX
        LD DE,PRNUM
        LD A,(DE)
        XOR 62^24
        LD (DE),A
       ;JP REFRESH
PRCATQ
REFRESH
        ;CALL PANEL
        LD DE,#4016;7
        LD BC,(CATBUF+#8E5) ;free
        CALL PRNUM
        LD E,#10
        LD HL,TMENU
        CALL PRTEXT
        LD DE,#4001
DRVLET=$+1
        LD A,0
        ADD A,"A"
        CALL PRTHI
        LD A,":"
        CALL PRTHI
        LD B,11
        LD HL,CATBUF+#8F5
DISNM0  LD A,(HL)
        INC HL
        ADD A,A
        jr Z,DISNMQ
        PUSH AF
       ;SRL A
       RRA
        CALL PRTHI
        POP AF
        jr C,DISNMQ
        DJNZ DISNM0
DISNMQ
       IF nastr
        CALL PRSET
       ENDIF
        LD HL,CPn
        LD (HL),"n"
        LD HL,ADDloop
        LD (ADDjpnz),HL
OLDENTR
CURENTR=$+1
        LD HL,CATBUF
CURCATY=$+1
        LD B,0 ;Y
      ;HL=cur dir entry adr
PRHEAD
        CALL PRHEADP
SELFIL0
        LD (CURENTR),HL
        LD A,B
        LD (CURCATY),A
       LD C,#78
       CALL PRCUR
        PUSH BC,HL
        LD DE,#5010
        CALL PRFN
        LD E,#30
        DEC L,L
        LD C,(HL)
        INC L
        LD B,(HL)
        PUSH HL
        CALL PRNUM
        POP HL
        LD A,","
        CALL PRTHI
        INC L
        LD C,(HL)
        INC L
        LD B,(HL)
        PUSH HL
        CALL PRNUM
        POP HL
        LD E,#56
        INC L
        LD L,(HL)
        ld H,0
       LD (selfsz),HL
        CALL PRNUM3
selAsz=$+1
       LD HL,0
       LD E,#D6
       CALL PRNUM4
        POP HL
        PUSH HL
       ;HALT
        LD DE,ENTRCOP
        LD BC,16
        LDIR
CATTOP=$+1
        LD HL,0
        CALL VIEGFX
        POP HL,BC
        CALL IYKEY
        LD C,7
        CALL PRCUR
        CP 32
        jr NZ,SELNSPC
       PUSH HL
SELSPC
       IF zac
        LD C,40
       ELSE
        LD C,0
       ENDIF
        CALL CAT2GFX
       IF zac
        LD E,L
        ld D,5
        LD A,(DE)
        RRA
        LD DE,10
        jr C,$+5
        LD DE,-10
        RRA
        jr C,$+3
        SBC HL,DE
        AND 3
        ADD A,3
        LD LX,A
        LD HX,LX
        LD C,10
       ELSE
        LD C,80
       ENDIF
WYBINV0 LD A,(HL)
        CPL
        LD (HL),A
        INC HL
       IF zac
        DEC HX
        jr NZ,WYBINVN
        LD HX,LX
        ADD HL,DE
       ENDIF
WYBINVN DEC C
        jr NZ,WYBINV0
       POP DE
       PUSH DE
        CALL WYBPP
       jr Z,WYBY
      ;такой файл не помечали
WYB0Q   LD HL,WYBRA
        LD A,(HL)
        INC (HL)
        ADD A,A
        ADD A,0xff&((filez+1)/2)
        LD L,A
        ADC A,+(filez+1)/512
        SUB L
        LD H,A
        ADD HL,HL
        LD (HL),D
        DEC HL
        LD (HL),E
        JR WYBYOK
SELNSPC
        CP 13
        jr NZ,SELNENT
       PUSH HL
        LD C,8
        CALL CAT2GFX
        EX DE,HL
        LD A,"$"
        CALL PRGFX
       POP DE
       PUSH DE
       CALL WYBPP
       EX DE,HL
       jr NZ,SELSPC
        JR WYBYOKN
      ;снять пометку
WYBY     EX DE,HL
         LD HL,WYBRA
         DEC (HL)
         LD H,D
         ld L,E
        DEC DE
        INC HL,HL,HL
WYBY0
       DUP 4
        LDI
        INC BC
       EDUP
        DEC C
        jr NZ,WYBY0
WYBYOK
selfsz=$+1
       LD DE,0
       LD HL,(selAsz)
       jr NZ,$+6
       SBC HL,DE
       JR $+3
       ADD HL,DE
       LD (selAsz),HL
WYBYOKN
        CALL PRHEADP
       POP HL
SELDOWN LD DE,16
        ADD HL,DE
       ;A<>0
        XOR A
        OR (HL)
        JP Z,OLDENTR
        INC B
        LD A,B
        CP 22 ;HGT
        jr NZ,STLFIL0
        DEC B
        LD E,#50
        JR SELFUDM
SELNENT
        SUB 11
        jr NZ,SELFnU
        LD DE,-16
        ADD HL,DE
        LD A,H
        CP CATBUF/256
        JP C,OLDENTR
        DEC B
        JP P,SDLFIL0
        INC B
        LD DE,-#50
        JR SELFUDM
SELFILN SBC HL,DE
STLFIL0 JR SDLFIL0
SELFnU
        INC A
        jr Z,SELDOWN
        INC A
        jr NZ,SELFnR
        LD A,22*2-1
        SUB B
        LD C,A
        XOR A
        LD DE,16
SELFR0  ADD HL,DE
        CP (HL)
        jr Z,SELFgE
        DEC C
        jr NZ,SELFR0
        LD D,A
        LD A,22-1
        SUB B
        LD E,A
       INC A
       CALL SELpppp
        LD DE,22*#50
SELFUDM PUSH HL
        LD HL,(CATTOP) ;адрес графики начала видимой части каталога
        ADD HL,DE
        LD (CATTOP),HL
        POP HL
        JR SDLFIL0
SELFgE  LD HL,(CURENTR)
SELFgE0 LD DE,16
        ADD HL,DE
        LD A,(HL)
        SBC HL,DE
        OR A
        jr Z,SDLFIL0
        ADD HL,DE
        INC B
        LD A,B
        CP 22
        jr NZ,SELFgE0
        DEC B
        LD E,#50
        PUSH HL
        LD HL,(CATTOP)
        ADD HL,DE
        LD (CATTOP),HL
        POP HL
        JR SELFgE0
SELFnR
        INC A
        jr NZ,SELFnL
        LD DE,-22*16
        ADD HL,DE
        PUSH HL
        LD E,B
        ld D,A
SELpppp
        EX DE,HL
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl
        EX DE,HL
        SBC HL,DE
       OR A
       RET NZ
        LD A,H
        CP CATBUF/256
        POP HL
        LD DE,-22*#50
        jr NC,SELFUDM
        LD HL,CATGFX
        LD (CATTOP),HL
        LD HL,CATBUF
        LD B,L;0
SDLFIL0 JP SELFIL0
SELFnL
        INC A
        JP Z,SELHEX
         SUB -7
         OR 32
        CP "p"
        JP Z,SELFILT
        CP "c"
        JP Z,SELCREA
         CP "n"
         JP Z,SELCREA
        CP "a"
        JP Z,SELADD
       CP "s"
       JP Z,SELSEP
       CP "k"
       jr NZ,SELFINk
        LD DE,dicszM
        LD A,(DE)
        ADD A,A
;0=>0, -1=>-2, -#80=>0
        jr NZ,SELkA2
        jr C,SELkA2
        LD A,-4
SELkA2  LD (DE),A
        NEG
        RRCA
        RRCA
        LD C,47
        INC C
        SUB 10
        jr NC,$-3
        ADD A,10+"0"
        LD DE,tKB+1
        LD (DE),A
        DEC DE
        LD A,C
        LD (DE),A
        JP REFRESH
SELFINk
        CP "q"
        jr NZ,SELNQUI
        QUIT
SELNQUI
        CP "m"
        jr Z,SELMET
        CP "r"
        jr Z,SELRAR
       IF dolds
       CP "+"
       jr Z,SELdolds
       ENDIF
       IF nastr
        CP "f"
        jr Z,SELFINE
       ENDIF
        CP "h"
        jr Z,SELHEA
        ;LD E,"A"
        ;CP "!"
        ;jr Z,SELDEST
        ;INC E
        ;CP "@"|32
        ;jr Z,SELDEST
        ;INC E
        ;SUB "#"
        ;jr Z,SELDEST
        ;INC E
        ;DEC A
        ;jr Z,SELDEST
        ;SUB "1"-"$"
        ;CP 4
        ;JP C,RELDRV
        JP SELFIL0
;SELDEST LD A,E
;        LD (TDEST),A
;        JP PRHEAD
SELMET
        LD DE,tmethod
       PUSH HL
Ptmets=$+1
        LD HL,tmets
        BIT 7,(HL)
       jr Z,$+5
        LD HL,tmets
        LD C,H
       LDI
       LDI
        LD DE,LEflag
       LDI
        LD DE,FMETH
       LDI
        LD (Ptmets),HL
       POP HL
        JP REFRESH
SELRAR
        LD DE,extext
        LD A,(DE)
        XOR "z"^"a"
        LD (DE),A
        INC DE
        LD A,(DE)
        XOR "x"^"r"
        LD (DE),A
        JP REFRESH
       IF dolds
SELdolds
        LD DE,doldson
        LD A,(DE)
        XOR " "^"+"
        LD (DE),A
        JP REFRESH
       ENDIF
SELHEA
        LD DE,THEADON
        LD A,(DE)
        XOR "n"^"f"
        LD (DE),A
        INC DE
        LD A,(DE)
        XOR " "^"f"
        LD (DE),A
        JP PRHEAD
       
       IF nastr
SELFINE
SELFINY=$+1
        LD E,0 ;Y
SELFIN0
        LD A,E
       LD (SELFINY),A
        ADD A,A
        add A,A
        add A,A
        ADD A,36
        LD C,#1C*8
        CALL 8880
        LD (HL),#3C;H
       CALL IYKEY
        LD D,0
        LD (HL),D
        LD HL,SETS
        ADD HL,DE
        add HL,DE
       ;CP 13
       ;JP Z,OLDENTR
       LD BC,SELFIN0
       PUSH BC
        LD C,(HL)
        INC HL
        LD B,(HL)
        SUB 8
        jr NZ,FINnL
        LD A,(BC)
        CP #80
       RET Z
        PUSH BC
        LD HL,TSETMAY
        CPIR
FINLQ   POP BC
        LD A,(HL)
        LD (BC),A
PRSET
        PUSH DE
        LD HL,#589C
        LD DE,29
        LD BC,sets*256+#17
PRSET0  LD (HL),C
        INC L
        LD (HL),C
        INC L
        LD (HL),C
        INC L
        LD (HL),C
        ADD HL,DE
        DJNZ PRSET0
        LD DE,#409C
        LD HL,SETS
       ;LD C,sets
PRSET1
        CALL PRTHI32
       ;PUSH BC
        LD C,(HL)
        INC HL
        LD B,(HL)
        LD A,(BC)
       ;POP BC
        CALL PRHEX
        CALL PRTHI32
        DEC E,E,E,E
        CALL NXTLIN
        INC L
       ;DEC C
        jr NZ,PRSET1
        POP DE
        RET
FINnL   DEC A
        jr NZ,FINnR
        LD A,(BC)
        CP #FF
       RET Z
        PUSH BC
        LD HL,TSETMAY
        CPIR
        DEC HL,HL
        JR FINLQ
FINnR   DEC A
        jr NZ,FINnD
        LD A,sets-1
        CP E
       RET Z
        INC E
       RET
FINnD  DEC A
       JP NZ,RELOAD
        CP E
       RET Z
        DEC E
       RET
       ENDIF
WYBPP
WYBRA=$+1
        LD C,0
        LD A,C
       ;OR A
       ;JZ WYB0Q
       SUB 1
       RET C
        LD HL,filez
WYB0    LD A,(HL)
        INC HL
        CP E
        jr NZ,WYBN
        LD A,(HL)
        CP D
       ;JZ WYBY
       RET Z
WYBN    INC HL,HL,HL
        DEC C
        jr NZ,WYB0
       INC C
       RET

;separate files pack
SELSEP
        CALL SOZDWYB
        LD HL,SEPloop
        LD (ADDjpnz),HL
SEPloop
      LD HL,4
      LD (filezsz),HL ;чтоб не делать packlist
        CALL OUTpgTEXT ;вплоть до DOS в LZ
       IF ay==0
        OUT (-2),A
       ENDIF
       PUSH AF
        ;CALL GETfCUR ;hl=archive name
        SET 7,H ;skip hob.flag
        JR SEPlopU
       
;create rar
SELCREA
;a='n' (new)/'c' (create)
       PUSH AF
        ;PUSH HL
        ;CALL SOZDWYB ;если файлы не выбраны, то выбрать текущий (hl)
          ld hl,WYBRA
          ld (hl),1
        ;POP HL
SEPlopU ;LD DE,ARCNAME
        ;LD BC,8
        ;LDIR
        ld hl,ARCNAME+8;EX DE,HL
       LD A,(THEADON)
       CP "n"
       LD (HL)," "
       jr NZ,$+4 ;no rar header
        LD (HL),"r"
        ;CALL CON1NAM ;включает tosave, исправляет имя
        ;TODO скопировать имя из (curfilenameaddr) в fdir
        ;jr $
        ld hl,(curfilenameaddr)
         inc hl
         ld a,(hl)
         cp ':'
         inc hl
         jr z,$+4
          dec hl
          dec hl
         ld a,(hl)
         cp '/'
         jr nz,$+3
         inc hl
        ld de,fdir
        call strcopy
        call setfilenamelen
       POP AF
       PUSH AF
       ;CP pgTEXT ;separate(после OUTpgTEXT)
       PUSH BC,DE,HL
        ;LD C,#12 ;del
      PUSH AF
       ;CALL NZ,DOD
        CALL PKST ;установить hl', de'
       LD HL,(extext);"zx"
      POP AF
      ;jr Z,CRyOF ;separate
      LD A,(THEADON)
      CP "n"
      jr Z,CRnOFF1
;no rar header
      LD A,(WYBRA)
      DEC A
      jr NZ,$+5 ;TODO зачем???
CRyOF LD HL,(unpsz)
CRnOFF1
       LD (ARCNAME+9),HL
        ;LD A,46
        ;LD (rrrE),A ;ini ext
        ;CALL READs8
        ;LD HL,(s8+#E1);1st free
       ;LD (SAVE1st),HL

;TODO ARCNAME->OUTNAM      
       call SAVECREATE ;OUTNAM=name 8.3
;a=1: file exists, add to end
       dec a
       jr z,CREAfil ;don't add rar header
       
       LD A,(THEADON)
       CP "n"
       jr NZ,CREAfil ;no rar header
        LD IX,RARHEAD
        LD B,7
        CALL BLOCK
        LD IX,arhd
        LD B,13-2
;B=len-2(CRC)
        CALL UPCRC1
        LD IX,arhd-2
        LD (arhd-2),DE
        LD B,13
        CALL BLOCK
CREAfil
       POP HL,DE,BC
        POP AF
       CP "n";New
        JP NZ,ADDend;Create
        CALL SAVE_ ;flush outfile
        call SAVECLOSE
        JR RELOAZ
SELFILT
       CALL CLA ;сбрасывет lded
        ;XOR A
        ;CALL CONVNAM ;почему выключается tosave??? TODO
       
;hl=(ADRfrom)
       
        CALL PKST ;установить hl', de'
      ;header off
        PUSH HL
        LD HL,CPn
        LD (HL),H ;<>#6E ;no CRC??? TODO почему???
        POP HL

        CALL PACKfil
        CALL QUIT_ ;печать статистики
       ;CALL 8026
       ;JC $-3
RELOAZ  
        ;jr $
        ret ;JP RELOAD

SELADD
        CALL SOZDWYB
ADDloop
        ;CALL READs8
       ;LD HL,(s8+#E4) ;число файлов на диске
       ; XOR A
       ; CP L
       ;jr Z,RELOAZ ;no archive
        ;DEC L
       ;LD H,A
       ;ld D,H
       ;ADD HL,HL,HL,HL,HL,HL,HL,HL
       ;LD E,H
       ;ld H,dirsec/256
        ;PUSH HL
       ;LD L,D
        ;LD BC,#105
        ;CALL DOD ;TODO
        ;POP HL ;hl=дескриптор последнего архива на диске
        ;LD A,(HL)
        ;DEC A
       ;jr Z,RELOAZ ;no archive
        ;LD DE,ARCNAME
        ;LD BC,11
        ;LDIR
        ;DEC L
         ld hl,ARCNAME+8+2
       LD A,"r"
       CP (HL)
       jr NZ,RELnrar ;rzx
        DEC L
       LD A,"a"
       CP (HL)
       jr Z,RELyrar
        INC L
RELnrar
       LD A,(extext+1)
       CP (HL)
       jr NZ,RELOAZ  ;not RZX
        DEC L
       LD A,(extext)
       CP (HL)
       jr NZ,RELOAZ  ;not RZX
RELyrar DEC L
        ;LD A,(HL)
        ;DEC A
        ;CP "r"-1
        ;jr NZ,$+4
        ;LD A,46
        ;LD (rrrE),A ;ini ext
      ;узнаем длину
        INC L,L,L
        LD C,(HL)
        INC L
        LD B,(HL)
        INC L
        LD E,(HL) ;sectors
       ;LD (SAV_a),HL
       PUSH DE
       PUSH BC
      ;архив надо удалить
       ;LD A,24
       ;LD (SAV_jr),A
        CALL CON1NAM
       ;PUSH BC,DE,HL
      ;грузим последний сектор архива
        ;LD HL,(s8+#E1) ;1st free
        ;DEC L
        ;JP P,$+6
        ;LD L,15
        ;DEC H
       ;LD (SAVE1st),HL
        ;EX DE,HL
        ;LD HL,fout
        ; LD BC,#105
        ;CALL DOD
       ;POP HL,DE,BC
        EXX
       POP BC
        DEC BC
        LD L,C
        LD H,fout/256
        INC HL
;HL=fout+1..256
       POP DE
        DEC E
        EXX
ADDend  
        ;jr $
        ld a,(savefilehandle)
        ld b,a
        OS_TELLHANDLE
;out: dehl=offset
        ld (recordstart),hl
        ld (recordstartHSW),de

         ld de,(curfilenameaddr)
         call openstream_file
        CALL PACKfil
         call SAVE_ ;flush outfile
         push hl
recordstart=$+1
        ld hl,0
recordstartHSW=$+1
        ld de,0
;dehl=offset
         call SAVEREWIND
         pop hl
        CALL BYTsPPPfout ;сохранить начало fout в начало файла (TODO или блока???)
         call SAVECLOSE
         call closestream_file
         
         ld hl,(curfilenameaddr)
         call prtext
         ld hl,tadded
         call prtext
         
        CALL QUIT_
       
        if 1==0
;таблица упакованных файлов для выгрузки отдельно?
fileCUR=$+1
        LD HL,0;(fileCUR)
        LD DE,(paksz)
        LD (HL),E
        INC HL
        LD (HL),D
        INC HL
        LD DE,(unpsz)
        LD (HL),E
        INC HL
        LD (HL),D
        INC HL
        LD (fileCUR),HL
        endif
       
        LD HL,WYBRA
        DEC (HL)
ADDjpnz=$+1
        JP NZ,ADDloop
       LD A,(THEADON)
       CP "n"
       jr Z,RELOAT
filezsz=$+1
      LD DE,0
      LD A,E
      SUB 4;паковали 1 файл=его параметры в дескрипторе "архива"
      OR D
      jr Z,RELOAT
      PUSH DE
        ;LD HL,TPLIST
        ;LD C,#13
        ;CALL DOD
        ;LD C,#12;del
        ;CALL DOD
        LD HL,filez;отсюда савить не хочт
       LD D,keys/256
       PUSH DE
       LD B,2
       LDIR ;??? TODO
       POP HL
;filezsz=$+1
;LD DE,0
      POP DE
        ;LD C,#B;saveC
        ;CALL DOD
       
;TODO save file hl=addr, de=size
       
RELOAT  JP RELOAZ;RELOAD

;3
CON1NAM
        ;CALL GETfCUR
         ld hl,ARCNAME
        LD A,1
CONVNAM
;out: hl=(ADRfrom)
        LD (tosave),A
      ;CALL OUTpgTEXT
        LD BC,11
        ADD HL,BC
       ;BIT 7,H
       ;SET 7,H
        LD C,(HL)
        INC HL
        LD B,(HL) ;file length TODO
        INC HL
       LD A,(HL) ;<>0
       ;jr NZ,HOBNJR ;TODO убрать хобеты
       ; LD B,(HL)
       ; ld C,17
       ; PUSH HL
       ; PUSH HL
       ; LD HL,CNVNMHQ
       ; EX (SP),HL
       ; XOR A
;HOBNJR  
        ;ld bc,0x100
        ;LD (unpsz),BC

      PUSH BC,HL
       LD E,A ;??? TODO
        RES 2,L
        DEC L
       PUSH HL
        LD BC,8
FNLEN0  DEC HL
        LD A,(HL)
        CP 32
        jr NZ,FNLENN
        DEC C
        jr NZ,FNLEN0
       INC C ;против пустого имени
       INC L
FNLENN
       IF filter==0
       PUSH BC
       LD A,".
       CPDR
       POP BC
       ENDIF
       POP HL
       IF filter==0
       JZ $+4 ;против 12.34< >
       ENDIF
       INC E
       DEC E
         PUSH HL
        PUSH DE
Lfname=$+1
        LD DE,fdir
        LD A,(HL)
        RES 3,L
       IF filter
       PUSH AF
filt0   LD A,(HL)
       LD (HL),"
_"
       CP 33
       jr C,filtGOO
       CP "
."
       jr Z,filtGOO
       LD (HL),A
        CP "
+"
        jr Z,filtBAD
        CP 34
        jr Z,filtBAD
        CP "
*"
        jr Z,filtBAD
        CP "
/"
        jr Z,filtBAD
        CP 0x5c;"
\"
        jr Z,filtBAD
        CP "
:"
        jr C,filtGOO
        CP "
@"
        jr NC,filtGOO
filtBAD LD (HL),"
-"
filtGOO LDI
        JP PE,filt0
       POP AF
       ELSE
        LDIR
       ENDIF
        EX DE,HL
        POP BC
         POP DE
       jr Z,FNLyEXT
        CP "
"
        jr Z,FNLnEXT
FNLyEXT LD (HL),"
."
        INC HL
       INC C
       DEC C
       jr NZ,$+5
       LD (HL),"
$"
       INC HL
        LD (HL),A
        INC HL
       PUSH HL
         EX DE,HL
         INC HL
         ;CALL goodH3
        LD B,(HL)
        INC HL
        LD C,(HL)
        INC HL
        POP HL
         LD A,"
"
         CP B
         jr Z,$+4
         LD (HL),B
         INC HL
         CP C
         jr Z,$+4
         LD (HL),C
         INC HL
FNLnEXT
        call setfilenamelen
      POP HL,BC

        INC L
        LD E,(HL)
        INC L
        LD D,(HL)
CNVNMUSE
        if 1==0
;догрузить 32К
         ld bc,0x100;0x8000 ;костыль file size TODO
       DEC BC
       LD A,B
        INC B
       CP MAX/256
        INC A
        jr C,CNVNMUSEnokus
        LD BC,packfilsz;#8000 ;кусками по #8000
        ;LD (kus),BC
CNVNMUSEnokus
       SUB B
       LD (FILEremain),A ;важно 0/не0
        XOR A
        LD L,A
        SUB B
        LD H,A
       ;LD (ADRfrom),HL
       ;LD C,5 ;TODO убрать
       endif
        RET
       
        if 1==0
;дб место под 17b заголовок с адр файла
CNVNMHQ
        EX DE,HL
        EX (SP),HL
       DEC B ;v11
        PUSH BC
        LD C,17
        LD (kus),BC
        LD BC,13
        OR A
        SBC HL,BC
        LDIR
       LD A,(HL) ;каталог там же!
       EX DE,HL
       LD (HL),B
       INC HL
       LD (HL),A
        LD DE,105
        LD L,D
        LD B,15
HOB0    LD A,(HL)
        ADD A,E
        LD E,A
        LD A,(HL)
        ADC A,D
        LD D,A
        INC HL
        DJNZ HOB0
        LD (HL),E
        INC HL
        LD (HL),D
        INC HL
        POP BC
        POP DE
        RET
        endif

setfilenamelen
        ld hl,fdir
        call strlen
        ;LD DE,-fdir
        ;ADD HL,DE
        LD (namsz),HL
        LD BC,32
        ADD HL,BC
        LD (fihdsz),HL
        ret

SOZDWYB
;hl=адрес текущего дескриптора в CATBUF
       CALL CLA
        ;LD DE,filez
        ;ld (fileCUR),DE ;таблица упакованных файлов для выгрузки отдельно?
        LD A,(WYBRA)
        OR A
        jr NZ,SOZDWYn ;уже есть выбранные файлы
        INC A
        LD (WYBRA),A
        LD (filez),HL ;hl=адрес текущего дескриптора в CATBUF
SOZDWYn
        ADD A,A
        LD B,A ;b=selfiles*2
        ADD A,A
        LD E,A
        LD A,0
        ADC A,A
        LD D,A ;de=selfiles*4
        LD (filezsz),DE
       IF adir==0
        RET
       ELSE
        ;CALL 8026
        ;RET C
        CALL CLS
        ;LD (HL),#44
        ;LDIR
INCLX   INC B
INPUT0
        LD HL,fdir
        PUSH BC
       LD DE,#40E0
        CALL PR_B
       DEC HL
       dec E
        POP BC
       DEC E
      ;LD A,"
_"
      ;CALL PRTHI
       CALL PRTHI32
        CALL IYKEY
        CP key_enter
        jr Z,INPOK
        cp 0x20
        jr C,INPDEL ;прочие системные кнопки не нужны
      ;JP M,INPUT0
       CP "
/"
       jr NZ,$+4
       LD A,0x5c;"
\"
        LD (HL),A
        LD A,B
        CP adir;+1
        jr NZ,INCLX
INPDEL  DJNZ INPUT0
        JR INCLX
INPOK
       LD (HL),0x5c;"
\"
       INC HL
        LD (Lfname),HL
       ENDIF
CLA
        PUSH HL
        CALL CLS
        ;LD B,3
        ;LDIR
       ;LD (lded),BC ;TODO куда-то в другое место
        POP HL
        RET


CLPG
        push af
        CALL OUTME
        if 1==1
        ld hl,0xc000
        ld de,0xc001
        ld bc,0x3fff
        ld (hl),l;0
        ldir
        else ;может запортить bfxx
        LD HL,0
        LD (CLPGSP),SP
        LD SP,HL
       LD C,2
        LD B,L
CLPG0   DUP 16
        PUSH HL
        EDUP
        DJNZ CLPG0
       DEC C
       JR NZ,CLPG0
CLPGSP=$+1
        LD SP,0
        endif
        pop af
        RET

IYKEY
        PUSH HL
        ;LD HL,23560
        ;LD (HL),H
        ;LD A,(HL)
        ;CP H
        ;jr Z,$-2
        push bc
        push de
        push ix
        push iy ;TODO надо ли альтернативные?
        YIELDGETKEYLOOP
        pop iy
        pop ix
        pop de
        pop bc
        POP HL
        RET
;2
UPCRC1
        LD HL,-1
        ld D,H
        ld E,L
UPCRC   PUSH BC
        LD C,(IX)
        CALL crcpp
        POP BC
        INC IX
        DJNZ UPCRC
INVCRC  CALL $+3
        EX DE,HL
INVHL   LD A,H
        CPL
        LD H,A
        LD A,L
        CPL
        LD L,A
        RET
crcpp
        LD B,8
crclp   LD A,E
        XOR C
        SRL C
        srl H
        RR L
        rr D
        rr E
        RRA
        jr NC,noxor
        LD A,H
        XOR #ED
        LD H,A
        LD A,L
        XOR #B8
        LD L,A
        LD A,D
        XOR #83
        LD D,A
        LD A,E
        XOR #20
        LD E,A
noxor   DJNZ crclp
        RET

       IF ay
        DW 300,400,500
        DB 0
        DB 7<3
        DB 16,16,16
        DW 6700
        DB 1
AYREGE
       ENDIF
tmets
        DB "
fa",24,"4"
        DB "
pu",24,"4"
        DB "
be",40,"5"
        DB -1
       IF nastr
TSETMAY=$-1
        DB #FE,#FD,#FC,#FA,#F8,#F4,#F0
        DB #E8,#E0,#D0,#C0,#A0,#80
       ENDIF
TPLIST
        DB "
packlistC"
THEAD
        DB "
to A",13
TDEST=$-2
        DB "
Header on ",13
THEADON=$-3
        DB "
Mark ",0
TMENU
        DB "
free",13
tMeth
        DB "
Method:"
tmethod DB "
best"
tKB     DB "
32K",13
        DB 13
        DB "
1-4 drives",13
       IF nastr
        DB "
Finetune"
       ENDIF
        DB 13
        DB "
Pack test",13
       DB "
Separate pack"
        DB 13,"
Create Rzx"
extext=$-2
       IF dolds
doldson DB "
"
       ENDIF
        DB 13
        DB "
New empty",13
        DB "
Add",13
        DB 13
        DB "
Quit to DOS"
        NOP
RARHEAD
        DB "
Rar!",#1A,7,0
        DW 0 ;CRC
arhd    DB #73
        DW 0
        DW 13
        DW 0
        DW 0,0

fihd    DB #74
        DW #8000
fihdsz  DW 0
paksz   DS 4
unpsz   DS 4
        DB 82
filcrc  DS 4
        DS 4 ;TIME
        DB 20 ;VER
FMETH   DB "
5"
namsz   DW 0
        DS 4 ;ATTR
fdir    ;DB "
";filename.$diz
        db "
sometext.flz"
        ds fdir+256-$
;Konez=$+13+adir

;WASSETS
       ;DISP #5B05;(#5B5C)=#10
;GDESETS
QUIT_
        XOR A
        OUT (-2),A
        ;CALL CLS
        ;INC H
        ;inc D
        ;LD (HL),71
        ;LDIR
        LD HL,(unpsz)
        LD DE,#488A
        CALL PRNUM2
       LD HL,(Lfname)
       LD E,#4B
       LD A,(namsz)
       SUB L
       ADD A,fdir&0xff
       LD B,A
       CALL PR_B
        LD HL,(paksz)
        LD E,#AA
PRNUM2
       PUSH HL
       CALL PRNUMD
       LD A,"
="
       CALL PRTHI
       POP BC
PRNUMH
        LD A,"
#"
        CALL PRTHI
        LD A,B
        CALL PRHEX
        LD A,C
PRHEX
        CALL PRHEXD
PRHEXD  RRCA
        RRCA
        RRCA
        RRCA
        PUSH AF
        AND 15
        CP 10
        CCF
        ADC A,"
0"
        DAA
        CALL PRTHI
        POP AF
        RET
PRNUM
        LD A,PRNUMH-$-2
        LD H,B
        ld L,C
PRNUMD  LD BC,10000
        CALL PRDIG
PRNUM4  LD BC,1000
        CALL PRDIG
PRNUM3  LD BC,100
        CALL PRDIG
        LD C,10
        CALL PRDIG
        LD C,1
PRDIG
        LD A,"
0"-1
        OR A
        INC A
        SBC HL,BC
        jr NC,$-3
        ADD HL,BC
PRJR    jr NC,PR8X8
PRTHI
        if 1==0
        PUSH BC,DE,HL
        CALL BEFOPR
PRTHI0  LD A,(HL)
        RRCA
        OR (HL)
        LD (DE),A
        INC L,D
        DJNZ PRTHI0
        POP HL,DE,BC
        INC E
        endif
        RET

        if 1==0 ;TODO
PR1234
        LD DE,#5941
        endif
PR88HEX
        LD A,H
        CALL PR12
        LD A,L
PR12    PUSH AF
        RRA
        RRA
        RRA
        RRA
        CALL PR8X8
        POP AF
PR8X8
       PUSH HL
        ADD A,A
        ADD A,A
        ADD A,A
        OR #80
        LD H,61
        CP 80+#80
        jr C,$+5
        SUB 72+#80
        INC H
        LD L,A
PR8X80  INC L
        LD A,(HL)
        ADD A,A,A,A
        LD B,A
       DUP 5
        SBC A,A
        LD (DE),A
        INC E
        SLA B
       EDUP
        SBC A,A
        LD (DE),A
       LD A,E
       ADD A,#1B
       LD E,A
       jr NC,PR8X80
       ADD A,#48
       LD E,A
       POP HL
        RET
       IF nastr
SETS
        DW SET1
        DW SET2
        DW SETA
        DW SETB
        DW SETC
        DW SETD
        DW SETE
        DW SETF
        DW SETG
        DW SETH
        DW SETI
        DW SETJ
        DW SETK
        DW SETL
        DW SETM
        DW SETN
        DW SETO

        ;DISPLAY $
SETSlen=$-SETS
       ENDIF
       ;ENT

;GO
;        JP RELOAD

MAX=0x8100;-Konez-#200-svbfsz/256<8
;-(MAX+pakto/8*9)/256<8,fastWR:сожрёт окно
pak9=-MAX;продолж-е LZ данных
fout=-MAX-#200-svbfsz
;первые 2сек.сохраняются в посл.очередь
;чтобы успеть изменить paklen,CRC
;s8=fout
;dirsec=fout+#200
        ;DISPLAY /T,Konez,/T,MAX