; B3CP-2.INS -  Interfacer 3/4 insert for BYE3 - 07/24/85
;
;          2651 I/O with internal baudrage generator
;
;                For: CompuPro Interfacer 3
;                     CompuPro Interfacer 4
;                     CompuPro System Support 1
;
; Note:  This is an insert, not an overlay.
;
;
; The Interfacer board uses the 2651 I/O.  This has a peculiarity that
; prevents its proper use if you hook pin 8 (DCD) of the modem to pin 8
; (DCD) of the Interfacer board.  You should instead hook pin 8 of the
; modem (DCD) to (DSR) on the Interfacer board.
;
; Note for inteligent modem users:
; -------------------------------
;       In the past  people  using the intelligent  modems and the
;       Interfacer board have complained they had to put SW6 up to
;       use with BYE3 but then had to put it down to use with MEX,
;       MDM7 or other autodial modem programs.  With the configur-
;       ation below, SW6 can be left in whatever position the user
;       prefers (up, for BYE3) and this will have no effect on the
;       normal use of MEX or MDM7.
;
;       Using factory settings, a cable should be made like this:
;
;       TXD     2  -->  3       RXD     received data
;       RXD     3  <--  2       TXD     tranmitted data
;       SG      7  ---  7       SG      signal ground
;       DCD     8  -->  20      DSR     data set ready (carrier)
;       DTR     20 <--  6       DTR     data terminal ready
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; 07/25/85  Updated for BYE337 - removed ANI 127's      - Paul Traina
; 10/04/82  Original version                            - Paul Traina
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
INTER4  EQU     YES             ; Yes for Compupro Interfacer 3 or 4
                               ; No  for Compupro System Support 1
;
; The following define the port address and usart number to use.
;
        IF     INTER4
BASEP   EQU     010H            ; Base port for Interfacer 3/4 boards
CHIP    EQU     6               ; Chip number to use
        ENDIF                  ; INTER4
;
        IF     NOT INTER4
BASEP   EQU     05CH            ; Base port for System Support 1
        ENDIF                  ; NOT INTER4
;
;-----------------------------------------------------------------------
;
; Modem port equates
;
DPORT   EQU     BASEP           ; Modem data port
SPORT   EQU     BASEP+1         ; Modem status port
MPORT   EQU     BASEP+2         ; Modem mode select port
CPORT   EQU     BASEP+3         ; Modem control port
;
        IF     INTER4
UPORT   EQU     BASEP+7         ; Modem chip select port
        ENDIF                  ; INTER4
;
;       Status port equates
;
TBMT    EQU     00000001B       ; Transmit buffer empty
DAV     EQU     00000010B       ; Data available
DSCHG   EQU     00000100B       ; Change in DSR or DCD or shift reg empty
PE      EQU     00001000B       ; Parity error
OE      EQU     00010000B       ; Overrun error
FE      EQU     00100000B       ; Framing error
DCD     EQU     01000000B       ; Data carrier detect line (not used)
DSR     EQU     10000000B       ; Data carrier detect (this is really DSR)
;
;       Mode port equates
;
B8NO1   EQU     01001110B       ; 8 data bits, no parity, 1 stop bit
BBASE   EQU     00110000B       ; Transmit & Receive clocks internal
BX300   EQU     BBASE+5         ; 300 baud
BX1200  EQU     BBASE+7         ; 1200 baud
BX2400  EQU     BBASE+10        ; 2400 baud
;
;       Control port equates
;
CBASE   EQU     00000101B       ; Normal mode, no error reset, xmit&rcv on
DTR     EQU     00000010B       ; Data terminal ready
RTS     EQU     00100000B       ; Request to send line
;
;-----------------------------------------------------------------------
;
; See if we still have a carrier - if not, return with the zero flag set
;
MDCARCK: IF     INTER4
       MVI     A,CHIP          ; Select proper chip
       OUT     UPORT
        ENDIF
;
       IN      SPORT           ; Get status
       ANI     DSR             ; Check DSR pin for carrier
       RZ
       ORI     255
       RET
;
; Disconnect and wait for an incoming call
;
MDINIT:  IF     INTER4
       MVI     A,CHIP          ; Select proper chip
       OUT     UPORT
        ENDIF
;
       MVI     A,CBASE         ; DTR, RTS off to disconnect phone
       OUT     CPORT
;
       PUSH    B
       MVI     B,20            ; Wait 2 seconds
OFFTI:  CALL    DELAY
       DCR     B
       JNZ     OFFTI
       POP     B
;
       MVI     A,CBASE+DTR+RTS ; Turn DTR & RTS back on
       OUT     CPORT
;
        IF     IMODEM
       CALL    IMINIT          ; Initialize intelligent modem
        ENDIF                  ; IMODEM
;
       RET
;
; Input a character from the modem port
;
MDINP:   IF     INTER4
       MVI     A,CHIP          ; Select proper chip
       OUT     UPORT
        ENDIF                  ; INTER4
;
       IN      DPORT           ; Get character (do not strip 8th bit)
       RET
;
; Check the status to see if a character is available.  If not, return
; with the zero flag set.  If yes, use 0FFH to clear the flag.
;
MDINST:  IF     INTER4
       MVI     A,CHIP          ; Select proper chip
       OUT     UPORT
        ENDIF
;
       IN      SPORT           ; Get status
       ANI     DAV             ; Check data available bit
       RZ
       ORI     255             ; We got something
       RET
;
; Send a character to the modem
;
MDOUTP:  IF     INTER4
       PUSH    PSW
       MVI     A,CHIP          ; Select proper chip
       OUT     UPORT
       POP     PSW
        ENDIF
;
       OUT     DPORT           ; Send it
       RET
;
; See if the output is ready for another character
;
MDOUTST: IF     INTER4
       MVI     A,CHIP          ; Select proper chip
       OUT     UPORT
        ENDIF
;
       IN      SPORT           ; Get status
       ANI     TBMT            ; Check transmit ready bit
       RZ
       ORI     255             ; Make sure we know it's ok
       RET
;
; Reinitialize the modem and hang up the phone by dropping DTR and
; leaving it inactive.
;
MDQUIT:  IF     INTER4
       MVI     A,CHIP          ; Select proper chip
       OUT     UPORT
        ENDIF
;
        IF     IMODEM
       CALL    IMQUIT          ; Tell modem to shut down
        ENDIF
;
; Called by the main program after caller types BYE
;
MDSTOP:  IF     INTER4
       MVI     A,CHIP
       OUT     UPORT
        ENDIF
;
       MVI     A,CBASE         ; Turn off DTR & RTS, modem will quit
       OUT     CPORT
       RET
;
; The following routine sets the baudrate.  BYE3 asks for the maximum
; speed you have available.
;
SET300: CALL    BBAUD           ; Set word length
       MVI     A,BX300         ; Set baud rate
       JMP     EBAUD
;
SET1200:CALL    BBAUD           ; Set word length
       MVI     A,BX1200        ; Set baud rate
       JMP     EBAUD
;
SET2400:CALL    BBAUD           ; Set word length
       MVI     A,BX2400        ; Set baud rate
       JMP     EBAUD
;
BBAUD:   IF     INTER4
       MVI     A,CHIP          ; Select proper chip
       OUT     UPORT
        ENDIF
;
       IN      CPORT           ; Make sure we've flip/flopped mode port
       MVI     A,B8NO1         ; 1 stop, no parity 8 bits
       OUT     MPORT
       RET
;
EBAUD:  OUT     MPORT           ; Send baud rate
       XRA     A
       RET
;
;       end
;----------------------------------------------------------------