; LAST UPDATE: 14.08.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,CountingDirR ; измерение размера диры 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,JUMPS.FILES_BYTES 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 ReplaceColorRectan 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 ReplaceColorRectan 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,REZ3TAB.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 BUF_MARKDIR .FILES_MASK DZ "*.*" ; маска файлов .RET_DIR DZ ".. " ; для выхода из директории .DIR_NAME DZ " " ; имя текущей директории ; копирование директории CopyDirR PUSH IX PUSH IY GETPORT WINSP.CPU3 PUSH AF LD A,(RAMPAGES.FLX) SETPORT WINSP.CPU3,,0 .EXIT POP AF SETPORT WINSP.CPU3,,0 POP IY POP IX RET ; добавление имени директории в список и/или вход/выход Add2ListDirR PUSH IX PUSH IY GETPORT WINSP.CPU3 PUSH AF LD A,(RAMPAGES.FLX) SETPORT WINSP.CPU3,,0 PUSH IX POP DE LD HL,FileHDR.Name ADD HL,DE ; смещение до имени в описателе LD DE,BUF_MARKDIR.DIR_NAME PUSH DE LD BC,FileHDR.Name_Size LDIR ; забрали имя диры EX DE,HL CALL .CUTOFFSPACES ; отсечение пробелов ; выход .EXIT POP AF SETPORT WINSP.CPU3,,0 POP IY POP IX RET ; отсечение пробелов в имени .CUTOFFSPACES LD A,' ' .COS2 DEC HL CP (HL) JR Z,.COS2 INC HL LD (HL),0 RET ; добавление имени диры ".." для выхода в предыдущую диру .ADD_2DOT PUSH HL LD HL,BUF_MARKDIR.RET_DIR LD DE,(BUFFERS.CURR_DIRNAME) LD BC,FFIRST.Name_Size LDIR LD (BUFFERS.CURR_DIRNAME),DE POP HL 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 ; проверка на BACKSLASH .CHECK_BSLASH DEC HL LD A,(HL) CP '\\' RET Z INC HL RET ; подсчет в байтах размера отмеченной директории ; IX - адрес описателя диры в странице панели которую мерять CountingDirR PUSH IX PUSH IY GETPORT WINSP.CPU3 PUSH AF ; текущий номер страницы PUSH IX 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 (JUMPS.FILES_BYTES),HL LD (JUMPS.FILES_BYTES + 2),HL ; обнуление размера диры LD (JUMPS.FILES_COUNT),HL ; обнуление количества файлов LD HL,CPU3 LD (BUFFERS.CURR_DIRNAME),HL ; сохранение текущего пути для возврата SPDSS DSSF.CURDISK LD HL,BUFFERS.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,BUF_MARKDIR.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,(BUFFERS.CURR_DIRNAME) LD BC,FileHDR.Name_Size LDIR ; имя диры для входа LD (BUFFERS.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,(BUFFERS.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,BUFFERS.OLDPATH ; сохраненый путь для возврата SPDSS DSSF.CHDIR POP IY POP IX RET ; выход в предыдущую диру .GET_NAME LD HL,(BUFFERS.CURR_DIRNAME) LD (HL),0 LD DE,-FileHDR.Name_Size ADD HL,DE LD (BUFFERS.CURR_DIRNAME),HL RET .OUT_DIR DEC IXH ; предыдущий уровень диры LD HL,BUF_MARKDIR.RET_DIR JR .SP1 ; переход в диру из списка .SET_PATH LD HL,(BUFFERS.CURR_DIRNAME) LD DE,-FileHDR.Name_Size ADD HL,DE LD DE,BUF_MARKDIR.DIR_NAME PUSH DE LD BC,FFIRST.Name_Size LDIR POP HL .SP1 PUSH IX SPDSS DSSF.CHDIR SPDSS DSSF.CURDISK LD HL,BUFFERS.CURRPATHSRC ADD A,'A' LD (HL),A INC HL LD (HL),':' INC HL SPDSS DSSF.CURDIR POP IX RET ; добавление имени диры ".." для выхода в предыдущую диру .ADD_2DOT PUSH HL LD HL,BUF_MARKDIR.RET_DIR LD DE,(BUFFERS.CURR_DIRNAME) LD BC,FFIRST.Name_Size LDIR LD (BUFFERS.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,.ADD_FILES_BYTES ; для диры копируем имя в табличку LD DE,FFIRST.Name ADD HL,DE LD A,(HL) CP '.' ; . и .. пропускаем JR Z,.L5 ; для диры копируем имя в табличку LD DE,(BUFFERS.CURR_DIRNAME) LD BC,FFIRST.Name_Size LDIR LD (BUFFERS.CURR_DIRNAME),DE INC IXL JR .L5 ; для файла добавляем длину .ADD_FILES_BYTES: LD DE,FFIRST.FileSize ADD HL,DE CALL GET_DWORD ; взять размер из описателя LD HL,JUMPS.FILES_BYTES CALL HLPBCDE ; добавили к текущему размеру LD HL,(JUMPS.FILES_COUNT) INC HL LD (JUMPS.FILES_COUNT),HL ; инкремент количества файлов ; ищем следующий описатель .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,BUF_MARKDIR.FILES_MASK LD DE,BUFFERS.OLDPATH PUSH DE PUSH IX SPDSS DSSF.F_FIRST,0 POP IX POP HL RET ; поиск следующего описателя .F_NEXT LD DE,BUFFERS.OLDPATH PUSH DE PUSH IX SPDSS DSSF.F_NEXT POP IX POP HL RET ; инициализация копирования директории с содержимым InitCopyDirsR PUSH IX PUSH IY GETPORT WINSP.CPU3 PUSH AF BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD HL,LeftPanel ; для пути откуда копировать LD DE,RightPanel ; для пути куда копировать LD A,(RAMPAGES.LEFTPANEL) ; из какой страницы панели брать путь JR Z,.L1 LD HL,RightPanel ; для пути откуда копировать LD DE,LeftPanel ; для пути куда копировать LD A,(RAMPAGES.RIGHTPANEL) ; из какой страницы панели брать путь .L1 ; включаем пагу с директорией текущей панели PUSH HL SETPORT WINSP.CPU3,,0 LD HL,PANEL.CURR_PATH ADD HL,DE ; откуда путь приемника взять LD DE,BUFFERS.CURRPATHDST ; буфер пути приемника CALL .COPYNAME2PATH LD (BUFFERS.ENDPATHDST),DE ; адрес хвоста пути приемника ; копирование имени директории для копирования PUSH IX POP DE LD HL,FileHDR.Name ADD HL,DE LD DE,BUF_MARKDIR.DIR_NAME LD BC,FileHDR.Name_Size LDIR ; забрали имя диры для копирования EX DE,HL CALL .CUTOFFSPACES ; отсечение пробелов ; перенос текущего пути источника POP DE LD HL,PANEL.CURR_PATH ADD HL,DE ; откуда путь приемника взять LD DE,BUFFERS.CURRPATHSRC CALL .COPYNAME2PATH ; скопировали путь источника LD (BUFFERS.ENDPATHSRC),DE ; адрес хвоста пути источника ; добавление имени диры для копирования в путь источника LD HL,(BUFFERS.ENDPATHSRC) LD DE,BUF_MARKDIR.DIR_NAME CALL .ADDNAME2PATH LD (BUFFERS.ENDPATHSRC),DE ; адрес хвоста пути источника ; добавление имени диры для копирования в путь приемника LD HL,(BUFFERS.ENDPATHDST) LD DE,BUF_MARKDIR.DIR_NAME CALL .ADDNAME2PATH LD (BUFFERS.ENDPATHDST),DE XOR A LD (BUFFERS.LEVEL_DIR),A ; выход POP AF SETPORT WINSP.CPU3,,0 POP IY POP IX 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 ; создание папок на приемнике ; HL - адрес описателя диры в странице панели которую копировать MkdirsDstRR 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,BUFFERS.CURRPATHDST ; буфер пути приемника CALL .COPYNAME2PATH LD (BUFFERS.ENDPATHDST),DE ; адрес хвоста пути приемника ; сохранение текущего пути для возврата SPDSS DSSF.CURDISK LD HL,BUFFERS.OLDPATH ; сохраненный путь для возврата ADD A,'A' LD (HL),A INC HL LD (HL),':' INC HL SPDSS DSSF.CURDIR POP DE ; адрес описателя диры в странице панели которую копировать ; JP C,ERROR ;CountingDirR.END_COUNT ; копирование имени директории для копирования LD HL,FileHDR.Name ADD HL,DE LD DE,BUF_MARKDIR.DIR_NAME LD BC,FileHDR.Name_Size LDIR ; забрали имя диры для копирования EX DE,HL CALL .CUTOFFSPACES ; отсечение пробелов ; перенос текущего пути источника LD HL,BUFFERS.OLDPATH LD DE,BUFFERS.CURRPATHSRC CALL .COPYNAME2PATH ; скопировали путь источника LD (BUFFERS.ENDPATHSRC),DE ; адрес хвоста пути источника ; добавление имени диры для копирования в путь источника LD HL,(BUFFERS.ENDPATHSRC) LD DE,BUF_MARKDIR.DIR_NAME CALL .ADDNAME2PATH LD (BUFFERS.ENDPATHSRC),DE ; адрес хвоста пути источника ; добавление имени диры для копирования в путь приемника LD HL,(BUFFERS.ENDPATHDST) LD DE,BUF_MARKDIR.DIR_NAME CALL .ADDNAME2PATH LD (BUFFERS.ENDPATHDST),DE ; создание диры в приемнике LD HL,BUFFERS.CURRPATHDST SPDSS DSSF.MKDIR ; создали диру приемника JR NC,.L3 CP ERR_DSS.DIR_EXISTS ; если дира уже есть игнорим ошибку ; JP C,ERROR .L3 ; TODO циклический поиск директорий с созданием на приемнике LD HL,BUFFERS.CURRPATHSRC SPDSS DSSF.CHDIR ; вход в диру источника CALL .FINDFIRSTSRCDIR ; поиск первого описателя JP C,.ENDCOPY ; больше директорий нет, выходим ; поиск директорий .L2 CALL .FINDNEXTSRCDIR ; поиск следующего описателя JP C,.ENDFINDNEXT ; поиск окончен? LD HL,BUFFERS.FINDBUF + FFIRST.Name LD A,(HL) CP '.' ; описатели "." и ".." игнорим JR Z,.L2 LD DE,.TMPNAMEDIR PUSH DE CALL .COPYNAME2PATH LD HL,(BUFFERS.ENDPATHDST) POP DE CALL .ADDNAME2PATH LD HL,BUFFERS.CURRPATHDST SPDSS DSSF.MKDIR ; создаем диру на приемнике ; JP C,ERROR LD HL,BUFFERS.CURRPATHSRC SPDSS DSSF.CHDIR ; возвращаем путь на источник ; JP C,ERROR JR .L2 ; ищем следующий ; завершение и выход JP CountingDirR.END_COUNT;RestoreDIR ; LD A,(RAMPAGES.FLX) ; SETPORT WINSP.CPU3,,0 .ENDFINDNEXT JR $ ; поиск первой диры в текущей поддиректории .FINDFIRSTSRCDIR LD HL,BUF_MARKDIR.FILES_MASK LD DE,BUFFERS.FINDBUF SPDSS DSSF.F_FIRST,1,DIR.M_Dir RET .FINDNEXTSRCDIR LD DE,BUFFERS.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,BUFFERS.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 ; DEV ; .. ; CAMEL401 ; DEMON ; MASM80 ; OASM028 ; SOLID ; SPFORTH ; TASM ; .. ; DOC ; EXAMPLES ; INCLUDE ; SRC ; .. ; CLIB ; .. ; BUILD ; .. ; F83 ; F99 ;DEV/CAMEL401/ 25 ;DEV/DEMON/ 2 ;DEV/MASM/ 10 ;DEV/OASM28/ 5 ;DEV/SOLID/ 8 ;DEV/SOLID/DOC/ 13 ;DEV/SOLID/EXAMPLES/ 36 ;DEV/SOLID/INCLUDE/ 16 ;DEV/SOLID/SRC/CLIB/ 12 ;DEV/SOLID/SRC/CLIB/BUILD/ 8 ;DEV/SPFORTH/F83/ 4 ;DEV/SPFORTH/F99/ 3 ;DEV/TASM/ 6 ;----------------------------------- ; 0x94 148 ; генерация списка для копирования дир ; "." для выхода в предыдущую диру ; 0 конец списка ; имена дир по 8 символов (можно и 8.3) только имена без 0 в конце имени ; при копировании найдена дира ; занесение в путь источника имени диры ; занесение в путь приемника имени диры ; занесение в список ".." для выхода