;***********************************************************************
;
;                       MBYE (Modular 'BYE')
;          Potomic Micro Magic Incorporated modem routines
;                  v1.0 (02/07/84) by Kim Levitt
;
; These routines will allow the easy patching of MBYE 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 PMMI S100 modem card.
;
; Current revision history: (in reverse order to minimize reading time)
;
; 02/07/84  Altered and renamed to work with MBYE       - Kim Levitt
; 11/27/83  Altered and renamed to work with BYE3       - Irv Hoff
; 08/04/83  Updated for use with ByeII version 1.6      - Paul Traina
; 04/16/83  General code optimization & housecleaning   - Paul Traina
; 01/29/82  Removed check for framing and overrun errors
;           which get screwed when TSTBAUD'ing...       - Paul Traina
; 11/28/82  Fixed some conventions in file format,
;           cleaned up for distribution.                - Paul Traina
; 11/27/82  Fixed MDCARCK and MDRING routines to work
;           with PMMI convention.  Corrected syntax
;           errors with 8bit.                           - Frank Gaude
; 11/25/82  Routines added, no fuss, mess, or frills.   - Paul Traina
;
;***********************************************************************
;
; The following define the port address for the PMMI card.
;
BASEP:  EQU     0C0H            ;Base port for PMMI modem
;
; Modem port equates
;
TPORT:  EQU     BASEP           ;control port #1
DPORT:  EQU     BASEP+1         ;data port
RPORT:  EQU     BASEP+2         ;baud rate generator/modem status
CPORT:  EQU     BASEP+3         ;modem control port
;
; Switch hook and modem commands, output to TPORT (port 0)
;
BYE:    EQU     0               ;hang up
ANSW:   EQU     2               ;off hook, answer mode
BIT8:   EQU     0CH             ;8 data bits
NOPY:   EQU     10H             ;no parity
TSB:    EQU     40H             ;2 stop bits
NORM:   EQU     BIT8+NOPY       ;normal, 8 bits, no parity
P110:   EQU     BIT8+NOPY+TSB   ;same w/2 stop bits
;
; Modem status, input on RPORT (port 3)
;
DTD:    EQU     1               ;dial tone detect
RDET:   EQU     2               ;ring detect
CTS:    EQU     4               ;CTS (carrier detect)
CONN:   EQU     10H             ;connected? (0=yes, 1=modem hung up)
;
; Control port values for filter mask
;
LE300:  EQU     7FH             ;less than or equal to 300 bps
GT300:  EQU     5FH             ;greater than 300 bps
;
; PMMI modem status masks
;
TBMT:   EQU     1               ;xmit buffer empty
DAV:    EQU     2               ;data available
OE:     EQU     10H             ;overrun error
FE;     EQU     20H             ;framing error
;
; Baud rate divisors
;
B110:   EQU     142             ;110 bps
B300:   EQU     52              ;300 bps
B450:   EQU     35              ;450 bps
B600:   EQU     26              ;600 bps
B710:   EQU     22              ;710 bps
;
;
;***********************************************************************
;
; If any of your routines zaps anything other than the Accumulator, then
; you must preserve all other registers.
;
;***********************************************************************
;
; This routine should turn off everything on the modem, and get it ready
; to wait for a ring.  (Also hang it up.)
;
MDINIT:
       XRA     A               ;get disconnect value
       OUT     TPORT           ;reset orig/answer
       OUT     CPORT           ;turn off DTR, do break
       RET
;
; The following is a routine to determine if there is a character wait-
; ing to be received,  if none are there,  the Zero flag will be set,
; otherwise, 255 will be returned in register A.  Remember that the
; system may like you a little more if you also mask out framing,
; parity, and overrun errors.  (On some modems, you can't because of
; problems with the baud rate selection.)
;
MDINST:
       IN      TPORT           ;get status
       ANI     DAV             ;data available?
       RZ                      ;return if not ready
       ORI     0FFH            ;we got something...
       RET
;
; The following is a routine to determine if the transmit buffer is
; empty.  If it isn't, then it will return with the Zero flag set.  If
; the transmitter is not empty, it will return with Zero clear.
;
MDOUTST:
       IN      TPORT   ;get modem status
       ANI     TBMT    ;transmit buffer empty
       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      RPORT           ;get status of modem
       CMA                     ;reverse for pmmi convention
       ANI     CTS             ;clear to send?
       RET
;
; The following routine will check to see if the phone is ringing, if it
; isn't, ;it will return with Zero set, otherwise Zero will be cleared.
;
MDRING:
       IN      RPORT           ;get ring status
       CMA                     ;reverse for pmmi convention
       ANI     RDET            ;mask all but ring
       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
       ANI     7FH             ;strip parity and other garbage
       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
;
; The following routine will make the modem answer the phone.  It should
; also set baud rate to 300 bps.
;
MDANSW:
       MVI     A,LE300         ;filter value for 300 bps (DTR)
       OUT     CPORT
       CALL    DELAY           ;give time to turn on (.1 sec)
       MVI     A,P110+ANSW     ;answer phone
       OUT     TPORT
       CALL    DELAY           ;give time for answer
       IN      DPORT           ;clear modem port
       IN      DPORT           ;make sure it's clear
       CALL    SET300          ;set modem for 300 bps
       RET
;
; These next routines set the proper baud rates for the modem.  If you
; do not support the particular rate, then simply put in a JMP to SETINV.
; If the baud rate change was successful, make SURE the Zero flag is set.
;
; The following routine returns a 255 because we were not able to set to
; the proper baud rate because either the serial port or the modem can't
; handle it.
;
SET1200:                        ;PMMI does not support 1200 bps
;
SETINV: ORI     0FFH            ;make sure the Zero flag isn't set
       RET
;
; Set up for 110 bps
;
SET110:
       MVI     A,LE300         ;set filter value to less than 300 bps
       OUT     CPORT
       MVI     A,P110          ; 8 data bits, no parity, 2 stop bits
       OUT     TPORT
       MVI     A,B110          ; 110 bps
       OUT     RPORT
       XRA     A               ;return 110 as a valid rate
       RET
;
; Set up for 300 bps
;
SET300:
       MVI     A,LE300         ;filter set to less than or = 300 bps
       OUT     CPORT
       MVI     A,NORM          ;set for 8 bits, no parity, 1 stop bit
       OUT     TPORT
       MVI     A,B300          ;set divisor to 300 bps
       OUT     RPORT
       XRA     A               ;return with 300 bps as a valid rate
       RET
;
; Set up for 450 bps
;
SET450:
       MVI     A,GT300         ;set filter value for >300 bps
       OUT     CPORT
       MVI     A,NORM          ;set for 8 bits, no parity, 1 stop bit
       OUT     TPORT
       MVI     A,B450          ;set for 450 bps
       OUT     RPORT
       XRA     A               ;return saying 450 is ok
       RET
;
; Set up for 600 bps
;
SET600:
       MVI     A,GT300         ;set filter value for >300 bps
       OUT     CPORT
       MVI     A,NORM          ;set for 8 bits, no parity, 1 stop bit
       OUT     TPORT
       MVI     A,B600          ;set for 600 bps
       OUT     RPORT
       XRA     A               ;return saying 600 bps is valid
       RET
;
; Set up for 710 bps
;
SET710:
       MVI     A,GT300         ;set filter value for >300 bps
       OUT     CPORT
       MVI     A,NORM          ;set for 8 bits, no parity, 1 stop bit
       OUT     TPORT
       MVI     A,B710          ;set for 710 bps
       OUT     RPORT
       XRA     A               ;return saying 710 bps is valid
       RET
;
; Ok, that's all of the modem dependant routines that MBYE uses, so if
; you patch this file into your copy of MBYE, then it should work out
; well.
;
;************************************************************************
;