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