;   Title    'MEX overlay for the TRS-80 MOD IV version 1.7'	
;                      Montezuma Micro CP/M 2.2
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
; MEX TRS-80 MOD IV OVERLAY VERSION 1.0: Written 09/10/84 by Ed Richter 
;
; VERSION 1.8 02/22/86 - Auto answer modified to work with the 
;                        Model 4p internal modem command structure.
;                        Ignore all references to Hayes compatability.
;                                               Bob Kitchen
;                                               73756,1015
; VERSION 1.7 01/25/85 - ^C in "auto-answer" now aborts to CPM, not
;			 MEX (sorry bout that one).  Added code to
;			 determine baud rate in "auto-answer".
;			 Changed "NITMOD" to default  to the baud 
;			 rate selected by "MSPEED"     
;						Ed Richter
;						71455,1133	
; VERSION 1.6 01/21/85 - A system reset seems a little drastic
;                        so added code for a ^C abort to auto
; 			 answer. Also added "number of rings" 
;			 equate.
;						 Ed Richter
; VERSION 1.5 11/17/84 - Added SET ANSWER ON command
;			 (For Hayes-compatible modems
;			  only...see NOTE below.)
;						Thom Foulks
; VERSION 1.3 10/10/84 - Fixed bug in the Printer ready test
;                                                 Ed Richter
; VERSION 1.2 09/18/84 - Added the comments to 1.1 and changed the
;			 configuration of the SET message that is
;			 output to the console
;						   Ed Richter 
; VERSION 1.1 09/16/84 - Added code to fully control the SIO USART
;		         via the SET command. This overlay now 
;			 supports-- SET BAUD -- SET PARITY --
;			 SET STOP BITS -- SET WORD LENGTH --
;                                                   Ed Richter
; 
; This file was derived from the MDM7xx overlay M7R4-5.ASM, and the 
; file MXOPM10.ASM. It is a MEX overlay for use with the TRS-80 MOD
; IV, and an external modem. It has a SET command that supports 300
; though 9600 baud.
;
; The SMARTMODEM, and compatibles will answer the phone at the
; incoming caller's baud rate. This makes it necessary to insure
; that the SIO-USART is configured to the same speed. This progam
; will answer the phone at the MSPEED baud rate. If it cannot
; read characters at that speed it will start at 110 baud (BAUD vector 
; set to 0), check for a CR, LF, or ^C. If it is unable to read a
; character at that speed it will increment the baud rate to 1200
; (the - CPI '6' - in the SKPBAUD routine), and retry at each step.
; To change the upper limit (1200) change the  CPI '6' to the MSPEED
; value +1. ie., CPI '10' for 19200.
;
; NOTE: This overlay must be used in congunction with MXO-4P.ASM
; for full modem control.  The SET ANSWER command will place MEX
; into an auto-answer mode which may be exited prior to execution
; with a ^C - CONTROL C -  it's intended for use with a READ file
; similar to Bruce Morgen's WELCOME3 or WELCOME4.
;                                      - Thom Foulks
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
REV:	 	EQU	16
;
CR:		EQU	0DH	;carriage return
LF:		EQU	0AH	;linefeed
TPA:		EQU	0100H
TAB:		EQU	09H	
YES:		EQU	0FFH
NO:		EQU	0
RING:		EQU	'2'	;number of rings for auto-answer
WMBOOT:		EQU	05B39H	;MEX114.COM cpm stack pointer storage address
;
;
; Change the following information to match your equipment.
; PORT should be set to the base port address for the RS-232 port.
;
PORT:		EQU	0E8H	;master reset port   
MODCT1:		EQU	PORT+2	;modem control port
MODDAT:		EQU	PORT+3	;modem data in port
MODCT2:		EQU	PORT+2	;not used mod iv
BAUDRP:		EQU	PORT+1	;baud rate port
MDRCVB:		EQU	080H	;bit to test for receive
MDRCVR:		EQU	080H	;value when ready
MDSNDB:		EQU	040H	;bit to test for send
MDSNDR:		EQU	040H	;value when ready
;
MODCTB:		EQU	0ECH	;dtr,rts,8,no,1 for port initialize
CTSMSK:		EQU	020H	;carrier detect mask
ISOCD:		EQU	0DFH	;port ready mask
PRPORT:		EQU	0F8H	;printer port
PRSTAT:		EQU	0C0H	;printer ready mask
BRKMSK:		EQU	0E3H	;send break
DTRMSK:		EQU	0EBH	;drop dtr
;
;MEX SERVICE PROCESSOR STUFF
;
MEX:		EQU	0D00H	;address of the service processor
INMDM:		EQU	255	;get char from port,CY=no more in 100ms
TIMER:		EQU	254	;delay 100 ms * 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 to modem (after SNDRDY)
RCVCHR:		EQU	248	;recv a char from modem after (RCVRDY)
LOOKUP:		EQU	247	;table search: see CMDTBL 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 funct 2:CONSOLE OUT
PRINT:		EQU	9	;simulated BDOS funct 9: PRINT STRING
INBUF:		EQU	10	;input buffer, same as BDOS FUNCT 10
;
		ORG	0D11H	;install printer ready test
		DW	PRTSTS
