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

📄 wdpmi.h

📁 开放源码的编译器open watcom 1.6.0版的源代码
💻 H
字号:
#ifndef __WATT_DPMI_H
#define __WATT_DPMI_H

#ifndef __WATT_TARGET_H
#error This file must be included after wattcp.h or target.h
#endif

/*
 * The Watcom stackset() functions are from Dan Kegel's RARP implementation
 */
#if defined(__WATCOMC__) && !defined(__386__)  /* 16-bit Watcom */
  extern void stackset (void far *stack);
  #pragma aux stackset = \
          "mov  ax, ss"  \
          "mov  bx, sp"  \
          "mov  ss, dx"  \
          "mov  sp, si"  \
          "push ax"      \
          "push bx"      \
          parm [dx si]   \
          modify [ax bx];

  extern void stackrestore (void);
  #pragma aux stackrestore = \
          "pop bx"     \
          "pop ax"     \
          "mov ss, ax" \
          "mov sp, bx"             /* don't put esp here */  \
          modify [ax bx];

#elif defined(__WATCOM386__)       /* 32-bit Watcom targets */
  #define USES_DPMI_API

  extern void stackset (void *stack);
  #pragma aux stackset =  \
          "mov  ax,  ss"  \
          "mov  ebx, esp" \
          "mov  cx,  ds"  \
          "mov  ss,  cx"  \
          "mov  esp, esi" \
          "push eax"      \
          "push ebx"      \
          parm [esi]      \
          modify [eax ebx ecx];   

  extern void stackrestore (void);
  #pragma aux stackrestore = \
          "lss esp, [esp]";

  extern WORD My_CS (void);
  #pragma aux My_CS =  \
          "mov ax, cs" \
          modify [ax];

  extern WORD My_DS(void);
  #pragma aux My_DS =  \
          "mov ax, ds" \
          modify [ax];

  extern DWORD _get_limit (WORD sel);
  #pragma aux _get_limit = \
          "lsl eax, eax"   \
          parm [eax];

#elif defined(__BORLAND386__) && (DOSX == WDOSX)
  #define USES_DPMI_API

  #define stackset(stk)  __asm { mov  ax,ss;    \
                                 mov  ebx, esp; \
                                 mov  cx,  ds;  \
                                 mov  ss,  cx;  \
                                 lea  esp, stk; \
                                 push eax;      \
                                 push ebx;      \
                               }
  #define stackrestore() __asm { lss esp, [esp] }

#elif defined(__GNUC__) && (DOSX == WDOSX)
  #define USES_DPMI_API
#endif


#if defined(USES_DPMI_API)

  #include <sys/packon.h>

  struct DPMI_regs {
         DWORD  r_di;
         DWORD  r_si;
         DWORD  r_bp;
         DWORD  reserved;
         DWORD  r_bx;
         DWORD  r_dx;
         DWORD  r_cx;
         DWORD  r_ax;
         WORD   r_flags;
         WORD   r_es, r_ds, r_fs, r_gs;
         WORD   r_ip, r_cs, r_sp, r_ss;
       };

  struct DPMI_callback {
         struct DPMI_regs cb_reg;
         WORD             cb_segment;
         WORD             cb_offset;
       };

  #include <sys/packoff.h>

  #define SEG_OFS_TO_LIN(seg,ofs)  (void*)(((WORD)(seg) << 4) + (WORD)(ofs))

  extern int   dpmi_init           (void);
  extern WORD  dpmi_real_malloc    (WORD size, WORD *sel);
  extern void  dpmi_real_free      (WORD selector);
  extern int   dpmi_lock_region    (void *address, unsigned length);
  extern int   dpmi_unlock_region  (void *address, unsigned length);
  extern void *dpmi_get_real_vector(int intr);
  extern int   dpmi_real_interrupt (int intr, struct DPMI_regs *reg);
  extern int   dpmi_alloc_callback (void (*func)(), struct DPMI_callback *cb);
  extern int   dpmi_cpu_type       (void);
  extern int   dpmi_dos_yield      (void);

#ifdef __BORLAND386__
  extern int dpmi_real_interrupt2 (int intr, struct DPMI_regs *reg);
#endif

#endif /* USES_DPMI_API */

#endif /* !__WATT_DPMI_H */

⌨️ 快捷键说明

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