                                                                      COMMENT ~
 STDIO.ASM -- I/O PROCEDURES

   From `BLUEBOOK of ASSEMBLY ROUTINES for the IBM PC & XT'
         by Christopher L. Morgan
         Copyright (C) 1984 by The Waite Group, Inc.

   Function: These routines perform fundamental input/output functions for the
     keyboard, screen, and communication lines.  The standard I/O routines
     can be redirected.  The communications routines alleviate some of the
     problems encountered in DOS and BIOS serial communications handling.

   See STDIO.DOC for complete information on the routines.
 _____________________________________________________________________________

   Contains:
   ---------
   COM_INCK     --  Communications line check
   COM_INIT     --  Initialize communications line
   COM_OFF      --  Communications line off
   COM_ON       --  Communications line on
   COM_OUT      --  Communications line output
   STD_CRLF     --  Standard output with carriage return & linefeed
   STD_IN       --  Standard input with echo
   STD_INCK     --  Standard input check
   STD_INNE     --  Standard input with no echo
   STD_MSGOUT   --  Standard output of a message
   STD_OUT      --  Standard output
   STD_OUTDR    --  Direct standard output
   STD_SPACE    --  Standard output of a space
 _____________________________________________________________________________
                                                                              ~
CODES   SEGMENT
        PUBLIC  STD_IN,STD_INNE,STD_INCK,STD_OUT,STD_OUTDR,STD_CRLF,STD_SPACE
        PUBLIC  STD_MSGOUT,COM_INIT,COM_INCK,COM_OUT,COM_ON,COM_OFF
ASSUME CS:CODES
;____________________________ I/O ROUTINES ___________________________________
;Routine for standard input with echo
;
STD_IN  PROC    FAR
        MOV     AH,1                            ;Standard input
        INT     21H                             ; DOS call
        RET                                     ;Return
STD_IN  ENDP
;------------------------------------------------------------------------------
;Routine for standard input with NO echo
;
STD_INNE        PROC    FAR
        MOV     AH,8                            ;Standard input without echo
        INT     21H                             ; DOS call
        RET                                     ;Return
STD_INNE ENDP
;------------------------------------------------------------------------------
;Routine for standard input check
STD_INCK        PROC    FAR
        PUSH    DX                              ;Save register
        MOV     DL,0FFH                         ;Direct console input
        MOV     AH,06H                          ;Check std direct input status
        INT     21H                             ; DOS call
        POP     DX                              ;Restore register
        RET                                     ;Return
STD_INCK        ENDP
;------------------------------------------------------------------------------
;Routine for standard output
;
STD_OUT PROC    FAR
        PUSH    DX                              ;Save register
        MOV     DL,AL                           ;In DL for DOS call
        MOV     AH,2                            ;Standard output
        INT     21H                             ; DOS call
        POP     DX                              ;Restore register
        RET                                     ;Return
STD_OUT ENDP
;------------------------------------------------------------------------------
;Routine for direct standard output
;
STD_OUTDR       PROC    FAR
        PUSH    DX                              ;Save register
        CMP     AL,0FFH                         ;Check for the 1 case of input
        JE      STD_OUTDRXIT                    ;If so, go
        MOV     DL,AL                           ;Else in DL for DOS call
        MOV     AH,6                            ;Direct console output
        INT     21H                             ; DOS call
STD_OUTDRXIT:
        POP     DX                              ;Restore register
        RET                                     ;Return
STD_OUTDR       ENDP
;------------------------------------------------------------------------------
;Routine to send a CRLF sequence to standard output
;
STD_CRLF        PROC    FAR
        PUSH    AX                              ;Save register
        MOV     AL,13                           ;ASCII carriage return
        CALL    STD_OUT                         ;Send it out
        MOV     AL,10                           ;ASCII line feed
        CALL    STD_OUT                         ;Send it out
        POP     AX                              ;Restore register
        RET                                     ;Return
STD_CRLF        ENDP
;------------------------------------------------------------------------------
;Routine to send a space to standard output
;
STD_SPACE       PROC    FAR
        PUSH    AX                              ;Save register
        MOV     AL,32                           ;ASCII space
        CALL    STD_OUT                         ;Send it out
        POP     AX                              ;Restore register
        RET
STD_SPACE       ENDP
;------------------------------------------------------------------------------
;Routine to send message to standard output
;
STD_MSGOUT      PROC    FAR
        PUSH    SI                              ;Save registers
        PUSH    AX
STD_MSGOUT1:
        MOV     AL,[SI]                         ;Get byte
        INC     SI                              ;Point to next byte
        CMP     AL,0                            ;Done?
        JE      STD_MSGOUTXIT                   ;If so, go
        CALL    STD_OUT                         ;Else send it out
        JMP     STD_MSGOUT1                     ;Loop for more
STD_MSGOUTXIT:
        POP     AX                              ;Restore registers
        POP     SI
        RET                                     ;Return
STD_MSGOUT      ENDP
;------------------------------------------------------------------------------
;Routine to initialize a communications line
;
COM_INIT        PROC    FAR
        MOV     AH,0                            ;Initialize
        INT     14H                             ;RS232 BIOS call
        RET                                     ;Return
COM_INIT        ENDP
;------------------------------------------------------------------------------
;Routine to check for input from a communications line
;
COM_INCK        PROC    FAR
        PUSH    DS                              ;Save registers
        PUSH    DX
        PUSH    SI
        MOV     SI,DX                           ;Look up address of com line
        ADD     SI,SI                           ;Double to index into table
        MOV     DX,40H                          ;Segment of system I/O table
        MOV     DS,DX                           ;Set data seg to this table
        MOV     DX,[SI]                         ;Now get it
        ADD     DX,5                            ;Line status
        IN      AL,DX                           ;Get it
        TEST    AL,1                            ;Receive buffer full?
        JZ      COM_INCKXIT                     ;If so, go
        MOV     DX,[SI]                         ;Data register
        IN      AL,DX                           ;Get it
COM_INCKXIT:
        POP     SI                              ;Restore registers
        POP     DX
        POP     DS
        RET
COM_INCK        ENDP
;------------------------------------------------------------------------------
;Routine to send output to a communications line
;
COM_OUT PROC    FAR
        MOV     AH,1                            ;Send it out
        INT     14H                             ;RS232 BIOS call
        RET                                     ;Return
COM_OUT ENDP
;------------------------------------------------------------------------------
;Routine to turn on input from a communications line
;
COM_ON  PROC    FAR
        PUSH    DS                              ;Save registers
        PUSH    DX
        PUSH    SI
        MOV     SI,DX                           ;Look up address of com line
        ADD     SI,SI                           ;Double to index into table
        MOV     DX,40H                          ;Segment of system I/O table
        MOV     DS,DX                           ;Set data seg to this table
        MOV     DX,[SI]                         ;Now get it
        ADD     DX,4                            ;Modem control register
        MOV     AL,3                            ;Set DTR & RTS
        OUT     DX,AL                           ;Send out control byte
        POP     SI                              ;Restore registers
        POP     DX
        POP     DS
        RET
COM_ON  ENDP
;------------------------------------------------------------------------------
;Routine to turn off input from a communications line
;
COM_OFF PROC    FAR
        PUSH    DS                              ;Save registers
        PUSH    DX
        PUSH    SI
        MOV     SI,DX                           ;Look up address of com line
        ADD     SI,SI                           ;Double to index into table
        MOV     DX,40H                          ;Segment of system I/O table
        MOV     DS,DX                           ;Set data seg to this table
        MOV     DX,[SI]                         ;Now get it
        ADD     DX,4                            ;Modem control register
        MOV     AL,2                            ;Clear DTR (line 20)
        OUT     DX,AL                           ;Send out control byte
        POP     SI                              ;Restore registers
        POP     DX
        POP     DS
        RET
COM_OFF  ENDP
;-----------------------------------------------------------------------------
CODES   ENDS
;
        END
;_____________________________________________________________________________
;>>>>> Physical EOF STDIO.ASM <<<<