; 
		ORG	TPA
;
;
		DS	3	;(for  "JMP   START" instruction)
PMODEM:		DB	NO	;Not used by MEX			103H
SMODEM:		DB	NO	;Not used by MEX
TPULSE:		DB	'*'	;Not used by MEX			105H
CLOCK:		DB	48	;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	1	;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	1	;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 109H
				;default time for extra wait after CRLF
				;in terminal mode file transfer
COLUMS:		DB	5	;number of DIR columns shown		10AH
SETFL:		DB	YES	;yes=user-added Setup routine		10BH
SCRTST:		DB	YES	;Cursor control routine 		10CH
		DS	1	;reserved (old ACKNAK flag)		10DH
BAKFLG:		DB	YES     ;yes=change any file same name to .BAK	10EH
CRCDFL:		DB	YES	;yes=default to CRC checking		10FH
TOGCRC:		DB	YES	;yes=allow toggling of CRC to Checksum	110H
CVTBS:		DB	NO	;yes=convert backspace to rub		111H
TOGLBK:		DB	YES	;yes=allow toggling of bksp to rub	112H
ADDLF:		DB	NO	;no=no LF after CR to send file in	113H
				;terminal mode (added by remote echo)
TOGLF:		DB	YES	;yes=allow toggling of LF after CR	114H
TRNLOG:		DB	YES	;yes=allow transmission of logon	115H
				;write logon sequence at location LOGON
SAVCCP:		DB	YES	;yes=do not overwrite CCP		116H
LOCNXT:		DB	NO	;yes=local command if EXTCHR precedes	117H
				;no=external command if EXTCHR precedes
TOGLOC:		DB	YES	;yes=allow toggling of LOCONEXTCHR	118H
LSTTST:		DB	YES	;yes=allow toggling of printer on/off	119H
XOFTST:		DB	YES	;yes=checks for XOFF from remote while	11AH
				;sending a file in terminal mode
XONWT:		DB	NO	;yes=wait for XON after CR while	11BH
				;sending a file in terminal mode
TOGXOF:		DB	YES	;yes=allow toggling of XOFF checking	11CH
IGNCTL:		DB	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	'K'-40H	;^K = Send 300 ms. break tone		120H
NOCONN:		DB	'N'-40H	;^N = Disconnect from the phone line	121H
LOGCHR:		DB	'L'-40H	;^L = Send logon			122H
LSTCHR:		DB	'P'-40H	;^P = Toggle printer			123H
UNSVCH:		DB	'R'-40H	;^R = Close input text buffer		124H
TRANCHR:	DB	'T'-40H ;^T = Transmit file to remote		125H
SAVECHR:	DB	'Y'-40H	;^Y = Open input text buffer		126H
EXTCHR:		DB	'^'-40h	;^^ = Send next character		127H
		DS	2
INCTL1:		JMP     STATSND	;go to "get status" 			12AH
		DS	7
OTDATA:		OUT	MODDAT  ! RET	;out modem data port		134H
		DS	7
INPORT:		IN	MODDAT  ! RET	;in modem data port
		DS	7
MASKR:		ANI	MDRCVB	! RET	;bit to test for receive ready	148H
TESTR:		CPI	MDRCVR	! RET	;value of rcv. bit when ready	14BH
MASKS:		ANI	MDSNDB	! RET	;bit to test for send ready	14EH
TESTS:		CPI	MDSNDR	! RET	;value of send bit when ready	151H
		DS	12		;unused by MEX
LOGON:		DS	2		;for user message		160H
DIALV:		DS	3		;autodial rtn jump		162H
DISCV:		JMP	DISCON		;disconnect rtn
GOODBV:		DS	3		;not needed			168H
INMODV:		JMP	NITMOD		;go to user written routine	16BH
NEWBDV:		JMP	PBAUD		;set new baud-rate   		16EH
NOPARV:		DS	3		;(by-pass PMMI routine)		171H
PARITV:		DS	3		;(by-pass PMMI routine)		174H
SETUPV:		JMP	SETCMD		;initialize USART and modem	177H
SPMENV:		DS	3		;not used with MEX		17AH
VERSNV:		JMP	SYSVER		;print header msg		17DH
BREAKV:		JMP	PBREAK		;send header			180H
; Do not change the following six lines.
ILPRTV:		DS	3		;				183H
INBUFV:		DS	3		;				186H
ILCMPV:		DS	3		;				189H
INMDMV:		DS	3		;				18CH
NXSCRV:		DS	3		;				18FH
TIMERV:		DS	3		;				192H
;
; Routine to clear to end of screen.  If using CLREOS and CLRSCRN, set
; SCRNTEST to YES at 010AH (above).
;
CLREOS:		LXI	D,EOSMSG	;clear to end of screen         195H
		MVI	C,PRINT		;from cursor
		CALL	MEX		;				198H
		RET			;				19DH
;
CLS:		LXI	D,CLSMSG	;clear sreen			19EH
		MVI	C,PRINT
		CALL	MEX		;				1A1H
		RET			;				1A6H
	
;
SYSVER:		LXI	D,SOMESG	;print the sys version msg	1A7H
		MVI	C,PRINT
		CALL	MEX		
		CALL	CRLF		
;
CARRSH		LXI	D,NOMESG	;no carrier present msg
		CALL	CARRCK
		MVI	C,PRINT
		CNZ	MEX		;print if no carrier
		LXI	D,CARMSG	;carrier present
		MVI	C,PRINT
		CALL	MEX		;say so and continue
		RET
;
; Send a break tone to reset some time-share computers.
;
PBREAK:		MVI	A,BRKMSK	;send break
		OUT	MODCT1
 		RET
;
; Routine to return status of the modem port
;
STATSND:	IN	MODCT1		;in modem contol port
		PUSH 	B		;just in case
		ANI	ISOCD		;isolate status and clear CD bit
		MOV	B,A		;save status
		IN 	PORT		;get CD bit
		ANI	CTSMSK		;isolate CD bit
		ORA	B		;merge CD with status
		POP	B		;restore B
		RET
;
; This routine will hang up the phone by dropping DTR.
;
DISCON:	  	MVI     A,DTRMSK	;DTR off, send BRK
          	OUT	MODCT1		;send cmd
	  	MVI	B,5		
	  	MVI	C,TIMER
	  	CALL	MEX		;delay 500 msec
		MVI	A,MODCTB	;normal setup DTR on
	  	OUT	MODCT1
	  	RET
;
; This area sets the SIO-UART to an initial value of 8 bits, no parity,
; DTR on, and RTS on. 
;
NITMOD:	  	MVI	A,1
	  	OUT	PORT		;reset the USART to
	  	MVI	A,MODCTB	;8,no,1,DTR, and RTS
	  	OUT	MODCT1
		LXI	H,MSPEED
		MOV	A,M		;initalize to MSPEED baud rate
		CALL	PBAUD		;get baud rate
	  	RET			;also change the value of MSPEED
;
;  Sets the modem speed via the SET COMMAND.
;
SETCMD:		MVI	C,SBLANK	;any arguments
		CALL	MEX
		JC	SETSHO		;if not print out values
		LXI	D,CMDTBL	;parse commands
		CALL	TSRCH		;from table
		PUSH	H		;address on stack
		RNC			;if yes then execute it
		POP	H		;no fix stack
SETERR:	  	LXI	D,SETEMS	;no then print error
	  	MVI 	C,PRINT
	  	CALL	MEX
	  	RET
CMDTBL:		DB	'?'+80H		;"set ?"
		DW	STHELP
		DB	'BAU','D'+80H	;"set baud ?'
		DW	STBAUD
		DB	'WOR','D'+80H	;set word length
		DW	STWORD
		DB	'PARIT','Y'+80H ;set parity
		DW	STPAR
		DB	'STO','P'+80H	;set stop bits
		DW	STSTOP
                DB   	'ANSWE','R'+80H ;set auto-answer on
		DW	STANS
		DB	0	
SETSHO:		CALL	CLS		;clear screen
		CALL	CARRSH		;carrier present
		LXI	H,SHOTBL	;show subroutines table
SETSLP: 	MOV	E,M		;get table address
		INX	H
		MOV	D,M
		INX	H
		MOV	A,D		;end of table
		ORA	E
		RZ			;exit if yes
		PUSH	H		;save table pointer
		XCHG			;addrs to HL
		CALL	GOHL		;do it
		CALL	CRLF		;print newline
		MVI	C,CHEKCC	;check for console abort
		CALL	MEX		
		POP	H		;its done
		JNZ	SETSLP		;continue if no abort
		RET
GOHL:		PCHL
SHOTBL:		DW	BDSHOW		;table
		DW	PARSHOW
		DW	WLSHOW
		DW	STSHOW
		DW	0
STHELP:		LXI	D,HLPMSG	;print help message
		MVI	C,PRINT
		CALL	MEX
		RET
STBAUD:		MVI	C,BDPARS	;MEX find baud rate		
		CALL	MEX
		JC 	SETERR		;none then exit
		CALL    PBAUD		;valid baud rate then set it
		JC 	SETERR		;exit if not supported by overlay
BDSHOW:		CALL	ILPRT
		DB	'Baud Rate:',TAB,' ',0
		LDA	MSPEED		;get MSPEED to determine present
		MVI	C,PRBAUD	;baud rate
		CALL	MEX
		RET	
STPAR:		LXI	D,PARTBL	;find parity function requested
		CALL	TSRCH
		PUSH	H
		RNC			;execute it
		POP	H
		JMP	SETERR		;not valid then say so 		
STWORD:		LXI	D,WLTBL		;find word length function requested
		CALL	TSRCH
		PUSH	H
		RNC			;execute it
		POP	H
		JMP	SETERR		;not valid then say so
STSTOP:		LXI	D,STTBL		;find how many stop bits 
		CALL	TSRCH
		PUSH	H
		RNC			;execute it
		POP	H
		JMP	SETERR		;not valid then say so 
STANS:          CALL	CLS		;clear the screen
		PUSH    H		;save H
		LXI	H,ANSON		;get the set command
		CALL	SMSEND		;send it
		POP	H
		CALL	CRLF		;get ready for msg
		CALL	CRLF
		LXI	D,ANSMSG	;and tell us about it
		MVI	C,PRINT
		CALL	MEX
WAITCD:		CALL	INPORT		;to  clear garbage
		CALL	CARRCK		;check for carrier
		JZ	TSTBAUD		;yes - go check baud rate...
		MVI	C,CHEKCC	;no check for ^C
		CALL	MEX
		JNZ	WAITCD		;no carrier, no ^C so try again
		PUSH	H		;save H
		LXI	H,ANSOFF	;turn off auto answer at modem
		CALL	SMSEND		;send it
		POP	H
		LHLD	WMBOOT		;^C -load CPM return address from
					;stack pointer storage 
		SPHL			;put it in the stack pointer
		RET			;and go to CPM
