
; 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
;-----------------------------------------------------------------------
