flex_nav/fnsort.a80
savelij13 499aa7968d - исправлена проверка запускаемого файла по расширению.
- доки переведены на UTF8 кодировку.
- поправлена CorrBigChar.
2025-06-24 21:36:47 +03:00

702 lines
10 KiB
Plaintext
Raw Permalink Blame History

; LAST UPDATE: 24.06.2025 savelij
;[]----------------------------------------------------------[]
ReadDIR BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG)
IF TREE_REZID
JP NZ,RESIDENT.ReadTree
ELSE
JP NZ,ReadTreeR
ENDIF
GETPORT WINSP.CPU3
PUSH AF
BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG)
LD A,(RAMPAGES.LEFTPANEL)
JR Z,.L1
LD A,(RAMPAGES.RIGHTPANEL)
.L1
SETPORT WINSP.CPU3,,0
PUSH IY
POP HL
LD BC,PANEL.EFL
ADD HL,BC
LD B,PANEL.FILEMASK - PANEL.EFL
.L5 LD (HL),0
INC HL
DJNZ .L5
BIT SORTFLAG.B_FILTER,(IY + PANEL.SORTFLAG)
JR NZ,.L2
LD HL,NORMmask
.L2 LD DE,FILEmask
LD C,MASK_SIZE
LDIR
LD IX,0x0000
LD HL,CPU3
LD (AdrNxtFile),HL
LD B,0x08
SUB A
.L3 LD (HL),A
INC HL
DJNZ .L3
CALL FindFILES
LD E,IXL
LD D,IXH
LD HL,(AdrNxtFile)
LD B,0x08
SUB A
.L4 LD (HL),A
INC HL
DJNZ .L4
POP AF
SETPORT WINSP.CPU3,,0
LD (IY + PANEL.EFL),E ;EQUIP FIL
LD (IY + PANEL.EFH),D
LD A,(IY + PANEL.SORTFLAG)
AND SORTFLAG.MASK
JP NZ,SortDIR
RET
AdrNxtFile DEFW 0x0000
FileAtribut DB DIR.M_Archive + \
DIR.M_Dir + \
DIR.M_System + \
DIR.M_Hidden + \
DIR.M_ReadOnly
NORMmask DEFB "*.*"
DB MASK_SIZE - STRLEN("*.*") DUP 0
FILEmask DB MASK_SIZE DUP 0
FindFILES BIT SORTFLAG.B_FILTER,(IY + PANEL.SORTFLAG)
JR NZ,FindFILESm
LD HL,FILEmask
LD DE,WorkBuffer
LD A,(FileAtribut)
PUSH IY
PUSH IX
PUSH DE
SPDSS DSSF.F_FIRST,0
POP HL
POP IX
POP IY
RET C
FndFILE CALL InsFileInfo
RET C
LD DE,WorkBuffer
PUSH IY
PUSH IX
PUSH DE
SPDSS DSSF.F_NEXT
POP HL
POP IX
POP IY
JR NC,FndFILE
RET
FindFILESm LD HL,NORMmask
LD DE,WorkBuffer
LD A,(FileAtribut)
AND DIR.M_Archive + \
DIR.M_Dir + \
DIR.M_System + \
DIR.M_Hidden + \
DIR.M_ReadOnly
PUSH IY
PUSH IX
PUSH DE
SPDSS DSSF.F_FIRST,0
POP HL
POP IX
POP IY
RET C
FFILEm1 LD A,(WorkBuffer + FFIRST.Attr);+0x20)
AND DIR.M_Dir;0x10
CALL NZ,InsFileInfo
RET C
LD DE,WorkBuffer
PUSH IY
PUSH IX
PUSH DE
SPDSS DSSF.F_NEXT
POP HL
POP IX
POP IY
JR NC,FFILEm1
LD HL,FILEmask
LD DE,WorkBuffer
LD A,(FileAtribut)
AND DIR.M_Archive + \
DIR.M_System + \
DIR.M_Hidden + \
DIR.M_ReadOnly
PUSH IY
PUSH IX
PUSH DE
SPDSS DSSF.F_FIRST,0
POP HL
POP IX
POP IY
RET C
FFILEm2 CALL InsFileInfo
RET C
LD DE,WorkBuffer
PUSH IY
PUSH IX
PUSH DE
SPDSS DSSF.F_NEXT
POP HL
POP IX
POP IY
JR NC,FFILEm2
RET
InsFileInfo EX DE,HL
LD HL,(AdrNxtFile)
LD BC,FileHDR.SIZE
ADD HL,BC
SBC HL,BC
EX DE,HL
RET C
SUB A
LD (DE),A
INC DE
PUSH HL
LD BC,FFIRST.Attr;0x20
ADD HL,BC
LD B,(HL) ; FFIRST.Attr
INC HL
LD A,B
EX AF,AF'
LD A,(HL) ; FFIRST.Name
INC HL
LD C,(HL) ; FFIRST.Name + 1
DEC HL
; <20><EFBFBD><20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5AA><EFBFBD><EFBFBD><EFBFBD>
CP '.'
JR NZ,InsF1
LD A,' '
SUB C
JR NZ,InsF1
; <20><EFBFBD><E0AEAF><EFBFBD> <20><20><><EFBFBD> "."
InsFext POP HL
OR A
RET
InsF1 BIT DIR.B_Dir,B ; <20><><EFBFBD><E0A5AA><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><>?
JR NZ,InsF2
; <20><><EFBFBD><>
OR A
BIT SORTFLAG.B_EXEC,(IY + PANEL.SORTFLAG)
CALL NZ,TestExe
JR C,InsFext
IF CORR_FILENAME
LD B,DIR.Name_Size
.L1 LD A,(HL)
CALL CorrBigChar
LD (DE),A
INC HL
INC DE
DJNZ .L1
LD A,0x01
LD (DE),A
INC DE
LD B,DIR.Ext_Size
.L2 LD A,(HL)
CALL CorrBigChar
LD (DE),A
INC HL
INC DE
DJNZ .L2
JR InsF3
ENDIF ; CORR_FILENAME
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
InsF2 LD BC,DIR.Name_Size
LDIR
LD A,0x01
LD (DE),A
INC DE
LD C,DIR.Ext_Size
LDIR
InsF3 SUB A
LD (DE),A
INC DE
EX AF,AF'
LD (DE),A ; DIR.Attr
INC DE
POP HL
PUSH HL
LD BC,DIR.FileSize
ADD HL,BC
LD C,DIR.FileSize_Size
LDIR
POP HL
PUSH HL
LD C,DIR.WrtDate
ADD HL,BC
LD A,(HL)
AND 0x1F ; <20><>
LD (DE),A
INC DE
LD C,(HL)
INC HL
LD B,(HL)
LD H,B
LD L,C
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD A,H
AND 0x0F ; <20><><EFBFBD><EFBFBD><EFBFBD>
LD (DE),A
INC DE
LD A,B
SRL A
ADD A,80
.L1 SUB 100
JR NC,.L1
ADD A,100 ; <20><><EFBFBD>
LD (DE),A
INC DE
POP HL
LD BC,DIR.WrtTime
ADD HL,BC
LD C,(HL)
INC HL
LD B,(HL)
LD A,B
AND 0xF8
RRA
RRA
RRA
LD (DE),A ; <20><><EFBFBD><EFBFBD>
INC DE
LD H,B
LD L,C
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD A,H
AND 0x3F
LD (DE),A ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INC DE
LD (AdrNxtFile),DE
INC IX
RET
TestExe PUSH HL
LD A,L
ADD A,8
LD L,A
JR NC,.L1
INC H
.L1 LD A,(HL)
INC HL
CP 'E'
JR NZ,TestExe1
LD A,(HL)
INC HL
CP 'X'
JR NZ,TestExe1
LD A,(HL)
CP 'E'
JR NZ,TestExe1
POP HL
OR A
RET
TestExe1 POP HL
PUSH HL
LD A,L
ADD A,8
LD L,A
JR NC,.L1
INC H
.L1 LD A,(HL)
INC HL
CP 'T'
JR NZ,TestExeC
LD A,(HL)
INC HL
CP 'R'
JR NZ,TestExeC
LD A,(HL)
CP 'D'
JR NZ,TestExeC
POP HL
OR A
RET
TestExeC POP HL
SCF
RET
IF CORR_FILENAME
; <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD>४樨 <20><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>
CorrBigChar: CP 'A'
RET C
CP 'Z' + 1
JR NC,.CheckRUS
.Dec: ADD A,0x20
RET
.CheckRUS: CP '<27>'
RET C
CP '<27>'+1
JR C,.Dec
.BGUPPER: CP '<27>'
RET C
CP '<27>' + 1
JR NC,.HGUPPER
ADD A,0x50
RET
.HGUPPER: CP '<27>' ; <20><><EFBFBD><EFBFBD> <20><EFBFBD> <20>, <20><><EFBFBD> #F1
RET NZ
INC A
RET
; <20><><EFBFBD><EFBFBD><E6A5A4><EFBFBD> <20><><EFBFBD>४樨 <20><EFBFBD> <20> <20><><EFBFBD><EFBFBD><20><EFBFBD>
CorrSmallChar CP 'a'
RET C
CP 'z' + 1
JR NC,.CorrCh2
RES 5,A
RET
.CorrCh2 CP 0xA0
RET C
CP 0xB0
JR NC,.CorrCh3
SUB 0x20
RET
.CorrCh3 CP 0xE0
RET C
SUB 0x50
RET
ENDIF ; CORR_FILENAME
;[]----------------------------------------------------------[]
SortDIR
GETPORT WINSP.CPU1
LD C,A
GETPORT WINSP.CPU3
LD B,A
PUSH BC
BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG)
LD A,(RAMPAGES.LEFTPANEL)
JR Z,.L1
LD A,(RAMPAGES.RIGHTPANEL)
.L1
SETPORT WINSP.CPU1,,0
LD A,(RAMPAGES.BuffPg3)
SETPORT WINSP.CPU3,,0
LD HL,CPU3
LD (EndSort),HL
SUB A
LD (HL),A
INC HL
LD (HL),A
LD (BegSort),HL
LD A,(IY + PANEL.SORTFLAG)
RRA
LD HL,SortABC ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><> Name CTRL+F3
JR C,.SortBeg
RRA
LD HL,SortExt ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><> Extension CTRL+F4
JR C,.SortBeg
RRA
LD HL,SortData ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><> Date CTRL+F5
JR C,.SortBeg
LD HL,SortSize ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><> Size CTRL+F6
.SortBeg LD (.Scall1),HL
LD (.Scall2),HL
LD (.Scall3),HL
LD IX,CPU1 + 1
LD HL,CPU1 + 1
; <20><EFBFBD><20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5AA>
BIT DIR.B_Dir,(IX + FileHDR.Attr - 1)
JR Z,.SortStart
; <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A5AA><EFBFBD><EFBFBD><EFBFBD> <20><> <20><EFBFBD><20><> <20><><EFBFBD> ".."
LD A,(HL)
CP '.'
JR NZ,.SortStart
INC HL
LD A,(HL)
DEC HL
CP '.'
JR NZ,.SortStart
; <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> ".."
PUSH HL
CALL 0
.Scall3 EQU $-2
LD BC,FileHDR.SIZE
LD HL,CPU3
ADD HL,BC
LD (EndSort),HL
LD (HL),0
INC HL
LD (HL),0
LD (BegSort),HL
POP HL
ADD IX,BC
ADD HL,BC
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><EFBFBD> <20><>⠫쭮<E2A0AB><ECADAE>
.SortStart PUSH IX
PUSH HL
.SortDIRlp1 LD A,(HL)
OR A
JR Z,.SortDIRnxt
BIT DIR.B_Dir,(IX + FileHDR.Attr - 1)
PUSH HL
CALL NZ,0x0000 ; <20><EFBFBD><20><><EFBFBD> DIR
.Scall1 EQU $-2
POP HL
LD BC,FileHDR.SIZE
ADD IX,BC
ADD HL,BC
JR .SortDIRlp1
.SortDIRnxt LD HL,(EndSort)
SUB A
LD (HL),A
INC HL
LD (HL),A
LD (BegSort),HL
POP HL
POP IX
.SortDIRlp2 LD A,(HL)
OR A
JR Z,.SortDIRext
BIT DIR.B_Dir,(IX + FileHDR.Attr - 1)
PUSH HL
CALL Z,0x0000 ; <20><EFBFBD><20><><EFBFBD><><E4A0A9>
.Scall2 EQU $-2
POP HL
LD BC,FileHDR.SIZE
ADD IX,BC
ADD HL,BC
JR .SortDIRlp2
.SortDIRext LD HL,(EndSort)
LD B,0x08
SUB A
.L3 LD (HL),A
INC HL
DJNZ .L3
GETPORT WINSP.CPU1
LD (RAMPAGES.BuffPg3),A
GETPORT WINSP.CPU3
BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG)
LD HL,RAMPAGES.LEFTPANEL
JR Z,.L2
LD HL,RAMPAGES.RIGHTPANEL
.L2 LD (HL),A
POP BC
LD A,B
SETPORT WINSP.CPU3,,0
LD A,C
SETPORT WINSP.CPU1,,0
RET
BegSort DEFW 0x0000
EndSort DEFW 0x0000
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><> Name CTRL+F3
SortABC EX DE,HL
LD HL,(BegSort)
.Sabc1 LD A,(HL)
OR A
JP Z,SortDIRins
PUSH DE
PUSH HL
LD B,12
.Sabc2 LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.Sabc3
INC DE
INC HL
DJNZ .Sabc2
.Sabc3 POP HL
POP DE
JP C,SortDIRins
LD BC,FileHDR.SIZE
ADD HL,BC
JR .Sabc1
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><> Extension CTRL+F4
SortExt EX DE,HL
LD HL,(BegSort)
.Sext1 LD A,(HL)
OR A
JP Z,SortDIRins
PUSH DE
PUSH HL
LD BC,0x0009
ADD HL,BC
EX DE,HL
ADD HL,BC
EX DE,HL
LD B,03
.Sext2 LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.Sext4
INC DE
INC HL
DJNZ .Sext2
POP HL
POP DE
PUSH DE
PUSH HL
LD B,8
.Sext3 LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.Sext4
INC DE
INC HL
DJNZ .Sext3
.Sext4 POP HL
POP DE
JP C,SortDIRins
LD BC,FileHDR.SIZE
ADD HL,BC
JR .Sext1
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><> Date CTRL+F5
SortData EX DE,HL
LD HL,(BegSort)
.Sdata1 LD A,(HL)
OR A
JP Z,SortDIRins
PUSH DE
PUSH HL
LD BC,0x0014
ADD HL,BC
EX DE,HL
ADD HL,BC
EX DE,HL
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SdataE
DEC DE
DEC HL
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SdataE
DEC DE
DEC HL
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SdataE
INC HL
INC HL
INC HL
INC DE
INC DE
INC DE
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SdataE
INC DE
INC HL
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SdataE
POP HL
POP DE
PUSH DE
PUSH HL
LD B,12
.Sdata2 LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SdataE
INC DE
INC HL
DJNZ .Sdata2
.SdataE POP HL
POP DE
JR C,SortDIRins
LD BC,FileHDR.SIZE
ADD HL,BC
JR .Sdata1
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0AEA2> <20><> Size CTRL+F6
SortSize EX DE,HL
LD HL,(BegSort)
.Ssize1 LD A,(HL)
OR A
JR Z,SortDIRins
PUSH DE
PUSH HL
LD BC,0x0011
ADD HL,BC
EX DE,HL
ADD HL,BC
EX DE,HL
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SsizeE
DEC DE
DEC HL
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SsizeE
DEC DE
DEC HL
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SsizeE
DEC DE
DEC HL
LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SsizeE
POP HL
POP DE
PUSH DE
PUSH HL
LD B,12
.Ssize2 LD A,(DE) ;(DE) < (HL) "C"
CP (HL) ;(DE) >= (HL) "NC"
JR NZ,.SsizeE
INC DE
INC HL
DJNZ .Ssize2
.SsizeE POP HL
POP DE
JR C,SortDIRins
LD BC,FileHDR.SIZE
ADD HL,BC
JR .Ssize1
SortDIRins DEC HL
DEC DE
PUSH DE
PUSH HL
EX DE,HL
LD HL,(EndSort)
PUSH HL
OR A
SBC HL,DE
LD B,H
LD C,L
POP DE
LD HL,FileHDR.SIZE
ADD HL,DE
LD (EndSort),HL
SUB A
LD (HL),A
INC HL
LD (HL),A
DEC HL
EX DE,HL
LD A,B
OR C
CALL NZ,MoveBytesUp
POP DE
POP HL
LD BC,FileHDR.SIZE
LDIR
RET