TSTBAUD:	CALL	INPORT		;get byte from modem
		CPI	CR		;if CR			
		RZ			;baud rate is good go to MEX
		CPI	LF		;if LF
		RZ			;baud rate is good go to MEX
		CPI	'C'-40H 	;if ^C
		RZ			;baud rate is good go to MEX
		PUSH	H
		PUSH	B
		PUSH	D
		LXI	H,BAUD		;get baud rate start byte
		MOV	A,M		;get it out of memory	
		MOV	C,A		;set it up to operate on it
		INR	C		;add 1 to it
		MOV	M,C		;and put it back in start byte
		CALL	PBAUD		;go set baud rate and MSPEED
		CPI	6		;have we tried 1200 baud
		JNZ	TSTBAUD		;no then we're not done
		XRA	A		;yes then get ready for retry
		STA	BAUD		;by setting baud back to 110
		POP	D
		POP	B
		POP	H
		JMP	WAITCD		;we didn't find a good baud rate
					;so keep trying until - 1. get a
					;good baud rate  2. get a ^C, or
					;3. hangup causes carrier loss.
;
HLPMSG:	DB	CR,LF,1AH,'SET command, TRS MOD 4 version 1.8',CR,LF
	DB	CR,LF,'SET BAUD 300 <or> 1200 <or> 2400 <or> 4800 <or> 9600'
	DB	CR,LF,'SET PARITY ON <or> OFF <or> ODD <or> EVEN'
	DB	CR,LF,'SET WORD 5 <or> 6 <or> 7 <or> 8'
	DB	CR,LF,'SET STOP 1 <or> 2'
        DB	CR,LF,'SET ANSWER <on> '
	DB	CR,LF,LF,'Auto Answer configured for the Model 4p internal'
	DB	' modem only.',CR,LF
	DB	CR,LF,'$'		
SETEMS:	  	DB	CR,LF,'SET command error',CR,LF,LF,'$'
TSRCH:    	MVI	C,LOOKUP
	  	JMP	MEX
;
ILPRT:		MVI	C,ILP		;MEX print function
		JMP	MEX
;
CRLF:		MVI	A,CR		;newline on console
		CALL	TYPE
		MVI	A,LF
TYPE:		PUSH	H		;save em
		PUSH	D
		PUSH	B
		MOV	E,A
		MVI	C,CONOUT	;align output char
		CALL	MEX		;print via mex
		POP	B		;restore em
		POP	D
		POP	H
		RET		
;
; Test for printer ready
;
PRTSTS:	  	IN	PRPORT		;get printer status
	  	ANI	PRSTAT		;isolate it
	  	JNZ	PRTSTS1		;return if not ready A=00
	  	MVI	A,0FFH		;ready A=FF 
		RET
PRTSTS1:	XRA	A
		RET
; Carrier detect  0=CARRIER
;
CARRCK:		IN	PORT		;get carrier bit
		ANI	CTSMSK
		RET
;	
; Baud rate set routine 
;
PBAUD:	  	PUSH	H		;save everybody
	  	PUSH	B
	  	PUSH	D
		MOV	E,A		;get speed
		MVI	D,0		;zero the other half of reg pair
		LXI	H,BAUDTB	;get baud rate table address
		DAD	D		;add speed offset
		MOV	A,M		;get baud rate  
		ORA	A		;0=not valid baud rate
		JZ	PBEXIT		;not valid baud rate then exit
		OUT	BAUDRP		;good baud rate then set it
		MOV	A,E		;get speed 
		STA	MSPEED		;set speed
		JMP	PBEXIT1		;return 
PBEXIT:		STC
PBEXIT1:	POP	B		;no carrier or incorrect baud rate
	  	POP	D
	  	POP   	H
	  	RET
;
BAUDTB:		DB	0,055H,0,0,0		;110,300,450,610,710
		DB	077H,0AAH,0CCH,0EEH,0	;1200,2400,4800,9600,19200
;
STTBL:		DB	'1'+80H		;stop bit tabe
		DW	STONE		;set one bit
		DB	'2'+80H
		DW	STTWO		;set two bits
		DB	0
