; Title - Overlay file for MEXxx
;
REV     EQU     36      ; V 3.6
;
;
;This  Overlay  File  supports  the DEC Micro VT180 with CP/M.
;
;We  use the COMM-Port of the Micro's.  Baud-rates are "parallel"
;to the console Baud-rates - no need for  a  "special"  baud-rate
;routine.   Since  the COMM-port is I/O-wise Reader/Punch, we use
;the BDOS calls.
;
;To  test  for  COMM-status  ,  we  use  I/O  byte redirection in
;conjunction with direct BIOS-CONSTAT call.
;
;This  technique  although  a  little  bit slower than direct I/O
;using  Interrupt  on  INPUT  is  general  enough  to  be  system
;independent.
;
;       - B. Eiben DEC Large System Marketing Marlboro Mass
;
; And more or less bios version independant.--Bill Pechter
;
;***********************************************************************
;
;  5-Jun-1984   Adapted from M7VT-2.ASM by Bernie Eiben.
;   Rev 1.0
;  Stu Fuller
;
; 17-Mar-86     Version 3.4 removed ZCPR2/3 bit manipulation.  That will
; Bill Pechter  now be done by poke commands in Mex/Mexplus Ini.Mex.
;
; 22-Aug-86     Version 3.5 test to fix sendout.  Added test for status
; Bill Pechter  and RETJNK to avoid hanging.
;
; 29-Aug-86     Final Version 3.6 supports full Remote operation.
; Bill Pechter  Support for future versions from me not available
;               as they will be made specifically for my modified Robin.
;
;______________________________________________________________________________
;
;                       ZCPR2                   ZCPR3           ZCPR3 with RCP
;______________________________________________________________________________
;
; change contents       EA3CH                   EAFEH           E240H
; at this address
; to 64H from 74H to
; disable wordstar
; ^x^s cursor key
; translation.
;______________________________________________________________________________
;
; change contents       EA60H                   EB1CH           E31CH
; at this address to
; 01 from 05H to
; disable the
; automatic xoff-xon
; transmission.
;
;------------------------------------------------------------------------------
;
;bios code looks like this--example using ZCPR3 without RCP
;
;         Port#         Port control      data
;                       block
;
;contents:  41H         74H               00
;address   eafdH        eafeH             eaff
;
; QMRCVFL EQU     01H     ; Mask to allow me to send XON/XOFF
; QMXOFFD EQU     02H     ; Mask indicating I sent an XOFF
; QMXMTFL EQU     04H     ; Mask to allow other end to stop me
; QMSUSP  EQU     08H     ; Mask indicating I got an XOFF
; QMARROW EQU     10H     ; Mask for arrow xlate bit
; QMBIT7  EQU     20H     ; Mask for "use only 7 bits"
; QMCCFLS EQU     40H     ; Mask for "flush buffer if 2 ^C's seen"
; QM1STCC EQU     80H     ; Mask for "first ^C seen"
;
;NOTE:  DO NOT poke any bits with CP/M80 (STANDARD DEC DISTRIBUTION) or
;       MultiSystem 180 (by Ken Heyda)...poking of random bits would
;       be disasterous.
;
;****************************************************************************
;
;
TRUE:           EQU     0FFH
FALSE:          EQU     0
YES:            EQU     0FFH
NO:             EQU     0
;
BELL    EQU     07H             ;bell
TAB     EQU     9
CR      EQU     13              ;carriage return
LF      EQU     10              ;linefeed
ESC     EQU     1BH             ;escape
;
;
;
I8080   equ     yes
I8086   equ     no
CPM     equ     yes
PCDOS   equ     no
;
;
;
;       SET ONE (and only one) OF EACH SET OF THE FOLLOWING CONDITIONALS
;       DEPENDING ON VERSION OF SOFTWARE and CPU TYPE
;
;
;               Mex Type
;
MEXONE          EQU FALSE       ; version 1.10 through 1.14
MEXTWO          EQU TRUE        ; version 1.24 through 1.63 (MexPlus)
;
;

;
DAV     EQU     0FFH            ;bit(s) to test for ready
TBMT    EQU     0FFH            ;
;*****************************************************************************; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
;
; The Check for characters at COMM-Port using I/O redirection
;
IOBYTE  EQU     3               ; some definitions
;
;
DEFIO   EQU     95H             ;
BATIO   EQU     56H             ;
;
; MEX service processor stuff
;
MEX     EQU     0D00H           ;address of the service processor
INMDM   EQU     255             ;get char from port to A, CY=none in 100 ms
TIMER   EQU     254             ;delay 100ms * reg B
TMDINP  EQU     253             ;B=# secs to wait for char, cy=no char
CHEKCC  EQU     252             ;check for ^C from KBD, Z=present
SNDRDY  EQU     251             ;test for modem-send ready
RCVRDY  EQU     250             ;test for modem-receive ready
SNDCHR  EQU     249             ;send a character to the modem (after sndrdy)
RCVCHR  EQU     248             ;recv a char from modem (after rcvrdy)
LOOKUP  EQU     247             ;table search: see CMDTBL comments for info
PARSFN  EQU     246             ;parse filename from input stream
BDPARS  EQU     245             ;parse baud-rate from input stream
SBLANK  EQU     244             ;scan input stream to next non-blank
EVALA   EQU     243             ;evaluate numeric from input stream
LKAHED  EQU     242             ;get nxt char w/o removing from input
GNC     EQU     241             ;get char from input, cy=1 if none
ILP     EQU     240             ;inline print
DECOUT  EQU     239             ;decimal output
PRBAUD  EQU     238             ;print baud rate
;
PUNCH:  EQU     4               ;BDOS/MEX punch function
READER: EQU     3               ;BDOS/MEX reader function
PRINT   EQU     9               ;BDOS/MEX print-string function call
;
;
;
ORG     100H
;
IF MEXTWO
;
;  LINE BELOW ADDED FOR MEX V1.24 TO MAKE LOADABLE OVERLAY
;
DB      0C3H
;
;
;
;
       DS      2               ;(for  "JMP   START" instruction)
ENDIF;MEXTWO
;
IF MEXONE
;
       DS      3
;
;
ENDIF;MEXONE
;
; Change the clock speed to suit your system
;
PMMIMODEM:  DB  NO              ;yes=PMMI S-100 Modem                   103H
SMARTMODEM: DB  YES             ;yes=HAYES Smartmodem, no=non-PMMI      104H
TONE    DB      'P'             ;T=touch, P=pulse (Smartmodem-only)     105H
CLOCK:  DB      40              ;clock speed in MHz x10, 25.5 MHz max.  106H
                               ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
MSPEED: DB      5               ;0=110 1=300 2=450 3=600 4=710 5=1200   107H
                               ;6=2400 7=4800 8=9600 9=19200 default
                               ;set to 300 baud...
BYTDLY: DB      5               ;0=0 delay  1=10ms  5=50 ms - 9=90 ms   108H
                               ;default time to send character in ter-
                               ;minal mode file transfer for slow BBS.
CRDLY:  DB      5               ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
                               ;default time for extra wait after CRLF
                               ;in terminal mode file transfer
COLUMS: DB      5               ;number of DIR columns shown            10AH
SETFLG: DB      YES             ;yes=user-added Setup routine           10BH
SCRTST: DB      YES             ;Cursor control routine                 10CH
ACKNAK: DB      YES             ;yes=resend a record after any non-ACK  10DH
                               ;no=resend a record after a valid-NAK
BAKFLG: DB      YES             ;yes=change any file same name to .BAK  10EH
CRCDFL: DB      YES             ;yes=default to CRC checking            10FH
TOGCRC: DB      YES             ;yes=allow toggling of CRC to Checksum  110H
CVTBS:  DB      NO              ;yes=convert backspace to rub           111H
TOGLBK: DB      YES             ;yes=allow toggling of bksp to rub      112H
ADDLF:  DB      NO              ;no=no LF after CR to send file in      113H
                               ;terminal mode (added by remote echo)
TOGLF:  DB      YES             ;yes=allow toggling of LF after CR      114H
TRANLOGON:  DB  YES             ;yes=allow transmission of logon        115H
                               ;write logon sequence at location LOGON
SAVCCP: DB      YES             ;yes=do not overwrite CCP               116H
LOCONEXTCHR: DB NO              ;yes=local command if EXTCHR precedes   117H
                               ;no=external command if EXTCHR precedes
TOGGLELOC:      DB      YES             ;yes=allow toggling of LOCONEXTCHR      118H
LSTTST: DB      YES             ;yes=printer available on printer port  119H
XOFTST: DB      NO              ;yes=checks for XOFF from remote while  11AH
                               ;sending a file in terminal mode
XONWT:  DB      NO              ;yes=wait for XON after CR while        11BH
                               ;sending a file in terminal mode
TOGXOF: DB      YES             ;yes=allow toggling of XOFF checking    11CH
IGNCTL: DB      NO              ;yes=CTL-chars above ^M not displayed   11DH
EXTRA1: DB      0               ;for future expansion                   11EH
EXITCHR DB      'E'-40H         ;^E = Exit to main menu                 11FH
BRKCHR: DB      'B'-40H         ;^B = Send 300 ms. break tone           120H
NOCONN: DB      'N'-40H         ;^N = Disconnect from the phone line    121H
LOGCHR: DB      'L'-40H         ;^L = Send logon                        122H
LSTCHR: DB      'P'-40H         ;^P = Toggle printer                    123H
UNSAVE: DB      'R'-40H         ;^R = Close input text buffer           124H
TRNCHR: DB      'T'-40H         ;^T = Transmit file to remote           125H
SAVCHR: DB      'Y'-40H         ;^Y = Open input text buffer            126H
EXTCHR: DB      '^'-40H         ;^^ = Send next character               127H
       DS      2               ;unused by MEX                          128H
;
INCTL1: JMP     INSP            ;go input status port                   12AH
       DS      7
;
OTDATA: JMP     OUTDP           ;go output data port                    134H
       DS      7
;
INPORT: JMP     INDP            ;go input data port                     13EH
       DS      7
;
MASKR:  ANI     DAV     ! RET   ;bit to test for receive ready          148H
TESTR:  CPI     DAV     ! RET   ;value of rcv. bit when ready           14BH
; Note: most overlays will use ANI TBMT at MASKS.
; However, we don't bother with it here.  TESTS: will always return ready
MASKS:  MVI     A,TBMT  ! RET   ;bit to test for send ready             14EH
TESTS:  CPI     TBMT    ! RET   ;value of send bit when ready           151H
;
;
;
IF MEXTWO
;
DCDTST: JMP DCDVEC              ;DATA CARIER DETECT                     154H
RNGDET: JMP RNGVEC              ;RING DETECT VECTOR                     157H
DS      5
ENDIF;MEXTWO
;
;
IF MEXONE
;
DS      11
ENDIF;MEXONE
;
DIALV:  DS      3               ;DIALV not done here (maybe MXO-SM)     162H
SMDISC: DS      3               ; smartmodem overlay DISCV likewise
                               ; (dumb modem...now we do discon below)
DISCV:  JMP     DISCON          ;here's where we goto on DSC cmd.
GOODBV: JMP     GOODBY          ;                                       168H
INMODV: JMP     NITMOD          ;go to user written routine             16BH
       RET ! NOP ! NOP         ;NEWBDV                                 16EH
       RET ! NOP ! NOP         ;NOPARV                                 171H
       RET ! NOP ! NOP         ;PARITV                                 174H
SETUPV: JMP     SETCMD          ;                                       177H
       DS      3               ;not used by MEX                        17AH
VERSNV: JMP     SYSVER          ;                                       17DH
BREAKV: JMP     SBREAK          ;                                       180H
;
; Do not change the following six lines (they provide access to routines
; in MEX that are present to support MDM7 overlays -- they will likely
; be gone by MEX v2.0).
;
ILPRTV: DS      3               ;                                       183H
INBUFV  DS      3               ;                                       186H
ILCMPV: DS      3               ;                                       189H
INMDMV: DS      3               ;                                       18CH
       DS      3               ;                                       18FH
TIMERV  DS      3               ;                                       192H
;
;
;
; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
; SCRTEST to YES at 010AH (above).
;
;
CLREOS:         LXI     D,EOSMSG        ;                               195H
               MVI     C,PRINT
               CALL    MEX
               RET
;
CLS:            LXI     D,CLSMSG        ;                               19EH
               MVI     C,PRINT
               CALL    MEX
               RET
;
;       End of fixed areas
;
;.....

;
; LINE BELOW ADDED FOR MEX V1.24
;
IF MEXTWO
;
ORG 200H
;
;
ENDIF;MEXTWO
;
;
TELL:     MVI   C,ILP
         CALL  MEX             ;Print current baud rate
         DB    CR,LF,'Actual baud rate from Set-up B ',0
         MVI   C,ILP
         CALL  MEX
         DB    CR,LF,'Apparent Baud rate is now: ',0
         LDA   MSPEED
         MVI   C,PRBAUD
         CALL  MEX
         RET
