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 + -
显示快捷键?