;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Serial Port Driver ;; ;; ;; ;; (c)Copyright Sealevel Systems Incorporated, 1993 - 1995 ;; ;; ;; ;; Please refer to the READ.ME file for Technical Support ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TITLE SCOM ifdef LMOD .MODEL LARGE MOD_NAME TEXTEQU elseifdef MMOD .MODEL MEDIUM MOD_NAME TEXTEQU elseifdef TMOD .MODEL TINY MOD_NAME TEXTEQU else .MODEL SMALL MOD_NAME TEXTEQU endif INCLUDE SCOM.INC % ECHO Assembled on @Date at @Time using MOD_NAME model for LANGT language. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Debug Macro ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DebugBreak MACRO int 3h ENDM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .CODE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; InitPortCOM ;; Passes: DX = Port Number ;; AL = Init Byte (See Manual for Details) ;; Return: AH = Port Status ;; AL = Modem Status ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InitPortCOM PROC LANGT PUBLIC USES DX, wPORT:SCWORD, bINITBYTE:SCBYTE mov dx, wPORT ; Select the Port ifdef LBASIC mov ax, bINITBYTE ; Initialization Byte See Manual else mov al, bINITBYTE ; Initialization Byte See Manual endif mov ah, INIT_COM ; Select function 0 Init Port int COM_INT ; Invoke COM Driver ret ; return to caller InitPortCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PutCharCOM ;; Passes: DX = Port Number ;; AL = Character to be placed in transmit buffer ;; Return: AH = Bit D7 Set if Unsuccessful ;; AL = Character Unchanged ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PutCharCOM PROC LANGT PUBLIC USES DX, wPORT:SCWORD, bCHAR:SCBYTE mov dx, wPORT ; Select the Port ifdef LBASIC mov ax, bCHAR ; Character to write to buffer else mov al, bCHAR ; Character to write to buffer endif mov ah, PUT_CHAR_COM ; Select function 1 Writ Single Char int COM_INT ; Invoke COM Driver ret ; return to caller PutCharCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GetCharCOM ;; Passes: DX = Port Number ;; Return: AH = Line Status (See Manual) ;; AL = Character Received ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetCharCOM PROC LANGT PUBLIC USES DX, wPORT:SCWORD mov dx, wPORT ; Select the Port mov ah, GET_CHAR_COM ; Select function 2 Read Single Char int COM_INT ; Invoke COM Driver ret ; return to caller GetCharCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ReqPortStatCOM ;; Passes: DX = Port Number ;; Return: AH = Port Stauts ;; AL = Modem Status ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ReqPortStatCOM PROC LANGT PUBLIC USES DX, wPORT:SCWORD mov dx, wPORT ; Select the Port mov ah, REQ_STAT_COM ; Select function 3 Request Status int COM_INT ; Invoke COM Driver ret ; return to caller ReqPortStatCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; InitPortExCOM ;; Passes: DX = Port Number ;; BL = bSTOP Bits BH = bPARITY ;; CL = bBAUD Rate CH = bLENGTH ;; Return: AH = Port Status ;; AL = Modem Status ;; Notes: Break is not supported in this function. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InitPortExCOM PROC LANGT PUBLIC USES BX CX DX, wPORT:SCWORD, bBAUD:SCBYTE, bPARITY:SCBYTE, bLENGTH:SCBYTE, bSTOP:SCBYTE mov dx, wPORT ; Select the Port ifdef LBASIC mov bx, bSTOP mov ax, bPARITY mov bh, al mov ax, bLENGTH mov cx, bBAUD mov ch, al else mov bl, bSTOP ; Load COM Parameters mov bh, bPARITY mov cl, bBAUD mov ch, bLENGTH endif mov ah, INIT_EX_COM ; Select function 4 Init Extended mov al, 0 ; No break int COM_INT ; Invoke COM Driver ret ; return to caller InitPortExCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ReqPortStatExCOM ;; Passes: DX = Port Number ;; AH = ;; AL = 00h Read MCR, 01h Write MCR ;; BL = used if AL = 01h - New MCR Value ;; Return: IF Subfunction 00h then BL = MCR ;; IF Subfunction 01h then AH = Port Status ;; AL = Modem Status ;; Notes: ????? ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ReqPortStatExCOM PROC LANGT PUBLIC USES BX CX DX, wPORT:SCWORD, wVALUE:SCWORD mov dx, wPORT ; Select the Port mov ax, wVALUE mov bl, al mov al, ah mov ah, REQ_STAT_EX_COM ; Select function 5 Req Status Ex int COM_INT ; Invoke COM Driver mov cx, wVALUE cmp ch, 0 jnz @f ; Jump if write mov ax, bx ; move BL to AL for C return xor ah, ah @@: ret ; Return to caller ReqPortStatExCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GetBufferCountCOM ;; Passes: DX = Port Number ;; AL = Subfunction 00 Get Tx ;; 01 Get Rx ;; 02 Get Tx Free ;; 03 Get Rx Free ;; Return: AX = Selected Buffer Count (WORD) ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetBufferCountCOM PROC LANGT PUBLIC USES DX, wPORT:SCWORD, bVALUE:SCBYTE mov dx, wPORT ; Select the Port ifdef LBASIC mov ax, bVALUE ; Selected Subfunction else mov al, bVALUE ; Selected Subfunction endif mov ah, GET_BUF_CNT_COM ; Select function 6 Get Buffer Count int COM_INT ; Invoke COM Driver ret ; return to caller GetBufferCountCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; FlushBufferCOM ;; Passes: DX = Port Number ;; AL = 01 Flush Tx ;; AL = 02 Flush Rx ;; AL = 03 Flush Both Tx and Rx ;; Return: Nothing (void) ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FlushBufferCOM PROC LANGT PUBLIC USES DX, wPORT:SCWORD, bVALUE:SCBYTE mov dx, wPORT ; Select the Port ifdef LBASIC mov ax, bVALUE ; Selected Subfunction else mov al, bVALUE ; Selected Subfunction endif mov ah, FLUSH_BUF_COM ; Select function 7 Flush Buffer int COM_INT ; Invoke COM Driver ret ; return to caller FlushBufferCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; PutBlockCOM ;; Passes: DX = Port Number ;; CX = Number of Bytes ;; ES:BX = Segmented Address of Block ;; Return: AX = IF Partial transfer 1 ELSE 0 ;; CX = Number of BYTES TRANSFERED ;; Notes: Actual C return is DX:AX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PutBlockCOM PROC LANGT PUBLIC USES BX CX, wPORT:SCWORD, fpBUFFER:DWORD, wLEN:SCWORD mov dx, wPORT ; Select the Port mov cx, wLEN ; Get Length of Block les bx, fpBUFFER ; Load far pointer to buffer mov ah, PUT_BLOCK_COM ; Select function 8 Write Block int COM_INT ; Invoke COM Driver mov dx, cx ; Adjust for DWORD return DX:AX ret ; return to caller PutBlockCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GetBlockCOM ;; Passes: DX = Port Number ;; CX = Number of bytes to receive ;; ES:BX = Segmented address of Destination buffer ;; Return: AX = Remaining number of bytes to Receive ;; CX = Total Number of Bytes Received ;; Notes: Actual C return is DX:AX string is null terminated ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetBlockCOM PROC LANGT PUBLIC USES BX CX, wPORT:SCWORD, fpBUFFER:DWORD, wLEN:SCWORD mov dx, wPORT ; Select the Port mov cx, wLEN ; Get Length of Block les bx, fpBUFFER ; load far pointer to buffer mov ah, GET_BLOCK_COM ; Select function 9 Read Block int COM_INT ; Invoke COM Driver push es push bx les bx, fpBUFFER add bx,wLEN inc bx mov byte ptr es:[bx],0 ; null terminate string pop bx pop es mov dx, cx ; Adjust for DWORD return DX:AX ret ; return to caller GetBlockCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; HandShakeConfigCOM ;; Passes: DX = Port Number ;; AL = 00 Set HS Init Byte (See Manual) ;; 01 Get HS Init Byte ;; BL = HS Init Byte if AL = 00 ;; Return: Get HS Init then BL = HS Init Byte ;; Ret Nothing if Set HS Init ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HandShakeConfigCOM PROC LANGT PUBLIC USES DX, wPORT:SCWORD, wVALUE:SCWORD mov dx, wPORT ; Select the Port mov ax, wVALUE ; xchg ah, al mov bl, ah ; Get or Set Parameter mov ah, HAND_SHAKE_COM ; Select function A Hand Shake Options int COM_INT ; Invoke COM Driver xor ah, ah ; mov al, bl ret ; return to caller HandShakeConfigCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; BaudRateConfigCOM ;; Passes: DX = Port Number ;; CX = Baud Divisor (Zero to read Current Value) ;; Return: CX = Current Baud Rate Divisor ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BaudRateConfigCOM PROC LANGT PUBLIC USES DX, wPORT:SCWORD, wBAUD:SCWORD mov dx, wPORT ; Select the Port mov ah, BAUD_RATE_COM ; Select function B Baud Rate Config mov cx, wBAUD int COM_INT ; Invoke COM Driver mov ax, cx ; ret ; return to caller BaudRateConfigCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; WritePortRegCOM ;; Passes: DX = Port Number ;; AL = Value ;; BL = Register ;; Return: Nothing ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WritePortRegCOM PROC LANGT PUBLIC USES AX BX DX, wPORT:SCWORD, bREG:SCBYTE, bVALUE:SCBYTE mov dx, wPORT ; Select the Port ifdef LBASIC mov bx, bREG ; Register to Write mov ax, bVALUE ; Value to Write else mov bl, bREG ; Register to Write mov al, bVALUE ; Value to Write endif mov ah, WRITE_REG_COM ; Select function C Write Port Register int COM_INT ; Invoke COM Driver ret ; return to caller WritePortRegCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ReadPortRegCOM ;; Passes: DX = Port Number ;; BL = Register ;; Return: AL = Value Read ;; Notes: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ReadPortRegCOM PROC LANGT PUBLIC USES BX DX, wPORT:SCWORD, bREG:SCBYTE mov dx, wPORT ; Select the Port mov ah, READ_REG_COM ; Select function D Read Port Register ifdef LBASIC mov bx, bREG ; Register to Read else mov bl, bREG ; Register to Read endif int COM_INT ; Invoke COM Driver ret ; return to caller ReadPortRegCOM ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; GetDrvInfoCOM ;; Passes: Pointer to struct ;; Return: AH = Mux 2Fh ID ;; AL = # of ports serviced ;; BX = Resident Code Size ;; ES = Segment of Code ;; Notes: Actual C ret = void ;; Not Supported in BASIC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ifdef LBASIC nop else GetDrvInfoCOM PROC LANGT PUBLIC USES AX BX ES, fpSTRUCT:DWORD mov ah, DRV_INFO_COM ; Select function E Get Driver Info int COM_INT ; Invoke COM Driver push es push bx les bx,fpSTRUCT ;Get struct address mov (SYS_INFO_COM ptr es:[bx]).Mux2F_ID, ah mov (SYS_INFO_COM ptr es:[bx]).MaxPorts, al pop ax mov (SYS_INFO_COM ptr es:[bx]).DriverSeg, ax pop ax mov (SYS_INFO_COM ptr es:[bx]).CodeSize, ax ret ; return to caller GetDrvInfoCOM ENDP endif ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; END