; B5OV-1.INS - Osborne Vixen insert for BYE5 - 07/17/85
;
;            8251A with BIOS routines setting baud rate
;
;
; This version is for an 8251A I/O with extended BIOS jump for setting
; baudrate.  Note:  This is an insert, not an overlay.
;
; This version is for the Osborne Vixen which uses an extended BIOS
; function call to set the baudrate.  The normal serial input interrupt
; driver in BIOS is disabled while BYE5 is used.
;
;
;=   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
;  06/15/85  Written for use with BYE5          - Roy Robinson
;                                                 FOG RCPM #4
;                                                 (415) 591-6259
;=   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
;-----------------------------------------------------------------------
; PATCH #1 -------------------------------------------------------------
;-----------------------------------------------------------------------
;
; Listed below is a patch for disabling the serial input interrupt
; driver in the Vixen BIS.  This patch goes AFTER the label
;
;   START1:
;
; and immediately AFTER the line of code, CALL MDCARCK
;
; ---->  beginning of patch:
;
;
;       JNZ     BYPASS
;
;INITMOD:
;       PUSH    PSW
;       MVI     C,7     ; Use BDOS to obrain current IOBYTE
;       CALL    BDOS    ;
;       STA     OLDIOB  ; Save old IOBYTE
;       ANI     3fH     ;
;       ORI     80H     ; Make CEN: PORT new LST: DEVICE
;       MOV     E,A
;       MVI     C,8
;       CALL    BDOS    ; Use BDOS to place new IOBYTE in first page of memory
;
;       DI              ;
;       LHLD    INTVEC  ; Get serial port interrupt processor address
;       SHLD    OLDVEC  ; Save serial port interrupt processor address
;       DCX     H
;       DCX     H
;       DCX     H       ; HL has next interrupt processor address
;       SHLD    INTVEC  ; This is now first interrupt processor rather
;                       ;   than second
;
;INITSIO:
;
;       LHLD    BIOS    ; Find start ofF BIOS
;       MVI     L,3CH   ; Displacement of baudrate byte from start of BIOS
;       MOV     A,M
;       STA     OLDBAUD ; Save original baudrate byte
;
;       MVI     L,3BH   ; Displacement of 8251 mode byte from start of BIOS
;       MOV     A,M     ; Old mode byte set by ROM is 2SB, NP, 8DB, X16 clock
;       STA     OLDMODE ; Save original 8251 mode byte
;
;       MOV     B,L
;       MVI     A,6EH   ; 1 SB, NP, 8 DB, X16 clock modem byte
;       CALL    IORESET ; Use extended BIOS jump to reset 8251
;
;       MVI     A,37H   ; 8251 command byte RTS/DTR active, TXD and RXD active
;       OUT     31H     ; Send it to 8251 control port
;
;       MVI     A,3     ; Select 8155 port C
;       OUT     21h     ;
;       IN      28h     ; Get miscellaneous byte
;       STA     OLDMSC  ; Save misdellaneous info byte
;       ORI     00001111B
;                       ; Disable ring detect interrupt, RXD interrupt, XMIT
;                       ;   interrupt, emab;e omterma; clock
;       MOV     E,A
;       MVI     A,3
;       OUT     21h     ; Select 8155 port C
;       MOV     A,E
;       OUT     28h     ; Send new control byte to 8155 port C
;       EI
;       POP     PSW
;       ORA     A
;
;BYPASS:
;
;--> Original code starts again with the following instruction:
;
;       JNZ     GOODBY
;
;
;=======================================================================
;
;-----------------------------------------------------------------------
; PATCH #2 -------------------------------------------------------------
;-----------------------------------------------------------------------
;
;
; Listed below is a patch for re-enabling the serial input interrupt
; driver in the Vixen.  Place this patch before the instruction line
; "JMP  0000H" in the EXCPM routine.
;
;--> Patch starts here
;
;RSTINT:LDA     OLDIOB  ; Get original IOBYTE
;       MVI     C,8
;       MOV     E,A     ; Use BDOS to restore original IOBYTE
;       CALL    BDOS
;
;       DI
;       XRA     A
;       OUT     STPORT  ; Disable 8251 DTR/RTS lines
;       LHLD    OLDVEC  ; Get original interrupt service address
;       SHLD    INTVEC  ; Restore original interrupt service address
;       MVI     A,3     ; Select 8155 port C
;       OUT     21H
;       IN      28H     ; Get misc. info byte for controlling interrupt lines
;       ANI     030H    ; Zero the least significant four bits, keep the
;                       ;   remainining two most significant bits
;       MOV     E,A
;       LDA     OLDMSC  ; Get original misc. 8155 control byte
;       ANI     0FH     ; Keep least significant four bits
;       ORA     E       ; Combine everything
;       MOV     E,A
;       MVI     A,3
;       OUT     21H     ; Select 8155 port C
;       MOV     A,E
;       OUT     28H     ; Restore original 8155 control byte
;       EI
;
;       MVI     B,3CH
;       LDA     OLDBAUD ; Restore original baudrate byte
;       CALL    IORESET ; Do an 8251 reset
;
;       MVI     B,3BH
;       LDA     OLDMODE ; Restore original mode byte
;       CALL    IORESET ; Do an 8251 reset
;
;--> Original code starts again with the following instruction:
;
;       JMP     0000H
;
;-----------------------------------------------------------------------
;
;
; E Q U A T E S
;
;
INTVEC  EQU     0EFFEH          ; Address of interrupt vector to first interrupt
                               ; Service routine
BDOS    EQU     0005H           ; Address of bdos entry point in first page of RAM
BIOS    EQU     0001H           ; Address of pointer to CP/M warm boot jump in BIOS
AJUMP   EQU     0C3H            ; JUMP instruction opcode
;
;
PORT    EQU     030H
DATPORT EQU     PORT            ; Modem data port
STPORT  EQU     PORT+1          ; Modem status port
;
;
;-----------------------------------------------------------------------
;
; Is there a carrier?  If not, return with the zero flag set.
;
MDCARCK:MVI     A,17H           ; Reset status
       OUT     STPORT
       IN      STPORT          ; Get status
       ANI     80H             ; Check for carrier detect
       RET
;.....
;
;
; This routine will turn off the serial card and hang up the phone.
;
MDINIT: MVI     A,10H           ; Clear DTR
       OUT     STPORT          ; Causing modem to hangup
       PUSH    B               ; Preserve in case we need it
       MVI     B,20            ; 2 seconds to drop DTR

OFFTI:  CALL    DELAY           ; 0.1 second delay
       DCR     B
       JNZ     OFFTI           ; Keep waiting until carrier drops
       POP     B               ; Restore BC
       MVI     A,17H           ; Raise DTR so that modem can answer the phone
       OUT     STPORT
;
        IF     IMODEM
       CALL    IMINIT          ; Initialize smartmodem
        ENDIF                  ; IMODEM
;
       RET
;.......
;
;
; Input a character from the modem.
;
MDINP:  IN      DATPORT         ; Get character
       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: IN      STPORT          ; Get status
       ANI     2               ; Got a character?
       RZ                      ; Return if none
       IN      STPORT          ; Get status again
       ANI     ERR             ; Check for framing and overrun
       JZ      MDINST1         ; No errors
       MVI     A,17H           ; Reset error flags
       OUT     STPORT
       XRA     A               ; Return false
       RET
;.....
;
;
MDINST1:ORI     0FFH            ; We have a character
       RET                     ; And return
;.....
;
;
; Send a character to the modem.
;
MDOUTP: OUT     DATPORT         ; Send it
       RET
;.....
;
;
; See if the output is ready for another character.
;
MDOUTST:IN      STPORT          ; Read port
       ANI     4               ; Mask crap
       RZ
       ORI     0FFH
       RET
;.....
;
;
; Re-initialize modem and hang up phone by dropping DTR and leaving
; modem inactive
;
MDQUIT:  IF     IMODEM
       CALL    IMQUIT
        ENDIF                  ; IMODEM
;
;
; Called by main BYE program after caller types BYE
;
MDSTOP: XRA     A               ; Turn off rts/dtr, rx/tx
       OUT     STPORT          ; Command byte to 8251 control port
       RET
;.....
;
;
; If you do not support a particular baud rate, put it here before
; SETINV:
;
SETINV: MVI     A,0FFH
       ORI     A               ; Make sure the Zero flag is not set
       RET
;.....
;
;
SET300: MVI     A,06H           ; Store baud rate parameter (300 baud)
       MVI     B,3CH
       JMP     SETBAUD
;
SET1200:MVI     A,08H           ; Store baud rate parameter (1200 baud)
       MVI     B,3CH
       JMP     SETBAUD
;
SET2400:MVI     A,0BH           ; Store baud rate parameter (2400 baud)
       MVI     B,3CH

SETBAUD:CALL    IORESET         ; Use extended BIOS function to reset baudrate
       XRA     A               ; Say baudrate change was satisfactory
       RET
;.....
;
;
IORESET:
;
; Subroutine which executes a master reset for 8251.  8251 reset is a
; BIOS function in VIXEN extended BIOS
;
;       ENTRY:
;       A       =       byte value to be replaced in BIOS
;                       (mode byte or baudrate byte)
;
;       B       =       hex displacement from base of BIOS
;                       for mode byte or baudrate byte
;                       (mode byte = 3BH)
;                       (baudrate byte = 3CH)
;
;       EXIT:
;       NONE
;
       LHLD    BIOS            ; Find base of BIOS
       MOV     L,B
       MOV     M,A
       MVI     L,36H           ; Displacement in BIOS for 8251 reset function
       SHLD    EXTFUN
       CALL    BIOSFUNC        ; Subroutine call of BIOS 8251 reset function
       RET
;.....
;
;
OLDIOB: DS      1               ; Original  IOBYTE
OLDMSC: DS      1               ; Original misc. control byte for 8155 port C
OLDVEC: DS      2               ; Original interrupt service vector
OLDMODE:DB      1               ; Original 8251 mode byte from BIOS
OLDBAUD:DB      1               ; Original baudrate byte for 8251 from BIOS
BIOSFUNC: DB    AJUMP           ; Absolute jump to the  following memory address
EXTFUN: DS      2               ; BIOS extended function address
;.....
;
;                              end
;-----------------------------------------------------------------------