home *** CD-ROM | disk | FTP | other *** search
-
- ; B5MH-3.INS - BYE5 insert for Morrow MD5, MD11, MD16, MD34 - 10/10/85
- ;
- ; Z80 SIO
- ;
- ; This is an insert, not an overlay
- ;
- ; This insert adapts the Morrow computers using hard disk and CP/M+
- ; with banked memory to BYE5.
- ;
- ;
- ;= = = = = = = = = = = = = = = = = =
- ;
- ; 10/10/85 Reorganized and simplified. - Ed Meyer
- ; B5MH-3
- ;
- ; 08/25/85 Fixed BUG in the Morrow BIOS INTER-BANK routine.
- ; B5MH-2 - Paul Bartholomew
- ;
- ; 08/17/85 Updated for compatibility with BYE501.
- ; B5MH-1 - George Peace
- ;
- ;= = = = = = = = = = = = = = = = = =
- ;
- ;
- ; To get this to work correctly with a Morrow MD-HD, you must use the
- ; following cable configuration:
- ;
- ; Modem End Morrow MD-HD End
- ; ========= ================
- ; GND 1 <--------> 1 GND - ground
- ; TD 2 --------> 3 RD - receive data
- ; RD 3 <-------- 2 TD - transmit data
- ; SG 7 <--------> 7 SG - signal ground
- ; CD 8 --------> 4 CD - carrier detect
- ; DTR 20 <-------- 5 DTR - data terminal ready
- ;
- ;
- ; Depending on the setting of the jumpers inside your computer, pins 2
- ; and 3 may or may not need to be crossed.
- ;
- ; MAKE SURE THE JUMPERS INSIDE THE MORROW ARE SET TO FACTORY SETTINGS.
- ; (See Appendix D, figures D-5 and D-6 of the MD-11 users guide)
- ;
- ; NOTE: The CD (Carrier Detect) line is connected the Morrow pin 4 (RTS
- ; on most computers, while usually pin 8 is carrier detect.)
- ;
- ;-----------------------------------------------------------------------
- ;
- ;
- ; Set ONE of the following to YES, the other to NO
- ;
- PMPORT EQU NO ; Yes, using "Printer/Modem" port
- AUXPORT EQU YES ; Yes, using "Auxilliary" port
- ;
- PORT EQU 060H ; Port for local console output
- CONST EQU PORT+1 ; Local console status
- ;
- ;
- IF PMPORT
- BPORT EQU 062H
- BAUDS EQU 051H
- MODEW EQU 07EH
- ENDIF ; PMPORT
-
- IF AUXPORT
- BPORT EQU 070H
- BAUDS EQU 050H
- MODEW EQU 03EH
- ENDIF ; AUXPORT
- ;
- ;
- ; The following define the port addresses to use.
- ;
- DPORT EQU BPORT ; Data port
- MDCTL1 EQU BPORT+1 ; Status/control port
- BRPORT EQU 053H
- ;
- ;
- ; The following are MDCTL1 status masks
- ;
- MDRCV EQU 1 ; Data available
- MDSND EQU 4 ; Transmit buffer empty
- DCD EQU 8 ; Data carrier detect
- ;
- ;-----------------------------------------------------------------------
- ;
- ;
- ; See if we still have a carrier - if not, return with the zero flag set
- ;
- MDCARCK:MVI A,10H ; Reset status
- OUT MDCTL1
- IN MDCTL1 ; Get status
- ANI DCD ; Check for data carrier
- RET ; Return
- ;.....
- ;
- ;
- ; Disconnect and wait for an incoming call
- ;
- MDINIT: MVI A,18H ; Reset channel
- OUT MDCTL1
- MVI A,4 ; Setup to write register 4
- OUT MDCTL1
- MVI A,44H ; No parity, 1 stop, 16x
- OUT MDCTL1
- MVI A,1 ; Setup to write register 1
- OUT MDCTL1
- MVI A,0
- OUT MDCTL1
- MVI A,5 ; Setup to write register 5
- OUT MDCTL1
- MVI A,0 ; DTR, RTS both off
- OUT MDCTL1
- PUSH B ; Save in case it's being used elsewhere
- MVI B,20 ; 2 second delay
- ;
- OFFTI: CALL DELAY ; 0.1 second delay
- DCR B
- JNZ OFFTI ; Keep looping until finished
- POP B ; Restore bc
- MVI A,3 ; Setup to write register 3
- OUT MDCTL1
- MVI A,0C1H ; 8 bits, enable receive
- OUT MDCTL1
- MVI A,5 ; Setup to write register 5
- OUT MDCTL1
- MVI A,0EAH ; DTR, RTS, TX on, 8 bits
- OUT MDCTL1
-
- IF IMODEM ; If using intelligent modem
- CALL IMINIT ; Go initialize modem now
- ENDIF ; IMODEM
- ;
- RET ; Return
- ;.....
- ;
- ;
- ; Input a character from the modem port
- ;
- MDINP:
- IN DPORT ; Get character
- RET ; Return
- ;.....
- ;
- ;
- ; Check the status 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 MDCTL1 ; Get status
- ANI MDRCV ; Got a character?
- RZ ; Return if none
- ORI 0FFH ; Otherwise, set the proper flag
- RET ; And return
- ;.....
- ;
- ;
- ; Send a character to the modem
- ;
- MDOUTP: OUT DPORT ; Send it
- RET ; Return
- ;.....
- ;
- ;
- ; See if the output is ready for another character
- ;
- MDOUTST:
- IN MDCTL1
- ANI MDSND ; Mask it
- RET ; Return
- ;.....
- ;
- ;
- ; Reinitialize the modem and hang up the phone by dropping DTR and
- ; leaving it inactive.
- ;
- MDQUIT: IF IMODEM ; If using an intelligent modem
- CALL IMQUIT ; Tell it to shut down
- ENDIF ; IMODEM
- ;
- ;
- ; Called by the main program after caller types BYE.
- ;
- MDSTOP: MVI A,5 ; Setup to write register 5
- OUT MDCTL1
- MVI A,0 ; Clear DTR, RTS causing shutdown
- OUT MDCTL1
- RET
- ;.....
- ;
- ;
- ; The following routine sets the baudrate. BYE5 asks for the maximum
- ; speed you have available.
- ;
- SETINV: MVI A,0FFH
- ORA A ; Make sure the zero flag is set
- RET
- ;.....
- ;
- ;
- SET300: LXI H,BD300
- JMP SETBAUD
- ;.....
- ;
- ;
- SET1200:LXI H,BD1200
- JMP SETBAUD
- ;.....
- ;
- ;
- SET2400:LXI H,BD2400
- JMP SETBAUD
- ;.....
- ;
- ;
- SETBAUD:MVI A,MODEW
- OUT BRPORT
- MOV A,M
- OUT BAUDS
- INX H
- MOV A,M
- OUT BAUDS
- XRA A ; Say rate is ok
- RET ; Return
- ;.....
- ;
- ;
- ; The following are baud rates for BPORT -- they will have to be changed
- ; for your particular CTC.
- ;
- BD300: DW 832
- BD1200:DW 208
- BD2400:DW 104
- BD9600:DW 26
-
-
- ;.....
- ;
- ;
- ;Find address of INTER-BANK BUG in Morrow's BIOS
- ;
- FINDBUG:LDA FNDBUG ; See if we already found the address
- ORA A
- JZ FBUG0 ; No, go find it
- LHLD BUGADR ; Yes, return with address
- RET
- ;.....
- ;
- ;
- FBUG0: LHLD 1
- INX H
- MOV E,M
- INX H
- MOV D,M
- XCHG ; Hl points to warm boot code
- ;
- ;
- ; The warm boot in common memory is as follows:
- ;
- ; loc opcodes mneumonics
- ; ---- ------- --------------------
- ; xxxx 21 yyyy LD HL,BNK-WBOOT ;WARM BOOT code in SYSTEM bank
- ; xxxx 18 zz JR INTER-BANK
- ;
- ; We will find the address of INTER-BANK and modify it to fix the BUG.
- ;
- ; The INTER-BANK code in COMMON memory is as follows:
- ;
- ; loc opcodes mneumonics
- ; ---- ------- --------------------
- ; xxxx 3A yyyy LD A,(SYSMTE-BANK-BITS)
- ; xxxx CB 47 BIT 0,A ;Should be BIT 1,A (CB 4F)
- ;
- ;
- ;
- FBUG1: MOV A,M
- CPI 18H ; Look for JR to INTER-BANK
- JZ FBUG2
- INX H
- JMP FBUG1
- ;
- FBUG2: INX H
- MOV A,M ; Get JR offset
- INX H
- MOV E,A
- MVI D,0
- DAD D ; HL now points to INTER-BANK
- ;
- FBUG3: MOV A,M
- CPI 0CBH ; Look for bit opcode
- JZ FBUG4
- INX H
- JMP FBUG3
- ;
- FBUG4: INX H
- SHLD BUGADR
- MVI A,0FFH
- STA FNDBUG
- RET
- ;.....
- ;
- ;
- FNDBUG: DB 0
- BUGADR: DW 0
- BUGVAL: DB 0
- ;.....
- ;
- ;
- ; Perform system or hardware dependent PRE-processing. The following
- ; code will be executed by the PATCH subroutine before the BIOS jump
- ; table is overwritten. This will allow the BIOS intercept routines to
- ; operate as early as the initial signon message display.
- ;
- MDPREP: CALL FINDBUG ; Get address of BIOS bug
- MOV A,M
- STA BUGVAL ; Save old value
- MVI M,04FH ; Change the bit 0,A to a bit 1,A
- ;
- ;
- ; OK, the BIOS BUG is now fixed.
- ;
- ;
- ; Replace the NEWJTBL BIOS routing table with our own
- ;
- ;
- LXI H,JTBLNEW ; Get replacement table address
- LXI D,NEWJTBL ; Get address to overwrite
- LXI B,JTBLEN ; Get number of bytes to overwrite
- DB 0EDH,0B0H ; Move the jump table
- ;
- ;
- ; Move the BIOS intercept routines up to common memory
- ;
- LXI H,STCOMN ; Start of interface routines
- LXI D,COMMN ; Address in high memory to load them
- LXI B,COMLEN ; Length of common code
- DB 0EDH,0B0H ; Move the code to common memory
- RET
- ;.....
- ;
- ;
- ; Perform system or hardware dependent POST-processing. The following
- ; code will be executed by the EXCPM routine before returning control to
- ; CP/M Plus when the BYE5 program is terminated.
- ;
- MDPOSP: CALL FINDBUG ; Get address of BIOS bug
- LDA BUGVAL ; Get old value
- MOV M,A ; Un-fix the BIOS bug (make it a bit 0)
- RET
- ;.....
- ;
- ;
- ; The following code is required for proper operation on the Morrow
- ; MD-HD. As the MD-HD operates in a banked environment, BIOS calls MAT
- ; originate in any bank (0 or 1). It is therefore possible that window
- ; 1 (where BYE5 resides) will not be selected at the time a BIOS call is
- ; made. As a result, steps must be taken to be sure that the BIOS jump
- ; table does not direct a BIOS call into bank 1 unless that bank is
- ; selected. This code is moved up to common memory where it will be
- ; visible to all banks. For each of the intercepted BIOS calls, it will:
- ;
- ; - save the caller's stack pointer
- ; - save the caller's bank select mask
- ; - switch to bank 1
- ; - execute the BYE interface routine and then the
- ; original BIOS routine as necessary
- ; - recover the caller's stack pointer
- ; - reset the bank select mask to that of the caller
- ; - return control to the caller
- ;
- ;
- ;NOTE: With Morrow MD-HD computers (BIOS <= 2.0), the free common memory
- ; is from FF48H to FFA9H (97 bytes). Make sure COMLEN is <= 61H!
- ;
- ; All other common RAM is used by BIOS for stacks and interrupts.
- ;
- ;
- COMMN EQU 0FF48H ; Address for unmodified bios <= 2.0
- ;
- SXBIOS EQU 0F885H ; Address of stack for BIOS intercepts
- ;
- PNTSELM EQU 0FE51H+1 ; Pointer to SELMEN JMP +1
- ;
- BNKSTB EQU 41H ; Bank select port
- ;
- STCOMN EQU $
- ;
- WBCOMN EQU COMMN+($-STCOMN) ; Warm boot
- CALL SWIN
- JMP MBOOT
- ;.....
- ;
- ;
- CSCOMN EQU COMMN+($-STCOMN) ; Console status
- CALL SWIN
- CALL MSTAT
- JMP SWOUT
- ;....
- ;
- ;
- CICOMN EQU COMMN+($-STCOMN) ; Console input
- CALL SWIN
- CALL MINPUT
- JMP SWOUT
- ;.....
- ;
- ;
- COCOMN EQU COMMN+($-STCOMN) ; Console output
- CALL SWIN
- CALL MOUTPUT
- JMP SWOUT
- ;.....
- ;
- ;
- SWIN EQU COMMN+($-STCOMN) ; Bank switch in routine
- ; Destroys register HL,A
- POP H ; Get return address
- DB 0EDH,073H
- DW SXSAVE
- LXI SP,SXBIOS ; Load new stack pointer in common
- PUSH H
- CALL FNDSBB ; HL=address of SYSTEM-BANK-BITS
- MOV A,M
- RRC ; Bank # in bit 1, move to bit 0
- ANI 1 ; A now has the current bank in it
- POP H
- PUSH PSW ; Save it for return from BIOS
- MVI A,1 ; Get bank 1 mask
- CALL SELMEM
- PUSH H ; Put return address on new stack
- RET
- ;.....
- ;
- ;
- SWOUT EQU COMMN+($-STCOMN) ; Bank switch out routine
- MOV H,A ; Save A reg. (for console input call)
- POP PSW ; Retrieve caller's bank selection mask
- DB 0EDH,07BH
- DW SXSAVE
- CALL SELMEM
- MOV A,H ; Restore A reg. (for console input call)
- RET
- ;.....
- ;
- ;
- SELMEM EQU COMMN+($-STCOMN)
- PUSH H
- LHLD PNTSELM
- CALL MYPC
- POP H
- RET
- ;.....
- ;
- ;
- MYPC EQU COMMN+($-STCOMN)
- PCHL
- ;.....
- ;
- ;
- FNDSBB EQU COMMN+($-STCOMN) ; Point HL to SYSMTE-BANK-BITS
- PUSH D
- LHLD PNTSELM
- INX H
- INX H
- MOV E,M
- INX H
- MOV D,M ; DE points to SYSTEM-BANK-BITS
- XCHG
- POP D
- RET
- ;.....
- ;
- ;
- SXSAVE EQU COMMN+($-STCOMN)
- DS 2 ; Save area for caller's stack pointer
- ;
- COMLEN EQU $-STCOMN ; Length of common memory interface code
- ;
- JTBLNEW:
- JMP MCBOOT ; Cold boot
- JMP WBCOMN ; Warm boot
- JMP CSCOMN ; Modem status test
- JMP CICOMN ; Modem input routine
- JMP COCOMN ; Modem output routine
- ;
- IF (NOT HARDLOG) AND (NOT PRINTER)
- JMP COCOMN ; Modem list device
- JMP COCOMN ; Modem punch device
- JMP CICOMN ; Modem reader device
- ENDIF ; (NOT HARDLOG) AND (NOT PRINTER)
- ;
- JTBLEN EQU $-JTBLNEW
- ;
- ; end
- ;----------------------------------------------------------------------