minivdd.h
来自「用于查询PC机上的USB端口是否有设备挂接上」· C头文件 代码 · 共 1,208 行 · 第 1/3 页
H
1,208 行
Vid_SFlags equ <Vids.Vids_SFlags>
VDD_CB_Offset equ <Vids.Vids_CB_Offset>
VDD_Msg_Pseudo_VM equ <Vids.Vids_Msg_Pseudo_VM>
TGDC_Draw_Off equ <Vids.VDD_TGDC_Draw_Off>
GGDC_Draw_Off equ <Vids.VDD_GGDC_Draw_Off>
TGDC_Sync_On equ <Vids.VDD_TGDC_Sync_On>
TGDC_Sync_Off equ <Vids.VDD_TGDC_Sync_Off>
TGDC_FIFO_Empty equ <Vids.VDD_TGDC_FIFO_Empty>
GGDC_FIFO_Empty equ <Vids.VDD_GGDC_FIFO_Empty>
;
; RegTrapStruct
;
MiniFuncStruct STRUC
MF_ProcAddr dd ?
;;MF_Order dw ?
;;MF_MiniID db ?
;;MF_Flags db ?
MiniFuncStruct ENDS
;
; MiniProcStruct
;
MiniVDD_Proc_Struct STRUC
Proc_Address dd ?
Proc_Order dw ?
Proc_MiniID db ?
Proc_Flags db ?
MiniVDD_Proc_Struct ENDS
.errnz (size MiniVDD_Proc_Struct) mod 4
;
; MiniTrapTable - Global Info
; LocalTrapTable - Local Status
;
MiniVDD_GTrap_Struct STRUC
GTrap_ProcAddr dd ?
GTrap_PortAddr dw ?
GTrap_NumMini dw ?
GTrap_ProcTable db ((size MiniVDD_Proc_Struct) * MaxMultiTrap) dup (?)
MiniVDD_GTrap_Struct ENDS
MiniVDD_LTrap_Struct STRUC
LTrap_ProcAddr dd ?
LTrap_Status db ?
LTrap_Flags db MaxMultiTrap dup (?)
MiniVDD_LTrap_Struct ENDS
;******************************************************************************
; M A C R O S
;******************************************************************************
;
; BeginMiniFunc TableName
; MiniFunc Function-ID, ProcedureName
; |
; EndMiniFunc TableName
;
EndMiniFunc_ MACRO n
ifdef MiniFunc&n
dd OFFSET32 MiniFunc&n ; MiniFuncStruct
else
dd 0
endif
ENDM
MiniFunc_ MACRO FuncID, FuncName
MiniFunc&FuncID equ <FuncName>
ENDM
BeginMiniFunc MACRO TableName
public TableName
TableName label near
ENDM
if 1
EndMiniFunc MACRO TableName
x = 0
REPT NBR_MINI_VDD_FUNCTIONS_41
EndMiniFunc_ %x
x = x + 1
ENDM
ENDM
else
EndMiniFunc MACRO TableName
x = 0
REPT NBR_MINI_VDD_FUNCTIONS
EndMiniFunc_ %x
x = x + 1
ENDM
ENDM
endif
MiniFunc MACRO FuncID, FuncName
MiniFunc_ %(FuncID), <FuncName>
ENDM
;
; MiniVDDCall Function-ID
;
MiniVDDCall MACRO FuncID, SetCarry
local MiniCall_Loop
local MiniCall_Exit
push ecx
push esi
lea esi, [MiniVDD_Func_Table][(size MiniVDD_Proc_Struct) * MaxMultiFunc * FuncID]
mov ecx, [MiniVDD_NumMini]
MiniCall_Loop:
cmp dword ptr [esi.Proc_Address], 0
jz MiniCall_Exit
pushad
ifnb <SetCarry>
stc
endif
call dword ptr [esi.Proc_Address]
popad
jc MiniCall_Exit
add esi, size MiniVDD_Proc_Struct
loop MiniCall_Loop
MiniCall_Exit:
pop esi
pop ecx
ENDM
;
; MiniVDDCall2 Function-ID
;
MiniVDDCall2 MACRO FuncID, SetCarry
local MiniCall_Exit
local MiniCall_Proc
push ecx
push esi
lea esi, [MiniVDD_Func_Table][(size MiniVDD_Proc_Struct) * MaxMultiFunc * FuncID]
MiniCall_Proc:
cmp dword ptr [esi.Proc_Address], 0
jz MiniCall_Exit
pushad
ifnb <SetCarry>
stc
endif
call dword ptr [esi.Proc_Address]
popad
MiniCall_Exit:
pop esi
pop ecx
ENDM
;
; MiniVDDCall3 Function-ID
;
MiniVDDCall3 MACRO FuncID, MiniID, SetCarry
local MiniCall_Exit
local MiniCall_Loop
local MiniCall_Proc
push ecx
push esi
lea esi, [MiniVDD_Func_Table][(size MiniVDD_Proc_Struct) * MaxMultiFunc * FuncID]
movzx ecx, MiniID
MiniCall_Loop:
cmp ecx, 0
jz MiniCall_Proc
add esi, size MiniVDD_Proc_Struct
dec ecx
jmp MiniCall_Loop
MiniCall_Proc:
cmp dword ptr [esi.Proc_Address], 0
jz MiniCall_Exit
pushad
ifnb <SetCarry>
stc
endif
call dword ptr [esi.Proc_Address]
popad
MiniCall_Exit:
pop esi
pop ecx
ENDM
;
; MiniVDDCall Function-ID
;
MiniVDDFunc MACRO TmpReg, FuncID
mov TmpReg, [MiniVDD_Func_Table.Proc_Address][(size MiniVDD_Proc_Struct) * MaxMultiFunc * FuncID]
ENDM
;
; ExecMode/ExecModeThru
; ExecModeNot/ExecModeThruNot
; ExecModeOnly
; ExecModeOnlyNot
; ExecModeElse
; ExecModeElseNot
; ExecModeEnd
;
ExecModeLL macro Num
ExecMode_L&Num:
endm
ExecModeLE macro Num
ExecMode_E&Num:
endm
ExecModeJE macro Num
jmp ExecMode_E&Num
endm
ExecModeJZ macro Num
jz ExecMode_L&Num
endm
ExecModeJNZ macro Num
jnz ExecMode_L&Num
endm
ExecModeJEZ macro Num
jz ExecMode_E&Num
endm
ExecModeJENZ macro Num
jnz ExecMode_E&Num
endm
ExecModeTest macro ModeFlag, CB_Reg
if ModeFlag and vFlg_Local
ifidni <CB_Reg>, <Vid>
push ebx
mov ebx, [Vid_VM_Handle]
add ebx, [VDD_CB_Offset]
test [ebx.VDD_SFlags], ModeFlag
pop ebx
else
ifidni <CB_Reg>, <Cur>
push ebx
VMMCall Get_Cur_VM_Handle
add ebx, [VDD_CB_Offset]
test [ebx.VDD_SFlags], ModeFlag
pop ebx
else
ifb <CB_Reg>
push ebx
add ebx, [VDD_CB_Offset]
test [ebx.VDD_SFlags], ModeFlag
pop ebx
else
test [CB_Reg.VDD_SFlags], ModeFlag
endif
endif
endif
else
test [Vid_SFlags], ModeFlag
endif
endm
ExecModeChk macro HdrFlag, JmpFlag, JmpLabel, ModeFlag, CB_Reg
ifidni <HdrFlag>, <Jmp>
.erre FlgExecMode
ExecModeJE %EndExecMode
endif
ExecModeLL %NumExecMode
NumExecMode = NumExecMode + 1
FlgExecMode = 1
ifnb <ModeFlag>
ExecModeTest <ModeFlag>, <CB_Reg>
ifidni <JmpLabel>, <End>
ifidni <JmpFlag>, <Not>
ExecModeJENZ %EndExecMode
else
ExecModeJEZ %EndExecMode
endif
else
ifidni <JmpFlag>, <Not>
ExecModeJNZ %NumExecMode
else
ExecModeJZ %NumExecMode
endif
endif
endif
endm
ExecModeEnd macro
ExecModeLL %NumExecMode
ExecModeLE %EndExecMode
NumExecMode = NumExecMode + 1
EndExecMode = EndExecMode + 1
FlgExecMode = 0
endm
;
; CB_Reg = Regs/Vid/Cur
; ModeFlag = vFlg_xxxx
;
ExecModeJmp macro JmpLabel, ModeFlag, CB_Reg
ExecModeTest %ModeFlag, <CB_Reg>
jnz JmpLabel
endm
ExecModeJmpNot macro JmpLabel, ModeFlag, CB_Reg
ExecModeTest %ModeFlag, <CB_Reg>
jz JmpLabel
endm
ExecMode macro ModeFlag, CB_Reg
ExecModeChk Top, Equ, Next, %ModeFlag, CB_Reg
endm
ExecModeNot macro ModeFlag, CB_Reg
ExecModeChk Top, Not, Next, %ModeFlag, CB_Reg
endm
ExecModeOnly macro ModeFlag, CB_Reg
ExecModeChk Top, Equ, End, %ModeFlag, CB_Reg
endm
ExecModeOnlyNot macro ModeFlag, CB_Reg
ExecModeChk Top, Not, End, %ModeFlag, CB_Reg
endm
ExecModeElse macro ModeFlag, CB_Reg
ExecModeChk Jmp, Equ, Next, %ModeFlag, CB_Reg
endm
ExecModeElseNot macro ModeFlag, CB_Reg
ExecModeChk Jmp, Not, Next, %ModeFlag, CB_Reg
endm
ExecModeThru macro ModeFlag, CB_Reg
ExecModeChk Thru, Equ, Next, %ModeFlag, CB_Reg
endm
ExecModeThruNot macro ModeFlag, CB_Reg
ExecModeChk Thru, Not, Next, %ModeFlag, CB_Reg
endm
NumExecMode = 1
EndExecMode = 1
FlgExecMode = 0
else ;NEC_98
;
;Some external definitions. Only define these if we're assembling the
;device independent "main" portion of the Mini-VDD:
;
ifdef MAINVDD
externdef MiniVDDDispatchTable:dword ;in VDDCTL.ASM
endif ;MAINVDD
;
;
MiniVDDDispatch macro FunctionCode, HandlerAddr
mov [edi+(FunctionCode*4)],OFFSET32 MiniVDD_&HandlerAddr
endm
;
;
CardVDDDispatch macro FunctionCode, HandlerAddr
mov [edi+(FunctionCode*4)],OFFSET32 CardVDD_&HandlerAddr
endm
;
;
MiniVDDCall macro FunctionCode, SaveFlags
local MiniVDDCallExit, MiniVDDCallLeave
ifdef MAXDEBUG
ifndef NoTrace_&FunctionCode&
Trace_Out "MiniVDDCall: &FunctionCode&"
endif
endif
push edi ;;save this register for now
ifnb <SaveFlags>
pushfd ;;save the flags state
endif
mov edi,OFFSET32 MiniVDDDispatchTable
cmp dword ptr [edi+(FunctionCode*4)],0
je MiniVDDCallLeave ;;MiniVDD doesn't support this
ifnb <SaveFlags>
popfd ;;just clear the Stack from the flags
endif
call dword ptr [edi+(FunctionCode*4)]
ifnb <SaveFlags>
jmp MiniVDDCallExit ;;we already restored the flags
endif
;
MiniVDDCallLeave:
ifnb <SaveFlags>
popfd ;;
endif
;
MiniVDDCallExit:
pop edi ;;we're done handling this call
endm
endif ;NEC_98
*/
#endif // _MINIVDD_H_
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?