From ac87c5571eaa91ad0aedc16445649803cca39494 Mon Sep 17 00:00:00 2001 From: savelij13 Date: Sun, 7 Sep 2025 22:15:01 +0300 Subject: [PATCH] =?UTF-8?q?FlexNavigator=201.16.04=20-=20=D1=81=D0=BE?= =?UTF-8?q?=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2/=D0=B4=D0=B8?= =?UTF-8?q?=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=B9=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BD=D0=B5=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D1=82=20=20=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B=20=D0=BF=D0=B0=D0=BD=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9.=20-=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=82=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?=20=D0=B2=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B5=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B5.=20-=20=D0=B4=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BF=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B9,=20=D0=BF=D0=BE=D0=BA=D0=B0=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D1=82=D0=BE=D0=B9=20=D1=87=D1=82=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=BA=D1=83=D1=80=D1=81=D0=BE=D1=80=D0=BE=D0=BC?= =?UTF-8?q?.=20-=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BE/=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BE=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D0=B0=20=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B8=20=D0=B2=20=D0=B1=D0=B0=D0=B9=D1=82?= =?UTF-8?q?=D0=B0=D1=85=20=D0=BF=D0=BE=D0=B4=20=D0=BA=D1=83=D1=80=D1=81?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D0=BC.=20-=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=84=D0=BE=D1=80=D0=BC=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=B0.=20-=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B5=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B5=20tab=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B.=20-=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=B1=D1=83=D1=84?= =?UTF-8?q?=D0=B5=D1=80=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B7=D0=B0=D0=B3?= =?UTF-8?q?=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20ini=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D0=B8=D0=BA=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/fn_api_0.5.txt | 10 +- docs/history.txt | 14 +- docs/todo.txt | 6 +- fn/flx/fneditor.flx | Bin 11673 -> 11673 bytes fn/flx/fnviewer.flx | Bin 6459 -> 6459 bytes fn/flx/help.flx | Bin 6364 -> 6364 bytes fn/fn.exe | Bin 48541 -> 49345 bytes fn/history.txt | 14 +- fn_const.a80 | 32 +- fn_exe_boot.a80 | 8 +- fn_version.a80 | 4 +- fndos.a80 | 7 +- fndosline.a80 | 22 +- fninit.a80 | 16 +- fninput.a80 | 297 +++++++++--------- fnmain.a80 | 123 +++----- fnpanel.a80 | 77 +++-- fnsort.a80 | 64 ++-- fntab.a80 | 12 +- fnwork.a80 | 118 ++++---- rez2_fnfunct.a80 | 715 +++++++++++++++++++++++++++++++------------- rez2_fnsearch.a80 | 14 +- rez2_fntab.a80 | 12 +- rez3_fnmark.a80 | 689 ++---------------------------------------- rez3_fnmisc.a80 | 105 +++++-- rez3_fnnext.a80 | 8 +- rez3_fntab.a80 | 12 +- 27 files changed, 1060 insertions(+), 1319 deletions(-) diff --git a/docs/fn_api_0.5.txt b/docs/fn_api_0.5.txt index 877c770..2d32cf7 100644 --- a/docs/fn_api_0.5.txt +++ b/docs/fn_api_0.5.txt @@ -1,7 +1,7 @@ []========================================================================[] * * * Описание Flex Navigator API v1.xx для разработчиков Flx-Plugins * -* doc v0.5 от 04.08.2025 * +* doc v0.5 от 07.09.2025 * * * []========================================================================[] @@ -685,7 +685,7 @@ []------------------------------------------------------------------------[] - Общие переменные со смещение 0xC0: + Общие переменные со смещение 0xC0 от начала таблицы переходов: NUM_DEVICES 1 Количество устройств TreeFlag 1 Флаг дерева директорий @@ -706,8 +706,8 @@ RAMPAGES .RIGHTPANEL 1 Страница каталога Правой панели .BuffPg1 1 .BuffPg2 1 -.BuffPg3 1 -.BuffPg4 1 -.BuffPgEnd 1 +.BuffPg3 1 используется копировщиком файлов/директорий +.BuffPg4 1 используется сортировкой, работа с деревом директорий +.BuffPgEnd 1 байт 0xFF маркер конца списка страниц .FILES_COUNT 2 количество помеченных файлов .FILES_BYTES 5 размер помеченных файлов в байтах diff --git a/docs/history.txt b/docs/history.txt index e9ca579..deb854e 100644 --- a/docs/history.txt +++ b/docs/history.txt @@ -1,6 +1,18 @@ -14.08.2025 +07.09.2025 +FlexNavigator 1.16.04 +- сортировка и копирование файлов/директорий теперь не использует + страницы панелей. +- убрано переставление страниц в списке выделенных при сортировке. +- доделано копирование директорий, пока только той что под курсором. +- сделано/переделано измерение размера директории в байтах под курсором. +- добавлено описание форм полей ввода. +- перенесены некоторые tab таблицы. +- перенесены буферы для загрузки ini файликов. + +27.08.2025 FlexNavigator 1.16.03 +- исправлено формирование пути до папки плагинов. - MISC функции перенесены из 2 резидента в 3. - перераспределение TAB таблиц. - в описание Flex Navigator API добавлено описание глобальных diff --git a/docs/todo.txt b/docs/todo.txt index 19e122e..9a4175b 100644 --- a/docs/todo.txt +++ b/docs/todo.txt @@ -1,8 +1,11 @@ Flex navigator TODO: +[] в копировании файлов/директорий доделать обработку ошибок при создании директорий. +[] в плагине редактора исправить не сохранение введенныой строки при нажатиии функциональных клавиш не связанных с редактированием. +[] для работы в деревом директорий убрать подмену страниц в списке выданных. +[] добавить стрелки влево/вправо для выбора дисков если больше 10. [] добавить в настройки автопоказ или по ENTER при перемещении по дереву каталогов -[] добавить в настройки выбор менять ли активную панель при смене диска на не активной панели [] при выводе дерева каталогов сделать скролл влево/вправо если дерево не влезает по горизонтали [] по кнопке F6 только переименование, а должно быть переименование/перемещение файла если на панелях разные пути [] переделать захордкоженные координаты, переделать на привязку к координатам окна @@ -11,6 +14,7 @@ Flex navigator TODO: [] плагин для создания форм окон [?] вызов и взаимодействие плагина с плагином +[x] (есть изначально) добавить в настройки выбор менять ли активную панель при смене диска на не активной панели [x] загрузка FLX плагина по имени без запуска [x] ввод в командную строку и нажатие ALT+F1/F2 (выбор драйва) подвисает [x] сортировщик сортирует "..", а не должен diff --git a/fn/flx/fneditor.flx b/fn/flx/fneditor.flx index e420c455d64371cd383b1da148fd5170363623ba..34ac8f9b3d9819e9e9a73d74007cf5738e1c85a0 100644 GIT binary patch delta 18 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 ZnZQn7J7Kv{DXe@P2m}U)EUFpS{eKMC(ZB!z delta 21750 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 ? [ \\ ] | diff --git a/fn_exe_boot.a80 b/fn_exe_boot.a80 index 59ce872..0f36023 100644 --- a/fn_exe_boot.a80 +++ b/fn_exe_boot.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 03.08.2025 savelij +; LAST UPDATE: 22.08.2025 savelij include macros.a80 @@ -52,7 +52,7 @@ EntryExec: DI LD A,(MAIN.FNMAIN) ; set pages from 0xC000 SETPORT WINSP.CPU3,,0 LD HL,BASE_ADDR ; FNMAIN - LD DE,END_BLOCK_1 - START_BLOCK_1 + LD DE,BLOCK1_SIZE LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error @@ -60,7 +60,7 @@ EntryExec: DI LD A,(MAIN.FNREZ2) SETPORT WINSP.CPU3,,0 LD HL,0xC000 ; FNREZ2 - LD DE,END_BLOCK_2 - START_BLOCK_2 + LD DE,BLOCK2_SIZE LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error @@ -88,7 +88,7 @@ EntryExec: DI LD A,(MAIN.FNREZ3) ; FNREZ3 SETPORT WINSP.CPU3,,0 LD HL,0xC000 - LD DE,END_BLOCK_3 - START_BLOCK_3 + LD DE,BLOCK3_SIZE LD A,(MAIN.hFile) SPDSS DSSF.READ JP C,disk_error diff --git a/fn_version.a80 b/fn_version.a80 index d94a820..2595a23 100644 --- a/fn_version.a80 +++ b/fn_version.a80 @@ -1,7 +1,7 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 07.09.2025 savelij FLEX_VERS -.NAVIGATOR EQU "1.16.03" +.NAVIGATOR EQU "1.16.04" .EDITOR EQU "1.11" .VIEWER EQU "1.07" diff --git a/fndos.a80 b/fndos.a80 index eed46b6..ba9fe74 100644 --- a/fndos.a80 +++ b/fndos.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 31.07.2025 savelij +; LAST UPDATE: 07.09.2025 savelij ;[]----------------------------------------------------------[] BegDIRECTORY LD HL,BegDIR @@ -78,13 +78,8 @@ NewDIRTree PUSH IY ADD HL,DE INC HL INC HL - IF TREE_REZID - CALL RESIDENT.FindTreeDIR - CALL RESIDENT.MakeTreePath - ELSE CALL FindTreeDIRR CALL MakeTreePathR - ENDIF PUSH IY BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD IY,RightPanel diff --git a/fndosline.a80 b/fndosline.a80 index df68e22..50ba72c 100644 --- a/fndosline.a80 +++ b/fndosline.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 07.09.2025 savelij ;[]==========================================================[] DOSline SUB A @@ -153,11 +153,7 @@ RunDLine DEC HL ADD HL,DE INC HL INC HL - IF TREE_REZID - CALL RESIDENT.FindTreeDIR - ELSE CALL FindTreeDIRR - ENDIF CALL PrintDIR CALL PrnFileInfo PUSH IY @@ -348,7 +344,7 @@ SaveDOSline PUSH BC CALL FindHistory POP BC - LD DE,BUFFERS.DOShistory + BUFFERS.DOShistory_Size + LD DE,REZ3_BUFFERS.DOShistory + REZ3_BUFFERS.DOShistory_Size OR A EX DE,HL SBC HL,DE @@ -365,7 +361,7 @@ SaveDOSline INC HL EX DE,HL PUSH HL - LD BC,BUFFERS.DOShistory + LD BC,REZ3_BUFFERS.DOShistory OR A SBC HL,BC LD C,L @@ -379,7 +375,7 @@ SaveDOSline LDDR .L2 POP BC LD HL,DOSinp - LD DE,BUFFERS.DOShistory + LD DE,REZ3_BUFFERS.DOShistory LD A,C INC A LD (DE),A @@ -427,7 +423,7 @@ GetDOShistory LD IX,DOSstr SETPORT WINSP.CPU1,,0 RET -FindHistory LD HL,BUFFERS.DOShistory +FindHistory LD HL,REZ3_BUFFERS.DOShistory OR A RET Z LD B,A @@ -448,7 +444,7 @@ DOSInputLine LD (InpLnData),IX .L1 CALL InsInpLnCol PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE LD E,(IX + 0x04) ADD HL,DE @@ -652,7 +648,7 @@ InsertWord LD A,(IX + 0x04) ;InpytSymb ; Ввод в середину текста PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE LD E,(IX + 0x04) ADD HL,DE @@ -669,7 +665,7 @@ InsertWord LD A,(IX + 0x04) ;InpytSymb POP BC NotInsWord PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE LD E,(IX + 0x02) ADD HL,DE @@ -695,13 +691,13 @@ ShellFile: db "X:\\SYSTEM.EXE /C ",0 ; шел BATExtension: db ".BAT",0 EXEExtension: db ".EXE" EndOfString: db 0 + DOSstr DB 0x80,0x00 .posX DB 0x00 .addX DB 0x00 .slen DB 0x00 DW 256,231,376 DB COLORP.PANEL + COLORI.FILES - DOSinp DB 0x81 DUP 0 HistSpace DEFW 0x200 diff --git a/fninit.a80 b/fninit.a80 index 9530f17..478fa6e 100644 --- a/fninit.a80 +++ b/fninit.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 27.08.2025 savelij ;[]==========================================================[] InitVideoMode @@ -160,15 +160,19 @@ FirstInit ; создание пути для запуска FLX плагинов с привязкой к пути FN LD HL,BUF_REZ2.FlexDIRECTORY LD DE,BUF_REZ2.FLXdir -.L6 LD A,(HL) - AND A + XOR A +.L6 CP (HL) JR Z,.L7 LDI JR .L6 .L7 LD HL,.DIRFLX - LD BC,.EDIRFLX - .DIRFLX - LDIR +.L9 CP (HL) + JR Z,.L8 + LDI + JR .L9 + +.L8 LD (DE),A LD (LOADFLX4RUN.NAMEFLX),DE LD HL,BUF_REZ2.FlexDIRECTORY SPDSS DSSF.CHDIR @@ -258,7 +262,7 @@ FirstInit LD (InitFlg),A RET -.DIRFLX DB "FLX\\" +.DIRFLX DZ "FLX\\" .EDIRFLX ; обновление в таблице выбора дисков на панели diff --git a/fninput.a80 b/fninput.a80 index 610f3c5..6938646 100644 --- a/fninput.a80 +++ b/fninput.a80 @@ -1,32 +1,32 @@ -; LAST UPDATE: 01.08.2025 savelij +; LAST UPDATE: 25.08.2025 savelij ;[]----------------------------------------------------------[] InputLine LD (InpLnData),IX LD (.InpMous),HL - SET 7,(IX+0x01) + SET 7,(IX + INPUTFORM.FLAG) SUB A - LD (IX+0x02),A - LD (IX+0x03),A + LD (IX + INPUTFORM.CURR_X),A + LD (IX + INPUTFORM.CURRADD_X),A CALL InsInpLnCol PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE PUSH HL - LD E,(IX+0x04) + LD E,(IX + INPUTFORM.CURR_SYMBOLS) ADD HL,DE LD (HL),D - LD (IX+0x02),E + LD (IX + INPUTFORM.CURR_X),E POP HL LD DE,WorkBuffer - LD A,(IX+0x02) + LD A,(IX + INPUTFORM.CURR_X) LD (DE),A INC DE - LD A,(IX+0x03) + LD A,(IX + INPUTFORM.CURRADD_X) LD (DE),A INC DE - LD A,(IX+0x04) + LD A,(IX + INPUTFORM.CURR_SYMBOLS) LD (DE),A INC DE LD C,A @@ -49,16 +49,16 @@ InputLine LD (InpLnData),IX BIT KEYBSTAT.B_CTRL,B JR NZ,.NextInpKeys LD IX,InpTable1 -.NextInpKeys LD L,(IX+0x00) +.NextInpKeys LD L,(IX + 0) INC L JR Z,.InpLineLp1 INC IX DEC L - LD H,(IX+0x00) + LD H,(IX + 0) INC IX - LD C,(IX+0x00) + LD C,(IX + 0) INC IX - LD B,(IX+0x00) + LD B,(IX + 0) INC IX OR A SBC HL,DE @@ -94,39 +94,40 @@ InputLine LD (InpLnData),IX CALL ResCursor PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE EX DE,HL LD HL,WorkBuffer LD A,(HL) INC HL - LD (IX+0x02),A + LD (IX + INPUTFORM.CURR_X),A LD A,(HL) INC HL - LD (IX+0x03),A + LD (IX + INPUTFORM.CURRADD_X),A LD A,(HL) INC HL - LD (IX+0x04),A + LD (IX + INPUTFORM.CURR_SYMBOLS),A LD C,A LD B,0x00 - LD A,B - OR C +; LD A,B +; OR C + AND A SCF RET Z LDIR RET -InpLnData DEFW 0x0000 ; Адрес описателя строки - ; +00 Максимальная длина строки - ; +01 Флаг готовности - ; +02 текущая X позиция курсора - ; +03 текущая AddX - ; +04 количество введенных символов - ; +05 X позиция строки на экране - ; +07 Y позиция строки на экране - ; +09 X длина строки на экране - ; +0B Цвет строки - ; +0C ...сама строка +InpLnData DEFW 0x0000 ; Адрес описателя строки + ; +00 Максимальная длина строки + ; +01 Флаг готовности + ; +02 текущая X позиция курсора + ; +03 текущая AddX + ; +04 количество введенных символов + ; +05 X позиция строки на экране + ; +07 Y позиция строки на экране + ; +09 X длина строки на экране + ; +0B Цвет строки + ; +0C ...сама строка InpTable1 DW SC.ESC << 8 | 0x1B, InputLine.InputLineExitCancel DW SC.ENTER << 8 | 0x0D, InputLine.InputLineExitOk @@ -147,22 +148,22 @@ InpTable2 DW SC.X4 << 8, ILwordL InsertSymbol CP ' ' RET C EX AF,AF' - BIT 7,(IX+0x01) ; ready + BIT 7,(IX + INPUTFORM.FLAG) ; ready CALL NZ,ClearInpLn - LD A,(IX+0x04) ; InpytSymb - SUB (IX+0x00) ; Max len + LD A,(IX + INPUTFORM.CURR_SYMBOLS) ; InpytSymb + SUB (IX + INPUTFORM.MAXLEN) ; Max len RET NC - LD A,(IX+0x04) - SUB (IX+0x02) + LD A,(IX + INPUTFORM.CURR_SYMBOLS) + SUB (IX + INPUTFORM.CURR_X) JR Z,NotInsert ; Ввод в середину текста LD C,A LD B,0x00 PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE - LD E,(IX+0x04) + LD E,(IX + INPUTFORM.CURR_SYMBOLS) ADD HL,DE LD E,L LD D,H @@ -170,127 +171,129 @@ InsertSymbol CP ' ' LDDR NotInsert PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE - LD E,(IX+0x02) + LD E,(IX + INPUTFORM.CURR_X) ADD HL,DE EX AF,AF' LD (HL),A - INC (IX+0x04) - INC (IX+0x02) + INC (IX + INPUTFORM.CURR_SYMBOLS) + INC (IX + INPUTFORM.CURR_X) JP PrintInpLn ; Clear Buffer -ClearInpLn RES 7,(IX+0x01) +ClearInpLn RES 7,(IX + INPUTFORM.FLAG) PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE - LD B,(IX+0x00) + LD B,(IX + INPUTFORM.MAXLEN) SUB A .L1 LD (HL),A INC HL DJNZ .L1 - LD (IX+0x02),A - LD (IX+0x03),A - LD (IX+0x04),A + LD (IX + INPUTFORM.CURR_X),A + LD (IX + INPUTFORM.CURRADD_X),A + LD (IX + INPUTFORM.CURR_SYMBOLS),A JP PrintInpLn ; Курсор влево на одно место -ILleft RES 7,(IX+0x01) - LD A,(IX+0x02) +ILleft RES 7,(IX + INPUTFORM.FLAG) + LD A,(IX + INPUTFORM.CURR_X) DEC A RET M - LD (IX+0x02),A + LD (IX + INPUTFORM.CURR_X),A JP PrintInpLn ; Курсор вправо на одно место -ILright RES 7,(IX+0x01) - LD A,(IX+0x02) - CP (IX+0x04) +ILright RES 7,(IX + INPUTFORM.FLAG) + LD A,(IX + INPUTFORM.CURR_X) + CP (IX + INPUTFORM.CURR_SYMBOLS) RET Z - INC (IX+0x02) + INC (IX + INPUTFORM.CURR_X) JP PrintInpLn ; delete -ILdelet BIT 7,(IX+0x01) ; ready +ILdelet BIT 7,(IX + INPUTFORM.FLAG) ; ready CALL NZ,ClearInpLn - LD A,(IX+0x02) + LD A,(IX + INPUTFORM.CURR_X) OR A RET Z PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE - LD E,(IX+0x02) + LD E,(IX + INPUTFORM.CURR_X) ADD HL,DE LD E,L LD D,H DEC DE - LD A,(IX+0x04) - SUB (IX+0x02) + LD A,(IX + INPUTFORM.CURR_SYMBOLS) + SUB (IX + INPUTFORM.CURR_X) JR Z,ILDel1 LD C,A - LD B,0x00 + XOR A + LD B,A LDIR - SUB A +; SUB A ILDel1 LD (DE),A - DEC (IX+0x02) - DEC (IX+0x04) + DEC (IX + INPUTFORM.CURR_X) + DEC (IX + INPUTFORM.CURR_SYMBOLS) JP PrintInpLn ; Delete Char in Current Position -IL_del_ BIT 7,(IX+0x01) ; ready +IL_del_ BIT 7,(IX + INPUTFORM.FLAG) ; ready CALL NZ,ClearInpLn PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE - LD E,(IX+0x02) + LD E,(IX + INPUTFORM.CURR_X) ADD HL,DE INC HL LD E,L LD D,H DEC DE - LD A,(IX+0x04) - SUB (IX+0x02) + LD A,(IX + INPUTFORM.CURR_SYMBOLS) + SUB (IX + INPUTFORM.CURR_X) RET Z LD C,A - LD B,0x00 - LDIR - SUB A + XOR A + LD B,A + LDIR +; SUB A LD (DE),A - DEC (IX+0x04) + DEC (IX + INPUTFORM.CURR_SYMBOLS) JP PrintInpLn ; Home -ILhome RES 7,(IX+0x01) - LD A,(IX+0x02) +ILhome RES 7,(IX + INPUTFORM.FLAG) + LD A,(IX + INPUTFORM.CURR_X) OR A RET Z SUB A - LD (IX+0x02),A + LD (IX + INPUTFORM.CURR_X),A JP PrintInpLn ; End string -ILend RES 7,(IX+0x01) - LD A,(IX+0x04) - CP (IX+0x02) +ILend RES 7,(IX + INPUTFORM.FLAG) + LD A,(IX + INPUTFORM.CURR_SYMBOLS) + CP (IX + INPUTFORM.CURR_X) RET Z - LD (IX+0x02),A + LD (IX + INPUTFORM.CURR_X),A JP PrintInpLn ; Word right -ILwordR RES 7,(IX+0x01) - LD A,(IX+0x04) - SUB (IX+0x02) +ILwordR RES 7,(IX + INPUTFORM.FLAG) + LD A,(IX + INPUTFORM.CURR_SYMBOLS) + SUB (IX + INPUTFORM.CURR_X) RET Z LD B,A PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE - LD E,(IX+0x02) + LD E,(IX + INPUTFORM.CURR_X) ADD HL,DE LD C,E .L2 LD A,(HL) @@ -319,19 +322,19 @@ ILwordR RES 7,(IX+0x01) .L1 INC HL INC C DJNZ .L3 -.L4 LD (IX+0x02),C +.L4 LD (IX + INPUTFORM.CURR_X),C JP PrintInpLn ; Word left -ILwordL RES 7,(IX+0x01) - LD A,(IX+0x02) +ILwordL RES 7,(IX + INPUTFORM.FLAG) + LD A,(IX + INPUTFORM.CURR_X) OR A RET Z LD B,A LD C,B PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE LD E,C ADD HL,DE @@ -344,7 +347,7 @@ ILwordL RES 7,(IX+0x01) JR Z,.L2 CP '.' JR Z,.L2 - CP 0x5C + CP '\\' JR Z,.L2 DJNZ .L3 JR .L5 @@ -362,23 +365,23 @@ ILwordL RES 7,(IX+0x01) DEC C DJNZ .L2 .L4 INC C -.L5 LD (IX+0x02),C +.L5 LD (IX + INPUTFORM.CURR_X),C JP PrintInpLn ; Delete word -ILdelWR RES 7,(IX+0x01) - LD A,(IX+0x02) +ILdelWR RES 7,(IX + INPUTFORM.FLAG) + LD A,(IX + INPUTFORM.CURR_X) OR A RET Z LD B,A LD C,B PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE LD E,C ADD HL,DE - LD A,(IX+0x04) + LD A,(IX + INPUTFORM.CURR_SYMBOLS) SUB B LD E,A PUSH HL @@ -423,14 +426,14 @@ ILdelWR RES 7,(IX+0x01) DJNZ .L4 .L2 INC HL INC C -.L6 LD A,(IX+0x02) - LD (IX+0x02),C +.L6 LD A,(IX + INPUTFORM.CURR_X) + LD (IX + INPUTFORM.CURR_X),C SUB C LD C,A EX AF,AF' - LD A,(IX+0x04) + LD A,(IX + INPUTFORM.CURR_SYMBOLS) SUB C - LD (IX+0x04),A + LD (IX + INPUTFORM.CURR_SYMBOLS),A LD C,E LD B,0x00 EX DE,HL @@ -449,26 +452,26 @@ ILdelWR RES 7,(IX+0x01) JP PrintInpLn ;[]----------------------------------------------------------[] -InsInpLnCol LD L,(IX+0x07) - LD H,(IX+0x08) +InsInpLnCol LD L,(IX + INPUTFORM.SCR_POS_Y) + LD H,(IX + INPUTFORM.SCR_POS_Y + 1) LD (FillILy),HL - LD A,(IX+0x0B) - AND 0x0F ; INK + LD A,(IX + INPUTFORM.COLOR) + AND 0x0F ; INK LD C,A RLCA RLCA RLCA RLCA OR C - LD HL,PrnINKl ; INK буфер + LD HL,PrnINKl ; INK буфер LD B,0x08 CPL .L1 LD (HL),A INC HL DJNZ .L1 LD B,A - LD A,(IX+0x0B) - AND 0xF0 ; PAPER + LD A,(IX + INPUTFORM.COLOR) + AND 0xF0 ; PAPER LD C,A RRCA RRCA @@ -477,7 +480,7 @@ InsInpLnCol LD L,(IX+0x07) LD (FillILc),A OR C XOR B - LD HL,PrnPAPl ; PAPER буфер + LD HL,PrnPAPl ; PAPER буфер LD B,0x08 .L2 LD (HL),A INC HL @@ -485,46 +488,46 @@ InsInpLnCol LD L,(IX+0x07) RET PrintInpLn CALL ResCursor -.L1 LD A,(IX+0x02) - SUB (IX+0x03) +.L1 LD A,(IX + INPUTFORM.CURR_X) + SUB (IX + INPUTFORM.CURRADD_X) JR NC,PrnInpLn1 - LD A,(IX+0x03) + LD A,(IX + INPUTFORM.CURRADD_X) SUB Step - LD (IX+0x03),A + LD (IX + INPUTFORM.CURRADD_X),A JR PrintInpLn.L1 PrnInpLn1 PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE - LD E,(IX+0x03) + LD E,(IX + INPUTFORM.CURRADD_X) ADD HL,DE OR A - CALL NZ,TstInpLnLen ; На вход: HL-начало вывода - ; А -кол.симв.до курсора + CALL NZ,TstInpLnLen ; На вход: HL-начало вывода + ; А -кол.симв.до курсора PUSH IY PUSH IX - LD A,(IX+0x07) - LD IYL,A ; Y координата - LD A,(IX+0x04) + LD A,(IX + INPUTFORM.SCR_POS_Y) + LD IYL,A ; Y координата + LD A,(IX + INPUTFORM.CURR_SYMBOLS) LD IYH,A - GETPORT WINSP.Y_PORT ; Сохраняем Y порт + GETPORT WINSP.Y_PORT ; Сохраняем Y порт PUSH AF EXX LD HL,PrnPAPl LD DE,PrnINKl - LD C,(IX+0x05) - LD B,(IX+0x06) + LD C,(IX + INPUTFORM.SCR_POS_X) + LD B,(IX + INPUTFORM.SCR_POS_X + 1) SRL B RR C SET 6,B EXX - LD C,(IX+0x09) - LD B,(IX+0x0A) + LD C,(IX + INPUTFORM.SCR_LEN_X) + LD B,(IX + INPUTFORM.SCR_LEN_X + 1) SRL B RR C LD IXL,C - LD C,L ; Адрес строки + LD C,L ; Адрес строки LD B,H GETPORT WINSP.CPU1 LD IXH,A @@ -542,9 +545,9 @@ PrnInpLn1 PUSH IX LD A,(BC) INC BC PInpLnP LD L,A - LD H,HIGH (FONT_RAW)-0xC0 + LD H,HIGH (FONT_RAW) - 0xC0 PUSH BC - LD B,(HL) ; длина символа + LD B,(HL) ; длина символа INC H LD E,(HL) INC H @@ -627,10 +630,10 @@ TstInpLnLen PUSH IY PUSH AF LD A,(RAMPAGES.FNFONT) SETPORT WINSP.CPU0,,0 - LD D,HIGH (FONT_RAW)-0xC0 -TstInpLn PUSH HL + LD D,HIGH (FONT_RAW) - 0xC0 +.TstInpLn PUSH HL LD BC,0x0000 -TstInpL LD E,(HL) +.TstInpL LD E,(HL) INC HL LD A,(DE) ADD A,A @@ -640,23 +643,23 @@ TstInpL LD E,(HL) ADC A,0x00 LD B,A DEC IYL - JR NZ,TstInpL - LD L,(IX+0x09) - LD H,(IX+0x0A) + JR NZ,.TstInpL + LD L,(IX + INPUTFORM.SCR_LEN_X) + LD H,(IX + INPUTFORM.SCR_LEN_X + 1) OR A SBC HL,BC JR NC,TstInpE POP HL LD BC,Step ADD HL,BC - LD A,(IX+0x03) + LD A,(IX + INPUTFORM.CURRADD_X) ADD A,C - LD (IX+0x03),A + LD (IX + INPUTFORM.CURRADD_X),A LD A,IYH SUB C LD IYH,A LD IYL,A - JR TstInpLn + JR .TstInpLn TstInpE POP HL POP AF @@ -667,12 +670,12 @@ TstInpE POP HL SetCursor PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE - LD E,(IX+0x03) + LD E,(IX + INPUTFORM.CURRADD_X) ADD HL,DE LD BC,0x0000 - LD A,(IX+0x02) + LD A,(IX + INPUTFORM.CURR_X) SUB E JR Z,StCurs1 EX AF,AF' @@ -681,7 +684,7 @@ SetCursor PUSH IX PUSH AF LD A,(RAMPAGES.FNFONT) SETPORT WINSP.CPU0,,0 - LD D,HIGH (FONT_RAW)-0xC0 + LD D,HIGH (FONT_RAW) - 0xC0 EX AF,AF' StCurs0 EX AF,AF' LD E,(HL) @@ -704,8 +707,8 @@ StCurs1 LD (CurShiftX),BC LD (CurCursor),A LD A,CursTimer LD (CrTimer),A -SetCr LD L,(IX+0x05) - LD H,(IX+0x06) +SetCr LD L,(IX + INPUTFORM.SCR_POS_X) + LD H,(IX + INPUTFORM.SCR_POS_X + 1) LD BC,(CurShiftX) ADD HL,BC SRL H @@ -717,9 +720,9 @@ SetCr LD L,(IX+0x05) LD B,A PUSH BC LD DE,CursBuffer - LD C,(IX+0x07) + LD C,(IX + INPUTFORM.SCR_POS_Y) DEC C - LD A,(IX+0x0B) + LD A,(IX + INPUTFORM.COLOR) AND 0x0F LD B,A RLCA @@ -752,8 +755,8 @@ SetCr LD L,(IX+0x05) SETPORT WINSP.CPU1,,0 RET -ResCursor LD L,(IX+0x05) - LD H,(IX+0x06) +ResCursor LD L,(IX + INPUTFORM.SCR_POS_X) + LD H,(IX + INPUTFORM.SCR_POS_X + 1) LD BC,(CurShiftX) ADD HL,BC SRL H @@ -765,7 +768,7 @@ ResCursor LD L,(IX+0x05) LD B,A PUSH BC LD DE,CursBuffer - LD B,(IX+0x07) + LD B,(IX + INPUTFORM.SCR_POS_Y) DEC B LD C,WINSP.Y_PORT SETPORT WINSP.CPU1,0x50 diff --git a/fnmain.a80 b/fnmain.a80 index 55ab5ea..541bfda 100644 --- a/fnmain.a80 +++ b/fnmain.a80 @@ -1,11 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij - -;[]=======================================================================[] -; FLEX NAVIGATOR ; -; v1.11 ; -; Last edition: 03/02/2000 ; -;[]=======================================================================[] +; LAST UPDATE: 07.09.2025 savelij include fn_const.a80 include fn_macros.a80 @@ -87,9 +81,9 @@ RAMPAGES .RIGHTPANEL DB 0 ; 2 Страница каталога Правой панели .BuffPg1 DB 0 ; 3 .BuffPg2 DB 0 ; 4 -.BuffPg3 DB 0 ; 5 -.BuffPg4 DB 0 ; 6 -.BuffPgEnd DB 0xFF +.BuffPg3 DB 0 ; 5 используется копировщиком файлов/директорий +.BuffPg4 DB 0 ; 6 используется сортировкой, работа с деревом директорий +.BuffPgEnd DB 0xFF ; маркер конца списка страниц .FILES_COUNT DW 0 ; количество помеченных файлов .FILES_BYTES DB 5 DUP 0 ; размер помеченных файлов в байтах @@ -260,6 +254,22 @@ SET_DWORD: LD (HL),E LD (HL),B RET +GET_HANDLE_ADR 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 + OR H + LD H,A + RET + ; вызов функции в страницах RESIDENT ; ==============resident 2============== @@ -277,35 +287,16 @@ RESIDENT .DeleteFiles: LD DE,DeleteFilesR jr .FunctResident -.Quit: CALL ResInvert -.QuitL1 LD DE,QuitConfirmWin - CALL .FunctResident - JP C,SetInvert - LD HL,ComExit - EX (SP),HL - RET - .Setup: LD DE,SetupR jr .FunctResident .QSearch: LD DE,QSearchR jr .FunctResident - IF TREE_REZID -.TestTree LD DE,TestTreeR - jr .FunctResident - -.TestTreeBeg LD DE,TestTreeR.TestTreeBeg - jr .FunctResident - -.ReadTree LD DE,ReadTreeR - jr .FunctResident - -.MakeTreePath LD DE,MakeTreePathR - jr .FunctResident - -.FindTreeDIR LD DE,FindTreeDIRR - jr .FunctResident + IF MARK_DIR +; считалка содержимого директории в байтах +.CalcDirSize LD DE,CalcDirSizeR + JR .FunctResident ENDIF ; ==============resident 2============== @@ -315,24 +306,6 @@ RESIDENT LD C,WINSP.CPU1 JP Resident - IF MARK_DIR -; считалка содержимого директории в байтах -.CountingDir LD DE,CountingDirR - JR .HelpResident - -; инициализация переменных для копирования директории -.InitCopyDirs LD DE,InitCopyDirsR - JR .HelpResident - -; копирование директории -.CopyDir LD DE,CopyDirR - JR .HelpResident - -; добавление имени директории в список и/или вход/выход -.Add2ListDir LD DE,Add2ListDirR - JR .HelpResident - ENDIF - .UnMarkGroup: LD DE,UnMarkGroupR jr .HelpResident @@ -387,6 +360,14 @@ RESIDENT .SystemInfo: LD DE,SystemInfoR jr .HelpResident + +.Quit: CALL ResInvert +.QuitL1 LD DE,QuitConfirmWin + CALL .HelpResident + JP C,SetInvert + LD HL,ComExit + EX (SP),HL + RET ; ==============resident 3============== ; Выход @@ -427,11 +408,7 @@ MainLoop: LD IX,MAINTAB.FilePanelLeft CALL C,DOSline LD A,(TreeFlag) OR A - IF TREE_REZID - CALL NZ,RESIDENT.TestTree - ELSE CALL NZ,TestTreeR - ENDIF JR MainLoop TestKeys @@ -488,11 +465,9 @@ MouseOnOff LD A,(MouseFlag) START_SORT include fnsort.a80 END_SORT - IF TREE_REZID = 0 START_TREE include fntree.a80 END_TREE - ENDIF include fnpanel.a80 include fndos.a80 @@ -507,14 +482,21 @@ END_BLOCK_1: ; ==============resident 2============== PHASE 0x4000 START_BLOCK_2 +; буфера чтобы память не занимали в EXE файле +REZ2_BUFFERS + _INIT_VAR BUF_REZ2.FlexDIRECTORY + _MINUSVAR .OLDLEFTPANEL, 0x100 ; текущий путь левой панели + _MINUSVAR .OLDRIGHTPANEL, 0x100 ; текущий путь правой панели + _MINUSVAR .FINDCURRPATH, 0x100 ; временной текущий путь источника + _MINUSVAR .FINDBUF, 0x100 ; временный буфер поиска + _MINUSVAR .ENDPATHSRC, WORD ; адрес хвоста пути источника + _MINUSVAR .CURR_DIRNAME, WORD ; текущий адрес в пути + include rez2_fnfunct.a80 include rez2_fnsearch.a80 include rez2_fnconfig.a80 include rez2_fnerror.a80 include rez2_fntab.a80 - IF TREE_REZID - include fntree.a80 - ENDIF END_BLOCK_2: DEPHASE ; 0x4000 ; ==============resident 2============== @@ -523,7 +505,6 @@ END_BLOCK_2: PHASE 0xC000 ; MAIN.FNFONT START_BLOCK_4 - FONT_RAW_PACK binclude tmp/font_raw.pack IFFFONT_RAW_PACK binclude tmp/iff_font_raw.pack IFFFONT_RAW_END @@ -536,13 +517,8 @@ END_BLOCK_4: PHASE 0x4000 ; MAIN.FNREZ3 START_BLOCK_3 - include rez3_fnnext.a80 - include rez3_fnmark.a80 - include rez3_fnmisc.a80 - include rez3_fntab.a80 - ; буфера чтобы память не занимали в EXE файле -BUFFERS +REZ3_BUFFERS _INIT_VAR 0x8000 ; с конца страницы _MINUSVAR .DOShistory, 0x200 ;times 0x200 db 0 @@ -550,19 +526,14 @@ BUFFERS _MINUSVAR .fnview_ext, WorkBuffer_Size ;times 0x400 db 0 _MINUSVAR .fn_ext, WorkBuffer_Size ;times 0x400 db 0 - _MINUSVAR .OLDPATH, 0x100 ; сохраненный текущий путь - _MINUSVAR .CURRPATHSRC, 0x100 ; временной текущий путь источника - _MINUSVAR .CURRPATHDST, 0x100 ; временной текущий путь приемника - _MINUSVAR .FINDBUF, 0x100 ; временный буфер поиска - _MINUSVAR .LEVEL_DIR, BYTE ; текущий уровень директории - _MINUSVAR .ENDPATHSRC, WORD ; адрес хвоста пути источника - _MINUSVAR .ENDPATHDST, WORD ; адрес хвоста пути приемника - _MINUSVAR .CURR_DIRNAME, WORD ; текущий адрес в пути + include rez3_fnnext.a80 + include rez3_fnmark.a80 + include rez3_fnmisc.a80 + include rez3_fntab.a80 END_BLOCK_3: DEPHASE ; 0x4000 ; ==============resident 3============== -; чисто для отладки BLOCK1_SIZE EQU END_BLOCK_1 - START_BLOCK_1 ; основной код BLOCK2_SIZE EQU END_BLOCK_2 - START_BLOCK_2 ; резидент 2 BLOCK3_SIZE EQU END_BLOCK_3 - START_BLOCK_3 ; резидент 3 diff --git a/fnpanel.a80 b/fnpanel.a80 index 09878a0..929abd1 100644 --- a/fnpanel.a80 +++ b/fnpanel.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 01.08.2025 savelij +; LAST UPDATE: 07.09.2025 savelij ;[]----------------------------------------------------------[] PrintDisks LD L,(IY + PANEL.X) @@ -164,19 +164,21 @@ PrnFileInfo BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) LD A,(RAMPAGES.RIGHTPANEL) .L1 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 ; *2 - ADD HL,HL ; *4 - ADD HL,HL ; *8 - LD E,L - LD D,H - ADD HL,HL ; *10 - ADD HL,DE ; *18 - SET 6,H ; | 0x4000 +; 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 ; *10 +; ADD HL,DE ; *18 +; SET 6,H ; | 0x4000 + LD A,HIGH (CPU1) + CALL GET_HANDLE_ADR LD DE,WorkBuffer LD BC,FileHDR.SIZE CALL MoveBytesInc @@ -314,12 +316,7 @@ Get8Bit LD B,'0' - 1 INC HL RET -PrnTreeInfo - IF TREE_REZID - CALL RESIDENT.MakeTreePath - ELSE - CALL MakeTreePathR - ENDIF +PrnTreeInfo CALL MakeTreePathR EX DE,HL PUSH IY POP HL @@ -432,8 +429,8 @@ PrnDIRECT BIT VIEWFLAG.B_FULL,(IY+PANEL.VIEWFLAG) LD A,(RAMPAGES.RIGHTPANEL) .L1 SETPORT WINSP.CPU1,,0 - LD L,(IY+PANEL.FIRST_FILE) - LD H,(IY+PANEL.FIRST_FILE + 1) + LD L,(IY + PANEL.FIRST_FILE) + LD H,(IY + PANEL.FIRST_FILE + 1) ADD HL,HL ; *2 ADD HL,HL ; *4 ADD HL,HL ; *8 @@ -526,8 +523,8 @@ PrintFULL PUSH IY LD A,(RAMPAGES.RIGHTPANEL) .L1 SETPORT WINSP.CPU1,,0 - LD L,(IY+PANEL.FIRST_FILE) - LD H,(IY+PANEL.FIRST_FILE + 1) + LD L,(IY + PANEL.FIRST_FILE) + LD H,(IY + PANEL.FIRST_FILE + 1) ADD HL,HL ; *2 ADD HL,HL ; *4 ADD HL,HL ; *8 @@ -664,8 +661,8 @@ PrintTREE DJNZ .L2 POP DE LD HL,0x4000 - LD C,(IY+PANEL.FIRST_FILE) - LD B,(IY+PANEL.FIRST_FILE + 1) + LD C,(IY + PANEL.FIRST_FILE) + LD B,(IY + PANEL.FIRST_FILE + 1) LD A,B OR C JR Z,.PrDIRb2 @@ -1083,19 +1080,21 @@ PrnInvert LD A,(IY + PANEL.FILES_ALL) LD A,(RAMPAGES.RIGHTPANEL) .L1 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 ; *2 - ADD HL,HL ; *4 - ADD HL,HL ; *8 - LD E,L - LD D,H - ADD HL,HL ; *10 - ADD HL,DE ; *18 - SET 6,H ; | 0xC000 +; 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 ; *10 +; ADD HL,DE ; *18 +; SET 6,H ; | 0xC000 + LD A,HIGH (CPU1) + CALL GET_HANDLE_ADR LD E,(HL) POP AF SETPORT WINSP.CPU1,,0 diff --git a/fnsort.a80 b/fnsort.a80 index 3735944..34ef2b8 100644 --- a/fnsort.a80 +++ b/fnsort.a80 @@ -1,29 +1,49 @@ -; LAST UPDATE: 03.08.2025 savelij +; LAST UPDATE: 07.09.2025 savelij ;[]----------------------------------------------------------[] -ReadDIR BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) - IF TREE_REZID - JP NZ,RESIDENT.ReadTree - ELSE +; На входе: +; A - номер страницы для работы если бит PANELFLAG.B_DIRPAGE установлен +; иначе не требуется +ReadDIR BIT PANELFLAG.B_DIRPAGE,(IY + PANEL.PANELFLAG) + JR NZ,.RD1 +.RD2 BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD A,(RAMPAGES.LEFTPANEL) + JR Z,.RD1 + LD A,(RAMPAGES.RIGHTPANEL) +.RD1 LD (.DIRPAGE),A + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) 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) + LD A,(IY + PANEL.SORTFLAG) + AND SORTFLAG.MASK + JR Z,.L6 +; с сортировкой грузим в свободную пагу + LD A,(RAMPAGES.BuffPg4) + JR .L1 + +; без сортировки грузим в страницу панели +.L6 LD A,0 +.DIRPAGE EQU $-1 .L1 SETPORT WINSP.CPU3,,0 PUSH IY POP HL + LD D,H + LD E,L + LD BC,PANEL.FILE_MASK + ADD HL,BC + BIT PANELFLAG.B_DIRPAGE,(IY + PANEL.PANELFLAG) + JR NZ,.L8 + EX DE,HL LD BC,PANEL.FILES_ALL ADD HL,BC LD B,PANEL.FILE_MASK - PANEL.FILES_ALL .L5 LD (HL),0 INC HL DJNZ .L5 +.L8 RES PANELFLAG.B_DIRPAGE,(IY + PANEL.PANELFLAG) BIT SORTFLAG.B_FILTER,(IY + PANEL.SORTFLAG) JR NZ,.L2 LD HL,NORMmask @@ -108,8 +128,8 @@ FindFILESm LD HL,NORMmask POP IX POP IY RET C -FFILEm1 LD A,(WorkBuffer + FFIRST.Attr);+0x20) - AND DIR.M_Dir;0x10 +FFILEm1 LD A,(WorkBuffer + FFIRST.Attr) + AND DIR.M_Dir CALL NZ,InsFileInfo RET C LD DE,WorkBuffer @@ -160,7 +180,7 @@ InsFileInfo EX DE,HL LD (DE),A INC DE PUSH HL - LD BC,FFIRST.Attr;0x20 + LD BC,FFIRST.Attr ADD HL,BC LD B,(HL) ; FFIRST.Attr INC HL @@ -384,14 +404,10 @@ SortDIR 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.BuffPg4) + LD A,(ReadDIR.DIRPAGE) SETPORT WINSP.CPU3,,0 + LD A,(RAMPAGES.BuffPg4) + SETPORT WINSP.CPU1,,0 LD HL,CPU3 LD (EndSort),HL SUB A @@ -485,14 +501,6 @@ SortDIR .L3 LD (HL),A INC HL DJNZ .L3 - GETPORT WINSP.CPU1 - LD (RAMPAGES.BuffPg4),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 diff --git a/fntab.a80 b/fntab.a80 index 4baef9c..9f6e14e 100644 --- a/fntab.a80 +++ b/fntab.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 24.08.2025 savelij ;[]==========================================================[] ; Формат таблицы @@ -143,11 +143,11 @@ MAINTAB DW 164,640, 0,256,%0000000100100000,0,MenuExit,0 DW 0x8000 -.SelectTab DW 44,196, 29, 43,%0000000100100100,0,RESIDENT.MarkGroupN,0 - DW 44,196, 43, 57,%0000000100100100,0,RESIDENT.UnMarkGroupN,0 - DW 44,196, 57, 71,%0000000100100100,0,RESIDENT.SelectAllN,0 - DW 44,196, 71, 85,%0000000100100100,0,RESIDENT.UnSelectAllN,0 - DW 44,196, 85, 99,%0000000100100100,0,RESIDENT.InvertSelectN,0 +.SelectTab DW 44,196, 29, 43,%0000000100100100,0,RESIDENT.MarkGroupN,0 ; Mark group + + DW 44,196, 43, 57,%0000000100100100,0,RESIDENT.UnMarkGroupN,0 ; Unmark group - + DW 44,196, 57, 71,%0000000100100100,0,RESIDENT.SelectAllN,0 ; Mark all CTRL+ + DW 44,196, 71, 85,%0000000100100100,0,RESIDENT.UnSelectAllN,0 ; Unmark all CTRL- + DW 44,196, 85, 99,%0000000100100100,0,RESIDENT.InvertSelectN,0 ; Invert selection * DW 6, 40, 15, 26,%0000000010010000,MenuFile.L2,0,0 DW 40, 84, 15, 26,%0000000100101000,0,MenuExit,0 DW 84,138, 15, 26,%0000000010010000,MenuOption.L2,0,0 diff --git a/fnwork.a80 b/fnwork.a80 index 7a4d737..e098b92 100644 --- a/fnwork.a80 +++ b/fnwork.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 07.09.2025 savelij ;[]===========================================================[] CursUp LD A,(IY + PANEL.FILES_ALL) @@ -1036,11 +1036,7 @@ NewFile1 LD HL,0x003F ;[]==========================================================[] OpenFile BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) - IF TREE_REZID - JP NZ,RESIDENT.TestTreeBeg - ELSE JP NZ,TestTreeR.TestTreeBeg - ENDIF LD A,(IY+PANEL.FILES_ALL) OR (IY+PANEL.FILES_ALL + 1) RET Z @@ -1052,19 +1048,21 @@ OpenFile BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) LD A,(RAMPAGES.RIGHTPANEL) .L1 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 ; *2 - ADD HL,HL ; *4 - ADD HL,HL ; *8 - LD E,L - LD D,H - ADD HL,HL ; *10 - ADD HL,DE ; *18 - SET 6,H ; | 0x4000 +; 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 ; *10 +; ADD HL,DE ; *18 +; SET 6,H ; | 0x4000 + LD A,HIGH (CPU1) + CALL GET_HANDLE_ADR LD DE,WorkBuffer LD BC,FileHDR.Attr PUSH HL @@ -1080,8 +1078,9 @@ OpenFile BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) INC HL JP Z,RunEXEfile LD A,(HL) - CP '.' - JR NZ,OpenF2 + CP '.' ; выход из директории вверх? + JR NZ,EnterDIR +; выход из директории вверх PUSH HL PUSH IY POP HL @@ -1094,7 +1093,7 @@ OpenFile BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) LD A,'\\' DEC HL CP (HL) - JR Z,OpenF1 + JR Z,.L5 .L3 DEC HL CP (HL) JR NZ,.L3 @@ -1106,8 +1105,9 @@ OpenFile BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) JR NZ,.L4 LD (DE),A LD A,'.' -OpenF1 POP HL -OpenF2 PUSH AF +.L5 POP HL +; вход в директорию +EnterDIR PUSH AF PUSH HL CALL ResInvert POP HL @@ -1131,7 +1131,7 @@ OpenF2 PUSH AF SPDSS DSSF.CURDIR POP IY CALL PrintPath - BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) + BIT PANELFLAG.B_PRNDOSPATH,(IY + PANEL.PANELFLAG) CALL NZ,PrintDOSPath POP AF CP '.' @@ -1144,7 +1144,7 @@ OpenF2 PUSH AF LD DE,PANEL.BAR_X ADD IX,DE CALL InitScrollBar - LD A,(IY+PANEL.VIEWFLAG) + LD A,(IY + PANEL.VIEWFLAG) AND VIEWFLAG.MASK PUSH AF CALL Z,DrawHScrollBar @@ -1155,7 +1155,7 @@ OpenF2 PUSH AF OR A JP Z,WaitUnpressMouse PUSH IY - BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD IY,LeftPanel LD HL,RightPanel JR NZ,.L5 @@ -1165,11 +1165,7 @@ OpenF2 PUSH AF ADD HL,DE INC HL INC HL - IF TREE_REZID - CALL RESIDENT.FindTreeDIR - ELSE CALL FindTreeDIRR - ENDIF CALL PrintDIR CALL PrnFileInfo PUSH IY @@ -1356,7 +1352,7 @@ ShowDSexit JP WaitUnpressMouse ;[]==========================================================[] -RunEXEfile: LD IX,BUFFERS.fn_ext +RunEXEfile: LD IX,REZ3_BUFFERS.fn_ext LD DE,PrevFile PUSH DE SUB A @@ -1952,19 +1948,21 @@ StViewFile: LD A,0x01 LD A,(RAMPAGES.RIGHTPANEL) .L2 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 ; *2 - ADD HL,HL ; *4 - ADD HL,HL ; *8 - LD E,L - LD D,H - ADD HL,HL ; *10 - ADD HL,DE ; *18 - SET 6,H ; | 0x4000 +; 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 ; *10 +; ADD HL,DE ; *18 +; SET 6,H ; | 0x4000 + LD A,HIGH (CPU1) + CALL GET_HANDLE_ADR LD DE,WorkBuffer LD BC,FileHDR.Attr PUSH HL @@ -1989,7 +1987,7 @@ StViewFile: LD A,0x01 VFlag: EQU $-1 OR A JR NZ,View1 -View: LD IX,BUFFERS.fnview_ext +View: LD IX,REZ3_BUFFERS.fnview_ext LD DE,PrevFile CALL TestEXT RET NC @@ -2112,19 +2110,21 @@ StEditFile: LD A,0x01 LD A,(RAMPAGES.RIGHTPANEL) .L2 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 ; *2 - ADD HL,HL ; *4 - ADD HL,HL ; *8 - LD E,L - LD D,H - ADD HL,HL ; *10 - ADD HL,DE ; *18 - SET 6,H ; | 0x4000 +; 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 ; *10 +; ADD HL,DE ; *18 +; SET 6,H ; | 0x4000 + LD A,HIGH (CPU1) + CALL GET_HANDLE_ADR LD DE,WorkBuffer LD BC,FileHDR.Attr PUSH HL @@ -2149,7 +2149,7 @@ StEditFile: LD A,0x01 EFlag: EQU $-1 OR A JR NZ,Edit1 -Edit: LD IX,BUFFERS.fnedit_ext +Edit: LD IX,REZ3_BUFFERS.fnedit_ext LD DE,PrevFile CALL TestEXT RET NC diff --git a/rez2_fnfunct.a80 b/rez2_fnfunct.a80 index ca4434d..cc548e3 100644 --- a/rez2_fnfunct.a80 +++ b/rez2_fnfunct.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 07.09.2025 savelij ;[]==========================================================[] CopyFilesR LD A,(IY + PANEL.FILES_ALL) @@ -21,32 +21,17 @@ CopyFilesR LD A,(IY + PANEL.FILES_ALL) .L1 SETPORT WINSP.CPU3,,0 LD IX,WorkBuffer - 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 ; *10 - ADD HL,DE ; *18 - SET 6,H - SET 7,H ; | 0xC000 - LD (COPY.PathCurrFile),HL + LD A,HIGH (CPU3) + CALL GET_HANDLE_ADR + LD (COPY.PathCurrFile),HL LD DE,WorkBuffer LD BC,FileHDR.SIZE LDIR POP AF SETPORT WINSP.CPU3,,0 - LD HL,CopyNextFile.FLAG_DIRCOPY - XOR A ; копировать только файлы - LD (HL),A BIT DIR.B_Dir,(IX + FileHDR.Attr) IF MARK_DIR - JP NZ,COPY_DIR + JP NZ,.InitCopyDir ELSE RET NZ ENDIF @@ -63,17 +48,17 @@ CopyFilesR LD A,(IY + PANEL.FILES_ALL) IF MARK_DIR ; копирование диры со всем содержимым под курсором -COPY_DIR INC A - LD (HL),A ; копировать будем директориями - CALL RESIDENT.CountingDir ; измерение размера директории с файлами +.InitCopyDir LD HL,(COPY.PathCurrFile) + PUSH HL + CALL CalcDirSizeR ; измерение размера директории с файлами + POP HL + LD (COPY.PathCurrFile),HL LD HL,JUMPS.FILES_BYTES LD DE,COPY.CopyBytes - LD BC,5 + LD BC,DWORD + 1 LDIR ; забрали размер директории - LD HL,0 - LD (COPY.CopyFiles),HL ; количество уже скопированных файлов - CALL RESIDENT.InitCopyDirs ; инициализация путей откуда/куда - + LD (COPY.CopyFiles),BC ; количество уже скопированных файлов + CALL StorePaths ; сохранение текущий путей панелей LD HL,(COPY.CopyBytes) LD DE,(COPY.CopyBytes + 2) CALL ConvBytes2Pages ; пересчет в количество страниц для копирования @@ -124,14 +109,8 @@ CopyLp0 BIT FileHDR.B_MARK,(IX + FileHDR.Flag) LD E,(IX + FileHDR.SizeBytes + 2) LD D,(IX + FileHDR.SizeBytes + 3) CALL ConvBytes2Pages -; LD C,L -; LD B,H -; POP HL POP BC ADD HL,BC -; LD C,E -; LD B,D -; POP DE POP BC EX DE,HL ADC HL,BC @@ -176,6 +155,7 @@ CopyNxt LD IX,ProcessAll LD HL,RightPanel .L1 LD DE,PANEL.CURR_PATH ADD HL,DE + LD (.NEWPATH),HL ; куда возвращать отредактированный путь LD DE,CurPath SUB A LD C,A @@ -183,7 +163,6 @@ CopyNxt LD IX,ProcessAll CP (HL) JR NZ,.L2 LD (DE),A - SUB A SUB C LD (PathLen),A LD IX,PathStr @@ -214,39 +193,40 @@ CopyNxt LD IX,ProcessAll W_BORDER 16,56,288,12 W_FILL 18,57,284,10,COLORI.WHITE W_END - SUB A - LD (COPY.OverWriteFlg),A - BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) - LD HL,LeftPanel - JR Z,.L4 - LD HL,RightPanel -.L4 LD BC,PANEL.CURR_PATH - ADD HL,BC - LD (COPY.PathSrc),HL - LD HL,CurPath - LD (COPY.PathDst),HL + LD HL,CurPath + LD DE,0 ; адрес отредактированного пути приемника +.NEWPATH EQU $-2 + XOR A + LD (COPY.OverWriteFlg),A +.NP1 LDI + CP (HL) + JR NZ,.NP1 + LD (DE),A + CALL DIRLIST.InitCopyDirs CALL PointerMouseClock PUSH IY GETPORT WINSP.CPU3 PUSH AF - BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) - LD A,(RAMPAGES.LEFTPANEL) - JR Z,.L3 - LD A,(RAMPAGES.RIGHTPANEL) -.L3 +; текущую директорию грузим в свободную страницу + LD A,(RAMPAGES.BuffPg3) SETPORT WINSP.CPU3,,0 + SET PANELFLAG.B_DIRPAGE,(IY + PANEL.PANELFLAG) + CALL ReadDIR + LD (CopyDir.CURR_PANEL),IY ; при копировании файла портится ; копирование файлов/директорий -CopyNextFile CALL PrintSrcDst - LD IX,(COPY.PathCurrFile) +CopyNextFile LD IX,(COPY.PathCurrFile) IF MARK_DIR BIT DIR.B_Dir,(IX + FileHDR.Attr) JR Z,.CopyFile -; копирование директории - CALL RESIDENT.Add2ListDir ; добавление имени диры в список - JR CopyNextFile +; заносим имя диры в список для дальнейшего копирования + CALL DIRLIST.ADD_DIRNAME + JP .NextHandle ENDIF - -.CopyFile LD L,(IX + FileHDR.SizeBytes) +; копирование файла/директории +.CopyFile PUSH IX + CALL PrintSrcDst + POP IX + LD L,(IX + FileHDR.SizeBytes) LD H,(IX + FileHDR.SizeBytes + 1) LD E,(IX + FileHDR.SizeBytes + 2) LD D,(IX + FileHDR.SizeBytes + 3) @@ -446,7 +426,7 @@ CopyNextFile CALL PrintSrcDst SPDSS DSSF.CLOSE LD A,(COPY.MemID) SPDSS DSSF.FREEMEM - LD IX,(COPY.PathCurrFile) +.NextHandle LD IX,(COPY.PathCurrFile) RES FileHDR.B_MARK,(IX + FileHDR.Flag) LD HL,(COPY.CopyBytes) LD E,(IX + FileHDR.SizeBytes) @@ -454,45 +434,451 @@ CopyNextFile CALL PrintSrcDst OR A SBC HL,DE LD (COPY.CopyBytes),HL - LD HL,(COPY.CopyBytes+2) + LD HL,(COPY.CopyBytes + 2) LD E,(IX + FileHDR.SizeBytes + 2) LD D,(IX + FileHDR.SizeBytes + 3) SBC HL,DE - LD (COPY.CopyBytes+2),HL + LD (COPY.CopyBytes + 2),HL LD HL,(COPY.CopyFiles) LD A,H OR L - JR Z,CopyEnd ; файлы кончились? + JR Z,CopyDir ; файлы кончились? DEC HL LD (COPY.CopyFiles),HL LD A,H OR L - JR Z,CopyEnd ; файлы кончились? + JR Z,CopyDir ; файлы кончились? LD HL,(COPY.PathCurrFile) LD DE,FileHDR.SIZE .L5 ADD HL,DE ; следующий описатель - IF MARK_DIR - LD A,(.FLAG_DIRCOPY) - AND A ; копируем только файлы? - JR Z,.L6 -; из-за копирования директорий файлы копируем все - INC HL - LD A,(HL) - AND A - JR NZ,.L7 ; файлы в дире еще не кончились -; файлы в дире кончились, смотреть оставшиеся диры в списке - CALL RESIDENT.CopyDir - ENDIF - -.L6 BIT FileHDR.B_MARK,(HL) + BIT FileHDR.B_MARK,(HL) JR Z,.L5 -.L7 LD (COPY.PathCurrFile),HL + LD (COPY.PathCurrFile),HL JP CopyNextFile -.FLAG_DIRCOPY DB 0 +; копирование директории +CopyDir LD IY,0 +.CURR_PANEL EQU $-2 + CALL DIRLIST.GET_DIRNAME ; получение имени диры, если есть + JP C,CopyEnd ; C=1 текущая дира кончилась или их нет + CALL DIRLIST.ADD_DIRLEVEL ; добавление списка диры + PUSH IY + LD HL,(COPY.PathDst) + SPDSS DSSF.MKDIR ; создание диры на приемнике +; CALL C,DOSError + LD HL,(COPY.PathSrc) + SPDSS DSSF.CHDIR ; смена текущего пути +; CALL C,DOSError + POP IY + LD A,(RAMPAGES.BuffPg3) + SET PANELFLAG.B_DIRPAGE,(IY + PANEL.PANELFLAG) + CALL ReadDIR + CALL DIRLIST.MARK_ALL ; маркировка всех файлов/дир + LD HL,0xC000 + FileHDR.SIZE + LD (COPY.PathCurrFile),HL + JP CopyNextFile + +BUF_MARKDIR +.DIR_NAME DZ " " ; имя текущей директории + +DIRLIST +; пометка всех файлов/дир +.MARK_ALL LD IX,0xC000 - FileHDR.SIZE + LD HL,0 + LD (COPY.CopyFiles),HL + LD BC,FileHDR.SIZE +.MLNEXT ADD IX,BC + LD A,(IX + FileHDR.Name) + AND A + RET Z + CP '.' + JR Z,.MLNEXT + SET FileHDR.B_MARK,(IX + FileHDR.Flag) + EXX + LD HL,COPY.CopyBytes + LD E,(IX + FileHDR.SizeBytes) + LD D,(IX + FileHDR.SizeBytes + 1) + LD C,(IX + FileHDR.SizeBytes + 2) + LD B,(IX + FileHDR.SizeBytes + 3) + CALL HLPBCDE + LD HL,(COPY.CopyFiles) + INC HL + LD (COPY.CopyFiles),HL + EXX + JR .MLNEXT + +; добавление имени диры в список, создание диры на приемнике +.ADD_DIRNAME PUSH IX + POP HL + INC HL + LD DE,BUF_MARKDIR.DIR_NAME + LD BC,8 + LDIR ; забрали имя диры до переключения паг + LD A,(RAMPAGES.FLX) + LD C,WINSP.CPU3 + IN B,(C) + PUSH BC + OUT (C),A + LD HL,0xC000 +.ANNEXT CALL GET_DWORD + LD A,B + OR C + JR Z,.ANFOUND + LD H,B + LD L,C + JR .ANNEXT + +.ANFOUND PUSH HL + LD HL,BUF_MARKDIR.DIR_NAME + LD BC,8 + LDIR ; занесли имя диры в список + POP HL + DEC HL + DEC HL + LD (HL),D + DEC HL + LD (HL),E + POP BC + OUT (C),B + RET + +.ADDNAME2PATH8 CALL .CHECK_BSLASH + LD (HL),'\\' + INC HL + EX DE,HL + LD BC,8 + LDIR + XOR A + LD (DE),A + 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 + +; отсечение пробелов в имени +.CUTOFFSPACES LD A,' ' +.COS2 DEC HL + CP (HL) + JR Z,.COS2 + INC HL + LD (HL),0 + RET + +; добавление уровня для дир +.ADD_DIRLEVEL LD A,(RAMPAGES.FLX) + LD C,WINSP.CPU3 + IN B,(C) + PUSH BC + OUT (C),A + LD HL,0xC000 +.ALNEXT CALL GET_DWORD + LD A,B + OR C + JR Z,.ALFOUND + LD H,B + LD L,C + JR .ALNEXT + +.ALFOUND LD (HL),D + DEC HL + LD (HL),E + LD H,D + LD L,E + INC DE + INC DE + INC DE + INC DE + LD (HL),E + INC HL + LD (HL),D + INC HL + LD (HL),0 + INC HL + LD (HL),0 + POP BC + OUT (C),B + RET + +; получение имени диры с удалением из списка +.GET_DIRNAME LD A,(RAMPAGES.FLX) + LD C,WINSP.CPU3 + IN B,(C) + PUSH BC + OUT (C),A +.GNRESTART LD HL,0xC000 +.GNNEXT CALL GET_DWORD + LD A,B + OR C + JR Z,.GNFOUND + DEC HL + LD (.GNEL1),HL + LD H,B + LD L,C + JR .GNNEXT + +.GNFOUND INC HL + EX DE,HL + AND A + SBC HL,DE + SRL H + RR L + SRL H + RR L + SRL H + RR L + LD B,H + LD C,L + EX DE,HL + LD DE,8 + AND A + SBC HL,DE + INC BC +.GNNEXT_FIND DEC BC + LD A,B + OR C + JR Z,.GNEND_LEVEL + ADD HL,DE + LD A,(HL) + AND A + JR Z,.GNNEXT_FIND + PUSH HL + EX DE,HL + PUSH DE + LD HL,(COPY.PathSrcEnd) + CALL .ADDNAME2PATH8 + EX DE,HL + CALL .CUTOFFSPACES + LD (COPY.PathSrcEnd),HL + POP DE + LD HL,(COPY.PathDstEnd) + CALL .ADDNAME2PATH8 + EX DE,HL + CALL .CUTOFFSPACES + LD (COPY.PathDstEnd),HL + POP HL + LD (HL),0 + POP BC + OUT (C),B + AND A + RET + +.GNEND_LEVEL LD HL,0 +.GNEL1 EQU $-2 + LD A,H + OR L + JR Z,.GNEL2 + XOR A + LD (HL),A + INC HL + LD (HL),A + LD DE,0xC000 + DWORD - 1 + EX DE,HL + SBC HL,DE + EX DE,HL + JR Z,.GNEL2 + LD HL,(COPY.PathSrcEnd) + CALL .GNEL4 + LD (COPY.PathSrcEnd),HL + LD HL,(COPY.PathDstEnd) + CALL .GNEL4 + LD (COPY.PathDstEnd),HL + JP .GNRESTART + +.GNEL4 DEC HL + LD A,'\\' +.GNEL3 DEC HL + CP (HL) + JR NZ,.GNEL3 + INC HL + LD (HL),0 + RET + +.GNEL2 POP BC + OUT (C),B + SCF + RET + +; инициализация копирования директории с содержимым +.InitCopyDirs BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,LeftPanel + PANEL.CURR_PATH ; для пути откуда копировать + LD DE,RightPanel + PANEL.CURR_PATH ; для пути куда копировать + JR Z,.L1 + EX DE,HL +; включаем пагу с директорией текущей панели +.L1 LD (COPY.PathSrc),HL + EX DE,HL + LD (COPY.PathDst),HL +.L2 INC HL + CP (HL) + JR NZ,.L2 + LD (COPY.PathDstEnd),HL + EX DE,HL + XOR A +.L3 INC HL + CP (HL) + JR NZ,.L3 + LD (COPY.PathSrcEnd),HL +; инит в странице списков директорий + GETPORT WINSP.CPU3 + EX AF,AF' + LD A,(RAMPAGES.FLX) + SETPORT WINSP.CPU3,,0 + LD HL,0xC000 + LD (HL),LOW (0xC000 + DWORD) + INC HL + LD (HL),HIGH (0xC000 + DWORD) + INC HL + LD D,H + LD E,L + INC DE + LD BC,FileHDR.Name_Size * 2 + LD (HL),B + LDIR + EX AF,AF' + SETPORT WINSP.CPU3,,0 + RET + +; сохранение путей панелей +StorePaths LD HL,LeftPanel + PANEL.CURR_PATH + LD DE,REZ2_BUFFERS.OLDLEFTPANEL + LD BC,PANEL.CURR_PATH_Size + LDIR + LD HL,RightPanel + PANEL.CURR_PATH + LD DE,REZ2_BUFFERS.OLDRIGHTPANEL + LD BC,PANEL.CURR_PATH_Size + LDIR + RET + +; восстановление путей панелей +RestorePaths LD HL,REZ2_BUFFERS.OLDLEFTPANEL + LD DE,LeftPanel + PANEL.CURR_PATH + LD BC,PANEL.CURR_PATH_Size + LDIR + LD HL,REZ2_BUFFERS.OLDRIGHTPANEL + LD DE,RightPanel + PANEL.CURR_PATH + LD BC,PANEL.CURR_PATH_Size + LDIR + RET + +; подсчет в байтах размера отмеченной директории +CalcDirSizeR: PUSH IX + PUSH IY + GETPORT WINSP.CPU3 + PUSH AF ; текущий номер страницы + LD (.CURR_PANEL),IY + LD A,(RAMPAGES.BuffPg3) + SET PANELFLAG.B_DIRPAGE,(IY + PANEL.PANELFLAG) + CALL ReadDIR + LD A,(RAMPAGES.BuffPg3) + SETPORT WINSP.CPU3,,0 + LD A,HIGH (CPU3) + CALL GET_HANDLE_ADR + LD (COPY.PathCurrFile),HL + XOR A + LD H,A + LD L,A + LD (JUMPS.FILES_BYTES),HL + LD (JUMPS.FILES_BYTES + 2),HL ; обнуление размера диры + LD (JUMPS.FILES_COUNT),HL ; обнуление количества файлов + LD (COPY.CopyFiles),HL + CALL StorePaths + CALL DIRLIST.InitCopyDirs +.NextDirFile LD IX,(COPY.PathCurrFile) + BIT DIR.B_Dir,(IX + FileHDR.Attr) + JR Z,.NextFile +; заносим имя диры в список для дальнейшего использования + CALL DIRLIST.ADD_DIRNAME + JP .NextHandle + +; для файла добавляем его размер и количество +1 +.NextFile LD HL,(JUMPS.FILES_COUNT) + INC HL + LD (JUMPS.FILES_COUNT),HL ; инкремент количества файлов + PUSH IX + POP DE + LD HL,FileHDR.SizeBytes + ADD HL,DE + CALL GET_DWORD + LD HL,JUMPS.FILES_BYTES + CALL HLPBCDE ; добавили к текущему размеру +; проверка на окончание описателей +.NextHandle LD HL,(COPY.CopyFiles) + LD A,H + OR L + JR Z,.ENDDIR + DEC HL + LD A,H + OR L + JR Z,.ENDDIR + LD (COPY.CopyFiles),HL + LD HL,(COPY.PathCurrFile) + LD DE,FileHDR.SIZE +.L5 ADD HL,DE ; следующий описатель + BIT FileHDR.B_MARK,(HL) + JR Z,.L5 + LD (COPY.PathCurrFile),HL + JP .NextDirFile + +.ENDDIR LD IY,0 +.CURR_PANEL EQU $-2 + CALL DIRLIST.GET_DIRNAME ; получение имени диры, если есть + JP C,.CalcEnd ; C=1 текущая диры кончилась или их нет + CALL DIRLIST.ADD_DIRLEVEL ; добавление списка диры + PUSH IY + LD HL,(COPY.PathSrc) + SPDSS DSSF.CHDIR ; смена текущего пути +; CALL C,DOSError + POP IY + LD A,(RAMPAGES.BuffPg3) + SET PANELFLAG.B_DIRPAGE,(IY + PANEL.PANELFLAG) + CALL ReadDIR + CALL DIRLIST.MARK_ALL ; маркировка всех файлов/дир + LD HL,0xC000 + FileHDR.SIZE + LD (COPY.PathCurrFile),HL + JP .NextDirFile + +.CalcEnd CALL RestorePaths + POP AF + SETPORT WINSP.CPU3,,0 + POP IY + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) + LD HL,LeftPanel + PANEL.CURR_PATH + JR Z,.CD1 + LD HL,RightPanel + PANEL.CURR_PATH +.CD1 +; LD HL,(COPY.PathSrc) + PUSH IY + SPDSS DSSF.CHDIR + POP IY + POP IX + RET + ; завершение копирования -CopyEnd POP AF +CopyEnd CALL RestorePaths + POP AF SETPORT WINSP.CPU3,,0 POP IY WINDOWCLOSE @@ -513,6 +899,7 @@ CopyEnd POP AF LD IY,RightPanel JR Z,.L1 LD IY,LeftPanel +; обновление панели приемника .L1 PUSH IY POP HL LD DE,PANEL.CURR_PATH @@ -525,6 +912,7 @@ CopyEnd POP AF POP AF CALL NC,RefreshDIR POP IY +; обновление панели источника PUSH IY POP HL LD DE,PANEL.CURR_PATH @@ -532,12 +920,19 @@ CopyEnd POP AF PUSH IY SPDSS DSSF.CHDIR POP IY + PUSH AF + CALL C,DOSError + POP AF + PUSH AF + CALL NC,RefreshDIR + POP AF JP C,BegDIRECTORY CALL PrintDIR CALL PrnFileInfo JP PointerMousePointer -CopyError3: ; Если нет места на диске для копирования ;!FIXIT оптимизировать +; !FIXIT оптимизировать +CopyError3: ; Если нет места на диске для копирования POP HL ; снимаем лишнее POP DE ; тут лежит AF PUSH AF @@ -706,22 +1101,7 @@ OverExit INC SP POP IY JP CopyEnd -;-------------------------------------------------------------- -COPY -.PathCurrFile DW 0 ; Адрес описателя текущего файла/диры -.PathSrc DW 0 ; Адрес пути источника -.PathDst DW 0 ; Адрес пути приемника -.CopyFiles DW 0 ; Количество копируемых файлов -.CopyBytes DB 5 DUP 0 ; Количество копируемых байтов -.OverWriteFlg DB 0 ; Флаг перезаписи файлов -.FreeBanks DW 0 ; Количество свободных банков -.CurrReadBytes DD 0 ; Длина читаемого файла -.CurrWriteBytes DD 0 ; Длина записываемого файла -.FHandleSrc DB 0 ; Файл источник -.FHandleDst DB 0 ; Файл приемник -.MemID DB 0 ; Идентификатор памяти под копирование -;-------------------------------------------------------------- - +; Конверсия размера в байтах в количество страниц ; На входе: ; DEHL - количество байт ; На выходе: @@ -858,11 +1238,17 @@ ProcessOne DW 178 ; X DW 0 DB COLORP.BLUE + COLORI.WHITE -PathStr DB 0x80,0x00,0x00,0x00 -PathLen DB 0x00 - DW 170,106,324 - DB 0xF0 -CurPath DB 0x81 DUP 0 +; описатель строки +PathStr DB 255 ; +00 Максимальная длина строки + DB 0 ; +01 Флаг готовности + DB 0 ; +02 текущая X позиция курсора + DB 0 ; +03 текущая AddX +PathLen DB 0 ; +04 количество введенных символов + DW 170 ; +05 X позиция строки на экране + DW 106 ; +07 Y позиция строки на экране + DW 324 ; +09 X длина строки на экране + DB COLORP.WHITE + COLORI.BLACK ; +0B Цвет строки +CurPath DB 256 DUP 0 ; +0C ...сама строка ;[]==========================================================[] ReNameR LD A,(IY + PANEL.FILES_ALL) @@ -888,9 +1274,6 @@ ReNameR LD A,(IY + PANEL.FILES_ALL) ADD HL,HL ADD HL,HL ADD HL,HL -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H INC HL @@ -898,7 +1281,7 @@ ReNameR LD A,(IY + PANEL.FILES_ALL) LD DE,CurName LD BC,0x000D LDIR - LD A,DIR.M_Dir;0x10 + LD A,DIR.M_Dir LD (CurAttrib),A JR ReNameN @@ -909,9 +1292,6 @@ ReNameNr ADD HL,HL ; *2 LD D,H ADD HL,HL ; *10 ADD HL,DE ; *18 -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H ; | 0xC000 PUSH HL @@ -919,7 +1299,7 @@ ReNameNr ADD HL,HL ; *2 LD DE,CurName CALL MakeDOSname POP HL - LD BC,FileHDR.Attr;0x000E + LD BC,FileHDR.Attr ADD HL,BC LD A,(HL) LD (CurAttrib),A @@ -980,7 +1360,8 @@ RNfile EQU $ - STRLEN(" ") - 2 LD A,(NameLen) OR A RET Z - ;[ ] -баг при переименовании файла в буфере Name в конце имени файла не всегда стоял закрывающий 0 когда надо. ILDel1 + ; [ ] -баг при переименовании файла в буфере Name в конце имени + ; файла не всегда стоял закрывающий 0 когда надо. ILDel1 LD HL,Name LD E,A LD D,0 @@ -1141,9 +1522,6 @@ ReNameDIR LD HL,Name ADD HL,HL ; *4 ADD HL,HL ; *8 ADD HL,HL ; *10 -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H EX DE,HL @@ -1157,11 +1535,7 @@ ReNameTree BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) ADD HL,DE INC HL INC HL - IF TREE_REZID CALL FindTreeDIRR - ELSE - CALL FindTreeDIRR - ENDIF JP C,ReNameT LD HL,0xC001 - 0x10 LD BC,0x0010 @@ -1285,17 +1659,9 @@ ReNameExt1 INC SP LD DE,PANEL.BAR_X ADD IX,DE CALL DrawVScrollBar - IF TREE_REZID CALL TestTreeR.TestTreeBeg - ELSE - CALL TestTreeR.TestTreeBeg - ENDIF PUSH IY - IF TREE_REZID CALL MakeTreePathR - ELSE - CALL MakeTreePathR - ENDIF EX DE,HL BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD IY,RightPanel @@ -1481,11 +1847,7 @@ MkDIR0 LD HL,NewDIR ADD HL,DE INC HL INC HL - IF TREE_REZID CALL FindTreeDIRR - ELSE - CALL FindTreeDIRR - ENDIF JP C,MkDIRn LD HL,0xC001 - 0x10 LD BC,0x0010 @@ -1503,9 +1865,6 @@ FnTree1 LD L,(IY + PANEL.FIRST_FILE) ADD HL,HL ADD HL,HL ADD HL,HL -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H FnTree2 LD E,(HL) @@ -1562,9 +1921,6 @@ MkDIRend PUSH HL ADD HL,HL ADD HL,HL ADD HL,HL -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H PUSH HL @@ -1737,9 +2093,6 @@ DeleteFilesR LD A,(IY + PANEL.FILES_ALL) ADD HL,HL ADD HL,HL ADD HL,HL -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H LD (AdrDelFile),HL @@ -1753,9 +2106,6 @@ DelFile ADD HL,HL LD D,H ADD HL,HL ADD HL,DE -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H LD (AdrDelFile),HL @@ -1877,9 +2227,7 @@ DeleteFlag DEFB 0x00 MakeDELname LD HL,(AdrDelFile) INC HL BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) -; JR NZ,MakeDELn1 JP Z,MakeDOSname -;MakeDELn1 INC HL SUB A .L1 LDI @@ -1964,13 +2312,13 @@ DelDel0 LD IX,(AdrDelFile) PUSH DE CALL MakeDELname POP HL - LD C,DSSF.RMDIR ;0x1C ;RMDIR + LD C,DSSF.RMDIR BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) JR NZ,DelDel1 LD A,(IX + FileHDR.Attr) BIT DIR.B_Dir,A JR NZ,DelDel1 - LD C,DSSF.DELETE ;0x0E ;DELETE + LD C,DSSF.DELETE DelDel1 PUSH IY SPDSS POP IY @@ -2050,9 +2398,9 @@ DelFrom EQU $-2 POP HL LD A,(IX + FileHDR.Attr) BIT DIR.B_Dir,A - LD C,DSSF.DELETE ;0x0E ;DELETE + LD C,DSSF.DELETE JR Z,.L3 - LD C,DSSF.RMDIR ;0x1C ;RMDIR + LD C,DSSF.RMDIR .L3 PUSH IY SPDSS POP IY @@ -2177,11 +2525,7 @@ DelTreeDIR1 LD A,(DeleteFlag) ADD HL,DE INC HL INC HL - IF TREE_REZID CALL FindTreeDIRR - ELSE - CALL FindTreeDIRR - ENDIF JP C,DelDIRn LD HL,0xC001-0x10 LD BC,0x0010 @@ -2231,15 +2575,12 @@ DelTree1 LD L,(IY + PANEL.FIRST_FILE) ADD HL,HL ADD HL,HL ADD HL,HL -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H DelTree2 LD E,(HL) INC HL LD A,(HL) - LD BC,FileHDR.Attr;0x000E + LD BC,FileHDR.Attr ADD HL,BC LD D,(HL) INC HL @@ -2254,9 +2595,6 @@ DelTree2 LD E,(HL) ADD HL,HL ADD HL,HL ADD HL,HL -; LD A,H -; OR 0xC0 -; LD H,A SET 6,H SET 7,H OR A @@ -2405,11 +2743,7 @@ DeleteExt1 INC SP ADD IX,DE CALL InitScrollBar CALL DrawVScrollBar - IF TREE_REZID CALL MakeTreePathR - ELSE - CALL MakeTreePathR - ENDIF PUSH IY BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD IY,RightPanel @@ -2421,41 +2755,20 @@ DeleteExt1 INC SP DelName DB 13 DUP 0 -;[]==========================================================[] -QuitConfirmWin - MAKEWINDOW WINSUBOBJ.STORE - W_MAIN 208,88,224,50 - W_FILL 4,2,216,10,COLORI.BLACK - W_TEXT 104,3,COLORI.WHITE,"Quit" - W_TEXT 28,19,COLORP.HIGHGRAY,"Do you want quit Flex Navigator ?" - W_BUTTON 32,32,72,14 - W_TEXT 58,35,COLORP.HIGHGRAY,"Yes" - W_BUTTON 120,32,72,14 - W_TEXT 150,35,COLORP.HIGHGRAY,"No" - W_END -.Loop LD IX,REZ2TAB.QuitTab - CALL CheckCoordsMouse - SPDSS DSSF.SCANKEY - JR Z,.Loop - LD A,B - OR A - JR NZ,.Loop - LD A,E - CP 0x1B - JR Z,.Abort - CP 0x0D - JR Z,.OK - RES 5,A - CP 'Y' - JR Z,.OK - CP 'N' - JR NZ,.Loop -.Abort - WINDOWCLOSE - SCF - RET - -.OK - WINDOWCLOSE - OR A - RET +;-------------------------------------------------------------- +COPY +.PathCurrFile DW 0 ; Адрес описателя текущего файла/диры +.PathSrc DW 0 ; Адрес пути источника +.PathDst DW 0 ; Адрес пути приемника +.PathSrcEnd DW 0 ; Адрес хвоста пути источника +.PathDstEnd DW 0 ; Адрес хвоста пути приемника +.CopyFiles DW 0 ; Количество копируемых файлов +.CopyBytes DB 5 DUP 0 ; Количество копируемых байтов +.OverWriteFlg DB 0 ; Флаг перезаписи файлов +.FreeBanks DW 0 ; Количество свободных банков +.CurrReadBytes DD 0 ; Длина читаемого файла +.CurrWriteBytes DD 0 ; Длина записываемого файла +.FHandleSrc DB 0 ; Файл источник +.FHandleDst DB 0 ; Файл приемник +.MemID DB 0 ; Идентификатор памяти под копирование +;-------------------------------------------------------------- diff --git a/rez2_fnsearch.a80 b/rez2_fnsearch.a80 index 7270885..7e8da85 100644 --- a/rez2_fnsearch.a80 +++ b/rez2_fnsearch.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 31.07.2025 savelij +; LAST UPDATE: 07.09.2025 savelij ;[]==========================================================[] QSearchR LD A,(IY+PANEL.FILES_ALL) @@ -120,7 +120,7 @@ InsSymbolSrch CP 0x20 LD B,0x00 PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE LD E,(IX+0x04) ADD HL,DE @@ -130,7 +130,7 @@ InsSymbolSrch CP 0x20 LDDR NotInsSrch PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE LD E,(IX+0x02) ADD HL,DE @@ -198,7 +198,7 @@ QSdelet LD A,(IX+0x02) RET Z PUSH IX POP HL - LD DE,LenInpData + LD DE,INPUTFORM.BUFLINE ADD HL,DE LD E,(IX+0x02) ADD HL,DE @@ -378,9 +378,5 @@ SrchExit POP HL SearchExit WINDOWCLOSE BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) - IF TREE_REZID - CALL NZ,TestTreeR.TestTreeBeg - ELSE - CALL NZ,TestTreeR.TestTreeBeg - ENDIF + JP NZ,TestTreeR.TestTreeBeg RET diff --git a/rez2_fntab.a80 b/rez2_fntab.a80 index 4133c8a..c72aa29 100644 --- a/rez2_fntab.a80 +++ b/rez2_fntab.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 15.08.2025 savelij ;[]==========================================================[] ; Формат таблицы @@ -102,15 +102,5 @@ REZ2TAB DW 0,640,136,256,%0000000100100000,0,DelExit,0 DW 0x8000 -;[]===============================================================[] -.QuitTab: - DW 240,312,120,134,%0000000000100001,0,QuitConfirmWin.OK,0 - DW 328,400,120,134,%0000000000100001,0,QuitConfirmWin.Abort,0 - DW 0,208, 0,256,%0000000000100000,0,QuitConfirmWin.Abort,0 - DW 432,640, 0,256,%0000000000100000,0,QuitConfirmWin.Abort,0 - DW 0,640, 0, 88,%0000000000100000,0,QuitConfirmWin.Abort,0 - DW 0,640,138,256,%0000000000100000,0,QuitConfirmWin.Abort,0 - DW 0x8000 - .EmptyTab: DW 0,640, 0,256,%0000000000000000,0,InputLine.InputLineExitCancel,0 DW 0x8000 diff --git a/rez3_fnmark.a80 b/rez3_fnmark.a80 index 1e3a848..ba93c3b 100644 --- a/rez3_fnmark.a80 +++ b/rez3_fnmark.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 07.09.2025 savelij ;[]==========================================================[] MarkFileR LD A,(IY+PANEL.FILES_ALL) @@ -15,20 +15,8 @@ MarkFileR LD A,(IY+PANEL.FILES_ALL) 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 A,HIGH (CPU3) + CALL GET_HANDLE_ADR LD E,(HL) ; FileHDR.Flag POP AF SETPORT WINSP.CPU3,,0 @@ -64,20 +52,8 @@ UnSelectFile: LD IXL,0x00 .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 + LD A,HIGH (CPU3) + CALL GET_HANDLE_ADR PUSH HL LD DE,FileHDR.Attr ADD HL,DE @@ -85,9 +61,13 @@ UnSelectFile: LD IXL,0x00 POP HL BIT DIR.B_Dir,C ; это дира? IF MARK_DIR - CALL NZ,CountingDirR ; измерение размера диры + PUSH HL + PUSH BC + CALL NZ,RESIDENT.CalcDirSize ; измерение размера диры + POP BC + POP HL ELSE - JR NZ,.MrFile1 ; дирекории копировать не умеем, только файлы + JR NZ,.MrFile1 ; директории копировать не умеем, только файлы ENDIF ; это файл LD B,(HL) ; старое состояние пометки файла @@ -98,10 +78,10 @@ UnSelectFile: LD IXL,0x00 PUSH BC LD BC,FileHDR.SIZE LDIR + IF MARK_DIR BIT DIR.B_Dir,A ; файл или дира JR Z,.L8 - IF MARK_DIR -; копируем размер в байтах из размера диры +; копируем размер в байтах в размер диры LD HL,JUMPS.FILES_BYTES LD DE,WorkBuffer + FileHDR.SizeBytes LD BC,DWORD @@ -467,14 +447,14 @@ SMask21 LD (DE),A SelectAllR: CALL ResInvert SelectAllRN: LD HL,SetInvert PUSH HL - LD A,(IY+PANEL.FILES_ALL) - OR (IY+PANEL.FILES_ALL + 1) + LD A,(IY + PANEL.FILES_ALL) + OR (IY + PANEL.FILES_ALL + 1) RET Z - BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) RET NZ GETPORT WINSP.CPU3 PUSH AF - BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L1 LD A,(RAMPAGES.RIGHTPANEL) @@ -496,6 +476,8 @@ SelectAllRN: LD HL,SetInvert EX AF,AF' ; [ ] fat32 .loop: BIT DIR.B_Dir,(IX + FileHDR.Attr) ;!HARDCODE DIRECTORY JR NZ,.SelAll1 +; маркировка только файлов + PUSH BC SET FileHDR.B_MARK,(IX + FileHDR.Flag) LD C,(IX + FileHDR.SizeBytes) LD B,(IX + FileHDR.SizeBytes + 1) @@ -511,7 +493,8 @@ SelectAllRN: LD HL,SetInvert EXX INC HL EXX - LD BC,FileHDR.SIZE +; LD BC,FileHDR.SIZE + POP BC .SelAll1: ADD IX,BC LD A,(IX + FileHDR.Name) OR A @@ -534,7 +517,7 @@ SelectAllRN: LD HL,SetInvert LD (IY+PANEL.BYTES_MARK + 3),D ; [ ] FAT32 EX AF,AF' - LD (IY+PANEL.BYTES_MARK_H),A + LD (IY + PANEL.BYTES_MARK_H),A CALL PrintDIR JP PrnFileInfo @@ -542,13 +525,13 @@ SelectAllRN: LD HL,SetInvert UnSelectAllR: CALL ResInvert UnSelectAllRN: LD HL,SetInvert PUSH HL - LD A,(IY+PANEL.FILES_ALL) - OR (IY+PANEL.FILES_ALL + 1) + LD A,(IY + PANEL.FILES_ALL) + OR (IY + PANEL.FILES_ALL + 1) RET Z - BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) + BIT VIEWFLAG.B_TREE,(IY + PANEL.VIEWFLAG) RET NZ - LD A,(IY+PANEL.FILES_MARK) - OR (IY+PANEL.FILES_MARK + 1) + LD A,(IY + PANEL.FILES_MARK) + OR (IY + PANEL.FILES_MARK + 1) RET Z PUSH IY POP HL @@ -560,7 +543,7 @@ UnSelectAllRN: LD HL,SetInvert DJNZ .L2 GETPORT WINSP.CPU3 PUSH AF - BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) + BIT PANELFLAG.B_SIDE,(IY + PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L1 LD A,(RAMPAGES.RIGHTPANEL) @@ -678,619 +661,3 @@ SUB_SIZE: EX AF,AF' ; [ ] fat32 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 в конце имени - -; при копировании найдена дира -; занесение в путь источника имени диры -; занесение в путь приемника имени диры -; занесение в список ".." для выхода diff --git a/rez3_fnmisc.a80 b/rez3_fnmisc.a80 index 1cd5d93..00b340a 100644 --- a/rez3_fnmisc.a80 +++ b/rez3_fnmisc.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 02.09.2025 savelij ;[]==========================================================[] VersionR @@ -57,21 +57,23 @@ FileInfoR LD A,(IY+PANEL.FILES_ALL) 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 - ADD HL,HL - ADD HL,HL - LD E,L - LD D,H - ADD HL,HL - ADD HL,DE - LD A,H - OR 0xC0 - LD H,A +; 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 +; LD E,L +; LD D,H +; ADD HL,HL +; ADD HL,DE +; LD A,H +; OR 0xC0 +; LD H,A + LD A,HIGH (CPU3) + CALL GET_HANDLE_ADR LD DE,WorkBuffer LD BC,0x0018 LDIR @@ -697,21 +699,23 @@ PrintFileR LD A,(IY+PANEL.FILES_ALL) 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 - ADD HL,HL - ADD HL,HL - LD E,L - LD D,H - ADD HL,HL - ADD HL,DE - LD A,H - OR 0xC0 - LD H,A +; 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 +; LD E,L +; LD D,H +; ADD HL,HL +; ADD HL,DE +; LD A,H +; OR 0xC0 +; LD H,A + LD A,HIGH (CPU3) + CALL GET_HANDLE_ADR LD DE,WorkBuffer LD BC,0x0018 LDIR @@ -955,3 +959,42 @@ PrnFileName: DB 13 DUP 0 PrnFileLen: DB 4 DUP 0 PrnMIndef: DB 0 PrnFHandle: DB 0 + +;[]==========================================================[] +QuitConfirmWin + MAKEWINDOW WINSUBOBJ.STORE + W_MAIN 208,88,224,50 + W_FILL 4,2,216,10,COLORI.BLACK + W_TEXT 104,3,COLORI.WHITE,"Quit" + W_TEXT 28,19,COLORP.HIGHGRAY,"Do you want quit Flex Navigator ?" + W_BUTTON 32,32,72,14 + W_TEXT 58,35,COLORP.HIGHGRAY,"Yes" + W_BUTTON 120,32,72,14 + W_TEXT 150,35,COLORP.HIGHGRAY,"No" + W_END +.Loop LD IX,REZ3TAB.QuitTab + CALL CheckCoordsMouse + SPDSS DSSF.SCANKEY + JR Z,.Loop + LD A,B + OR A + JR NZ,.Loop + LD A,E + CP 0x1B + JR Z,.Abort + CP 0x0D + JR Z,.OK + RES 5,A + CP 'Y' + JR Z,.OK + CP 'N' + JR NZ,.Loop +.Abort + WINDOWCLOSE + SCF + RET + +.OK + WINDOWCLOSE + OR A + RET diff --git a/rez3_fnnext.a80 b/rez3_fnnext.a80 index 2fb355d..f07c5dd 100644 --- a/rez3_fnnext.a80 +++ b/rez3_fnnext.a80 @@ -1,15 +1,15 @@ -; LAST UPDATE: 13.08.2025 savelij +; LAST UPDATE: 15.08.2025 savelij ;[]==========================================================[] InitExtention: LD HL,INIFILES.ExtName1 - LD DE,BUFFERS.fn_ext + LD DE,REZ3_BUFFERS.fn_ext CALL InitExt LD HL,INIFILES.ExtName2 - LD DE,BUFFERS.fnview_ext + LD DE,REZ3_BUFFERS.fnview_ext CALL InitExt LD HL,INIFILES.ExtName3 - LD DE,BUFFERS.fnedit_ext + LD DE,REZ3_BUFFERS.fnedit_ext ;[]----------------------------------------------------------[] InitExt: LD (.EXTdata),DE SPDSS DSSF.OPEN,,1 diff --git a/rez3_fntab.a80 b/rez3_fntab.a80 index fe84e4c..c0cf155 100644 --- a/rez3_fntab.a80 +++ b/rez3_fntab.a80 @@ -1,5 +1,5 @@ -; LAST UPDATE: 14.08.2025 savelij +; LAST UPDATE: 15.08.2025 savelij ;[]==========================================================[] ; Формат таблицы @@ -74,3 +74,13 @@ REZ3TAB ;[]===============================================================[] .PrintFTab: DW 284,356,128,142,%0000000000000001,0,StopPrint,0 DW 0x8000 + +;[]===============================================================[] +.QuitTab: + DW 240,312,120,134,%0000000000100001,0,QuitConfirmWin.OK,0 + DW 328,400,120,134,%0000000000100001,0,QuitConfirmWin.Abort,0 + DW 0,208, 0,256,%0000000000100000,0,QuitConfirmWin.Abort,0 + DW 432,640, 0,256,%0000000000100000,0,QuitConfirmWin.Abort,0 + DW 0,640, 0, 88,%0000000000100000,0,QuitConfirmWin.Abort,0 + DW 0,640,138,256,%0000000000100000,0,QuitConfirmWin.Abort,0 + DW 0x8000