; LAST UPDATE: 25.06.2025 savelij ;[]==========================================================[] FileInfoR LD A,(IY+PANEL.EFL) OR (IY+PANEL.EFH) RET Z BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) RET NZ SETPORT WINSP.Y_PORT,0xC0 GETPORT WINSP.CPU3 PUSH AF BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L1 LD A,(RAMPAGES.RIGHTPANEL) .L1 SETPORT WINSP.CPU3,,0 LD L,(IY+PANEL.FFL) LD H,(IY+PANEL.FFH) LD E,(IY+PANEL.CFL) LD D,(IY+PANEL.CFH) 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 DE,WorkBuffer LD BC,0x0018 LDIR POP AF SETPORT WINSP.CPU3,,0 LD IX,WorkBuffer LD HL,WorkBuffer+1 LD DE,WorkBuffer+0x20 LD A,(HL) CP '.' RET Z CALL SetClock PUSH DE CALL MakeDOSname POP HL LD DE,FName LD C,12 SUB A .L2 LDI CP (HL) JR NZ,.L2 LD A,C OR A JR Z,.L5 LD B,A LD A,0x20 .L3 LD (DE),A INC DE DJNZ .L3 .L5 LD HL,FAtributs LD DE,FAttrib LD C,(IX + FileHDR.Attr) LD B,0x08 .L6 RL C LD A,'-' JR NC,.L4 LD A,(HL) .L4 LD (DE),A INC HL INC DE DJNZ .L6 LD HL,FLen LD B,0x10 LD A,0x20 .L10 LD (HL),A INC HL DJNZ .L10 LD DE,FLen BIT DIR.B_Dir,(IX + FileHDR.Attr) JR Z,.L7 LD HL,DirText LD BC,0x000A LDIR JR .L8 .L7 LD L,(IX+0x0F) LD H,(IX+0x10) LD C,(IX+0x11) LD B,(IX+0x12) CALL ConvNumTxt32 LD A,0x20 LD (DE),A INC DE LD HL,Bytes LD BC,0x0005 LDIR .L8 LD DE,FData CALL GetData LD DE,FTime CALL GetTime LD HL,WorkBuffer+0x20 LD DE,WorkBuffer+0x30 LD A,(FileAtribut) PUSH IY SPDSS DSSF.F_FIRST,0 POP IY JP C,SetMouse LD HL,FClast LD B,0x05 LD A,0x20 .L9 LD (HL),A INC HL DJNZ .L9 LD HL,WorkBuffer+0x30+26 LD E,(HL) INC HL LD D,(HL) EX DE,HL LD DE,FClast CALL ConvNumTxt16 MAKEWINDOW WINSUBOBJ.STORE W_MAIN 240,80,160,98 W_FILL 4,2,152,10,COLORI.BLACK W_TEXT 56,3,COLORI.WHITE,"File info" W_TEXT 10,20,COLORP.HIGHGRAY,"Name: " FName EQU $ - STRLEN(" ") - 1 W_TEXT 10,32,COLORP.HIGHGRAY,"Attributes: " FAttrib EQU $ - STRLEN(" ") - 1 W_TEXT 10,44,COLORP.HIGHGRAY,"Len: " FLen EQU $ - STRLEN(" ") - 1 W_TEXT 10,56,COLORP.HIGHGRAY,"Data: " FData EQU $ - STRLEN(" ") - 1 FTime EQU $ - STRLEN(" ") - 1 W_TEXT 10,68,COLORP.HIGHGRAY,"First cluster: " FClast EQU $ - STRLEN(" ") - 1 W_BUTTON 44,80,72,14 W_TEXT 72,83,COLORP.HIGHGRAY,"Ok" W_END CALL SetMouse FileInfoLoop: LD IX,FileInfoTab CALL TestCoords SPDSS DSSF.SCANKEY JR Z,FileInfoLoop LD A,B OR A JR NZ,FileInfoLoop LD A,E CP 0x1B JR Z,FileInfoExt CP 0x0D JR Z,FileInfoExt RES 5,A CP 'O' JR NZ,FileInfoLoop FileInfoExt: WINDOWCLOSE RET FAtributs: DEFB "--ad-shr" ;[]==========================================================[] PrintFileR LD A,(IY+PANEL.EFL) OR (IY+PANEL.EFH) RET Z BIT VIEWFLAG.B_TREE,(IY+PANEL.VIEWFLAG) RET NZ SETPORT WINSP.Y_PORT,0xC0 GETPORT WINSP.CPU3 PUSH AF BIT PANELFLAG.B_SIDE,(IY+PANEL.PANELFLAG) LD A,(RAMPAGES.LEFTPANEL) JR Z,.L1 LD A,(RAMPAGES.RIGHTPANEL) .L1 SETPORT WINSP.CPU3,,0 LD L,(IY+PANEL.FFL) LD H,(IY+PANEL.FFH) LD E,(IY+PANEL.CFL) LD D,(IY+PANEL.CFH) 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 DE,WorkBuffer LD BC,0x0018 LDIR POP AF SETPORT WINSP.CPU3,,0 LD IX,WorkBuffer BIT DIR.B_Dir,(IX + FileHDR.Attr) RET NZ LD HL,WorkBuffer+1 LD DE,PrnFileName CALL MakeDOSname LD L,(IX + FileHDR.SizeBytes) LD H,(IX + FileHDR.SizeBytes + 1) LD (PrnFileLen),HL LD E,(IX + FileHDR.SizeBytes + 2) LD D,(IX + FileHDR.SizeBytes + 3) LD (PrnFileLen+2),DE LD A,H OR L OR D OR E RET Z PUSH IY SPDSS DSSF.GETMEM,1 POP IY PUSH AF CALL C,DOSError POP AF RET C LD (PrnMIndef),A PUSH IY LD HL,PagesList SPBIOS BIOSF.GETMEMBLKPAGES MAKEWINDOW WINSUBOBJ.STORE W_MAIN 168,84,304,62 W_FILL 4,2,296,10,COLORI.BLACK W_TEXT 142,3,COLORI.WHITE,"Print" W_TEXT 16,16,COLORP.HIGHGRAY,"Printing file:" W_BORDER 16,28,272,12 W_FILL 18,29,268,10,COLORI.WHITE W_BUTTON 116,44,72,14 W_TEXT 140,47,COLORP.HIGHGRAY,"Stop" W_END PUSH IY POP HL LD DE,PANEL.CURRPATH ADD HL,DE LD DE,WorkBuffer SUB A .L2 LDI CP (HL) JR NZ,.L2 DEC HL LD A,0x5C CP (HL) JR Z,.L3 LD (DE),A INC DE .L3 LD HL,PrnFileName SUB A .L4 LDI CP (HL) JR NZ,.L4 LD (DE),A LD IX,0x00D0 LD HL,WorkBuffer LD DE,0x00F8 LD BC,0x0064 LD A,0x80 CALL PrnRangPathL LD IX,PrintFTab CALL TestCoords LD IX,ProcessFPrn LD HL,(PrnFileLen) LD DE,(PrnFileLen+2) LD A,L LD L,H LD H,E LD E,D OR A JR Z,InitPrn INC HL LD A,H OR L JR NZ,InitPrn INC E InitPrn LD (IX+PROC.MAXL1),L LD (IX+PROC.MAXH1),H LD (IX+PROC.MAXL2),E LD (IX+PROC.MAXH2),0x00 CALL InitProcess LD HL,PrnFileName SPDSS DSSF.OPEN,,1 PUSH AF CALL C,DOSError POP AF JP C,PrnError LD (PrnFHandle),A GETPORT WINSP.CPU3 PUSH AF LD HL,PagesList LD A,(HL) ReadPr1 INC HL PUSH HL SETPORT WINSP.CPU3,,0 LD HL,(PrnFileLen) LD DE,(PrnFileLen+2) LD BC,0x4000 OR A SBC HL,BC LD B,0x00 EX DE,HL SBC HL,BC EX DE,HL JR C,ReadPrnEnd LD (PrnFileLen),HL LD (PrnFileLen+2),DE CALL SetClock LD HL,0xC000 LD DE,0x4000 LD A,(PrnFHandle) SPDSS DSSF.READ CALL SetMouse LD BC,0x4000 CALL PrintBlock POP HL JR C,PrnEsc LD A,(HL) CP 0xFF JR NZ,ReadPr1 PrnEsc POP AF SETPORT WINSP.CPU3,,0 JR PrnFileExit ReadPrnEnd: LD HL,0xC000 LD DE,(PrnFileLen) LD A,D OR E JR Z,.L1 CALL SetClock LD A,(PrnFHandle) PUSH DE SPDSS DSSF.READ POP BC CALL SetMouse CALL PrintBlock JR C,.L2 .L1 CALL NxtPrnProc .L2 POP HL POP AF SETPORT WINSP.CPU3,,0 PrnFileExit LD A,(PrnFHandle) SPDSS DSSF.CLOSE PrnError LD A,(PrnMIndef) SPDSS DSSF.FREEMEM POP IY HALT HALT WINDOWCLOSE RET ;[]----------------------------------------------------------[] PrintBlock: LD DE,0xC000 PrnBlockLp LD A,(DE) INC DE CALL PrintCHAR RET C CALL NxtPrnProc DEC BC LD A,B OR C JR NZ,PrnBlockLp RET PrintCHAR: LD L,A PUSH HL PUSH DE PUSH BC SPMOUSE MOUSEF.READ_STATE BIT 0,A JR Z,PrnCH1 LD IX,PrintFTab CALL TestCoords JR C,PrnCH2 PrnCH1 SPDSS DSSF.SCANKEY LD A,E PrnCH2 POP BC POP DE POP HL RET C JR Z,PrnCHAR CP 0x1B SCF RET Z RES 5,A CP 'S' JR NZ,PrnCHAR StopPrint SCF RET PrnCHAR PUSH DE PUSH BC LD A,L SPDSS DSSF.PRINT LD A,B POP BC POP DE RET NC HALT JR PrintCHAR ;[]----------------------------------------------------------[] NxtPrnProc LD A,E OR A RET NZ PUSH DE PUSH BC LD IX,ProcessFPrn LD L,(IX+PROC.CURL1) LD H,(IX+PROC.CURH1) INC HL LD (IX+PROC.CURL1),L LD (IX+PROC.CURH1),H LD A,H OR L JR NZ,.L1 LD L,(IX+PROC.CURL2) LD H,(IX+PROC.CURH2) INC HL LD (IX+PROC.CURL2),L LD (IX+PROC.CURH2),H .L1 CALL PrnProcess POP BC POP DE RET ProcessFPrn: DEFW 0x00BA DEFW 0x0071 DEFW 0x010C DEFW 0x0000 DEFW 0x0000 DEFW 0x0000 DEFW 0x0000 DEFW 0x0000 DEFW 0x0000 DEFB 0x4F PrnFileName: DUPL 13,0 PrnFileLen: DUPL 4,0 PrnMIndef: DEFB 0x00 PrnFHandle: DEFB 0x00 ;[]==========================================================[] SystemInfoR SETPORT WINSP.Y_PORT,0xC0 LD HL,SetInvert PUSH HL LD HL,DOSvers LD DE,BIOSver LD B,0x05 LD A,0x20 .L1 LD (HL),A INC HL LD (DE),A INC DE DJNZ .L1 PUSH IY SPDSS DSSF.VERSION POP IY EX DE,HL LD DE,DOSvers LD A,H CALL ConvNumTxt8 LD A,'.' LD (DE),A INC DE LD A,L CALL ConvNumTxt8 LD HL,WorkBuffer SPBIOS BIOSF.FN_VERSION SUB A .L2 INC HL CP (HL) JR NZ,.L2 LD A,0x20 .L3 DEC HL CP (HL) JR NZ,.L3 INC HL LD DE,BIOSver SUB A .L4 LDI CP (HL) JR NZ,.L4 LD HL,Present LD A,(CMOSFlag) OR A JR NZ,.L5 LD HL,NotPresent .L5 LD DE,CMOS LD BC,0x000B LDIR LD HL,TotMem LD DE,FreeMem LD B,0x0F LD A,0x20 .L6 LD (HL),A INC HL LD (DE),A INC DE DJNZ .L6 PUSH IY SPDSS DSSF.INFOMEM POP IY PUSH BC LD B,H LD C,L LD HL,0x0000 LD DE,WorkBuffer SRL B RR C RR H RR L SRL B RR C RR H RR L PUSH DE CALL ConvNumTxt32 SUB A LD (DE),A POP HL LD DE,TotMem CALL CorrBigNum INC DE LD HL,Bytes LD BC,0x0005 LDIR POP HL LD B,H LD C,L LD HL,0x0000 LD DE,WorkBuffer SRL B RR C RR H RR L SRL B RR C RR H RR L PUSH DE CALL ConvNumTxt32 SUB A LD (DE),A POP HL LD DE,FreeMem CALL CorrBigNum INC DE LD HL,Bytes LD BC,0x0005 LDIR MAKEWINDOW WINSUBOBJ.STORE W_MAIN 224,64,192,114 W_FILL 4,2,184,10,COLORI.BLACK W_TEXT 48,3,COLORI.WHITE,"System information" W_TEXT 10,20,COLORP.HIGHGRAY,"FN version: \{FLEX_VERS.NAVIGATOR}" W_TEXT 10,32,COLORP.HIGHGRAY,"BIOS version: " BIOSver EQU $ - STRLEN(" ") - 1 W_TEXT 10,44,COLORP.HIGHGRAY,"DOS version: " DOSvers EQU $ - STRLEN(" ") - 1 W_TEXT 10,56,COLORP.HIGHGRAY,"CMOS: " CMOS EQU $ - STRLEN(" ") - 1 W_TEXT 10,70,COLORP.HIGHGRAY,"Total memory: " TotMem EQU $ - STRLEN(" ") - 1 W_TEXT 10,82,COLORP.HIGHGRAY,"Free memory: " FreeMem EQU $ - STRLEN(" ") - 1 W_BUTTON 60,96,72,14 W_TEXT 88,99,COLORP.HIGHGRAY,"Ok",0 W_END SysInfoLoop: LD IX,SysInfoTab CALL TestCoords SPDSS DSSF.SCANKEY JR Z,SysInfoLoop LD A,B OR A JR NZ,SysInfoLoop LD A,E CP 0x1B JR Z,SysInfoExt CP 0x0D JR Z,SysInfoExt RES 5,A CP 'O' JR NZ,SysInfoLoop SysInfoExt WINDOWCLOSE RET Bytes: DEFB "bytes" Present: DEFB "Present " NotPresent: DEFB "Not present" ;[]==========================================================[] DiskInfoR: LD HL,SetInvert ;!FIXIT проверить для это оно или нет SAFE_PORTY PUSH HL SETPORT WINSP.Y_PORT,0xC0 CALL SetClock PUSH IY SPDSS DSSF.CURDISK POP IY ADD A,'A' LD (.CrDrive),A ;!TEST ;LD IX,0x0000 ;LD HL,0x0000 ;LD DE,WorkBuffer ;LD BC,0x0105 ;SUB 'A' ;PUSH IY ;RST ToDSS.DRV ;!FIXIT rst 0x18 ;POP IY ;JP C,SetMouse LD B,0 CALL .get_info EX AF,AF' LD A,D AND E EXX AND D AND E INC A EXX JR Z,.no_full_info ; все данные есть PUSH DE ; свободных кластеров, младшая часть PUSH HL ; общее кол-во кластеров, младшая часть PUSH BC ; размер сектора в байтах EXX PUSH DE ; свободных кластеров, старшая часть PUSH HL ; общее кол-во кластеров, старшая часть EX AF,AF' PUSH AF ; размер кластера в секторах EX AF,AF' .no_full_info: PUSH AF ; parsing LD D,0 LD HL,WorkBuffer ; тут в HL длина поля "Файловая система" LD E,(HL) ADD HL,DE INC HL ; длина поля "Серийный номер диска" LD A,(HL) PUSH HL INC HL LD (.serial_1),HL INC HL LD (.serial_2),HL INC HL LD (.serial_3),HL INC HL LD (.serial_4),HL POP HL LD E,A ADD HL,DE INC HL ; указатель на длину поля "Метка диска" INC HL ; метка LD (.buf_label),HL LD DE,.NoLabel LD B,11 .loop1: SUB A CP (HL) JR Z,.DiskI2 LD A,(DE) CP (HL) JR NZ,.DiskI1 INC HL INC DE DJNZ .loop1 .DiskI1: LD HL,WorkBuffer+0x2B .buf_label EQU $-2 JR NZ,.DiskI21F .DiskI2: LD HL,.NoLabelT .DiskI21F: LD DE,.Dlabel LD BC,.Dlabel.Size LDIR ; серийник LD DE,.SerialN LD A,(WorkBuffer+0x2A) .serial_4 EQU $-2 CALL ConvHexTxt LD A,(WorkBuffer+0x29) .serial_3 EQU $-2 CALL ConvHexTxt INC DE LD A,(WorkBuffer+0x28) .serial_2 EQU $-2 CALL ConvHexTxt LD A,(WorkBuffer+0x27) .serial_1 EQU $-2 CALL ConvHexTxt MAKEWINDOW WINSUBOBJ.STORE W_MAIN 192,80,256,98 W_FILL 4,2,248,10,COLORI.BLACK W_TEXT 106,3,COLORI.WHITE,"Disk info" W_TEXT 10,20,COLORP.HIGHGRAY,"Current drive: " .CrDrive: EQU $ - 2 W_TEXT 10,32,COLORP.HIGHGRAY,"Total disk space:" W_TEXT 10,44,COLORP.HIGHGRAY,"Avaliable disk space:" W_TEXT 10,56,COLORP.HIGHGRAY,"Disk label: " .Dlabel: EQU $ - STRLEN(" ") - 1 .Dlabel.Size EQU $ - .Dlabel - 1 W_TEXT 10,68,COLORP.HIGHGRAY,"Serial volume number: - " .SerialN: EQU $ - STRLEN(" - ") - 1 W_BUTTON 92,80,72,14 W_TEXT 120,83,COLORP.HIGHGRAY,"Ok" W_END POP AF JR NZ,.calc_size LD B,1 CALL .get_info PUSH DE ; свободных кластеров, младшая часть PUSH HL ; общее кол-во кластеров, младшая часть PUSH BC ; размер сектора в байтах EXX PUSH DE ; свободных кластеров, старшая часть PUSH HL ; общее кол-во кластеров, старшая часть PUSH AF ; размер кластера в секторах .calc_size: POP AF ; размер кластера в секторах POP HL POP DE EXX POP BC POP HL POP DE ; --> (HL':HL)*BC*A, (DE':DE)*BC*A = B':HL'HL, C':DE':DE EXX LD BC,0 EXX SRL B RR C RRCA JR C,.loop_2 .loop_1: SLA L RL H EXX RL L RL H RL B EXX SLA E RL D EXX RL E RL D RL C EXX RRCA JP NC,.loop_1 .loop_2: SLA L RL H EXX RL L RL H RL B EXX SLA E RL D EXX RL E RL D RL C EXX SRL B RR C JP NC,.loop_2 ; <-- B':HL'HL, C':DE':DE EXX LD A,C LD (.freeSpace_h),A LD (.freeSpace_m),DE LD A,B PUSH HL EXX LD (.freeSpace_l),DE POP BC ; вычисляем общий размер в байтах ; A:BC:HL - число для перевода LD DE,WorkBuffer CALL ConvNumTxt40 SUB A LD (DE),A LD HL,WorkBuffer LD DE,WorkBuffer+0x100 CALL CorrBigNum LD A,' ' LD (DE),A INC DE LD HL,Bytes LD BC,5;Bytes.Size LDIR SUB A LD (DE),A ; вычисляем свободное место в байтах LD A,0 .freeSpace_h EQU $-1 LD BC,0 .freeSpace_m EQU $-2 LD HL,0 .freeSpace_l EQU $-2 LD DE,WorkBuffer+0x80 ; A:BC:HL - число для перевода CALL ConvNumTxt40 SUB A LD (DE),A LD HL,WorkBuffer+0x80 LD DE,WorkBuffer+0x180 CALL CorrBigNum LD A,' ' LD (DE),A INC DE LD HL,Bytes LD BC,5;Bytes.Size LDIR SUB A LD (DE),A ; вывод размеров LD HL,WorkBuffer+0x100 LD DE,0x0128 LD BC,0x0070 LD A,0x80 CALL PrnTxtLnIFF LD HL,WorkBuffer+0x180 LD DE,0x0013A LD BC,0x007C LD A,0x80 CALL PrnTxtLnIFF CALL SetMouse .DiskInfoLoop: LD IX,DiskInfoTab CALL TestCoords SPDSS DSSF.SCANKEY JR Z,.DiskInfoLoop LD A,B OR A JR NZ,.DiskInfoLoop LD A,E CP 0x1B JR Z,.Ext CP 0x0D JR Z,.Ext RES 5,A CP 'O' JR NZ,.DiskInfoLoop .Ext: WINDOWCLOSE RET .get_info: LD A,(.CrDrive) SUB 'A' OR 0x80 LD HL,WorkBuffer PUSH IY SPDSS DSSF.DSKINFO POP IY RET NC ; если ошибка, то обнуляем размер свободного места и полный размер XOR A LD H,A LD L,A LD D,A LD E,A EXX LD H,A LD L,A LD D,A LD E,A LD B,A LD C,A RET .NoLabel DEFB "NO NAME " .NoLabelT DEFB "no label " ConvHexTxt PUSH AF RRCA RRCA RRCA RRCA CALL ConvHexT1 POP AF ConvHexT1 AND 0x0F ADD A,0x90 DAA ADC A,0x40 DAA LD (DE),A INC DE RET CorrBigNum PUSH HL SUB A LD C,A .L1 INC C INC HL CP (HL) JR NZ,.L1 POP HL LD A,C .L2 SUB 0x03 JR Z,.L5 JR NC,.L2 ADD A,0x03 LD B,A .L3 LD A,(HL) LD (DE),A INC HL INC DE DJNZ .L3 .L4 LD A,(HL) OR A RET Z LD A,' ' LD (DE),A INC DE .L5 LDI LDI LDI JR .L4 ;[]==========================================================[] VersionR SETPORT WINSP.Y_PORT,0xC0 LD HL,SetInvert PUSH HL MAKEWINDOW WINSUBOBJ.STORE W_MAIN 192,64,256,152 W_FILL 4,2,248,10,COLORI.BLACK W_TEXT 110,3,COLORI.WHITE,"Version" W_TEXT 93,20,COLORP.HIGHGRAY,"Flex Navigator" W_TEXT 76,38,COLORP.HIGHGRAY,"Component versions:" W_TEXT 70,48,COLORP.HIGHGRAY,"Manager:" W_TEXT 128,48,COLORP.HIGHGRAY,"\{FLEX_VERS.NAVIGATOR}" W_TEXT 65,58,COLORP.HIGHGRAY,"File Editor:" W_TEXT 128,58,COLORP.HIGHGRAY,"\{FLEX_VERS.EDITOR}" W_TEXT 61,68,COLORP.HIGHGRAY,"File Viewer:" W_TEXT 128,68,COLORP.HIGHGRAY,"\{FLEX_VERS.VIEWER}" W_TEXT 40,86,COLORP.HIGHGRAY,"2000, Enin Anton" W_TEXT 40,96,COLORP.HIGHGRAY,"2021, Mikhaltchenkov Dmitry" W_TEXT 40,106,COLORP.HIGHGRAY,"2022, Belyanskiy Anatoliy" W_TEXT 40,116,COLORP.HIGHGRAY,"(C) Sprinter Team build ",0 ; здесь вставляется дата сборки W_BUTTON 92,133,72,14 W_TEXT 120,136,COLORP.HIGHGRAY,"OK" W_END CALL ResFire VersionLoop LD IX,VersionTab CALL TestCoords SPDSS DSSF.SCANKEY JR Z,VersionLoop LD A,B OR A JR NZ,VersionLoop LD A,E CP 0x1B JR Z,VersionExt CP 0x0D JR NZ,VersionLoop VersionExt WINDOWCLOSE RET