;MXO-VT10.ASM - Overlay file for MEXxx
;
REV     EQU     11      ;V 1.0	
;
;This  overlay file supports the DEC Micro VT180 running  CP/M  or 
;Bernie Eiben's implementation of ZCPR2.
;
;We use the COMM Port of the VT180.   Baud rates are set from the 
;VT100 keyboard and stored in the VT100's nonvolatile RAM.   There 
;is  no  need for  a  "special"  baud-rate routine.    Since   the 
;COMM port is referred to RDR:  and PUN:,  we use MEX calls (which 
;in turn calls the BDOS).
;
;To test for COMM status, we use IObyte redirection in conjunction 
;with direct BIOS CONSTAT call.
;
;This  technique,  although  slower  than direct handling  of  the 
;hardware,  takes advantage of the BIOS routines already built in, 
;thereby making our code smaller.
;
;***********************************************************************
;
; 6-JUN-1985   Fixed problem with INDP routine that prevented
;	       SENDOUT from working (Ron Fowler)
;
;  5-Jun-1984   Adapted from M7VT-2.ASM by Bernie Eiben.  Removed 
;   Rev 1.0     the  Rainbow conditionals.   This  overlay  won't 
; Stuart Fuller work  on a Rainbow in file transfer mode  without 
;               some bit twiddling on the 8088 side.  Added tests 
;               for   running   under  ZCPR2  and   bit   twiddle 
;               accordingly.
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
BELL:           EQU     07H             ;bell
CR:             EQU     0DH             ;carriage return
ESC:            EQU     1BH             ;escape
LF:             EQU     0AH             ;linefeed
;
TRUE:           EQU     0FFH
FALSE:          EQU     0
YES:            EQU     0FFH
NO:             EQU     0
;
;
; 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
;
;       Miscellanea for VT180
;
IOBYTE  EQU     3               ; for I/O redirection
BATIO   EQU     56H             ;
AALOAD  EQU     0EA39H          ; ZCPR2 Bios sub-version
CALOAD  EQU     AALOAD + 1      ; Safety check location
LODNUM  EQU     28              ; Current version - should be in AALOAD
CLDNUM  EQU     NOT LODNUM AND 0FFH     ; This should be in CALOAD
CRTCB   EQU     0EA3BH          ; CRT control block addr - flags are at +1
PTRCB   EQU     0EA59H          ; Likewise for PTR
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"
;
BELL    EQU     7               ;bell
TAB     EQU     9
CR      EQU     13              ;carriage return
LF      EQU     10              ;linefeed
ESC     EQU     1BH             ;escape
YES     EQU     0FFH
NO      EQU     0
;
DAV     EQU     0FFH            ;bit(s) to test for ready
TBMT    EQU     0FFH            ;
;
        ORG     100H
;
; Change the clock speed to suit your system
;
        DS      3               ;(for  "JMP   START" instruction)

        DB      NO              ;yes=PMMI S-100 Modem                   103H
        DB      YES              ;yes=HAYES Smartmodem, no=non-PMMI      104H
        DB      'T'             ;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
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      NO              ;yes=user-added Setup routine           10BH
SCRTST: DB      YES             ;Cursor control routine                 10CH
        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
        DB      YES             ;yes=allow transmission of logon        115H
                                ;write logon sequence at location LOGON
SAVCCP: DB      YES             ;yes=do not overwrite CCP               116H
        DB      NO              ;yes=local command if EXTCHR precedes   117H
                                ;no=external command if EXTCHR precedes
        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      '@'-40H         ;^@ = 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
        DS      14              ;                                       156H
;
;
DIALV:  DS      3               ;DIALV not done here (maybe MXO-SM)     162H
DISCV:  DS      3               ;DISCV likewise
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
;
;.....
;
;
; 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 wait until one becomes available.
;
INDP:	CALL	INSP
	ORA	A
	JZ	INDPNR		;if no char, go return last	
	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.
	STA	LASTCH		;always save most recent char
        RET
INDPNR:	LDA	LASTCH		;return old char
	RET
;
; The Check for characters at COMM Port using I/O redirection
;
INSP:   PUSH    B
        PUSH    D
        PUSH    H               ; save the environment
        LDA     IOBYTE          ; Including the IOByte
        STA     SAVEIO          ;
        MVI     A,BATIO         ; change I/O byte
        STA     IOBYTE
        CALL    BCONST          ; call BIOS direct - see INITMOD
        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"
        RET
;
BCONST: JMP     $-$             ; address "filled in" by above code
;
SBREAK: RET
;
GOODBY: LDA     ZCPR2
        ORA     A
        RZ                      ; If running CP/M, then just return
        LDA     CRTSAV          ; Else, we gotta put things back again.
        STA     CRTCB+1
        LDA     PTRSAV
        STA     PTRCB+1
        RET
;
SETCMD: RET
;
SYSVER: PUSH    B
        PUSH    D
        PUSH    H
        LXI     D,DECMSG
        MVI     C,PRINT
        CALL    MEX
; Gotta do the check for ZCPR2 here, SYSVER gets called before INMODV
        MVI     A,NO            ; zero A
        STA     ZCPR2           ; assume CP/M
        LDA     AALOAD          ; get "load number" from BIOS
        CPI     LODNUM          ; and see if it's right
        JNZ     NOTZCP          ; nope, go
        LDA     CALOAD          ; next check its complement
        CPI     CLDNUM
        JNZ     NOTZCP
        MVI     A,YES           ; must be ZCPR2
        STA     ZCPR2
        LXI     H,CRTCB+1       ; get CRT's flag byte
        MOV     A,M
        STA     CRTSAV          ; save it
        ANI     0FFH XOR QMARROW        ; and zap the arrow xlate flag
        MOV     M,A
        LXI     H,PTRCB+1       ; do the same for the PTR
        MOV     A,M
        STA     PTRSAV
        MVI     M,QMRCVFL       ; keep only RCVFLOW bit
; Finished with check for ZCPR2
NOTZCP: LDA     ZCPR2
        ORA     A
        JZ      SYSVE1
        LXI     D,ZCPMSG
        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
CRTSAV: DB      0               ; Save the CRT flags from ZCPR2's Bios
PTRSAV: DB      0               ; Likewise for the PTR flags
ZCPR2:  DB      0               ; Indicates running ZCPR2
;
;       Various text messages
;
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      'DEC VT180'
        DB      '  Overlay V'
        DB      REV/10+'0'
        DB      '.'
        DB      REV MOD 10+'0'
        DB      '$'
;
ZCPMSG: DB      ' running ZCPR2.','$'
CRLF:   DB      CR,LF,'$'
;
CLSMSG: DB      ESC,'[2J',ESC,'[H','$'
EOSMSG: DB      ESC,'[0J','$'
;
;
OVREND: EQU     $               ; See if it'll fit
        IF OVREND / 0B00H
        +++ VT180 OVERLAY TOO LARGE - OVREND >= 0B00H +++
        ENDIF
;
LASTCH:	DB	0
;
          END
;