;
PARTBL:		DB	'O','N'+80H	;parity table
		DW	STON		;enable parity
		DB	'OF','F'+80H
		DW	STOFF		;disable parity
		DB	'EVE','N'+80H
		DW	STEVE		;even parity
		DB	'OD','D'+80H
		DW	STODD		;odd parity	
		DB	0
;
WLTBL:		DB	'5'+80H		;word length table
		DW	STFIVE		;5 bit length
		DB	'6'+80H
		DW	STSIX		;6 bit length
		DB	'7'+80H
		DW	STSEV		;7 bit length
		DB	'8'+80H
		DW	STATE		;8 bit length
		DB	0
;
STFIVE:		MVI     A,MODCTB	;get current port info
		ANI	09FH		;change to 5 bits
		STA	MODCTB		;put back new port info
		MVI	A,'5'		;set 5 bit flag
STFIVE1:	STA	WLTEL		
		CALL	CARRCK		;carrier present
		RZ			;yep then continue
		CALL	TYPE		;position cursor
		CALL	WLSHOW		;nope show word length
		RET
STSIX:		MVI	A,MODCTB	;get current port info 
		ORI	040H		;set six bits	
		ANI	0DFH
		STA	MODCTB		;put new 
		MVI	A,'6'		;set six bit flag
		JMP	STFIVE1
STSEV:		MVI	A,MODCTB	;get current port info
		ORI	020H		;set seven bits
		ANI	0BFH
		STA	MODCTB		;put back new port info
		MVI	A,'7'		;set 7 bit flag			
		JMP	STFIVE1
STATE:		MVI	A,MODCTB	;get current port info
		ORI	060H		;set eight bit
		STA	MODCTB		;put back new port info
		MVI	A,'8'		;set 8 bit flag
		JMP	STFIVE1
;
STON:		MVI	A,MODCTB	;get current port info
		ANI	0F7H		;set parity on
      		STA	MODCTB		;put back new port info
		MVI	A,YES
STON1:		STA	PARTEL		;set parity on flag
		CALL	CARRCK		;carrier present
		RZ			;yep then continue
		CALL	TYPE		;position cursor
		CALL	PARSHOW		;nope then show parity info 
		RET
STOFF:		MVI	A,MODCTB	;get curent port info
		ORI	008H		;set parity off
		STA	MODCTB		;put back new port info
		MVI	A,NO		;set no parity flag
		JMP	STON1	
STODD:		MVI	A,MODCTB	;get current port info
		ANI	07FH		;set parity odd
		STA	MODCTB		;put back new port info
		MVI	A,YES		;set parity odd flag
STODD1:		STA	PARTEL1
		CALL	CARRCK		;carrier present
		RZ			;yep then return
		CALL	TYPE		;position cursor
		CALL	PARSHOW		;nope show parity info
		RET
STEVE:		MVI	A,MODCTB	;get current port info
		ORI	080H		;set even parity
		STA	MODCTB		;put back new port info
		MVI	A,NO		;set even parity flag
		JMP	STODD1
STONE:		MVI	A,MODCTB	;get current port info
		ANI	0EFH		;set one stop bit 
		STA	MODCTB		;put back new port info
		MVI	A,YES		;set one stop bit flag
STONE1:		STA	STTEL		
		CALL	CARRCK		;carrier present
		RZ			;yep then continue
		CALL	STSHOW		;nope show stop bit info 
		RET
STTWO:		MVI	A,MODCTB	;get current port info
		ORI	010H		;set two stop bits
		STA	MODCTB		;put back new port info
		MVI	A,NO		;set two stop bit flag
		JMP	STONE1			
;
PARSHOW:	LXI	D,PARMSG	;get parity message
		MVI	C,PRINT		;print it
		CALL	MEX
		LXI	D,PONMSG	;get set for parity on
		MVI	C,PRINT
		LDA	PARTEL		;get flag
		CPI	YES 		;is it on
		JZ	PARSHOW1	;yes then say so
		LXI	D,POFMSG	;no then get parity off message
		MVI	C,PRINT		;print it
		CALL	MEX
		RET
