;	Title	'MEX overlay for the Sanyo MBC-1200/1250 Computer'
;
; 	This file adapts the Sanyo MBC-1200/1250 to the MEX modem program.
;
;	Created:    06/15/87    Last Modification:  06/15/87
;
;	NOTE:	Once you get this overlay into MEX, I heartily recommend
;		that you adjust the page size and clock speed in the running
;		program. To do the former, type 'STAT PAGE 33' and hit 
;		<ENTER> at the MEX:A0>> prompt. To do the latter, time 
;		a 60 second or so MEX 'SLEEP' command and adjust the 
;		clock speed with 'STAT CLOCK'. Once you've got it right,
;		use the 'CLONE' command to make a permanent version.  
;
; 	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, reassemble, and MLOAD the *.HEX file into
;	MEX as described in its documentation.
;____________________________________________________________________________
;
;	SOME GENERAL NOTES:
;
;	There are a variety of notes regarding how the overlay works, why it
;	is the way it is, what you can and can't do with it included here.
;
;	This overlay is intelligent regarding the SANYO 12## and stupid
;	regarding any specific modems. It has been debugged using a
;	SANYO 1250.
;
;	If you need to add code for your particular modem, likely spots for
;	its inclusion are after the 8215 chip mode initialization in the
;	NITMOD (initialize modem) routine and in the SET command handler
;	routine. You can get some general ideas from the Sanyo 1000 overlay
;	source by scanning for their SmartModem equate in IF clauses with
;	your editor and looking at what is done there. Most modem support
;	above and beyond initialization and SET command support seems more
;	appropriate in a separate overlay...
;
;	Relatively complete documentation of the 8251 usart used is included
;	in comments preceding the fixed format data area, along with equates
;	for the various mode word fields, etc. You can use this information
;	and the equates to adjust the operation of the overlay and to modify
;	any routines you want to...
;
;	If you wish to use this overlay with some SmartModem overlay, bear
;	in mind that it must end before that one starts.
;
;	The SET command implemented in this overlay gives relatively full
;	control of the 8251 usart used by the Sanyo 12##'s for RS232C
;	interface imlementation. More than you are likely to use. The modem
;	specific stuff is pretty much up to you. Code for a "SET DIAL"
;	command that sets the TPULSE flag byte (location 105H) used by
;	SmartModem overlays for TOUCH/PULSE dialing control was left in
;	IF clauses controlled by the DIALSET equate. This command does
;	nothing but set the flag one way or another. You need more code
;	to actually make it do something useful (such code might live in
;	a separate overlay source code fiel such as the one(s) for the
;	SmartModem), but it's there if you want it. Set the DIALSET equate
;	to YES if you do.
;
;	Further information on the SET command can be found near the code
;	actually implements it. Search for the string "SET COMMAND" and
;	you shall be rewarded...
;____________________________________________________________________________
;
;	BAUD RATE NOTES:
;
; 	Use the "SET" command to change the baudrate when desired.  It starts
; 	out at 1200 baud when the program is first called up.
;
; 	Only 300 & 1200 Baud are enabled. Due to the way the Sanyo 12##'s are
;	designed, anything else requires modifying the positions of baud rate
;	jumpers in the box.
;
;	*********************************************************************
;	NOTE:	Since the Sanyos basically control the baud rate thru
;		jumpering, it follows that there is a right way and a wrong
;		way for those jumpers to be set when using this program. It
;		just so happens that the default factory setting is 1200 baud
;		in the 8251 usart chip 16x mode, which is exactly what we want
;		here. This allows us to go to 64x mode and get 300 baud on
;		those unfortunate and unusual occasions when we want it.
;		Since the 8251 clock rate divisor modes are in multiples of
;		four, there is no way I know of to get both 2400 and 1200
;		baud out of the same jumper setting. You could wire in a
;		switch... Nonetheless, one of these days, if you still have
;           	this box when 4800 baud becomes the vogue, the code changes
;           	will be simplicity itself.
;	*********************************************************************
;____________________________________________________________________________
;
;	CREDIT WHERE CREDIT IS DUE DEPARTMENT:
;
;	This overlay file originated in the overlay for the SANYO 1000
;	called MXO-SY21.ASM, which in turn originated someplace else....
;
;	The hardware is different enough that quite a large portion of the
;	code here is either new or re-arranged to suit my quirky mentality.
;	Nonetheless, much has been retained, and never having done any code
;	of this variety before, my thanks to Bob Sandel, who wrote the
;	overlay for the 1000.
;
;____________________________________________________________________________
;
REV	EQU	10		; Overlay revision level
;
; 	Miscellaneous equates
;
YES	EQU	0FFH
NO	EQU	0
ALLBITS EQU	11111111B
;
;	ASCII character equates
;
BELL	EQU	07H		; Bell
TAB	EQU	09H		; Tab
LF	EQU	0AH		; Line feed
CR	EQU	0DH		; Carriage return
ESC	EQU	1BH		; Escape
;
; 	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. Refer to the docs for any others.
;
TPA	EQU	0100H		; Transient Program Area
MEX	EQU	0D00H		; Address of the service processor
;
;	The following equate determines whether code is included to 
;	set the TPULSE dial flag that I must assume is used by some 
;	modem overlays. I have no use for it. You may.
;
DIALSET EQU	NO		; Include SET DIAL command?
;
PORT	EQU	0EDH		; Sanyo 8251 modem USART control port
MODCTL	EQU	PORT		; MODEM CONTROL PORT
MODDAT	EQU	PORT-1		; MODEM DATA PORT
;____________________________________________________________________________
;
;	SOME DOCUMENTATION ON THE 8251 USART USED IN THE SANYO(S)
;	and equates usable for controlling most of the stuff...
;____________________________________________________________________________
;
;	8251A chip mode word bit definitions
;
;	The initial data used to construct a mode word for the 8251
;	chip in default operation is located in the overlay data area
;	that follows the first fixed data area that is understood by MEX.
;	This area starts around address 01A7H and has a comment containing
;	the string "OVERLAY DATA AREA" if you want to scan for it...
;
;	+------+------+------+------+------+------+------+------+
;	| DB7  | DB6  | DB5  | DB4  | DB3  | DB2  | DB1  | DB0  |
;	+------+------+------+------+------+------+------+------+
;	| S2   | S1   | EP   | PEN  | L2   | L1   | B2   | B1   |
;	+------+------+------+------+------+------+------+------+
;	|      |      |      |      |      |      |      |
; 	|+-----+      |      |      |      |      |      |
;	||+-----------+      |      |      |      |      |
;	|||+-----------------+      |      |      |      |
;	||||+-----------------------+      |      |      |
;	|||||+-----------------------------+      |      |
;	||||||+-----------------------------------+      |
;	|||||||+-----------------------------------------+
;	||||||||
;	||||||||
;	|||||||+---------> 0    1    0    1
;	||||||+----------> 0    0    1    1
;	||||||       MODE: SYNC 1X   16X  64X
;	||||||
;	|||||+-----------> 0    1    0    1
;	||||+------------> 0    0    1    1
;	||||         CHAR: 5    6    7    8  (BITS)
;	||||
;	|||+-------------> PARITY: 1=ENABLE, 0=DISABLE
;	|||
;	||+--------------> PARITY: 1=EVEN,   0=ODD
;	||
;	|+---------------> 0    1    0    1
;	+----------------> 0    0    1    1
;		     STOP: N/A  1    1.5  2  (BITS)
;
;	Most of the above is self-explanatory. One comment on the MODE
;	settings 1x, 16, 64x. These are specifications that essentially
;	tell the usart chip, "the clock input you are getting is this
;	many times faster than it should be..." What this means is that
;	the 1, 16 or 64 that you specify is used by the chip to divide
;	the clock rate before using it. That is why using 16x as standard
;	for 1200 baud, we can goto 300 baud by switching to 64x, since:
;		 1200/300=4=64/16 or (1200*16)=(300*64)
;	Since I have no idea what or if the minimum usable clock rate is,
;	all bets are off if you rejumper your box and/or use 1x mode.
;	But by all means try it, if you need to...
;
;	Some mode equates:
;
;	Internal clock rate divisor
;
SYNC	EQU	00000000B	; SYNC MODE (NOT USED)
X01	EQU	00000001B	;   1X MODE (NOT USED)
X16	EQU	00000010B	;  16X MODE 1200 BAUD
X64	EQU	00000011B	;  64X MODE  300 BAUD
;
;	Character size
;
CHRLEN5 EQU	00000000B	; CHAR = 5 BITS
CHRLEN6 EQU	00000100B	; CHAR = 6 BITS
CHRLEN7 EQU	00001000B	; CHAR = 7 BITS
CHRLEN8 EQU	00001100B	; CHAR = 8 BITS
;
;	Parity enable/disable, even/odd
PTYENBL EQU	00010000B	; ENABLE
PTYDSBL EQU	00000000B	; DISABLE
PTYEVEN EQU	00100000B	; EVEN
PTYODD	EQU	00000000B	; ODD
;
;	Stop bit settings
;
STPB1	EQU	01000000B	; 1 STOP BIT
STPB1H	EQU	10000000B	; 1 1/2 STOP BITS
STPB2	EQU	11000000B	; 2 STOP BITS
;
;	8251A chip command word bit definitions
;	+------+------+------+------+------+------+------+------+
;	| DB7  | DB6  | DB5  | DB4  | DB3  | DB2  | DB1  | DB0  |
;	+------+------+------+------+------+------+------+------+
;	| EH   | IR   | RTS  | ER   | SBRK | RXE  | DTR  | TXEN |
;	+------+------+------+------+------+------+------+------+
;	|      |      |      |      |      |      |      |
; 	|+-----+      |      |      |      |      |      |
;	||+-----------+      |      |      |      |      |
;	|||+-----------------+      |      |      |      |
;	||||+-----------------------+      |      |      |
;	|||||+-----------------------------+      |      |
;	||||||+-----------------------------------+      |
;	|||||||+-----------------------------------------+
;	||||||||
;	||||||||
;	|||||||+---------> TRANSMIT: 1=ENABLE, 0=DISABLE
;	|||||||
;	||||||+----------> DATA TERMINAL READY:  1=FORCE (NOT DTR) TO ZERO
;	||||||
;	|||||+-----------> RECEIVE:  1=ENABLE, 0=DISABLE
;	|||||
;	||||+------------> SEND BREAK CHARACTER: 1=FORCE (TXD) TO ZERO
;	||||
;	|||+-------------> ERROR RESET: 	 1=RESET FLAGS PE, OE, FE
;	|||
;	||+--------------> REQUEST TO SEND:	 1=FORCE (NOT RTS) TO ZERO
;	||
;	|+---------------> INTERNAL RESET:	 1=GOTO MODESET MODE
;	|
;	+----------------> ENTER HUNT MODE:	 1=ENABLE SEARCH FOR SYNC CHRS
;						 (NO EFFECT IN ASYNC MODE)					
;	
;	NOTE: MUST PERFORM ERROR RESET WHENEVER RXE AND EH ARE PROGRAMMED.
;
;	Some command equates
;	
EH	EQU	10000000B	; ENTER  HUNT MODE
IR	EQU	01000000B	; INTERNAL RESET
RTS	EQU	00100000B	; REQUEST TO SEND
ER	EQU	00010000B	; ERROR RESET
SBRK	EQU	00001000B	; SEND BREAK CHARACTER 
RXE	EQU	00000100B	; RECEIVE ENABLE
DTR	EQU	00000010B	; DATA TERMINAL READY
TXEN	EQU	00000001B	; TRANSMIT ENABLE
;
;	8251A chip status word bit definitions
;	+-------+-------+-------+-------+-------+-------+-------+-------+
;	| DB7   | DB6   | DB5   | DB4   | DB3   | DB2   | DB1   | DB0   |
;	+-------+-------+-------+-------+-------+-------+-------+-------+
;	| DSR   | SYNDET| FE    | OE    | PE    |TXEMPTY| RXRDY | TXRDY |
;	+-------+-------+-------+-------+-------+-------+-------+-------+
;	|       |       |       |       |       |       |       |
; 	|+------+       |       |       |       |       |       |
;	||+-------------+       |       |       |       |       | 
;	|||+--------------------+       |       |       |       | 
;	||||+---------------------------+       |       |       |
;	|||||+----------------------------------+       |       |
;	||||||+-----------------------------------------+       |
;	|||||||+------------------------------------------------+
;	||||||||
;	||||||||
;	|||||||+---------> BIT HAS DIFFERENT MEANING FROM TXRDY OUTPUT PIN
;	|||||||		   BIT NOT CONDITIONED BY (NOT CTS) AND TXEN.
;	|||||||		       MEANS: DB BUFFER EMPTY
;	|||||||		   PIN IS CONDITIONED BY POTH OF THE ABOVE.
;	|||||||		       MEANS: DB BUFFER EMPTY * (CTS=0) * (TXEN=1)
;	|||||||
;	||||||+----------> SAME AS I/O PIN
;	||||||
;	|||||+-----------> SAME AS I/O PIN
;	|||||
;	||||+------------> PARITY ERROR: SET WHEN A PARITY ERROR IS DETECTED.
;	||||		   RESET BY COMMAND WORD ER BIT. DOESN'T INHIBIT 8251
;	||||
;	|||+-------------> OVERRUN ERROR: SET WHEN CPU DOESN'T READ A CHAR 
;	|||		   BEFORE NEXT IS AVAILABLE. RESET BY ER BIT OF
;	|||		   COMMAND WORD. DOESN'T INHIBIT 8251 OPERATION.
;	|||
;	||+--------------> FRAMING ERROR: SET WHEN VALID STOP BIT IS NOT 
;	||		   DETECTED AT THE END OF EVERY CHARACTER. RESET BY
;	||		   ER BIT OF COMMAND WORD. DOESN'T INHIBIT 8251.
;	||
;	|+---------------> SAME AS I/O PIN.
;	|
;	+----------------> DATA SET READY: INDICATES DSR IS AT ZERO 
;
;	Some status equates
;
DSR	EQU	10000000B	; DATA SET READY
SYNDET	EQU	01000000B	; 
FE	EQU	00100000B	; FRAMING ERROR
OE	EQU	00010000B	; OVERRUN ERROR 
PE	EQU	00001000B	; PARITY ERROR
TXEMPTY EQU	00000100B	; 
RXRDY	EQU	00000010B	; 
TXRDY	EQU	00000001B	; 
;
;	Various byte equate values constructed from the above follow..
;
RESET1	EQU	EH+RXE+DTR+TXEN	; Initialize UART
RESET2	EQU	IR		; Internal reset
CHIPSET EQU	RTS+RXE+DTR+TXEN ; DTR, RTS, RE, TE
DISCNT	EQU	ER+RXE+DTR+TXEN	; No DTR, RTS, RE, TE
;
;  Progammable Baud Rate factors (theoretical)        
;
NA	EQU	0FFH		; Value for baud rate not available
;
BD110	EQU	NA		; NO 110	BAUD RATE 0    
BD300	EQU	X64		; <300>     	BAUD RATE 1
BD450	EQU	NA		; NO 450    	BAUD RATE 2
BD600	EQU	NA		; NO 600    	BAUD RATE 3
BD710	EQU	NA		; NO 710    	BAUD RATE 4
BD1200	EQU	X16		; <1200>	BAUD RATE 5
BD2400	EQU	NA		; NO 2400   	BAUD RATE 6
BD4800	EQU	NA		; NO 4800   	BAUD RATE 7
BD9600	EQU	NA		; NO 9600   	BAUD RATE 8
BD19K	EQU	NA		; NO 19200  	BAUD RATE 9
;____________________________________________________________________________
;
; 	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
;_____________________________________________________________________________
;
;	BEGIN FIXED FORMAT DATA AREA 
;	This data area is layed out in a format understood by MEX. 
;	Don't mess with the ordering of data here, as it is used to 
;	synchronize the operations of MEX with this and any other 
;	overlay(s) you may be using.
;
	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   (not referenced by MEX)
SMODEM:	DB	NO		; Yes=Smartmodem   (not referenced by MEX)
TPULSE:	DB	'P'		; T=touch, P=pulse (not referenced by MEX)

;	NOTE:	This peculiar clock speed was set by timing the 
;		MEX 'SLEEP' command on my box. If yours is different,
;		just change it with 'STAT CLOCK' and 'CLONE' MEX.
CLOCK:	DB	47		; Clock speed x .1, up to 25.5 mhz.
MSPEED:	DB	5		; 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
;
	DS	2		; Not used - only for PMMI routines
;
; 	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	RXRDY		; Bit to test for receive ready
	RET
;
TESTR:	CPI	RXRDY		; Value of receive bit when ready
	RET
;
MASKS:	ANI	TXRDY		; Bit to test for send ready
	RET
;
TESTS:	CPI	TXRDY		; Value of send bit when ready				
	RET
;
; 	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	CPMEXT		; 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	; Null: no clear to end of screen
	MVI	C,PRINT
	CALL	MEX
	RET
;
CLS:	LXI	D,CLSMSG	; Clear screen, home cursor
	MVI	C,PRINT
	CALL	MEX
	RET
;
;	END OF FIXED FORMAT AREA 
;
;____________________________________________________________________________
;
;	BEGIN OVERLAY DATA AREA
;	
;	The following data areas are used by the overlay code for various
;	operations MEX calls on it to perform. The ordering is not important
;	except where noted in the comments. 
;
;	Some other data areas are scattered thruout the remainder of the file.
;	These are mostly tables referenced from discrete routines and are thus
;	most conveniently kept in the vicinity of those routines.
;	
;	Sign-on Message
;	You can use this as an "eye-catcher" when debugging or patching
;	this file. Marks the beginning of the overlay data area.
;
SOMESG:
	DB	'Sanyo MBC-1200/1250 computer 300/1200 BAUD Version '
	DB	REV/10+'0','.'
	DB	REV MOD 10+'0',CR,LF
	DB	'$'
;
; 	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)
;
; 	Baud rate table
;
BTABL:	DB	BD110		; The byte called MSPEED is used to 
	DB	BD300		;  index into this table to find the 
	DB	BD450		;   current baud rate. For example, if 
	DB	BD600		;    MSPEED equals 5, then the baud rate
	DB	BD710		;     is 1200, since thatis the fifth entry 
	DB	BD1200		;      PAST the entry at BTABL. 
	DB	BD2400		; 	To reset the baud rate, simply 
	DB	BD4800		; 	 MSPEED to the offset of the desired
	DB	BD9600		; 	  baud and calling the SBAUD routine 
	DB	BD19K		; 	   suffices.
;
;	8251 mode bits, saved by bit group
;	The current values of the following bytes are or'ed together
;	to form an 8251 mode word and output to the chip in the MODESET
;	routine. Each byte represents certain bit positions in the mode 
;	word, and no attempt at error checking is made in the MODESET
;	routine. The CLKMOD byte represents the baud rate used (300 or 1200)
;	and is only updated thru use of the SBAUD routine, which chooses
;	from the baud rate table above based on the MSPEED byte. It will 
;	not update the baud if the value is bad. 
;
CLKMOD:	DB	X16		; Mode bits: CLOCK DIVISOR (X16=1200 baud)
CHRLEN:	DB	CHRLEN8		; Mode bits: CHARACTER LENGTH
PARITY:	DB	PTYDSBL		; Mode bits: PARITY
STOP:	DB	STPB1		; Mode bits: STOP BITS
;
;	END OVERLAY DATA AREA
;
;____________________________________________________________________________
;
;	BEGIN EXECUTABLE CODE
;
;	Carrier Show and Carrier Detect deleted.
;	No carrier detect capability.
;
CARRSH:	
CARRCK:	
;
; 	Exit routine --  called just before MEX exits to CP/M
;
CPMEXT:
;
;	DUMMY routine for calls that are not implemented.
;
DUMMY:	RET			; We don't need one
;____________________________________________________________________________
;
; 	Modem initialization.
;
NITMOD:	LDA	MSPEED		; Get current baud rate setting 
	CALL	SBAUD		; Set the baudrate
	RET
;
; 	Send-break routine
;
SBREAK:	MVI	A,SBRK+CHIPSET	; Break control byte
	OUT	MODCTL		; Output
	MVI	B,2		; Wait 200 ms
	MVI	C,TIMER		; MEX fcn code
	CALL	MEX		; Time out
	MVI	A,CHIPSET	; Reset break
	OUT	MODCTL		; Output
	RET			; Return to caller
;
; 	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
;
;	The only baud rates supported are 300 and 1200.
;
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: bypass setting it
;	
;	Baud rate ok so set it
;
	STA	CLKMOD		; Put new baud code in clock rate byte
	MOV	A,C		; Get baud rate code  (for MEX)
	STA	MSPEED		; Save baud rate code (for MEX)
	CALL	MODESET		; Call routine to tell 8251 about it
	XRA	A		; Clear carry flag
;
;	Return point for valid and not valid calls
;
NOTVAL:	POP	B		; Restore registers and return
	POP	D
	POP	H
	RET
;
;	This code sets the 8251 chip mode from the mode bytes.
;	Multiple bytes, each representing certain bit positions 
;	of the mode word are or'ed together here. MODESET is 
;	intended to be called from setup routines.
;
;	The accumulator is trashed, flags are arbitrary.
;
MODESET:
	PUSH	H		; HL is all we save here... 
	MVI	A,RESET1	; Insure out-of-mode state
	OUT	MODCTL		; Modem control port
	MVI	A,RESET1	; Do it again
	OUT	MODCTL		; For slight extra delay
	MVI	A,RESET2	; Then reset the USART 
	OUT	MODCTL		; Modem control port
	XTHL			; Delay -- must be in pairs
	XTHL			; Restore the glory that once was...
	LDA	CLKMOD		; Get 8251 clock mode
	LXI	H,CHRLEN	; Point at character length byte
	ORA	M		; Set bits
	LXI	H,PARITY	; Point at parity setting byte 
	ORA	M		; Set bits
	LXI	H,STOP		; Point at stop bit setting byte
	ORA	M		; Set bits
	OUT	MODCTL		; 8251 Mode now set
	MVI	A,CHIPSET	; Set chip for I/O
	OUT	MODCTL		; 8251 Command now set
	IN	MODDAT		; Clear data port
	POP	H		; Get it back...
	RET			; Return to caller
