vcd.inc
来自「用于查询PC机上的USB端口是否有设备挂接上」· INC 代码 · 共 587 行 · 第 1/2 页
INC
587 行
VCD_CB_Struc ENDS
;***********
;
; Global state data
;
VCD_COM_Struc STRUC
VCD_CB_Offset dd ? ; Offset in VM control block for per VM data
VCD_Number db ? ; Either 1 or 2 for COM1 or COM2
VCD_IRQN db ? ; h/w IRQ number for this device
VCD_Flags dw 0 ; Flags for Mouse, Virtualized, etc.
VCD_IRQ_Desc dd ? ; Pointer to IRQ descriptor
VCD_Auto_Assign dd ? ; -1 = never auto assign, 0 = always auto assign
; > 0, auto assign after n msec of no use
VCD_Name db 8 DUP(?); Pointer to name of COM port
VCD_IObase dd ? ; Base of IO regs
VCD_Owner dd 0 ; VM handle owning this COM device
VCD_IRQ_Handle dd ? ; Handle used to talk to VPIC
VCD_Last_Use dd ?
VCD_COMDEB dd ? ; linear ptr to Windows COMDEB, if VCD_Windows_Port
VCD_QIn dd ? ; linear ptr to input queue, if VCD_Windows_Port
VCD_QOut dd ? ; linear ptr to output queue, if VCD_Windows_Port
; NOTE: The bytes BAUD_LSB - Def_MCR MUST BE LEFT IN THIS ORDER. They are
; copied into each VMs control block.
ifdef NEC_98
VCD_Def_BAUD_LSB db 16 ; Default BAUD rate LSB for PC-98
VCD_Def_BAUD_MSB db 0 ; Default BAUD rate MSB for PC-98
else ;NEC_98
VCD_Def_BAUD_LSB db ? ; Default virtual BAUD rate LSB
VCD_Def_BAUD_MSB db ? ; Default virtual BAUD rate MSB
endif ;NEC_98
VCD_Def_IER db ? ; Default vitrual Interrupt Enable register
VCD_Def_LCR db ? ; Default virtual Line Control Register
VCD_Def_MCR db ? ; Default virtual Modem Control Register
VCD_Def_LSR db ? ; Default virtual Line Status Register
VCD_Def_MSR db ? ; Default virtual Modem Status Register
VCD_Virt_IIR db ? ; IIR value read in ring 0
VCD_virt_procs dd ?
VCD_Hw_Int_Proc dd ?
VCD_Virt_Int_Proc dd ?
VCD_EOI_Proc dd ?
VCD_Mask_Change_Proc dd ?
VCD_IRET_Proc dd ?
VCD_Notify dd ?
VCD_RefData dd ?
VCD_Alt_Notify dd ?
VCD_Alt_RefData dd ?
VCD_DevNode dd ?
dd 3 DUP(?); reserved
ifdef NEC_98
; CH.1 CH.2 CH.3
VCD_IO_Write_Data db ? ; 30H B1H B9H -+
VCD_IO_Read_Data db ? ; 30H B1H B9H |
VCD_IO_Set_Mode db ? ; 32H B3H BBH |Install_IO_Handler
VCD_IO_Set_Command db ? ; 32H B3H BBH |
VCD_IO_Read_Status db ? ; 32H B3H BBH |
VCD_IO_Read_Signal db ? ; 33H B0H B2H |
VCD_IO_BAUD db ? ; 75H -- -- -+
VCD_IO_Timer db ? ; 77H -- -- -+Install_Multi_IO_Handler (CH.1 only)
VCD_IO_Set_Mask db ? ; 35H B0H B2H |Install_IO_Handler (CH.2,3)
VCD_IO_Read_Mask db ? ; 35H -- -- -+
VCD_CCUType db 0 ; CCU chip type
db ? ; reserved
VCD_Def_Set_Mask db 0 ; for PC-98
VCD_Def_Set_Mode db 4Eh ; for PC-98 ; <= (9600,B8,PN,S1,X16)
VCD_Def_Set_Command db 27h ; for PC-98 ; <= (00100111b)
VCD_Def_Write_Data db 0 ; for PC-98
VCD_Def_Read_Data db 0 ; for PC-98
VCD_Def_Read_Status db ? ; for PC-98
VCD_Def_Read_Signal db ? ; for PC-98
db ? ; reserved
VCD_Delay_Time DW ? ; NEW function (Add Receive delay)
VCD_Vir_BAUD_LSB db ? ; Default virtual BAUD rate LSB
VCD_Vir_BAUD_MSB db ? ; Default virtual BAUD rate MSB
VCD_Vir_Set_Mask db ? ; for PC-98
VCD_Vir_Set_Mode db ? ; for PC-98
VCD_Vir_Set_Command db ? ; for PC-98
VCD_Vir_Write_Data db ? ; for PC-98
VCD_Vir_Read_Data db ? ; for PC-98
VCD_Vir_Read_Status db ? ; for PC-98
VCD_Vir_Read_Signal db ? ; for PC-98
VCD_Virr db 0 ; Virtual Interrupt Request register
dd 2 DUP(?); reserved
endif ; NEC_98
VCD_COM_Struc ENDS
VCD_COMDEB_Flag equ dword ptr VCD_QIn
VCD_Control_Set_Owner equ 0
COM_IRQ_Sharable equ 00000001h
;***********
;
; List of virtualization procs
;
VCD_ProcList_Struc STRUC
; Control proc for handling status change notifications
; proc will be entered with:
; EAX = message #
; EBX = VM Handle
; ESI -> VCD_COM_Struc
VPS_Control_Proc dd ?
; Procs for virtualizing the IRQ, 0 = none - use default
; procs will be entered with:
; EAX = IRQ handle
; EBX = VM handle
; ESI -> VCD_COM_Struc
;
VPS_Hw_Int_Proc dd 0 ; hardware int for IRQ
VPS_Virt_Int_Proc dd 0 ; virtual int for IRQ
VPS_EOI_Proc dd 0 ; EOI for IRQ
VPS_Mask_Change_Proc dd 0 ; mask change for IRQ
VPS_IRET_Proc dd 0 ; virtual iret for IRQ
; Procs for virtualizing I/O while port owned
; procs will be entered with:
; EBX = VM handle
; ESI -> VCD_COM_Struc
; EDX = port #
; ECX = 0 - Input, 4 - Output
; AL = data, if output
; procs should return AL = data, if input
VPS_In_RxTxB dd ? ; in from receive buffer
VPS_Out_RxTxB dd ? ; out to transmit buffer
VPS_In_IER dd ? ; in from Interrupt Enable Register
VPS_Out_IER dd ? ; out to Interrupt Enable Register
VPS_In_IIR dd ? ; in from Interrupt Identification Register
VPS_Out_IIR dd ? ; out to Interrupt Identification Register
VPS_In_LCR dd ? ; in from Line Control Register
VPS_Out_LCR dd ? ; out to Line Control Register
VPS_In_MCR dd ? ; in from Modem Control Register
VPS_Out_MCR dd ? ; out to Modem Control Register
VPS_In_LSR dd ? ; in from Line Status Register
VPS_Out_LSR dd ? ; out to Line Status Register
VPS_In_MSR dd ? ; in from Modem Status Register
VPS_Out_MSR dd ? ; out to Modem Status Register
VCD_ProcList_Struc ENDS
ifdef NEC_98
VCD_PL_Struc8251 STRUC
; Control proc for handling status change notifications
; proc will be entered with:
; EAX = message #
; EBX = VM Handle
; ESI -> VCD_COM_Struc
VPS_Control_Proc_8251 dd ?
; Procs for virtualizing the IRQ, 0 = none - use default
; procs will be entered with:
; EAX = IRQ handle
; EBX = VM handle
; ESI -> VCD_COM_Struc
;
VPS_Hw_Int_Proc_8251 dd 0 ; hardware int for IRQ
VPS_Virt_Int_Proc_8251 dd 0 ; virtual int for IRQ
VPS_EOI_Proc_8251 dd 0 ; EOI for IRQ
VPS_Mask_Change_Proc_8251 dd 0 ; mask change for IRQ
VPS_IRET_Proc_8251 dd 0 ; virtual iret for IRQ
; Procs for virtualizing I/O while port owned
; procs will be entered with:
; EBX = VM handle
; ESI -> VCD_COM_Struc
; EDX = port #
; ECX = 0 - Input, 4 - Output
; AL = data, if output
; procs should return AL = data, if input
VPS_In_RxTxB_8251 dd ? ; in from receive buffer 0:IN 30h,B1h,B9h
VPS_Out_RxTxB_8251 dd ? ; out to transmit buffer OUT 30h,B1h,B9h
VPS_In_STATUS dd ? ; read STATUS 1:INp 32h,B3h,BBh
VPS_Out_MODE dd ? ; out to MODE/COMMAND OUT 32h,B3h,BBh
VPS_Read_Signal1 dd ? ; in from Line Status Register 2,3ch 2:IN -- ,B0h,B2h
VPS_Set_MASK dd ? ; out to Interrupt Enable Register OUT -- ,B0h,B2h
VPS_Read_Signal dd ? ; in from Line Status Register 1ch 3:IN 33h -- ,--
dd ? ; not WRITE Signal OUT -- ,-- ,--
dd ? ; not READ Counter 4:IN -- ,-- ,--
VPS_Set_Counter dd ? ; out to COM counter OUT 75h -- ,--
dd ? ; not READ Sysport 5:IN -- ,-- ,--
VPS_Set_Sysport dd ? ; out to Interrupt Enable Register OUT 37h -- ,--
VPS_Read_MASK1 dd ? ; in from Interrupt Enable Register 6:IN 35h -- ,--
VPS_Set_MASK1 dd ? ; out to Interrupt Enable Register OUT 35h -- ,--
dd ? ; not READ Counter MODE 7:IN -- ,-- ,--
VPS_Set_Cnt_MODE dd ? ; out to COM counter MODE OUT 77h -- ,--
VCD_PL_Struc8251 ENDS
.errnz VPS_Virt_Int_Proc_8251 - VPS_Hw_Int_Proc_8251 - 4
.errnz VPS_EOI_Proc_8251 - VPS_Virt_Int_Proc_8251 - 4
.errnz VPS_Mask_Change_Proc_8251 - VPS_EOI_Proc_8251 - 4
.errnz VPS_IRET_Proc_8251 - VPS_Mask_Change_Proc_8251 - 4
.errnz VPS_Control_Proc_8251 - VPS_Control_Proc
.errnz VPS_Hw_Int_Proc_8251 - VPS_Hw_Int_Proc
.errnz VPS_Virt_Int_Proc_8251 - VPS_Virt_Int_Proc
.errnz VPS_EOI_Proc_8251 - VPS_EOI_Proc
.errnz VPS_Mask_Change_Proc_8251 - VPS_Mask_Change_Proc
.errnz VPS_IRET_Proc_8251 - VPS_IRET_Proc
.errnz VPS_In_RxTxB_8251 - VPS_In_RxTxB
.errnz VPS_Out_RxTxB_8251 - VPS_Out_RxTxB
endif ;NEC_98
.errnz VCD_Virt_Int_Proc - VCD_Hw_Int_Proc - 4
.errnz VCD_EOI_Proc - VCD_Virt_Int_Proc - 4
.errnz VCD_Mask_Change_Proc - VCD_EOI_Proc - 4
.errnz VCD_IRET_Proc - VCD_Mask_Change_Proc - 4
.errnz VPS_Virt_Int_Proc - VPS_Hw_Int_Proc - 4
.errnz VPS_EOI_Proc - VPS_Virt_Int_Proc - 4
.errnz VPS_Mask_Change_Proc - VPS_EOI_Proc - 4
.errnz VPS_IRET_Proc - VPS_Mask_Change_Proc - 4
ifdef NEC_98
;***********
; Start(8251)
;
CCU_8251_Start macro Jump_Label,COMStruc_Ptr_Reg, Only
.ERRB <Jump_Label>
.ERRB <COMStruc_Ptr_Reg>
cmp byte ptr [COMStruc_Ptr_Reg.VCD_CCUType], CCU_RESERVE
jae Jump_Label&_End
cmp byte ptr [COMStruc_Ptr_Reg.VCD_CCUType], CCU_16550
IFB <Only>
je Jump_Label&_Center
ELSE
je Jump_Label&_End
ENDIF
endm
;***********
; Center(16550)
;
CCU_16550_Center macro Jump_Label, COMStruc_Ptr_Reg, Only
.ERRB <Jump_Label>
IFB <Only>
jmp Jump_Label&_End
Jump_Label&_Center:
ELSE
.ERRB <COMStruc_Ptr_Reg>
cmp byte ptr [COMStruc_Ptr_Reg.VCD_CCUType], CCU_RESERVE
jae Jump_Label&_End
cmp byte ptr [COMStruc_Ptr_Reg.VCD_CCUType], CCU_16550
jne Jump_Label&_End
ENDIF
endm
;***********
; End(Reserve)
;
Reserved_End macro Jump_Label
.ERRB <Jump_Label>
Jump_Label&_End:
endm
;***********
; Sample code
;
;***********
;CCU_8251_Start 16550_8251, esi,
; 8251 source code
;CCU_16550_Center 16550_8251,
; 16550 source code
;Reserved_End 16550_8251
;***********
;CCU_8251_Start 16550_8251, esi, Only
; 8251 source code
;Reserved_End 16550_8251
;***********
;CCU_16550_Center 16550_8251, esi, Only
; 16550 source code
;Reserved_End 16550_8251
endif ;NEC_98
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?