PARSHOW1:	CALL	MEX
		LXI	D,ODDMSG	;get parity odd message
		MVI	C,PRINT
		LDA	PARTEL1		;get odd parity flag
		CPI	YES		;is it odd
		JNZ  	PARSHOW2	;nope get even message
		CALL	MEX		;yes then say so 
		RET
PARSHOW2:	LXI	D,EVEMSG	;get even parity message
		MVI	C,PRINT		
		CALL	MEX		;print it
		RET
;
WLSHOW:		LXI	D,WLMSG		;get word length message
		MVI	C,PRINT
		CALL	MEX		;print it
		LXI	D,FIVEMSG	;load five bit message
		MVI	C,PRINT	
		LDA	WLTEL		;get word length flag 
		CPI	'5'		;is it five
		JNZ     SIX		;nope try six
		CALL	MEX		;yes then show it
		RET
SIX:		LXI	D,SIXMSG	;load six bit message
		MVI	C,PRINT
		CPI	'6'		;is it six
		JNZ	SEV		;nope try seven
		CALL	MEX		;yep then show it
		RET
SEV:		LXI	D,SEVMSG	;load seven bit message
		MVI	C,PRINT
		CPI	'7'		;is it seven
		JNZ	ATE		;nope try eight
		CALL	MEX		;yep then show it
		RET
ATE:		LXI	D,ATEMSG	;load eight bit message
		MVI	C,PRINT
		CALL	MEX		;print it
		RET
;
STSHOW:		LXI	D,STOPMSG	;get stop bit message
		MVI	C,PRINT		;print it
		CALL	MEX
		LXI	D,STOPMSG1	;get stop bit 1 message
		MVI	C,PRINT
		LDA	STTEL		;is it 1 bit
		CPI	YES
		JNZ	STSHOW1		;nope try two
		CALL	MEX		;yep then show it 
		RET
STSHOW1:	LXI	D,STOPMSG2	;get stop bit 2 message
		MVI	C,PRINT
		CALL	MEX		;print it
		RET
;
; Message area
;
BAUD:		DB	0		;300 baud
PARTEL:		DB	NO		;yes=parity, no=no parity
PARTEL1:	DB	YES		;yes=odd parity, no=even
WLTEL:		DB	'8'		;5=5 bits,6=6 bits, etc.
STTEL:		DB	YES		;yes=1 stop, no=2 stop 
STOPMSG:	DB	'Number of stop bits is $'
STOPMSG1:	DB	'1$'
STOPMSG2:	DB	'2$'		
WLMSG:		DB	'Word length is $'
FIVEMSG:	DB	'5 bits$'
SIXMSG:		DB	'6 bits$'
SEVMSG:		DB	'7 bits$'
ATEMSG:		DB	'8 bits$'  	
PARMSG:		DB	'Parity is: $'
PONMSG:		DB	'on and $'
POFMSG:		DB	'off$'
ODDMSG:		DB	'odd$'
EVEMSG:		DB	'even$'
CLSMSG:	  	DB	CR,LF,1AH,'$'
EOSMSG:	  	DB	CR,LF,19H,'$'
SOMESG:	  	DB	'TRS Mod 4 CP/M 2.2 overlay V'
	  	DB	REV/10+'0'
	  	DB	'.'
	  	DB	REV MOD 10+'2','$'
NOMESG:		DB	'no $'
CARMSG:		DB	'carrier present',CR,LF,'$'
ANSON:		DB	'*C*MAG@',125,'X',CR,0	;turn on auto answer
ANSOFF:		DB	'*C',CR,0		;turn off auto answer
ANSMSG:		DB	'Modem answer mode now turned on. '
		DB	'[Use ^C to abort to CP/M]'
		DB	CR,LF,'$'
;
SMSEND:		MVI	C,SNDRDY
		CALL	MEX
		JNZ	SMSEND
		MOV	A,M
		INX	H
		ORA	A
		RZ
		MOV	B,A
		MVI	C,SNDCHR
		CALL	MEX
		JMP	SMSEND
;
;----------------------------------------------------------------------
; NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem or Anchor)
;----------------------------------------------------------------------
; End of TRS-80 MOD IV  MEX modem overlay
		END
r)
;-