; B3ZB-3.INS    - Bye3 / Zorba routines for BYE         - 08/06/85
;
;       This version is for a 8251a i/o with ctc timer to set speed
;
;       These routines will allow the easy patching of bye3 for any
; type of modem/serial port combination.  certain routines must return
; status flags, so please be careful to set the flags as directed.
;
; This version is for the intel 8251 chip that is hooked up to an
; external modem.
;
;=======================================================================
;
; 08/06/85  Upgraded for bye337                         - pst
; 07/09/85  Modified to work with bye335                - f.e. clayton
; 10/04/82  Routines added, no fuss, mess, or frills.   - pst
;
;=======================================================================
;
; The following define the port address to use.
;
BASEP   EQU     20H             ; Modem base port
DPORT   EQU     BASEP           ; Data port
SPORT   EQU     BASEP+1         ; Status/Control port
CTCCMD  EQU     003H            ; Timer control/status port
CTC0    EQU     000H            ; Timer 0 (port A)
LSB1200 EQU     0D0H
MSB1200 EQU     000H
;
; the following are sport commands (output these to sport)
;
MODINS  EQU     01001110B       ; 8 bits, no parity, 1 stop bit, 16x
OFFINS  EQU     00010000B       ; Drop DTR and disable RCV/XMT
ONINS   EQU     00010111B       ; Reset flags, send DTR, enable rx & tx
RSTINS  EQU     01000010B       ; Reset USART and send DTR
;
; the following are sport status masks
;
TBMT    EQU     00000001B       ; Transmitt buffer empty
DAV     EQU     00000010B       ; Data available
DCD     EQU     10000000B       ; Data carrier detect
FE      EQU     00100000B       ; Framing error
OE      EQU     00010000B       ; Overrun error
PE      EQU     00001000B       ; Parity error
ERR     EQU     00111000B       ; Overrun and framing error
;
BD300   EQU     0683H           ; 300 baud
BD1200  EQU     01A1H           ; 1200 baud
BD2400  EQU     00D0H           ; 2400 baud
;
;----------------------------------------------------------------
;
; Initialize modem
;
MDINIT: MVI     A,OFFINS        ; Clear DTR
       OUT     SPORT           ; Causing hangup
;
       PUSH    B               ; Preserve in case we need it
       MVI     B,20
OFFTI:  CALL    DELAY           ; 0.1 second delay
       DCR     B
       JNZ     OFFTI           ; Keep looping until finnished
       POP     B               ; Restore BC
;
       MVI     A,ONINS         ; DTR so that modem can answer phone
       OUT     SPORT
       CALL    SET1200
;
        IF     IMODEM
       CALL    IMINIT          ; Init modem
        ENDIF
;
       RET
;
; The following routine sets dtr low to turn off the modem when done.
;
MDQUIT:
        IF     IMODEM
       CALL    IMQUIT
       RET
        ENDIF
;
MDSTOP: MVI     A,10H
       OUT     SPORT           ; Turn off DTR to hang up the phone
       RET
;
; The following is a routine to determine if there is a character wait-
; ing to be received,  if none, the zero flag will be set, otherwise it
; returns with 255 in register A.  Remember that the system will like you
; a little more if you also mask out framing, parity, and overrun errors.
;
MDINST: IN      SPORT           ; Get status
       ANI     DAV             ; Got a character?
       RZ                      ; Return if none
       IN      SPORT           ; Get status again
       ANI     ERR             ; Check for framing and overrun
       JZ      MDINST1         ; No errors
       MVI     A,ONINS         ; Reset error flags
       OUT     SPORT
       XRA     A               ; Return false
       RET
;
MDINST1:ORI     255             ; We have a character
       RET
;
; The following is a routine to determine if the transmit buffer is
; empty.  If it is, it will return with the zero flag clear.  If the
; transmitter is busy, then it will return with the zero flag set.
;
MDOUTST:IN      SPORT
       ANI     TBMT
       RZ
       ORI     255
       RET
;
; The following is a routine that will check to make sure we still have
; carrier.  If there is no carrier, it will return with the zero flag
; set.
;
MDCARCK:IN      SPORT           ; Get status
       ANI     DCD             ; Check if carrier is on
       RZ
       ORI     255
       RET
;
; The following is a routine that will input one character from the
; modem port.  If there is nothing there, it will return garbage...
; So use the mdinst routine first.
;
MDINP:  IN      DPORT           ; Get character
       RET
;
; The following is a routine that will output one character in register
; a to the modem.  Remember, that is register A, not register C.
;
; ** use MDOUTST first to see if buffer is empty **
;
MDOUTP: OUT     DPORT           ; Send it
       RET
;
; These next routines set the proper baud rates for the modem.
;
SET300: LXI     H,BD300         ; Set 300 baud
       JMP     LOADBD
;
SET1200:LXI     H,BD1200        ; Set 1200 baud
       JMP     LOADBD
;
SET2400:LXI     H,BD2400        ; Set 2400 baud
       JMP     LOADBD
;
LOADBD: MVI     A,36H           ; Set command mode
       OUT     CTCCMD
       NOP     ! NOP ! NOP
       MOV     A,L             ; Send LSB of baud
       OUT     CTC0
       NOP     ! NOP ! NOP
       MOV     A,H             ; Send MSB of baud
       OUT     CTC1
       NOP     ! NOP ! NOP
       XRA     A               ; Return saying we're ok
       RET
;
;***********************************************************************