📄 inthndlr.c
字号:
break;
/* Get Child-program Return Value */
case 0x4d:
r -> AL = return_code;
r -> AH = return_mode;
break;
/* Dos Find First */
case 0x4e:
{
psp FAR *p = MK_FP(cu_psp,0);
/* dta for this call is set on entry. This */
/* needs to be changed for new versions. */
if((rc = DosFindFirst((UCOUNT)r -> CX, (BYTE FAR *)MK_FP(r -> DS, r -> DX))) < 0)
goto error_exit;
else
{
r -> AX = 0;
r -> FLAGS &= ~FLG_CARRY;
}
}
break;
/* Dos Find Next */
case 0x4f:
{
psp FAR *p = MK_FP(cu_psp,0);
/* dta for this call is set on entry. This */
/* needs to be changed for new versions. */
if((rc = DosFindNext()) < 0)
{
r -> AX = -rc;
if (r -> AX == 2)
r -> AX = 18;
r -> FLAGS |= FLG_CARRY;
}
else
{
r -> FLAGS &= ~FLG_CARRY;
}
}
break;
/* Set PSP */
case 0x50:
cu_psp = r -> BX;
break;
/* Get PSP */
case 0x51:
r -> BX = cu_psp;
break;
/* ************UNDOCUMENTED**************************************/
/* Get List of Lists */
case 0x52:
{
BYTE FAR *p;
p = (BYTE FAR *)&DPBp;
r -> ES = FP_SEG(p);
r -> BX = FP_OFF(p);
}
break;
/* Get verify state */
case 0x54:
r -> AL = (verify_ena ? TRUE : FALSE);
break;
/* ************UNDOCUMENTED**************************************/
/* Dos Create New Psp & set p_size */
case 0x55:
new_psp((psp FAR *)MK_FP(r -> DX, 0), r -> SI);
break;
/* Dos Rename */
case 0x56:
rc = dos_rename(
(BYTE FAR *)MK_FP(r -> DS, r -> DX), /* OldName */
(BYTE FAR *)MK_FP(r -> ES, r -> DI)); /* NewName */
if(rc < SUCCESS)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
}
break;
/* Get/Set File Date and Time */
case 0x57:
switch(r -> AL)
{
case 0x00:
if(!DosGetFtime(
(COUNT)r -> BX, /* Handle */
(date FAR *)&r -> DX, /* FileDate */
(time FAR *)&r -> CX)) /* FileTime */
{
r -> AX = -DE_INVLDHNDL;
r -> FLAGS |= FLG_CARRY;
}
else
r -> FLAGS &= ~FLG_CARRY;
break;
case 0x01:
if(!DosSetFtime(
(COUNT)r -> BX, /* Handle */
(date FAR *)&r -> DX, /* FileDate */
(time FAR *)&r -> CX)) /* FileTime */
{
r -> AX = -DE_INVLDHNDL;
r -> FLAGS |= FLG_CARRY;
}
else
r -> FLAGS &= ~FLG_CARRY;
break;
default:
goto error_invalid;
}
break;
/* Get/Set Allocation Strategy */
case 0x58:
switch(r -> AL)
{
case 0x00:
r -> AX = mem_access_mode;
break;
case 0x01:
if(((COUNT)r -> BX) < 0 || r -> BX > 2)
goto error_invalid;
else
{
mem_access_mode = r -> BX;
r -> FLAGS &= ~FLG_CARRY;
}
break;
default:
goto error_invalid;
#ifdef DEBUG
case 0xff:
show_chain();
break;
#endif
}
break;
case 0x5a:
if((rc = DosMkTmp(MK_FP(r -> DS, r -> DX), r -> CX)) < 0)
goto error_exit;
else
{
r -> AX = rc;
r -> FLAGS &= ~FLG_CARRY;
}
break;
case 0x5b:
if((rc = DosOpen(MK_FP(r -> DS, r -> DX), 0)) >= 0)
{
DosClose(rc);
r -> AX = 80;
r -> FLAGS |= FLG_CARRY;
}
else
{
if((rc = DosCreat(MK_FP(r -> DS, r -> DX), r -> CX)) < 0)
goto error_exit;
else
{
r -> AX = rc;
r -> FLAGS &= ~FLG_CARRY;
}
}
break;
/* UNDOCUMENTED: server, share.exe and sda function */
case 0x5d:
switch(r -> AL)
{
case 0x06:
r -> DS = FP_SEG(internal_data);
r -> SI = FP_OFF(internal_data);
r -> CX = swap_always - internal_data;
r -> DX = swap_indos - internal_data;
r -> FLAGS &= ~FLG_CARRY;
break;
default:
goto error_invalid;
}
case 0x60: /* TRUENAME */
if ((rc = truename(MK_FP(r -> DS, r-> SI),
adjust_far(MK_FP( r -> ES, r -> DI)))) != SUCCESS)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
}
break;
#ifdef TSC
/* UNDOCUMENTED: no-op */
/* */
/* DOS-C: tsc support */
case 0x61:
switch(r -> AL)
{
case 0x01:
bTraceNext = TRUE;
break;
case 0x02:
bDumpRegs = FALSE;
break;
}
#endif
break;
/* UNDOCUMENTED: return current psp */
case 0x62:
r -> BX = cu_psp;
break;
/* UNDOCUMENTED: Double byte and korean tables */
case 0x63:
{
#ifdef DBLBYTE
static char dbcsTable[2] =
{
0, 0
};
void FAR *dp = &dbcsTable;
r -> DS = FP_SEG(dp);
r -> SI = FP_OFF(dp);
r -> AL = 0;
#else
/* not really supported, but will pass. */
r -> AL = 0xff;
#endif
break;
}
/* Extended country info */
case 0x65:
if(r -> AL <= 0x7)
{
if(ExtCtryInfo(
r -> AL,
r -> BX,
r -> CX,
MK_FP(r -> ES, r -> DI)))
r -> FLAGS &= ~FLG_CARRY;
else
goto error_invalid;
}
else if((r -> AL >= 0x20) && (r -> AL <= 0x22))
{
switch(r -> AL)
{
case 0x20:
r -> DL = upChar(r -> DL);
goto okay;
case 0x21:
upMem(
MK_FP(r -> DS, r -> DX),
r -> CX);
goto okay;
case 0x22:
upString(MK_FP(r -> DS, r -> DX));
okay:
r -> FLAGS &= ~FLG_CARRY;
break;
case 0x23:
r -> AX = yesNo(r -> DL);
goto okay;
default:
goto error_invalid;
}
}
else
r -> FLAGS |= FLG_CARRY;
break;
case 0x66:
switch(r -> AL)
{
case 1:
GetGlblCodePage(
(UWORD FAR *)&(r -> BX),
(UWORD FAR *)&(r -> DX));
goto okay_66;
case 2:
SetGlblCodePage(
(UWORD FAR *)&(r -> BX),
(UWORD FAR *)&(r -> DX));
okay_66:
r -> FLAGS &= ~FLG_CARRY;
break;
default:
goto error_invalid;
}
break;
case 0x67:
if ((rc = SetJFTSize( r -> BX)) != SUCCESS)
goto error_exit;
else
{
r -> FLAGS &= ~FLG_CARRY;
}
break;
}
if(bDumpRegs)
{
fbcopy((VOID FAR *)user_r , (VOID FAR *)&error_regs,
sizeof(iregs));
dump_regs = TRUE;
dump();
}
}
VOID INRPT FAR
int22_handler (void)
{
}
#pragma argsused
VOID INRPT FAR
int23_handler (int es, int ds, int di, int si, int bp, int sp, int bx, int dx, int cx, int ax, int ip, int cs, int flags)
{
tsr = FALSE;
return_mode = 1;
return_code = -1;
mod_sto(CTL_C);
DosMemCheck();
#ifdef TSC
StartTrace();
#endif
return_user();
}
#pragma argsused
VOID INRPT FAR
int24_handler (void)
{
}
/* Structures needed for int 25 / int 26 */
struct HugeSectorBlock
{
ULONG blkno;
WORD nblks;
BYTE FAR *buf;
};
struct int25regs
{
UWORD es, ds;
UWORD di, si, bp, sp;
UWORD bx, dx, cx, ax;
UWORD flags, ip, cs;
};
/* this function is called from an assembler wrapper function */
VOID int25_handler (struct int25regs FAR *r)
{
ULONG blkno;
UWORD nblks;
BYTE FAR *buf;
UBYTE drv = r->ax & 0xFF;
InDOS++;
if (r->cx == 0xFFFF)
{
struct HugeSectorBlock FAR *lb = MK_FP(r->ds, r->bx);
blkno = lb->blkno;
nblks = lb->nblks;
buf = lb->buf;
} else {
nblks = r->cx;
blkno = r->dx;
buf = MK_FP(r->ds, r->bx);
}
if (drv >= nblkdev)
{
r->ax = 0x202;
r->flags |= FLG_CARRY;
return;
}
while (nblks--)
{
struct buffer FAR *bp;
if ((bp = getblock(blkno + 1, drv)) == NULL)
{
r->ax = 0x202;
r->flags |= FLG_CARRY;
return;
}
fbcopy(bp->b_buffer, buf, maxbksize);
buf += maxbksize;
blkno++;
}
r->ax = 0;
r->flags &= ~FLG_CARRY;
--InDOS;
}
VOID int26_handler (struct int25regs FAR *r)
{
ULONG blkno;
UWORD nblks;
BYTE FAR *buf;
UBYTE drv = r->ax & 0xFF;
InDOS++;
if (r->cx == 0xFFFF)
{
struct HugeSectorBlock FAR *lb = MK_FP(r->ds, r->bx);
blkno = lb->blkno;
nblks = lb->nblks;
buf = lb->buf;
} else {
nblks = r->cx;
blkno = r->dx;
buf = MK_FP(r->ds, r->bx);
}
if (drv >= nblkdev)
{
r->ax = 0x202;
r->flags |= FLG_CARRY;
return;
}
while (nblks--)
{
struct buffer FAR *b;
getbuf(&b, blkno + 1, drv);
fbcopy(buf, b->b_buffer, maxbksize);
b -> b_flag |= (BFR_DIRTY | BFR_VALID);
b -> b_blkno = blkno + 1;
b -> b_unit = drv;
if (flush1(b) == FALSE)
{
r->ax = 0x202;
r->flags |= FLG_CARRY;
return;
}
buf += maxbksize;
blkno++;
}
r->ax = 0;
r->flags &= ~FLG_CARRY;
--InDOS;
}
VOID INRPT FAR
int28_handler (void)
{
}
VOID INRPT FAR
empty_handler (void)
{
}
#ifdef TSC
static VOID StartTrace(VOID)
{
if(bTraceNext)
{
bDumpRegs = TRUE;
bTraceNext = FALSE;
}
else
bDumpRegs = FALSE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -