亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? inthndlr.c

?? 一個用C和匯編寫的Dos操作系統的源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/****************************************************************/
/*                                                              */
/*                          inthndlr.c                          */
/*                                                              */
/*    Interrupt Handler and Function dispatcher for Kernel      */
/*                                                              */
/*                      Copyright (c) 1995                      */
/*                      Pasquale J. Villani                     */
/*                      All Rights Reserved                     */
/*                                                              */
/* This file is part of DOS-C.                                  */
/*                                                              */
/* DOS-C is free software; you can redistribute it and/or       */
/* modify it under the terms of the GNU General Public License  */
/* as published by the Free Software Foundation; either version */
/* 2, or (at your option) any later version.                    */
/*                                                              */
/* DOS-C is distributed in the hope that it will be useful, but */
/* WITHOUT ANY WARRANTY; without even the implied warranty of   */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See    */
/* the GNU General Public License for more details.             */
/*                                                              */
/* You should have received a copy of the GNU General Public    */
/* License along with DOS-C; see the file COPYING.  If not,     */
/* write to the Free Software Foundation, 675 Mass Ave,         */
/* Cambridge, MA 02139, USA.                                    */
/*                                                              */
/****************************************************************/

#include "../../hdr/portab.h"
#include "globals.h"

#ifdef VERSION_STRINGS
BYTE *RcsId = "$Header:   C:/dos-c/src/kernel/inthndlr.c_v   1.13   07 Feb 1998 20:38:46   patv  $";
#endif

/* $Log:   C:/dos-c/src/kernel/inthndlr.c_v  $
 * 
 *    Rev 1.13   07 Feb 1998 20:38:46   patv
 * Modified stack fram to match DOS standard
 * 
 *    Rev 1.12   22 Jan 1998  4:09:26   patv
 * Fixed pointer problems affecting SDA
 * 
 *    Rev 1.11   06 Jan 1998 20:13:18   patv
 * Broke apart int21_system from int21_handler.
 * 
 *    Rev 1.10   04 Jan 1998 23:15:22   patv
 * Changed Log for strip utility
 * 
 *    Rev 1.9   04 Jan 1998 17:26:16   patv
 * Corrected subdirectory bug
 * 
 *    Rev 1.8   03 Jan 1998  8:36:48   patv
 * Converted data area to SDA format
 * 
 *    Rev 1.7   01 Aug 1997  2:00:10   patv
 * COMPATIBILITY: Added return '$' in AL for function int 21h fn 09h
 * 
 *    Rev 1.6   06 Feb 1997 19:05:54   patv
 * Added hooks for tsc command
 * 
 *    Rev 1.5   22 Jan 1997 13:18:32   patv
 * pre-0.92 Svante Frey bug fixes.
 * 
 *    Rev 1.4   16 Jan 1997 12:46:46   patv
 * pre-Release 0.92 feature additions
 * 
 *    Rev 1.3   29 May 1996 21:03:40   patv
 * bug fixes for v0.91a
 * 
 *    Rev 1.2   19 Feb 1996  3:21:48   patv
 * Added NLS, int2f and config.sys processing
 * 
 *    Rev 1.1   01 Sep 1995 17:54:20   patv
 * First GPL release.
 * 
 *    Rev 1.0   02 Jul 1995  8:33:34   patv
 * Initial revision.
 */
/* $EndLog$ */

#ifdef TSC
static VOID StartTrace(VOID);
static bTraceNext = FALSE;
#endif

extern UWORD Int21AX;

/* Special entry for far call into the kernel                           */
#pragma argsused
VOID FAR 
int21_entry (iregs UserRegs)
{
	int21_handler(UserRegs);
}


