; NUOV-1.INS - Osborne Vixen insert for NUBYE - 04/21/86 ; ; This is for the Osborne Vixen (8251A I/O with extended BIOS jump for ; setting baudrate). The normal serial input interrupt driver in BIOS ; is disabled while NUBYE is used. ; ; Note: This is an insert, not an overlay. ; ; ======== ; ; 04/21/86 Modified for NUBYE ; 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 obtain 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 0FH ; 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 0" 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 30H ; 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 0 ; ; ---------- ; ; EQUATES ; INTVEC EQU 0EFFEH ; Address of interrupt vector to first ; interrupt service routine BDOS EQU 5 ; Address of bdos entry point in first ; page of RAM BIOS EQU 1 ; Address of pointer to CP/M warm boot ; jump in BIOS AJUMP EQU 0C3H ; JUMP instruction opcode ; PORT EQU 30H 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 NUBYE 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,6 ; Store baud rate parameter (300 baud) MVI B,3CH JMP SETBAUD ; SET1200:MVI A,8 ; 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 ; ; 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 ; IORESET: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 of insert ; -------------