📄 inthndlr.c
字号:
else
r -> AL = 0xff;
break;
case 0x24:
FcbSetRandom(MK_FP(r -> DS, r -> DX));
break;
/* Set Interrupt Vector */
case 0x25:
{
VOID (INRPT FAR *p)() = MK_FP(r -> DS, r -> DX);
setvec(r -> AL, p);
}
break;
/* Dos Create New Psp */
case 0x26:
{
psp FAR *p = MK_FP(cu_psp, 0);
new_psp((psp FAR *)MK_FP(r -> DX, 0), p -> ps_size);
}
break;
case 0x27:
{
COUNT nErrorCode;
if(FcbRandomBlockRead(MK_FP(r -> DS, r -> DX), r -> CX, &nErrorCode))
r -> AL = 0;
else
r -> AL = nErrorCode;
break;
}
case 0x28:
{
COUNT nErrorCode;
if(FcbRandomBlockWrite(MK_FP(r -> DS, r -> DX), r -> CX, &nErrorCode))
r -> AL = 0;
else
r -> AL = nErrorCode;
break;
}
/* Parse File Name */
case 0x29:
{
BYTE FAR *lpFileName;
lpFileName = MK_FP(r -> DS, r -> SI);
r -> AL = FcbParseFname(r -> AL,
&lpFileName,
MK_FP(r -> ES, r -> DI));
r -> DS = FP_SEG(lpFileName);
r -> SI = FP_OFF(lpFileName);
}
break;
/* Get Date */
case 0x2a:
DosGetDate(
(BYTE FAR *)&(r -> AL), /* WeekDay */
(BYTE FAR *)&(r -> DH), /* Month */
(BYTE FAR *)&(r -> DL), /* MonthDay */
(COUNT FAR *)&(r -> CX)); /* Year */
break;
/* Set Date */
case 0x2b:
rc = DosSetDate(
(BYTE FAR *)&(r -> DH), /* Month */
(BYTE FAR *)&(r -> DL), /* MonthDay */
(COUNT FAR *)&(r -> CX)); /* Year */
if(rc != SUCCESS)
r -> AL = 0xff;
else
r -> AL = 0;
break;
/* Get Time */
case 0x2c:
DosGetTime(
(BYTE FAR *)&(r -> CH), /* Hour */
(BYTE FAR *)&(r -> CL), /* Minutes */
(BYTE FAR *)&(r -> DH), /* Seconds */
(BYTE FAR *)&(r -> DL)); /* Hundredths */
break;
/* Set Date */
case 0x2d:
rc = DosSetTime(
(BYTE FAR *)&(r -> CH), /* Hour */
(BYTE FAR *)&(r -> CL), /* Minutes */
(BYTE FAR *)&(r -> DH), /* Seconds */
(BYTE FAR *)&(r -> DL)); /* Hundredths */
if(rc != SUCCESS)
r -> AL = 0xff;
else
r -> AL = 0;
break;
/* Set verify flag */
case 0x2e:
verify_ena = (r -> AL ? TRUE : FALSE);
break;
/* Get DTA */
case 0x2f:
r -> ES = FP_SEG(dta);
r -> BX = FP_OFF(dta);
break;
/* Get DOS Version */
case 0x30:
r -> AL = os_major;
r -> AH = os_minor;
switch(r -> AL)
{
default:
case 0:
r -> BH= OEM_ID;
break;
case 1:
r -> BH = 0; /* RAM only for now */
break;
}
r -> BL = 0xff; /* for now */
r -> CX = 0xffff;
break;
/* Keep Program */
case 0x31:
DosMemChange(cu_psp, r -> DX < 6 ? 6 : r -> DX, 0);
//flush();
return_mode = 3;
return_code = r -> AL;
tsr = TRUE;
return_user();
break;
/* Get DPB */
case 0x32:
if (r -> DL < nblkdev)
{
struct dpb FAR *dpb = &blk_devices[r -> DL];
r -> DS = FP_SEG(dpb);
r -> BX = FP_OFF(dpb);
r -> AL = 0;
} else r->AL = 0xFF;
break;
/* Get InDOS flag */
case 0x34:
{
BYTE FAR *p;
p = (BYTE FAR *)((BYTE *)&InDOS);
r -> ES = FP_SEG(p);
r -> BX = FP_OFF(p);
}
break;
/* Get Interrupt Vector */
case 0x35:
{
BYTE FAR *p;
p = getvec((COUNT)r -> AL);
r -> ES = FP_SEG(p);
r -> BX = FP_OFF(p);
}
break;
/* Dos Get Disk Free Space */
case 0x36:
DosGetFree(
(COUNT)r -> DL,
(COUNT FAR *)&r -> AX,
(COUNT FAR *)&r -> BX,
(COUNT FAR *)&r -> CX,
(COUNT FAR *)&r -> DX);
break;
/* Undocumented Get/Set Switchar */
case 0x37:
switch(r -> AL)
{
case 0:
r -> DL = switchar;
break;
case 1:
switchar = r -> DL;
break;
case 2:
case 3:
r -> DL = 0xff;
break;
default:
goto error_invalid;
}
break;
/* Get/Set Country Info */
case 0x38:
{
BYTE FAR *lpTable
= (BYTE FAR *)MK_FP(r -> DS, r -> DX);
BYTE nRetCode;
if(0xffff == r -> DX)
{
r->AX = 0xff;
r->FLAGS |= FLG_CARRY;
break;
r -> BX = SetCtryInfo(
(UBYTE FAR *)&(r -> AL),
(UWORD FAR *)&(r -> BX),
(BYTE FAR *)&lpTable,
(UBYTE *)&nRetCode);
if(nRetCode != 0)
{
r -> AX = 0xff;
r -> FLAGS |= FLG_CARRY;
}
else
{
r -> AX = nRetCode;
r -> FLAGS &= ~FLG_CARRY;
}
}
else
{
r -> BX = GetCtryInfo(&(r -> AL), &(r -> BX), lpTable);
r -> FLAGS &= ~FLG_CARRY;
}
}
break;
/* Dos Create Directory */
case 0x39:
rc = dos_mkdir((BYTE FAR *)MK_FP(r -> DS, r -> DX));
if(rc != SUCCESS)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
}
break;
/* Dos Remove Directory */
case 0x3a:
rc = dos_rmdir((BYTE FAR *)MK_FP(r -> DS, r -> DX));
if(rc != SUCCESS)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
}
break;
/* Dos Change Directory */
case 0x3b:
if((rc = DosChangeDir((BYTE FAR *)MK_FP(r -> DS, r -> DX))) < 0)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
}
break;
/* Dos Create File */
case 0x3c:
if((rc = DosCreat(MK_FP(r -> DS, r -> DX), r -> CX)) < 0)
goto error_exit;
else
{
r -> AX = rc;
r -> FLAGS &= ~FLG_CARRY;
}
break;
/* Dos Open */
case 0x3d:
if((rc = DosOpen(MK_FP(r -> DS, r -> DX), r -> AL)) < 0)
goto error_exit;
else
{
r -> AX = rc;
r -> FLAGS &= ~FLG_CARRY;
}
break;
/* Dos Close */
case 0x3e:
if((rc = DosClose(r -> BX)) < 0)
goto error_exit;
else
r -> FLAGS &= ~FLG_CARRY;
break;
/* Dos Read */
case 0x3f:
rc = DosRead(r -> BX, r -> CX, MK_FP(r -> DS, r -> DX), (COUNT FAR *)&rc1);
if(rc1 != SUCCESS)
{
r -> FLAGS |= FLG_CARRY;
r -> AX = -rc1;
}
else
{
r -> FLAGS &= ~FLG_CARRY;
r -> AX = rc;
}
break;
/* Dos Write */
case 0x40:
rc = DosWrite(r -> BX, r -> CX, MK_FP(r -> DS, r -> DX), (COUNT FAR *)&rc1);
if(rc1 != SUCCESS)
{
r -> FLAGS |= FLG_CARRY;
r -> AX = -rc1;
}
else
{
r -> FLAGS &= ~FLG_CARRY;
r -> AX = rc;
}
break;
/* Dos Delete File */
case 0x41:
rc = dos_delete((BYTE FAR *)MK_FP(r -> DS, r -> DX));
if(rc < 0)
{
r -> FLAGS |= FLG_CARRY;
r -> AX = -rc1;
}
else
r -> FLAGS &= ~FLG_CARRY;
break;
/* Dos Seek */
case 0x42:
if((rc = DosSeek(r -> BX, (LONG)((((LONG)(r -> CX)) << 16) + r -> DX), r -> AL, &lrc)) < 0)
goto error_exit;
else
{
r -> DX = (lrc >> 16);
r -> AX = lrc & 0xffff;
r -> FLAGS &= ~FLG_CARRY;
}
break;
/* Get/Set File Attributes */
case 0x43:
switch(r -> AL)
{
case 0x00:
rc = DosGetFattr((BYTE FAR *)MK_FP(r -> DS, r -> DX), (UWORD FAR *)&r -> CX);
if(rc < SUCCESS)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
}
break;
case 0x01:
rc = DosSetFattr((BYTE FAR *)MK_FP(r -> DS, r -> DX), (UWORD FAR *)&r -> CX);
if(rc != SUCCESS)
goto error_exit;
else
r -> FLAGS &= ~FLG_CARRY;
break;
default:
goto error_invalid;
break;
}
break;
/* Device I/O Control */
case 0x44:
{
BOOL bNoChangeAx;
bNoChangeAx = ((r -> AL == 0) || (r -> AL == 1));
rc = DosDevIOctl(r, (COUNT FAR *)&rc1);
if(rc1 != SUCCESS)
{
r -> FLAGS |= FLG_CARRY;
r -> AX = -rc1;
}
else
{
r -> FLAGS &= ~FLG_CARRY;
//if(!bNoChangeAx)
// r -> AX = rc;
}
}
break;
/* Duplicate File Handle */
case 0x45:
rc = DosDup(r -> BX);
if(rc < SUCCESS)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
r -> AX = rc;
}
break;
/* Force Duplicate File Handle */
case 0x46:
rc = DosForceDup(r -> BX, r -> CX);
if(rc < SUCCESS)
goto error_exit;
else
r -> FLAGS &= ~FLG_CARRY;
break;
/* Get Current Directory */
case 0x47:
if((rc = DosGetCuDir(r -> DL, MK_FP(r -> DS, r -> SI))) < 0)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
}
break;
/* Memory management */
case 0x48:
if((rc = DosMemAlloc(r -> BX, mem_access_mode, &(r -> AX), &(r -> BX))) < 0)
{
DosMemLargest(&(r -> BX));
goto error_exit;
}
else
{
++(r -> AX);
r -> FLAGS &= ~FLG_CARRY;
}
break;
case 0x49:
if((rc = DosMemFree(--(r -> ES))) < 0)
goto error_exit;
else
r -> FLAGS &= ~FLG_CARRY;
break;
case 0x4a:
{
UWORD maxSize;
if((rc = DosMemChange(r -> ES, r -> BX, &maxSize)) < 0)
{
if (rc == DE_NOMEM)
r -> BX = maxSize;
#if 0
if(cu_psp == r -> ES)
{
psp FAR *p;
p = MK_FP(cu_psp, 0);
p -> ps_size = r -> BX + cu_psp;
}
#endif
goto error_exit;
}
else
r -> FLAGS &= ~FLG_CARRY;
break;
}
/* Load and Execute Program */
case 0x4b:
break_flg = FALSE;
if((rc = DosExec(r -> AL, MK_FP(r -> ES, r -> BX), MK_FP(r -> DS, r -> DX)))
!= SUCCESS)
goto error_exit;
else
r -> FLAGS &= ~FLG_CARRY;
break;
/* End Program */
case 0x4c:
tsr = FALSE;
return_mode = break_flg ? 1 : 0;
return_code = r -> AL;
DosMemCheck();
#ifdef TSC
StartTrace();
#endif
return_user();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -