mirror of https://github.com/FDOS/kernel.git
inthndlr.c cleanups (merge common code into long_check and short_check),
mostly from Lucho. git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@932 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
parent
5dce77cd3b
commit
6f145e9834
|
@ -383,6 +383,7 @@ int int21_fat32(lregs *r)
|
||||||
VOID ASMCFUNC int21_service(iregs FAR * r)
|
VOID ASMCFUNC int21_service(iregs FAR * r)
|
||||||
{
|
{
|
||||||
COUNT rc = 0;
|
COUNT rc = 0;
|
||||||
|
long lrc;
|
||||||
lregs lr; /* 8 local registers (ax, bx, cx, dx, si, di, ds, es) */
|
lregs lr; /* 8 local registers (ax, bx, cx, dx, si, di, ds, es) */
|
||||||
|
|
||||||
#define FP_DS_DX (MK_FP(lr.DS, lr.DX))
|
#define FP_DS_DX (MK_FP(lr.DS, lr.DX))
|
||||||
|
@ -476,8 +477,7 @@ dispatch:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
r->FLAGS &= ~FLG_ZERO;
|
r->FLAGS &= ~FLG_ZERO;
|
||||||
lr.AL = read_char_stdin(FALSE);
|
/* fall through */
|
||||||
break;
|
|
||||||
|
|
||||||
/* Direct Console Input */
|
/* Direct Console Input */
|
||||||
case 0x07:
|
case 0x07:
|
||||||
|
@ -860,110 +860,64 @@ dispatch:
|
||||||
|
|
||||||
/* Dos Create Directory */
|
/* Dos Create Directory */
|
||||||
case 0x39:
|
case 0x39:
|
||||||
rc = DosMkdir((BYTE FAR *) FP_DS_DX);
|
rc = DosMkdir(FP_DS_DX);
|
||||||
if (rc != SUCCESS)
|
goto short_check;
|
||||||
goto error_exit;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Dos Remove Directory */
|
/* Dos Remove Directory */
|
||||||
case 0x3a:
|
case 0x3a:
|
||||||
rc = DosRmdir((BYTE FAR *) FP_DS_DX);
|
rc = DosRmdir(FP_DS_DX);
|
||||||
if (rc != SUCCESS)
|
goto short_check;
|
||||||
goto error_exit;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Dos Change Directory */
|
/* Dos Change Directory */
|
||||||
case 0x3b:
|
case 0x3b:
|
||||||
if ((rc = DosChangeDir((BYTE FAR *) FP_DS_DX)) < 0)
|
rc = DosChangeDir(FP_DS_DX);
|
||||||
goto error_exit;
|
goto short_check;
|
||||||
break;
|
|
||||||
|
|
||||||
/* Dos Create File */
|
/* Dos Create File */
|
||||||
case 0x3c:
|
case 0x3c:
|
||||||
{
|
lrc = DosOpen(FP_DS_DX, O_LEGACY | O_RDWR | O_CREAT | O_TRUNC, lr.CL);
|
||||||
long lrc = DosOpen(FP_DS_DX, O_LEGACY | O_RDWR | O_CREAT | O_TRUNC, lr.CL);
|
goto long_check;
|
||||||
|
|
||||||
if (lrc < 0)
|
|
||||||
{
|
|
||||||
rc = (COUNT)lrc;
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
lr.AX = (UWORD)lrc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dos Open */
|
/* Dos Open */
|
||||||
case 0x3d:
|
case 0x3d:
|
||||||
{
|
lrc = DosOpen(FP_DS_DX, O_LEGACY | O_OPEN | lr.AL, 0);
|
||||||
long lrc = DosOpen(FP_DS_DX, O_LEGACY | O_OPEN | lr.AL, 0);
|
goto long_check;
|
||||||
|
|
||||||
if (lrc < 0)
|
|
||||||
{
|
|
||||||
rc = (COUNT)lrc;
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
lr.AX = (UWORD)lrc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dos Close */
|
/* Dos Close */
|
||||||
case 0x3e:
|
case 0x3e:
|
||||||
if ((rc = DosClose(lr.BX)) < 0)
|
rc = DosClose(lr.BX);
|
||||||
goto error_exit;
|
goto short_check;
|
||||||
break;
|
|
||||||
|
|
||||||
/* Dos Read */
|
/* Dos Read */
|
||||||
case 0x3f:
|
case 0x3f:
|
||||||
{
|
lrc = DosRead(lr.BX, lr.CX, FP_DS_DX);
|
||||||
long lrc = DosRead(lr.BX, lr.CX, FP_DS_DX);
|
goto long_check;
|
||||||
if (lrc < SUCCESS)
|
|
||||||
{
|
|
||||||
rc = (int)lrc;
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
lr.AX = (UWORD)lrc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Dos Write */
|
/* Dos Write */
|
||||||
case 0x40:
|
case 0x40:
|
||||||
{
|
lrc = DosWrite(lr.BX, lr.CX, FP_DS_DX);
|
||||||
long lrc = DosWrite(lr.BX, lr.CX, FP_DS_DX);
|
goto long_check;
|
||||||
if (lrc < SUCCESS)
|
|
||||||
{
|
|
||||||
rc = (int)lrc;
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
lr.AX = (UWORD)lrc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Dos Delete File */
|
/* Dos Delete File */
|
||||||
case 0x41:
|
case 0x41:
|
||||||
rc = DosDelete((BYTE FAR *) FP_DS_DX, D_ALL);
|
rc = DosDelete((BYTE FAR *) FP_DS_DX, D_ALL);
|
||||||
if (rc < 0)
|
goto short_check;
|
||||||
goto error_exit;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Dos Seek */
|
/* Dos Seek */
|
||||||
case 0x42:
|
case 0x42:
|
||||||
|
if (lr.AL > 2)
|
||||||
|
goto error_invalid;
|
||||||
|
lrc = DosSeek(lr.BX, (LONG)((((ULONG) (lr.CX)) << 16) | lr.DX), lr.AL);
|
||||||
|
if (lrc == -1)
|
||||||
{
|
{
|
||||||
ULONG lrc;
|
lrc = -DE_INVLDHNDL;
|
||||||
if (lr.AL > 2)
|
|
||||||
goto error_invalid;
|
|
||||||
lrc = DosSeek(lr.BX, (LONG)((((ULONG) (lr.CX)) << 16) | lr.DX), lr.AL);
|
|
||||||
if (lrc == (ULONG)-1)
|
|
||||||
{
|
|
||||||
rc = -DE_INVLDHNDL;
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lr.DX = (UWORD)(lrc >> 16);
|
|
||||||
lr.AX = (UWORD) lrc;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
else
|
||||||
|
{
|
||||||
|
lr.DX = (UWORD)(lrc >> 16);
|
||||||
|
lrc = (UWORD) lrc;
|
||||||
|
}
|
||||||
|
goto long_check;
|
||||||
|
|
||||||
/* Get/Set File Attributes */
|
/* Get/Set File Attributes */
|
||||||
case 0x43:
|
case 0x43:
|
||||||
|
@ -984,9 +938,7 @@ dispatch:
|
||||||
default:
|
default:
|
||||||
goto error_invalid;
|
goto error_invalid;
|
||||||
}
|
}
|
||||||
if (rc < SUCCESS)
|
goto short_check;
|
||||||
goto error_exit;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Device I/O Control */
|
/* Device I/O Control */
|
||||||
case 0x44:
|
case 0x44:
|
||||||
|
@ -1003,31 +955,21 @@ dispatch:
|
||||||
|
|
||||||
/* Duplicate File Handle */
|
/* Duplicate File Handle */
|
||||||
case 0x45:
|
case 0x45:
|
||||||
{
|
lrc = DosDup(lr.BX);
|
||||||
long lrc = DosDup(lr.BX);
|
goto long_check;
|
||||||
if (lrc < SUCCESS)
|
|
||||||
{
|
|
||||||
rc = (COUNT)lrc;
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
lr.AX = (UWORD)lrc;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Force Duplicate File Handle */
|
/* Force Duplicate File Handle */
|
||||||
case 0x46:
|
case 0x46:
|
||||||
rc = DosForceDup(lr.BX, lr.CX);
|
rc = DosForceDup(lr.BX, lr.CX);
|
||||||
if (rc < SUCCESS)
|
goto short_check;
|
||||||
goto error_exit;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Get Current Directory */
|
/* Get Current Directory */
|
||||||
case 0x47:
|
case 0x47:
|
||||||
if ((rc = DosGetCuDir(lr.DL, MK_FP(lr.DS, lr.SI))) < 0)
|
rc = DosGetCuDir(lr.DL, MK_FP(lr.DS, lr.SI));
|
||||||
goto error_exit;
|
if (rc >= SUCCESS)
|
||||||
else
|
|
||||||
lr.AX = 0x0100; /*jpp: from interrupt list */
|
lr.AX = 0x0100; /*jpp: from interrupt list */
|
||||||
break;
|
goto short_check;
|
||||||
|
|
||||||
/* Allocate memory */
|
/* Allocate memory */
|
||||||
case 0x48:
|
case 0x48:
|
||||||
|
@ -1082,9 +1024,8 @@ dispatch:
|
||||||
case 0x4b:
|
case 0x4b:
|
||||||
break_flg = FALSE;
|
break_flg = FALSE;
|
||||||
|
|
||||||
if ((rc = DosExec(lr.AL, MK_FP(lr.ES, lr.BX), FP_DS_DX)) != SUCCESS)
|
rc = DosExec(lr.AL, MK_FP(lr.ES, lr.BX), FP_DS_DX);
|
||||||
goto error_exit;
|
goto short_check;
|
||||||
break;
|
|
||||||
|
|
||||||
/* Terminate Program */
|
/* Terminate Program */
|
||||||
case 0x00:
|
case 0x00:
|
||||||
|
@ -1129,19 +1070,19 @@ dispatch:
|
||||||
case 0x4e:
|
case 0x4e:
|
||||||
/* dta for this call is set on entry. This */
|
/* dta for this call is set on entry. This */
|
||||||
/* needs to be changed for new versions. */
|
/* needs to be changed for new versions. */
|
||||||
if ((rc = DosFindFirst((UCOUNT) lr.CX, (BYTE FAR *) FP_DS_DX)) < 0)
|
rc = DosFindFirst(lr.CX, FP_DS_DX);
|
||||||
goto error_exit;
|
if (rc >= SUCCESS)
|
||||||
lr.AX = 0;
|
lr.AX = 0;
|
||||||
break;
|
goto short_check;
|
||||||
|
|
||||||
/* Dos Find Next */
|
/* Dos Find Next */
|
||||||
case 0x4f:
|
case 0x4f:
|
||||||
/* dta for this call is set on entry. This */
|
/* dta for this call is set on entry. This */
|
||||||
/* needs to be changed for new versions. */
|
/* needs to be changed for new versions. */
|
||||||
if ((rc = DosFindNext()) < 0)
|
rc = DosFindNext();
|
||||||
goto error_exit;
|
if (rc >= SUCCESS)
|
||||||
lr.AX = -SUCCESS;
|
lr.AX = 0;
|
||||||
break;
|
goto short_check;
|
||||||
/*
|
/*
|
||||||
case 0x50:
|
case 0x50:
|
||||||
case 0x51:
|
case 0x51:
|
||||||
|
@ -1178,11 +1119,8 @@ dispatch:
|
||||||
|
|
||||||
/* Dos Rename */
|
/* Dos Rename */
|
||||||
case 0x56:
|
case 0x56:
|
||||||
rc = DosRename((BYTE FAR *) FP_DS_DX,
|
rc = DosRename(FP_DS_DX, FP_ES_DI);
|
||||||
(BYTE FAR *) FP_ES_DI);
|
goto short_check;
|
||||||
if (rc < SUCCESS)
|
|
||||||
goto error_exit;
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Get/Set File Date and Time */
|
/* Get/Set File Date and Time */
|
||||||
case 0x57:
|
case 0x57:
|
||||||
|
@ -1192,22 +1130,18 @@ dispatch:
|
||||||
rc = DosGetFtime((COUNT) lr.BX, /* Handle */
|
rc = DosGetFtime((COUNT) lr.BX, /* Handle */
|
||||||
&lr.DX, /* FileDate */
|
&lr.DX, /* FileDate */
|
||||||
&lr.CX); /* FileTime */
|
&lr.CX); /* FileTime */
|
||||||
if (rc < SUCCESS)
|
|
||||||
goto error_exit;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x01:
|
case 0x01:
|
||||||
rc = DosSetFtime((COUNT) lr.BX, /* Handle */
|
rc = DosSetFtime((COUNT) lr.BX, /* Handle */
|
||||||
(date) lr.DX, /* FileDate */
|
(date) lr.DX, /* FileDate */
|
||||||
(time) lr.CX); /* FileTime */
|
(time) lr.CX); /* FileTime */
|
||||||
if (rc < SUCCESS)
|
|
||||||
goto error_exit;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
goto error_invalid;
|
goto error_invalid;
|
||||||
}
|
}
|
||||||
break;
|
goto short_check;
|
||||||
|
|
||||||
/* Get/Set Allocation Strategy */
|
/* Get/Set Allocation Strategy */
|
||||||
case 0x58:
|
case 0x58:
|
||||||
|
@ -1266,16 +1200,8 @@ dispatch:
|
||||||
|
|
||||||
/* Create New File */
|
/* Create New File */
|
||||||
case 0x5b:
|
case 0x5b:
|
||||||
{
|
lrc = DosOpen(FP_DS_DX, O_LEGACY | O_RDWR | O_CREAT, lr.CX);
|
||||||
long lrc = DosOpen(FP_DS_DX, O_LEGACY | O_RDWR | O_CREAT, lr.CX);
|
goto long_check;
|
||||||
if (lrc < 0)
|
|
||||||
{
|
|
||||||
rc = (COUNT)lrc;
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
lr.AX = (UWORD)lrc;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* /// Added for SHARE. - Ron Cemer */
|
/* /// Added for SHARE. - Ron Cemer */
|
||||||
/* Lock/unlock file access */
|
/* Lock/unlock file access */
|
||||||
|
@ -1378,9 +1304,8 @@ dispatch:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x60: /* TRUENAME */
|
case 0x60: /* TRUENAME */
|
||||||
if ((rc = DosTruename(MK_FP(lr.DS, lr.SI), adjust_far(FP_ES_DI))) < SUCCESS)
|
rc = DosTruename(MK_FP(lr.DS, lr.SI), adjust_far(FP_ES_DI));
|
||||||
goto error_exit;
|
goto short_check;
|
||||||
break;
|
|
||||||
|
|
||||||
#ifdef TSC
|
#ifdef TSC
|
||||||
/* UNDOCUMENTED: no-op */
|
/* UNDOCUMENTED: no-op */
|
||||||
|
@ -1453,19 +1378,18 @@ dispatch:
|
||||||
lr.AX = DosYesNo(lr.DL);
|
lr.AX = DosYesNo(lr.DL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if ((rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX,
|
|
||||||
FP_ES_DI)) < 0)
|
|
||||||
{
|
|
||||||
#ifdef NLS_DEBUG
|
#ifdef NLS_DEBUG
|
||||||
|
if ((rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI)) < 0)
|
||||||
|
{
|
||||||
printf("DosGetData() := %d\n", rc);
|
printf("DosGetData() := %d\n", rc);
|
||||||
#endif
|
|
||||||
goto error_exit;
|
goto error_exit;
|
||||||
}
|
}
|
||||||
#ifdef NLS_DEBUG
|
|
||||||
printf("DosGetData() returned successfully\n", rc);
|
printf("DosGetData() returned successfully\n", rc);
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
#else
|
||||||
|
rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI);
|
||||||
|
goto short_check;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1489,16 +1413,14 @@ dispatch:
|
||||||
|
|
||||||
/* Set Max file handle count */
|
/* Set Max file handle count */
|
||||||
case 0x67:
|
case 0x67:
|
||||||
if ((rc = SetJFTSize(lr.BX)) != SUCCESS)
|
rc = SetJFTSize(lr.BX);
|
||||||
goto error_exit;
|
goto short_check;
|
||||||
break;
|
|
||||||
|
|
||||||
/* Flush file buffer -- COMMIT FILE. */
|
/* Flush file buffer -- COMMIT FILE. */
|
||||||
case 0x68:
|
case 0x68:
|
||||||
case 0x6a:
|
case 0x6a:
|
||||||
if ((rc = DosCommit(lr.BX)) < 0)
|
rc = DosCommit(lr.BX);
|
||||||
goto error_exit;
|
goto short_check;
|
||||||
break;
|
|
||||||
|
|
||||||
/* Get/Set Serial Number */
|
/* Get/Set Serial Number */
|
||||||
case 0x69:
|
case 0x69:
|
||||||
|
@ -1516,9 +1438,7 @@ dispatch:
|
||||||
lr.AL = 0x0d;
|
lr.AL = 0x0d;
|
||||||
rc = DosDevIOctl(&lr);
|
rc = DosDevIOctl(&lr);
|
||||||
lr.CX = saveCX;
|
lr.CX = saveCX;
|
||||||
if (rc != SUCCESS)
|
goto short_check;
|
||||||
goto error_exit;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1530,28 +1450,16 @@ dispatch:
|
||||||
*/
|
*/
|
||||||
/* Extended Open-Creat, not fully functional. (bits 4,5,6 of BH) */
|
/* Extended Open-Creat, not fully functional. (bits 4,5,6 of BH) */
|
||||||
case 0x6c:
|
case 0x6c:
|
||||||
{
|
/* high nibble must be <= 1, low nibble must be <= 2 */
|
||||||
long lrc;
|
if ((lr.DL & 0xef) > 0x2)
|
||||||
|
goto error_invalid;
|
||||||
/* high nibble must be <= 1, low nibble must be <= 2 */
|
lrc = DosOpen(MK_FP(lr.DS, lr.SI),
|
||||||
if ((lr.DL & 0xef) > 0x2)
|
(lr.BX & 0x70ff) | ((lr.DL & 3) << 8) |
|
||||||
goto error_invalid;
|
((lr.DL & 0x10) << 6), lr.CL);
|
||||||
lrc = DosOpen(MK_FP(lr.DS, lr.SI),
|
if (lrc >= SUCCESS)
|
||||||
(lr.BX & 0x70ff) | ((lr.DL & 3) << 8) |
|
/* action */
|
||||||
((lr.DL & 0x10) << 6), lr.CL);
|
lr.CX = (UWORD)(lrc >> 16);
|
||||||
if (lrc < 0)
|
goto long_check;
|
||||||
{
|
|
||||||
rc = (COUNT)lrc;
|
|
||||||
goto error_exit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
lr.AX = (UWORD)lrc;
|
|
||||||
/* action */
|
|
||||||
lr.CX = (UWORD)(lrc >> 16);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* case 0x6d and above not implemented : see default; return AL=0 */
|
/* case 0x6d and above not implemented : see default; return AL=0 */
|
||||||
|
|
||||||
|
@ -1566,11 +1474,9 @@ dispatch:
|
||||||
CLEAR_CARRY_FLAG();
|
CLEAR_CARRY_FLAG();
|
||||||
CritErrCode = SUCCESS;
|
CritErrCode = SUCCESS;
|
||||||
rc = int21_fat32(&lr);
|
rc = int21_fat32(&lr);
|
||||||
if (rc != SUCCESS)
|
goto short_check;
|
||||||
goto error_exit;
|
|
||||||
break;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WITHLFNAPI
|
#ifdef WITHLFNAPI
|
||||||
/* FreeDOS LFN helper API functions */
|
/* FreeDOS LFN helper API functions */
|
||||||
case 0x74:
|
case 0x74:
|
||||||
|
@ -1612,7 +1518,18 @@ dispatch:
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
goto exit_dispatch;
|
goto exit_dispatch;
|
||||||
|
long_check:
|
||||||
|
if (lrc < SUCCESS)
|
||||||
|
{
|
||||||
|
rc = (int)lrc;
|
||||||
|
goto error_exit;
|
||||||
|
}
|
||||||
|
lr.AX = (UWORD)lrc;
|
||||||
|
goto exit_dispatch;
|
||||||
|
short_check:
|
||||||
|
if (rc < SUCCESS)
|
||||||
|
goto error_exit;
|
||||||
|
goto exit_dispatch;
|
||||||
error_invalid:
|
error_invalid:
|
||||||
rc = DE_INVLDFUNC;
|
rc = DE_INVLDFUNC;
|
||||||
error_exit:
|
error_exit:
|
||||||
|
|
Loading…
Reference in New Issue