REV EQU 18              ;overlay revision level
;
; MXH-CC18 MEX Overlay for Columbia Data Prod M64
;
; Software Control of Baud Rate added in Revision 1.7
; ===================================================
;
; Use for MEX 1.14 or MEXplus
;
; Application: small CP/M computer known as any of the following....
;
;              - Columbia Data Products "Shoebox"
;                    Model M64 or M64-1
;              - Kodak Ektalog Diskette Controller
;              - CONKEY-64 (local moniker)
;
; SET commands available: (*optional)
;
;        SET BAUD: controls MEX timing and USART baudrate
;        SET PARITY: off, odd or even
;        SET WORD: 7 or 8
;        SET STOP: 1, 1.5 or 2
;        SET PULSE or TONE: type of dialing
;       *SET WAIT: "n" seconds to wait for Modem result.
;        SET UART: 7 or 8 bit console UART (see SET UART section)
;       *SET VT220: on/off if terminal is VT220
;
; Instructions for Hardware Modifications required for Software Baud Control
; --------------------------------------------------------------------------
; Parts Required: 0.1uF Ceramic Capacitor
;                 10K 1/4 Resistor
;                 330pF Ceramic Capacitor
;                 18 inches insulated #26-30 wire
;
; 1- connect a jumper wire between U23 (CTC) pin 7 and U50 (74LS123) pin 2
; 2- connect a .1uf cap between pins 1 and 16 of U50
; 3- connect a jumper wire between pins 3 and 16 of U50
; 4- connect a jumper wire between pins 1 and  8 of U50
; 5- connect a 330pF Cap between pins 14 and 15 of U50
; 6- connect a 10K resistor between pins 15 and 16 of U50
; 7- locate 14 of U34 (74LS163) and cut it flush with the IC body
; 8- connect a jumper wire between the old pin from U34-14 and pin 13 of U50
;
;                 The Modification is Now Complete !
;
; The 150 Baud MOD switch now enable software control. All other switches
; retain their original use. The 19200 switch MUST BE used for that rate.
;
;------+--------+----------+----------------------------------------------
; REV  |  Date  |  Author  |          Description
;------+--------+----------+----------------------------------------------
; 1.8  | 2/21/87|  Lill    | - reworked SET BAUD structure. Tested 110-
;      |        |          |   9600 both terminal and transfer modes.
;      |        |          |   Wrote Modification Instructions. Special
;      |        |          |   Thanks to Jannetta & Sykes for the complete
;      |        |          |   R&D job on this!!!
;------+--------+----------+----------------------------------------------
; 1.7  | 2/13/87| Jannetta | - added programable baudrate NOTE requires
;      |        | / Sykes  |   hardware mod to connect ctc pin 7 to uart
;      |        |          |   clock input. Recommend using 150 baud switch
;      |        |          |   position on rear. 19200 baud not supported.
;--------------------------------------------------------------------------
; 1.6  |12/12/86|  Lill    | - tested DCD (uses CTS, need spec. cable) in
;      |        |          |   MEX+ REO
;      |        |          | - added SET WAIT for selection of time to wait
;      |        |          |   after dialing (see SETDLY etc. in MXO-SM14)
;------+--------+----------+----------------------------------------------
; 1.5  |10/28/86|  Lill    | - cleaned up new code added in 1.4
;      |        |          | - completed commenting
;      |        |          | - testing complete on all but DCD and RNG stuff
;------+--------+----------+----------------------------------------------
; 1.4  |10/21/86|  Lill    | - created original MEXplus from MXO-CC13
;      |        |          |   adding DCD and RNG routines.
;      |        |          | - added INITB equate
;      |        |          | - added VT220 option to 8-bit console routine
;      |        |          | - added SET control of 8-bit and VT220 stuff
;------+--------+----------+----------------------------------------------
; 1.3  |10/19/86|  Keane   | - added hardware DSC (via DTR)
;      |        |          | - added SET TONE/PULSE
;      |        |          | - added 8-bit console routines (experimental)
;      |        |          | - tested with SmarTEAM 1200 (MXO-SM14)
;      |        |          |   and SmarTEAM 2400 (MXM-2411)
;------+--------+----------+----------------------------------------------
; 1.2  |10/16/86|  Lill/   | - corrected Columbia model number
;      |        |  Keane   | - first fixes for SmartModem (MXO-SM14)
;------+--------+----------+----------------------------------------------
; 1.1  |10/12/86|Jim Lill  | - fixed SET BAUD messages and history etc.
;      |        |          | - doesn't send dial string to smartmodem
;------+--------+----------+----------------------------------------------
; 1.0  |10/12/86|Tony Keane| - created original, adapting MXO-SX10
;      |        |          |   by Bill Meahan.
;      |        |          | - Tested w/acoustic modem only.
;-------------------------------------------------------------------------
;
; Misc equates
;
NO      EQU     0
YES     EQU     0FFH
TPA     EQU     100H
CR      EQU     13
LF      EQU     10
ESC     EQU     1BH
BEL     EQU     7
TAB     EQU     9
XON     EQU     011H
XOFF    EQU     013H
FALSE   EQU     0
TRUE    EQU     NOT FALSE
;
;---------------------------------------------------------------------------
; Options ......