/* Convert an interrupt into our register struct definition             */
VOID
int21_syscall(iregs FAR *irp)
{
	static COUNT FAR *stack;
	enable();

	if (irp -> AH > 0x67)
	{
		irp -> AL = 0;
		return;
	}

	Int21AX = irp -> AX;

	switch(irp -> AH)
	{
	/* DosVars - get/set dos variables                              */
	case 0x33:
		switch(irp -> AL)
		{
		/* Get Ctrl-C flag                                      */
		case 0x00:
			irp -> DL = break_ena ? TRUE : FALSE;
			break;
		
		/* Set Ctrl-C flag                                      */
		case 0x01:
			break_ena = irp -> DL ? TRUE : FALSE;
			break;
		
		/* Get Boot Drive                                       */
		case 0x05:
			irp -> DL = BootDrive;
			break;

		/* Get DOS-C version                                    */
		case 0x06:
			irp -> BL = os_major;
			irp -> BH = os_minor;
			irp -> DL = rev_number;
			irp -> DH = version_flags;
			break;
		default:
			irp -> AX = -DE_INVLDFUNC;
			irp -> FLAGS |= FLG_CARRY;
			break;

		/* Toggle DOS-C rdwrblock trace dump                    */
		case 0xfd:
			bDumpRdWrParms = !bDumpRdWrParms;
			break;

		/* Toggle DOS-C syscall trace dump                      */
		case 0xfe:
			bDumpRegs = !bDumpRegs;
			break;

		/* Get DOS-C release string pointer                     */
		case 0xff:
			irp -> DX = FP_SEG(os_release);
			irp -> AX = FP_OFF(os_release);
			break;
		}
		break;
	
	/* Set PSP                                                      */
	case 0x50:
		cu_psp = irp -> BX;
		break;
	
	/* Get PSP                                                      */
	case 0x51:
		irp -> BX = cu_psp;
		break;
	
	/* UNDOCUMENTED: return current psp                             */
	case 0x62:
		irp -> BX = cu_psp;
		break;
	
	/* Normal DOS function - switch stacks          */
	default:
		++InDOS;
		user_r = irp;
		stack = irp -> AH < 0x0c ? &char_api_tos : &disk_api_tos;
     
		/* Initialize stacks                                            */
		api_sp = FP_OFF(stack);
		api_ss = FP_SEG(stack);
		
		set_stack();
		
		int21_service(user_r);

		restore_stack();
		--InDOS;
	}
}

VOID int21_service(iregs far *r)
{
	COUNT rc, rc1;
	ULONG lrc;
	psp FAR *p = MK_FP(cu_psp, 0);

	p -> ps_stack = r;

	if(bDumpRegs)
	{
		fbcopy((VOID FAR *)user_r, (VOID FAR *)&error_regs, sizeof(iregs));
		printf("System call (21h): %02x\n", user_r -> AX);
		dump_regs = TRUE;
		dump();
	}

	/* The dispatch handler                                         */
	switch(r -> AH)
	{
	/* int 21h common error handler					*/
	case 0x64:
	case 0x6b:
	error_invalid:
		r -> AX = -DE_INVLDFUNC;
		goto error_out;
	error_exit:
		r -> AX = -rc;
	error_out:
		r -> FLAGS |= FLG_CARRY;
		break;
	
	/* Terminate Program                                            */
	case 0x00:
		tsr = FALSE;
		return_mode = break_flg ? 1 : 0;
		return_code = r -> AL;
		DosMemCheck();
#ifdef TSC
		StartTrace();
#endif
		return_user();
		break;
	
	/* Read Keyboard with Echo                      */
	case 0x01:
		r -> AL = DosCharInputEcho();
		break;

	/* Display Character                                            */
	case 0x02:
		DosDisplayOutput(r -> DL);
		break;

	/* Auxiliary Input                                                      */
	case 0x03:
		r -> AL = _sti();
		break;

	/* Auxiliary Output                                                     */
	case 0x04:
		sto(r -> DL);
		break;

	/* Print Character                                                      */
	case 0x05:
		sto(r -> DL);
		break;

	/* Direct Cosole I/O                                            */
	case 0x06:
		DosDirectConsoleIO(r);
		break;

	/* Direct Console Input                                         */
	case 0x07:
		r -> AL = DosCharInput();
		break;

	/* Read Keyboard Without Echo                                   */
	case 0x08:
		r -> AL = _sti();
		break;

	/* Display String                                               */
	case 0x09:
		DosOutputString(MK_FP(r -> DS, r -> DX));
		r -> AL = '$';
		break;

	/* Buffered Keyboard Input                                      */
	case 0x0a:
		((keyboard FAR *)MK_FP(r -> DS, r -> DX)) -> kb_count = 0;
		sti((keyboard FAR *)MK_FP(r -> DS, r -> DX));
		((keyboard FAR *)MK_FP(r -> DS, r -> DX)) -> kb_count -= 2;
		break;

	/* Check Keyboard Status                                        */
	case 0x0b:
		if(KbdBusy())
			r -> AL = 0x00;
		else
			r -> AL = 0xff;
		
		break;

	/* Flush Buffer, Read Keayboard                                 */
	case 0x0c:
		KbdFlush();
		switch(r -> AL)
		{
			/* Read Keyboard with Echo                      */
			case 0x01:
				r -> AL = DosCharInputEcho();
				break;

			/* Direct Cosole I/O                            */
			case 0x06:
				DosDirectConsoleIO(r);
				break;

			/* Direct Console Input                         */
			case 0x07:
				r -> AL = DosCharInput();
				break;

			/* Read Keyboard Without Echo                   */
			case 0x08:
				r -> AL = _sti();
				break;

			/* Buffered Keyboard Input                      */
			case 0x0a:
				sti((keyboard FAR *)MK_FP(r -> DS, r -> DX));
				break;

			default:
				r -> AL = 0x00;
				break;
		}
		break;

	/* Reset Drive                                                  */
	case 0x0d:
		flush();
		break;

	/* Set Default Drive                                            */
	case 0x0e:
		if(((COUNT)r -> DL) >= 0 && r -> DL < nblkdev)
			default_drive = r -> DL;
		
		r -> AL = nblkdev;            
		break;

	case 0x0f:
		if(FcbOpen(MK_FP(r -> DS, r -> DX)))
			r -> AL = 0;
		else
			r -> AL = 0xff;
		break;

	case 0x10:
		if(FcbClose(MK_FP(r -> DS, r -> DX)))
			r -> AL = 0;
		else
			r -> AL = 0xff;
		break;

	case 0x11:
		if(FcbFindFirst(MK_FP(r -> DS, r -> DX)))
			r -> AL = 0;
		else
			r -> AL = 0xff;
		break;

	case 0x12:
		if(FcbFindNext(MK_FP(r -> DS, r -> DX)))
			r -> AL = 0;
		else
			r -> AL = 0xff;
		break;

	case 0x13:
		if(FcbDelete(MK_FP(r -> DS, r -> DX)))
			r -> AL = 0;
		else
			r -> AL = 0xff;
		break;

	case 0x14:
		{
			COUNT nErrorCode;

			if(FcbRead(MK_FP(r -> DS, r -> DX), &nErrorCode))
				r -> AL = 0;
			else
				r -> AL = nErrorCode;
			break;
		}

	case 0x15:
		{
			COUNT nErrorCode;

			if(FcbWrite(MK_FP(r -> DS, r -> DX), &nErrorCode))
				r -> AL = 0;
			else
				r -> AL = nErrorCode;
			break;
		}

	case 0x16:
		if(FcbCreate(MK_FP(r -> DS, r -> DX)))
			r -> AL = 0;
		else
			r -> AL = 0xff;
		break;

	case 0x17:
		if(FcbRename(MK_FP(r -> DS, r -> DX)))
			r -> AL = 0;
		else
			r -> AL = 0xff;
		break;

	/* CP/M compatibility functions                                 */
	case 0x18:
	case 0x1d:
	case 0x1e:
	case 0x20:
#ifndef TSC
	case 0x61:
#endif
	default:
		r -> AL = 0;
		break;

	/* Get Default Drive                                            */
	case 0x19:
		r -> AL = default_drive;
		break;

	/* Set DTA                                                      */
	case 0x1a:
		{
			psp FAR *p = MK_FP(cu_psp,0);

			p -> ps_dta = MK_FP(r -> DS, r -> DX);
			dos_setdta(p -> ps_dta);
		}
		break;

	/* Get Default Drive Data                                       */
	case 0x1b:
		{
			BYTE FAR *p;

			FatGetDrvData(0,
			 (COUNT FAR *)&r -> AX,
			 (COUNT FAR *)&r -> CX,
			 (COUNT FAR *)&r -> DX,
			 (BYTE FAR **)&p);
			r -> DS = FP_SEG(p);
			r -> BX = FP_OFF(p);
		}
		break;

	/* Get Drive Data                                               */
	case 0x1c:
		{
			BYTE FAR *p;

			FatGetDrvData(r -> DL,
			 (COUNT FAR *)&r -> AX,
			 (COUNT FAR *)&r -> CX,
			 (COUNT FAR *)&r -> DX,
			 (BYTE FAR **)&p);
			r -> DS = FP_SEG(p);
			r -> BX = FP_OFF(p);
		}
		break;

	/* Get default DPB                                              */
	case 0x1f:
		if (default_drive < nblkdev)
		{
			struct dpb FAR *dpb = &blk_devices[default_drive];
			r -> DS = FP_SEG(dpb);
			r -> BX = FP_OFF(dpb);
			r -> AL = 0;
		}
		else r -> AL = 0xff;
		break;

	case 0x21:
		{
			COUNT nErrorCode;

			if(FcbRandomRead(MK_FP(r -> DS, r -> DX), &nErrorCode))
				r -> AL = 0;
			else
				r -> AL = nErrorCode;
			break;
		}

	case 0x22:
		{
			COUNT nErrorCode;

			if(FcbRandomWrite(MK_FP(r -> DS, r -> DX), &nErrorCode))
				r -> AL = 0;
			else
				r -> AL = nErrorCode;
			break;
		}

	/* Get file size in records                                     */
	case 0x23:
		if(FcbGetFileSize(MK_FP(r -> DS, r -> DX)))
			r -> AL = 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线乱码一区二区三区| 人妖欧美一区二区| 亚洲第四色夜色| 国产在线精品一区在线观看麻豆| 99久久精品国产一区| 日韩午夜激情视频| 欧美韩日一区二区三区| 美国欧美日韩国产在线播放| 91热门视频在线观看| 久久免费偷拍视频| 欧美一区午夜精品| 久久综合成人精品亚洲另类欧美| 亚洲一级二级在线| 丰满岳乱妇一区二区三区| 在线电影一区二区三区| 亚洲欧美日韩在线不卡| 国产美女av一区二区三区| 欧美一区二区三区不卡| 午夜精品123| 在线看国产一区二区| 亚洲欧洲日韩在线| 高清不卡一区二区| 久久伊人中文字幕| 国产一区啦啦啦在线观看| 日韩三级电影网址| 蜜桃精品在线观看| 91精品国产色综合久久久蜜香臀| 亚洲电影一区二区三区| 欧美三级日韩在线| 亚洲第四色夜色| 911国产精品| 视频一区二区中文字幕| 欧美高清视频一二三区 | 蜜桃视频在线一区| 91麻豆精品国产91久久久更新时间| 亚洲黄色性网站| 在线观看不卡视频| 一区二区成人在线观看| 欧美揉bbbbb揉bbbbb| 视频一区视频二区中文字幕| 日韩片之四级片| 国内外精品视频| 欧美韩日一区二区三区四区| 波多野结衣中文字幕一区| 亚洲欧美日韩久久| 在线观看网站黄不卡| 亚洲成av人在线观看| 成人黄色国产精品网站大全在线免费观看 | 激情偷乱视频一区二区三区| 欧美videossexotv100| 国产一区二区三区观看| 国产无人区一区二区三区| 成人av网址在线观看| 亚洲欧美另类图片小说| 欧美亚一区二区| 蜜桃av一区二区三区电影| 久久精品视频一区二区三区| 老汉av免费一区二区三区 | 亚洲综合图片区| 欧美一卡二卡三卡| 国产**成人网毛片九色| 亚洲一区二区综合| 精品国产成人系列| 99在线精品一区二区三区| 亚洲一区二区三区小说| 精品日韩欧美在线| 不卡av电影在线播放| 亚洲一区二区三区自拍| 精品久久久久香蕉网| 99r国产精品| 日本美女一区二区三区视频| 国产午夜亚洲精品理论片色戒| 成人av在线一区二区三区| 日韩激情中文字幕| 中文字幕av一区二区三区 | 色综合久久88色综合天天6| 亚洲国产精品麻豆| 久久精品人人爽人人爽| 欧洲精品视频在线观看| 国产一区二区伦理片| 亚洲综合精品自拍| 久久欧美一区二区| 欧美精品v国产精品v日韩精品| 国产精品中文欧美| 日韩av在线播放中文字幕| 亚洲色图欧洲色图婷婷| 欧美精品一区在线观看| 欧美日韩极品在线观看一区| 成人涩涩免费视频| 久久国产三级精品| 亚洲国产一二三| 国产精品不卡视频| 久久久久国产一区二区三区四区| 欧美日韩精品欧美日韩精品 | 亚洲国产视频一区二区| 国产精品久久久久久久裸模| 精品欧美一区二区三区精品久久| 欧美日韩综合色| 91免费版pro下载短视频| 粉嫩一区二区三区性色av| 蜜臀精品久久久久久蜜臀| 亚洲成av人影院在线观看网| 一区二区三区欧美视频| 亚洲视频在线一区观看| 国产欧美一区二区精品久导航 | 99精品在线观看视频| 国产在线视频一区二区| 午夜国产精品一区| 夜夜亚洲天天久久| 亚洲免费在线播放| 亚洲视频你懂的| 国产精品国产三级国产普通话99| 精品国产一二三| 欧美一级日韩免费不卡| 欧美精品乱人伦久久久久久| 欧美亚洲动漫精品| 欧美欧美午夜aⅴ在线观看| 欧美日韩国产美女| 欧美一区二区美女| 日韩欧美综合一区| 26uuu另类欧美| 亚洲国产成人午夜在线一区| 欧美韩国日本不卡| 亚洲欧美成人一区二区三区| 亚洲黄色av一区| 亚洲成人1区2区| 免费视频一区二区| 久久精品99国产精品| 99精品1区2区| av在线一区二区三区| av激情亚洲男人天堂| 色哟哟一区二区三区| 欧美午夜一区二区| 欧美一三区三区四区免费在线看 | 国产精品久久毛片av大全日韩| 亚洲国产电影在线观看| 又紧又大又爽精品一区二区| 五月综合激情网| 久久99在线观看| 成人综合在线观看| 在线精品观看国产| 日韩欧美在线网站| 欧美国产97人人爽人人喊| 亚洲女人的天堂| 五月激情六月综合| 国产精品亚洲一区二区三区妖精 | 国产精品久久久久久久浪潮网站| 久久先锋影音av| 欧美国产97人人爽人人喊| 亚洲人成精品久久久久| 亚洲成人免费av| 韩日欧美一区二区三区| 成人精品视频一区| 欧美伊人精品成人久久综合97| 欧美精品18+| 久久久国产一区二区三区四区小说 | 亚洲图片欧美视频| 精品无码三级在线观看视频 | 亚洲欧美影音先锋| 午夜一区二区三区在线观看| 国产精品一区二区三区网站| 欧美亚洲动漫制服丝袜| 国产女主播视频一区二区| 色噜噜狠狠一区二区三区果冻| 欧美日精品一区视频| 日本一区二区三区电影| 日韩激情一二三区| av午夜一区麻豆| 精品免费99久久| 亚洲色图在线播放| 国产盗摄一区二区| 欧美日韩电影在线| 国产精品国产三级国产a| 麻豆成人免费电影| 欧美亚洲另类激情小说| 国产精品乱码一区二三区小蝌蚪| 奇米精品一区二区三区四区| 一本高清dvd不卡在线观看| 久久精品一区二区三区四区| 亚洲不卡在线观看| 在线免费观看日本一区| 国产精品美女www爽爽爽| 国产在线播放一区三区四| 91精品国产综合久久久蜜臀粉嫩| 一区二区在线免费观看| 不卡电影一区二区三区| 国产亚洲视频系列| 国产一区二区三区黄视频 | 欧美96一区二区免费视频| 91精彩视频在线| 亚洲色图.com| 国产suv精品一区二区6| 欧美一激情一区二区三区| 亚洲成av人在线观看| 欧美视频精品在线观看| 亚洲精品国产第一综合99久久 | 亚洲精品国产视频| 丰满放荡岳乱妇91ww| 国产精品天天看| 成人污污视频在线观看|