; 
; 	Sign-on message
; 
SYSVER:	
	CALL	CRLF		; Skip a line
	LXI	D,SOMESG	; Point to signon message
	MVI	C,PRINT		; MEX print string
	CALL	MEX		; Print message on term
	CALL	CRLF		; Skip a line
	CALL	SETSH2		; Show settings w/o scrn clr
;
; 	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
;____________________________________________________________________________
;
;	SET COMMAND NOTES (as implemented by this overlay):
;
;	SET STOPBIT <1/1.5/2>
;	SET CHARLEN <5/6/7/8>
;	SET BAUD    <1200/300>
;	SET PARITY  <EVEN/ODD/NONE>
;
;	Optional:
;	SET DIAL    <TOUCH/PULSE>
;____________________________________________________________________________
;
; 	SET COMMAND processor and data - the rest of this overlay is 
;	devoted to the implementation of the command and its options.
;	
; 	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 <300/1200>
	DW	STBAUD
	DB	'PARIT','Y'+80H	; SET PARITY <EVEN/ODD/NONE>
	DW	STPAR
	DB	'CHARLE','N'+80H ; SET CHARLEN <5/6/7/8>		
	DW	SETCLN
	DB	'STOPBI','T'+80H ; SET STOPBIT <1/1.5/2>
	DW	SETSB
