; 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 ; подсчет размера директории ; На входе: ; HL - адрес описателя диры в странице панели которую мерять ; На выходе: ; 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