; LAST UPDATE: 14.08.2025 savelij ;[]=======================================================================[] ; FLEX NAVIGATOR ; ; v1.11 ; ; Last edition: 03/02/2000 ; ;[]=======================================================================[] include fn_const.a80 include fn_macros.a80 PHASE BASE_ADDR START_BLOCK_1 JP MainStartFN ; entry point JP ClearScreen JP MakeWindow JP ReplaceColorRectan JP PrintTxtLine_IFF JP PrintTxtLine JP PrintTxtLineNumsChar JP PrintPathLeft JP PrintPathRight JP PrintPathCentr JP InputLine JP InputLine.InputLineExitOk JP InputLine.InputLineExitCancel JP DOSError JP InitScrollBar JP DrawHScrollBar JP DrawVScrollBar JP InitProgressBar JP DrawProgressBar DB JUMPS.JUMPSIZE * 5 DUP 0xC9 JP WaitUnpressMouse JP CheckCoordsMouse JP CMOSPrintDateTime DB JUMPS.JUMPSIZE * 1 DUP 0xC9 JP PointerMouseClock JP PointerMousePointer DB JUMPS.JUMPSIZE * 4 DUP 0xC9 JP ConvertNumbers_40b JP MoveBytesInc JP MoveBytesDec JP Mul_8X8_16b JP Mul_16X8_24b JP Mul_16X16_16b JP Mul_16X16_32b JP Mul_32X16_32b JP Div_16X16_16b_16b JP Div_24X16_8b_16b JP Div_32X16_16b_16b JP Div_32X16_32b_16b JP ConvertNumbers_32b JP ConvertNumbers_16b JP ConvertNumbers_8b JP atoi_32b JP atoi_16b JP Resident DB 0xC0 - LOW ($) DUP 0xC9 NUM_DEVICES DB 0 ; Количество устройств TreeFlag DB 0 ; Флаг дерева CMOSFlag DB 0 ; Флаг CMOS 0 - нет ; 1 - есть MouseFlag DB 1 ; Флаг мыши 0 - нет ; 1 - есть CMOSPrint: DB 1 ; Флаг разрешения печати даты времени ; 1 - запрещено, 0 - разрешено RAMPAGES .FNPAGESID DB 0 ; Индентификатор памяти где FN .FNREZ2 DB 0 ; 0 Страница с функциями FN .FNFONT DB 0 ; 1 Страница шрифтов .FNREZ3 DB 0 ; 2 Страница еще немного функций FN ; Буферные страницы под интерфейс .BufferID DB 0 ; Индентификатор памяти под буфера .FLX DB 0 ; 0 Страница для загрузки FLX плагинов .LEFTPANEL DB 0 ; 1 Страница каталога Левой панели .RIGHTPANEL DB 0 ; 2 Страница каталога Правой панели .BuffPg1 DB 0 ; 3 .BuffPg2 DB 0 ; 4 .BuffPg3 DB 0 ; 5 .BuffPg4 DB 0 ; 6 .BuffPgEnd DB 0xFF .FILES_COUNT DW 0 ; количество помеченных файлов .FILES_BYTES DB 5 DUP 0 ; размер помеченных файлов в байтах DB LOW (-$) DUP 0 ; UI palette & stack memory ; PALETTE: B G R DB 0x00,0x00,0x00,0x00 ; Black 00 00 DB 0x00,0x00,0xFF,0x00 ; B.Red 01 DB 0x00,0x80,0x00,0x00 ; Green 02 08 DB 0x00,0xFF,0xFF,0x00 ; B.Yellow 03 DB 0x80,0x00,0x00,0x00 ; Blue 04 10 DB 0xFF,0xFF,0x00,0x00 ; Invert paper 05 DB 0x80,0x00,0x00,0x00 ; Invert ink 06 18 DB 0x80,0x80,0x80,0x00 ; BlackGray 07 DB 0xC0,0xC0,0xC0,0x00 ; HighGray 08 20 DB 0x80,0x00,0x00,0x00 ; Panel 09 DB 0xFF,0xFF,0x00,0x00 ; Files 0A 28 DB 0x00,0xFF,0xFF,0x00 ; Select Files 0B DB 0x00,0xFF,0xFF,0x00 ; InvSel Files 0C 30 DB 0xC0,0xC0,0xC0,0x00 ; Reserved 0D DB 0xFF,0xFF,0xFF,0x00 ; White 0E 38 DB 0xFF,0xFF,0xFF,0x00 ; White 0F ; discription of flex navigator file panels LeftPanel: DB 0x80 ; Флаг панели бит 7 - бит выделенности ; бит 0 - номер панели DB 0x00 ; Флаг вида панели 0 - краткая панель ; бит 0 - подробная панель ; бит 1 - дерево ; бит 2 - ужатое дерево DB 0x01 ; Вид сортировки ; бит 0 - по имени ; бит 1 - по расширению ; бит 2 - по размеру ; бит 3 - по дате ; бит 4 - execute file ; бит 5 - file mask DW 4 ; X позиция панели DW 0 ; X позиция скролбара DW 0 ; Y позиция скролбара DW 0 ; Max длина скролбара DW 0 ; тек.длина скролбара DW 0 ; Адрес ячейки BarLeft DW 0 ; Адрес ячейки BarRight DW 0 ; Кол-во файлов на странице DW 0 ; Общее кол-во файлов DW 0 ; Первый файл на странице DW 0 ; Tекущий файл на странице DW 0 ; Кол-во маркированных файлов DD 0 ; Кол-во маркированных байтов DB 0 DB "*.*" ; Maска для файлов DB 0x0A DUP 0 DB PANEL.CURR_PATH_Size DUP 0 ; Путь к текущей директории RightPanel: DB 0x01 ; Флаг панели бит 7 - бит выделенности ; бит 0 - номер панели DB 0x00 ; Флаг вида панели 0 - краткая панель ; бит 0 - подробная панель ; бит 1 - дерево ; бит 2 - ужатое дерево DB 0x01 ; Вид сортировки ; бит 0 - по имени ; бит 1 - по расширению ; бит 2 - по размеру ; бит 3 - по дате ; бит 4 - execute file ; бит 5 - file mask DW 324 ; X позиция панели DW 0 ; X позиция скролбара DW 0 ; Y позиция скролбара DW 0 ; Max длина скролбара DW 0 ; тек.длина скролбара DW 0 ; Адрес ячейки BarLeft DW 0 ; Адрес ячейки BarRight DW 0 ; Кол-во файлов на странице DW 0 ; Общее кол-во файлов DW 0 ; Первый файл на странице DW 0 ; Tекущий файл на странице DW 0 ; Кол-во маркированных файлов DD 0 ; Кол-во маркированных байтов DB 0 DB "*.*" ; Maска для файлов DB 0x0A DUP 0 DB PANEL.CURR_PATH_Size DUP 0 ; Путь к текущей директории thanks DZ "\r\nThank you for using Flex Navigator.\r\n" DOSError EX AF,AF' GETPORT WINSP.CPU1 PUSH AF LD A,(RAMPAGES.FNREZ2) SETPORT WINSP.CPU1,,0 EX AF,AF' CALL DOSErrorR EX AF,AF' POP AF SETPORT WINSP.CPU1,,0 EX AF,AF' RET Resident LD (.ResCall),DE IN B,(C) PUSH BC OUT (C),A CALL 0x0000 .ResCall EQU $-2 POP BC OUT (C),B RET ; (ADR) + BCDE = BCDE BCDEHLP: LD A,(HL) INC HL ADD A,E LD E,A LD A,(HL) INC HL ADC A,D LD D,A LD A,(HL) INC HL ADC A,C LD C,A LD A,(HL) ADC A,B LD B,A RET ; (ADR) + BCDE = (ADR) HLPBCDE: LD A,(HL) ADD A,E LD (HL),A INC HL LD A,(HL) ADC A,D LD (HL),A INC HL LD A,(HL) ADC A,C LD (HL),A INC HL LD A,(HL) ADC A,B LD (HL),A INC HL LD A,(HL) ADC A,0 LD (HL),A RET GET_DWORD: LD E,(HL) INC HL LD D,(HL) INC HL LD C,(HL) INC HL LD B,(HL) RET SET_DWORD: LD (HL),E INC HL LD (HL),D INC HL LD (HL),C INC HL LD (HL),B RET ; вызов функции в страницах RESIDENT ; ==============resident 2============== .CopyFiles: LD DE,CopyFilesR .FunctResident: LD A,(RAMPAGES.FNREZ2) LD C,WINSP.CPU1 JP Resident .ReName: LD DE,ReNameR jr .FunctResident .MakeDIR: LD DE,MakeDIRR jr .FunctResident .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 ENDIF ; ==============resident 2============== ; ==============resident 3============== .MarkFile: LD DE,MarkFileR .HelpResident: LD A,(RAMPAGES.FNREZ3) 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 .UnMarkGroupN: LD DE,UnMarkGroupRN jr .HelpResident .MarkGroup: LD DE,MarkGroupR jr .HelpResident .MarkGroupN: LD DE,MarkGroupRN jr .HelpResident .SelectAll: LD DE,SelectAllR jr .HelpResident .SelectAllN: LD DE,SelectAllRN jr .HelpResident .UnSelectAll: LD DE,UnSelectAllR jr .HelpResident .UnSelectAllN: LD DE,UnSelectAllRN jr .HelpResident .InvertSelect: LD DE,InvertSelectR jr .HelpResident .InvertSelectN: LD DE,InvertSelectRN jr .HelpResident .PrintFile: CALL ResInvert .PrintFileL3 LD HL,SetInvert PUSH HL LD DE,PrintFileR jr .HelpResident .FileInfo: CALL ResInvert .FileInfoL2 LD HL,SetInvert PUSH HL LD DE,FileInfoR jr .HelpResident .Version: LD DE,VersionR jr .HelpResident .DiskInfo: CALL ResInvert .DiskInfoL4: LD DE,DiskInfoR jr .HelpResident .SystemInfo: LD DE,SystemInfoR jr .HelpResident ; ==============resident 3============== ; Выход ComExit CALL ResDrivers CALL ResVideoMode LD HL,thanks SPDSS DSSF.PCHARS LD A,(RAMPAGES.FNPAGESID) SPDSS DSSF.FREEMEM SPDSS DSSF.EXIT,0 include fnwin.a80 include fnprint.a80 include fninput.a80 include fnbar.a80 include fnmouse.a80 include fnsys.a80 ; Старт MainStartFN: DI LD SP,STACK ReStartFN: SETPORT BORDER,0 SETPORT WINSP.Y_PORT,0xC0 CALL InitVideoMode CALL InitDrivers CALL InitScreen CALL ClearDOSline SUB A CALL InitPanels CALL WaitUnpressMouse MainLoop: LD IX,MAINTAB.FilePanelLeft BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) JR Z,.L1 LD IX,MAINTAB.FilePanelRight .L1 CALL CheckCoordsMouse CALL TestKeys CALL C,DOSline LD A,(TreeFlag) OR A IF TREE_REZID CALL NZ,RESIDENT.TestTree ELSE CALL NZ,TestTreeR ENDIF JR MainLoop TestKeys SPDSS DSSF.TESTKEY JR Z,KeyExit RES 7,D LD A,B AND KEYBSTAT.M_ALT | KEYBSTAT.M_CTRL CP KEYBSTAT.M_ALT | KEYBSTAT.M_CTRL RET Z LD IX,HOTKEYS.SHIFTKeys LD A,B AND KEYBSTAT.M_LEFTSHIFT | KEYBSTAT.M_RIGHTSHIFT JR NZ,.L1 LD IX,HOTKEYS.CTRLKeys BIT KEYBSTAT.B_CTRL,B JR NZ,.L1 LD IX,HOTKEYS.ALTKeys BIT KEYBSTAT.B_ALT,B JR NZ,.L1 LD IX,HOTKEYS.ASCIIKeys .L1 LD L,(IX+0x00) ; скан код INC IX INC L SCF RET Z DEC L LD H,(IX+0x00) ; ASCII код INC IX LD C,(IX+0x00) ; LOW адрес вызова INC IX LD B,(IX+0x00) ; HIGH адрес вызова INC IX OR A SBC HL,DE JR NZ,.L1 LD (KeyCALL),BC SPDSS DSSF.SCANKEY CALL 0x0000 KeyCALL EQU $-2 KeyExit XOR A RET MouseOnOff LD A,(MouseFlag) XOR 0x01 LD (MouseFlag),A LD C,MOUSEF.INIT JR NZ,.L1 LD C,MOUSEF.HIDE .L1 SPMOUSE RET 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 include fnwork.a80 include fnmenu.a80 include fninit.a80 include fndosline.a80 include fntab.a80 END_BLOCK_1: DEPHASE ; BASE_ADDR ; ==============resident 2============== PHASE 0x4000 START_BLOCK_2 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============== ; ==============fonts============== 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 END_BLOCK_4: DEPHASE ; 0xC000 ; ==============fonts============== ; ==============resident 3============== 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 _INIT_VAR 0x8000 ; с конца страницы _MINUSVAR .DOShistory, 0x200 ;times 0x200 db 0 _MINUSVAR .fnedit_ext, WorkBuffer_Size ;times 0x400 db 0 _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 ; текущий адрес в пути 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 SORT_SIZE EQU END_SORT - START_SORT ; сортировщик TREE_SIZE EQU END_TREE - START_TREE ; работа с деревом