📄 inthndlr.c
字号:
/* Get Current Directory */
case 0x47:
rc = DosGetCuDir(lr.DL, MK_FP(lr.DS, lr.SI));
lr.AX = 0x0100; /*jpp: from interrupt list */
goto short_check;
/* Allocate memory */
case 0x48:
if ((rc = DosMemAlloc(lr.BX, mem_access_mode, &lr.AX, &lr.BX)) < 0)
{
DosMemLargest(&lr.BX);
if (DosMemCheck() != SUCCESS)
panic("MCB chain corrupted");
goto error_exit;
}
lr.AX++; /* DosMemAlloc() returns seg of MCB rather than data */
break;
/* Free memory */
case 0x49:
if ((rc = DosMemFree(lr.ES - 1)) < SUCCESS)
{
if (DosMemCheck() != SUCCESS)
panic("MCB chain corrupted");
goto error_exit;
}
break;
/* Set memory block size */
case 0x4a:
if (DosMemCheck() != SUCCESS)
panic("before 4a: MCB chain corrupted");
if ((rc = DosMemChange(lr.ES, lr.BX, &lr.BX)) < 0)
{
#if 0
if (cu_psp == lr.ES)
{
psp FAR *p = MK_FP(cu_psp, 0);
p->ps_size = lr.BX + cu_psp;
}
#endif
if (DosMemCheck() != SUCCESS)
panic("after 4a: MCB chain corrupted");
goto error_exit;
}
break;
/* Load and Execute Program */
case 0x4b:
break_flg = FALSE;
rc = DosExec(lr.AL, MK_FP(lr.ES, lr.BX), FP_DS_DX);
goto short_check;
/* Terminate Program */
case 0x00:
lr.AX = 0x4c00;
/* End Program */
case 0x4c:
if (((psp FAR *)MK_FP(cu_psp, 0))->ps_parent == cu_psp)
break;
tsr = FALSE;
rc = 0;
if (ErrorMode)
{
ErrorMode = FALSE;
rc = 0x200;
}
else if (break_flg)
{
break_flg = FALSE;
rc = 0x100;
}
return_code = lr.AL | rc;
if (DosMemCheck() != SUCCESS)
panic("MCB chain corrupted");
#ifdef TSC
StartTrace();
#endif
return_user();
break;
/* Get Child-program Return Value */
case 0x4d:
lr.AX = return_code;
/* needs to be cleared (RBIL) */
return_code = 0;
break;
/* Dos Find First */
case 0x4e:
/* dta for this call is set on entry. This */
/* needs to be changed for new versions. */
rc = DosFindFirst(lr.CX, FP_DS_DX);
lr.AX = 0;
goto short_check;
/* Dos Find Next */
case 0x4f:
/* dta for this call is set on entry. This */
/* needs to be changed for new versions. */
rc = DosFindNext();
lr.AX = 0;
goto short_check;
/*
case 0x50:
case 0x51:
see int21_syscall
*/
/* ************UNDOCUMENTED************************************* */
/* Get List of Lists */
case 0x52:
lr.ES = FP_SEG(&DPBp);
lr.BX = FP_OFF(&DPBp);
break;
case 0x53:
/* DOS 2+ internal - TRANSLATE BIOS PARAMETER BLOCK TO DRIVE PARAM BLOCK */
bpb_to_dpb((bpb FAR *) MK_FP(lr.DS, lr.SI),
(struct dpb FAR *)MK_FP(lr.ES, r->BP)
#ifdef WITHFAT32
, (lr.CX == 0x4558 && lr.DX == 0x4152)
#endif
);
break;
/* Get verify state */
case 0x54:
lr.AL = verify_ena;
break;
/* ************UNDOCUMENTED************************************* */
/* Dos Create New Psp & set p_size */
case 0x55:
child_psp(lr.DX, cu_psp, lr.SI);
cu_psp = lr.DX;
break;
/* Dos Rename */
case 0x56:
rc = DosRename(FP_DS_DX, FP_ES_DI);
goto short_check;
/* Get/Set File Date and Time */
case 0x57:
switch (lr.AL)
{
case 0x00:
rc = DosGetFtime((COUNT) lr.BX, /* Handle */
&lr.DX, /* FileDate */
&lr.CX); /* FileTime */
break;
case 0x01:
rc = DosSetFtime((COUNT) lr.BX, /* Handle */
(date) lr.DX, /* FileDate */
(time) lr.CX); /* FileTime */
break;
default:
goto error_invalid;
}
goto short_check;
/* Get/Set Allocation Strategy */
case 0x58:
switch (lr.AL)
{
case 0x00:
lr.AL = mem_access_mode;
lr.AH = 0;
break;
case 0x01:
if (lr.BL > LAST_FIT_U || /* 0x82 */
(lr.BL & FIT_MASK) > LAST_FIT) /* 0x3f, 0x02 */
goto error_invalid;
mem_access_mode = lr.BL;
break;
case 0x02:
lr.AL = uppermem_link;
break;
case 0x03:
if (uppermem_root != 0xffff) /* always error if not exists */
{
DosUmbLink(lr.BX);
break;
}
/* else fall through */
default:
goto error_invalid;
#ifdef DEBUG
case 0xff:
show_chain();
break;
#endif
}
break;
/* Get Extended Error */
case 0x59:
lr.AX = CritErrCode;
lr.ES = FP_SEG(CritErrDev);
lr.DI = FP_OFF(CritErrDev);
lr.CH = CritErrLocus;
lr.BH = CritErrClass;
lr.BL = CritErrAction;
break;
/* Create Temporary File */
case 0x5a:
lrc = DosMkTmp(FP_DS_DX, lr.CX);
goto long_check;
/* Create New File */
case 0x5b:
lrc = DosOpen(FP_DS_DX, O_LEGACY | O_RDWR | O_CREAT, lr.CX);
goto long_check;
/* /// Added for SHARE. - Ron Cemer */
/* Lock/unlock file access */
case 0x5c:
rc = DosLockUnlock
(lr.BX, ((unsigned long)lr.CX << 16) | lr.DX,
((unsigned long)lr.SI << 16) | lr.DI, lr.AL != 0);
if (rc != SUCCESS)
goto error_exit;
break;
/* /// End of additions for SHARE. - Ron Cemer */
/* UNDOCUMENTED: server, share.exe and sda function */
case 0x5d:
switch (lr.AL)
{
/* Remote Server Call */
case 0x00:
fmemcpy(&lr, FP_DS_DX, sizeof(lr));
goto dispatch;
case 0x06:
lr.DS = FP_SEG(internal_data);
lr.SI = FP_OFF(internal_data);
lr.CX = swap_indos - internal_data;
lr.DX = swap_always - internal_data;
CLEAR_CARRY_FLAG();
break;
case 0x07:
case 0x08:
case 0x09:
rc = remote_printredir(lr.DX, Int21AX);
CLEAR_CARRY_FLAG();
if (rc != SUCCESS)
goto error_exit;
break;
default:
CritErrCode = SUCCESS;
goto error_invalid;
}
break;
case 0x5e:
switch (lr.AL)
{
case 0x00:
lr.CX = get_machine_name(FP_DS_DX);
break;
case 0x01:
set_machine_name(FP_DS_DX, lr.CX);
break;
default:
rc = (int)network_redirector_mx(REM_PRINTSET, &lr, (void *)Int21AX);
goto short_check;
}
break;
case 0x5f:
if (lr.AL == 7 || lr.AL == 8)
{
struct cds FAR *cdsp;
if (lr.DL >= lastdrive)
{
rc = DE_INVLDDRV;
goto error_exit;
}
cdsp = &CDSp[lr.DL];
if (lr.AL == 7)
cdsp->cdsFlags |= CDSPHYSDRV;
else
cdsp->cdsFlags &= ~CDSPHYSDRV;
}
else
{
rc = (int)network_redirector_mx(REM_DOREDIRECT, &lr, (void *)Int21AX);
/* the remote function manipulates *r directly !,
so we should not copy lr to r here */
if (rc != SUCCESS)
{
CritErrCode = -rc; /* Maybe set */
SET_CARRY_FLAG();
}
r->AX = -rc;
goto real_exit;
}
break;
case 0x60: /* TRUENAME */
rc = DosTruename(MK_FP(lr.DS, lr.SI), adjust_far(FP_ES_DI));
goto short_check;
#ifdef TSC
/* UNDOCUMENTED: no-op */
/* */
/* DOS-C: tsc support */
case 0x61:
#ifdef DEBUG
switch (lr.AL)
{
case 0x01:
bTraceNext = TRUE;
break;
case 0x02:
bDumpRegs = FALSE;
break;
}
#endif
lr.AL = 0x00;
break;
#endif
/* UNDOCUMENTED: return current psp
case 0x62: is in int21_syscall
lr.BX = cu_psp;
break;
*/
/* UNDOCUMENTED: Double byte and korean tables */
case 0x63:
{
lr.DS = FP_SEG(&nlsDBCSHardcoded);
lr.SI = FP_OFF(&nlsDBCSHardcoded);
#if 0
/* not really supported, but will pass. */
lr.AL = 0x00; /*jpp: according to interrupt list */
/*Bart: fails for PQDI and WATCOM utilities:
use the above again */
#endif
break;
}
/*
case 0x64:
see above (invalid)
*/
/* Extended country info */
case 0x65:
switch (lr.AL)
{
case 0x20: /* upcase single character */
lr.DL = DosUpChar(lr.DL);
break;
case 0x21: /* upcase memory area */
DosUpMem(FP_DS_DX, lr.CX);
break;
case 0x22: /* upcase ASCIZ */
DosUpString(FP_DS_DX);
break;
case 0xA0: /* upcase single character of filenames */
lr.DL = DosUpFChar(lr.DL);
break;
case 0xA1: /* upcase memory area of filenames */
DosUpFMem(FP_DS_DX, lr.CX);
break;
case 0xA2: /* upcase ASCIZ of filenames */
DosUpFString(FP_DS_DX);
break;
case 0x23: /* check Yes/No response */
lr.AX = DosYesNo(lr.DL);
break;
default:
#ifdef NLS_DEBUG
if ((rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI)) < 0)
{
printf("DosGetData() := %d\n", rc);
goto error_exit;
}
printf("DosGetData() returned successfully\n");
break;
#else
rc = DosGetData(lr.AL, lr.BX, lr.DX, lr.CX, FP_ES_DI);
goto short_check;
#endif
}
break;
/* Code Page functions */
case 0x66:
switch (lr.AL)
{
case 1:
rc = DosGetCodepage(&lr.BX, &lr.DX);
break;
case 2:
rc = DosSetCodepage(lr.BX, lr.DX);
break;
default:
goto error_invalid;
}
if (rc != SUCCESS)
goto error_exit;
break;
/* Set Max file handle count */
case 0x67:
rc = SetJFTSize(lr.BX);
goto short_check;
/* Flush file buffer -- COMMIT FILE. */
case 0x68:
case 0x6a:
rc = DosCommit(lr.BX);
goto short_check;
/* Get/Set Serial Number */
case 0x69:
rc = (lr.BL == 0 ? default_drive : lr.BL - 1);
if (lr.AL < 2)
{
if (get_cds(rc) == NULL)
{
rc = DE_INVLDDRV;
goto error_exit;
}
if (get_dpb(rc) != NULL)
{
UWORD saveCX = lr.CX;
lr.CX = lr.AL == 0 ? 0x0866 : 0x0846;
lr.AL = 0x0d;
rc = DosDevIOctl(&lr);
lr.CX = saveCX;
goto short_check;
}
}
goto error_invalid;
/*
case 0x6a: see case 0x68
case 0x6b: dummy func: return AL=0
*/
/* Extended Open-Creat, not fully functional. (bits 4,5,6 of BH) */
case 0x6c:
/* high nibble must be <= 1, low nibble must be <= 2 */
if ((lr.DL & 0xef) > 0x2)
goto error_invalid;
lrc = DosOpen(MK_FP(lr.DS, lr.SI),
(lr.BX & 0x70ff) | ((lr.DL & 3) << 8) |
((lr.DL & 0x10) << 6), lr.CL);
if (lrc >= SUCCESS)
/* action */
lr.CX = (UWORD)(lrc >> 16);
goto long_check;
/* case 0x6d and above not implemented : see default; return AL=0 */
#ifdef WITHFAT32
/* LFN functions - fail with "function not supported" error code */
case 0x71:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -