; B5CM-1.INS  -   BYE5 insert for Cermetek modems  -  07/17/85
;
;          Cermetek Infomate 212A modem control package
;
;            Note:  This is an insert, not an overlay.
;
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; 07/17/85  Renamed for use with BYE5           - Irv Hoff
; 12/14/84  Written for BYE3                    - Paul Traina
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
;
; To use this code, the BYE5 routines for your USART must be modified:
;
;       IMODEM  EQU     YES     ; Yes, using intelligent modem
;
;       After all USART and baud rate instructions have been executed
;       and IMMEDIATELY after DTR has been set logic true, (DTR must be
;       On for the Cermetek to receive and execute commands), add the
;       following:
;
;                IF     IMODEM
;               CALL    IMINIT
;                ENDIF
;
; The following hardware configuration is assumed:
; -----------------------------------------------
;       DTR (Pin 20) is supported
;       DCD (Pin 8) is supported
;       RI  (Pin 22) is NOT supported
;
; The following software configuration is assumed:
; -----------------------------------------------
;       CWAIT   EQU     20      ; Wait up to 20 seconds for carrier
;       CLOSS   EQU     1       ; If carrier lost wait 1 sec. to hang-up
;       NORING  EQU     YES     ; Yes, UART ring indicator not available
;
; The following Infomate 212A default switches are assumed:
; --------------------------------------------------------
;       1=On   asynchronous mode
;       2=Off  8 data bits
;       3=Off  DCD active only when carrier is present
;       4=On   host controls DTR
;       5=On   battery backup enabled
;       6=Off  not using exclusion key phone
;       7=On   undocumented, should be on
;       8=Off  undocumented, should be off
;
; Notes:
; -----
;       The Cermetek will automatically set itself to the speed of the
;       calling modem, provided the speed is 300 or 1200 baud.  This
;       relieves us of the need to set the modem (still have to check
;       and set the USART/baud), via software instructions.
;
; Command strings sent to modem:
; -----------------------------
;       a. '  XY\r'
;                  Lets the modem "learn" what baud rate we're using.
;
;       b. The meaning of the second command string follows:
;         '^NN ~'  Set command character to tilde ('~').
;         '~P 04'  Do not echo commands, disconnect on loss of carrier
;         '~U 1'   Tell modem to ignore commands when carrier present
;         '~C 1'   Tell modem to answer phone after first ring
;
;       c. When the operator aborts BYE by typing a ^C when waiting for
;          a call to come in, the modem should be sent a command string
;          to reset it to a more "user-friendly" state, and also tell
;          the modem to stop answering calls.  This third command string
;          is as follows:
;         '^NN ~'  Make sure tilde is command character
;         '~C 0'   Disable auto-answer
;         '~P 44'  Echo commands
;
;-----------------------------------------------------------------------
;
;
; Initialize the Infomate 212a.  DTR must be logic true for the modem to
; receive and process a command.
;
IMINIT: CALL    IMLERN          ; Make modem learn current baud rate
       DB      '  XY',CR
       DB      '  XY',CR,0
       CALL    IMSEND          ; No delay - do not answer the phone
       DB      'N'-40H         ; Send attention character
       DB      'N ~',CR        ; Set new attention character
       DB      '~P 04',CR      ; Disable command echo, enable carrier
       DB      '~U 1',CR       ; Do not process command char if carrier
       DB      '~C 1',CR,0     ; Answer phone after first ring
       RET
;.....
;
;
; Send string slowly for modem to find baud rate
;
IMLERN: MVI     A,YES           ; Set delay flag to yes
       STA     DLYFLG
       XTHL                    ; Save HL and get text address
       PUSH    B               ; Save BC
       JMP     IMSEN1          ; Continue with normal routine
;.....
;
;
; De-initialize the Cermetek.  DTR must be set logic true for modem to
; receive and process a command.  The ring register setting should be
; set to 0 so that the modem will not answer calls, also some other re-
; gisters should be reset, then after all is done, the USART routines
; should turn off DTR.
;
IMQUIT: CALL    IMLERN          ; Make modem learn baud rate
       DB      '  XY',CR
       DB      '  XY',CR,0
       CALL    IMSEND          ; No delay - tell modem to shutdown
       DB      'N'-'@'         ; Send attention character
       DB      'N ~',CR        ; Set new attention character
       DB      '~P 44',CR      ; Enable command echo
       DB      '~U 1',CR       ; Do not process command char if carrier
       DB      '~C 0',CR,0     ; Do not answer phone
       RET
;.....
;
;
; Send the Command String to the modem, similiar to how ILPRT sends to
; console.
;
IMSEND: XRA     A               ; Make sure there is no delay
       STA     DLYFLG
       XTHL                    ; Save HL and get address of message
       PUSH    B               ; Save BC
;
IMSEN1: CALL    MDOUTST         ; Get the modem output status
       JZ      IMSEN1          ; Not ready to send yet
       MOV     A,M             ; If ready, get the character
       CALL    MDOUTP          ; Send the character
       INX     H               ; Point to next character
       CALL    DELAY           ; Wait 100 ms here
       MOV     A,M             ; Get next character
       ORA     A               ; Are we all done?
       PUSH    PSW
       LDA     DLYFLG          ; Check to see if we should delay
       ORA     A
       CNZ     DELAY           ; If flag is set, delay another 100ms
       POP     PSW             ; ..for a total of 200ms delay.
       JNZ     IMSEN1          ; If not done, go do another
       POP     B               ; Otherwise restore BC
       XTHL                    ; Restore HL and get return address
       RET
;.....
;
;
DLYFLG: DB      0               ; Delay flag
;
;                              end
;-----------------------------------------------------------------------