INITB   EQU     5       ;set for initial (startup) baud rate
                       ;0=110   5=1200
                       ;1=300   6=2400
                       ;2=450   7=4800
                       ;3=600   8=9600
                       ;4=710   9=19200
PLUS    EQU     FALSE   ;set true for MEXplus
VT220   EQU     FALSE   ;TRUE if terminal is VT220
WAIT    EQU     TRUE    ;TRUE if you use MXO-SM14 and want selectable wait
                       ;delay after dialing
WAITSEC EQU     45      ;default WAIT time in seconds
;---------------------------------------------------------------------------
; CONKEY port definitions  (serial port 1)
;
PORT    EQU     058H            ;CONKEY base port (data or status)
MODCT1  EQU     PORT+1          ;modem control port
MODDAT  EQU     PORT            ;modem data port
MODCT2  EQU     PORT+1          ;modem status port
BAUDRP  EQU     080H            ;modem baud rate data port, (CTC)
BAUDMD  EQU     080H            ;modem baud rate command port, (CTC)
AUXPORT EQU     05EH            ;modem aux status port CTS RNG etc.
;
; CONKEY bit definitions
;
MDRCVB  EQU     02H             ;modem receive bit (DAV)
MDRCVR  EQU     02H             ;modem receive ready
MDSNDB  EQU     01H             ;modem send bit
MDSNDR  EQU     01H             ;modem send ready bit
;
;
CTSMSK  EQU     01H             ;mask for CTS bit
BRKMSK  EQU     8               ;mask to set break
PARMSK  EQU     0CFH            ;mask to remove parity bits
RNGMSK  EQU     08H             ;mask to get ring
OPARIT  EQU     10H             ;odd-parity bits
EPARIT  EQU     30H             ;even-parity bits
NPARIT  EQU     00H             ;no-parity bits
PARTST  EQU     10H             ;mask to test parity enabled bit
EVNTST  EQU     20H             ;mask to test even parity bit
MODEMK  EQU     06EH            ;mode mask
MODEGO  EQU     027H            ;default control command
DTRON   EQU     027H            ;default control with DTR on
DTROFF  EQU     025H            ;default control with DTR off
RSTCTL  EQU     040H            ;reset USART command
WORD7   EQU     08H             ;mask for 7 bit characters
WORD8   EQU     04EH            ;mask for 8 bit characters
WORD8T  EQU     04H             ;mask to test for 8 bit characters
STBIT1  EQU     040H            ;mask to set 1 stop bit
STBI15  EQU     080H            ;mask to set 1.5 stop bits
STBIT2  EQU     0C0H            ;mask to set 2 stop bits
;
; MEX service processor stuff ... MEX supports an overlay service
;
MEX     EQU     0D00H           ;address of the service processor
INMDM   EQU     255             ;get char from port to A, CY=no more 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
;
;
CONOUT  EQU     2               ;simulated BDOS function 2: console char out
PRINT   EQU     9               ;simulated BDOS function 9: print string
INBUF   EQU     10              ;input buffer, same structure as BDOS 10
;
       ORG     TPA             ;we begin
;
; next 2 lines are MEXplus changes
;
       DB      0C3H    ;flags a LOADable file
       DS      2       ;MEX has a jump start here
;
; The following variables are located at the beginning of the program
; to facilitate modification without the need of re-assembly. They will
; be moved in MEX 2.0.
;
PMODEM: DB      YES     ;yes=      modem \ / These 2 locations are not  103H
SMODEM: DB      YES     ;yes=Smartmodem  / \ referenced by MEX          104H
TPULSE: DB      'T'     ;smart modem touch tone/dial pulse flag         105H
CLOCK:  DB      46      ;clock speed x .1, up to 25.5 mhz.              106H
                       ;46 checks as correct for CONKEY
MSPEED: DB      INITB   ;see INITB table above                          107H
BYTDLY: DB      2       ;default time to send character in              108H
                       ;terminal mode file transfer (0-9)
                       ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
CRDLY:  DB      2       ;end-of-line delay after CRLF in terminal       109H
                       ;mode file transfer for slow BBS systems
                       ;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
COLUMS: DB      5       ;number of directory columns                    10AH
SETFL:  DB      YES     ;yes=user-defined SET command                   10BH
SCRTST: DB      YES     ;yes=if home cursor and clear screen            10CH
                       ;routine at CLRSCRN
       DB      0       ;was once ACKNAK, now spare                     10DH
BAKFLG: DB      NO      ;yes=make .BAK file                             10EH
CRCDFL: DB      YES     ;yes=default to CRC checking                    10FH
                       ;no=default to Checksum checking
TOGCRC: DB      YES     ;yes=allow toggling of Checksum to CRC          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
TRNLOG: DB      NO      ;yes=allow transmission of logon                115H
                       ;write logon sequence at location LOGON
SAVCCP: DB      YES     ;yes=do not overwrite CCP                       116H
LOCNXT: DB      NO      ;yes=local cmd if EXTCHR precedes               117H
                       ;no=not local cmd if EXTCHR precedes
TOGLOC: DB      YES     ;yes=allow toggling of LOCNXTCHR                118H
LSTTST: DB      YES     ;yes=allow toggling of printer on/off           119H
                       ;in terminal mode. Set to no if using
                       ;the printer port for the modem
XOFTST: DB      NO      ;yes=allow testing of XOFF from remote          11AH
                       ;while sending a file in terminal mode
XONWT:  DB      NO      ;yes=wait for XON after sending CR while        11BH
                       ;transmitting a file in terminal mode
TOGXOF: DB      YES     ;yes=allow toggling of XOFF testing             11CH
IGNCTL: DB      NO      ;yes=do not send control characters             11DH
                       ;above CTL-M to CRT in terminal mode
                       ;no=send any incoming CTL-char to CRT
EXTRA1: DB      WAITSEC ;passes wait time to Modem overlay              11EH
EXTRA2: DB      0       ;for future expansion                           11FH
BRKCHR: DB      '@'-40H ;^@ = Send a 300 ms. break tone                 120H
NOCONN: DB      'N'-40H ;^N = Disconnect from phone line                121H
LOGCHR: DB      'L'-40H ;^L = Send logon                                122H
LSTCHR: DB      'P'-40H ;^P = Toggle printer                            123H
UNSVCH: 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
;
; unused equates grouped here
;
       DB      0       ;not used                                       128H
       DB      0       ;not used                                       129H
;
; Low-level modem I/O routines: this will be replaced with
; a jump table in MEX 2.0 (you can insert jumps here to longer
; routines if you'd like ... I'd recommend NOT putting part of
; a routine in this area, then jumping to the rest of the routine
; in the non-fixed area; that will complicate the 2.0 conversion)
;
INCTL1: IN      MODCT1          ;in modem control port                  12AH
       RET                     ;                                       12CH
       DS      7               ;spares if needed for non-CONKEY        12DH
;
OTDATA: OUT     MODDAT          ;out modem data port                    134H
       RET                     ;                                       136H
       DS      7               ;spares if needed for non-CONKEY        137H
;
INPORT: IN      MODDAT          ;in modem data port                     13EH
       RET                     ;                                       140H
       DS      7               ;spares if needed for non-CONKEY        141H
;
; Bit-test routines.  These will be merged with the above
; routines in MEX 2.0 to provide a more reasonable format
;
MASKR:  ANI MDRCVB ! RET        ;bit to test for receive ready          148H
TESTR:  CPI MDRCVR ! RET        ;value of receive bit when ready        14BH
MASKS:  ANI MDSNDB ! RET        ;bit to test for send ready             14EH
TESTS:  CPI MDSNDR ! RET        ;value of send bit when ready           151H
;
;----------------------------------------------------------------------------
; MEXplus changes.....
;   -was unused area (must total 12 bytes)
;
DCDTST: JMP     DCDVEC          ;jump to carrier detect routine         154H
RNGTST: JMP     RNGVEC          ;jump to ring detect routine            157H

       DS      6               ;remainder of space
;----------------------------------------------------------------------------
; Special modem function jump table:
;
LOGON:  DS      2       ;needed for MDM compat, not ref'd by MEX        160H
DIALV:  DS      3       ;dial digit in A (see info at PDIAL)
DISCV:  JMP     DISCON  ;disconnect the modem
GOODBV: JMP     GOODBYE ;called before exit to CP/M
INMODV: JMP     NITMOD  ;initialization. Called at cold-start
NEWBDV: JMP     PBAUD   ;set baud rate
NOPARV: JMP     DUMMY   ;set modem for no-parity
PARITV: JMP     DUMMY   ;set modem parity
SETUPV: JMP     SETCMD  ;SET cmd: jump to a RET if you don't write SET
SPMENV: DS      3       ;not used with MEX
VERSNV: JMP     SYSVER  ;Overlay's voice in the sign-on message
BREAKV: JMP     PBREAK  ;send a break
;
; The following jump vector provides the overlay with access to special
; routines in the main program (retained and supported in the main pro-
; gram for MDM overlay compatibility). These should not be modified by
; the overlay.
;
; Note that for MEX 2.0 compatibility, you should not try to use these
; routines, since this table will go away with MEX 2.0 (use the MEX
; service call processor instead).
;
ILPRTV: DS      3               ;replace with MEX function 9
INBUFV: DS      3               ;replace with MEX function 10
ILCMPV: DS      3               ;replace with table lookup funct. 247
INMDMV: DS      3               ;replace with MEX function 255
NXSCRV: DS      3               ;not supported by MEX (returns w/no action)
TIMERV: DS      3               ;replace with MEX function 254
;
;
; Clear/screen and clear/end-of-screen. Each routine must use the
; full 9 bytes alloted (may be padded with nulls).
;
; These routines (and other screen routines that MEX 2.0 will sup-
; port) will be accessed through a jump table in 2.0, and will be
; located in an area that won't tie the screen functions to the
; modem overlay (as the MDM format does).
;
CLREOS: LXI     D,EOSMSG
       MVI     C,PRINT
       CALL    MEX
       RET
;
;
CLS:    LXI     D,CLSMSG                ;null unless patched
       MVI     C,PRINT
       CALL    MEX
       RET
;
;------------------------------------------------------------
;
;       *** END OF FIXED FORMAT AREA ***
;
;------------------------------------------------------------

       ORG     TPA + 100H      ;Leave space for MEX Plus.

; strings to clear-to-end-of-screen, and clear-screen
;
EOSMSG: DB      09BH,'$'        ;clear to end-of-screen
CLSMSG: DB      LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF     ;clear whole screen
       DB      LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,'$' ;'generic' CLS
;
; Data area
;
ERRFLG: DB      0               ;connection error code
MODMOD  DB      MODEMK          ;uart-control byte image
MODCTB: DB      MODEGO          ;modem control byte

;--------------------------------------------------------------------------
; Modem initialization.

NITMOD:
       CALL    URTSET          ;Extra console patch init (if installed)
       MVI     A,INITB         ;default IBAUD eqaute setting
       CALL    PBAUD           ;go set CTC
       LDA     MODMOD          ;default mode command in A
ALTINI:                         ;alternate entry point for mode change routines
       PUSH    PSW             ;save mode command on stack
       XRA     A               ;force 8251 USART to look for reset command
       OUT     MODCT2
       OUT     MODCT2
       OUT     MODCT2
       MVI     A,RSTCTL        ;reset USART
       OUT     MODCT2
       POP     PSW             ;retreive mode command
       STA     MODMOD          ;save copy for future use
       OUT     MODCT2          ;set USART mode
       MVI     A,MODEGO        ;enable transmitter and receiver
       OUT     MODCT2
       RET
;
;--------------------------------
; CONKEY cause disconnect routine
;
DISCON: MVI     A,DTROFF        ;turn off DTR
       OUT     MODCT2          ;       "
                               ;
       MVI     B,10            ;wait 1 second
       MVI     C,TIMER         ;       "
       CALL    MEX             ;       "
;
       MVI     A,DTRON         ;turn on DTR
       OUT     MODCT2          ;       "
                               ;
       MVI     B,10            ;wait 1 more second
       MVI     C,TIMER         ;       "
       CALL    MEX             ;       "
                               ;
       RET                     ;return to calling program

;---------------------------
; CONKEY  send-break routine
;
PBREAK: LDA     MODCTB          ;get the last modem control byte
       ORI     BRKMSK          ;set the transmit break bit low
       OUT     MODCT2          ;send it to the modem
       LXI     B,02FEH         ;B=2, C=254
       CALL    MEX             ;send a space tone for 200 ms.
       LDA     MODCTB          ;get the last modem control byte
       OUT     MODCT2
       ;restore to normal
;
; exit routine
;
DUMMY:  RET                     ;we don't need one
;
;-----------------------------------
; MEXplus DCD and RNG routines......
;
DCDVEC: IN      AUXPORT         ;Conkey ring/CTS port
       ANI     CTSMSK          ;isolate status bit (Look for CTS instead)
       JNZ     SETACC          ;0=carrier detected
       JMP     CLRACC          ;
;.......                        ;
                               ;
RNGVEC: IN      AUXPORT         ;Conkey ring/CTS port
       ANI     RNGMSK          ;mask for bit
       JNZ     SETACC          ;0=ring detected
       JMP     CLRACC          ;
;.........                      ;
                               ;
CLRACC: MVI     A,0             ;make A=0
       RET                     ;
SETACC: MVI     A,0FFH          ;make A=255
       RET                     ;
                               ;
;------------------------
; Set baud-rate code in A
;
PBAUD:  PUSH    H               ;don't alter anybody
       PUSH    D
       PUSH    B
       STA     MSPEED
       ADD     A               ;double value to get word address
       MOV     E,A             ;code to DE
       MVI     D,0
       LXI     H,BAUDTB        ;offset into table
       DAD     D
       MOV     C,M             ;fetch code
       INX     H
       MOV     B,M
       MOV     A,B
       OUT     BAUDMD
       MOV     A,C
       OUT     BAUDRP          ;good rate, set it
PBEXIT: POP     B               ;all done
       POP     D
       POP     H
       RET

;
; table of baud rate divisors for supported rates
; NOTE: 19200 baud is not possible with the CTC.
;
BAUDTB: DW      1D8EH,1D34H,1D22H,57D0H,57B0H  ;110,300,450,600,710
       DW      5768H,5734H,571AH,570DH        ;1200,2400,4800,9600
       DW      570DH                          ;19200

;-----------------------
; Sign-on message
;
SYSVER: LXI     D,SOMESG
       MVI     C,PRINT
       CALL    MEX
       RET
;
SOMESG:

IF PLUS
       DB      'MEXplus for Conkey-64'
ENDIF

IF NOT PLUS
       DB      'MEX for Conkey-64'
ENDIF

IF VT220
       DB      ', VT220 Exit Option'
ENDIF
       DB      CR,LF,'CTC Baud Control',CR,LF
       DB      ' Version: '
       DB      REV/10+'0'
       DB      '.'
       DB      REV MOD 10+'0'
       DB      '$'
;
; Newline on console
;
CRLF:   MVI     A,CR
       CALL    TYPE
       MVI     A,LF            ;fall into TYPE
;
; type char in A on console
;
TYPE:   PUSH    H               ;save 'em
       PUSH    D
       PUSH    B
       MOV     E,A             ;align output character
       MVI     C,CONOUT        ;print via MEX
       CALL    MEX
       POP     B
       POP     D
       POP     H
       RET
;
;------------------------------------------------------------
;
; The remainder of this overlay implements a very versatile
; SET command --
;
;
; Control is passed here after MEX parses a SET command.
;
SETCMD: MVI     C,SBLANK        ;any arguments?
       CALL    MEX
       JC      SETSHO          ;if not, go print out values
       LXI     D,CMDTBL        ;parse command
       CALL    TSRCH           ;from table
       PUSH    H               ;any address on stack
       RNC                     ;if we have one, execute it
       POP     H               ;nope, fix stack
SETERR: LXI     D,SETEMS        ;print error
       MVI     C,PRINT
       CALL    MEX
       RET
;
SETEMS: DB      CR,LF,'SET command error',CR,LF,'$'
;
; SET command table ... note that tables are constructed of command-
; name (terminated by high bit=1) followed by word-data-value returned
; in HL by MEX service processor LOOKUP.  Table must be terminated by
; a binary zero.
;
; Note that LOOKUP attempts to find the next item in the input stream
; in the table passed to it in HL ... if found, the table data item is
; returned in HL; if not found, LOOKUP returns carry set.
;
CMDTBL: DB      '?'+80H                 ;"set ?"
       DW      STHELP
       DB      'BAU','D'+80H           ;"set baud"
       DW      STBAUD
       DB      'PARIT','Y'+80H         ;"set parity"
       DW      SETPAR
       DB      'WOR','D'+80H           ;"set bits" (word)
       DW      SETBIT
       DB      'STO','P'+80H           ;"set stop"
       DW      SETSTO
       DB      'PULS','E'+80H          ;"set pulse dialing"
       DW      SETPUL
       DB      'TON','E'+80H           ;"set tone dialing"
       DW      SETTON
IF WAIT
       DB      'WAI','T'+80H           ;"set wait time"
       DW      SETDLY
ENDIF
       DB      'UAR','T'+80H           ;"set UART mode"
       DW      SETURT
IF VT220
       DB      'VT22','0'+80H          ;"set VT220 mode"
       DW      SETVT2
ENDIF
;
       DB      0               ;<<=== table terminator
;
; SET <no-args>: print current statistics
;
SETSHO:
       LXI     H,SHOTBL        ;get table of SHOW subroutines
SETSLP: MOV     E,M             ;get table address
       INX     H
       MOV     D,M
       INX     H
       MOV     A,D             ;end of table?
       ORA     E
       RZ                      ;exit if so
       PUSH    H               ;save table pointer
       XCHG                    ;adrs to HL
       CALL    GOHL            ;do it
       CALL    CRLF            ;print newline
       MVI     C,CHEKCC        ;check for console abort
       CALL    MEX
       POP     H               ;it's done
       JNZ     SETSLP          ;continue if no abort
       RET
;
GOHL:   PCHL
;
; table of SHOW subroutines
;
SHOTBL: DW      BDSHOW
       DW      PARSHO
       DW      WORDHO
       DW      STOSHO
       DW      DIASHO
IF WAIT
       DW      DLYSHO
ENDIF
       DW      URTSHO
IF VT220
       DW      VT2SHO
ENDIF
       DW      0               ;<<== table terminator
;
; SET ?  processor
;
STHELP: LXI     D,HLPMSG
       MVI     C,PRINT
       CALL    MEX
       RET
;
; The help message
;
HLPMSG: DB      CR,LF,'SET command, Conkey-64 version:'
       DB      LF
       DB      CR,LF,'  SET BAUD 110, 300, 450, 600, 710,'
       DB      CR,LF,'           1200, 2400, 4800, <or> 9600'
       DB      CR,LF,'           19200 requires use of MOD switches'
       DB      CR,LF,'  SET PARITY ODD <or> EVEN <or> OFF'
       DB      CR,LF,'  SET WORD 7 <or> 8'
       DB      CR,LF,'  SET STOP 1 <or> 1.5 <or> 2'
       DB      CR,LF,'  SET PULSE <or> TONE Dialing'
IF WAIT
       DB      CR,LF,'  SET WAIT "n" seconds'
ENDIF
       DB      CR,LF,'  SET UART 7 <or> 8'
IF VT220
       DB      CR,LF,'  SET VT220 Exit Reset ON <or> OFF'
ENDIF
       DB      CR,LF,LF,'$'
;
;-------------------
; SET BAUD processor
;
STBAUD: MVI     C,BDPARS        ;function code
       CALL    MEX             ;let MEX look up code
       JC      SETERR          ;invalid code
       CALL    PBAUD           ;no, try to set it
       JC      SETERR          ;no-supported code
BDSHOW: CALL    ILPRT           ;display baud
       DB      'BAUD:',TAB,' ',0
       LDA     MSPEED
       MVI     C,PRBAUD        ;use MEX routine
       CALL    MEX
       LDA     MSPEED          ;get baud again
       CPI     9               ;is it 19200
       JZ      PRWARN          ;go give a warning
       RET

PRWARN: CALL    ILPRT
       DB      ' Requires use of MOD switch',BEL,BEL,0
       RET
;
;---------------------
; SET PARITY processor
;
SETPAR:
       LXI     D,PARTBL        ;point to argument table
       CALL    TSRCH           ;look for match with allowed arguments
       JC      SETERR          ;process error if found
       LDA     MODMOD          ;get current mode byte
       ANI     PARMSK          ;mask away current parity bits
       ORA     L               ;add new parity bits
       CALL    ALTINI
PARSHO:
       CALL    ILPRT           ;show current status
       DB      'PARITY:',TAB,' ',0
       LDA     MODMOD          ;get current mode word
       ANI     PARTST          ;test for parity enabled
       JNZ     PAR             ;skip if it is
       CALL    ILPRT
       DB      'Off',0
       RET
PAR:
       LDA     MODMOD
       ANI     EVNTST          ;test mode byte for even parity
       JNZ     PAREVN          ;skip if it is
       CALL    ILPRT
       DB      'Odd',0
       RET
PAREVN:
       CALL    ILPRT
       DB      'Even',0
       RET
;
;PARITY argument table
;
PARTBL: DB      'OD','D'+80H
       DB      OPARIT,0
       DB      'EVE','N'+80H
       DB      EPARIT,0
       DB      'OF','F'+80H
       DB      NPARIT,0
       DB      0
;
;------------------
;SET WORD processor
;
SETBIT:
       LXI     D,BITTBL        ;point to argument table
       CALL    TSRCH           ;look for match with allowed arguments
       JC      SETERR          ;process error if found
       LDA     MODMOD          ;get current mode command
       ANI     (NOT WORD8) AND 255     ;mask away current bits
       ORA     L               ;set new bits
       CALL    ALTINI          ;change mode
WORDHO:
       CALL    ILPRT           ;show current status
       DB      'WORD:',TAB,' ',0
       LDA     MODMOD          ;get current mode word
       ANI     WORD8           ;test for number of bits
       JZ      SETERR
       ANI     WORD8T
       JNZ     B8              ;skip if it is
       CALL    ILPRT
       DB      '7 Bits',0
       RET
B8:
       CALL    ILPRT
       DB      '8 Bits',0
       RET
;
;WORD argument table
;
BITTBL: DB      '8'+80H
       DB      WORD8,0
       DB      '7'+80H
       DB      WORD7,0
       DB      0
;
;SET STOP processor
;
SETSTO:
       LXI     D,STPTBL        ;point to argument table
       CALL    TSRCH           ;look for match with allowed arguments
       JC      SETERR          ;process error if found
       LDA     MODMOD          ;get current mode command
       ANI     (NOT STBIT2) AND 255     ;mask away current bits
       ORA     L               ;set new bits
       CALL    ALTINI          ;change mode
STOSHO:
       CALL    ILPRT           ;show current status
       DB      'STOP:',TAB,' ',0
       LDA     MODMOD          ;get current mode word
       ANI     STBIT2          ;test for number of bits
       JZ      SETERR
       RLC
       RLC
       ADD     A               ;form word table index
       LXI     H,STJTBL        ;get address of jump table
       ADD     L               ;point to address of proper routine
       MOV     L,A
       MVI     A,0
       ADC     H
       MOV     H,A
       MOV     A,M             ;get address of proper routine
       INX     H
       MOV     H,M
       MOV     L,A
       PCHL                    ;branch to proper routine
PRT1:
       CALL    ILPRT
       DB      '1 Bit',0
       RET
PRT2:
       CALL    ILPRT
       DB      '2 Bits',0
       RET
PRT15:
       CALL    ILPRT
       DB      '1.5 Bits',0
       RET
;
STJTBL:                         ;jump table for stop bit show routines
       DW      SETERR
       DW      PRT1
       DW      PRT15
       DW      PRT2
;
;STOP argument table
;
STPTBL: DB      '1'+80H
       DB      STBIT1,0
       DB      '1.','5'+80H
       DB      STBI15,0
       DB      '2'+80H
       DB      STBIT2,0
       DB      0
;
;-----------------------------
;SET PULSE and TONE processors