;
;
;
; Modem I/O primitive
;
; Subroutine to output a character to the modem.
; This routine does it's own status checking.
;
OUTDP:  PUSH    B               ;save...
       PUSH    D               ;...the...
       PUSH    H               ;...registers.
       MOV     E,A             ;move output byte into E
       MVI     C,PUNCH         ;use the BDOS function
       CALL    MEX             ;go
       POP     H               ;restore...
       POP     D               ;...the...
       POP     B               ;...registers.
       RET
;.....
;
;
; Subroutine to input a character from the modem.
; This routine will not wait until one becomes available.
;
INDP:   CALL INSP
       JZ RETJNK
       PUSH    B               ;save...
       PUSH    D               ;...the...
       PUSH    H               ;...regesters.
       MVI     C,READER        ;use the BDOS function
       CALL    MEX             ;go
       POP     H               ;restore...
       POP     D               ;...the...
       POP     B               ;...registers.
       RET
;
;
RETJNK: MVI A,0                 ;Return junk if not ready
       RET                     ; so we don't hang
;
;
; The Check for characters at COMM Port using I/O redirection
;
INSP:   PUSH    B
       PUSH    D
       PUSH    H               ; save the environment
       MVI     A,BATIO         ; change I/O byte
       STA     IOBYTE
       CALL    BCONST          ; call BIOS direct - see NITMOD
       PUSH    A
       LDA     SAVEIO          ; change I/O byte back
       STA     IOBYTE
       POP     A
       POP     H               ; restore environment
       POP     D
       POP     B
       RET

;
NITMOD: LHLD    1               ; Get BIOS Jump-table adress
       LXI     D,3
       DAD     D               ; CONSTAT routine in BIOS
       SHLD    BCONST+1        ; modify our "routine"
       LDA     IOBYTE          ; Save I/O byte
       STA     SAVEIO          ;
;
;
SETCMD:   MVI   C,SBLANK        ;Any arguments?
         CALL  MEX
         JC    TELL            ;If not, go display baud
         LXI   D,CMDTBL
         MVI   C,LOOKUP
         CALL  MEX             ;Parse argument
         PUSH  H               ;Save any parsed argument addrs on stack
         RNC                   ;If we have one, return to it
         POP   H               ;Oops, input not found in table
         MVI   C,ILP
         CALL  MEX             ;Tell user input not valid
         DB    '++(Only 110,300,600,1200,2400,9600,19200 supported)++',CR,LF,0
         RET
;
CMDTBL:   DB    '11','0'+80H
         DW    OK110
         ;
         DB    '30','0'+80H
         DW    OK300
         ;
         DB    '60','0'+80H
         DW    OK600
         ;
         DB    '120','0'+80H
         DW    OK1200
         ;
         DB    '240','0'+80H
         DW    OK2400
         ;
         DB    '480','0'+80H
         DW    OK4800
         ;
         DB    '960','0'+80H
         DW    OK9600
         ;
         DB    '1920','0'+80H
         DW    OK19200
         ;
         DB    0
;
;
;
;
OK110     MVI   A,0
         JMP   LOADBD
;
OK300:    MVI   A,1
         JMP   LOADBD
;
OK600     MVI   A,3
         JMP   LOADBD
;
OK1200:   MVI   A,5
         JMP   LOADBD
;
OK2400:   MVI   A,6
         JMP   LOADBD
;
OK4800:   MVI   A,7
         JMP   LOADBD
;
OK9600:   MVI   A,8
         JMP   LOADBD
;
OK19200:  MVI   A,9
;
LOADBD:  STA MSPEED
        RET                    ; area for code to set actual baud rate
                               ; if overlay can be hacked to use
                               ; programmable port such as general purpose
                               ; port
;
NEWBAUD:  CPI   1
         JZ    OK300
         CPI   5
         JZ    OK1200
         CPI   6
         JZ    OK2400
         CPI   7
         JZ    OK4800
         CPI   8
         JZ    OK9600
         CPI   9
         JZ    OK19200
         RET
;
;
BCONST: JMP     $-$             ; address "filled in" by above cod
e
;
;
IF MEXTWO
;
;
DCDVEC:         IN 059H
               ;BIT 7,A     --Z80 only instruction
               DB 0CBH,07FH
               JNZ RETYES      ; THIS USES DSR TO DETECT CARRIER
               MVI  A,0
               RET             ; RETURN 0FFH IF CARRIER
                               ; RETURN 0 NO CARRIER
                               ; RETURN 0FFE IF OVERLAY DOESN'T KNOW

