mirror of https://github.com/AR1972/DOS3.3
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
281 lines
8.5 KiB
281 lines
8.5 KiB
TITLE MSAUX - DOS 3.3
|
|
;----------------------------------------------------------------
|
|
; :
|
|
; A U X - AUXILARY DEVICE DRIVER :
|
|
; :
|
|
; :
|
|
; This file contains the Auxilary Device Driver. The :
|
|
; auxilary driver handles calls to and from the RS-232 port. :
|
|
; Three devices uses this code: AUX, COM1, and COM2. AUX and :
|
|
; COM1 talk to the zero RS-232 card and COM2 talks to the :
|
|
; 'one' RS-232 card. The beginning of the interrupt entry :
|
|
; point for these devices sets the variable AUXNUM in the :
|
|
; msbio.asm module. If the value is 0 the routines in this :
|
|
; file will talk to the the 'zero' card. If the value in :
|
|
; AUXNUM is 1 the routines will talk to the 'one' card. :
|
|
; The procedure GETDX is called to put the value 0 or 1 in :
|
|
; the DX register depending on the value in AUXBUF. :
|
|
; :
|
|
; The routines in this files are: :
|
|
; :
|
|
; routine function :
|
|
; ------- -------- :
|
|
; AUX$READ Read characters from the :
|
|
; specified device. :
|
|
; AUX$RDND Non-desrucrtive read with :
|
|
; no waiting. :
|
|
; AUX$FLSH Flush specified device input :
|
|
; buffer. :
|
|
; AUX$WRIT Write characters to the :
|
|
; specified device. :
|
|
; AUX$WRST Get status of specified :
|
|
; device :
|
|
; :
|
|
; These routines are not called directly. Call are made via :
|
|
; the strategy and interrupt entry point (see Device Header). :
|
|
; :
|
|
; Data structure: :
|
|
; The Aux Device has a two byte buffer called AUXBUF. The :
|
|
; first byte is for the zero card, the second byte is for the :
|
|
; one card. A zero value in the byte indicates the buffer is :
|
|
; empty. The routines use GETBX to get the address of the :
|
|
; buffer. :
|
|
; :
|
|
;----------------------------------------------------------------
|
|
|
|
;;Ver 3.30 modification ---------------------------
|
|
test=0
|
|
INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT
|
|
INCLUDE JUMPMAC.INC
|
|
INCLUDE MSMACRO.INC
|
|
|
|
EXTRN ERR$CNT:NEAR ;MSBIO1
|
|
EXTRN GETDX:NEAR ;MSBIO1
|
|
EXTRN RDEXIT:NEAR ;MSCON
|
|
EXTRN EXIT:NEAR ;MSBIO1
|
|
EXTRN BUS$EXIT:NEAR ;MSBIO1
|
|
;DATA
|
|
EXTRN AUXBUF:BYTE ;MSDATA
|
|
|
|
; VALUES IN AH, REQUESTING FUNCTION OF INT 14H IN ROM BIOS
|
|
AUXFUNC_SEND EQU 1 ;TRANSMIT
|
|
AUXFUNC_RECEIVE EQU 2 ;READ
|
|
AUXFUNC_STATUS EQU 3 ;REQUEST STATUS
|
|
|
|
; ERROR FLAGS, REPORTED BY INT 14H
|
|
|
|
; THESE FLAGS REPORTED IN AH:
|
|
FLAG_DATA_READY EQU 01H ;DATA READY
|
|
FLAG_OVERRUN EQU 02H ;OVERRUN ERROR
|
|
FLAG_PARITY EQU 04H ;PARITY ERROR
|
|
FLAG_FRAME EQU 08H ;FRAMING ERROR
|
|
FLAG_BREAK EQU 10H ;BREAK DETECT
|
|
FLAG_TRANHOL_EMP EQU 20H ;TRANSMIT HOLDING REGISTER EMPTY
|
|
FLAG_TRANSHF_EMP EQU 40H ;TRANSMIT SHIFT REGISTER EMPTY
|
|
FLAG_TIMEOUT EQU 80H ;TIMEOUT
|
|
|
|
; THESE FLAGS REPORTED IN AL:
|
|
FLAG_DELTA_CTS EQU 01H ;DELTA CLEAR TO SEND
|
|
FLAG_DELTA_DSR EQU 02H ;DELTA DATA SET READY
|
|
FLAG_TRAIL_RING EQU 04H ;TRAILING EDGE RING INDICATOR
|
|
FLAG_DELTA_SIG EQU 08H ;DELTA RECEIVE LINE SIGNAL DETECT
|
|
FLAG_CTS EQU 10H ;CLEAR TO SEND
|
|
FLAG_DSR EQU 20H ;DATA SET READY
|
|
FLAG_RING EQU 40H ;RING INDICATOR
|
|
FLAG_REC_SIG EQU 80H ;RECEIVE LINE SIGNAL DETECT
|
|
;;End of modification ------------------
|
|
|
|
|
|
;----------------------------------------------------------------
|
|
; :
|
|
; Read zero or more characters from Auxilary Device :
|
|
; :
|
|
; input:es:[di] points to area to receive aux data :
|
|
; cx has number of bytes to be read :
|
|
; "auxnum" first byte has number of aux device (rel 0):
|
|
; :
|
|
;----------------------------------------------------------------
|
|
PUBLIC AUX$READ
|
|
AUX$READ PROC NEAR
|
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
|
jcxz EXVEC2 ; if no characters, get out
|
|
call GETBX ; put address of AUXBUF in BX
|
|
xor AX,AX ; clear AX register
|
|
xchg AL,[BX] ; Get character , if any, from
|
|
; buffer and clear buffer
|
|
or AL,AL ; if AL is nonzero there was a
|
|
; character in the buffer
|
|
jnz AUX2 ; if so skip AUXIN call
|
|
AUX1: ;
|
|
call AUXIN ; get character from port
|
|
AUX2: ;
|
|
stosb ; store character
|
|
loop AUX1 ; if more character, go around again
|
|
EXVEC2: ;
|
|
Jump EXIT ; all done, successful exit
|
|
AUX$READ ENDP
|
|
|
|
;
|
|
; AUXIN: make a call on ROM BIOS to read character from
|
|
; the auxilary device, then do some error checking.
|
|
; If an error occurs then AUXIN jumps to ERR$CNT and
|
|
; does NOT return to where it was called from.
|
|
;
|
|
|
|
AUXIN PROC NEAR
|
|
|
|
mov ah,AUXFUNC_RECEIVE
|
|
call AUXOP
|
|
;check for Frame, Parity, or Overrun errors
|
|
;WARNING: these error bits are unpredictable
|
|
; if timeout (bit 7) is set
|
|
test ah,FLAG_FRAME or FLAG_PARITY or FLAG_OVERRUN
|
|
jz AROK ;No error if all bits are clear
|
|
|
|
;Error getting character
|
|
add sp,+2 ;Remove rtn address (near call)
|
|
xor al,al
|
|
or al,FLAG_REC_SIG or FLAG_DSR or FLAG_CTS
|
|
|
|
JUMP ERR$CNT
|
|
AROK:
|
|
RET ;CHAR JUST READ IS IN AL, STATUS IS IN AH
|
|
AUXIN ENDP
|
|
|
|
;----------------------------------------------------------------
|
|
; :
|
|
; Aux non-destructive read with no waiting :
|
|
; :
|
|
; input: es:[di] points to area to receive aux data :
|
|
; :
|
|
;----------------------------------------------------------------
|
|
;
|
|
PUBLIC AUX$RDND
|
|
AUX$RDND PROC NEAR
|
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
|
call GETBX ; have BX point to AUXBUF
|
|
mov AL,[BX] ; copy contents of buffer to AL
|
|
or AL,AL ; if AL is non-zero (char in buffer)
|
|
jnz AUXRDX ; then return character
|
|
call AUXSTAT ; if not, get status of AUX device
|
|
TEST AH,FLAG_DATA_READY ;TEST DATA READY
|
|
jz AUXBUS ; then device is busy (not ready)
|
|
|
|
TEST AL,FLAG_DSR ;TEST DATA SET READY
|
|
jz AUXBUS ; then device is busy (not ready)
|
|
call AUXIN ; else aux is ready, get character
|
|
call GETBX ; have bx point to AUXBUF
|
|
mov [BX],AL ; save character in buffer
|
|
AUXRDX: ;
|
|
Jump RDEXIT ; return character
|
|
|
|
AUXBUS: ;
|
|
Jump BUS$EXIT ; jump to device busy exit
|
|
AUX$RDND ENDP
|
|
|
|
;----------------------------------------------------------------
|
|
; :
|
|
; Aux Output Status :
|
|
; :
|
|
;----------------------------------------------------------------
|
|
PUBLIC AUX$WRST
|
|
AUX$WRST PROC NEAR
|
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
|
call AUXSTAT ; get status of AUX in AX
|
|
; now test to see if device is busy
|
|
; if this bit is not set,
|
|
;;Ver 3.30 modification -----------------------
|
|
TEST AL,FLAG_DSR ;TEST DATA SET READY
|
|
jz AUXBUS ; then device is busy (not ready)
|
|
TEST AH,FLAG_TRANHOL_EMP ;TEST TRANSMIT HOLD REG EMPTY
|
|
;;End of modification -------------------------
|
|
jz AUXBUS ; then device is busy (not ready)
|
|
Jump Exit
|
|
|
|
AUX$WRST ENDP
|
|
|
|
;
|
|
; AUXSTAT makes a call on the ROM-BIOS to determine the status
|
|
; of the auxilary device
|
|
; Outputs:
|
|
; AX is filled with status of port.
|
|
; DX is changes to specify which card - either 0, 1 (, 2, 3) ;ba
|
|
; NO other registers are modified
|
|
;
|
|
|
|
AUXSTAT proc near
|
|
mov ah,AUXFUNC_STATUS
|
|
call AUXOP
|
|
ret
|
|
AUXSTAT endp
|
|
|
|
AUXOP PROC NEAR
|
|
;AH=FUNCTION CODE
|
|
;0=INIT, 1=SEND, 2=RECEIVE, 3=STATUS
|
|
call GETDX ; have DX point to proper card
|
|
int 14h ; call rom-bios for status
|
|
ret
|
|
AUXOP ENDP
|
|
|
|
;----------------------------------------------------------------
|
|
; :
|
|
; Flush AUX Input buffer - set contents of AUXBUF to zero :
|
|
; :
|
|
;----------------------------------------------------------------
|
|
PUBLIC AUX$FLSH
|
|
AUX$FLSH PROC NEAR
|
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
|
call GETBX ; get BX to point to AUXBUF
|
|
mov BYTE PTR [BX],0 ; zero out buffer
|
|
Jump Exit ; all done, successful return
|
|
AUX$FLSH ENDP
|
|
|
|
|
|
|
|
;----------------------------------------------------------------
|
|
; :
|
|
; Write to Auxilary Device :
|
|
; :
|
|
;----------------------------------------------------------------
|
|
PUBLIC AUX$WRIT
|
|
AUX$WRIT PROC NEAR
|
|
ASSUME DS:CODE ; SET BY AUX DEVICE DRIVER ENTRY ROUTINE
|
|
jcxz EXVEC2 ; if CX is zero, no characters
|
|
; to be written, jump to exit
|
|
AUX$LOOP:
|
|
mov AL,ES:[DI] ; get character to be written
|
|
inc DI ; move DI pointer to next character
|
|
;;Ver 3.30 modification ---------------------------
|
|
MOV AH,AUXFUNC_SEND ;VALUE=1, INDICATES A WRITE
|
|
CALL AUXOP ;SEND CHARACTER OVER AUX PORT
|
|
|
|
TEST AH,FLAG_TIMEOUT ;CHECK FOR ERROR
|
|
;;End of modification ---------------------------
|
|
jz AWOK ; then no error
|
|
mov AL,10 ; else indicate write fault
|
|
Jump ERR$CNT ; call error routines
|
|
|
|
; if CX is non-zero, still more
|
|
AWOK:
|
|
loop AUX$LOOP ; more characrter to print
|
|
Jump Exit ; all done, successful return
|
|
AUX$WRIT ENDP
|
|
|
|
|
|
;
|
|
; GETBX puts the address of AUXBUF (the Auxilary Device buffer)
|
|
; in BX. After calling GETBX, a routine can get to AUXBUF
|
|
; with [BX].
|
|
;
|
|
; NOTE: The getdx routine is in msbio1 and looks like:
|
|
; mov dx,word ptr cs:[auxnum]
|
|
;
|
|
GETBX PROC NEAR
|
|
call GETDX
|
|
mov BX,DX
|
|
add BX,OFFSET AUXBUF
|
|
ret
|
|
GETBX ENDP
|
|
|
|
CODE ENDS
|
|
END
|