; B5EQ-3.ASM - Insight Enterprises EQ-4 insert to BYE5 - 02/21/86
;
;               Z80 DART and 8116 baud rate generator
;
; This insert adapts BYE5 to the Insight Enterprises EQ-4 computer.
; USING THE Z80 DART AND SMC 8116 BAUD RATE GENERATOR.
;
;
;            Note:  This is an insert, not an overlay
;
;=   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; 02/21/86 - Modified for BIOS version 2.1      - Tom Morris
; 09/13/85 - Corrected typos and masked interrupts during MDINIT
;                                               - Chris Taylor
; 09/07/85 - First version of this file         - Chris Taylor
;
;=   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; Change the following information to match your equipment
;
PORT    EQU     38H             ; Port modem is on
BRPORT  EQU     37H             ; Baud rate generator port
MDCTL1  EQU     PORT+1          ; Modem control port
MDDATP  EQU     PORT            ; Modem data in port
;
CON96   EQU     14*16           ; Console baudrate is 9600
A300    EQU     5               ; Modem (DART Pair 'A') 300 baud
A1200   EQU     7               ; 1200 bps
A2400   EQU     10              ; 2400 bps
;
;
;-----------------------------------------------------------------------
;
;
; Check for carrier.  If not, return with zero flag set
;
MDCARCK:MVI     A,10H           ; RESET status
       OUT     MDCTL1
       IN      MDCTL1          ; Get status
       ANI     8               ; Check for carrier
       RET
;.....
;
;
; Disconnect and wait for an incoming call
;
MDINIT: DI                      ; Allow no interrupts during setup
       MVI     A,0             ; Setup to write register 0
       OUT     MDCTL1
       MVI     A,18H           ; Channel reset
       OUT     MDCTL1
       CALL    NODTRX          ; Set 8bit, no parity and no DTR
       MVI     A,1             ; Set for WR1
       OUT     MDCTL1
       XRA     A               ; Allow no interrupts from this DART
       OUT     MDCTL1
       EI                      ; CONTINUE
       PUSH    B
       MVI     B,20            ; 2 second delay to drop any carrier
;
OFFTI:  CALL    DELAY
       DCR     B
       JNZ     OFFTI           ; Loop until 2 seconds have elapsed
       POP     B               ; Restore 'BC' pair
       MVI     A,5             ; Write register 5
       OUT     MDCTL1
       MVI     A,0EAH          ; Turn DTR back on
       OUT     MDCTL1
;
        IF     IMODEM          ; If using intelligent modem
       CALL    IMINIT
        ENDIF
;
       RET
;.....
;
;
; Input a character from the modem
;
MDINP:  IN      PORT            ; Get a character
       RET
;.....
;
;
MDINST: IN      MDCTL1          ; In modem control port
       ANI     1               ; Character waiting
       RZ                      ; Return if none
       ORI     0FFH            ; Otherwise set the proper flag
       RET
;.....
;
;
; Send a character to the modem
;
MDOUTP: OUT     PORT
       RET
;.....
;
;
; See if output is ready for next character
;
MDOUTST:IN      MDCTL1          ; Get status
       ANI     4               ; Ready?
       RET
;.....
;
;
; Re-initialize modem and hang up the phone
;
MDQUIT:  IF     IMODEM
       CALL    IMQUIT
        ENDIF
;
;
; Called by BYE main to turn off DTR
;
MDSTOP: MVI     A,5             ; Write register 5
       OUT     MDCTL1
       MVI     A,0             ; Turn off DTR
       OUT     MDCTL1
       RET
;.....
;
;
; This routine returns a 255 because we are unable to support the
; requested baud rate on this hardware.
;
SETINV: ORI     0FFH
       RET
;.....
;
;
SET300: MVI     A,(CON96+A300)
       JMP     SETBAUD
;
SET1200:MVI     A,(CON96+A1200)
       JMP     SETBAUD
;
SET2400:MVI     A,(CON96+A2400)
;
SETBAUD:OUT     BRPORT          ; Set requested baud rate
       XRA     A               ; Say baud rate is OK
       RET
;.....
;
;
NODTRX: LXI     H,DO8NOP
       CALL    BLOCK$OUTPUT
       RET
;.....
;
;
; HL points to block to output
;
BLOCK$OUTPUT:
       MVI     B,6             ; Get count
       MVI     C,MDCTL1        ; Get port
       DB      0EDH,0B3H       ; THIS IS THE Z80 OUTIR INSTRUCTION
       RET                     ; Return
;.....
;
;
DO8NOP: DB      3,0C1H          ; 8bit, recv enable
       DB      4,44H           ; X16, 1 stop, no parity
       DB      5,0             ; Turn DTR off
;.....
;
;
; Perform system and hardware dependent PRE-processing.  This routine is
; executed by the PATCH subroutine before the BIOS jump table is over-
; written, allowing BIOS intercept to operate as close to the initial
; signon display.
;
MDPREP: LXI     H,JTBLNEW       ; Get replacement table address
       LXI     D,NEWJTBL       ; Address to overwrite
       LXI     B,JTBLEN        ; Number of bytes to overwrite
       DB      0EDH,0B0H       ; THIS IS THE Z80 LDIR INSTRUCTION
;
;
; Move the BIOS intercept routines into common memory
;
       LXI     H,STCOMN        ; Start of interface routines
       LXI     D,COMMN         ; Where in high memory to load
       LXI     B,COMLEN        ; Length of common code
       DB      0EDH,0B0H       ; THIS IS THE Z80 LDIR INSTRUCTION
;
;
; Get the BDOS base page and complete the SXBIOS replacement stack ad-
; dress.  We are using the BDOS copyright notice as a stack since BDOS
; is in common and the copyright notice is sufficient length for a stack.
;
       LDA     BDOSBASE
       STA     SXBIOS+1        ; Finish up the replacement stack adrs
       RET
;.....
;
;
; SYSTEM/HARDWARE DEPENDENT POST-PROCESSING ROUTINE
;
; This routine is executed by the EXCPM routine before returning control
; to CP/M Plus when BYE5 terminates.
;
MDPOSP: RET
;.....
;
;
; The EQ4 operates in a banked environment.  BIOS calls may originate in
; any bank (0,1,2,or 3).  It is possible for bank 1 (where BYE resides)
; to be out of context (not selected) when a BIOS call is made.  Steps
; must be taken to be sure the BIOS jump table does NOT direct a BIOS
; call into bank 1 unless bank 1 is in context.  The following code will
; be moved into common memory where it is free to intercept BIOS calls
; from any bank.
;
; This code does the following:
;
;       - Save the caller's stack pointer
;       - Save the callers bank pointer
;       - Switch to bank 1
;       - Execute the BYE interface routine
;       - Execute the original BIOS routine as needed
;       - Recover caller's stack pointer
;       - Reset the memory bank to that of the caller
;       - Return control to the caller
;
;
;       The BDOS Copyright notice is used for the BIOS replacement stack.
;
;-----------------------------------------------------------------------
;
;NOTE:  These addresses apply for EQ-4CBIOS rev 2.1A ONLY
;       Be sure to GENCPM with TOP PAGE of MEMORY set to 0FEH
;
@CBNK:  EQU     0FCDCH          ; address of current bank byte
BNKSEL: EQU     0FC82H          ; entry point of BIOS bank select (SELMEM)
COMMN:  EQU     0FF00H          ; spare memory goes to 0FFF7
;                               ;  (0FFF8-0FFFF is used for system communication)
;.....
;
;
BANK1   EQU     1               ; Bank 1 mask
;
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
       POP     H               ; Get return address
       DB      0EDH,073H
       DW      SXSAVE
       DB      0EDH,07BH
       DW      SXBIOS
       LDA     @CBNK           ; Get current bank from system
       STA     RTBNK           ; Remember for switch back
       MVI     A,1             ; Gonna switch to bank 1
       CALL    BNKSEL          ; Do it
       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)
       DB      0EDH,07BH
       DW      SXSAVE
       LDA     RTBNK           ; Return to the bank
       CALL    BNKSEL
       MOV     A,H             ; Restore a reg
       RET
;.....
;
;
SXSAVE  EQU     COMMN+($-STCOMN)
       DS      2               ; Save area for caller's stack pointer
;
SXBIOS  EQU     COMMN+($-STCOMN)
       DW      0085H           ; End of copyright notice is bdos+85h
;
RTBNK   EQU     COMMN+($-STCOMN)
       DS      1
;
COMLEN  EQU     $-STCOMN        ; Length of common memory interface code
;
        IF     COMLEN > 00F7H
       FAIL    COMMON MEMORY CODE SEGMENT IS TOO LARGE
        ENDIF
;.....
;
;
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
;.....
;
;
;-----------------------------------------------------------------------
;
; Here is some nice-to-know stuff for selecting the baud rate value for
; CON96, A300, A1200, and A2400
;
; DART pair     A / B
;
;SPEED$T
;       DB      0,0*16          ; 50 baud
;       DB      1,1*16          ; 75 baud
;       DB      2,2*16          ; 110 baud
;       DB      3,3*16          ; 134 baud
;       DB      4,4*16          ; 150 baud
;       DB      5,5*16          ; 300 baud
;       DB      6,6*16          ; 600 baud
;       DB      7,7*16          ; 1200 bps
;       DB      8,8*16          ; 1800 baud
;       DB      9,9*16          ; 2000 bps ( not supported )
;       DB      10,10*16        ; 2400 bps
;       DB      11,11*16        ; 3600 bps
;       DB      12,12*16        ; 4800 bps
;       DB      13,13*16        ; 7200 bps
;       DB      14,14*16        ; 9600 bps
;       DB      15,15*16        ; 19200 bps
;.....
;
;
;                              end
;-----------------------------------------------------------------------