RNGVEC:         IN 088H
               ;BIT 3,A     --Z80 only instruction
               DB 0CBH,05FH
               JNZ RETYES      ;
               MVI  A,0
               RET             ; RETURN 0FFH IF RING DETECTED
                               ; RETURN 0 NO RING
                               ; RETURN 0FFE IF OVERLAY DOESN'T KNOW

RETYES:         MVI A,0FFH      ; YES YOU HAVE IT...
               RET
;
;
ENDIF;MEXTWO
;
SBREAK:
;pbausl EQU     90H     ;The Baud-Rate register.
prntst  EQU     49H     ;Printer
;prndat EQU     48H
contst  EQU     41H     ;Console
;condat EQU     40H
gentst  EQU     51H     ;General port.
;gendat EQU     50H
comtst  EQU     59H     ;COMM-Port
;comdat EQU     58H
;output EQU     01H     ;Output ready bit.
;input  EQU     02H     ;Input ready bit.
comctl  equ     59h             ;VT180 communications port
crtctl  equ     41h             ;VT180 crt port
;VT180 serial port command bits
txe     equ     1               ;transmit enable
dtr     equ     2               ;dtr on
rxe     equ     4               ;rx enable
sndbrk  equ     0Ah             ;dtr and break...
rerr    equ     10h             ;reset error
rts     equ     20h             ;RTS on
reset   equ     40h             ;port reset
NODTR   EQU     14H
;
;send break to comm port
;
       lxi     h,38500         ;250 ms(?)
       mvi     a,comctl        ;Get address of selected port
       mov     c,a             ;Into C
       mvi     a,sndbrk
;       OUT     C,A             ;Want to send to port addressed by C
       db      0EDH,079H       ;Op code for above instruction
sndbrk1:dcx     h               ;timing loop...
       mov     a,l
       ora     h
       jnz     sndbrk1          ;...until over
       mvi     a,comctl        ;Get the address for the port
       mov     c,a             ;Into C
       mvi     a,txe+dtr+rxe+rerr+rts  ;enable tr/rc, dtr, reset error
;       out     c,a             ;Z-80 only instruction
       db      0EDH,079H       ;Op code for above instruction
       out     contst          ;reset ports
       ret

;
; DISCONNECT ROUTINE
;
DISCON: lxi     h,38500         ;250 ms(?)
       mvi     a,comctl        ;Get address of selected port
       mov     c,a             ;Into C
       mvi     a,NODTR
;       OUT     C,A             ;Want to send to port addressed by C
       db      0EDH,079H       ;Op code for above instruction
DISCON1:dcx     h               ;timing loop...
       mov     a,l
       ora     h
       jnz     DISCON1          ;...until over
       mvi     a,comctl        ;Get the address for the port
       mov     c,a             ;Into C
       mvi     a,txe+dtr+rxe+rerr+rts  ;enable tr/rc, dtr, reset error
;       out     c,a             ;Z-80 only instruction
       db      0EDH,079H       ;Op code for above instruction
       out     contst          ;reset ports
       RET
;
;
;
GOODBY: RET
;
;
SYSVER: PUSH    B
       PUSH    D
       PUSH    H
       LXI     D,DECMSG
       MVI     C,PRINT
       CALL    MEX
SYSVE1: LXI     D,CRLF
       MVI     C,PRINT
       CALL    MEX
       POP     H
       POP     D
       POP     B
       RET
;
;       Miscellaneous storage
;
SAVEIO: DB      0               ; Save the original IObyte here
;
;       Various text messages
CLSMSG: DB      ESC,'[2J',ESC,'[H','$'
EOSMSG: DB      ESC,'[0J','$'
;
XSO     EQU     14                      ;"shift out" character
XSI     EQU     15                      ;"shift in" character
;
DECMSG: DB      'Version for: ',ESC,'[7m',ESC,')0'
       DB      'd',XSO,'x',XSI
       DB      'i',XSO,'x',XSI
       DB      'g',XSO,'x',XSI
       DB      'i',XSO,'x',XSI
       DB      't',XSO,'x',XSI
       DB      'a',XSO,'x',XSI
       DB      'l',ESC,'[m '
       DB      'Robin--VT180'
       DB      '  Overlay V'
       DB      REV/10+'0'
       DB      '.'
       DB      REV MOD 10+'0'
       DB      '$'
;
CRLF:   DB      CR,LF,'$'
;
;
;
OVREND: EQU     $               ; See if it'll fit
       IF OVREND / 0B00H
       +++ VT180 OVERLAY TOO LARGE - OVREND >= 0B00H +++
       ENDIF
;
;
       END