home *** CD-ROM | disk | FTP | other *** search
-
- ; 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
- ;-----------------------------------------------------------------------