; B5AP-2.INS - APPLE ][ with Mountain CPS Serial Card - 09/14/85
;
;               2651 with internal baudrate generator
;
;              NOTE: This is an insert, not an overlay.
;
; WARNING:  Carrier detect (DCD) from the modem must go to DSR input on
;           the 2651 to provide proper operation for both autodialing
;           and autoreceiving.  If you use the DCD input, it requires
;           voltage (normally unavailable) during dialing to allow
;           result codes to be used.  See B5CP.INS for more information
;           on this 2651 peculiarity.  This program assumes you use the
;           DSR pin 80H to check carrier from the modem.
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; 09/14/85  Changes to MDINIT, corrected error in B2400,
;           added support for B4800, B9600              - Norman Beeler
; 07/17/85  Written to work with BYE5                   - Irv Hoff
; 01/20/84  Created overlay using BY2-2651.ASM          - Norman Beeler
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; Define the CPS card slot you are using (normally 1 or 2)
;
SLOT    EQU     2               ; CPM card slot
;
;=======================================================================
;
;
; Modem port equates
;
PORT    EQU     0E0FAH+SLOT*100H ; Modem data port
MDCTL1  EQU     0E0FBH+SLOT*100H ; Modem status port
XPORT   EQU     0E0FEH+SLOT*100H ; Modem swap port
;
;
;Mode port equates
;
EBASE   EQU     70H             ; Mode register 2 base
B300    EQU     EBASE+5         ; 300 baud
B1200   EQU     EBASE+7         ; 1200 bps
B2400   EQU     EBASE+10        ; 2400 bps
B4800   EQU     EBASE+12        ; 4800 bps
B9600   EQU     EBASE+14        ; 9600 bps
;
;
;-----------------------------------------------------------------------
;
; See if we still have a carrier - if not, return with the zero flag set
;
MDCARCK:LDA     MDCTL1          ; Read port
       ANI     80H             ; Check DSR for carrier (do not use DCD)
       RET
;.....
;
;
; Disconnect and wait for an incoming call
;
MDINIT:  IF     HS2400
       CALL    SET2400
        ENDIF                  ; HS2400
;
        IF     HS1200
       CALL    SET1200
        ENDIF                  ; HS1200
;
        IF     HS300
       CALL    SET300
        ENDIF                  ; HS300
;
       CALL    DELAY
       MVI     A,80H           ; Open CPS command register
       STA     XPORT           ; By storing 80H in XPORT
       MVI     A,05H           ; Turn DTR off, modem will quit
       STA     MDCTL1
       MVI     B,20            ; 2 seconds to drop any carrier
;
MDINIT1:CALL    DELAY           ; .1 second delay
       DCR     B
       JNZ     MDINIT1
       MVI     A,27H           ; With DTR on, modem accepts commands
       STA     MDCTL1
       XRA     A               ; Close the command port
       STA     XPORT           ; By storing 0 in XPORT
;
        IF     IMODEM
       CALL    IMINIT          ; Initialize smartmodem
        ENDIF                  ; IMODEM
;
       RET
;.....
;
;
; Input a character from the modem port
;
MDINP:  LDA     PORT            ; Get character
       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: LDA     MDCTL1          ; Read port
       ANI     02H             ; Check receive ready bit
       RZ                      ; Nope, nothing there
       ORI     0FFH            ; We got something...
       RET
;.....
;
;
; Send a character to the modem
;
MDOUTP: STA     PORT            ; Send it
       RET
;.....
;
;
; See if the output is ready for another character
;
MDOUTST:LDA     MDCTL1          ; Read port
       ANI     01H             ; Check transmit ready bit
       RET
;.....
;
;
; Reinitialize the modem and hang up the phone by dropping DTR and
; leaving it inactive.
;
MDQUIT:  IF     IMODEM
       CALL    IMQUIT          ; Initialize modem to default settings
        ENDIF                  ; IF IMODEM
;
;
; Called by the main program after caller types BYE
;
MDSTOP: MVI     A,80H           ; Open CPS command register
       STA     XPORT           ; By storing 80H in XPORT
       MVI     A,15H           ; Turn DTR off, modem will quit
       STA     MDCTL1
       CALL    DELAY           ; Let it stabilize
       RET
;.....
;
;
; The following routine sets the baudrate.  BYE5 asks for the maximum
; speed you have available.
;
SETINV: ORI     0FFH            ; Make sure the Zero flag isn't set
       RET
;.....
;
;
SET300: CALL    BSETUP
       MVI     A,B300
       JMP     FSETUP
;
SET1200:CALL    BSETUP
       MVI     A,B1200
       JMP     FSETUP
;
SET2400:CALL    BSETUP
       MVI     A,B2400
       JMP     FSETUP
;
SET4800:CALL    BSETUP
       MVI     A,B4800
       JMP     FSETUP
;
SET9600:CALL    BSETUP
       MVI     A,B9600
       JMP     FSETUP
;
BSETUP: MVI     A,80H
       STA     XPORT
       MVI     A,37H           ; Initialize the serial chip
       STA     MDCTL1          ; By storing 37H in MDCTL1
       MVI     A,4EH           ; 1 stop, 8 bits, no parity
       STA     PORT
       XRA     A
       RET
;.....
;
;
FSETUP: STA     PORT
       XRA     A
       STA     XPORT           ; Close command port by storing 0
       RET
;.....
;
;                              end
;-----------------------------------------------------------------------