flex_nav/rez3_fnmark.a80
savelij13 881739653b CDplayer.flx 1.1:
- плагин доделан, описание/history в cdplayer.txt рядом с плагином.
FE 1.09
- исправлено: при выходе из редактора с несохраненным файлом и запросе на сохранение
  клавиша Enter теперь работает как подтверждение сохранения.
FN 1.16
- встроенный editor переехал в плагин откуда и запускается по F4, из FN удален.
- встроенный viewer переехал в плагин откуда и запускается по F3, из FN удален.
- встроенный help переехал в плагин откуда и запускается при нажатии F1, из FN удален.
- загрузка плагина отделена от запуска, теперь можно запускать плагины не
  только из панели FN.
- добавлен макрос формирования заголовка для плагинов.
- добавлена поддержка работы плагинов в адреса 0x4000-0x7FFF (окно 1) в дополнение
  к старым 0xC000-0xBFFF (окно 3), пока используется в плагине cdplayer.
- в окнах с ошибкой переделан на 2 типа окон вместо многих под каждую ошибку.
- исправлена потеря цвета при печати текста по указанному адресу.
- текстовым файлам вернул кодировку CP866, readme.md оставлен в кодировке UTF8.
2025-07-25 16:01:19 +03:00

1093 lines
22 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; LAST UPDATE: 25.07.2025 savelij
;[]==========================================================[]
MarkFileR LD A,(IY+PANEL.FILES_ALL)
OR (IY+PANEL.FILES_ALL + 1)
RET Z
BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG)
RET NZ
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
LD L,(IY+PANEL.FIRST_FILE)
LD H,(IY+PANEL.FIRST_FILE + 1)
LD E,(IY+PANEL.CURR_FILE)
LD D,(IY+PANEL.CURR_FILE + 1)
ADD HL,DE
ADD HL,HL ; *2
ADD HL,HL ; *4
ADD HL,HL ; *8
LD E,L
LD D,H
ADD HL,HL ; *16
ADD HL,DE ; *18
SET 6,H
SET 7,H ; | 0xC000
LD E,(HL) ; FileHDR.Flag
POP AF
SETPORT WINSP.CPU3,,0
BIT FileHDR.B_MARK,E
PUSH AF
CALL Z,SelectFile
POP AF
CALL NZ,UnSelectFile
CALL CursDown
CALL PrnFileInfo
LD B,0x07
.L2 PUSH BC
SPMOUSE MOUSEF.READ_STATE
POP BC
BIT 1,A
RET Z
HALT
DJNZ .L2
RET
;[]==========================================================[]
SelectFile: LD IXL,0x01
JR UnSelectFile.L1
UnSelectFile: LD IXL,0x00
.L1
GETPORT WINSP.CPU3
PUSH AF
BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG)
LD A,(RAMPAGES.LEFTPANEL)
JR Z,.L2
LD A,(RAMPAGES.RIGHTPANEL)
.L2
SETPORT WINSP.CPU3,,0
SETPORT WINSP.Y_PORT,0xC0
LD L,(IY+PANEL.FIRST_FILE)
LD H,(IY+PANEL.FIRST_FILE + 1)
LD E,(IY+PANEL.CURR_FILE)
LD D,(IY+PANEL.CURR_FILE + 1)
ADD HL,DE
ADD HL,HL ; *2
ADD HL,HL ; *4
ADD HL,HL ; *8
LD E,L
LD D,H
ADD HL,HL ; *16
ADD HL,DE ; *18 - FileHDR.SIZE
SET 6,H
SET 7,H ; | 0xC000
PUSH HL
LD DE,FileHDR.Attr
ADD HL,DE
LD C,(HL) ; FileHDR.Attr (ä« £¨ ®¯¨á â¥«ï FAT ä ©« )
POP HL
BIT DIR.B_Dir,C ; íâ® ¤¨à ?
IF MARK_DIR
CALL NZ,COUNTING_DIR ; ¨§¬¥à¥­¨¥ à §¬¥à  ¤¨àë
ELSE
JR NZ,.MrFile1 ; ¤¨à¥ª®à¨¨ ª®¯¨à®¢ âì ­¥ 㬥¥¬, ⮫쪮 ä ©«ë
ENDIF
; íâ® ä ©«
LD B,(HL) ; áâ à®¥ á®áâ®ï­¨¥ ¯®¬¥âª¨ ä ©« 
LD A,IXL
LD (HL),A ; ­®¢®¥ á®áâ®ï­¨¥ ¯®¬¥âª¨ ä ©« 
LD A,C
LD DE,WorkBuffer
PUSH BC
LD BC,FileHDR.SIZE
LDIR
BIT DIR.B_Dir,A ; ä ©« ¨«¨ ¤¨à 
JR Z,.L8
IF MARK_DIR
; ª®¯¨à㥬 à §¬¥à ¢ ¡ ©â å ¨§ à §¬¥à  ¤¨àë
LD HL,COUNTING_DIR.FILES_SIZE
LD DE,WorkBuffer + FileHDR.SizeBytes
LD BC,DWORD
LDIR
ENDIF
.L8 POP BC
.MrFile1 POP AF
SETPORT WINSP.CPU3,,0
IF MARK_DIR = 0
BIT DIR.B_Dir,C
RET NZ ; ¢ë室 ¥á«¨ ¤¨à 
ENDIF
LD A,B
CP IXL
RET Z ; ¢ë室 ¥á«¨ áâ à®¥ ¨ ­®¢®¥ á®áâ®ï­¨¥ ¯®¬¥âª¨ ᮢ¯ «¨
BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG)
JR NZ,.MarkFull
; ¯à¨ ªà âª®¬ ¯®ª §¥ ä ©«®¢
LD L,(IY+PANEL.CURR_FILE)
LD H,(IY+PANEL.CURR_FILE + 1)
LD E,L
LD D,H
ADD HL,HL
ADD HL,DE
BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG)
LD DE,PositTABLeft
JR Z,.L3
LD DE,PositTABRight
.L3 ADD HL,DE
LD E,(HL)
INC HL
LD D,(HL)
INC HL
LD C,(HL)
LD B,0x00
EX DE,HL
LD A,IXL
OR A
PUSH AF
LD DE,(COLORP.INVERTPAPER + COLORI.INVERTINK) << 8 | (COLORP.INVERTPAPER + COLORI.INVSELFILES)
JR NZ,.L4
LD DE,(COLORP.INVERTPAPER + COLORI.INVSELFILES) << 8 | (COLORP.INVERTPAPER + COLORI.INVERTINK)
.L4 LD IX,8 << 8 + 48
DEC HL
DEC HL
CALL InvertRectan
POP AF
JR NZ,.MarkExit1
JR .MarkExit2
; ¯à¨ ¯®«­®¬ ¯®ª §¥ ä ©«®¢
.MarkFull LD L,(IY+PANEL.CURR_FILE)
LD H,(IY+PANEL.CURR_FILE + 1)
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD BC,0x003F
ADD HL,BC
LD C,L
BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG)
LD HL,6
JR Z,.L5
LD HL,326
.L5 LD A,IXL
OR A
PUSH AF
LD DE,(COLORP.INVERTPAPER + COLORI.INVERTINK) << 8 | (COLORP.INVERTPAPER + COLORI.INVSELFILES)
JR NZ,.L6
LD DE,(COLORP.INVERTPAPER + COLORI.INVSELFILES) << 8 | (COLORP.INVERTPAPER + COLORI.INVERTINK)
.L6 LD IX,8 << 8 + 146
CALL InvertRectan
POP AF
JR Z,.MarkExit2
; ãáâ ­®¢ª  ¢ë¡®à ä ©« 
.MarkExit1 LD IX,WorkBuffer
LD L,(IY + PANEL.FILES_MARK)
LD H,(IY + PANEL.FILES_MARK + 1)
INC HL
LD (IY + PANEL.FILES_MARK),L
LD (IY + PANEL.FILES_MARK + 1),H ; ®¡­®¢«¥­¨¥ ª®«¨ç¥á⢠ ¯®¬¥ç¥­­ëå ä ©«®¢
LD L,(IX + FileHDR.SizeBytes)
LD H,(IX + FileHDR.SizeBytes + 1)
LD E,(IY + PANEL.BYTES_MARK)
LD D,(IY + PANEL.BYTES_MARK + 1)
XOR A ; [ ] fat32
ADD HL,DE
LD (IY + PANEL.BYTES_MARK),L
LD (IY + PANEL.BYTES_MARK + 1),H ; ®¡­®¢«¥­¨¥ à §¬¥à  ¯®¬¥ç¥­­ëå ä ©«®¢ ¡¨âë 15-0
LD L,(IX + FileHDR.SizeBytes + 2)
LD H,(IX + FileHDR.SizeBytes + 3)
; [ ] fat32
LD E,(IY + PANEL.BYTES_MARK + 2)
LD D,(IY + PANEL.BYTES_MARK + 3)
ADC HL,DE
; [ ] fat32
ADC A,(IY + PANEL.BYTES_MARK_H)
LD (IY + PANEL.BYTES_MARK_H),A ; ®¡­®¢«¥­¨¥ à §¬¥à  ¯®¬¥ç¥­­ëå ä ©«®¢ ¡¨âë 32-39
LD (IY + PANEL.BYTES_MARK + 2),L
LD (IY + PANEL.BYTES_MARK + 3),H ; ®¡­®¢«¥­¨¥ à §¬¥à  ¯®¬¥ç¥­­ëå ä ©«®¢ ¡¨âë 31-15
RET
; á­ï⨥ ¢ë¡®à  ä ©« 
.MarkExit2 LD IX,WorkBuffer
LD L,(IY + PANEL.FILES_MARK)
LD H,(IY + PANEL.FILES_MARK + 1)
DEC HL
LD (IY + PANEL.FILES_MARK),L
LD (IY + PANEL.FILES_MARK + 1),H
LD L,(IY + PANEL.BYTES_MARK)
LD H,(IY + PANEL.BYTES_MARK + 1)
LD E,(IX + FileHDR.SizeBytes)
LD D,(IX + FileHDR.SizeBytes + 1)
XOR A
SBC HL,DE
LD (IY + PANEL.BYTES_MARK),L
LD (IY + PANEL.BYTES_MARK + 1),H
LD L,(IY + PANEL.BYTES_MARK + 2)
LD H,(IY + PANEL.BYTES_MARK + 3)
LD E,(IX + FileHDR.SizeBytes + 2)
LD D,(IX + FileHDR.SizeBytes + 3)
SBC HL,DE
; [ ] fat32
ADC A,(IY + PANEL.BYTES_MARK_H)
LD (IY + PANEL.BYTES_MARK_H),A
LD (IY + PANEL.BYTES_MARK + 2),L
LD (IY + PANEL.BYTES_MARK + 3),H
RET
;[]==========================================================[]
UnMarkGroupR: CALL ResInvert
UnMarkGroupRN: LD HL,SetInvert
PUSH HL
SUB A
JR SelectGroup
MarkGroupR: CALL ResInvert
MarkGroupRN: LD HL,SetInvert
PUSH HL
LD A,0x01
SelectGroup: LD (SelMode),A
LD A,(IY+PANEL.FILES_ALL)
OR (IY+PANEL.FILES_ALL + 1)
RET Z
BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG)
RET NZ
MAKEWINDOW WINSUBOBJ.STORE
W_MAIN 208,81,224,62
W_FILL 4,2,216,10,COLORI.BLACK
W_TEXT 82,3,COLORI.WHITE,"Select mask"
W_BUTTON 32,42,72,14
W_TEXT 60,45,COLORP.HIGHGRAY,"Ok"
W_BUTTON 120,42,72,14
W_TEXT 140,45,COLORP.HIGHGRAY,"Cancel"
W_TEXT 10,25,COLORP.HIGHGRAY,"Mark mask:"
W_BORDER 70,22,134,12
W_FILL 72,23,130,10,COLORI.WHITE
W_END
LD IX,SMaskStr
LD HL,SMaskTab
CALL InputLine
WINDOWCLOSE
RET C
LD A,(MaskLen)
OR A
RET Z
LD B,A
LD HL,CrSMask
CorMask
IF CORR_FILENAME
LD A,(HL)
CALL CorrBigChar
LD (HL),A
ENDIF
INC HL
DJNZ CorMask
LD HL,CrSMask
LD DE,SelMask
CALL MakeMask
JR C,MarkGNext
LD HL,NORMmask
LD DE,CrSMask
LD BC,MASK_SIZE
LDIR
LD HL,CrSMask
LD DE,SelMask
JP MakeMask
MarkGNext
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
;!FIXIT ¯à®¢¥à¨âì ¤«ï íâ® ®­® ¨«¨ ­¥â SAFE_PORTY
SETPORT WINSP.Y_PORT,0xC0
LD IX,CPU3
LD HL,0xC000
LD DE,SelMask
EX AF,AF' ; [ ] fat32
EXX
LD L,(IY+PANEL.BYTES_MARK)
LD H,(IY+PANEL.BYTES_MARK + 1)
LD E,(IY+PANEL.BYTES_MARK + 2)
LD D,(IY+PANEL.BYTES_MARK + 3)
LD A,(IY+PANEL.BYTES_MARK_H) ; [ ] FAT32
LD C,(IY+PANEL.FILES_MARK)
LD B,(IY+PANEL.FILES_MARK + 1)
EXX
EX AF,AF' ; [ ] fat32
PUSH IY
LD IYL,0x00
SelMode EQU $-1
LD IYH,0x00
Select1 PUSH DE
BIT DIR.B_Dir,(IX + FileHDR.Attr)
JR NZ,Select8
LD A,IYL
CP (HL)
JR Z,Select8
PUSH HL
INC HL
LD B,8
Select2 LD A,(DE)
CP '?'
JR Z,Select3
CP (HL)
JR NZ,Select6
Select3 INC HL
INC DE
DJNZ Select2
INC HL
LD B,03
Select4 LD A,(DE)
CP '?'
JR Z,Select5
CP (HL)
JR NZ,Select6
Select5 INC HL
INC DE
DJNZ Select4
Select6 POP HL
JR NZ,Select8
LD IYH,0x01
LD A,IYL
LD (HL),A
OR A
CALL Z,SUB_SIZE
CALL NZ,ADD_SIZE
Select8: LD DE,FileHDR.SIZE
ADD HL,DE
ADD IX,DE
POP DE
LD A,(IX + FileHDR.Name)
OR A
JR NZ,Select1
LD A,IYH
EX AF,AF'
POP IY
EXX
LD (IY+PANEL.BYTES_MARK),L
LD (IY+PANEL.BYTES_MARK + 1),H
LD (IY+PANEL.BYTES_MARK + 2),E
LD (IY+PANEL.BYTES_MARK + 3),D
LD (IY+PANEL.BYTES_MARK_H),A ; [ ] FAT32
LD (IY+PANEL.FILES_MARK),C
LD (IY+PANEL.FILES_MARK + 1),B
EXX
POP AF
SETPORT WINSP.CPU3,,0
EX AF,AF'
OR A
RET Z
CALL PrintDIR
JP PrnFileInfo
SMaskStr: DEFB 0x0C,0x00,0x00,0x00
MaskLen: DEFB 0x03
DEFW 282,106
DEFW 104
DEFB 0xF0
CrSMask: DEFB "*.*"
DB 10 DUP 0
SelMask: DEFB "???????????"
MakeMask LD BC,0x0902
SMaskLp LD A,(HL)
CP '!'
RET C
CP '\"'
RET Z
CP '*'
JR Z,SMask1
CP '+'
RET Z
CP ','
RET Z
CP '.'
JR Z,SMask2
CP '/'
RET Z
CP ':'
RET Z
CP ';'
RET Z
CP '<'
RET Z
CP '='
RET Z
CP '>'
RET Z
CP '['
RET Z
CP '\\'
RET Z
CP ']'
RET Z
CP '|'
RET Z
IF CORR_FILENAME
CALL CorrBigChar
ENDIF
LD (DE),A
INC HL
INC DE
DJNZ SMaskLp
AND A
RET
SMask1 LD A,'?'
INC HL
DJNZ SMask11
AND A
RET
SMask11 LD (DE),A
INC DE
DJNZ SMask11
INC B
JR SMaskLp
SMask2 LD A,' '
INC HL
DJNZ SMask21
LD B,0x04
DEC C
JR NZ,SMaskLp
AND A
RET
SMask21 LD (DE),A
INC DE
DJNZ SMask21
LD B,0x04
DEC C
JR NZ,SMaskLp
AND A
RET
;[]==========================================================[]
SelectAllR: CALL ResInvert
SelectAllRN: LD HL,SetInvert
PUSH HL
LD A,(IY+PANEL.FILES_ALL)
OR (IY+PANEL.FILES_ALL + 1)
RET Z
BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG)
RET NZ
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
SETPORT WINSP.Y_PORT,0xC0
LD IX,CPU3
LD BC,FileHDR.SIZE
EX AF,AF' ; [ ] fat32
SUB A
LD L,A
LD H,L
LD E,L
LD D,H
EXX
LD L,A
LD H,L
EXX
EX AF,AF' ; [ ] fat32
.loop: BIT DIR.B_Dir,(IX + FileHDR.Attr) ;!HARDCODE DIRECTORY
JR NZ,.SelAll1
SET FileHDR.B_MARK,(IX + FileHDR.Flag)
LD C,(IX + FileHDR.SizeBytes)
LD B,(IX + FileHDR.SizeBytes + 1)
EX AF,AF' ; [ ] fat32
ADD HL,BC
LD C,(IX + FileHDR.SizeBytes + 2)
LD B,(IX + FileHDR.SizeBytes + 3)
EX DE,HL
ADC HL,BC
EX DE,HL
ADC A,0
EX AF,AF' ; [ ] fat32
EXX
INC HL
EXX
LD BC,FileHDR.SIZE
.SelAll1: ADD IX,BC
LD A,(IX + FileHDR.Name)
OR A
JR NZ,.loop
POP AF
SETPORT WINSP.CPU3,,0
EXX
LD E,(IY+PANEL.FILES_MARK)
LD D,(IY+PANEL.FILES_MARK + 1)
OR A
SBC HL,DE
RET Z
ADD HL,DE
LD (IY+PANEL.FILES_MARK),L
LD (IY+PANEL.FILES_MARK + 1),H
EXX
LD (IY+PANEL.BYTES_MARK),L
LD (IY+PANEL.BYTES_MARK + 1),H
LD (IY+PANEL.BYTES_MARK + 2),E
LD (IY+PANEL.BYTES_MARK + 3),D
; [ ] FAT32
EX AF,AF'
LD (IY+PANEL.BYTES_MARK_H),A
CALL PrintDIR
JP PrnFileInfo
;[]==========================================================[]
UnSelectAllR: CALL ResInvert
UnSelectAllRN: LD HL,SetInvert
PUSH HL
LD A,(IY+PANEL.FILES_ALL)
OR (IY+PANEL.FILES_ALL + 1)
RET Z
BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG)
RET NZ
LD A,(IY+PANEL.FILES_MARK)
OR (IY+PANEL.FILES_MARK + 1)
RET Z
PUSH IY
POP HL
LD BC,PANEL.FILES_MARK
ADD HL,BC
LD B,PANEL.FILE_MASK - PANEL.FILES_MARK
.L2 LD (HL),0
INC HL
DJNZ .L2
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
SETPORT WINSP.Y_PORT,0xC0
LD HL,CPU3
LD BC,FileHDR.SIZE + 1
UnSelA1: RES 0,(HL)
ADD HL,BC
LD A,(HL)
DEC HL
OR A
JR NZ,UnSelA1
POP AF
SETPORT WINSP.CPU3,,0
CALL PrintDIR
JP PrnFileInfo
;[]==========================================================[]
InvertSelectR: CALL ResInvert
InvertSelectRN: LD HL,SetInvert
PUSH HL
LD A,(IY+PANEL.FILES_ALL)
OR (IY+PANEL.FILES_ALL + 1)
RET Z
BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG)
RET NZ
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
SETPORT WINSP.Y_PORT,0xC0
LD IX,0xC000
LD DE,FileHDR.SIZE
LD B,0x00
EX AF,AF' ; [ ] fat32
EXX
LD L,(IY + PANEL.BYTES_MARK)
LD H,(IY + PANEL.BYTES_MARK + 1)
LD E,(IY + PANEL.BYTES_MARK + 2)
LD D,(IY + PANEL.BYTES_MARK + 3)
LD A,(IY + PANEL.BYTES_MARK_H) ; [ ] FAT32
LD C,(IY + PANEL.FILES_MARK)
LD B,(IY + PANEL.FILES_MARK + 1)
EXX
EX AF,AF' ; [ ] fat32
.loop: BIT DIR.B_Dir,(IX + FileHDR.Attr) ;!HARDCODE Dir
JR NZ,.InvSel3
LD B,FileHDR.M_MARK
LD A,(IX + FileHDR.Flag)
XOR B
LD (IX + FileHDR.Flag),A
CALL Z,SUB_SIZE
CALL NZ,ADD_SIZE
.InvSel3: ADD IX,DE
LD A,(IX + FileHDR.Name)
OR A
JR NZ,.loop
POP AF
SETPORT WINSP.CPU3,,0
EX AF,AF' ; [ ] fat32
EXX
LD (IY + PANEL.BYTES_MARK),L
LD (IY + PANEL.BYTES_MARK + 1),H
LD (IY + PANEL.BYTES_MARK + 2),E
LD (IY + PANEL.BYTES_MARK + 3),D
LD (IY + PANEL.BYTES_MARK_H),A ; [ ] FAT32
LD (IY + PANEL.FILES_MARK),C
LD (IY + PANEL.FILES_MARK + 1),B
EXX
LD A,B
OR A
RET Z
CALL PrintDIR
JP PrnFileInfo
ADD_SIZE: EX AF,AF' ; [ ] fat32
EXX
PUSH BC
LD C,(IX + FileHDR.SizeBytes)
LD B,(IX + FileHDR.SizeBytes + 1)
ADD HL,BC
LD C,(IX + FileHDR.SizeBytes + 2)
LD B,(IX + FileHDR.SizeBytes + 3)
EX DE,HL
ADC HL,BC
EX DE,HL
ADC A,0 ; [ ] fat32
POP BC
INC BC
EXX
EX AF,AF' ; [ ] fat32
RET
SUB_SIZE: EX AF,AF' ; [ ] fat32
EXX
PUSH BC
LD C,(IX + FileHDR.SizeBytes)
LD B,(IX + FileHDR.SizeBytes + 1)
OR A
SBC HL,BC
LD C,(IX + FileHDR.SizeBytes + 2)
LD B,(IX + FileHDR.SizeBytes + 3)
EX DE,HL
SBC HL,BC
EX DE,HL
SBC A,0 ; [ ] fat32
POP BC
DEC BC
EXX
EX AF,AF'
RET
IF MARK_DIR
; ¯®¤áç¥â ¢ ¡ ©â å à §¬¥à  ®â¬¥ç¥­­®© ¤¨à¥ªâ®à¨¨
; HL -  ¤à¥á ®¯¨á â¥«ï ¤¨àë ¢ áâà ­¨æ¥ ¯ ­¥«¨ ª®â®àãî ¬¥àïâì
COUNTING_DIR
.OLDPATH EQU WorkBuffer + 0x300 ; á®åà ­¥­­ë© ⥪ã騩 ¯ãâì
.CURRPATH EQU WorkBuffer + 0x200 ; ¢à¥¬¥­­®© ⥪ã騩 ¯ãâì
PUSH IX
PUSH IY
PUSH HL
PUSH BC
GETPORT WINSP.CPU3
PUSH AF
PUSH HL
BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG)
LD A,(RAMPAGES.LEFTPANEL)
JR Z,.L1
LD A,(RAMPAGES.RIGHTPANEL)
.L1 ; ¢ª«îç ¥¬ ¯ £ã á ¤¨à¥ªâ®à¨¥© ⥪ã饩 ¯ ­¥«¨
SETPORT WINSP.CPU3,,0
XOR A
LD H,A
LD L,A
LD IXH,A ; ®¡­ã«¥­¨¥ ã஢­ï ¢å®¦¤¥­¨ï ¢ ¤¨àë
LD (.FILES_SIZE),HL
LD (.FILES_SIZE + 2),HL ; ®¡­ã«¥­¨¥ à §¬¥à  ¤¨àë
LD HL,CPU3
LD (.CURR_DIRNAME),HL
; á®åà ­¥­¨¥ ⥪ã饣® ¯ã⨠¤«ï ¢®§¢à â 
SPDSS DSSF.CURDISK
LD HL,.OLDPATH ; á®åà ­¥­ë© ¯ãâì ¤«ï ¢®§¢à â 
ADD A,'A'
LD (HL),A
INC HL
LD (HL),':'
INC HL
SPDSS DSSF.CURDIR
POP DE
JP C,.END_COUNT
; ¢å®¤ ¢ ¤¨à¥ªâ®à¨î
LD HL,FileHDR.Name
ADD HL,DE
LD DE,.DIR_NAME
PUSH DE
LD BC,FileHDR.Name_Size
LDIR ; § ¡à «¨ ¨¬ï ¤¨àë ¤«ï ¨§¬¥à¥­¨ï
LD A,(RAMPAGES.FLX)
SETPORT WINSP.CPU3,,0
CALL .ADD_2DOT ; ¢®§¢à â ¢ ¯à¥¤ë¤ãéãî ¤¨àã
POP HL
LD DE,(.CURR_DIRNAME)
LD BC,FileHDR.Name_Size
LDIR ; ¨¬ï ¤¨àë ¤«ï ¢å®¤ 
LD (.CURR_DIRNAME),DE
XOR A
LD (DE),A
CALL .SET_PATH ; ãáâ ­®¢ª  ⥪ã饣® ¯ãâ¨
INC IXH ; á«¥¤ãî騩 ã஢¥­ì ¤¨àë
.CONTINUE CALL .ADD_2DOT
CALL .COUNT_FILES
LD A,IXL
AND A ; §¤¥áì ¤¨àë ¥áâì?
JR Z,.PREV_DIR ; ¤¨àë ­¥ ­ ©¤¥­ë
CALL .SET_PATH ; ¢å®¤ ¢ ¤¨àã ¨§ ᯨ᪠
INC IXH ; á«¥¤ãî騩 ã஢¥­ì ¤¨àë
JR .CONTINUE
; ¢ë室 ¢ ¯à¥¤ë¤ãéãî ¤¨àã
.PREV_DIR CALL .OUT_DIR
LD A,IXH ; ã஢¥­ì ¤¨àë?
AND A
JR Z,.END_COUNT
CALL .GET_NAME
CALL .GET_NAME
LD HL,(.CURR_DIRNAME)
LD DE,-FileHDR.Name_Size
ADD HL,DE
LD A,(HL)
CP '.'
JR Z,.PREV_DIR
CALL .SET_PATH
INC IXH ; á«¥¤ãî騩 ã஢¥­ì ¤¨àë
JR .CONTINUE
; ¢®§¢à â ⥪ã饣® ¯ãâ¨
.END_COUNT POP AF
SETPORT WINSP.CPU3,,0
LD HL,.OLDPATH ; á®åà ­¥­ë© ¯ãâì ¤«ï ¢®§¢à â 
SPDSS DSSF.CHDIR
POP BC
POP HL
POP IY
POP IX
RET
.GET_NAME LD HL,(.CURR_DIRNAME)
LD (HL),0
LD DE,-FileHDR.Name_Size
ADD HL,DE
LD (.CURR_DIRNAME),HL
RET
.OUT_DIR DEC IXH ; ¯à¥¤ë¤ã騩 ã஢¥­ì ¤¨àë
LD HL,.RET_DIR
JR .SP1
; ¯¥à¥å®¤ ¢ ¤¨àã ¨§ ᯨ᪠
.SET_PATH LD HL,(.CURR_DIRNAME)
LD DE,-FileHDR.Name_Size
ADD HL,DE
LD DE,.DIR_NAME
PUSH DE
LD BC,FFIRST.Name_Size
LDIR
POP HL
.SP1 PUSH IX
SPDSS DSSF.CHDIR
SPDSS DSSF.CURDISK
LD HL,.CURRPATH
ADD A,'A'
LD (HL),A
INC HL
LD (HL),':'
INC HL
SPDSS DSSF.CURDIR
POP IX
RET
; ¤®¡ ¢«¥­¨¥ ¨¬¥­¨ ¤¨àë ¤«ï ¢ë室  ¢ ¯à¥¤ë¤ãéãî ¤¨àã
.ADD_2DOT PUSH HL
LD HL,.RET_DIR
LD DE,(.CURR_DIRNAME)
LD BC,FFIRST.Name_Size
LDIR
LD (.CURR_DIRNAME),DE
POP HL
RET
; ¯¥à¥áç¨â뢠¥¬ à §¬¥àë ä ©«®¢ ¢ ⥪ã饩 ¤¨à¥ªâ®à¨¨
; ¨ ¢ë£à¥¡ ¥¬ ¨¬¥­  ¤¨à ¢ â ¡«¨çªã
.COUNT_FILES LD IXL,0 ; ª®«¨ç¥á⢮ ¤¨à ¢ ⥪ã饩 ¤¨à¥
CALL .F_FIRST ; ¨é¥¬ ¯¥à¢ë© ®¯¨á â¥«ì
RET C
.L2 LD DE,FFIRST.Attr
ADD HL,DE
LD A,(HL)
SBC HL,DE
BIT DIR.B_Dir,A
JR Z,.L4
; ¤«ï ¤¨àë ª®¯¨à㥬 ¨¬ï ¢ â ¡«¨çªã
LD DE,FFIRST.Name
ADD HL,DE
LD A,(HL)
CP '.' ; . ¨ .. ¯à®¯ã᪠¥¬
JR Z,.L5
LD DE,(.CURR_DIRNAME)
LD BC,FFIRST.Name_Size
LDIR
LD (.CURR_DIRNAME),DE
INC IXL
JR .L5
; ¤«ï ä ©«  ¤®¡ ¢«ï¥¬ ¤«¨­ã
.L4 LD DE,FFIRST.FileSize
ADD HL,DE
CALL GET_DWORD ; ¢§ïâì à §¬¥à ¨§ ®¯¨á â¥«ï
LD HL,.FILES_SIZE
PUSH HL
CALL BCDEHLP ; ¤®¡ ¢¨«¨ ª ⥪ã饬ã à §¬¥àã
POP HL
CALL SET_DWORD ; ¯®«®¦¨«¨ ®¡à â­®
.L5 CALL .F_NEXT
JR NC,.L2
RET
; ¯®¨áª ¯¥à¢®£® ®¯¨á â¥«ï
.F_FIRST LD A, DIR.M_Archive + \
DIR.M_System + \
DIR.M_Hidden + \
DIR.M_ReadOnly + \
DIR.M_Dir
.FFF1 LD HL,.FILES_MASK
LD DE,.OLDPATH
PUSH DE
PUSH IX
SPDSS DSSF.F_FIRST,0
POP IX
POP HL
RET
; ¯®¨áª á«¥¤ãî饣® ®¯¨á â¥«ï
.F_NEXT LD DE,.OLDPATH
PUSH DE
PUSH IX
SPDSS DSSF.F_NEXT
POP IX
POP HL
RET
.FILES_SIZE DD 0
.FILES_MASK DZ "*.*"
.RET_DIR DZ ".. "
.DIR_NAME DZ " "
.CURR_DIRNAME DW 0
; ¯®¤áç¥â à §¬¥à  ¤¨à¥ªâ®à¨¨
; <20>  ¢å®¤¥:
; HL -  ¤à¥á ®¯¨á â¥«ï ¤¨àë ¢ áâà ­¨æ¥ ¯ ­¥«¨ ª®â®àãî ¬¥àïâì
; <20>  ¢ë室¥:
; BCDE' - à §¬¥à ¢ ¡ ©â å
GetDirSizeR CALL COUNTING_DIR
LD HL,COUNTING_DIR.FILES_SIZE
CALL GET_DWORD
EXX
RET
; á®§¤ ­¨¥ ¯ ¯®ª ­  ¯à¨¥¬­¨ª¥
; HL -  ¤à¥á ®¯¨á â¥«ï ¤¨àë ¢ áâà ­¨æ¥ ¯ ­¥«¨ ª®â®àãî ª®¯¨à®¢ âì
MkdirsDstR
.OLDPATH EQU WorkBuffer + 0x300 ; á®åà ­¥­­ë© ⥪ã騩 ¯ãâì
.CURRPATHSRC EQU WorkBuffer + 0x200 ; ¢à¥¬¥­­®© ⥪ã騩 ¯ãâì ¨áâ®ç­¨ª 
.CURRPATHDST EQU WorkBuffer + 0x100 ; ¢à¥¬¥­­®© ⥪ã騩 ¯ãâì ¯à¨¥¬­¨ª 
.FINDBUF EQU WorkBuffer
PUSH IX
PUSH IY
GETPORT WINSP.CPU3
PUSH AF
LD (.OLDSP),SP
PUSH HL
BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG)
LD DE,RightPanel ; ¤«ï ¯ã⨠ªã¤  ª®¯¨à®¢ âì
LD A,(RAMPAGES.LEFTPANEL) ; ¨§ ª ª®© áâà ­¨æë ¯ ­¥«¨ ¡à âì ¯ãâì
JR Z,.L1
LD DE,LeftPanel ; ¤«ï ¯ã⨠ªã¤  ª®¯¨à®¢ âì
LD A,(RAMPAGES.RIGHTPANEL) ; ¨§ ª ª®© áâà ­¨æë ¯ ­¥«¨ ¡à âì ¯ãâì
.L1 ; ¢ª«îç ¥¬ ¯ £ã á ¤¨à¥ªâ®à¨¥© ⥪ã饩 ¯ ­¥«¨
SETPORT WINSP.CPU3,,0
LD HL,PANEL.CURR_PATH
ADD HL,DE ; ®âªã¤  ¯ãâì ¯à¨¥¬­¨ª  ¢§ïâì
LD DE,.CURRPATHDST ; ¡ãä¥à ¯ã⨠¯à¨¥¬­¨ª 
CALL .COPYNAME2PATH
LD (.ENDPATHDST),DE ;  ¤à¥á 墮áâ  ¯ã⨠¯à¨¥¬­¨ª 
; á®åà ­¥­¨¥ ⥪ã饣® ¯ã⨠¤«ï ¢®§¢à â 
SPDSS DSSF.CURDISK
LD HL,.OLDPATH ; á®åà ­¥­­ë© ¯ãâì ¤«ï ¢®§¢à â 
ADD A,'A'
LD (HL),A
INC HL
LD (HL),':'
INC HL
SPDSS DSSF.CURDIR
POP DE ;  ¤à¥á ®¯¨á â¥«ï ¤¨àë ¢ áâà ­¨æ¥ ¯ ­¥«¨ ª®â®àãî ª®¯¨à®¢ âì
; JP C,ERROR ;COUNTING_DIR.END_COUNT
; ª®¯¨à®¢ ­¨¥ ¨¬¥­¨ ¤¨à¥ªâ®à¨¨ ¤«ï ª®¯¨à®¢ ­¨ï
LD HL,FileHDR.Name
ADD HL,DE
LD DE,COUNTING_DIR.DIR_NAME
LD BC,FileHDR.Name_Size
LDIR ; § ¡à «¨ ¨¬ï ¤¨àë ¤«ï ª®¯¨à®¢ ­¨ï
EX DE,HL
CALL .CUTOFFSPACES ; ®âá¥ç¥­¨¥ ¯à®¡¥«®¢
; ¯¥à¥­®á ⥪ã饣® ¯ã⨠¨áâ®ç­¨ª 
LD HL,.OLDPATH
LD DE,.CURRPATHSRC
CALL .COPYNAME2PATH ; ᪮¯¨à®¢ «¨ ¯ãâì ¨áâ®ç­¨ª 
LD (.ENDPATHSRC),DE ;  ¤à¥á 墮áâ  ¯ã⨠¨áâ®ç­¨ª 
; ¤®¡ ¢«¥­¨¥ ¨¬¥­¨ ¤¨àë ¤«ï ª®¯¨à®¢ ­¨ï ¢ ¯ãâì ¨áâ®ç­¨ª 
LD HL,(.ENDPATHSRC)
LD DE,COUNTING_DIR.DIR_NAME
CALL .ADDNAME2PATH
LD (.ENDPATHSRC),DE ;  ¤à¥á 墮áâ  ¯ã⨠¨áâ®ç­¨ª 
; ¤®¡ ¢«¥­¨¥ ¨¬¥­¨ ¤¨àë ¤«ï ª®¯¨à®¢ ­¨ï ¢ ¯ãâì ¯à¨¥¬­¨ª 
LD HL,(.ENDPATHDST)
LD DE,COUNTING_DIR.DIR_NAME
CALL .ADDNAME2PATH
LD (.ENDPATHDST),DE
; á®§¤ ­¨¥ ¤¨àë ¢ ¯à¨¥¬­¨ª¥
LD HL,.CURRPATHDST
SPDSS DSSF.MKDIR ; á®§¤ «¨ ¤¨à㠯ਥ¬­¨ª 
JR NC,.L3
CP ERR_DSS.DIR_EXISTS ; ¥á«¨ ¤¨à  㦥 ¥áâì ¨£­®à¨¬ ®è¨¡ªã
; JP C,ERROR
.L3
; TODO 横«¨ç¥áª¨© ¯®¨áª ¤¨à¥ªâ®à¨© á á®§¤ ­¨¥¬ ­  ¯à¨¥¬­¨ª¥
LD HL,.CURRPATHSRC
SPDSS DSSF.CHDIR ; ¢å®¤ ¢ ¤¨àã ¨áâ®ç­¨ª 
CALL .FINDFIRSTSRCDIR ; ¯®¨áª ¯¥à¢®£® ®¯¨á â¥«ï
JP C,.ENDCOPY ; ¡®«ìè¥ ¤¨à¥ªâ®à¨© ­¥â, ¢ë室¨¬
; ¯®¨áª ¤¨à¥ªâ®à¨©
.L2 CALL .FINDNEXTSRCDIR ; ¯®¨áª á«¥¤ãî饣® ®¯¨á â¥«ï
JP C,.ENDFINDNEXT ; ¯®¨áª ®ª®­ç¥­?
LD HL,.FINDBUF + FFIRST.Name
LD A,(HL)
CP '.' ; ®¯¨á â¥«¨ "." ¨ ".." ¨£­®à¨¬
JR Z,.L2
LD DE,.TMPNAMEDIR
PUSH DE
CALL .COPYNAME2PATH
LD HL,(.ENDPATHDST)
POP DE
CALL .ADDNAME2PATH
LD HL,.CURRPATHDST
SPDSS DSSF.MKDIR ; á®§¤ ¥¬ ¤¨àã ­  ¯à¨¥¬­¨ª¥
; JP C,ERROR
LD HL,.CURRPATHSRC
SPDSS DSSF.CHDIR ; ¢®§¢à é ¥¬ ¯ãâì ­  ¨áâ®ç­¨ª
; JP C,ERROR
JR .L2 ; ¨é¥¬ á«¥¤ãî騩
; § ¢¥à襭¨¥ ¨ ¢ë室
JP COUNTING_DIR.END_COUNT;RestoreDIR
; LD A,(RAMPAGES.FLX)
; SETPORT WINSP.CPU3,,0
.ENDFINDNEXT
JR $
; ¯®¨áª ¯¥à¢®© ¤¨àë ¢ ⥪ã饩 ¯®¤¤¨à¥ªâ®à¨¨
.FINDFIRSTSRCDIR
LD HL,COUNTING_DIR.FILES_MASK
LD DE,.FINDBUF
SPDSS DSSF.F_FIRST,1,DIR.M_Dir
RET
.FINDNEXTSRCDIR
LD DE,.FINDBUF
SPDSS DSSF.F_NEXT
RET
; ¤®¡ ¢«¥­¨¥ ¨¬¥­¨ ¢ áâப㠯ãâ¨
; HL - ªã¤  ¤®¡ ¢«ïâì (墮áâ ⥪ã饣® ¯ãâ¨)
; DE - ®âªã¤  ¨¬ï ¡à âì
.ADDNAME2PATH CALL .CHECK_BSLASH
LD (HL),'\\'
INC HL
EX DE,HL
; ª®¯¨à®¢ ­¨¥ ¨¬¥­¨ ¨§ ¡ãä¥à 
.COPYNAME2PATH XOR A
.CNP2 CP (HL)
JR Z,.CNP1
LDI
JR .CNP2
.CNP1 LD (DE),A
RET
.NAME2DIRNAME
; ¯à®¢¥àª  ­  BACKSLASH
.CHECK_BSLASH DEC HL
LD A,(HL)
CP '\\'
RET Z
INC HL
RET
; ®âá¥ç¥­¨¥ ¯à®¡¥«®¢ ¢ ¨¬¥­¨
.CUTOFFSPACES LD A,' '
.COS2 DEC HL
CP (HL)
JR Z,.COS2
INC HL
LD (HL),0
RET
; ®âá¥ç¥­¨¥ ¨¬¥­¨ ¤¨àë ¢ áâப¥ ¯ãâ¨
.DELNAME2PATH LD A,'\\'
.COB1 DEC HL
CP (HL)
JR NZ,.COB1
LD (HL),0
RET
; ¢ë室 ¨§ ª®¯¨à®¢ ­¨ï ¤¨à¥ªâ®à¨©
.ENDCOPY LD SP,0
.OLDSP EQU $-2
LD HL,.OLDPATH
SPDSS DSSF.CHDIR
POP AF
SETPORT WINSP.CPU3,,0
POP IY
POP IX
RET
.ENDPATHSRC DW 0 ;  ¤à¥á 墮áâ  ¯ã⨠¨áâ®ç­¨ª 
.ENDPATHDST DW 0 ;  ¤à¥á 墮áâ  ¯ã⨠¯à¨¥¬­¨ª 
.TMPNAMEDIR DB 8 DUP 0
ENDIF
; C:/DEV/
; /CAMEL401
; /DEMON
; /MASM80
; /OASM028
; /SOLID
; /DOC
; /EXAMPLES
; /INCLUDE
; /SRC
; /CLIB
; /BUILD
; /SPFORTH
; /F83
; /F99
; /TASM