;
	 IF	DIALSET		; (OPTIONAL)
	DB	'DIA','L'+80H	; SET DIAL <TOUCH/PULSE>
	DW	STDIAL
	 ENDIF
;

	DB	0		; <<=== table terminator
;
; 	SET <no-args>: print current statistics
;
SETSHO:	
	CALL	CLS		; Clear screen
SETSH2:
	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	SETSHX		; 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
SETSHX:	CALL	CRLF		; Skip a line
	RET
;
GOHL:	PCHL
;
; 	table of SHOW subroutines
; 
SHOTBL:	DW	BDSHOW		; BAUD
	DW	PSHOW		; PARITY
	DW	CLSHOW		; CHARACTER LENGTH
	DW	SBSHOW		; STOP BIT(S)
;
	 IF	DIALSET		; (OPTIONAL)
	DW	DISHOW		; DIAL
	 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 commands:',CR,LF
;
	DB	CR,LF,'SET BAUD 300 <or> 1200'
;
	DB	CR,LF,'SET PARITY EVEN <or> ODD <or> NONE'
;
	DB	CR,LF,'SET STOPBIT 1 <or> 1.5 <or> 2'
;
	DB	CR,LF,'SET CHARLEN 5 <or> 6 <or> 7 <or> 8'
; 
	 IF	DIALSET		; (OPTIONAL)
	DB	CR,LF,'SET DIAL <TOUCH> or <PULSE>'
	 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	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
	RET
;
; 	SET PARITY processor
;	NOTE:	Since zero is one of the valid possible values for 
;		the parity bytes and the table scanning routines use
;		that as an end of table error marker, the bits of the
;		actual parity byte are "flipped" using an XOR previous
;		to searching the table for it, then flipped back before 
;		updating the parity byte. Thus the values in the table
;		are one's complements or "negative logic" relative to 
;		the byte saved as parity and used to set the 8251 chip.
;
STPAR:	LXI	D,PARTBL	; Lookup next input item in table
	CALL	TSRCH
	JC	SETERR		; If not found, error
	MOV	A,L		; Get parity code
	XRI	11111111B	; Flip the bits ... see note above
	STA	PARITY		; Store it 
	CALL	MODESET		; 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
	XRI	11111111B	; Flip the bits ... see note above
	MOV	B,A		; Second copy for SHWSCN routine
	JMP	SHWSCN		; Goto show value scan routine
;
; 	PARITY argument table
;	Table format: starting at PARFND, each entry has the one byte
;		code followed by the name string terminating with a 
;		high bit set in the last character, followed by the
;		one byte code again. The last entry is followed by zero.
;	This odd format allows the table to be used for multiple purposes.
;
;	NOTE:	Since zero is one of the valid possible values for 
;		the parity bytes and the table scanning routines use
;		that as an end of table error marker, the bits of the
;		actual parity byte are "flipped" using an XOR previous
;		to searching the table for it, then flipped back before 
;		updating the parity byte. Thus the values in the table
;		are one's complements or "negative logic" relative to 
;		the byte saved as parity and used to set the 8251 chip.
;
TPEVEN	EQU	ALLBITS-(PTYEVEN+PTYENBL) ; EVEN PARITY ENABLED (INVERSE BITS)
TPODD	EQU	ALLBITS-(PTYODD+PTYENBL) ; ODD  PARITY ENABLED (INVERSE BITS)
TPNONE	EQU	ALLBITS-(PTYDSBL) ; PARITY DISABLED     (INVERSE BITS)
;
PARFND:	DB	TPEVEN
PARTBL:	DB	'EVE','N'+80H	; Even parity
	DB	TPEVEN,TPODD
	DB	'OD','D'+80H	; Odd  parity
	DB	TPODD,TPNONE
	DB	'NON','E'+80H	; No   parity
	DB	TPNONE,0
;
	DB	0		; <<== table terminator
;
; 	SET STOPBIT processor
;
SETSB:	LXI	D,SBTBL		; Lookup next input item in table
	CALL	TSRCH
	JC	SETERR		; If not found, error
	MOV	A,L		; Get stopbit code
	STA	STOP		; Store it 
	CALL	MODESET		; Set stopbit
	JMP	SETSHO		; Review parameters
