; LAST UPDATE: 18.07.2025 savelij ; !FIXIT переделать одинаковые окна с разным текстом для ошибок под автоматическую процедуру ;[]===========================================================[] DOSErrorR ;[x] 30/07/23 -bug вылет за пределы таблицы ошибок CP (.UNKerror - .ErrorWins) / 4 JR C,.calc_addr CP 0xF0 JR NC,.FNerror LD HL,.UNKerror JR .goto_addr ; для внутренних ошибок FN .FNerror SUB FNinternal.PlugNotFound LD HL,.PlugNotFound JR .INT_ERR .calc_addr: LD HL,.ErrorWins .INT_ERR ADD A,A ; *2 ADD A,A ; *4 ADD A,L LD L,A ADC A,H SUB L LD H,A .goto_addr LD E,(HL) INC HL LD D,(HL) ; адрес текста с Х позицией INC HL LD A,(DE) INC DE LD C,A ; X позиция младший байт LD A,(DE) INC DE LD (.WINTYPE),A RES 7,A LD B,A ; X позиция старший байт LD (.XPOSTXT),BC ; X позиция печати LD (.XPOSTXT2),BC ; X позиция печати LD (.ADRTXT),DE ; адрес текста LD (.ADRTXT2),DE ; адрес текста LD A,(HL) INC HL LD H,(HL) LD L,A ; адрес куда переходить после окна OR H RET Z ; если адрес перехода 0, выходим LD (.ADRJUMP),HL LD (.ADRJUMP2),HL CALL SetMouse LD A,0 .WINTYPE EQU $-1 BIT 7,A JR NZ,.TYPE2 ; окно с текстом ошибки MAKEWINDOW WINSUBOBJ.STORE W_MAIN 224,88,192,48 W_FILL 4,2,184,10,COLORI.RED W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" W_ADRTEXT 0,18,COLORP.HIGHGRAY,0 .XPOSTXT EQU $-7 ; позиция печати .ADRTXT EQU $-2 ; адрес текста W_BUTTON 60,30,72,14 W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" W_END JP 0 .ADRJUMP EQU $-2 ; окно с текстом ошибки и вводом буквы диска .TYPE2 MAKEWINDOW WINSUBOBJ.STORE W_MAIN 224,88,192,48 W_FILL 4,2,184,10,COLORI.RED W_TEXT 86,3,COLORI.WHITE + COLORP.RED,"Error" W_ADRTEXT 0,18,COLORP.HIGHGRAY,0 .XPOSTXT2 EQU $-7 ; позиция печати .ADRTXT2 EQU $-2 ; адрес текста W_BUTTON 60,30,72,14 W_TEXT 88,33,COLORP.HIGHGRAY,"Ok" W_BORDER 120,15,16,12 W_FILL 122,16,12,10,COLORI.WHITE W_END JP 0 .ADRJUMP2 EQU $-2 ; адрес текста адрес куда переходить .ErrorWins DW 0, 0 ; 00 DW 0, 0 ; 01 DW TXTERR.InvDrive, InputDrive ;InvDrive ; 02 DW TXTERR.FileNFound, ErrorLp ;FileNFound ; 03 DW TXTERR.InvPath, ErrorLp0 ;InvPath ; 04 DW 0, 0 ; 05 DW TXTERR.FileNFound, ErrorLp ;FileNFound ; 06 DW TXTERR.FILEexists, ErrorLp ;FILEexists ; 07 DW 0, 0 ; 08 DW TXTERR.ROOToverflow, ErrorLp ;ROOToverflow ; 09 DW TXTERR.NoDiskSpace, ErrorLp ;NoDiskSpace ; 0A DW TXTERR.DIRnotEmpty, ErrorLp ;DIRnotEmpty ; 0B DW 0, 0 ; 0C DW TXTERR.InvMedia, InputDrive ;InvMedia ; 0D DW 0, 0 ; 0E DW TXTERR.DIRexists, ErrorLp ;DIRexists ; 0F DW TXTERR.InvName, ErrorLp ;InvName ; 10 DW TXTERR.InvEXEfile, ErrorLp ;InvEXEfile ; 11 DW TXTERR.InvEXEver, ErrorLp ;InvEXEver ; 12 DW 0, 0 ; 13 DW TXTERR.NotReady, InputDrive ;NotReady ; 14 DW 0, 0 ; 15 DW 0, 0 ; 16 DW 0, 0 ; 17 DW TXTERR.WriteProtect, ErrorLp ;WriteProtect ; 18 ; [ ] 26/06/2024 DW 0, 0 ; 19 DW 0, 0 ; 1A DW 0, 0 ; 1B DW TXTERR.NotReady, InputDrive ;NotReady ; 1C DW 0, 0 ; 1D DW TXTERR.NoMemory, ErrorLp ;NoMemory ; 1E DW 0, 0 ; 1F DW 0, 0 ; 20 DW 0, 0 ; 21 DW 0, 0 ; 22 DW TXTERR.ToManyFilesDir,ErrorLp ;ToManyFilesDir ; 23 ; always last in the table: .UNKerror: DW TXTERR.UnknownError, ErrorLp ;UnknownError ; if no ERROR in this table then will show this message ; далее внутренние ошибки FN .PlugNotFound DW TXTERR.PlugNotFound, ErrorLp ;-------------------------------------------------------------- SETERRTEXT MACRO X,TEXT DW X ; X позиция печати DB TEXT,0 ; строка без 0 в конце ENDM TXTERR .PlugNotFound SETERRTEXT 56,"Plugin not found" .InvDrive SETERRTEXT 24 | 0x8000,"Invalid drive letter:" .FileNFound SETERRTEXT 60,"File not found" .InvPath SETERRTEXT 70,"Invalid path" .FILEexists SETERRTEXT 72,"File exists" .ROOToverflow SETERRTEXT 64,"ROOT overflow" .NoDiskSpace SETERRTEXT 62,"No disk space" .DIRnotEmpty SETERRTEXT 40,"Directory is not empty" .InvMedia SETERRTEXT 46 | 0x8000,"Invalid media:" .DIRexists SETERRTEXT 56,"Directory exists" .InvName SETERRTEXT 66,"Invalid name" .InvEXEfile SETERRTEXT 60,"Invalid EXE file" .InvEXEver SETERRTEXT 40,"Unsupport EXE version" .NotReady SETERRTEXT 36 | 0x8000,"Drive not ready:" .WriteProtect SETERRTEXT 37,"Drive is write protected" .NoMemory SETERRTEXT 52,"No memory space" .ToManyFilesDir SETERRTEXT 30,"Too many directory entries" .UnknownError SETERRTEXT 60,"Unknown Error" InputDrive PUSH IY SPDSS DSSF.CURDISK POP IY ADD A,'A' LD (CurDrv),A LD IX,DriveStr LD HL,ErrorTab1 CALL InputLine WINDOWCLOSE CALL SetClock LD A,(CurDrv) RES 5,A SUB 'A' PUSH IY SPDSS DSSF.CHDISK POP IY JP C,DOSErrorR LD HL,BegDIR PUSH IY SPDSS DSSF.CHDIR POP IY JP C,DOSErrorR CALL SetMouse LD A,0x01 RET ErrorTab1 DEFW 284,356,118,132,%0000000000000001,%0000000000000000,InputLine.InpLnExtN,0 DEFW 0x8000 DriveStr DEFB 0x01,0x00,0x00,0x00 DEFB 0x01 DEFW 0x015C,0x006A DEFW 0x000A DEFB 0xF0 CurDrv DUPL 0x02,0x00 ;-------------------------------------------------------------- ErrorLp0 LD IX,ErrorTab2 CALL TestCoords SPDSS DSSF.SCANKEY JR Z,ErrorLp0 LD A,B OR A JR NZ,ErrorLp0 LD A,E CP 0x1B JR Z,ErrorExt0 CP 0x0D JR Z,ErrorExt0 RES 5,A CP "O" JR NZ,ErrorLp0 ErrorExt0 WINDOWCLOSE CALL SetClock LD HL,BegDIR PUSH IY SPDSS DSSF.CHDIR POP IY JP C,DOSErrorR CALL SetMouse LD A,0x01 RET ErrorTab2 DEFW 284,356,118,132,%0000000000100001,%0000000000000000,ErrorExt0,0 DEFW 0x8000 ;-------------------------------------------------------------- ErrorLp LD IX,ErrorTab3 CALL TestCoords SPDSS DSSF.SCANKEY JR Z,ErrorLp LD A,B OR A JR NZ,ErrorLp LD A,E CP 0x1B JR Z,ErrorExt CP 0x0D JR Z,ErrorExt RES 5,A CP 'O' JR NZ,ErrorLp ErrorExt WINDOWCLOSE SUB A RET ErrorTab3 DEFW 284,356,118,132,%0000000000100001,%0000000000000000,ErrorExt,0 DEFW 0x8000