⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inthndlr.c

📁 这是DOS的原码 分享给大家
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -