$include (..\lib\compStch.ext) /* *============================================================================ * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE * * Permission to use for any purpose, modify, copy, and make enhancements * and derivative works of the software is granted if attribution is given to * R.M. Gillmore, dba the ACME Software Deli, as the author * * While the ACME Software Deli does not work for money, there is nonetheless * a significant amount of work involved. The ACME Software Deli maintains the * rights to all code written, though it may be used and distributed as long as * the following conditions are maintained. * * 1. The copyright statement at the top of each code block is maintained in * your distribution. * 2. You do not identify yourself as the ACME Software Deli * 3. Any changes made to the software are sent to the ACME Software Deli *============================================================================ */ errCodeModule: do; $if not noID declare IDString (*) byte data ( '@(#)errCode.p86 $Author: rmgillmore $ $Date:: 2025-05-04 19:35:39#$:', 0 ); $endif $include (..\lib\string.ext) $include (..\lib\numStrs.ext) $include (..\lib\sysCalls.ext) $set ( ERRCODE_IMPLEMENTATION ) $include (..\lib\errCode.ext) declare errorCodeListType literally ' structure ( errorNumber integer, errorString pointer )'; /* * The error code strings are NOT public because there is no reason for them to be so */ declare eStringMinus1 (*) byte data ( 'Reserved/Undefined', 0 ); /* Application exit code strings */ declare eAppString00h (*) byte data ( 'No errors Detected', 0 ), eAppString01h (*) byte data ( 'Warning Detected', 0 ), eAppString02h (*) byte data ( 'Error Detected', 0 ), /* * 03h - reserved */ eAppString04h (*) byte data ( 'Fatal Error Detected', 0 ), eAppString05h (*) byte data ( 'Aborted', 0 ), eAppString06h (*) byte data ( 'Invalid Number Arguments', 0 ), eAppString07h (*) byte data ( 'Invalid Argument Detected', 0 ), eAppString08h (*) byte data ( 'Insufficient Memory', 0 ), eAppString09h (*) byte data ( 'Program Does Not Exist', 0 ), eAppString0ah (*) byte data ( 'Input File Not Specified', 0 ), eAppString0bh (*) byte data ( 'File Not Specified', 0 ), eAppString0ch (*) byte data ( 'Output File Not Specified', 0 ), eAppString0dh (*) byte data ( 'Invalid Environment', 0 ), eAppString0eh (*) byte data ( 'Data File Does Not Exist', 0 ), /* * 0fh-10h - reserved */ eAppString11h (*) byte data ( 'Case/Switch Statement Error Detected', 0 ), eAppString12h (*) byte data ( 'Unable to Open Input', 0 ), eAppString13h (*) byte data ( 'Unable to Open Output', 0 ), eAppString14h (*) byte data ( 'Data File Corrupt', 0 ); declare appExitCodeList (*) errorCodeListType data ( /* * What it means (in English) translation table - application exit */ 00h, @eAppString00h, 01h, @eAppString01h, 02h, @eAppString02h, /* * 03h - reserved */ 04h, @eAppString04h, 05h, @eAppString05h, 06h, @eAppString06h, 07h, @eAppString07h, 08h, @eAppString08h, 09h, @eAppString09h, 0ah, @eAppString0ah, 0bh, @eAppString0bh, 0ch, @eAppString0ch, 0dh, @eAppString0dh, 0eh, @eAppString0eh, /* * 0fh-10h - reserved */ 11h, @eAppString11h, 12h, @eAppString12h, 13h, @eAppString13h, 14h, @eAppString14h, -1, @eStringMinus1 ); /* DOS function error code strings */ declare eDosString00h (*) byte data ( 'no error', 0 ), eDosString01h (*) byte data ( 'function number invalid', 0 ), eDosString02h (*) byte data ( 'file not found', 0 ), eDosString03h (*) byte data ( 'path not found', 0 ), eDosString04h (*) byte data ( 'too many open files (no handles available)', 0 ), eDosString05h (*) byte data ( 'access denied', 0 ), eDosString06h (*) byte data ( 'invalid handle', 0 ), eDosString07h (*) byte data ( 'memory control block destroyed', 0 ), eDosString08h (*) byte data ( 'insufficient memory', 0 ), eDosString09h (*) byte data ( 'memory block address invalid', 0 ), eDosString0Ah (*) byte data ( 'environment invalid', 0 ), eDosString0Bh (*) byte data ( 'format invalid', 0 ), eDosString0Ch (*) byte data ( 'access code invalid', 0 ), eDosString0Dh (*) byte data ( 'data invalid', 0 ), eDosString0Fh (*) byte data ( 'invalid drive', 0 ), eDosString10h (*) byte data ( 'attempted to remove current directory', 0 ), eDosString11h (*) byte data ( 'not same device', 0 ), eDosString12h (*) byte data ( 'no more files', 0 ), eDosString13h (*) byte data ( 'disk write-protected', 0 ), eDosString14h (*) byte data ( 'unknown unit', 0 ), eDosString15h (*) byte data ( 'drive not ready', 0 ), eDosString16h (*) byte data ( 'unknown command', 0 ), eDosString17h (*) byte data ( 'data error (CRC)', 0 ), eDosString18h (*) byte data ( 'bad request structure length', 0 ), eDosString19h (*) byte data ( 'seek error', 0 ), eDosString1Ah (*) byte data ( 'unknown media type (non-DOS disk)', 0 ), eDosString1Bh (*) byte data ( 'sector not found', 0 ), eDosString1Ch (*) byte data ( 'printer out of paper', 0 ), eDosString1Dh (*) byte data ( 'write fault', 0 ), eDosString1Eh (*) byte data ( 'read fault', 0 ), eDosString1Fh (*) byte data ( 'general failure', 0 ), eDosString20h (*) byte data ( 'sharing violation', 0 ), eDosString21h (*) byte data ( 'lock violation', 0 ), eDosString22h (*) byte data ( 'disk change invalid', 0 ), eDosString23h (*) byte data ( 'FCB unavailable', 0 ), eDosString24h (*) byte data ( 'sharing buffer overflow', 0 ), /* * 25h-31h reserved */ eDosString32h (*) byte data ( 'Network request not supported (DOS 3.1 + MS Networks)', 0 ), eDosString33h (*) byte data ( 'Remote computer not listening', 0 ), eDosString34h (*) byte data ( 'Duplicate name on network', 0 ), eDosString35h (*) byte data ( 'Network name not found', 0 ), eDosString36h (*) byte data ( 'Network busy', 0 ), eDosString37h (*) byte data ( 'Network device no longer exists', 0 ), eDosString38h (*) byte data ( 'Network BIOS command limit exceeded', 0 ), eDosString39h (*) byte data ( 'Network adapter hardware error', 0 ), eDosString3Ah (*) byte data ( 'Incorrect response from network', 0 ), eDosString3Bh (*) byte data ( 'Unexpected network error', 0 ), eDosString3Ch (*) byte data ( 'Incompatible remote adapter', 0 ), eDosString3Dh (*) byte data ( 'Print queue full', 0 ), eDosString3Eh (*) byte data ( 'Queue not full', 0 ), eDosString3Fh (*) byte data ( 'Not enough space to print file', 0 ), eDosString40h (*) byte data ( 'Network name was deleted', 0 ), eDosString41h (*) byte data ( 'Network: Access denied', 0 ), eDosString42h (*) byte data ( 'Network device type incorrect', 0 ), eDosString43h (*) byte data ( 'Network name not found', 0 ), eDosString44h (*) byte data ( 'Network name limit exceeded', 0 ), eDosString45h (*) byte data ( 'Network BIOS session limit exceeded', 0 ), eDosString46h (*) byte data ( 'Temporarily paused', 0 ), eDosString47h (*) byte data ( 'Network request not accepted', 0 ), eDosString48h (*) byte data ( 'Print/disk redirection paused (DOS 3.1 + MS Networks)', 0 ), /* * 49h-4Fh reserved */ eDosString50h (*) byte data ( 'file exists', 0 ), /* * 51h reserved */ eDosString52h (*) byte data ( 'cannot make directory', 0 ), eDosString53h (*) byte data ( 'fail on INT 24h', 0 ), eDosString54h (*) byte data ( '(DOS 3.3) too many redirections', 0 ), eDosString55h (*) byte data ( '(DOS 3.3) duplicate redirection', 0 ), eDosString56h (*) byte data ( '(DOS 3.3) invalid password', 0 ), eDosString57h (*) byte data ( '(DOS 3.3) invalid parameter', 0 ), eDosString58h (*) byte data ( '(DOS 3.3) network write fault', 0 ); declare osErrorCodeList (*) errorCodeListType data ( /* * What it means (in English) translation table - OS errors */ 00h, @eDosString00h, 01h, @eDosString01h, 02h, @eDosString02h, 03h, @eDosString03h, 04h, @eDosString04h, 05h, @eDosString05h, 06h, @eDosString06h, 07h, @eDosString07h, 08h, @eDosString08h, 09h, @eDosString09h, 0Ah, @eDosString0Ah, 0Bh, @eDosString0Bh, 0Ch, @eDosString0Ch, 0Dh, @eDosString0Dh, 0Fh, @eDosString0Fh, 10h, @eDosString10h, 11h, @eDosString11h, 12h, @eDosString12h, 13h, @eDosString13h, 14h, @eDosString14h, 15h, @eDosString15h, 16h, @eDosString16h, 17h, @eDosString17h, 18h, @eDosString18h, 19h, @eDosString19h, 1Ah, @eDosString1Ah, 1Bh, @eDosString1Bh, 1Ch, @eDosString1Ch, 1Dh, @eDosString1Dh, 1Eh, @eDosString1Eh, 1Fh, @eDosString1Fh, 20h, @eDosString20h, 21h, @eDosString21h, 22h, @eDosString22h, 23h, @eDosString23h, 24h, @eDosString24h, /* * 25h-31h reserved */ 32h, @eDosString32h, 33h, @eDosString33h, 34h, @eDosString34h, 35h, @eDosString35h, 36h, @eDosString36h, 37h, @eDosString37h, 38h, @eDosString38h, 39h, @eDosString39h, 3Ah, @eDosString3Ah, 3Bh, @eDosString3Bh, 3Ch, @eDosString3Ch, 3Dh, @eDosString3Dh, 3Eh, @eDosString3Eh, 3Fh, @eDosString3Fh, 40h, @eDosString40h, 41h, @eDosString41h, 42h, @eDosString42h, 43h, @eDosString43h, 44h, @eDosString44h, 45h, @eDosString45h, 46h, @eDosString46h, 47h, @eDosString47h, 48h, @eDosString48h, /* * 49h-4Fh reserved */ 50h, @eDosString50h, /* * 51h reserved */ 52h, @eDosString52h, 53h, @eDosString53h, 54h, @eDosString54h, 55h, @eDosString55h, 56h, @eDosString56h, 57h, @eDosString57h, 58h, @eDosString58h, -1, @eStringMinus1 ); decodeError: procedure ( errorType, errorNumber, stringPtr ) reentrant public; declare errorType errorType_t, errorNumber integer, stringPtr pointer, string based stringPtr (*) byte, index integer; declare errorCodeListArray (*) pointer data ( @appExitCodeList, @osErrorCodeList ), errorCodeListPtr pointer, errorCodeList based errorCodeListPtr (*) errorCodeListType; /* * point to the proper list, based on the errorType */ errorCodeListPtr = errorCodeListArray( errorType ); /* * We start at the beginning of the array every time */ index = 0; searchForNumber: do while ( ( errorNumber <> errorCodeList( index ).errorNumber ) and ( errorCodeList( index ).errorNumber <> -1 ) ); index = index + 1; end searchForNumber; /* * We have found what we are looking for. Format a string to return to the caller */ call strcpy( stringPtr, @( 'OS error ', 0 ) ); call integerToString( errorNumber, @string( strlen( stringPtr ) ) ); call strcat( stringPtr, @( ': ', 0 ) ); call strcat( stringPtr, errorCodeList( index ).errorString ); end decodeError; extendedErrorCode: procedure word reentrant public; declare cpuRegisters; byteRegs.AH = 59h; wordRegs.BX = 0; call int86( DOS_CALL, @wordRegs ); return ( wordRegs.Ax ); end extendedErrorCode; end errCodeModule;