;	Title	'MEX overlay for the Sanyo MBC-1000 Computer'
;
;
; This file adapts the Sanyo MBC-1000 computer to the MEX modem program.
; 
;
REV	EQU	21		;overlay revision level
;
; 09/15/84: Revision 2.1  A major revision.  Added features of SET SPKR,
;    SET WAIT, and SET DIAL, and disable auto-answer.  All the routines 
;    were borrowed from MXM-US13.ASM but with great difficulty and much
;    alteration.  Added conditional assembly for smartmodem (SMMODEM) &
;    ANCHOR, added DELAY to slow modem commands where the Anchor can 
;    catch them, and fixed a revision 2.0 bug where the SET status would
;    lose the current baudrate info.  This revision tested with an Anchor
;    Mark XII Smartmodem until all works.  Other smartmodems may require
;    revision of delays and timing constants.  Sanyo does not make pin 8
;    of the RS-232C connector available so the DCD (Data Carrier Detect)
;    cannot be sensed and the Carrier Check and Carrier Show (CARRCK and
;    CARRSH) portions were eliminated. Altered the SET status display to
;    suit my taste and always provide status with help commands. Other
;    modems are cautioned that their unique portions are essentially
;    untested.  Tested with MX-SM13A & MEX111.       ((Bob Sandel))     
;
; 08/09/84: Revision 2.0  Combined MXO-SY11 and M7SY-3.ASM
;    Added variables PTIMER, PBAUD, SQWV2 & N8251. Cleaned up some minor bugs
;    in the OR routine for the 8251 output & insured out of mode state always
;    occurs in SBAUD.  Added comments where changes were made.   (Bob Sandel)
;
;--------------------------------------------------------------------
;
;  THIS MODIFICATION MAKES USE OF TIMER 2 OF THE 8253 PROGRAMMABLE
;  INTERVAL TIMER (IC4) ON THE SERIAL I/O BOARD OF THE SANYO MBC-1000.
;
;  To use this program, the serial I/O board must be modified as follows:
;
;  1. Cut etch from IC18 Pin 1 to JP2 Pin 8.
;  2. Install jumper from IC18 Pin 1 to IC4 Pin 18.
;  3. Install jumper from IC4 Pin 17 to JP2 Pin 8.
;  4. Install jumper from IC4 Pin 16 to IC4 Pin 14.
;  5. Move jumper strap to JP2 Pin 8 for programmable baud rate, other
;     pins (1-7) can still be used for standard baud rate selections.
;  6. Hardware modification is now complete.
;
; You will want to look this file over carefully. There are a number of
; options that you can use to configure the program to suit your taste.;
; Edit for your preferences then follow the "TO USE:" example shown below.
;
; Use the "SET" command to change the baudrate when desired.  It starts
; out at 1200 baud when the program is first called up.  Because of tem- 
; perature and component variations, you mave have to alter the timing
; parameters BD110-BD19K, plus or minus 1 or 2 numbers, if CRC errors 
; occur frequently during transmission and reception.
;
; Only 300 & 1200 Baud are enabled; info for other baudrates is located
; in table form above INITBD. For full capability, N8251 would have to
; be implemented via a second lookup table.
;
;
; _______________________________________________________________________
;
; Note that all overlays may freely use memory up to 0CFFH.  If your
; overlay must work with the MEX Smartmodem overlay (MXO-SMxx.ASM) or
; the MEX DATEC 212 overlay (MXO-DT10.ASM), the physical modem overlay
; should terminate by 0AFFH.
;
; The SET command allows the user to change the baud rates, and the
; parity.  The parity options are: No parity (NONE); Even parity (EVEN);
; Even parity with 8 data bits (EVEN8); Odd parity (ODD); and Odd parity
; with 8 data bits (ODD8).  EVEN8 and ODD8 are for special purposes and
; will most likely never be used.
;_______________________________________________________________________
;
; Misc equates
;
YES     EQU	0FFH
NO      EQU	0
NA      EQU	0FFH		;Value for baud rate not available
;
SMMODEM EQU     YES             ;Yes=Smartmodem
ANCHOR  EQU     YES             ;Anchor has no speaker or programmable wait
                                ;No=Hayes, U.S. Robotics  
