; LAST UPDATE: 24.07.2025 savelij MAX_LEVEL_DIR EQU 21 ;[]----------------------------------------------------------[] ReadTreeR PUSH IY POP HL LD BC,PANEL.FILES_ALL ADD HL,BC LD B,PANEL.FILE_MASK - PANEL.FILES_ALL .LL1 LD (HL),0 INC HL DJNZ .LL1 LD HL,BegDIR PUSH IY SPDSS DSSF.CHDIR POP IY LD HL,TreeName PUSH IY SPDSS DSSF.OPEN,,0 POP IY JP NC,LoadTreeR ; файл с деревом каталогов не найден, сканируем и создаем .ScanTree GETPORT WINSP.CPU1 LD C,A GETPORT WINSP.CPU3 LD B,A PUSH BC LD A,(RAMPAGES.BuffPg3) SETPORT WINSP.CPU1,,0 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 MAKEWINDOW WINSUBOBJ.STORE W_MAIN 240,96,160,40 W_FILL 4,2,152,10,COLORI.BLACK W_TEXT 44,3,COLORI.WHITE,"Scanning tree" W_TEXT 32,20,COLORP.HIGHGRAY,"Directories:" W_END LD (.TreeSP1),SP SUB A LD (CurTree),A LD SP,STACKTREE LD HL,0 PUSH HL LD (LoadItemDIRR.CurTAdr),HL LD HL,CPU3 + TreeHead_Size LD (EndTree),HL LD B,0x10 SUB A .L2 LD (HL),A INC HL DJNZ .L2 LD HL,1 LD (TreeDIRS),HL CALL LoadItemDIRR JR NC,.TreeExit ; NC - нет директорий .TreeLoop PUSH HL SPDSS DSSF.SCANKEY LD A,E SUB 0x1B POP HL JP Z,AbortTree LD A,(CurTree) INC A CP MAX_LEVEL_DIR JR Z,.DIRSend LD (CurTree),A LD DE,(TreeDIRS) BIT 2,D ; DE >= 1024 JR NZ,.TreeExit PUSH HL LD A,(HL) OR A JR Z,.DIRSend LD (LoadItemDIRR.CurTAdr),HL SPDSS DSSF.CHDIR CALL LoadItemDIRR JR C,.TreeLoop ; C - есть директории .DIRSend SPDSS DSSF.SCANKEY LD A,E SUB 0x1B JP Z,AbortTree POP HL LD A,H OR L JR Z,.TreeExit PUSH HL LD HL,CurTree DEC (HL) LD HL,UpDIR SPDSS DSSF.CHDIR POP HL LD DE,0x000F ADD HL,DE LD A,(HL) INC HL INC A JR NZ,.TreeLoop JR .DIRSend .TreeExit SETPORT WINSP.Y_PORT,0xC0 LD SP,STACKTREE LD IX,0 PUSH IX LD HL,CPU1 LD DE,TreeHead LD BC,TreeHead_Size EX DE,HL LDIR ; занесли заголовок дерева каталогов FN LD HL,(TreeDIRS) DEC HL LD A,H OR L JR Z,.TreeExit1 LD HL,CPU3 + TreeHead_Size .TreeEndLp INC IXL PUSH HL PUSH DE LD A,IXL CP IXH JR C,.L3 LD IXH,A .L3 LD (DE),A INC DE SUB A LD (DE),A INC DE LD BC,0x000C LDIR LD (DE),A INC DE LD (DE),A INC DE INC HL LD C,(HL) INC HL LD B,(HL) INC HL LD A,(HL) AND 0x80 POP HL OR (HL) LD (HL),A LD L,C LD H,B LD A,H OR L JR NZ,.TreeEndLp .TreeEndLp1 DEC IXL POP HL LD A,H OR L JR Z,.TreeExit1 LD BC,0x000F ADD HL,BC LD A,(HL) INC HL INC A JR NZ,.TreeEndLp JR .TreeEndLp1 .TreeExit1 LD (EndTree),DE DEC DE LD A,0xFF LD (DE),A LD SP,0 .TreeSP1 EQU $-2 POP IY RES VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) LD A,IXH CP 0x0B JR C,.L4 SET VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) .L4 GETPORT WINSP.CPU3 LD (RAMPAGES.BuffPg3),A GETPORT WINSP.CPU1 BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD HL,RAMPAGES.LEFTPANEL JR Z,.L5 LD HL,RAMPAGES.RIGHTPANEL .L5 LD (HL),A WINDOWCLOSE POP BC LD A,B SETPORT WINSP.CPU3,,0 LD A,C SETPORT WINSP.CPU1,,0 LD HL,(TreeDIRS) LD (IY+PANEL.FILES_ALL),L ; EQUIP FIL LD (IY+PANEL.FILES_ALL + 1),H PUSH IY GETPORT WINSP.CPU3 PUSH AF BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L6 LD A,(RAMPAGES.RIGHTPANEL) .L6 SETPORT WINSP.CPU3,,0 LD HL,BegDIR SPDSS DSSF.CHDIR LD HL,TreeName SPDSS DSSF.CREATE,,0 JR C,.TreeErr PUSH AF LD HL,CPU3 LD DE,(EndTree) RES 6,D SPDSS DSSF.WRITE POP AF SPDSS DSSF.CLOSE .TreeErr LD A,1 LD (CPU3 + 1),A POP AF SETPORT WINSP.CPU3,,0 POP IY JP LoadTreeR.TreeOkey ; загрузка дерева каталогов из файла LoadTreeR EX AF,AF' PUSH IY 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 EX AF,AF' PUSH AF LD HL,CPU3 LD DE,0x4000 SPDSS DSSF.READ EX AF,AF' LD HL,CPU3 LD DE,WorkBuffer LD BC,0x0010 LDIR POP AF SPDSS DSSF.CLOSE POP AF SETPORT WINSP.CPU3,,0 POP IY EX AF,AF' JP C,ReadTreeR.ScanTree ; Error LD HL,WorkBuffer + 2 LD DE,TreeHead + 2 LD B,TreeHead_Size - 3 .L2 LD A,(DE) CP (HL) JP NZ,ReadTreeR.ScanTree ; Error INC HL INC DE DJNZ .L2 GETPORT WINSP.CPU3 PUSH AF BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L3 LD A,(RAMPAGES.RIGHTPANEL) .L3 SETPORT WINSP.CPU3,,0 LD HL,CPU3 LD DE,0x000E LD BC,0 LD IXH,0 .LoadTr1 LD A,(HL) AND 0x7F CP IXH JR C,.L4 LD IXH,A .L4 INC HL LD (HL),0 INC BC ADD HL,DE LD A,(HL) INC HL INC A JR NZ,.LoadTr1 RES VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) LD A,IXH CP 0x0B JR C,.L5 SET VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) .L5 LD (IY+PANEL.FILES_ALL),C ; EQUIP FILES LD (IY+PANEL.FILES_ALL + 1),B BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) LD A,1 JR NZ,.L6 LD A,3 .L6 LD (CPU3 + 1),A POP AF SETPORT WINSP.CPU3,,0 .TreeOkey PUSH IY POP HL LD DE,PANEL.CURR_PATH ADD HL,DE INC HL INC HL JP FindTreeDIRR AbortTree LD SP,(ReadTreeR.TreeSP1) POP IY POP BC LD A,B SETPORT WINSP.CPU3,,0 LD A,C SETPORT WINSP.CPU1,,0 RES VIEWFLAG.B_SHORTTREE,(IY+PANEL.VIEWFLAG) RES VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) WINDOWCLOSE LD HL,InitPanels EX (SP),HL SUB A RET TreeName DZ FILENAME.FNTREE_FLN TreeHead DB 0,0,0x5C,0,0,0,0xAE,"FlexTree",0 TreeHead_Size EQU $ - TreeHead BegDIR DB 0x5C,0 UpDIR DB "..",0 CurTree DB 0 TreeDIRS DW 0 ; количество найденых дир EndTree DW 0 ; текущий адрес в таблице директорий ; чтение описателей директорий LoadItemDIRR: LD DE,(EndTree) PUSH DE LD IX,0 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 IX PUSH DE SPDSS DSSF.F_FIRST,1 POP HL POP IX JR C,.FndFLtrE ; ничего не найдено? на выход .FndFLtr LD A,(WorkBuffer + 0x20) AND DIR.M_Dir ; это дира? CALL NZ,.ADD_DIR ; если да то добавляем JR C,.FndFLtrE ; ошибка добавления? выходим ; читаем следующий описатель LD DE,WorkBuffer PUSH IX PUSH DE SPDSS DSSF.F_NEXT POP HL POP IX JR NC,.FndFLtr ; завершение создания дерева .FndFLtrE LD HL,(EndTree) DEC HL LD (HL),0xFF LD C,IXL LD B,IXH LD HL,(TreeDIRS) ADD HL,BC LD (TreeDIRS),HL POP HL LD A,B OR C RET Z PUSH HL CALL .PRT_NUM_DIR ; обновляем количество найденных дир POP HL LD DE,0 .CurTAdr EQU $-2 LD A,D OR E SCF RET Z EX DE,HL LD BC,0x000D ADD HL,BC LD (HL),E INC HL LD (HL),D EX DE,HL SCF RET ; занесение в таблицу элемента директории .ADD_DIR EX DE,HL LD HL,(EndTree) LD BC,0x0010 ADD HL,BC SBC HL,BC EX DE,HL RET C LD BC,FFIRST.Name ADD HL,BC LD A,(HL) CP '.' ; первый символ имени точка? RET Z LD C,0x10 ; длина элемента в таблице SUB A ; перенос имени до 0 .L1 LDI CP (HL) JR NZ,.L1 LD B,C ; остаток заполняем нулем .L2 LD (DE),A INC DE DJNZ .L2 LD (EndTree),DE INC IX RET ; конверсия и печать числа количества директорий в дереве .PRT_NUM_DIR LD HL,(TreeDIRS) DEC HL LD DE,.CurDNumb PUSH DE LD B,4 LD A,' ' .L3 LD (DE),A INC DE DJNZ .L3 POP DE EXX LD C,0 EXX LD BC,1000 ; 1'000 CALL .GetN16 LD BC,100 ; 100 CALL .GetN16 LD BC,10 ; 10 CALL .GetN16 LD A,L ADD A,'0' LD (DE),A LD HL,.CurDNumb LD DE,336 ; X pos LD BC,116 ; Y pos LD A,COLORP.HIGHGRAY JP PrnTxtLnIFF .GetN16 LD A,'0' - 1 OR A .L4 INC A SBC HL,BC JR NC,.L4 ADD HL,BC CP '0' JR Z,.L5 EXX SET 0,C EXX .L5 EXX BIT 0,C EXX RET Z LD (DE),A INC DE RET .CurDNumb DEFB " ",0 ;[]=========================================================[] TestTreeR BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) RET Z LD B,0x28 .TstTree PUSH BC SPMOUSE MOUSEF.READ_STATE POP BC OR A RET NZ PUSH BC SPDSS DSSF.TESTKEY POP BC RET NZ HALT DJNZ .TstTree IFNDEF TREE_DIR_ENTER LD A,E CP 0x0D ; смена директории из дерева только по ENTER RET NZ ENDIF .TestTreeBeg GETPORT WINSP.CPU1 PUSH AF BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L14 LD A,(RAMPAGES.RIGHTPANEL) .L14 SETPORT WINSP.CPU1,,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 ADD HL,HL ADD HL,HL ADD HL,HL SET 6,H INC HL BIT 0,(HL) JR NZ,.L2 EX DE,HL LD HL,CPU1 LD BC,0x000E .L1 INC HL RES 0,(HL) ADD HL,BC LD A,(HL) INC HL INC A JR NZ,.L1 EX DE,HL SET 0,(HL) CALL PrintDIR CALL SetInvert CALL MakeTreePathR PUSH IY BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD IY,RightPanel JR Z,.L3 LD IY,LeftPanel .L3 CALL NewDIRECTORY POP IY .L2 POP AF SETPORT WINSP.CPU1,,0 RET ;[]==========================================================[] MakeTreePathR GETPORT WINSP.CPU1 PUSH AF BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L5 LD A,(RAMPAGES.RIGHTPANEL) .L5 SETPORT WINSP.CPU1,,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 ADD HL,HL ADD HL,HL ADD HL,HL SET 6,H LD DE,WorkBuffer+0xFF LD BC,0x0010 SUB A LD (DE),A DEC DE LD A,(HL) OR A JR Z,.L4 AND 0x7F INC A LD IXL,A ADD HL,BC INC DE .L3 SBC HL,BC PUSH HL LD A,(HL) INC HL AND 0x7F CP IXL JR NC,.L2 LD IXL,A LD B,0xFF SUB A .L6 INC B INC HL CP (HL) JR NZ,.L6 .L1 DEC HL DEC DE LD A,(HL) LD (DE),A DJNZ .L1 DEC DE LD A,'\\' LD (DE),A .L2 POP HL LD A,(HL) AND 0x7F CP 2 JR NC,.L3 .L4 EX DE,HL LD (HL),'\\' POP AF SETPORT WINSP.CPU1,,0 RET ;[]==========================================================[] FindTreeDIRR GETPORT WINSP.CPU1 PUSH AF SETPORT WINSP.Y_PORT,0xC0 LD IX,LeftPanel BIT VIEWFLAG.B_TREE,(IX+PANEL.VIEWFLAG) LD A,(RAMPAGES.LEFTPANEL) JR NZ,.L14 LD A,(RAMPAGES.RIGHTPANEL) .L14 SETPORT WINSP.CPU1,,0 LD DE,CPU1 LD BC,0 .L1 LD A,(DE) AND 0x7F LD IXL,A .L2 PUSH HL PUSH DE LD A,(DE) AND 0x7F CP IXL JR NZ,.L4 INC DE INC DE .L3 LD A,(DE) CP (HL) JR NZ,.L4 INC HL INC DE LD A,(DE) OR A JR Z,.L6 LD A,(HL) CP '\\' JR NZ,.L3 .L4 POP HL LD DE,0x000F ADD HL,DE EX DE,HL POP HL INC BC LD A,(DE) INC DE INC A JR NZ,.L2 .L5 POP AF SETPORT WINSP.CPU1,,0 SCF RET .L6 LD A,IXL OR A JR Z,.L7 LD A,(HL) INC HL CP '\\' JR Z,.L7 DEC HL OR A JR NZ,.L4 .L7 POP DE INC SP INC SP LD A,E ADD A,0x0F LD E,A JR NC,.L15 INC D .L15 INC BC LD A,(HL) OR A JR Z,.L8 LD A,(DE) INC DE INC A JR Z,.L5 JR .L1 .L8 DEC BC PUSH BC LD HL,CPU1 LD BC,0x000E .L9 INC HL LD (HL),B ADD HL,BC LD A,(HL) INC HL INC A JR NZ,.L9 POP HL LD A,E SUB 0x0E LD E,A JR NC,.L10 DEC D .L10 LD IX,LeftPanel BIT VIEWFLAG.B_TREE,(IX+PANEL.VIEWFLAG) JR NZ,.L11 LD IX,RightPanel .L11 BIT PANELFLAG.B_PRNDOSPATH,(IX+PANEL.PANELFLAG) LD A,1 JR NZ,.L12 LD A,3 .L12 LD (DE),A POP AF SETPORT WINSP.CPU1,,0 LD E,L LD D,H LD BC,4 OR A SBC HL,BC JR NC,.L13 LD HL,0 .L13 LD (IX+PANEL.FIRST_FILE),L LD (IX+PANEL.FIRST_FILE + 1),H EX DE,HL OR A SBC HL,DE LD (IX+PANEL.CURR_FILE),L LD (IX+PANEL.CURR_FILE + 1),H OR A RET