SETPUL:
       MVI     A,'P'           ;Set modem to pulse dial mode
       STA     TPULSE          ;       "          "
       JMP     DIASHO          ;Print out new mode.


SETTON:
       MVI     A,'T'           ;Set modem to tone dial mode
       STA     TPULSE          ;       "          "
       JMP     DIASHO          ;Print out new mode.


DIASHO: LDA     TPULSE          ;Output dialing type message
       CPI     'P'             ;       "          "
       JZ      PULPRN          ;       "          "
       CALL    ILPRT           ;show current status
       DB      'TONE',TAB,' Dial',0
       RET                     ;Return to calling program
                               ;
PULPRN: CALL    ILPRT           ;show current status
       DB      'PULSE',TAB,' Dial',0
       RET                     ;Return to calling program

;-------------------------------------------------
; SET WAIT processor

SETDLY: MVI     C,EVALA
       CALL    MEX
       MOV     A,H
       ORA     A
       JNZ     SETERR
       MOV     A,L
       STA     EXTRA1

DLYSHO: CALL    ILPRT
       DB      'WAIT:',TAB,' ',0
       LDA     EXTRA1
       MOV     L,A
       MVI     H,0
       MVI     C,DECOUT
       CALL    MEX
       CALL    ILPRT
       DB      ' Seconds for Modem Result',0
       RET

;-------------------------------------------------
; SET UART Processor
;   as received the Conkey-64 BIOS runs the console USART at 7-bit. This
;   is wholly adequate for normal hobbyist CP/M type communications, a
;   problem was encountered when running the unit on a network to a
;   large mainframe. Here, 8-bit was required for terminal ID and other
;   "invisible" stuff.  The solution was the UART control routines
;   at the end of this overlay.  This SET command allows changing
;   it from normal 7-bit to 8-bit.  This option was included for
;   other experiments A/R. Normally it's 8-Bit at power. This can run
;   like this for all work.
;
SETURT:
       LXI     D,URTTBL        ;point to argument table
       CALL    TSRCH           ;look for match with allowed arguments
       JC      SETERR          ;process error if found
       MOV     A,L             ;
       STA     URTFLG          ;set flag
       CALL    URTSET          ;set UART itself
URTSHO:
       CALL    ILPRT           ;show current status
       DB      'UART:',TAB,' ',0
       LDA     URTFLG          ;get current mode word
       ORA     A               ;
       JNZ     URT             ;skip if it is
       CALL    ILPRT           ;print it
       DB      '7 Bit Console',0
       RET                     ;
                               ;
URT:    CALL    ILPRT           ;print it
       DB      '8 Bit Console',0               ;
       RET                     ;
;
;UART argument table
;
URTTBL: DB      '7'+80H
       DB      0,0
       DB      '8'+80H
       DB      0FFH,0
       DB      0
;
;-------------------------------------------------
; SET VT220 Processor
;   again this was a mainframe problem where, software on it changed
;   the VT220 being used back and forth from VT100 mode to VT220 mode.
;   If you left MEX while still in VT220 mode you'd get strange VT220
;   only characters. This SET command will turn on/off an option to
;   send a VT100 reset string to the terminal upon exiting MEX.
;

SETVT2:
       LXI     D,VT2TBL        ;point to argument table
       CALL    TSRCH           ;look for match with allowed arguments
       JC      SETERR          ;process error if found
       MOV     A,L             ;
       STA     VT2FLG          ;

VT2SHO:
       CALL    ILPRT           ;show current status
       DB      'VT220:',TAB,' ',0
       LDA     VT2FLG          ;get current mode word
       ORA     A               ;
       JNZ     VT2             ;skip if it is
       CALL    ILPRT           ;
       DB      'OFF',0         ;
       RET                     ;
                               ;
VT2:    CALL    ILPRT           ;print it
       DB      'ON',0          ;
       RET                     ;
;
;VT220 argument table
;
VT2TBL: DB      'OF','F'+80H
       DB      0,0
       DB      'O','N'+80H
       DB      0FFH,0
       DB      0

;-------------------------------------------------
; Compare next input-stream item in table @DE; CY=1
; if not found, else HL=matched data item
;
TSRCH:  MVI     C,LOOKUP        ;get function code
       JMP     MEX             ;pass to MEX processor
;
; Print in-line message ... blows away C register
;
ILPRT:  MVI     C,ILP           ;get function code
       JMP     MEX             ;go do it


;+----------------------------------------------------------------------+
;|             SPECIAL 8 BIT CONSOLE TRANSIENT ROUTINES                 |
;+----------------------------------------------------------------------+
; Conkey has UART set up for 7-bit even parity....  this causes problems
; with VT-100 on mainframes and who knows what else.  This will make
; console UART port eight bit. Your terminal must be same.  Port
; is restored to normal on MEX exit.
x
CINVEC: DS      2               ;Storage for current console vectors.
COUVEC: DS      2               ;       "          "          "
URTFLG: DB      0FFH            ;beware... do not default to 0

