这个是int 14h的入口函数,用来dispatch任务
;============================================================================
;
; DECLARE SERIAL COMMAND TABLE
;
PUBLIC coreSerialCmdTable
coreSerialCmdTable LABEL WORD
DW coreSerialInit
DW coreSerialSend
DW coreSerialReceive
DW coreSerialStatus
DW coreExtendedSerialInit
DW coreExtendedPortControl
coreBiosSerialInterface PROC FAR
sti
PUSH_REG_STACK ; Save regs, set BP
cmp ah, 05 ; Command out of range?
ja serialExit ; Yes - Don't do anything
cmp dx, 3 ; Requesting > COM4?
ja serialExit ; Yes - Don't do anything
mov ds, SegAddressBDA ; Access BIOS data area
mov bx, dx ; Get COM channel number
mov cl, bdaRS232TimeOut[bx] ; Get timeout value
shl bx, 1 ; Double for Base address
mov dx, bdaRS232Table[bx] ; Read base address for COM
or dx, dx ; Test for COM not available
jz serialExit ; Yes-Dont do anything
movzx bx, ah ; Save command number in BX
mov ah, cl ; Keep timeut in AH
shl bx, 1 ; Double for table offset
add dx, 04 ; Advance DX to MCR
call cs:coreSerialCmdTable[bx] ; Go perform command
serialExit:
mov BYTE PTR [bp].regStack.axReg + 1, ah ; Save line status in AH
POP_REG_STACK ; Restore callers registers
iret
coreBiosSerialInterface ENDP
;============================================================================
;
; DECLARE SERIAL COMMAND TABLE
;
PUBLIC coreSerialCmdTable
coreSerialCmdTable LABEL WORD
DW coreSerialInit
DW coreSerialSend
DW coreSerialReceive
DW coreSerialStatus
DW coreExtendedSerialInit
DW coreExtendedPortControl
coreBiosSerialInterface PROC FAR
sti
PUSH_REG_STACK ; Save regs, set BP
cmp ah, 05 ; Command out of range?
ja serialExit ; Yes - Don't do anything
cmp dx, 3 ; Requesting > COM4?
ja serialExit ; Yes - Don't do anything
mov ds, SegAddressBDA ; Access BIOS data area
mov bx, dx ; Get COM channel number
mov cl, bdaRS232TimeOut[bx] ; Get timeout value
shl bx, 1 ; Double for Base address
mov dx, bdaRS232Table[bx] ; Read base address for COM
or dx, dx ; Test for COM not available
jz serialExit ; Yes-Dont do anything
movzx bx, ah ; Save command number in BX
mov ah, cl ; Keep timeut in AH
shl bx, 1 ; Double for table offset
add dx, 04 ; Advance DX to MCR
call cs:coreSerialCmdTable[bx] ; Go perform command
serialExit:
mov BYTE PTR [bp].regStack.axReg + 1, ah ; Save line status in AH
POP_REG_STACK ; Restore callers registers
iret
coreBiosSerialInterface ENDP
