home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
bye3
/
b3ov-2.ins
< prev
next >
Wrap
Text File
|
1994-07-13
|
10KB
|
327 lines
; B3OV-1.INS - Osborne Vixen insert for BYE3 - 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 BYE3 is used.
;
;
; * * * * * * * * * * * * * * * * * * * * * * * *
;
; 07/30/85 Restored to original format - pst
; 06/15/85 Written for use with BYE3 - Roy Robinson
;
; * * * * * * * * * * * * * * * * * * * * * * * *
;
;-----------------------------------------------------------------------
; PATCH #1 -------------------------------------------------------------
;-----------------------------------------------------------------------
;
; Listed below is a patch for disabling the serial input interrupt
; driver in the Vixen BIOS. This patch goes AFTER the label
; "START1" and immediately AFTER the line of code, CALL MDCARCK
; This patch is in the BYE source code.
;
; ----> 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:
; JNZ GOODBY
; original code continues here
;
;=======================================================================
;
;-----------------------------------------------------------------------
; 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 in the BYE source code.
;
;--> 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 in first page of RAM
BIOS EQU 0001H ; Address of 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
;
; Modem status port equates
;
; The following are STPORT AND TSTPORT commands
;
OFFINS EQU 00010000B ; Drop DTR and disable RCV/XMT
ONINS EQU 00010111B ; Reset flags, send DTR, enable RX and TX
RSTINS EQU 00010111B ; Reset USART and send DTR
;
; The following are STPORT status masks
;
DAV: EQU 00000010B ; Data available - rda
TRDY: EQU 00000100B ; Transmit buffer empty - tbe
DSR: EQU 10000000B ; Data carrier detect - use DSR
PE: EQU 00001000B ; Parity error - register 1
OE: EQU 00010000B ; Overrun error - register 1
FE: EQU 00100000B ; Framing error - register 1
ERR: EQU PE+OE+FE ; Parity, overrun and framing errors
;
;-----------------------------------------------------------------------
;
; The following is a routine that will check to make sure we still have
; carrier. If there is no carrier, it will return with the Zero flag
; set.
;
MDCARCK:MVI A,ONINS ; Reset status
OUT STPORT
IN STPORT ; Get status
ANI DSR ; Check for carrier detect
RET
;
; This routine should turn off everything on the modem, and get it ready
; to wait for a ring. (Also hang it up.)
;
MDINIT: MVI A,OFFINS ; 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,ONINS ; Raise DTR so that modem can answer the phone
OUT STPORT
;
IF IMODEM
CALL IMINIT ; Initialize smartmodem
ENDIF ; IMODEM
;
RET
;
; The following is a routine that will input one character from the
; modem port. If there is nothing there, it will return garbage... so
; use the MDINST routine first.
;
MDINP: IN DATPORT ; Get character
RET
;
; The following is a routine to determine if there is a character wait-
; ing to be received. If there are none, the Zero flag will be set,
; otherwise, 0FFH will be returned in register A. Remember that the
; system will like you a little more if you also mask out framing,
; parity, and overrun errors.
;
MDINST: IN STPORT ; Get status
ANI DAV ; 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,ONINS ; Reset error flags
OUT STPORT
XRA A ; Return false
RET
;
MDINST1:ORI 0FFH ; We have a character
RET ; And return
;
; The following is a routine to determine if the transmit buffer is
; empty. If it is empty, it will return with the Zero flag clear. If
; the transmitter is busy, then it will return with the Zero flag set.
;
MDOUTST:IN STPORT ; Read port
ANI TRDY ; Mask crap
RZ
ORI 0FFH
RET
;
; The following is a routine that will output one character in register
; A to the modem. REMEMBER, that is register A, not register C.
;
; **** Use MDOUTST first to see if buffer is empty ****
;
MDOUTP: OUT DATPORT ; Send it
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
;
; These next routines set the proper baud rates for the modem. If you
; do not support the particular rate, then simply put in a JMP to SETINV.
; If the baud rate change was successful, make SURE the zero flag is set.
;
; The following routine returns a 255 because we were not able to set to
; the proper baud rate because either the serial port or the modem can
; not handle it.
;
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
;-----------------------------------------------------------------------
~~~
; 06/15/85 Written for use with BYE3 - Roy Robinson
; FOG RCPM #4
; (415) 591-6259