; LAST UPDATE: 27.04.2025 savelij ;[]==========================================================[] InitVideoMode SPDSS DSSF.GETVMOD LD C,A ; текущий режим экрана LD A,(InitFlg) OR A JR NZ,.L1 LD A,C LD (VMode),A LD A,B ; страница экрана LD (VScrn),A .L1 LD HL,WorkBuffer SPBIOS BIOSF.FN_VERSION ;!TODO проверять на последний биос AND A LD HL,-0x101;ACEX.Config_ID.Sp2000 SBC HL,BC JR Z,.L2 SPBIOS BIOSF.RST_CONF_CUSTOM,,-3 .L2: ;????? тут старый вариант выдачи FN_VERSION проверяется. Подумать. ; LD A,%0000'1101 ; нужные биты для порта All_Mode ; AND L ; SUB %0000'1101 ; JR Z,InitVM1 ; IN A,(SCREEN_SWITCH) ; PUSH AF ; LD C,BIOS.RST_CONF.SP97_2 ; RST ToBIOS ; SUB A ; OUT (BorderColor),A ; POP AF ; OUT (SCREEN_SWITCH),A InitVM1 SPDSS DSSF.SETVMOD,0,SETVMOD.GRF640X256 SUB A CALL ClearScreen InitPAL LD HL,PALETTE LD DE,0x1000 SPBIOS BIOSF.PIC_SET_PAL,0xFF,0 RET ;[]----------------------------------------------------------[] ResVideoMode LD B,0x00 VScrn EQU $-1 LD A,0x00 VMode EQU $-1 PUSH IY SPDSS DSSF.SETVMOD POP IY RET ;[]==========================================================[] InitDrivers SUB A LD (CMOSFlag),A LD L,A LD H,A LD (TestCoords.PrvTabl),HL LD (TestCoords.PrMousX),HL LD (TestCoords.PrMousY),HL SPDSS DSSF.GETMEM,7 JR NC,InitDrv CALL ResVideoMode LD HL,NoEnMemory SPDSS DSSF.PCHARS LD A,(RAMPAGES.FNPAGESID) SPDSS DSSF.FREEMEM SPDSS DSSF.EXIT,0x1E NoEnMemory DZ "Not enough memory to run program.\r\n" InitDrv LD (RAMPAGES.BufferID),A LD HL,RAMPAGES.FLX SPBIOS BIOSF.GETMEMBLKPAGES .skip: SPDSS DSSF.CURDISK JR C,.skip LD A,C CP 12 JR C,.L1 LD A,11 .L1 LD (NUM_DEVICES),A SPDSS DSSF.GETTIME JR C,.L3 LD A,D CP 32 CCF JR C,.L3 LD A,E CP 13 CCF JR C,.L3 LD A,H CP 24 CCF JR C,.L3 LD A,L CP 60 CCF .L3 LD A,0x00 JR C,.L2 INC A .L2 LD (CMOSFlag),A LD A,0x00 InitFlg EQU $-1 OR A CALL Z,FirstInit CALL SETUP_DISKS SPMOUSE MOUSEF.INIT LD A,(MouseFlag) OR A LD C,MOUSEF.SHOW JR NZ,.L1 LD C,MOUSEF.HIDE .L1 SPMOUSE ;!TEST enable shared interrupts ;Check BIOS version SPBIOS BIOSF.DRV_VERSION AND A LD HL,2 << 8 + 54 ;!HARDCODE (минимальная версия)-1 для активации прерываний SBC HL,DE RET NC ; выход, если версия ниже 2.55 LD BC,WINSP.CPU2 IN B,(C) SETPORT WINSP.CPU2,0xFE LD A,0xAA LD (0x0127 + CPU2),A;(SYS_PAGE.INT_ID - #4000),A ;!HARDCODE SYS_PAGE.INT_ID - #4000 OUT (C),B RET FirstInit SPDSS DSSF.BOOTDSK,0 ADD A,'A' LD (ShellFile),a ; fndosln.z80 SPDSS DSSF.CURDISK LD HL,LeftPanel + PANEL.CURRPATH PUSH HL ADD A,'A' LD (HL),A INC HL LD (HL),':' INC HL SPDSS DSSF.CURDIR POP HL LD DE,RightPanel + PANEL.CURRPATH LD BC,0x0100 LDIR GETPORT WINSP.CPU1 PUSH AF LD A,(RAMPAGES.FNFUNCT) SETPORT WINSP.CPU1,,0 LD HL,FlexDIRECTORY SPDSS DSSF.APPINFO,1 JP C,.L5 LD HL,FlexDIRECTORY SPDSS DSSF.CHDIR JP C,.L5 LD HL,SetupName SPDSS DSSF.OPEN,,1 JR C,.L5 PUSH AF LD HL,WorkBuffer push hl push hl ld (hl),0 pop de ld bc,0x00ff inc de ldir pop hl LD DE,0x0100 SPDSS DSSF.READ POP AF SPDSS DSSF.CLOSE LD HL,WorkBuffer LD DE,SetupHead LD B,11 .L3 LD A,(DE) CP (HL) JR NZ,.L5 INC HL INC DE DJNZ .L3 LD DE,PALETTE LD BC,0x0040 LDIR LD A,(HL) INC HL OR A JR Z,.L4 LD A,(HL) INC HL AND 0x01 LD (MouseFlag),A LD DE,LeftPanel PUSH DE LDI LDI LDI POP DE EX DE,HL LD BC,PANEL.FILEMASK ADD HL,BC EX DE,HL SUB A .L1 LDI CP (HL) JR NZ,.L1 LD (DE),A INC HL LD DE,RightPanel PUSH DE LDI LDI LDI POP DE EX DE,HL LD BC,PANEL.FILEMASK ADD HL,BC EX DE,HL SUB A .L2 LDI CP (HL) JR NZ,.L2 LD (DE),A .L4 inc hl ld a,(hl) ;параметр - авто смена панели при смене диска на ней ld (AutoActivatePanel),a inc hl CALL InitPAL .L5 POP AF SETPORT WINSP.CPU1,,0 LD DE,InitExtention LD A,(RAMPAGES.FNHELP) LD C,WINSP.CPU1 CALL Resident LD HL,LeftPanel + PANEL.CURRPATH SPDSS DSSF.CHDIR LD A,0x01 LD (InitFlg),A RET ; обновление в таблице выбора дисков на панели SETUP_DISKS LD HL,BgDISKl ; диски левой панели LD DE,BgDISKr ; диски правой панели LD BC,FORMTABL.SIZE * 2 LD A,(NUM_DEVICES) .L1 ADD HL,BC INC HL RES FORMTABL.B_ENDTABL,(HL) DEC HL EX DE,HL ADD HL,BC INC HL RES FORMTABL.B_ENDTABL,(HL) DEC HL EX DE,HL DEC A JR NZ,.L1 INC HL SET FORMTABL.B_ENDTABL,(HL) EX DE,HL INC HL SET FORMTABL.B_ENDTABL,(HL) RET ;[]----------------------------------------------------------[] ResDrivers SPMOUSE MOUSEF.HIDE LD A,(RAMPAGES.BufferID) SPDSS DSSF.FREEMEM ;!TEST disable shared interrupts LD BC,WINSP.CPU2 IN B,(C) SETPORT WINSP.CPU2,PAGE.SYSTEM;0xFE XOR A LD (0x0127 + CPU2),A ;!HARDCODE SYS_PAGE.INT_ID OUT (C),B RET ;[]==========================================================[] InitScreen MAKEWINDOW WINSUBOBJ.NOSTORE W_MAIN 0,0,640,256 W_FILL 4,2,632,10,COLORI.BLACK W_TEXT 16,3,COLORI.WHITE,"Flex Navigator v\{FLEX_VERS.NAVIGATOR}" W_HORIZLINE 0,13,640 W_TEXT 16,17,COLORP.HIGHGRAY,"File Select Options View Config About" W_HORIZLINE 0,27,640 W_VERTICLINE 318,30,12 W_HORIZLINE 0,43,640 W_HORIZLINE 0,211,640 W_VERTICLINE 318,214,10 W_HORIZLINE 0,225,640 W_BORDER 252,228,384,12 W_FILL 254,229,380,10,COLORI.PANEL W_HORIZLINE 0,241,640 W_BUTTON 0,242,80,14 W_TEXT 22,245,COLORP.HIGHGRAY,"F1 Help" W_BUTTON 80,242,80,14 W_TEXT 100,245,COLORP.HIGHGRAY,"F3 View" W_BUTTON 160,242,80,14 W_TEXT 182,245,COLORP.HIGHGRAY,"F4 Edit" W_BUTTON 240,242,80,14 W_TEXT 260,245,COLORP.HIGHGRAY,"F5 Copy" W_BUTTON 320,242,80,14 W_TEXT 334,245,COLORP.HIGHGRAY,"F6 Rename" W_BUTTON 400,242,80,14 W_TEXT 414,245,COLORP.HIGHGRAY,"F7 MakeDir" W_BUTTON 480,242,80,14 W_TEXT 496,245,COLORP.HIGHGRAY,"F8 Delete" W_BUTTON 560,242,80,14 W_TEXT 580,245,COLORP.HIGHGRAY,"F10 Quit" W_END LD A,(CMOSFlag) OR A RET Z MAKEWINDOW WINSUBOBJ.WOBIND W_BORDER 500,15,136,12 W_END LD HL,0x01FC LD DE,0x0012 LD B,0x80 EXX LD HL,0x022E LD DE,0x0012 LD B,0x80 EXX LD A,0x02 JP SetCMOSPrint ;[]==========================================================[] InitPanels LD (InitPanFlg),A LD HL,LeftPanel+PANEL.VIEWFLAG LD A,(RightPanel+PANEL.VIEWFLAG) OR (HL) AND 0x02 JR NZ,InitPanTree LD IY,LeftPanel CALL InitPanelE LD IY,RightPanel CALL InitPanelE JR InitPanExit InitPanTree LD IY,LeftPanel BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) JR NZ,.L1 LD IY,RightPanel .L1 CALL InitPanelE InitPanExit LD HL,LeftPanel LD DE,PANEL.CURRPATH BIT 7,(HL) JR NZ,.L2 LD HL,RightPanel .L2 PUSH HL ADD HL,DE SPDSS DSSF.CHDIR POP IY RET InitPanel SUB A InitPanel1 LD (InitPanFlg),A InitPanelE LD A,(InitPanFlg) BIT 0,A CALL Z,SetClock CALL PrintDisks CALL PrintPath BIT PANELFLAG.B_PRNDOSPATH,(IY+PANEL.PANELFLAG) CALL NZ,PrintDOSPath LD A,(IY+PANEL.VIEWFLAG) AND VIEWFLAG.MASK JP NZ,InitPPanel LD L,(IY+PANEL.XL) LD H,(IY+PANEL.XH) LD (PanelN1),HL INC HL INC HL LD (PanelN2),HL LD (PanelN6),HL LD (PanelN3),HL LD (Nbut1),HL LD (Nfile),HL LD DE,0x0010 ADD HL,DE LD (PanelN4),HL LD (Nbut1+2),HL LD (Nbar1),HL LD (IY+PANEL.BARXL),L LD (IY+PANEL.BARXH),H LD (IY+PANEL.BARYL),0xC9 LD (IY+PANEL.BARYH),0x00 LD DE,0x0114 ADD HL,DE LD (PanelN5),HL LD (Nbar2+2),HL LD (Nbut2),HL LD (IY+PANEL.BARMLL),E LD (IY+PANEL.BARMLH),D LD DE,0x0010 ADD HL,DE LD (Nbut2+2),HL LD (Nfile+2),HL LD (IY+PANEL.FPL),0x33 LD (IY+PANEL.FPH),0x00 ; Краткая панель MAKEWINDOW WINSUBOBJ.WOBIND PanelN1 EQU $+1 W_BORDER 0,59,312,151 PanelN2 EQU $+1 W_FILL 0,60,308,149,COLORI.PANEL PanelN3 EQU $+1 W_ICONLEFTARROW 0,201 PanelN4 EQU $+1 W_FILL 0,201,276,8,COLORI.HIGHGRAY PanelN5 EQU $+1 W_ICONRIGHTARROW 0,201 PanelN6 EQU $+1 W_FILL 0,213,310,12,COLORI.HIGHGRAY W_END LD HL,NormMouse LD DE,PanelPlaceL BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) JR Z,.L1 LD DE,PanelPlaceR .L1 PUSH DE LD BC,0x0050 LDIR POP HL LD C,0x32 ADD HL,BC LD (IY+PANEL.BARLFL),L LD (IY+PANEL.BARLFH),H LD C,0x0E ADD HL,BC LD (IY+PANEL.BARRTL),L LD (IY+PANEL.BARRTH),H JP InitPanEx NormMouse Nfile DEFW 0, 0, 63,199,%0000000000000000,0,NewFile,RESIDENT.MarkFile Nbut1 DEFW 0, 0,201,209,%0000000000000011,0,ScrollDown,0 Nbut2 DEFW 0, 0,201,209,%0000000000000011,0,ScrollUp,0 Nbar1 DEFW 0, 0,201,209,%0000000000000000,0,PageUp,0 Nbar2 DEFW 0, 0,201,209,%0000000000000000,0,PageDown,0 ; Подробная панель и панель с деревом InitPPanel LD L,(IY+PANEL.XL) LD H,(IY+PANEL.XH) LD (PanelP1),HL INC HL INC HL LD (PanelP2),HL LD (PanelP6),HL LD (Pfile),HL LD DE,0x0124 ADD HL,DE LD (PanelP3),HL LD (PanelP4),HL LD (PanelP5),HL LD (Pbut1),HL LD (Pbut2),HL LD (Pbar1),HL LD (Pbar2),HL LD (Pfile+2),HL LD (IY+PANEL.BARXL),L LD (IY+PANEL.BARXH),H LD DE,0x0010 ADD HL,DE LD (Pbut1+2),HL LD (Pbut2+2),HL LD (Pbar1+2),HL LD (Pbar2+2),HL LD (IY+PANEL.BARYL),0x44 LD (IY+PANEL.BARYH),0x00 LD (IY+PANEL.BARMLL),0x85 LD (IY+PANEL.BARMLH),0x00 LD (IY+PANEL.FPL),0x12 LD (IY+PANEL.FPH),0x00 MAKEWINDOW WINSUBOBJ.WOBIND PanelP1 EQU $+1 W_BORDER 0,59,312,151 PanelP2 EQU $+1 W_FILL 0,60,308,149,COLORI.PANEL PanelP3 EQU $+1 W_ICONUPARROW 0,60 PanelP4 EQU $+1 W_FILL 0,68,16,133,COLORI.HIGHGRAY PanelP5 EQU $+1 W_ICONDOWNARROW 0,201 PanelP6 EQU $+1 W_FILL 0,213,310,12,COLORI.HIGHGRAY W_END LD HL,PodrMouse LD DE,PanelPlaceL BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) JR Z,.L1 LD DE,PanelPlaceR .L1 PUSH DE LD BC,0x0050 LDIR POP HL LD BC,0x0036 ADD HL,BC LD (IY+PANEL.BARLFL),L LD (IY+PANEL.BARLFH),H LD BC,0x000E ADD HL,BC LD (IY+PANEL.BARRTL),L LD (IY+PANEL.BARRTH),H JP InitPanEx PodrMouse Pfile DW 0, 0, 63,207,%0000000000000000,0,NewFile,RESIDENT.MarkFile Pbut1 DW 0, 0, 60, 68,%0000000000000011,0,ScrollDown,0 Pbut2 DW 0, 0,201,209,%0000000000000011,0,ScrollUp,0 Pbar1 DW 0, 0, 68, 0,%0000000000000000,0,PageUp,0 Pbar2 DW 0, 0, 0,209,%0000000000000000,0,PageDown,0 InitPanEx LD A,(InitPanFlg) BIT 0,A JR NZ,.L2 PUSH IY PUSH IY POP HL LD DE,PANEL.CURRPATH ADD HL,DE SPDSS DSSF.CHDIR POP IY JR NC,.L1 CALL DOSError PUSH IY SPDSS DSSF.CURDISK POP IY PUSH IY POP HL LD DE,PANEL.CURRPATH ADD HL,DE ADD A,'A' LD (HL),A INC HL LD (HL),':' INC HL PUSH IY SPDSS DSSF.CURDIR POP IY JP InitPanel .L1 CALL ReadDIR LD A,(InitPanFlg) BIT 1,A CALL NZ,FindPrevFile .L2 CALL PrintDIR CALL SetInvert CALL PrnFileInfo PUSH IY POP IX LD DE,PANEL.BARXL ADD IX,DE CALL InitScrollBar LD A,(IY+PANEL.VIEWFLAG) AND VIEWFLAG.MASK PUSH AF CALL Z,PrnHScrBar POP AF CALL NZ,PrnVScrBar CALL SetMouse LD A,(InitPanFlg) BIT 0,A RET NZ LD HL,LeftPanel+PANEL.VIEWFLAG LD A,(RightPanel+PANEL.VIEWFLAG) OR (HL) AND 0x02 RRCA LD (TreeFlag),A BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) RET Z PUSH IY BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD IY,RightPanel LD HL,LeftPanel + PANEL.CURRPATH LD DE,RightPanel + PANEL.CURRPATH JR Z,.L3 LD IY,LeftPanel LD HL,RightPanel + PANEL.CURRPATH LD DE,LeftPanel + PANEL.CURRPATH .L3 SUB A .L4 LDI CP (HL) JR NZ,.L4 LD (DE),A CALL InitPanelE POP IY RET InitPanFlg DEFB 0x00