BELL    EQU	07H		;bell
TAB     EQU	09H             ;tab
LF      EQU	0AH		;line feed
CR      EQU	0DH		;carriage return
ESC     EQU	1BH		;escape
TPA     EQU     0100H           ;Transient Program Area
MEX     EQU     0D00H           ;Address of the service processor 
;
;
; The following information was altered for the Sanyo MBC-1000
;
PORT:   EQU     0A5H	;Sanyo 8251 modem USART control port
PTIMER  EQU     0A3H    ;8253 programmable interval timer control
PBAUD   EQU     0A2H    ;8253 data port (square wave, n/2+n/2)
;
MODCTL:	EQU	PORT	;MODEM CONTROL PORT
MODDAT:	EQU	PORT-1	;MODEM DATA PORT
;
MDRCVB: EQU     00000010B       ;bit to test for RECEIVE
MDRCVR: EQU     00000010B       ;value when READY
MDSNDB: EQU     00000001B       ;bit to test for SEND
MDSNDR: EQU     00000001B       ;value when READY
EVEN    EQU     01111000B       ;EVEN parity, 7 data bits
EVEN8   EQU     01111100B       ;EVEN parity, 8 data bits
ODD     EQU     01011000B       ; ODD parity, 7 data bits
ODD8    EQU     01011100B       ; ODD parity, 8 data bits
NONE    EQU     01001100B       ;  no parity, 8 data bits = NONE
;
;
SQWV2   EQU     10010110B      ;Configures 8253 Timer-2 for square waves
N8251   EQU     00000010B      ;See 8251 lookup table below (150-1200 baud)
;
;  Progammable Baud Rate factors (theoretical)        
;
;  Minor adjustment of 8253 n +1,-1 may be required    8253      8251 
;                                                      ----      ----
BD110:          EQU     NA              ;NO 110    |    2C        03
BD300:          EQU     041H            ; <300>    |    40        02
BD450:          EQU     NA              ;NO 450    |    2B        02	
BD600:          EQU     NA              ;NO 600    |    20        02
BD710:          EQU     NA              ;NO 710    |    1B        02
BD1200:         EQU     010H            ;<1200>    |    10        02
BD2400:         EQU     NA              ;NO 2400   |    80        01
BD4800:         EQU     NA              ;NO 4800   |    40        01
BD9600:         EQU     NA              ;NO 9600   |    20        01 
BD19K:          EQU     NA              ;NO 19200  |    10        01
;
;
INITBD:		EQU	5		;Initial baud rate (1200)
;
; Control bytes
;
RESET1  EQU     10000111B               ;Initialize UART
RESET2  EQU     01000000B               ;Internal reset
CHIPSET EQU     00100111B               ;DTR, RTS, RE, TE
DISCNT  EQU     00010111B               ;no DTR, RTS, RE, TE
;
BREAK   EQU     CHIPSET OR 8H   ;BREAK character
;
;
; MEX service processor stuff ... MEX supports an overlay service
; processor, located at 0D00H (and maintained at this address from
; version to version).  If your overlay needs to call BDOS for any
; reason, it should call MEX instead; function calls below about
; 240 are simply passed on to the BDOS (console and list I/O calls
; are specially handled to allow modem port queueing, which is why
; you should call MEX instead of BDOS).  MEX uses function calls
; above about 244 for special overlay services (described below).
;
; Some sophisticated overlays may need to do file I/O; if so, use
; the PARSFN MEX call with a pointer to the FCB in DE to parse out
; the name.  This FCB should support a spare byte immediately pre-
; ceeding the actual FCB (to contain user # information).  If you've
; used MEX-10 for input instead of BDOS-10 (or you're parsing part
; of a SET command line that's already been input), then MEX will
; take care of DU specs, and set up the FCB accordingly.  There-
; after all file I/O calls done through the MEX service processor
; will handle drive and user with no further effort necessary on
; the part of the programmer.
;
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
;
;
	DS	3		;MEX has a JMP 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	NO              ;yes=PMMI modem \ / These 2 locations are not
SMODEM: DB	SMMODEM         ;yes=Smartmodem / \ referenced by MEX
TPULSE: DB      'P'             ;T=touch, P=pulse (not referenced by MEX)
CLOCK:  DB      40              ;clock speed x .1, up to 25.5 mhz.
MSPEED: DB      INITBD          ;sets initial baud rate
                                ;0=110	1=300  2=450  3=600  4=710
                                ;5=1200 6=2400 7=4800 8=9600 9=19200
BYTDLY: DB	5		;default time to send character in
                                ;terminal mode file transfer (0-9)
                                ;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
CRDLY:  DB	5		;end-of-line delay after CRLF in terminal
                                ;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
SETFL:  DB	YES		;yes=user-defined SET command
SCRTST: DB	YES		;yes=if home cursor and clear screen
                                ;routine at CLRSCRN
        DB	0		;was once ACKNAK, now spare
BAKFLG: DB	NO		;yes=make .BAK file
CRCDFL:	DB	YES		;yes=default to CRC checking
                                ;no=default to Checksum checking
TOGCRC: DB	YES		;yes=allow toggling of Checksum to CRC
CVTBS:  DB	NO		;yes=convert backspace to rub
TOGLBK: DB	YES		;yes=allow toggling of bksp to rub
ADDLF:  DB	NO		;no=no LF after CR to send file in
                                ;terminal mode (added by remote echo)
TOGLF:  DB	YES		;yes=allow toggling of LF after CR
TRNLOG: DB	NO		;yes=allow transmission of logon
                                ;write logon sequence at location LOGON
SAVCCP: DB	YES		;yes=do not overwrite CCP
LOCNXT: DB	NO		;yes=local cmd if EXTCHR precedes
                                ;no=not local cmd if EXTCHR precedes
TOGLOC: DB	YES		;yes=allow toggling of LOCNXTCHR
LSTTST: DB	YES		;yes=allow toggling of printer on/off
                                ;in terminal mode. Set to no if using
                                ;the printer port for the modem
XOFTST: DB	NO		;yes=allow testing of XOFF from remote
                                ;while sending a file in terminal mode
XONWT:  DB	NO		;yes=wait for XON after sending CR while
                                ;transmitting a file in terminal mode	
TOGXOF: DB	YES		;yes=allow toggling of XOFF testing
IGNCTL: DB	YES		;yes=do not send control characters
                                ;above CTL-M to CRT in terminal mode
                                ;no=send any incoming CTL-char to CRT
EXTRA1: DB	0		;for future expansion
EXTRA2: DB	0		;for future expansion
BRKCHR: DB	'@'-40H		;^@ = Send a 300 ms. break tone
NOCONN: DB	'N'-40H		;^N = Disconnect from phone line
LOGCHR: DB	'L'-40H		;^L = Send logon
LSTCHR: DB	'P'-40H		;^P = Toggle printer
UNSVCH: DB	'R'-40H		;^R = Close input text buffer
TRNCHR: DB	'T'-40H		;^T = Transmit file to remote
SAVCHR: DB	'Y'-40H		;^Y = Open input text buffer
EXTCHR: DB	'^'-40H		;^^ = Send next character
;
; Equates used only by PMMI routines grouped together here.
;
	DS	2		;not used
;
; 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)
;
INCTL:	IN	MODCTL		;in modem control port
	RET
	DB	0,0,0,0,0,0,0	;spares if needed
;
OTDATA:	OUT	MODDAT		;out modem data port
	RET
	DB	0,0,0,0,0,0,0	;spares if needed
;
INPORT:	IN	MODDAT		;in modem data port
	RET
	DB	0,0,0,0,0,0,0	;spares if needed
;
; 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
TESTR:	CPI MDRCVR ! RET	;value of receive bit when ready
MASKS:	ANI MDSNDB ! RET	;bit to test for send ready
TESTS:	CPI MDSNDR ! RET	;value of send bit when ready
;
;
; Unused area: was once used for special PMMI functions,
; Now used only to retain compatibility with MDM overlays.
; You may use this area for any miscellaneous storage you'd
; like but the length of the area *must* be 12 bytes.
;
	DS	12
;
; Special modem function jump table: if your overlay cannot handle
; some of these, change the jump to "DS 3", so the code present in
; MEX will be retained.
;
LOGON:	DS	2		;needed for MDM compat, not ref'd by MEX
DIALV:	DS	3		;dial digit in A (see info at PDIAL)
DISCV:	DS	3		;disconnect the modem
GOODBV: JMP	DUMMY		;called before exit to CP/M
INMODV: JMP	NITMOD		;initialization. Called at cold-start
NEWBDV: JMP	SBAUD		;set baud rate
NOPARV: DS	3		;set for no parity (called after transfer)
PARITV: DS	3		;set modem parity (called before transfer)
SETUPV: JMP	SETCMD		;SET command
SPMENV: DS	3		;not used with MEX
VERSNV: JMP	SYSVER		;Overlay's voice in the sign-on message
BREAKV: JMP	SBREAK		;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 ***
;
;------------------------------------------------------------
;
; strings to clear-to-end-of-screen, and clear-screen
;
EOSMSG:	DB	0,0,0,0,0,0,'$'		;clear to end-of-screen (0 for pause)
CLSMSG:	DB	1AH,0,0,0,0,0,'$'	;clear whole screen (0 for pause)
;
; Modem initialization.
;
NITMOD: MVI     A,SQWV2         ;Initialize 8253 chip so counter 2 becomes
        OUT     PTIMER          ;baud rate programmable clock (square wave)
        LDA	MSPEED
        CALL	SBAUD		;set the baudrate
 ;
   IF SMMODEM                   ;if smartmodem, send start-up cmd(s)
INITSM:
        LXI     H,INISTR        ;point to initialization string
SENDLP: MVI     C,SNDRDY        ;MEX service function # 251                         
        CALL    MEX             ;test for modem-send-ready
        JNZ     SENDLP          ;loop if not ready
        MOV     A,M             ;get character
        INX     H               ;increment to next character address
        CPI     '$'             ;end-of-string ?
        JZ      INITEX          ;Yes, exit
        MOV     B,A             ;No, put character in B
        MVI     C,SNDCHR        ;MEX service function # 249
        CALL    MEX             ;let MEX output character to modem
        CALL    DELAY           ;needed for Anchor: others ???
        JMP     SENDLP          ;loop 'til end-of message
;
INITEX: MVI     B,5             ;wait 0.5 sec for modem to say "OK"
        MVI     C,TIMER         ;MEX service function # 254
        CALL    MEX             ;kill time
;
   ENDIF                        ;Smartmodem
; 
       RET
;
DELAY:  MVI	B,1             ;now set for 100 milliseconds
        MVI     C,TIMER         ;play with values until modem works
        CALL	MEX
        RET          
;
; You may define an intialization string in INISTR to set up smartmodem
; in any configuration desired. String must end with a '$'
;
;
; Command string sent to modem after I/O initialization
;
  IF SMMODEM
;
INISTR:
        DB      'ATV0',CR       ; Disable verbose mode
        DB	'ATS0=0',CR	; Disable auto-answer
   ENDIF                        ; Smartmodem 
;
   IF SMMODEM AND NOT ANCHOR    ; Pls check that your modem supports 
	DB	'ATX1',CR	; Send extended result codes
SPBYTE:	DB	'ATM1',CR	; Speaker on 'til connect
WABYTE:	DB	'ATS7=30',CR	; Wait 30 seconds for carrier
   ENDIF                        ; END of smartmodem AND not Anchor
;
   IF SMMODEM                   ; continuation after Anchor part	
        DB	'ATV1',CR	; Set verbose result codes
        DB      '$'             ; end-of-string :Must be here 
;
   ENDIF                        ;Smartmodem 
;
        RET
;
; Send-break routine
;
SBREAK: MVI     A,BREAK
        OUT     MODCTL
        MVI     B,2             ;wait 200 ms
        MVI     C,TIMER
        CALL    MEX
        MVI     A,CHIPSET       ;reset break
        OUT     MODCTL
        RET
;
; Exit routine --  called just before MEX exits to CP/M
;
DUMMY:	RET			;we don't need one
;
;
; Set Baud Rate
;
; New baud-rate code in A.
; NOTE: this routine (ie, the one vectored through NEWBDV) should
; update MSPEED with the passed code, but ONLY if that rate is
; supported by the hardware.
;
;	 A=0:   110 baud       A=1:   300 baud      A=2:   450 baud
;	 A=3:   600 baud       A=4:   710 baud      A=5:  1200 baud
;	 A=6:  2400 baud       A=7:  4800 baud      A=8: 19200 baud
;
SBAUD:	PUSH	H		;don't alter anybody
	PUSH	D
	PUSH	B
	MOV	C,A		;save baud rate code  
	MVI	B,0
	LXI	H,BTABL		;Get baudrate value
	DAD	B               ;HL now contains address of baudrate number
	MOV	A,M             ;A  now contains baudrate n
	CPI	NA		;See if baud rate valid
	STC			;set for not valid
	JZ	NOTVAL		;not valid
;
                                ;Set hardware/software implemented baudrate
	OUT     PBAUD           ;8253 now set
;
	MVI     A,RESET1        ;Insure out-of-mode state
	OUT     MODCTL          ;Modem status port
	MVI     A,RESET1        ;Do it again
        OUT     MODCTL          ;For slight extra delay
	MVI	A,RESET2        ;Then reset the USART 
	OUT	MODCTL          ;Modem status port
	XTHL			;delay -- must be in pairs
	XTHL
        MVI     A,N8251         ;This factor works for the range 150-1200 baud
	LXI	H,PARITY        ;A contains baudrate factor
        ORA     M               ;OR parity and data length w baudrate factor	
	OUT	MODCTL          ;8251 Mode now set
	MOV     A,C		; get baud rate code
	STA	MSPEED		;save baud rate code
	MVI	A,CHIPSET	;set chip for I/O
	OUT	MODCTL          ;8251 Command now set
	IN      MODDAT          ;Clear data port
	XRA	A		;clear carry flag
NOTVAL:	POP	B
	POP	D
	POP	H
	RET
;
; Parity control byte location
;
PARITY:	DB	NONE
;
; Baud rate table
;
BTABL:	DB	BD110
	DB	BD300
	DB	BD450
	DB	BD600
	DB	BD710
	DB	BD1200
	DB	BD2400
	DB	BD4800
	DB	BD9600
	DB	BD19K
; 
; Sign-on message
; 
SYSVER:	
        LXI     D,SOMESG	; Point to signon message
        MVI     C,PRINT         ; MEX print string
        CALL    MEX		; Print message on term
;
CARRSH:				; Carrier Show & Carrier Detect deleted
CARRCK: RET                     ; No carrier detect capability
;
;
SOMESG:
	DB	'Sanyo MBC-1000 programmable baudrate version '
        DB	REV/10+'0','.'
	DB	REV MOD 10+'0',CR,LF,'$'
;
;
; 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:	CALL    CRLF            ;for better readability
        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	STPAR
;
   IF NOT ANCHOR                ; Anchor has no speaker or prog. wait
	DB	'SPK','R'+80H	; "set spkr"
	DW	STSPKR
	DB	'WAI','T'+80H	; "set wait"
        DW	STWAIT
   ENDIF                        ;not Anchor modem
;
	DB	'DIA','L'+80H	; "set dial"
	DW	STDIAL
;

	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
	JZ      sthelp          ;exit with help menu 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	PSHOW
  IF NOT ANCHOR                 ;Anchor has no speaker or prog. wait
	DW	SPSHOW
  	DW	WASHOW
  ENDIF                         ;not Anchor
	DW	DISHOW
	DW	0		; <<== table terminator
;
;
; SET ?  processor
;
STHELP:	LXI	D,HLPMSG
	MVI	C,PRINT
	CALL	MEX
	RET
;
; The help message
;
HLPMSG:	DB	CR,LF,'SET commands:',CR,LF
;
	DB	CR,LF,'SET BAUD 300 <or> 1200'
;
	DB	CR,LF,'SET PARITY EVEN[8] <or> ODD[8] <or> NONE'
; 
   IF NOT ANCHOR                 ; Anchor has no speaker or prog.wait
;
        DB	CR,LF,'SET SPKR <OFF> or <ON> or <DEBUG>'
        DB	CR,LF,'SET WAIT <30> or <60> or <90>'
   ENDIF                         ; not Anchor	
;
	DB	CR,LF,'SET DIAL <TOUCH> or <PULSE>'
;
	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	SBAUD		;no, try to set it
	JC	SETERR		;not-supported code
        JMP     SETSHO          ;review parameters
;
BDSHOW:	CALL	ILPRT		;display baud
	DB	'Baud rate: ',0
	LDA	MSPEED
	MVI	C,PRBAUD	;use MEX routine
	CALL	MEX
        CALL    CRLF
	RET
;
; SET PARITY processor
;
STPAR:	LXI	D,PARTBL	;lookup next input item in table
	CALL	TSRCH
	JC	SETERR          ;if not found, error
	MOV	A,L             ;get parity code
	STA	PARITY		;store it 
	LDA	MSPEED		;get baud rate code 
	CALL	SBAUD           ;set parity
        JMP     SETSHO          ;review parameters
;
PSHOW:	CALL	ILPRT           ;show parity
	DB	'Parity:    ',0
	LXI	H,PARFND        ;find proper message
	LDA	PARITY          ;get parity value
	MOV	B,A
FNDP:	MOV	A,M             ;see if parity value matches
	ORA	A               ;first see if zero
	JZ	SETERR          ;should never get here
	CMP	B               ;match?
	INX	H               ;point to first letter of message
	JZ	CDISP           ;matches, type message
FNDNXT:	MOV	A,M
	ORA	A		;see if end of last message
	INX	H
	JP	FNDNXT		;not finished
	INX	H		;increment past parity byte
	JMP	FNDP
;
; PARITY argument table
; Format of the table is:  Starting at PARTBL, the name is
; given (ending with 80H bit set), then the one byte code
; for setting that parity.  The next byte duplicates the
; NEXT parity code (used in PSHOW).  The byte at PARFND
; duplicates the first parity code.
;
PARFND:	DB	EVEN
PARTBL:	DB	'EVE','N'+80H	;even parity, 7 data bits
	DB	EVEN,EVEN8
	DB	'EVEN','8'+80H	;even parity, 8 data bits
	DB	EVEN8,ODD
	DB	'OD','D'+80H	; odd parity, 7 data bits
	DB	ODD,ODD8
	DB	'ODD','8'+80H	; odd parity, 8 data bits
	DB	ODD8,NONE
	DB	'NON','E'+80H	;  no parity, 8 data bits
	DB	NONE,0
;
	DB	0		;<<== table terminator
;
;
;
   IF NOT ANCHOR                ; Anchor does not have speaker
;
; SET SPKR processor
;
STSPKR:	LXI	D,SPKTBL	; lookup next input item in table
	CALL	TSRCH
	JC	SETERR		; if not found, error
	STA	SPBYTE+1	; store the spkr command
	CALL	NITMOD		; (re)initialize modem
	JMP	SETSHO		; review parameters
;
SPSHOW:	CALL	ILPRT		; show spkr mode
	DB	'Speaker:   ' ,0
	LDA	SPBYTE+1	; get spkr byte
	CPI	'1'
	JZ	SPONPT		; spkr on part-time
	CPI	'2'
	JZ	SPON		; spkr on continuously
;
SPOFF:	CALL	ILPRT
	DB	'OFF',0
	RET
;
SPONPT:	CALL	ILPRT
	DB	'ON until connect',0
	RET
;
SPON:	CALL	ILPRT
	DB	'ON always',0
	RET
;
SPKTBL:	DB	'OF','F'+80H	; set spkr off
	DB	'0',0
	DB	'O','N'+80H	; set spkr on 'til connect	
	DB	'1',0
	DB	'DEBU','G'+80H	; set spkr on continuously
	DB	'2',0
 	DB	0		; <<=== table terminator
;
;
;
; SET WAIT processor
;
STWAIT:	LXI	D,WAITBL	; lookup next input item in table
	CALL	TSRCH           ; search for parameter value
	JC	SETERR		; if not found, error
	STA	WABYTE+5	; store the wait msb value
	MVI	A,'0'		; fake lsbyte
	STA	WABYTE+6	; store the wait lsb value
	CALL	NITMOD		; (re)initialize modem
	JMP	SETSHO		; review parameters
;
WASHOW:	CALL	ILPRT
	DB	'Wait:      ',0
	LDA	WABYTE+5
	CALL	TYPE		; show msb
	LDA	WABYTE+6
	CALL	TYPE		; show lsb
	CALL	ILPRT
	DB	' seconds for carrier',0
	RET
;
WAITBL:	DB	'3','0'+80H	; "set wait 30"
	DB	'3',0
	DB	'6','0'+80H	; "set wait 60"
	DB	'6',0
	DB	'9','0'+80H	; "set wait 90"
	DB	'9',0
	DB	0		; <<=== table terminator
;
   ENDIF                        ;not Anchor
;
;
;
; SET DIAL processor
;
STDIAL:	LXI	D,DIATBL	; lookup next input item in table
	CALL	TSRCH           ; search for parameter value
	JC	SETERR		; if not found, error
	STA	TPULSE		; store the dial command
	JMP	SETSHO		; review parameters
;
DISHOW:	CALL	ILPRT		; show dial mode
	DB	'Dial:      ',0
	LDA	TPULSE		; get dial byte
	CPI	'T'
	JZ	TTONE		; touch tone 
;
PDIAL:	CALL	ILPRT
	DB	'Pulse',0
	RET
;
TTONE:	CALL	ILPRT
	DB	'Touch Tone',0
	RET
;
; DIAL argument table
;
DIATBL:	DB	'TOUC','H'+80H	; touch tone
	DB	'T',0
	DB	'PULS','E'+80H	; pulse dial
	DB	'P',0
	DB	0		; <<=== table terminator
; 
;
;
;  Print message ending with 80H bit set
;
CDISP:	MOV	A,M		;get character to print
	INX	H		;point to next character
	PUSH	PSW		;save 80H bit
	ANI	7FH		;strip 80H bit just in case
	CALL	TYPE
	POP	PSW
	ORA	A
	JM	CRLF		;finished
	JMP	CDISP
;
; 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
;
;
;------------------------------------------------------------
;
; End of Sanyo MBC-1000 MEX modem overlay
;
;------------------------------------------------------------
;
	END