; B5TVH-2.INS  -  BYE5 insert for TeleVideo 803H computers  -  03/27/86
;
;               Mostek 3801 and CTC timer (3.6864 MHz)
;
;               Note: This is an insert, not an overlay.
;
; This version is for a TeleVideo 803H using an interrupt-driven Mostek
; Mostek 3801 STI.
;
; These routines will allow the easy patching of BYE5xx for any type of
; 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 TeleVideo 803H that is hooked up to an exter-
; nal modem.
;
;-----------------------------------------------------------------------
;
; 06/11/86  Added 2400 bps capability, changed to BYE5 format from MBYE.
;                                       - Irv Hoff
;
; 03/27/86  Created from MBTV-10.ASM    - Ian Cottrell
;
;-----------------------------------------------------------------------
;
; Change the following information to match your equipment
;
PORT    EQU     2FH             ; Modem data port
MDSND   EQU     PORT-1          ; Modem send status register
MDRCV   EQU     PORT-2          ; Modem receive status register
MDCTL   EQU     PORT-3          ; MOdem control register
IOPORT  EQU     20H             ; Modem general purpose I/O port
INTREG  EQU     27H             ; Modem interrupt register
MDPVR   EQU     28H             ; Modem pointer/vector register
TIMER   EQU     29H             ; Modem timer A & B control register
BDPORT  EQU     2BH             ; CTC port for baud rate
;
MDRDY   EQU     80H             ; Value for receive/send ready
SPSTAT  EQU     21H             ; Parameter status register
;
BD300   EQU     32              ; 300 baud (9600/300 converted to hex)
BD1200  EQU     8               ; 1200 baud (9600/1200 converted to hex)
BD2400  EQU     4               ; 2400 baud (9600/2400 converted to hex)
;
;-----------------------------------------------------------------------
;
; See if we still have a carrier - if not, return with the zero flag set
; Reg A is zero if no carrier, non-zero if carrier
;
MDCARCK:IN      SPSTAT          ; Read status register
       ANI     01H             ; Check for carrier detect
       XRI     01H             ; Ready if bit 0 = 0
       RET
;.....
;
;
; Disconnect and wait for an incoming call
;
MDINIT: PUSH    H               ; Save regs
       PUSH    D
       PUSH    B
       IN      TIMER           ; Read current timer value
       STA     TABD
       IN      MDPVR           ; Get STI interrupt vector
       ANI     0E0H            ; And mask off don't care bits
       MOV     B,A             ; Save it in B
       ORI     6               ; Point to indirect reg # 6
       OUT     MDPVR
       MVI     A,04H           ; Set RTS
       OUT     IOPORT
       XRA     A               ; Set handshake lines
       OUT     SPSTAT
       MOV     A,B             ; Restore STI interrupt vector
       ORI     7               ; Point to indirect reg # 7
       OUT     MDPVR
       IN      IOPORT          ; Read timer C and D regs
       ORI     88H             ; A & B reset; C & D unchanged
       OUT     IOPORT          ; Go do it
       XRA     A               ; Stop timers
       OUT     TIMER
;
INITBD: OUT     BDPORT
       LDA     TABD            ; Restart timers
       OUT     TIMER
       MVI     A,88H           ; No parity, 8 bits, 1 stop, x16
       OUT     MDCTL
       MVI     A,1             ; Turn on RXD
       OUT     MDRCV
       MVI     A,5             ; Turn on TXD
       OUT     MDSND
       MVI     A,0FH           ; Turn off interrupts
       OUT     INTREG
       IN      MDPVR           ; Read pointer/vector register
       ANI     0E0H            ; Mask don't care bits
       ORI     6               ; Select indirect register 6
       OUT     MDPVR
       MVI     A,24H           ; Set DTR and RTS
       OUT     IOPORT
       IN      PORT            ; Clear any incoming chars
       IN      PORT            ; Try again
       XRA     A               ; Clear 'A' reg
       POP     B               ; Restore regs
       POP     D
       POP     H
       RET
;
TABD:   DB      0
;.....
;
;
; Input a character from the modem port
;
MDINP:  IN      PORT            ; Get character
       RET
;.....
;
;
; Check the staus to see if a character is available.  If not, return
; with the zero flag set.  If yes, use 0FFH to clear the flag.
;
MDINST: IN      MDRCV           ; Get status
       ANI     MDRDY           ; Check receive ready bit
       RET
;.....
;
;
; Send a character to the modem
;
MDOUTP: OUT     PORT            ; Send it
       RET
;.....
;
;
; See if the output is ready for another character
;
MDOUTST:IN      MDSND
       ANI     MDRDY
       RET
;.....
;
;
; Reinitialize the modem and hang up the phone by dropping DTR and
; leaving it inactive
;
MDQUIT:  IF     IMODEM
       CALL    IMQUIT          ; If a smartmodem, tell it to shut down
        ENDIF                  ; IMODEM
;
;
; Called by the main program after caller types BYE
;
MDSTOP: IN      MDPVR           ; Read pointer/vector register
       ANI     0E0H            ; Mask don't care bits
       ORI     6               ; Select indirect register 6
       OUT     MDPVR
       MVI     A,04H           ; DTR off; RTS on
       OUT     IOPORT
       RET
;.....
;
;
; The following routine sets the baudrate.  BYE5 asks for the maximum
; speed you have available.
;
SETINV: ORI     0FFH            ; Make surae trhe flag is not set
       RET
;
SET300: MVI     A,BD300         ; 300 baud
       JMP     STBAUD
;
SET1200:MVI     A,BD1200        ; 1200 bps
       JMP     STBAUD
;
SET2400:MVI     A,BD2400        ; 2400 bps
;
STBAUD: PUSH    PSW             ; Save baud rate
       IN      TIMER           ; Read current timer value
       STA     TABD
       IN      MDPVR           ; Get STI interrupt vector
       ANI     0E0H            ; And mask off don't care bits
       MOV     B,A             ; Save it in B
       ORI     6               ; Point to indirect reg # 6
       OUT     MDPVR
       MVI     A,24H           ; Set DTR and RTS
       OUT     IOPORT
       XRA     A               ; Set handshake lines
       OUT     SPSTAT
       MOV     A,B             ; Restore STI interrupt vector
       ORI     7               ; Point to indirect reg # 7
       OUT     MDPVR
       IN      IOPORT          ; Read timer C and D regs
       ORI     88H             ; A & B reset; C & D unchanged
       OUT     IOPORT          ; Go do it
       XRA     A               ; Stop timers
       OUT     TIMER
       POP     PSW             ; Restore baud rate
       OUT     BDPORT          ; And set it
       LDA     TABD            ; Restart timers
       OUT     TIMER
       MVI     A,88H           ; No parity, 8 bits, 1 stop, x16
       OUT     MDCTL
       MVI     A,1             ; Turn on RXD
       OUT     MDRCV
       MVI     A,5             ; Turn on TXD
       OUT     MDSND
       XRA     A               ; Set zero flag
       RET
;.....
;
;                              end
;-----------------------------------------------------------------------