; B5HZ-1.INS - Heath/Zenith-100 insert for BYE5 - 07/17/85
;
;       2661B I/O with built-in baudrate generator, 4.9152 MHz
;
;       Note:  This is an insert, not an overlay.
;
;
;       WIRING THE HEATH:
;       ----------------
;          The HZ-100 has a quirk with the 2661 that requires the
;          DCD signal (carrier detect) from the modem be brought
;          to the DSR input on the computer, rather than to its DCD
;          input, else the HZ-100 cannot be programmed properly.
;          If using the Heath HCA-11 RS-232 cable between the modem
;          and the computer, the following will need to be done:
;
;               Push pins 6 (blue) and 8 (black) from the male
;               connector at the modem end, then put the blue
;               one in pin 8, leaving the black one unconnected.
;               (Tape it or whatever and replace the connector.)
;
;               This hooks pin 8 at the modem end to pin 6 at
;               the computer end and then has nothing connected
;               to pin 6 at the modem end.  (You can make this
;               change at either end that is most convenient, so
;               the computer effective winds up with nothing at
;               its pin 8.)  This permits the computer's DSR in-
;               put to check the modem's DCD line.
;
;
;                       If using a Hayes Smartmodem 1200,
;                       insure all switches are up except
;                       3, 5 and 8 which should be down.
;
;                             modem      computer
;                                1-----------1
;                                2-----------2
;                                3-----------3
;                                6 n/c       8 n/c
;                                7-----------7
;                                8-----------6
;                               20-----------20
;
;               The Hayes Smartmodem actually has a short between
;               its pin 6 and pin 8, internally.  It does not have
;               any actual DSR information available, giving DCD
;               information at both its pins 6 and 8.  Other modems
;               do not use this unorthodox method.
;
;               (Thanks to Dennis Vallianos and others for helping
;               develop this fix for the HZ100 series.)
;
;                                       - Notes by Irv Hoff
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; 07/17/85  Written for use with BYE5 and later - Irv Hoff
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; Modem port equates
;
PORT     EQU    0ECH            ; Data port for Heath/Zenith-100 series
MDCTL1   EQU    PORT+1          ; Status port
MDCTL2   EQU    PORT+2          ; Modem port
MDCTL3   EQU    PORT+3          ; Control port
;
BD300    EQU    0F6H            ; 300 baud
BD1200   EQU    0F8H            ; 1200 bps
BD2400   EQU    0FBH            ; 2400 bps
;.....
;
;
;-----------------------------------------------------------------------
;
; See if we still have a carrier - if not, return with the zero flag set
;
MDCARCK:IN      MDCTL1          ; Status port
       ANI     80H             ; See if there is a carrier (DSR pin)
       RET                     ; If yes, return with Zero flag set
;.....
;
;
; Disconnect and wait for an incoming call
;
MDINIT: MVI     A,15H           ; Turn off DTR, RTS to hang up phone
       OUT     MDCTL3          ; Control port
       IN      MDCTL3          ; Make sure it is now clear
       IN      MDCTL3          ; Try once more
       PUSH    B               ; In case it was being used
       MVI     B,20            ; Delay for 2 seconds
;
OFFTI:  CALL    DELAY           ; .1 second increments
       DCR     B               ; One less to go
       JNZ     OFFTI           ; If not zero, loop until zero
       POP     B               ; Restore to original
       MVI     A,37H           ; Reset RTS, flags, DTR, enable R/T
       OUT     MDCTL3          ; Control port
       IN      MDCTL3          ; Clear any incoming characters
       IN      MDCTL3          ; Try once more
;
        IF     IMODEM
       CALL    IMINIT          ; Initialize modem
        ENDIF                  ; IMODEM
;
       RET
;.....
;
;
; The following is a routine that will input one character from the mo-
; dem port.  If there is nothing there, it will return garbage... so use
; the MDINST routine first.
;
MDINP:  IN      PORT
       RET
;.....
;
;
; The following is a routine to determine if there is a character wait-
; ing to be received.  If there are none, the zero flag will be set.
; Otherwise, 0FFH will be returned in 'A' reg.
;
MDINST: IN      MDCTL1
       ANI     02H             ; Check for receive ready bit
       RZ
       ORI     0FFH            ; We got something...
       RET
;.....
;
;
; The following is a routine to determine if the transmit buffer is em-
; pty.  If not, it returns with the Zero flag set, otherwise it will
; return with Zero clear.
;
MDOUTST:IN      MDCTL1
       ANI     01H             ; Check the transmit ready bit
       RZ
       ORI     0FFH
       RET
;.....
;
;
MDQUIT:  IF     IMODEM
       CALL    IMQUIT
        ENDIF                  ; IMODEM
;
MDSTOP: MVI     A,15H           ; DTR off, modem will quit working
       OUT     MDCTL3
       RET
;.....
;
;
; The following is a routine that will output one character in the 'A'
; reg. to the modem.
;
;
MDOUTP: OUT     PORT
       RET
;.....
;
;
; Set the baudrate, returns with Zero flag set with successful change
;
SETINV: MVI     A,0FFH
       ORA     A               ; Make sure the Zero flag is not set
       RET
;
SET300: MVI     B,BD300
       JMP     LOADBD
;
SET1200:MVI     B,BD1200
       JMP     LOADBD
;
SET2400:MVI     B,BD2400
;
LOADBD: MVI     A,4EH           ; 1 Stop, no parity, 8 bits, 16x asynch
       OUT     MDCTL2          ; Send to mode register
       MOV     A,B             ; Get the baudrate
       OUT     MDCTL2          ; Set the desired speed
       MVI     A,37H           ; Reset flags, RTS, DTR, enable R/T
       OUT     MDCTL3          ; Send to command register
       IN      MDCTL3          ; Clear any incoming characters
       IN      MDCTL3          ; Try once again
       XRA     A               ; Shows the baudrate change was ok
       RET
;.....
;
;
;                              end
;-----------------------------------------------------------------------