home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
NUBYE
/
NUBY-INS.LBR
/
NUOV-1.IQS
/
nuov-1.ins
Wrap
Text File
|
1986-04-26
|
7KB
|
273 lines
; 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
; -------------