
; MXO-BBI0.ASM --
;	Big Board I (& incidentally XEROX 820, II) overlay file for
;	MEX10. 16 June 1985
;
; 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.
; This file adapts the Big Board I to MEX Version 1.0.  This overlay
; is not intended to support MDM7xx in any of it's incarnations.
;
; Edit this file 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 300 baud when the program is first called up.  Please note the
; extensions to the SET command below.  You may now set the parity,
; word size, & number of stop bits in addition to the baud rate.  The
; SET command also implements a local help file.
;
;	TO USE: First edit this file filling in answers for your own
;		equipment.  Then assemble with ASM.COM or equivalent
;		assembler.  Then use MLOAD to overlay the the results
;		of this program to the original .COM file.
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
; 06/18/85 - Removed auto-baud bug & added	- Richard Williams
;            help file.
; 06/16/85 - Expanded SET command & cleaned	- Richard Williams
;            up listing for 80 columns.
; 11/12/84 - Addapted to Big Board I		- Richard Williams
; 05/24/84 - MEXified overlay			- Biff Bueffel
; 11/11/83 - Renamed to M7XE-1.ASM, no changes	- Irv Hoff
; 07/27/83 - Renamed to work with MDM712	- Irv Hoff
; 07/01/83 - Revised to work with MDM711	- Irv Hoff
; 06/22/83 - Revised to work with MDM710	- Irv Hoff
; 05/27/83 - Updated to work with MDM709	- Irv Hoff
; 05/15/83 - Revised to work with MDM708	- Irv Hoff
; 04/11/83 - Updated to work with MDM707	- Irv Hoff
; 04/04/83 - Updated to work with MDM706	- Irv Hoff
; 03/03/83 - Modified MDM705KP for XEROX
;            820-II computers with external
;            modems				- David Wurz	
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; The obligatory equates...
;
YES:		EQU	0FFH
NO:		EQU	0
;	
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; Here are the equates for the conditional assembly switches...
;
; Two serial ports are available.  See initialization area for info.
; Port A is the commonly used port.
PORT$A	EQU	YES		;set to no for Port B
PORT$B	EQU	NOT PORT$A
;
; This overlay can display the port status on every invocation of the
; set baud routine (ALWAYS = YES) or will display the status on a null
; argument SET command and/or a SET command with only the expanded
; arguments (ALWAYS =NO).  If ALWAYS = YES, then the port status will
; also be displayed on an auto baud rate change from the phone
; directory.
ALWAYS	EQU	NO		;do not display port status
;				; on every change.
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; Instruction equates...
;
IN$RET	EQU	0C9H	;unconditional return
IN$MVI	EQU	03EH	;move immediate to reg. A
IN$ANI	EQU	0E6H	;AND immediate with reg. A
IN$ORI	EQU	0F6H	;OR immediate with reg. A
IN$LHLD	EQU	02AH	;load reg. HL at address
IN$EOC	EQU	076H	;End Of Coffee
;
; Character equates...
;
BELL:	EQU	007H	;bell
CR:	EQU	00DH	;carriage return
ESC:	EQU	01BH	;escape
LF:	EQU	00AH	;linefeed
;
; MEX service processor stuff...
;
MEX	EQU	0D00H	;address of the service processor.
INMDM	EQU	255	;get char from port to A, CY=no more within 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	;receive a char from the 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 next 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.
;
PRINT	EQU	9	;MEX/BDOS print-string function call.
;
; MEX baud rate command numbers...
;
C110	EQU	000H	; 110 baud
C300	EQU	001H	; 300 baud
C450	EQU	002H	; 450 baud  ** not supported on this machine **
C600	EQU	003H	; 600 baud
C710	EQU	004H	; 710 baud  ** not supported on this machine **
C1200	EQU	005H	; 1200 baud
C2400	EQU	006H	; 2400 baud
C4800	EQU	007H	; 4800 baud
C9600	EQU	008H	; 9600 baud
C19200	EQU	009H	; 19200 baud
CERROR	EQU	0FFH	; for `unrecognized' baud rates.
;
	ORG	100H
	DS	3	;(for  "JMP   START" instruction)
;
; MEX variables, constants, flags, & what have you...
;
PMMI:	DB	NO	;yes=PMMI S-100 Modem			103H
SMDM:	DB	YES	;yes=HAYES Smartmodem, no=non-PMMI	104H
TORP:	DB	'T'	;T=touch, P=pulse (Smartmodem-only)	105H
			;
			;  Change the clock speed to suit
			;  your system...
CLOCK:	DB	40	;clock speed in MHz x10, 25.5 MHz max.	106H
			;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
MSPEED:	DB	1	;0=110 1=300 2=450 3=600 4=710 5=1200	107H
			;6=2400 7=4800 8=9600 9=19200 default
BYTDLY:	DB	5	;0=0 delay  1=10ms  5=50 ms - 9=90 ms	108H
			;default time to send character in ter-
			;minal mode file transfer for slow BBS.
CRDLY:	DB	5	;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
			;default time for extra wait after CRLF
			;in terminal mode file transfer
			;
NUMCOL:	DB	5	;number of DIR columns shown		10AH
USET:	DB	YES	;yes=user-added Setup routine		10BH
SCRN:	DB	YES	;Cursor control routine			10CH
			;
ACKNAK:	DB	YES	;yes=resend a record after any non-ACK	10DH
			;no=resend a record after a valid NAK
BAKUP:	DB	NO	;yes=change any file same name to .BAK	10EH
CRCDEF:	DB	YES	;yes=default to CRC checking		10FH
CRCTOG:	DB	YES	;yes=allow toggling of CRC to Checksum	110H
			;
CNVRUB:	DB	NO	;yes=convert backspace to rub		111H
TOGRUB:	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	YES	;yes=allow transmission of logon	115H
			;write logon sequence at location LOGON
SAVCCP:	DB	YES	;yes=do not overwrite CCP		116H
LCLNXT:	DB	NO	;yes=local command if EXTCHR precedes	117H
			;no=external command if EXTCHR precedes
LCLTGL:	DB	YES	;yes=allow toggling of LCLNXT		118H
LSTTST:	DB	YES	;yes=printer available on printer port	119H
XOFFT:	DB	YES	;yes=check for XOFF from remote	while	11AH
			;sending a file in terminal mode
XONWT:	DB	NO	;yes=wait for XON after CR while	11BH
			;sending a file in terminal mode
TGXOFF:	DB	YES	;yes=allow toggling of XOFF checking	11CH
IGNCTL:	DB	YES	;yes=CTL-chars above ^M not displayed	11DH
			;
EXTRA1:	DB	0	;for future expansion			11EH
EXTRA2:	DB	0	;for future expansion			11FH
			;
BRKCHR:	DB	'@'-40H	;^@ = Send a 300 ms. break tone		120H
HANGUP:	DB	'N'-40H	;^N = Disconnect from the phone line	121H
LOGCHR:	DB	'L'-40H	;^L = Send logon			122H
LSTCHR:	DB	'P'-40H	;^P = Toggle printer			123H
UNSAVE:	DB	'R'-40H	;^R = Close input text buffer		124H
TRANS:	DB	'T'-40H	;^T = Transmit file to remote		125H
SAVE:	DB	'Y'-40H	;^Y = Open input text buffer		126H
EXTCHR:	DB	'^'-40H	;^^ = Send next character		127H
	DS	2	;					128H
;
; MEX jump vectors (& such)...
;
ICTL1:	MVI	A,00$010$000B	;,reset latched status bits,.	12AH
	OUT	CTL1
	IN	CTL1		;get the status bits
	RET
	DS	3
;
ODATP:	OUT	DATP ! RET	;out modem data port		134H
	DS	7
;
IDATP:	IN	DATP ! RET	;in modem data port		13EH
	DS	7
;
ARCVB:	ANI	RCVB ! RET	;bit to test for receive ready	148H
CRCVR:	CPI	RCVR ! RET	;value of receive bit when rdy	14BH
;
ASNDB:	ANI	SNDB ! RET	;bit to test for send ready	14EH
CSNDR:	CPI	SNDR ! RET	;value of send bit when ready	151H
	DS	6		;				154H
;
OCTL1:	OUT	CTL1 ! RET	;out modem control port		15AH
OCTL2:	OUT	CTL2 ! RET	;out modem status port		15DH
	DS	2		;Not used by MEX		160H
	DS	6		;				162H
;
GBYEV:	JMP	GBYE		;hang up.			168H
;
INITV:	JMP	INIT		;go to user written routine	16BH
;
NEWBV	JMP	NEWB		;Change baudrate		16EH
	RET  !	NOP  !	NOP	;(by-passes PMMI routine)	171H
	RET  !	NOP  !	NOP	;(by-passes PMMI routine)	174H
;
SETBV:	JMP	SETB		;user `SET' baud rate		177H
	DS	3		;				17AH
;
SYSVV:	JMP	SYSV		;display system version		17DH
;
BRKV:	JMP	SNDBRK		;send break			180H
;
; Do not change the following six lines.
;
ILPRTV:	DS	3		;in line print			183H
INBUFV	DS	3		;input buffer			186H
ILCMPV:	DS	3		;in line comparison		189H
INMDMV	DS	3		;input from modem		18CH
NSCRNV:	DS	3		;new screen			18FH
TIMERV:	DS	3		;timer				192H
;
; Clear sequences -- CLREOS is clear to end of screen, CLRSCN is clear
; entire screen.  
;
CLREOS:	LXI	D,EOSMSG	;				195H
	MVI	C,PRINT
	CALL	MEX
	RET
;
CLRSCN:	LXI	D,CLSMSG	;				19EH
	MVI	C,PRINT
	CALL	MEX
	RET
;....
;
; Display system version...
;
SYSV:	MVI	C,ILP		;				1A7H
	CALL	MEX
	DB	CR,LF
	DB	'Version for Big Board I Serial Port A [004H]'
	DB	CR,LF,0
	RET
;....
;
; This routine allows a 300 ms. break tone to be sent to reset some
; time-shar computers.
;
SNDBRK:	MVI	A,XMTREG
	OUT	CTL1
	MVI	A,BRK		;send a break tone.
	JMP	GBYE1
;.....
;
; This routine sends a 300 ms. break tone and sets DTR low for the same
; length of time to disconnect some modems such as the Bell 212A, etc.	
;
GBYE:	MVI	A,XMTREG
	OUT	CTL1		;send to the status port
	MVI	A,DISCON	;turn off dtr
;
GBYE1:	OUT	CTL1		;set RS-232 bits
	MVI	B,3		;wait for 300 ms.
	MVI	C,TIMER
	CALL	MEX
	CALL	SETXMT		;restore the transmitter to normal
	RET
;.....
;
; Big Board I initialization -- sets up Z80 SIO & the COM8116...
;
;	Serial Port A = 004H	<=- the prefered choice.
;	Serial Port B = 005H
;
;	Either port is acceptable & the usage will depend upon the
;	configuration of your system.  If you are using an external
;	terminal, you will need to use Serial Port A.  If you are
;	using the on board video & a serial printer, then you will
;	need to use Serial Port B.  If you are using an external
;	terminal and a serial printer, check into obtaining a port
;	expansion board.  The jumper boards for the serial channels
;	will need to be set.  The following table lists the jumpers:
;
;	Signal	<pt A>	<pt B>	Direction
;		JB4	JB5
;	======	======	======	======================
;	TxD	 7- 8	 7- 8	from computer to modem
;	RxD	11-12	11-12	from modem to computer
;	RTS	15-16	15-16	from computer to modem
;	CTS	19-20	19-20	from modem to computer
;	DTR	23-24	23-24	from computer to modem
;	DCD	27-28	27-28	from modem to computer
;	RxC	31-32	(Port A receive baud rate clock)
;	TxC	35-36	(Port A transmit baud rate clock)
;
	IF	PORT$A
PORT	EQU	004H	;Big Board I Serial Output Port A.
GENR	EQU	000H	;Big Board I Baud Rate Generator for Port A.
	ENDIF	;Port A
;
	IF	PORT$B
PORT	EQU	005H	;Big Board I Serial Output Port B.
GENR	EQU	00CH	;Big Board I Baud Rate Generator for Port B.
	ENDIF	;Port B
;
CTL1:	EQU	PORT+2	;Modem control port.
DATP:	EQU	PORT	;Modem data port.
CTL2:	EQU	PORT+2	;Modem status port.
;
CMDREG	EQU	000H	;SIO command register.
FMTREG	EQU	004H	;SIO serial format register.
RCVREG	EQU	003H	;SIO receiver control register.
XMTREG	EQU	005H	;SIO transmitter control register.
;
RCVB:	EQU	01H	;Your bits to test for receive.
RCVR:	EQU	01H	;Your value when receive ready.
SNDB:	EQU	04H	;Your bits to test for send.
SNDR:	EQU	04H	;Your value when send ready.
DCDB	EQU	08H	;Your bit to test for Data Carrier Detect.
DCDR	EQU	08H	;Your value when Data Carrier Detect(ed).
;
; The following values are sent to the Transmitter Control
; (Reg. 5) of the SIO.
;
NORMAL:	EQU	1$11$0$1$0$1$0B	;Your value for normal comm'n mode.
BRK:	EQU	1$11$1$1$0$1$0B	;Your value for send break.
DISCON:	EQU	0$11$0$0$0$0$0B	;Your value for disconnection.
;
; Baud rate constants for the COM8116 baud rate generator...
;
G50	EQU	000H	; 50 baud
G75	EQU	001H	; 75 baud
G110	EQU	002H	; 110 baud
G135	EQU	003H	; 135 baud
G150	EQU	004H	; 150 baud
G300	EQU	005H	; 300 baud
G600	EQU	006H	; 600 baud
G1200	EQU	007H	; 1200 baud
G1800	EQU	008H	; 1800 baud
G2000	EQU	009H	; 2000 baud
G2400	EQU	00AH	; 2400 baud
G3600	EQU	00BH	; 3600 baud
G4800	EQU	00CH	; 4800 baud
G7200	EQU	00DH	; 7200 baud
G9600	EQU	00EH	; 9600 baud
G19200	EQU	00FH	; 19200 baud
GERROR	EQU	0FFH	; baud rate error code
;
; Initialize the Z80 SIO...
;
INIT:	MVI	A,CMDREG	;select the command register
	OUT	CTL1
	MVI	A,00$011$000B	;& ,reset the port,.
	OUT	CTL1
	CALL	SETFMT		;set the serial format
	CALL	SETRCV		;set & enable the receiver
	CALL	SETXMT		;set & enable the transmitter
;
; and the COM8116 baud rate generator.
;
CRATE:	MVI	A,C300		;`default' transfer time to 300 baud.
	STA	MSPEED
	MVI	A,47H		;generator set up
	OUT	GENR		;send to baud rate generator
GRATE:	MVI	A,G300		;initialized at 300 baud.
	OUT	GENR		;send to baud rate generator
	RET
;
; SIO register set routines...
;
SETFMT:	MVI	A,FMTREG	;select the format register
	OUT	CTL1
SFRMT:	MVI	A,01$00$01$00B	;& set clock rate,, 1 stop bit, no parity.
	OUT	CTL1
	RET
;
SETRCV:	MVI	A,RCVREG	;select receiver control register
	OUT	CTL1
SRCVR:	MVI	A,11$00000$1B	;& set 8 bit character,, enable receive.
	OUT	CTL1
	RET
;
SETXMT:	MVI	A,XMTREG	;select transmit control register
	OUT	CTL1
SXMTR:	MVI	A,NORMAL	;& enable send, 'dtr', 'rts'
	OUT	CTL1
	RET
;.....
;
; Setup routine to allow changing modem speed with the SET command.
;
; As documented, SET either displays the baud rate settings (with a null
; argument) or is used to set the baud rate.  The expanded SET now
; allows the parity, word size, & stop bits to be set.  These additional
; arguments may occur singly or in combination with other parameters. 
; If multiple arguments are used with the set command, then spaces must
; separate them.  Command arguments may occur in any order as long as
; the baud rate is the last argument.  All arguments after the baud rate
; are ignored.  The serial parameters are displayed at the end of each
; routine invocation if ALWAYS = YES and are always displayed if the
; arguments do not include a baud rate setting.
;
; The SET command also includes a local help screen that lists the
; arguments that affect the port status.  The help screen is invoked
; by a `?' or `HELP' argument.
;
; Included in the table of allowable arguments are some null arguments
; intended for documentation purposes.  These arguments have no effect
; on the port status.
;
; The following is a table of the available options:
;
; Type		Value	Setting
; =============	=======	=======
; Baud Rate-	50	50 baud
;		75	75 baud
;		110	110 baud
;		134.5	134.5 baud
;		150	150 baud
;		300	300 baud	<=- default value
;		600	600 baud
;		1200	1200 baud
;		1800	1800 baud
;		2000	2000 baud
;		2400	2400 baud
;		3600	3600 baud
;		4800	4800 baud
;		7200	7200 baud
;		9600	9600 baud
;		19200	19200 baud
;
; Parity-	NO	no parity	<=- default value
;		ODD	odd parity
;		EVEN	even parity
;
; Word Size-	8	8 bits per char	<=- default value
;		7	7 bits per char
;
; Stop Bits-	1	1 stop bit	<=- default value
;		1.5	1.5 stop bits
;		2	2 stop bits
; 
; Null Args.-	BPS	null
;		BAUD	 "
;		PARITY	 "
;		WORD	 "
;		SIZE	 "
;		STOP	 "
;		BIT	 "
;		BITS	 "
;
; For example,
;
;	SET NO 8 2 110		<=- note: baud rate last
;	or
;	SET  NO PARITY  8 BIT CHAR  2 STOP BITS  110 BAUD
;
; Sets 110 baud, no parity, 8 bit character size, & 2 stop bits.  If
; ALWAYS = YES, then the port status will be displayed.  If ALWAYS = NO,
; then the port status will not be displayed.  Note thet the second
; command line has the same result as the first.
;
;	SET   7 BIT WORD SIZE   ODD PARITY   1.5 STOP BITS
;
; Doesn't change the baud rate (from whatever it was before) and
; sets the parity to odd, 7 bit character size, & 1.5 stop bits.  The
; port status will be displayed because the baud rate was not specified.
;
;	SET 2 STOP BITS
;
; Changes the number of stop bits to 2.  Again, the port status will
; be displayed.
;
; This expansion is entirely compatable with read files.  Auto setting
; of the baud rate from the phone directory is still limited to the
; recognized baud rates of MEX (i.e. 110,300,600,1200,2400,4800,9600,
; & 19200). 450 baud and 710 baud cannot be supported on this machine.
; Serial format parameters cannot be set from the phone directory.
;
; SET command extension types...
;
PARITY	EQU	0FEH		; set parity command
WORDSZ	EQU	0FDH		; set word size
STOPBT	EQU	0FCH		; set stop bits
HELP	EQU	0FBH		; call for help
TRASH	EQU	0FAH		; null arguments
;
RMASK	EQU	00$111111B	;receiver char size clearing mask
RBITS	EQU	11$000000B	;I wish I was a real live assembler
TMASK	EQU	1$00$11111B	;transmitter char size clearing mask
CHAR7B	EQU	01$000000B	;7 bits per character value
CHAR8B	EQU	11$000000B	;8 bits per character value
;
PMASK	EQU	111111$00B	;parity enable clearing mask
PBITS	EQU	000000$11B	;I wish I was a real live assembler
PAROFF	EQU	000000$00B	;bits to set for parity off
PARODD	EQU	000000$01B	;bits to set for odd parity
PAREVN	EQU	000000$11B	;bits to set for even parity
;
SMASK	EQU	1111$00$11B	;stop bits clearing mask
SBITS	EQU	0000$11$00B	;I wish I was a real live assembler
STOP10	EQU	0000$01$00B	;bits to set for one stop bit
STOP15	EQU	0000$10$00B	;bits to set for one and a half stop bits
STOP20	EQU	0000$11$00B	;bits to set for two stop bits
;
SETB:	MVI	C,SBLANK	;Any arguments?
	CALL	MEX
	JC	TELL		;If not, go display baud
	LXI	D,CMDTBL
	MVI	C,LOOKUP
	CALL	MEX		;Parse argument
	JC	CMDERR		;If not found then proclaim goof
	MOV	A,H		;Get the command number
	;
	CPI	PARITY		;Check for parity set
	JZ	PARSET		;If so, go set the parity
	;
	CPI	WORDSZ		;Check for word size
	JZ	WRDSET		;If so, go set the word size
	;
	CPI	STOPBT		;Check for stop bits
	JZ	STPSET		;If so, go set stop bits
	;
	CPI	TRASH		;Check for null argument
	JZ	SETB		;If so, continue parsing
	;
	CPI	HELP		;Check for help command
	JZ	HELPUS		;If so, print help file
	;
	CPI	CERROR		;Check for unsupported command rate
	JNZ	LOADBD		;Continue if supported
	;
	PUSH	H		;else, save the generator rate
	MVI	C,ILP		;& print warning message.
	CALL	MEX
	DB	CR,LF,'-=*=- WARNING -=*=-',CR,LF
	DB	'MEX does not recognize this baud rate !!',CR,LF,LF,0
	POP	H		;restore the generator rate
	JP	GENSET		;& go set it
	;
LOADBD:	STA	CRATE+1		;change time-to-send to match baudrate
GENSET:	MOV	A,L		;get baudrate byte
	STA	GRATE+1		;send to COM8116 timer for new baudrate
	CALL	CRATE		;reinitialize to new baudrate
	;
	IF	NOT ALWAYS
	RET			;then done!
	ENDIF	;show only on null set or format set.
	;
	IF	ALWAYS
	JMP	TELL		;then done!
	ENDIF	;always show parameters on baud set.
;
CMDERR:	MVI	C,ILP
	CALL	MEX		;Tell user input not valid
	DB	CR,LF,'-=*=- Undefined SET argument -=*=-',CR,LF,LF,0
	JMP	TELL		;abort the balance of the SET command
				;& display the current status
;
PARSET:	LDA	SFRMT+1		;get the format byte
	ANI	PMASK		;clear the parity bits
	ORA	L		;install the new bits
	STA	SFRMT+1
	CALL	SETFMT		;set the SIO
	JMP	DONSET
;
STPSET:	LDA	SFRMT+1		;get the format byte
	ANI	SMASK		;clear the stop bits
	ORA	L		;install the new bits
	STA	SFRMT+1
	CALL	SETFMT		;set the SIO
	JMP	DONSET
;
WRDSET:	LDA	SRCVR+1		;get the receiver byte
	ANI	RMASK		;clear the word size bits
	ORA	L		;install the new word size
	STA	SRCVR+1
	CALL	SETRCV		;set the SIO
	MOV	A,L		;get the word size
	RRC			;move to proper position for
	MOV	L,A		; transmitter byte
	LDA	SXMTR+1		;get the transmitter byte
	ANI	TMASK		;clear the word size bits
	ORA	L		;install the new word size
	STA	SXMTR+1
	CALL	SETXMT		;set the SIO
;
DONSET:	JMP	SETB		;go look for more parameters
;....
;
; Display the current baud rate.
;
TELL:	MVI	C,ILP		;get ready...
	CALL	MEX
	DB	CR,LF,'-=*=- Port Status -=*=-',CR,LF,' ',0
	LDA	GRATE+1		;get the current baud rate
	ANI	00FH		;set limit (safety factor)
	ADD	A		; times two...
	LXI	H,CNVTBL	;get the conversion table base
	ADD	L		;add generator code to table base
	MOV	L,A
	MVI	A,000H
	ADC	H
	MOV	H,A
	SHLD	BPNTR		;get the source address
	DB	IN$LHLD		;LHLD instruction
BPNTR:	DS	2		;(vector to where the pointer is)
	LXI	D,BDMSG		;get the destination buffer
	DCX	H		;pre-decrement addresses
	DCX	D
	;
	; move the command from the table to the print buffer
	;
MOVCMD:	INX	H		;point to the next addresses
	INX	D
	MOV	A,M		;get a byte
	ORA	A		;set/clear the negative flag
	PUSH	PSW		;& save it
	ANI	07FH		;strip high bit
	STAX	D		;store the byte
	POP	PSW		;restore flags
	JP	MOVCMD		;continue if high bit not set
	;
	INX	D		;point to the last byte
	XRA	A		;make a zero to end data field
	STAX	D		;& store it
	INX	D		;point to where an instruction should be
	MVI	A,IN$RET	;make a return instruction
	STAX	D		;& store it
	CALL	PRNTBD		;go print the baud rate command
	;
	MVI	C,ILP		;print english stuff...
	CALL	MEX
	DB	' baud',CR,LF,0
;
; Display the parity
;
	LDA	SFRMT+1		;get the format byte
	ANI	PBITS		;select the bits for parity
	CPI	PAROFF		;check for parity off
	JNZ	PCKODD		;if not off, see if odd
	MVI	C,ILP		;else, proclaim no parity
	CALL	MEX
	DB	' NO parity',CR,LF,0
	JMP	PROWRD		;go tell about the char size
PCKODD:	CPI	PARODD		;check for parity odd
	JNZ	PCKEVN		;if not odd, then call it even
	MVI	C,ILP		;else, proclaim odd parity
	CALL	MEX
	DB	' ODD parity',CR,LF,0
	JMP	PROWRD		;go tell about the char size
PCKEVN:	MVI	C,ILP		;should be even parity
	CALL	MEX
	DB	' EVEN parity',CR,LF,0
;
; Display the character size
;
PROWRD:	LDA	SRCVR+1		;get the receiver byte
	ANI	RBITS		;& mask out unneeded bits
	CPI	CHAR7B		;see if 7 bits per char
	JNZ	PCK8BT		;if not, then use 8 bits
	MVI	C,ILP
	CALL	MEX
	DB	' 7 bit char',CR,LF,0
	JMP	PROSTP		;go tell how many stop bits
PCK8BT:	MVI	C,ILP
	CALL	MEX
	DB	' 8 bit char',CR,LF,0
;
; Display the number of stop bits
;
PROSTP:	LDA	SFRMT+1		;get format byte
	ANI	SBITS		;mask off unneeded bits
	CPI	STOP10		;check for 1 stop bit
	JNZ	PCKS15		;if not, try 1.5 bits
	MVI	C,ILP
	CALL	MEX
	DB	' 1 stop bit',CR,LF,0
	RET
PCKS15:	CPI	STOP15		;check for 1.5 stop bits
	JNZ	PCKS20		;if not, then 2 stop bits
	MVI	C,ILP
	CALL	MEX
	DB	' 1.5 stop bits',CR,LF,0
	RET
PCKS20:	MVI	C,ILP
	CALL	MEX
	DB	' 2 stop bits',CR,LF,0
	RET
;
; Help section...
;
HELPUS:	MVI	C,ILP		;print the help message
	CALL	MEX
	DB	CR,LF
	DB	'The set command takes the following arguments:',CR,LF,LF
	DB	'  Baud Rates:      50      75     110     134.5',CR,LF
	DB	'                  150     300     600    1200',CR,LF
	DB	'                 1800    2000    2400    3600',CR,LF
	DB	'                 4800    7200    9600   19200',CR,LF,LF
	DB	'      Parity:      NO     ODD    EVEN',CR,LF,LF
	DB	'   Stop Bits:       1     1.5       2',CR,LF,LF
	DB	'   Word Size:       7       8',CR,LF,LF
	DB	'If baud rate is specified, then it must be the',CR,LF
	DB	'last argument in the command string.  Example:',CR,LF,LF
	DB	'        SET NO 8 2 110',CR,LF,LF
	DB	'This sets no parity, 8 bits per word, 2 stop bits,',CR,LF
	DB	'and 110 baud rate.  SET with no arguments displays',CR,LF
	DB	'the current status.',CR,LF,0
	RET			;return
;
; Command table lists what's ok & what values to use...
;
CMDTBL:
;
; Baud Rates...
;
P300:	DB	'30','0'+80H	; 300 baud command
	DB	G300		; L reg
	DB	C300		; H reg
P1200:	DB	'120','0'+80H	; 1200 baud command
	DB	G1200
	DB	C1200
P2400:	DB	'240','0'+80H	; 2400 baud command
	DB	G2400
	DB	C2400
P110:	DB	'11','0'+80H	; 110 baud command
	DB	G110
	DB	C110
;
; Baud rates not Smart Modem compatible
;
P600:	DB	'60','0'+80H	; 600 baud command
	DB	G600
	DB	C600
P4800:	DB	'480','0'+80H	; 4800 baud command
	DB	G4800
	DB	C4800
P9600:	DB	'960','0'+80H	; 9600 baud command
	DB	G9600
	DB	C9600
P19200:	DB	'1920','0'+80H	; 19200 baud command
	DB	G19200
	DB	C19200
;
; baud rates unrecognized by MEX
;
P50:	DB	'5','0'+80H	; 50 baud command
	DB	G50
	DB	CERROR
P75:	DB	'7','5'+80H	; 75 baud command
	DB	G75
	DB	CERROR
P135:	DB	'134.','5'+80H	; 134.5 baud command
	DB	G135
	DB	CERROR
P150:	DB	'15','0'+80H	; 150 baud command
	DB	G150
	DB	CERROR
P1800:	DB	'180','0'+80H	; 1800 baud command
	DB	G1800
	DB	CERROR
P2000:	DB	'200','0'+80H	; 2000 baud command
	DB	G2000
	DB	CERROR
P3600:	DB	'360','0'+80H	; 3600 baud command
	DB	G3600
	DB	CERROR
P7200:	DB	'720','0'+80H	; 7200 baud command
	DB	G7200
	DB	CERROR
;
; Parity commands
;
	DB	'N','O'+80H	; set no parity
	DB	PAROFF
	DB	PARITY
	DB	'OD','D'+80H	; set odd parity
	DB	PARODD
	DB	PARITY
	DB	'EVE','N'+80H	; set even parity
	DB	PAREVN
	DB	PARITY