IF NOT VT220
VT2FLG: DB      0               ;VT220 exit string not used
ENDIF

IF VT220
VT2FLG: DB      0FFH            ;VT220 exit string (VT100 mode) used.
ENDIF

URTSET: PUSH    D               ;save regs
       PUSH    H               ; "  "
       LDA     URTFLG          ;get flag
       ORA     A               ;test it
       JZ      SEVEN           ;jump to Seven or fall to Eight
       MVI     A,01000000B     ;Select mode register.
       OUT     41H             ;       "
       MVI     A,01101110B     ;Set UART to 8 bit no parity 1 stop.
       OUT     41H             ;       "          "
       MVI     A,00100111B     ;re-enable transmitter and receiver.
       OUT     41H             ;       "          "           "
                               ;
       LHLD    0001H           ;Save current console BIOS vectors.
       LXI     D,7             ;       "          "          "
       DAD     D               ;       "          "          "
       PUSH    H               ;       "          "          "
       MOV     A,M             ;       "          "          "
       STA     CINVEC+0        ;       "          "          "
       INX     H               ;       "          "          "
       MOV     A,M             ;       "          "          "
       STA     CINVEC+1        ;       "          "          "
       INX     H               ;       "          "          "
       INX     H               ;       "          "          "
       MOV     A,M             ;       "          "          "
       STA     COUVEC+0        ;       "          "          "
       INX     H               ;       "          "          "
       MOV     A,M             ;       "          "          "
       STA     COUVEC+1        ;       "          "          "
                               ;
       POP     H               ;Set up new vectors.
       LXI     D,UARTIN        ;       "
       MOV     M,E             ;       "
       INX     H               ;       "
       MOV     M,D             ;       "
       INX     H               ;       "
       INX     H               ;       "
       LXI     D,UARTOU        ;       "
       MOV     M,E             ;       "
       INX     H               ;       "
       MOV     M,D             ;       "
                               ;
       POP     H               ;Restore registers.
       POP     D               ;       "
                               ;
       RET                     ;Return to calling program.
                               ;
SEVEN:  MVI     A,01000000B     ;Select mode register.
       OUT     41H             ;       "
       MVI     A,01111010B     ;Set UART to 7 bit even parity 1 stop.
       OUT     41H             ;       "          "
       MVI     A,00100111B     ;re-enable transmitter and receiver.
       OUT     41H             ;       "          "           "
                               ;
       LHLD    0001H           ;Save current console BIOS vectors.
       LXI     D,7             ;       "          "          "
       DAD     D               ;       "          "          "
       LDA     CINVEC+0        ;       "          "          "
       MOV     M,A             ;       "          "          "
       INX     H               ;       "          "          "
       LDA     CINVEC+1        ;       "          "          "
       MOV     M,A             ;       "          "          "
       INX     H               ;       "          "          "
       INX     H               ;       "          "          "
       LDA     COUVEC+0        ;       "          "          "
       MOV     M,A             ;       "          "          "
       INX     H               ;       "          "          "
       LDA     COUVEC+1        ;       "          "          "
       MOV     M,A             ;       "          "          "
                               ;
       POP     H               ;Restore registers.
       POP     D               ;       "
       RET                     ;Return to calling program.
                               ;
GOODBYE:LDA     VT2FLG          ;check VT220 flag
       ORA     A               ;it set then send string
       LXI     D,VTMSG         ;load exit string
       MVI     C,PRINT         ;send it to terminal
       CNZ     MEX             ;let MEX do it
       MVI     A,0             ;set A to 0
       STA     URTFLG          ;change URT flag
       CALL    URTSET          ;make UART normal (7-bit)
       LXI     D,EXIMSG        ;load DE with Exit Msg.
       MVI     C,PRINT         ;load exit msg string (gets UART working right)
       CALL    MEX             ;let MEX do it
       RET                     ;
                               ;
EXIMSG: DB      CR,LF           ;send some chars. to screen after resetting     DB      '   ',CR,LF,'$'
       DB      ' ',CR,LF,'$'   ;the UART

VTMSG:  DB      '        ',ESC,'[61"p',CR,LF,'$'        ;VT100 mode string

UARTIN: IN      41H             ;Wait for data.
       ANI     00000010B       ;       "
       JZ      UARTIN          ;       "
                               ;
       IN      41H             ;Check for errors.
       ANI     00110000B       ;       "
       JZ      NOERR           ;       "
       MVI     A,00110111B     ;Reset the error flags.
       OUT     41H             ;       "
                               ;
NOERR:  IN      40H             ;Load acc with data.
                               ;
       RET                     ;Return to calling program.



UARTOU: IN      41H             ;Wait for UART to become ready.
       ANI     00000001B       ;       "          "
       JZ      UARTOU          ;       "          "
                               ;
       MOV     A,C             ;Output data to console UART.
       OUT     40H             ;       "          "
       RET                     ;Return to calling program.
       ENDIF                   ;
                               ;
                               ;
       END                     ;end of MXH-CCnn