; B5A7-1.INS for the Apple ][ and CCS 7710 interface for BYE5 - 02/02/87
;
;              6850 ACIA, no internal baudrate generator
;
;
; This version is for Apple ][ computers, using the Microsoft CP/M card
; and the CCS 7710 serial interface card.
;
;       The 6850 has no baudrate generator.  It relies on the user
;       setting a dip switch to the maximum speed he wants to use.
;       The program then uses the 6850 in the "divide by 16" mode
;       to get that speed.  It can then change to "divide by 64"
;       to get the only other speed available.  This type system
;       normally limits the user to 1200 and 300 baud.  If you
;       set the dip switches for 2400, then you could only get
;       2400 and 600, eliminating both 1200 and 300 baud.  Using
;       either the Apricorn or CCS 7710 board just about precludes
;       the user from wanting to obtain a new modem with 2400 bps.
;       The 6850 uses the last two bits to select the divisor.  01
;       gives "divide by 16" and 10 gives "divide by 64".
;
;-----------------------------------------------------------------------
;
; The CCS 7710 serial card is set up as DCE rather than the more usual
; DTE, and requires a special cable.....the following cable configura-
; ion is necessary to work with this overlay -----
;
;                     MODEM pin       CCS pin
;
;                        2               3
;                        3               2
;                        5               4
;                        8              20
;                        7               7
;                       20               5
;
; =   =  =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
;-----------------------------------------------------------------------
;
; For the Apple //e, a user entered CTL-Q can trash the local display by
; reverting back to 40 column mode.  This is a patch to turn CTL-Q into
; a backspace.
;
; In BYE5 find the label MINP2A:  Just prior to MINP2A should be the
; lines:
;               JNZ     MINP2A
;               MVI     A,08H
;
;
; Add the following code just before JNZ MINP2A
;
;               JZ      CHNGIT
;               CPI     'Q'-'@'
;               JNZ     MINP2A
;       CHNGIT: MVI     A,08H   << note the added label
;
;
; When using a Softcard CP/M system and the CCS 7710, a warmboot causes
; the serial baud rate port to reset to its default setting.  (Whatever
; the switches are set to on the card.)  The problem is fixed by zeroing
; out the CALL in the warmboot routine that resets the baud rate.
;
; Find the following code in BYE5:
;
;                       JMP     VWARMBT
;
; Just before this instruction, add the following code:
;
;                       PUSH    PSW      ;Save AF
;                       XRA     A        ;Make it zero
;                       STA     0DAD8H   ;Patch out the opcode
;                       STA     0DAD9H   ;Patch out the operand byte 1
;                       STA     0DADAH   ;Patch out the operand byte 2
;                       POP     PSW      ;Make it like it was
; Here's the end -->
; For reference -->     JMP     VWARMBT
;
;
; NOTE:  This change may work only with the 60k version version of the
;        MicroSoft CP/M, their v2.2.3.
;
;
;=  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =
;
; 02/02/87  Adapted for the CCS 7710 serial interface card - Irv Hoff
;
;=  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =  =
;
; Equates for Microsoft Softcard CP/M and Super Serial Card
;
SLOT    EQU     2               ; Slot of serial interface
SLOTOFF EQU     16*SLOT         ; Serial card slot offset
MAPOFF  EQU     2000H           ; Microsoft offset
;
PORT    EQU     0C081H+SLOTOFF+MAPOFF ; Data port
MDCTL1  EQU     PORT-1          ; Control port
MDRCV   EQU     1               ; Bit to test for receive
MDSND   EQU     2               ; Bit to test for send
;......
;
;
;-----------------------------------------------------------------------
;
; Routine to check carrier.  If no carrier, return with zero flag set.
;
MDCARCK:LDA     MDCTL1          ; Get status byte
       ANI     4               ; Check for DCD
       XRI     4               ; Reverse the zero flag (the 6850
       RET                     ;   has status 0 for DCD true)
;.....
;
;
; This routine will turn off the serial card and hang up the phone.
;
MDINIT: MVI     A,0D5H          ; Turn off DTR
       STA     MDCTL1
       PUSH    B               ; Save register
       MVI     B,20            ; Delay 2 sec to drop carrier
;
OFFTI:  CALL    DELAY           ; 1 sec per loop
       DCR     B
       JNZ     OFFTI           ; Keep going until finished
       POP     B               ; Restore register
       MVI     A,0B5H          ; Turn everything back on, 8 bits, 1 stop
;
        IF     IMODEM
       CALL    IMINIT
        ENDIF
;
       RET
;.....
;
;
; Check the status to see if a character is available.  Return with zero
; flag set, if not.  If yes, use 0FFH to clear the flag.
;
MDINST: LDA     MDCTL1          ; Get modem status
       ANI     1               ; Is data available?
       RZ                      ; If no, return
       ORI     0FFH            ; Otherwise return true
       RET
;.....
;
;
; See if the output is ready for another character.
;
MDOUTST:LDA     MDCTL1          ; Get modem status
       ANI     2               ; Mask out junk
       RZ
       ORI     0FFH
       RET
;.....
;
;
; Input a character from the modem port.
;
MDINP:  LDA     PORT            ; Get character
       RET
;.....
;
;
; This routine will output a character to the data port.
;
MDOUTP: STA     PORT            ; Send character
       RET
;.....
;
;
; Reinitialize the modem and hang up the phone by dropping DTR and
; leaving it inactive.
;
MDQUIT:  IF     IMODEM          ; If using a smartmodem
       CALL    IMQUIT          ; Tell it to shut down
        ENDIF                  ; IMODEM
;
;
; Called by the main program after caller types BYE
;
MDSTOP: MVI     A,0D5H          ; Drop DTR, set to 1200 speed
       STA     MDCTL1
       RET
;.....
;
;
; If you do not support a particular baud rate, put it here before
; SETINV:
;
SET2400:
SET4800:
SET9600:
SETINV: ORI     0FFH
       RET
;.....
;
;
SET300: MVI     A,16H
       JMP     SETBAUD
;
SET1200:MVI     A,15H
;
SETBAUD:STA     MDCTL1
       XRA     A               ; Shows the baud rate was changed ok
       RET
;.....
;
;                           end
;---------------------------------------------------------------------