;
; Word Size commands
;
	DB	'7'+80H		; set 7 bit character
	DB	CHAR7B
	DB	WORDSZ
	DB	'8'+80H		; set 8 bit character
	DB	CHAR8B
	DB	WORDSZ
;
; Stop Bits commands
;
	DB	'1'+80H		; set 1 stop bit
	DB	STOP10
	DB	STOPBT
	DB	'1.','5'+80H	; set 1.5 stop bits
	DB	STOP15
	DB	STOPBT
	DB	'2'+80H		; set 2 stop bits
	DB	STOP20
	DB	STOPBT
;
; Help commands
;
	DB	'HEL','P'+80H	; help
	DB	0
	DB	HELP
	DB	'?'+80H		; ?
	DB	0
	DB	HELP
;
; Null arguments
;
	DB	'BP','S'+80H	; 'bps'
	DB	0
	DB	TRASH
	DB	'BAU','D'+80H	; 'baud'
	DB	0
	DB	TRASH
	DB	'PARIT','Y'+80H	; 'parity'
	DB	0
	DB	TRASH
	DB	'CHA','R'+80H	; 'char'
	DB	0
	DB	TRASH
	DB	'WOR','D'+80H	; 'word'
	DB	0
	DB	TRASH
	DB	'SIZ','E'+80H	; 'size'
	DB	0
	DB	TRASH
	DB	'STO','P'+80H	; 'stop'
	DB	0
	DB	TRASH
	DB	'BI','T'+80H	; 'bit'
	DB	0
	DB	TRASH
	DB	'BIT','S'+80H	; 'bits'
	DB	0
	DB	TRASH
;
; Command Table end
;
	DB	0		; end of comparision list.
;
; Backwards Conversion Table - this table is used to report the
; current baud rate from the byte used to set the generator.  This
; bypasses the MEX print baud rate function.
;
CNVTBL:	DW	P50
	DW	P75
	DW	P110
	DW	P135
	DW	P150
	DW	P300
	DW	P600
	DW	P1200
	DW	P1800
	DW	P2000
	DW	P2400
	DW	P3600
	DW	P4800
	DW	P7200
	DW	P9600
	DW	P19200
;
PRNTBD:	MVI	C,ILP
	CALL	MEX
BDMSG:	DS	10	; to print baud rate command string
;....
;
; Set new modem port baud rate.  This routine is used to auto set the
; baud rate from the phone directory and as such is limited to only
; the baud rates that MEX recognizes.  No provisions are made here to
; set the parity, word size, or stop bits.
;
NEWB:	PUSH	PSW		; save the rate code
	LXI	H,GTABLE	; get vector to lookup table
	ADD	L		; add rate code to table base
	MOV	L,A
	MVI	A,000H
	ADC	H
	MOV	H,A
	MOV	L,M		; get generator rate from table
	MOV	A,L		; test for valid rate
	CPI	GERROR
	JNZ	OKBAUD		; continue if valid
	;
	MVI	C,ILP		; else print error message
	CALL	MEX
	DB	CR,LF,'-=*=- ',0
	POP	PSW
	MVI	C,PRBAUD
	CALL	MEX
	MVI	C,ILP
	CALL	MEX
	DB	' -=*=- is not supported - no change.',CR,LF,0
	RET
	;
OKBAUD:	POP	PSW	; restore rate code
	JMP	LOADBD	; & go set the baud rate.
;
GTABLE:	DB	G110	;`0' - 110 baud
	DB	G300	;`1' - 300 baud
	DB	GERROR	;`2' - 450 baud  *** not supported ***
	DB	G600	;`3' - 600 baud
	DB	GERROR	;`4' - 710 baud  *** not supported ***
	DB	G1200	;`5' - 1200 baud
	DB	G2400	;`6' - 2400 baud
	DB	G4800	;`7' - 4800 baud
	DB	G9600	;`8' - 9600 baud
	DB	G19200	;`9' - 19200 baud
;
;
EOSMSG:	DB	017H,0,0,0,'$'
CLSMSG:	DB	01AH,0,0,0,'$'
;
; NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
;				 0D00H (without Smartmodem)
;
	END
code
	LXI	H,GTABLE	; get vector to lookup table
	ADD	L		; add rate code to table base
	MOV	L,A
	MVI	A,00