dpmi.h

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C头文件 代码 · 共 792 行 · 第 1/2 页

H
792
字号
      /*0xcd 0x31*/             _INT_31 \
      /*0x1B 0xC0*/             " sbb ax,ax "  \
        parm [bx] [cx dx] value[ax];
#endif

#pragma aux _DPMIFreeMemoryBlock =  \
      /*0x87 0xF7*/        " xchg si,di "  \
      /*0xB8 0x02 0x05*/   " mov ax,0502h  "  \
      /*0xCD 0x31*/        _INT_31 \
      /*0x1B 0xC0*/        " sbb ax,ax "  \
        parm [di si] value[ax];

#pragma aux _DPMISetDescriptorAccessRights = \
      /*0xb8 0x09 0x00*/   " mov ax,9 "  \
      /*0xcd 0x31*/        _INT_31 \
        parm [bx] [cx];

#if defined(__386__)
#pragma aux _DPMILockLinearRegion = \
        "mov di,dx"     \
        "shr edx,16"    \
        "mov si,dx"     \
        "mov bx,ax"     \
        "shr eax,16"    \
        "mov cx,ax"     \
        "mov ax,0600h"  \
        _INT_31 \
        "sbb ax,ax"     \
        parm [eax] [edx] value[ax] modify [bx cx si di];

#pragma aux _DPMIUnlockLinearRegion = \
        "mov di,dx"     \
        "shr edx,16"    \
        "mov si,dx"     \
        "mov bx,ax"     \
        "shr eax,16"    \
        "mov cx,ax"     \
        "mov ax,0601h"  \
        _INT_31 \
        "sbb ax,ax"     \
        parm [eax] [edx] value[ax] modify [bx cx si di];
#else
#pragma aux _DPMILockLinearRegion = \
      /*0xb8 0x00 0x06*/   " mov ax,0600h "  \
      /*0xcd 0x31*/        _INT_31 \
      /*0x1B 0xC0*/        " sbb ax,ax "  \
        parm [cx bx] [si di] value[ax];

#pragma aux _DPMIUnlockLinearRegion = \
      /*0xb8 0x01 0x06*/   " mov ax,0601h "  \
      /*0xcd 0x31*/        _INT_31 \
      /*0x1B 0xC0*/        " sbb ax,ax "  \
        parm [cx bx] [si di] value[ax];
#endif

#if defined(__386__)

#pragma aux _DPMIAllocateDOSMemoryBlock = \
      /*0xB8 0x00 0x01*/   " mov  ax,0100h  "  \
      /*0xCD 0x31*/        _INT_31 \
      /*0x73 0x02*/        " jnc  short ok "  \
      /*0x2B 0xD2*/        " sub  dx,dx "  \
                       " ok: xchg ax,dx "  \
                           " shl  eax,16 "  \
                           " mov  ax,dx "  \
        parm[bx] value [eax] modify [dx];

#pragma aux _DPMIFreeDOSMemoryBlock = \
      /*0xB8 0x01 0x01*/   " mov ax,0101h  "  \
      /*0xCD 0x31*/        _INT_31 \
      /*0x1B 0xC0*/        " sbb eax,eax "  \
        parm[dx] value [eax];

#pragma aux _DPMISimulateRealModeInterrupt = \
                        "push es"               \
                        "mov es,dx"             \
      /*0xB8 0x00 0x03*/   " mov ax,0300h  "  \
      /*0xCD 0x31*/        _INT_31 \
                        "pop es"                \
      /*0x1B 0xC0*/        " sbb eax,eax "  \
        parm[bl] [bh] [cx] [dx edi] value [eax];

#pragma aux _DPMICreateCodeSegmentAliasDescriptor = \
      /*0xb8 0x0a 0x00*/   " mov ax,000ah "  \
      /*0xCD 0x31*/        _INT_31 \
                            "rcl eax,1" \
                            "ror eax,1" \
        parm[bx] value [eax] ;

#pragma aux _DPMIGetDescriptor = \
        "push   es"             \
        "mov    es,dx"          \
        "mov    ax,000bh"       \
        _INT_31 \
        "pop    es"             \
        "sbb    eax,eax"        \
        parm[bx] [dx edi] value [eax] ;

#pragma aux _DPMISetDescriptor = \
        "push   es"             \
        "mov    es,dx"          \
        "mov    ax,000ch"       \
        _INT_31 \
        "pop    es"             \
        "sbb    eax,eax"        \
        parm[bx] [dx edi] value [eax] ;
#else

#pragma aux _DPMIAllocateDOSMemoryBlock = \
      /*0xB8 0x00 0x01*/   " mov ax,0100h  "  \
      /*0xCD 0x31*/        _INT_31 \
        0x73 0x02         /* jnc short ok */ \
      /*0x2B 0xD2*/        " sub dx,dx "  \
        parm[bx] value [dx ax];

#pragma aux _DPMIFreeDOSMemoryBlock = \
      /*0xB8 0x01 0x01*/   " mov ax,0101h  "  \
      /*0xCD 0x31*/        _INT_31 \
      /*0x1B 0xC0*/        " sbb ax,ax "  \
        parm[dx] value [ax];

#pragma aux _DPMISimulateRealModeInterrupt = \
      /*0xB8 0x00 0x03*/   " mov ax,0300h  "  \
      /*0xCD 0x31*/        _INT_31 \
      /*0x1B 0xC0*/        " sbb ax,ax "  \
        parm[bl] [bh] [cx] [es di] value [ax];

#pragma aux _DPMICreateCodeSegmentAliasDescriptor = \
      /*0xb8 0x0a 0x00*/   " mov ax,000ah "  \
      /*0xcd 0x31*/        _INT_31 \
      /*0x1b 0xd2*/        " sbb dx,dx "  \
        parm[bx] value[dx ax];

#pragma aux _DPMIGetDescriptor = \
        "mov    ax,000bh"       \
        _INT_31 \
        "sbb    ax,ax"          \
        parm[bx] [es di] value [ax] ;

#pragma aux _DPMISetDescriptor = \
        "mov    ax,000ch"       \
        _INT_31 \
        "sbb    ax,ax"          \
        parm[bx] [es di] value [ax] ;

#endif

#pragma aux _fDPMIAllocateMemoryBlock =  \
      /*0x06*/                   " push    es "  \
      /*0x50*/                   " push    ax "  \
      /*0x52*/                   " push    dx "  \
      /*0x87 0xd9*/              " xchg    bx,cx "  \
      /*0xb8 0x01 0x05*/         " mov ax,0501H "  \
      /*0xcd 0x31*/              _INT_31 \
      /*0x1b 0xc0*/              " sbb ax,ax "  \
      /*0x8b 0xd3*/              " mov dx,bx "  \
      /*0x07*/                   " pop es "  \
      /*0x5b*/                   " pop bx "  \
      /*0x26 0x89 0x0f*/         " mov es:[bx],cx "  \
      /*0x26 0x89 0x57 0x02*/    " mov es:+2H[bx],dx "  \
      /*0x26 0x89 0x7f 0x04*/    " mov es:+4H[bx],di "  \
      /*0x26 0x89 0x77 0x06*/    " mov es:+6H[bx],si "  \
      /*0x07*/                   " pop es "  \
        parm [ax dx] [bx cx]  \
        value[ax] modify[bx cx dx di si];

#pragma aux _nDPMIAllocateMemoryBlock =  \
      /*0x50*/                   " push    ax "  \
      /*0x87 0xd9*/              " xchg    bx,cx "  \
      /*0xb8 0x01 0x05*/         " mov ax,0501H "  \
      /*0xcd 0x31*/              _INT_31 \
      /*0x1b 0xc0*/              " sbb ax,ax "  \
      /*0x8b 0xd3*/              " mov dx,bx "  \
      /*0x5b*/                   " pop bx "  \
      /*0x89 0x0F*/              " mov ds:[bx],cx "  \
      /*0x89 0x57 0x02*/         " mov ds:+2H[bx],dx  "  \
      /*0x89 0x7F 0x04*/         " mov ds:+4H[bx],di "  \
      /*0x89 0x77 0x06*/         " mov ds:+6H[bx],si  "  \
        parm [ax] [bx cx]  \
        value[ax] modify[bx cx dx di si];

#pragma aux _fDPMIResizeMemoryBlock =  \
      /*0x06*/                   " push es "  \
      /*0x50*/                   " push ax "  \
      /*0x52*/                   " push dx "  \
      /*0x87 0xF7*/              " xchg si,di "  \
      /*0x87 0xd9*/              " xchg bx,cx "  \
      /*0xB8 0x03 0x05*/         " mov ax,0503h  "  \
      /*0xCD 0x31*/              _INT_31 \
      /*0x1B 0xC0*/              " sbb ax,ax "  \
      /*0x8b 0xd3*/              " mov dx,bx "  \
      /*0x07*/                   " pop es "  \
      /*0x5b*/                   " pop bx "  \
      /*0x26 0x89 0x0f*/         " mov es:[bx],cx "  \
      /*0x26 0x89 0x57 0x02*/    " mov es:+2H[bx],dx "  \
      /*0x26 0x89 0x7f 0x04*/    " mov es:+4H[bx],di "  \
      /*0x26 0x89 0x77 0x06*/    " mov es:+6H[bx],si "  \
      /*0x07*/                   " pop es "  \
        parm [dx ax] [bx cx] [di si] \
        value[ax] modify[di si bx cx dx];

#pragma aux _nDPMIResizeMemoryBlock =  \
      /*0x50*/             " push ax "  \
      /*0x87 0xF7*/        " xchg si,di "  \
      /*0x87 0xd9*/        " xchg bx,cx "  \
      /*0xB8 0x03 0x05*/   " mov ax,0503h  "  \
      /*0xCD 0x31*/        _INT_31 \
      /*0x1B 0xC0*/        " sbb ax,ax "  \
      /*0x8b 0xd3*/        " mov dx,bx "  \
      /*0x5b*/             " pop bx "  \
      /*0x89 0x0F*/        " mov ds:[bx],cx "  \
      /*0x89 0x57 0x02*/   " mov ds:+2H[bx],dx  "  \
      /*0x89 0x7F 0x04*/   " mov ds:+4H[bx],di "  \
      /*0x89 0x77 0x06*/   " mov ds:+6H[bx],si  "  \
        parm [ax] [bx cx] [di si] \
        value[ax] modify[di si bx cx dx];

#pragma aux _fDPMIGetFreeMemoryInformation = \
      /*0xb8 0x00 0x05*/   " mov ax,0500h "  \
      /*0xcd 0x31*/        _INT_31 \
      /*0x1B 0xC0*/        " sbb ax,ax "  \
        parm[es di] value[ax];

#pragma aux _nDPMIGetFreeMemoryInformation = \
      /*0x06*/             " push es "  \
      /*0x1E*/             " push ds "  \
      /*0x07*/             " pop es "  \
      /*0xb8 0x00 0x05*/   " mov ax,0500h "  \
      /*0xcd 0x31*/        _INT_31 \
      /*0x07*/             " pop es "  \
      /*0x1B 0xC0*/        " sbb ax,ax "  \
        parm[di] value[ax];

#if defined(__386__)
#define __DX    edx
#else
#define __DX    dx
#endif

#pragma aux _DPMIGetRealModeInterruptVector = \
        "mov    ax,0200h" \
        _INT_31 \
        parm [bl] value[cx __DX] modify[ax];

#pragma aux _DPMISetRealModeInterruptVector = \
        "mov    ax,0201h" \
        _INT_31 \
        parm [bl] [cx __DX] modify[ax];

#pragma aux _DPMIGetPMExceptionVector = \
        "mov    ax,0202h" \
        _INT_31 \
        parm [bl] value[cx __DX] modify[ax];

#pragma aux _DPMISetPMExceptionVector = \
        "mov    ax,0203h" \
        _INT_31 \
        parm [bl] [cx __DX] modify[ax];

#pragma aux _DPMIGetPMInterruptVector = \
        "mov    ax,0204h" \
        _INT_31 \
        parm [bl] value[cx __DX] modify[ax];

#pragma aux _DPMISetPMInterruptVector = \
        "mov    ax,0205h" \
        _INT_31 \
        parm [bl] [cx __DX] modify[ax];

#if defined(__386__)
#pragma aux _DPMIAllocateRealModeCallBackAddress = \
        "push   es" \
        "push   ds" \
        "mov    ds,dx" \
        "mov    esi,eax" \
        "mov    es,cx" \
        "mov    edi,ebx" \
        "mov    ax,0303h" \
        _INT_31 \
        "pop    ds" \
        "pop    es" \
        parm[dx eax] [cx ebx] value[cx edx] modify[edi esi];

#pragma aux _DPMIFreeRealModeCallBackAddress = \
        "mov    ax,0304h" \
        _INT_31 \
        parm[cx edx];
#else
#pragma aux _DPMIAllocateRealModeCallBackAddress = \
        "push   ds" \
        "mov    ds,dx" \
        "mov    si,ax" \
        "mov    ax,0303h" \
        _INT_31 \
        "pop    ds" \
        parm[dx ax] [es di] value[cx dx] modify[si];

#pragma aux _DPMIFreeRealModeCallBackAddress = \
        "mov    ax,0304h" \
        _INT_31 \
        parm[cx dx];
#endif

#if defined(__386__)
#pragma aux             _DPMIRawPMtoRMAddr = \
        "mov ah,3"      \
        "mov al,6"      \
        "xor edi,edi"   \
        "stc"           \
        _INT_31 \
        "mov cx,si"     \
        "jnc L1"        \
        "xor cx,cx"     \
        "xor edi,edi"   \
        "L1:"           \
        value           [cx edi] \
        modify exact    [eax cx si edi];

#pragma aux             _DPMIRawRMtoPMAddr = \
        "mov ah,3"      \
        "mov al,6"      \
        "stc"           \
        _INT_31 \
        "jnc L1"        \
        "xor ebx,ebx"   \
        "jmp short L2"  \
        "L1:"           \
        "shl ebx,16"    \
        "mov bx,cx"     \
        "L2:"           \
        value           [ebx] \
        modify exact    [eax cx si edi];

#pragma aux             _DPMISaveRMStateAddr = \
        "mov ah,3"      \
        "mov al,5"      \
        "stc"           \
        _INT_31 \
        "mov cx,si"     \
        "jnc L1"        \
        "xor cx,cx"     \
        "xor edi,edi"   \
        "L1:"           \
        value           [cx edi] \
        modify exact    [ax bx cx si edi];

#pragma aux             _DPMISavePMStateAddr = \
        "mov ah,3"      \
        "mov al,5"      \
        _INT_31 \
        "jnc L1"        \
        "xor cx,cx"     \
        "xor ebx,ebx"   \
        "jmp short L2"  \
        "L1:"           \
        "shl ebx,16"    \
        "mov bx,cx"     \
        "L2:"           \
        value           [ebx] \
        modify exact    [ax bx cx si edi];

#pragma aux             _DPMISaveStateSize = \
        "mov ah,3"      \
        "mov al,5"      \
        _INT_31 \
        "jnc L1"        \
        "xor eax,eax"   \
        "L1:"           \
        value           [ax] \
        modify exact    [eax bx cx si edi];

#pragma aux             _DPMIGetVenderSpecificAPI = \
        "push ds"               \
        "push es"               \
        "push fs"               \
        "push gs"               \
        "push ebp"              \
        "mov  ds,cx"            \
        "mov ah,0x0a"           \
        "mov al,0"              \
        _INT_31                 \
        "mov cx,es"             \
        "jnc L1"                \
        "xor ecx,ecx"           \
        "xor edi,edi"           \
        "L1:"                   \
        "pop ebp"               \
        "pop gs"                \
        "pop fs"                \
        "pop es"                \
        "pop ds"                \
        parm [cx esi] value [cx edi] modify [eax ebx ecx edx esi]
#endif

#endif

⌨️ 快捷键说明

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