;
SBSHOW:	CALL	ILPRT		; Show stopbit
	DB	'Stop bits: ',0
	LXI	H,SBFIND	; Find proper message
	LDA	STOP		; Get stopbit value
	MOV	B,A		; Second copy for SHWSCN routine
	JMP	SHWSCN		; Goto show value scan routine
;
; 	STOPBIT argument table
; 	Format of the table is identical to that of parity table
;	except that no "negative logic" is necessary or used.
;
SBFIND:	DB	STPB1
SBTBL:	DB	'1'+80H		; One stop bit
	DB	STPB1,STPB1H
	DB	'1.','5'+80H	; One and a half stop bits
	DB	STPB1H,STPB2
	DB	'2'+80H		; Two stop bits
	DB	STPB2,0
;
	DB	0		; <<== table terminator
;
; 	SET CHARLEN processor
;	NOTE:	Since zero is one of the valid possible values for 
;		the charlen bytes and the table scanning routines use
;		that as an end of table error marker, the bits of the
;		actual charlen byte are "flipped" using an XOR previous
;		to searching the table for it, then flipped back before 
;		updating the charlen byte. Thus the values in the table
;		are one's complements or "negative logic" relative to 
;		the byte saved as charlen and used to set the 8251 chip.
;
SETCLN:	LXI	D,CLNTBL	; Lookup next input item in table
	CALL	TSRCH
	JC	SETERR		; If not found, error
	MOV	A,L		; Get charlen code
	XRI	11111111B	; Flip the bits ... see note above
	STA	CHRLEN		; Store it 
	CALL	MODESET		; Set stopbit
	JMP	SETSHO		; Review parameters
;
CLSHOW:	CALL	ILPRT		; Show charlen
	DB	'Char len:  ',0
	LXI	H,CLFIND	; Find proper message
	LDA	CHRLEN		; Get charlen value
	XRI	11111111B	; Flip the bits ... see note above
	MOV	B,A		; Second copy for SHWSCN routine
	JMP	SHWSCN		; Goto show value scan routine
;
; 	CHARLEN argument table
; 	Format of the table is identical to that of parity table
;
;	NOTE:	Since zero is one of the valid possible values for 
;		the charlen bytes and the table scanning routines use
;		that as an end of table error marker, the bits of the
;		actual charlen byte are "flipped" using an XOR previous
;		to searching the table for it, then flipped back before 
;		updating the charlen byte. Thus the values in the table
;		are one's complements or "negative logic" relative to 
;		the byte saved as charlen and used to set the 8251 chip.
;
TCLEN5	EQU	ALLBITS-(CHRLEN5) ; CHARACTER LENGTH = 5 (INVERSE BITS)
TCLEN6	EQU	ALLBITS-(CHRLEN6) ; CHARACTER LENGTH = 6 (INVERSE BITS)
TCLEN7	EQU	ALLBITS-(CHRLEN7) ; CHARACTER LENGTH = 7 (INVERSE BITS)
TCLEN8	EQU	ALLBITS-(CHRLEN8) ; CHARACTER LENGTH = 8 (INVERSE BITS)
;
CLFIND:	DB	TCLEN5
CLNTBL:	DB	'5'+80H		; 5 bits
	DB	TCLEN5,TCLEN6
	DB	'6'+80H		; 6 bits
	DB	TCLEN6,TCLEN7
	DB	'7'+80H		; 7 bits
	DB	TCLEN7,TCLEN8
	DB	'8'+80H		; 8 bits
	DB	TCLEN8,0
;
	DB	0		; <<== table terminator
;
	 IF	DIALSET
;
; 	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
	 ENDIF
;
;	Show set value scan routine
;
SHWSCN:	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	SHWSCN
;
;  	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
;------	JP	M,CRLF		; Finished
	RM			; 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-1200/1250 MEX modem overlay
;
;____________________________________________________________________________
;
	END

