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

📄 pmdos.c

📁 uboot在arm处理器s3c2410的移植代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    _dx_pmiv_get(intno, &ph);    isr->sel = FP_SEL(ph);    isr->off = FP_OFF(ph);}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,PM_lockHandle *lh){    return (_dx_lock_pgsn(p,len) == 0);}int PMAPI PM_unlockDataPages(void *p,uint len,PM_lockHandle *lh){    return (_dx_ulock_pgsn(p,len) == 0);}int PMAPI PM_lockCodePages(void (*p)(),uint len,PM_lockHandle *lh){    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,PM_lockHandle *lh){    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,PM_lockHandle *lh){    return (_x386_memlock(p,len) == 0);}int PMAPI PM_unlockDataPages(void *p,uint len,PM_lockHandle *lh){    return (_x386_memunlock(p,len) == 0);}int PMAPI PM_lockCodePages(void (*p)(),uint len,PM_lockHandle *lh){    return (_x386_memlock(p,len) == 0);}int PMAPI PM_unlockCodePages(void (*p)(),uint len,PM_lockHandle *lh){    return (_x386_memunlock(p,len) == 0);}#endif/*-------------------------------------------------------------------------*//* Borland's DPMI32 DOS Power Pack Extender support.                       *//*-------------------------------------------------------------------------*/#ifdef  DPMI32#define GENERIC_DPMI32          /* Use generic 32 bit DPMI routines */

⌨️ 快捷键说明

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