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

📄 pmdos.c

📁 BIOS emulator and interface to Realmode X86 Emulator Library Can emulate a PCI Graphic Controller V
💻 C
📖 第 1 页 / 共 3 页
字号:
}void PMAPI PM_setPMvect(int intno, PM_intHandler isr){	CONFIG_INF	config;	FARPTR		ph;	PM_saveDS();	_dx_config_inf(&config, (UCHAR*)&config);	FP_SET(ph,(uint)isr,config.c_cs_sel);	_dx_pmiv_set(intno,ph);}void PMAPI PM_restorePMvect(int intno, PMFARPTR isr){	FARPTR	ph;	FP_SET(ph,isr.off,isr.sel);	_dx_pmiv_set(intno,ph);}static void getISR(int intno, PMFARPTR *pmisr, long *realisr){	PM_getPMvect(intno,pmisr);	_PM_getRMvect(intno, realisr);}static void restoreISR(int intno, PMFARPTR pmisr, long realisr){	_PM_setRMvect(intno,realisr);	PM_restorePMvect(intno,pmisr);}static void setISR(int intno, void (PMAPI *isr)()){	CONFIG_INF	config;	FARPTR		ph;	lockPMHandlers();			/* Ensure our handlers are locked	*/	_dx_config_inf(&config, (UCHAR*)&config);	FP_SET(ph,(uint)isr,config.c_cs_sel);	_dx_apmiv_set(intno,ph);}void PMAPI PM_setTimerHandler(PM_intHandler th){	getISR(0x8, &_PM_prevTimer, &_PM_prevRealTimer);	_PM_timerHandler = th;	setISR(0x8, _PM_timerISR);}void PMAPI PM_restoreTimerHandler(void){	if (_PM_timerHandler) {		restoreISR(0x8, _PM_prevTimer, _PM_prevRealTimer);		_PM_timerHandler = NULL;		}}ibool PMAPI PM_setRealTimeClockHandler(PM_intHandler th,int frequency){	/* Save the old CMOS real time clock values */	_PM_oldCMOSRegA = _PM_readCMOS(0x0A);	_PM_oldCMOSRegB = _PM_readCMOS(0x0B);	/* Set the real time clock interrupt handler */	getISR(0x70, &_PM_prevRTC, &_PM_prevRealRTC);	_PM_rtcHandler = th;	setISR(0x70, _PM_rtcISR);	/* Program the real time clock default frequency */	PM_setRealTimeClockFrequency(frequency);	/* Unmask IRQ8 in the PIC2 */	_PM_oldRTCPIC2 = PM_inpb(0xA1);	PM_outpb(0xA1,_PM_oldRTCPIC2 & 0xFE);	return true;}void PMAPI PM_restoreRealTimeClockHandler(void){	if (_PM_rtcHandler) {		/* Restore CMOS registers and mask RTC clock */		_PM_writeCMOS(0x0A,_PM_oldCMOSRegA);		_PM_writeCMOS(0x0B,_PM_oldCMOSRegB);		PM_outpb(0xA1,(PM_inpb(0xA1) & 0xFE) | (_PM_oldRTCPIC2 & ~0xFE));		/* Restore the interrupt vector */		restoreISR(0x70, _PM_prevRTC, _PM_prevRealRTC);		_PM_rtcHandler = NULL;		}}void PMAPI PM_setKeyHandler(PM_intHandler kh){	getISR(0x9, &_PM_prevKey, &_PM_prevRealKey);	_PM_keyHandler = kh;	setISR(0x9, _PM_keyISR);}void PMAPI PM_restoreKeyHandler(void){	if (_PM_keyHandler) {		restoreISR(0x9, _PM_prevKey, _PM_prevRealKey);		_PM_keyHandler = NULL;		}}void PMAPI PM_setKey15Handler(PM_key15Handler kh){	getISR(0x15, &_PM_prevKey15, &_PM_prevRealKey15);	_PM_key15Handler = kh;	setISR(0x15, _PM_key15ISR);}void PMAPI PM_restoreKey15Handler(void){	if (_PM_key15Handler) {		restoreISR(0x15, _PM_prevKey15, _PM_prevRealKey15);		_PM_key15Handler = NULL;		}}void PMAPI PM_installAltBreakHandler(PM_breakHandler bh){	static int	ctrlCFlag,ctrlBFlag;	_PM_ctrlCPtr = (uchar*)&ctrlCFlag;	_PM_ctrlBPtr = (uchar*)&ctrlBFlag;	getISR(0x1B, &_PM_prevBreak, &prevRealBreak);	getISR(0x23, &_PM_prevCtrlC, &prevRealCtrlC);	_PM_breakHandler = bh;	setISR(0x1B, _PM_breakISR);	setISR(0x23, _PM_ctrlCISR);}void PMAPI PM_installBreakHandler(void){	PM_installAltBreakHandler(NULL);}void PMAPI PM_restoreBreakHandler(void){	if (_PM_prevBreak.sel) {		restoreISR(0x1B, _PM_prevBreak, prevRealBreak);		restoreISR(0x23, _PM_prevCtrlC, prevRealCtrlC);		_PM_prevBreak.sel = 0;		_PM_breakHandler = NULL;		}}void PMAPI PM_installAltCriticalHandler(PM_criticalHandler ch){	static short	critBuf[2];	_PM_critPtr = (uchar*)critBuf;	getISR(0x24, &_PM_prevCritical, &prevRealCritical);	_PM_critHandler = ch;	setISR(0x24, _PM_criticalISR);}void PMAPI PM_installCriticalHandler(void){	PM_installAltCriticalHandler(NULL);}void PMAPI PM_restoreCriticalHandler(void){	if (_PM_prevCritical.sel) {		restoreISR(0x24, _PM_prevCritical, prevRealCritical);		_PM_prevCritical.sel = 0;		_PM_critHandler = NULL;		}}int PMAPI PM_lockDataPages(void *p,uint len){	return (_dx_lock_pgsn(p,len) == 0);}int PMAPI PM_unlockDataPages(void *p,uint len){	return (_dx_ulock_pgsn(p,len) == 0);}int PMAPI PM_lockCodePages(void (*p)(),uint len){	CONFIG_INF	config;	FARPTR		fp;	_dx_config_inf(&config, (UCHAR*)&config);	FP_SET(fp,p,config.c_cs_sel);	return (_dx_lock_pgs(fp,len) == 0);}int PMAPI PM_unlockCodePages(void (*p)(),uint len){	CONFIG_INF	config;	FARPTR		fp;	_dx_config_inf(&config, (UCHAR*)&config);	FP_SET(fp,p,config.c_cs_sel);	return (_dx_ulock_pgs(fp,len) == 0);}#endif/*-------------------------------------------------------------------------*//* Symantec C++ DOSX and FlashTek X-32/X-32VM support					   *//*-------------------------------------------------------------------------*/#if	defined(DOSX) || defined(X32VM)#ifdef	X32VM#include <x32.h>#endifstatic long prevRealBreak;		/* Previous real mode break handler		*/static long prevRealCtrlC;		/* Previous real mode CtrlC handler		*/static long prevRealCritical;	/* Prev real mode critical handler		*/static uint mouseSel = 0,mouseOff;/* The following real mode routine is used to call a 32 bit protected * mode FAR function from real mode. We use this for passing up control * from the real mode mouse callback to our protected mode code. */static char realHandler[] = {		/* Real mode code generic handler	*/	0x00,0x00,0x00,0x00,			/* __PM_callProtp					*/	0x00,0x00,						/* __PM_protCS						*/	0x00,0x00,0x00,0x00,			/* __PM_protHandler					*/	0x1E,							/*	push	ds						*/	0x6A,0x00,						/*	push	0						*/	0x6A,0x00,						/*	push	0						*/	0x2E,0xFF,0x36,0x04,0x00,		/*	push    [cs:__PM_protCS]		*/	0x66,0x2E,0xFF,0x36,0x06,0x00,  /*  push    [cs:__PM_protHandler]	*/	0x2E,0xFF,0x1E,0x00,0x00,       /*  call    [cs:__PM_callProtp]  	*/	0x83,0xC4,0x0A,					/*	add		sp,10					*/	0x1F,							/* 	pop		ds						*/	0xCB,							/*	retf							*/	};/* The following functions installs the above realmode callback mechanism * in real mode memory for calling the protected mode routine. */int installCallback(void (PMAPI *pmCB)(),uint *psel, uint *poff,	uint *rseg, uint *roff){	PMREGS			regs;	PMSREGS			sregs;	regs.x.ax = 0x250D;	PM_segread(&sregs);	PM_int386x(0x21,&regs,&regs,&sregs);	/* Get RM callback address	*/	/* Fill in the values in the real mode code segment so that it will	 * call the correct routine.	 */	*((ulong*)&realHandler[0]) = regs.e.eax;	*((ushort*)&realHandler[4]) = sregs.cs;	*((ulong*)&realHandler[6]) = (ulong)pmCB;	/* Copy the real mode handler to real mode memory (only allocate the	 * buffer once since we cant dealloate it with X32).	 */	if (*psel == 0) {		if (!PM_allocRealSeg(sizeof(realHandler),psel,poff,rseg,roff))			return 0;		}	PM_memcpyfn(*psel,*poff,realHandler,sizeof(realHandler));	/* Skip past global variables in real mode code segment */	*roff += 0x0A;	return 1;}int PMAPI PM_setMouseHandler(int mask, PM_mouseHandler mh){	RMREGS		regs;	RMSREGS		sregs;	uint	rseg,roff;	lockPMHandlers();			/* Ensure our handlers are locked	*/	if (!installCallback(_PM_mouseISR, &mouseSel, &mouseOff, &rseg, &roff))		return 0;	_PM_mouseHandler = mh;	/* Install the real mode mouse handler	*/	sregs.es = rseg;	regs.x.dx = roff;	regs.x.cx = _PM_mouseMask = mask;	regs.x.ax = 0xC;	PM_int86x(0x33, &regs, &regs, &sregs);	return 1;}void PMAPI PM_restoreMouseHandler(void){	RMREGS	regs;	if (_PM_mouseHandler) {		regs.x.ax = 33;		PM_int86(0x33, &regs, &regs);		_PM_mouseHandler = NULL;		}}void PMAPI PM_getPMvect(int intno, PMFARPTR *isr){	PMREGS	regs;	PMSREGS	sregs;	PM_segread(&sregs);	regs.x.ax = 0x2502;			/* Get PM interrupt vector				*/	regs.x.cx = intno;	PM_int386x(0x21, &regs, &regs, &sregs);	isr->sel = sregs.es;	isr->off = regs.e.ebx;}void PMAPI PM_setPMvect(int intno, PM_intHandler isr){	PMFARPTR	pmisr;	PMSREGS		sregs;	PM_saveDS();	PM_segread(&sregs);	pmisr.sel = sregs.cs;	pmisr.off = (uint)isr;	PM_restorePMvect(intno, pmisr);}void PMAPI PM_restorePMvect(int intno, PMFARPTR isr){	PMREGS	regs;	PMSREGS	sregs;	PM_segread(&sregs);	regs.x.ax = 0x2505;			/* Set PM interrupt vector				*/	regs.x.cx = intno;	sregs.ds = isr.sel;	regs.e.edx = isr.off;	PM_int386x(0x21, &regs, &regs, &sregs);}static void getISR(int intno, PMFARPTR *pmisr, long *realisr){	PM_getPMvect(intno,pmisr);	_PM_getRMvect(intno,realisr);}static void restoreISR(int intno, PMFARPTR pmisr, long realisr){	PMREGS	regs;	PMSREGS	sregs;	PM_segread(&sregs);	regs.x.ax = 0x2507;			/* Set real and PM vectors				*/	regs.x.cx = intno;	sregs.ds = pmisr.sel;	regs.e.edx = pmisr.off;	regs.e.ebx = realisr;	PM_int386x(0x21, &regs, &regs, &sregs);}static void setISR(int intno, void *isr){	PMREGS	regs;	PMSREGS	sregs;	lockPMHandlers();			/* Ensure our handlers are locked		*/	PM_segread(&sregs);	regs.x.ax = 0x2506;       	/* Hook real and protected vectors  	*/	regs.x.cx = intno;	sregs.ds = sregs.cs;	regs.e.edx = (uint)isr;	PM_int386x(0x21, &regs, &regs, &sregs);}void PMAPI PM_setTimerHandler(PM_intHandler th){	getISR(0x8, &_PM_prevTimer, &_PM_prevRealTimer);	_PM_timerHandler = th;	setISR(0x8, _PM_timerISR);}void PMAPI PM_restoreTimerHandler(void){	if (_PM_timerHandler) {		restoreISR(0x8, _PM_prevTimer, _PM_prevRealTimer);		_PM_timerHandler = NULL;		}}ibool PMAPI PM_setRealTimeClockHandler(PM_intHandler th,int frequency){	/* Save the old CMOS real time clock values */	_PM_oldCMOSRegA = _PM_readCMOS(0x0A);	_PM_oldCMOSRegB = _PM_readCMOS(0x0B);	/* Set the real time clock interrupt handler */	getISR(0x70, &_PM_prevRTC, &_PM_prevRealRTC);	_PM_rtcHandler = th;	setISR(0x70, _PM_rtcISR);	/* Program the real time clock default frequency */	PM_setRealTimeClockFrequency(frequency);	/* Unmask IRQ8 in the PIC2 */	_PM_oldRTCPIC2 = PM_inpb(0xA1);	PM_outpb(0xA1,_PM_oldRTCPIC2 & 0xFE);	return true;}void PMAPI PM_restoreRealTimeClockHandler(void){	if (_PM_rtcHandler) {		/* Restore CMOS registers and mask RTC clock */		_PM_writeCMOS(0x0A,_PM_oldCMOSRegA);		_PM_writeCMOS(0x0B,_PM_oldCMOSRegB);		PM_outpb(0xA1,(PM_inpb(0xA1) & 0xFE) | (_PM_oldRTCPIC2 & ~0xFE));		/* Restore the interrupt vector */		restoreISR(0x70, _PM_prevRTC, _PM_prevRealRTC);		_PM_rtcHandler = NULL;		}}void PMAPI PM_setKeyHandler(PM_intHandler kh){	getISR(0x9, &_PM_prevKey, &_PM_prevRealKey);	_PM_keyHandler = kh;	setISR(0x9, _PM_keyISR);}void PMAPI PM_restoreKeyHandler(void){	if (_PM_keyHandler) {		restoreISR(0x9, _PM_prevKey, _PM_prevRealKey);		_PM_keyHandler = NULL;		}}void PMAPI PM_setKey15Handler(PM_key15Handler kh){	getISR(0x15, &_PM_prevKey15, &_PM_prevRealKey15);	_PM_key15Handler = kh;	setISR(0x15, _PM_key15ISR);}void PMAPI PM_restoreKey15Handler(void){	if (_PM_key15Handler) {		restoreISR(0x15, _PM_prevKey15, _PM_prevRealKey15);		_PM_key15Handler = NULL;		}}void PMAPI PM_installAltBreakHandler(PM_breakHandler bh){	static int	ctrlCFlag,ctrlBFlag;	_PM_ctrlCPtr = (uchar*)&ctrlCFlag;	_PM_ctrlBPtr = (uchar*)&ctrlBFlag;	getISR(0x1B, &_PM_prevBreak, &prevRealBreak);	getISR(0x23, &_PM_prevCtrlC, &prevRealCtrlC);	_PM_breakHandler = bh;	setISR(0x1B, _PM_breakISR);	setISR(0x23, _PM_ctrlCISR);}void PMAPI PM_installBreakHandler(void){	PM_installAltBreakHandler(NULL);}void PMAPI PM_restoreBreakHandler(void){	if (_PM_prevBreak.sel) {		restoreISR(0x1B, _PM_prevBreak, prevRealBreak);		restoreISR(0x23, _PM_prevCtrlC, prevRealCtrlC);		_PM_prevBreak.sel = 0;		_PM_breakHandler = NULL;		}}void PMAPI PM_installAltCriticalHandler(PM_criticalHandler ch){	static short	critBuf[2];	_PM_critPtr = (uchar*)critBuf;	getISR(0x24, &_PM_prevCritical, &prevRealCritical);	_PM_critHandler = ch;	setISR(0x24, _PM_criticalISR);}void PMAPI PM_installCriticalHandler(void){	PM_installAltCriticalHandler(NULL);}void PMAPI PM_restoreCriticalHandler(void){	if (_PM_prevCritical.sel) {		restoreISR(0x24, _PM_prevCritical, prevRealCritical);		_PM_prevCritical.sel = 0;		_PM_critHandler = NULL;		}}int PMAPI PM_lockDataPages(void *p,uint len){	return (_x386_memlock(p,len) == 0);}int PMAPI PM_unlockDataPages(void *p,uint len){	return (_x386_memunlock(p,len) == 0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -