devaux.h

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

H
775
字号
    "call dword ptr [Device_Help]"      \
    "jc   error"                        \
    "mov  es:[di],bx"                   \
    "mov  es:[di+2],ax"                 \
    "sub  ax,ax"                        \
    "error:"                            \
    value [ax]                          \
    parm caller [ax] [bh] [bl] [es di]  \
    modify exact [ax dl];


USHORT DevHelp_UnLock( ULONG LockHandle );
#pragma aux DevHelp_UnLock =            \
    "xchg ax,bx"                        \
    "mov  dl,14h"                       \
    DEVHELP_CALL                        \
    parm nomemory [ax bx]               \
    modify nomemory exact [ax bx dl];


USHORT DevHelp_PhysToVirt( ULONG PhysAddr, USHORT usLength, PVOID SelOffset, PUSHORT ModeFlag );
#pragma aux DevHelp_PhysToVirt =        \
    "xchg ax,bx"                        \
    "mov  dx,15h"                       \
    "push ds"                           \
    "call dword ptr [Device_Help]"      \
    "jc   error"                        \
    "sub  ax,ax"                        \
    "mov  es:[di],si"                   \
    "mov  es:[di+2],ds"                 \
    "error:"                            \
    "pop  ds"                           \
    value [ax]                          \
    parm caller nomemory [bx ax] [cx] [es di] [] \
    modify exact [ax bx dx si];


USHORT DevHelp_VirtToPhys( PVOID SelOffset, PPHYSADDR PhysAddr );
#pragma aux DevHelp_VirtToPhys =        \
    "push ds"                           \
    "mov  dl,16h"                       \
    "push es"                           \
    "mov  si,ds"                        \
    "mov  es,si"                        \
    "mov  ds,bx"                        \
    "mov  si,ax"                        \
    "call dword ptr es:[Device_Help]"   \
    "pop  es"                           \
    "mov  es:[di+0],bx"                 \
    "mov  es:[di+2],ax"                 \
    "pop  ds"                           \
    "sub  ax,ax"                        \
    value [ax]                          \
    parm caller nomemory [ax bx] [es di] \
    modify exact [ax bx dl si];


/* DevHelp_PhysToUVirt request types */
typedef enum {
    SELTYPE_R3CODE = 0,
    SELTYPE_R3DATA,
    SELTYPE_FREE,
    SELTYPE_R2CODE,
    SELTYPE_R2DATA,
    SELTYPE_R3VIDEO
} DHPhysToUVirt_flags;

USHORT DevHelp_PhysToUVirt( ULONG PhysAddr, USHORT Length, USHORT flags, USHORT TagType, PVOID SelOffset );
#pragma aux DevHelp_PhysToUVirt =       \
    "xchg ax,bx"                        \
    "mov  dl,17h"                       \
    "call dword ptr [Device_Help]"      \
    "jc   error"                        \
    "push es"                           \
    "push bx"                           \
    "mov  bx,sp"                        \
    "les  bx,ss:[bx+4]"                 \
    "pop  es:[bx+0]"                    \
    "pop  es:[bx+2]"                    \
    "sub  ax,ax"                        \
    "error:"                            \
    value [ax]                          \
    parm caller nomemory [bx ax] [cx] [dh] [si] [] \
    modify exact [ax bx dl es];


/* DevHelp_AllocPhys allocation flags */
typedef enum {
    MEMTYPE_ABOVE_1M = 0,
    MEMTYPE_BELOW_1M
} DHAllocPhys_flags;

USHORT DevHelp_AllocPhys( ULONG lSize, USHORT MemType, PULONG PhysAddr );
#pragma aux DevHelp_AllocPhys =         \
    "xchg ax,bx"                        \
    "mov  dl,18h"                       \
    "call dword ptr [Device_Help]"      \
    "jc   error"                        \
    "mov  es:[di+0],bx"                 \
    "mov  es:[di+2],ax"                 \
    "sub  ax,ax"                        \
    "error:"                            \
    value [ax]                          \
    parm caller nomemory [ax bx] [dh] [es di] \
    modify exact [ax bx dx];


USHORT DevHelp_FreePhys( ULONG PhysAddr );
#pragma aux DevHelp_FreePhys =          \
    "xchg ax,bx"                        \
    "mov  dl,19h"                       \
    "call dword ptr [Device_Help]"      \
    "mov  ax,0"                         \
    "sbb  ax,0"                         \
    value [ax]                          \
    parm caller nomemory [ax bx]        \
    modify exact [ax bx dl];


USHORT DevHelp_SetIRQ( NPFN IRQHandler, USHORT IRQLevel, USHORT SharedFlag );
#pragma aux DevHelp_SetIRQ =            \
    "mov  dl,1Bh"                       \
    DEVHELP_CALL                        \
    parm caller nomemory [ax] [bx] [dh] \
    modify nomemory exact [ax dl];


USHORT DevHelp_UnSetIRQ( USHORT IRQLevel );
#pragma aux DevHelp_UnSetIRQ =          \
    "mov  dl,1Ch"                       \
    DEVHELP_CALL                        \
    parm caller nomemory [bx]           \
    modify nomemory exact [ax dl];


USHORT DevHelp_SetTimer( NPFN TimerHandler );
#pragma aux DevHelp_SetTimer =          \
    "mov  dl,1Dh"                       \
    DEVHELP_CALL                        \
    parm caller nomemory [ax]           \
    modify nomemory exact [ax dl];


USHORT DevHelp_ResetTimer( NPFN TimerHandler );
#pragma aux DevHelp_ResetTimer =        \
    "mov  dl,1Eh"                       \
    DEVHELP_CALL                        \
    parm caller nomemory [ax]           \
    modify nomemory exact [ax dl];




/* DevHelp_GetDOSVar identifiers */
typedef enum {
    DHGETDOSV_SYSINFOSEG        = 1,
    DHGETDOSV_LOCINFOSEG        = 2,
    DHGETDOSV_VECTORSDF         = 4,
    DHGETDOSV_VECTORREBOOT      = 5,
    DHGETDOSV_VECTORMSATS       = 6,
    DHGETDOSV_YIELDFLAG         = 7,
    DHGETDOSV_TCYIELDFLAG       = 8,
    DHGETDOSV_DOSCODEPAGE       = 11,
    DHGETDOSV_INTERRUPTLEV      = 13,
    DHGETDOSV_DEVICECLASSTABLE  = 14,
    DHGETDOSV_DMQSSEL           = 15,
    DHGETDOSV_APMINFO           = 16
} DHGetDOSVar_Index;

USHORT DevHelp_GetDOSVar( DHGetDOSVar_Index VarNumber, USHORT VarMember, PPVOID KernelVar );
#pragma aux DevHelp_GetDOSVar =         \
    "mov  dl,24h"                       \
    "call dword ptr [Device_Help]"      \
    "mov  es:[di+0],bx"                 \
    "mov  es:[di+2],ax"                 \
    "sub  ax,ax"                        \
    value [ax]                          \
    parm caller nomemory [al] [cx] [es di] \
    modify exact [ax bx dl];


/* DevHelp_SendEvent event codes */
typedef enum {
    EVENT_MOUSEHOTKEY = 0,
    EVENT_CTRLBREAK,
    EVENT_CTRLC,
    EVENT_CTRLNUMLOCK,
    EVENT_CTRLPRTSC,
    EVENT_SHIFTPRTSC,
    EVENT_KBDHOTKEY,
    EVENT_KBDREBOOT
} DHSendEvent_code;

USHORT DevHelp_SendEvent( USHORT EventType, USHORT Parm );
#pragma aux DevHelp_SendEvent =         \
    "mov  dl,25h"                       \
    "call dword ptr [Device_Help]"      \
    "mov  ax,0"                         \
    "sbb  ax,0"                         \
    value [ax]                          \
    parm nomemory [ah] [bx]             \
    modify nomemory exact [ax dl];


/* DevHelp_VerifyAccess access types */
typedef enum {
    VERIFY_READONLY = 0,
    VERIFY_READWRITE
} DHVerifyAccess_type;

USHORT DevHelp_VerifyAccess( SEL MemSelector, USHORT Length, USHORT MemOffset, UCHAR AccessFlag );
#pragma aux DevHelp_VerifyAccess =      \
    "mov  dl,27h"                       \
    DEVHELP_CALL                        \
    parm caller nomemory [ax] [cx] [di] [dh] \
    modify nomemory exact [ax dl];

/* Modified version of VerifyAccess that takes a far pointer instead of selector/offset */
USHORT DevHelp_VerifyAccessPtr( PVOID Pointer, USHORT Length, UCHAR AccessFlag );
#pragma aux DevHelp_VerifyAccessPtr =   \
    "xchg ax,di"                        \
    "mov  dl,27h"                       \
    DEVHELP_CALL                        \
    parm caller nomemory [ax di] [cx] [dh] \
    modify nomemory exact [ax dl di];



typedef struct _IDCTABLE {
    USHORT  RealOffset;     /* obsolete */
    USHORT  RealCS;         /* obsolete */
    USHORT  RealDS;         /* obsolete */
    VOID    (FAR *ProtIDCEntry)( VOID );
    USHORT  ProtDS;
} IDCTABLE, NEAR *NPIDCTABLE;

USHORT DevHelp_AttachDD( NPSZ DDName, NPIDCTABLE DDTable );
#pragma aux DevHelp_AttachDD =          \
    "mov  dl,2Ah"                       \
    "call dword ptr [Device_Help]"      \
    "mov  ax,0"                         \
    "sbb  ax,0"                         \
    value [ax]                          \
    parm caller [bx] [di]               \
    modify exact [ax dl];


USHORT DevHelp_InternalError( PSZ MsgText, USHORT MsgLength );
#pragma aux DevHelp_InternalError =     \
    "push ds"                           \
    "push es"                           \
    "pop  ds"                           \
    "pop  es"                           \
    "mov  dl,2Bh"                       \
    "jmp dword ptr es:[Device_Help]"    \
    parm [es si] [di]                   \
    modify nomemory exact []            \
    aborts;


USHORT DevHelp_AllocGDTSelector( PSEL Selectors, USHORT Count );
#pragma aux DevHelp_AllocGDTSelector =  \
    "mov  dl,2Dh"                       \
    DEVHELP_CALL                        \
    parm caller [es di] [cx]            \
    modify nomemory exact [ax dl];




USHORT DevHelp_FreeGDTSelector( SEL Selector );
#pragma aux DevHelp_FreeGDTSelector =   \
    "mov  dl,53h"                       \
    DEVHELP_CALL                        \
    parm caller nomemory [ax]           \
    modify nomemory exact [ax dl];


/* GDT selector mapping types for PhysToGDTSel and PageListToGDTSelector */
typedef enum {
    GDTSEL_R3CODE = 0,
    GDTSEL_R3DATA = 1,
    GDTSEL_R2CODE = 3,
    GDTSEL_R2DATA = 4,
    GDTSEL_R0CODE = 5,
    GDTSEL_R0DATA = 6,
    GDTSEL_ADDR32 = 128
} DHGDT_mapType;

// TODO: use pops instead of moves from stack
USHORT DevHelp_PhysToGDTSel( ULONG PhysAddr, ULONG Count, SEL Selector, UCHAR Access );
#pragma aux DevHelp_PhysToGDTSel =      \
    "push bp"                           \
    "mov  dl,54h"                       \
    "mov  bp,sp"                        \
    "mov  eax,[bp+2]"                   \
    "mov  ecx,[bp+6]"                   \
    "mov  si,[bp+10]"                   \
    "mov  dh,[bp+12]"                   \
    "call dword ptr [Device_Help]"      \
    "jc   error"                        \
    "sub  ax,ax"                        \
    "error:"                            \
    "pop  bp"                           \
    value [ax]                          \
    parm caller nomemory []             \
    modify nomemory exact [ax cx dx si];




USHORT DevHelp_VirtToLin( SEL Selector, ULONG Offset, PLIN LinearAddr );
#pragma aux DevHelp_VirtToLin =         \
    "mov  esi,[esp]"                    \
    "mov  dl,5Bh"                       \
    "call dword ptr [Device_Help]"      \
    "jc   error"                        \
    "les  bx,[esp+4]"                   \
    "mov  es:[bx],eax"                  \
    "sub  ax,ax"                        \
    "error:"                            \
    value [ax]                          \
    parm caller nomemory [ax] []        \
    modify exact [ax si es bx dl];

/* Modified version of VirtToLin that takes a far pointer instead of selector/offset */
USHORT DevHelp_VirtToLinPtr( PVOID Pointer, PLIN LinearAddr );
#pragma aux DevHelp_VirtToLinPtr =      \
    "xchg ax,si"                        \
    "movzx esi,si"                      \
    "mov  dl,5Bh"                       \
    "call dword ptr [Device_Help]"      \
    "jc   error"                        \
    "pop  bx"                           \
    "pop  es"                           \
    "mov  es:[bx],eax"                  \
    "sub  ax,ax"                        \
    "error:"                            \
    value [ax]                          \
    parm routine nomemory [ax si] []    \
    modify exact [ax si es bx dl];




USHORT DevHelp_OpenEventSem( ULONG hEvent );
#pragma aux DevHelp_OpenEventSem =      \
    "pop  eax"                          \
    "mov  dl,67h"                       \
    DEVHELP_CALL                        \
    parm routine nomemory []            \
    modify nomemory exact [ax dl];


USHORT DevHelp_CloseEventSem( ULONG hEvent );
#pragma aux DevHelp_CloseEventSem =     \
    "pop  eax"                          \
    "mov  dl,68h"                       \
    DEVHELP_CALL                        \
    parm routine nomemory []            \
    modify nomemory exact [ax dl];


USHORT DevHelp_PostEventSem( ULONG hEvent );
#pragma aux DevHelp_PostEventSem =      \
    "pop  eax"                          \
    "mov  dl,69h"                       \
    DEVHELP_CALL                        \
    parm routine nomemory []            \
    modify nomemory exact [ax dl];


USHORT DevHelp_ResetEventSem( ULONG hEvent, LIN pNumPosts );
#pragma aux DevHelp_ResetEventSem =     \
    "pop  eax"                          \
    "pop  edi"                          \
    "mov  dl,6Ah"                       \
    DEVHELP_CALL                        \
    parm routine nomemory []            \
    modify exact [ax dl di];

#ifdef __cplusplus
extern "C" {
#endif

#endif

⌨️ 快捷键说明

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