;MX0-LB22.ASM -- AMPRO 'LITTLE BOARD' OVERLAY FILE FOR MEX
;
;

VER	EQU	2	; Version 
REV	EQU	2	; Revision Level
;
;
; Modified from Jerry Haigwood's M7LB-2.ASM with inserts from
;    MXO-KP41.ASM John Smith, et al.. 
;
; Modified from the general purpose overlay by Jerry Haigwood, KY4Z
;
; This overlay adapts the MEX program by Ronald Fowler to the 
;   AMPRO Series 100 computer, using the Z80 DART and the 
;   Z80 CTC.
;
; 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 places particular emphasis on using the AMPRO Series 100 
; computer with the Z80 DART serial port "B" and the Z80 CTC baud rate
; generator.  If you are not using this equipment then you might still
; want to look over this file to gain knowledge on how to write your
; own version of this overlay.  Some other overlays which might help
; are:
;
;     "H8"  Heath H89 overlay for 8250 I/O and programmable baud rates
;     "HZ"  Zenith 120 overlay for 2661B initialization and baud rates
;     "XE"  Xerox 820II overlay for Z80-SIO intialization, etc.
;
; Edit this file for your preferences then follow the "TO USE:" example
; shown below.
;
;	TO USE: First edit this file filling in answers for your own
;		equipment.  Then assemble with ASM.COM or equivalent
;               assembler. Then use MLOADxx to overlay the relulting
;               .HEX file over the MEXxx.COM.
;
;	A>REN MEXxxx.OBJ=MEXxxx.COM <-- THIS PRESERVES THE UNINSTALLED
;                                       VERSION IN AN UNRUNABLE FORM.
;       A>ASM MXO-LB01
;       A>MLOADxx MEXXxx.COM=MEXXxx.OBJ,MXO-LB01.HEX
;
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; 12/18/85 - Corrected 2400 Baud problem, 
;            Neatened up printing routines
;            Added jump so that SM overlays can set baud rate
;                                           - Mike Vore
;
; 10/02/85 - Cleaned up misc. trash
;            Added Version and Rev     - Mike Vore
;
;
;
; 09/30/85 - Added "FULL SETUP"  routines (5-6-7-8 bits
;                                          No, Even, Odd parity
;                                          1- 1.5- 2 stopbits)
;            "BREAK" sent with 'esc' @ in terminal mode.
;            Disconnects modem with 'esc' N in terminal mode 
;                 by lowering HSO (Hand Shake Out), J4-P4  (for DTR)
;                 
;                                           - Mike Vore, W3CCV
;
;
; 12/23/83 - First version of this file		- Jerry Haigwood
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
BELL:		EQU	07H		;bell
CR:		EQU	0DH		;carriage return
ESC:		EQU	1BH		;escape
LF:		EQU	0AH		;linefeed
TAB:		EQU	09H		;tab character
;
YES:		EQU	0FFH
NO:		EQU	0
;
BRKWT		EQU	3		;Break Wait Time Hundreds Of mSec
GBYTME		EQU	3		;Goodbye pause Hundreds of mSec
HNGUPT		EQU	2		;Hangup  pause Seconds
;
; Change the following information to match your equipment
; This is for the Little Board Serial Port B
;
PORT:		EQU	8CH
MODCTL1		EQU	PORT		;MODEM CONTROL PORT
MODDATP:	EQU	PORT-4		;MODEM DATA IN PORT
MODRCVB:	EQU	1		;BIT TO TEST FOR RECEIVE
MODRCVR:	EQU	1		;VALUE WHEN READY
MODSNDB:	EQU	4		;BIT TO TEST FOR SEND
MODSNDR:	EQU	4		;VALUE WHEN READY
CTC:		EQU	50H		;CTC addr
;
;
;
; MEX SERVICE PROCESSOR
;
MEX	EQU	0D00H		;ADDRESS OF THE SERVICE PROCESSOR
INMDM	EQU	255		;GET CHAR FROM PORT TO A, CY=NO MORE IN 100 MS
TIMER	EQU	254		;DELAY 100MS * REG B
TMDINP	EQU	253		;B=# SECS TO WAIT FOR CHAR, CY=NO CHAR
CHEKCC	EQU	252		;CHECK FOR ^C FROM KBD, Z=PRESENT
SNDRDY	EQU	251		;TEST FOR MODEM-SEND READY
RCVRDY	EQU	250		;TEST FOR MODEM-RECEIVE READY
SNDCHR	EQU	249		;SEND A CHARACTER TO THE MODEM (AFTER SNDRDY)
RCVCHR	EQU	248		;RECV A CHAR FROM MODEM (AFTER RCVRDY)
LOOKUP	EQU	247		;TABLE SEARCH: SEE CMDTBL COMMENTS FOR INFO
PARSFN	EQU	246		;PARSE FILENAME FROM INPUT STREAM
BDPARS	EQU	245		;PARSE BAUD-RATE FROM INPUT STREAM
SBLANK	EQU	244		;SCAN INPUT STREAM TO NEXT NON-BLANK
EVALA	EQU	243		;EVALUATE NUMERIC FROM INPUT STREAM
LKAHED	EQU	242		;GET NXT CHAR W/O REMOVING FROM INPUT
GNC	EQU	241		;GET CHAR FROM INPUT, CY=1 IF NONE
ILP	EQU	240		;INLINE PRINT
DECOUT	EQU	239		;DECIMAL OUTPUT
PRBAUD	EQU	238		;PRINT BAUD RATE
;
CONOUT	EQU	2		;SIMULATED BDOS FUNCTION 2: CONSOLE CHAR OUt
PRINT	EQU	9		;simulated BDOS function 9: print string
INBUF	EQU	10		;input buffer, same structure as BDOS 10
;
		ORG	100H
;
;
; Change the clock speed if needed, to match your system
;
		DS	3	;(for  "JMP   START" instruction)
;
PMMIMODEM:	DB	NO	;yes=PMMI S-100 Modem			103H
SMARTMODEM:	DB	YES	;yes=HAYES Smartmodem, no=non-PMMI	104H
TOUCHPULSE:	DB	'T'	;T=touch, P=pulse (Smartmodem-only)	105H
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
				;This defines the DEFAULT SPEED when
				;loading the program, REG4 and CTC1
				;will be set at load time.
				;
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
NOOFCOL:	DB	5	;number of DIR columns shown		10AH
SETUPTST:	DB	YES	;yes=user-added Setup routine		10BH
SCRNTEST:	DB	NO	;Cursor control routine 		10CH
ACKNAK:		DB	YES	;yes=resend a record after any non-ACK	10DH
				;no=resend a record after a valid-NAK
BAKUPBYTE:	DB	NO	;yes=change any file same name to .BAK	10EH
CRCDFLT:	DB	YES	;yes=default to CRC checking		10FH
TOGGLECRC:	DB	YES	;yes=allow toggling of CRC to Checksum	110H
CONVBKSP:	DB	NO	;yes=convert backspace to rub		111H
TOGGLEBK:	DB	YES	;yes=allow toggling of bksp to rub	112H
ADDLF:		DB	YES	;no=no LF after CR to send file in	113H
				;terminal mode (added by remote echo)
TOGGLELF:	DB	YES	;yes=allow toggling of LF after CR	114H
TRANLOGON:	DB	NO	;yes=allow transmission of logon	115H
				;write logon sequence at location LOGON
SAVCCP:		DB	NO	;yes=do not overwrite CCP		116H
                                ;no=overwrite CCP, Large ASCII captures
                                ; might need this set to NO
LOCONEXTCHR:	DB	NO	;yes=local command if EXTCHR precedes	117H
				;no=external command if EXTCHR precedes
TOGGLELOC:	DB	YES	;yes=allow toggling of LOCONEXTCHR	118H
LSTTST:		DB	YES	;yes=printer available on printer port	119H
XOFFTST:	DB	NO	;yes=checks for XOFF from remote while	11AH
				;sending a file in terminal mode
XONWAIT:	DB	NO	;yes=wait for XON after CR while	11BH
				;sending a file in terminal mode
TOGXOFF:	DB	YES	;yes=allow toggling of XOFF checking	11CH
IGNORCTL:	DB	YES	;yes=CTL-chars above ^M not displayed	11DH
EXTRA1:		DB	0	;for future expansion			11EH
EXTRA2:		DB	0	;for future expansion			11FH
;
;
;	Next 8 DBs used in MDM7xx not by MEXxxx, kept here for 
;       reference only.
;         'esc'=Escape character defined with STAT ESC command.
;
BRKCHR:		DB	'@' ;'esc'-@ = Send 300 ms. break tone		120H
NOCONNCT:	DB	'N' ;'esc'-N = Disconnect from the phone line	121H
LOGCHR:		DB	'x' ;'esc'-x = Send Key 'x' (defined by KEY) 	122H
LSTCHR:		DB	'P' ;'esc'-P = Toggle printer			123H
UNSAVE:		DB	'U' ;'esc'-U = Unstart input text capture	124H
TRANCHR:	DB	'T' ;'esc'-T = Transmit file to remote		125H
SAVECHR:	DB	'S' ;'esc'-S = Start input text capture		126H
EXTCHR:		DB	' ' ;'esc' - 'esc'  = Send escape character	127H
;
;
		DS	2		;				128H
;
IN$MODCTL1:	IN	MODCTL1 ! RET	;in modem control port	     	12AH
		DS	7
OUT$MODDATP:	OUT	MODDATP ! RET	;out modem data port		134H
		DS	7
IN$MODDATP:	IN	MODDATP ! RET	;in modem data port		13EH
		DS	7
ANI$MODRCVB:	ANI	MODRCVB	! RET	;bit to test for receive ready	148H
CPI$MODRCVR:	CPI	MODRCVR	! RET	;value of rcv. bit when ready	14BH
ANI$MODSNDB:	ANI	MODSNDB	! RET	;bit to test for send ready	14EH
CPI$MODSNDR:	CPI	MODSNDR	! RET	;value of send bit when ready	151H
		DS	12		;				156H
;
;
LOGONPTR	DS	2		;FOR USER MESSAGE, NOT USED
;
;  DIALV will be overwritten by SM overlays
;
DIALV		DS	3		;reserved for dial routine jump
;  DISCV May be modified by SM overlays, depending on method of disconnect.
DISCV		JMP	DISCON		;disconnect modem
JMP$GOODBYE:	JMP	GOODBYE		;				168H
JMP$INITMOD:	JMP	INITMOD		;go to user written routine	16BH
JMP$SETBAUD     JMP     STBAUD2		;set baud from dial overlay
		RET  !  NOP  !  NOP	;(by-passes PMMI routine)	171H
		RET  !  NOP  !  NOP	;(by-passes PMMI routine)	174H
JMP$SETUPR:	JMP	SETCMD		;				177H
JMP$SPCLMENU	RET ! NOP ! NOP		;
JMP$SYSVER:	JMP	SYSVER		;				17DH
JMP$BREAK:	JMP	SENDBRK		;				180H
;
;
; Do not change the following six lines.
;
JMP$ILPRT:	DS	3		;				183H
JMP$INBUF	DS	3		;				186H
JMP$INLNCOMP:	DS	3		;				189H
JMP$INMODEM	DS	3		;				18CH
JMP$NXTSCRN:	DS	3		;				18FH
JMP$TIMER	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,CLRLIN 	; To clear to End Of Screen
		MVI	C,PRINT	        ; Put Terminal Data at CLRLIN
		CALL	MEX
		RET
;
;
CLRSCN:		LXI	D,CLS		; Put Terminal Sequence for
		MVI	C,PRINT		; Screen Clear at CLS
		CALL	MEX
		RET
;
; END OF FIXED ADDRESS ----------------------------------
;

SYSVER:		LXI	D,VERSMSG
		MVI	C,PRINT
		CALL	MEX
		RET
;
VERSMSG:
		DB	'AMPRO LITTLE BOARD AND SERIES 100 COMPUTER'
		DB	' VERSION ',VER+'0','.', REV+'0',CR, LF,LF
		DB	'FULL SET COMMANDS !',CR,LF,LF,'$'
;
CLS  		DB	0,0,0,0,0,'$'   ; <<- set this and the next for
					;     your screen clear and line
					;     clear sequences.
CLRLIN		DB	0,0,0,0,0,'$'
;.....
;
;
;-----------------------------------------------------------------------
;.....
;
;
;
SENDBRK:	MVI	A,5
		OUT	PORT
		MVI	A,0FAh	; Send 'BREAK' command to DART
		OUT	PORT
		MVI	B,BRKWT	; Wait 
		CALL	MTIME
		MVI	A,5
		OUT	PORT
		LDA	REG5	; Send setup back to DART
		OUT	PORT
		RET
;.....
;
;
;
;.....
;
;
; The following is used to initialize the AMPRO Z80 DART port "B".
; Baud rate is initially set from MSPEED value
;
INITMOD:  DI		;no interupts during setup
	  LDA 	MSPEED	; get the initial MSPEED value and go
			; set the baud rate with it
	  CALL	PBAUD
;
NITSIO:	  DI		; All DART sets go here
;
	  MVI	A,04H	;write register 4 of DART 
	  OUT	PORT	;contol port
	  LDA	REG4	; mult, stop bits, parity bits
	  OUT	PORT	;	
;
	  MVI	A,03H	;write register 3 of DART
	  OUT 	PORT	;
	  LDA	REG3	; rcv n bits/char, rcv enable
	  OUT	PORT	;
;
	  MVI	A,05H	;write register 5 of DART
	  OUT	PORT	;
	  LDA	REG5	; BITS/CHAR, TX ENABLE, RTS ENABLE
	  OUT	PORT	;
;
	  MVI	A,45H	;counter mode,contol word time constant follows
	  OUT	CTC	;CTC channel 1
;
	  LDA	CTC1	; MULTIPLIER
	  OUT	CTC	;CTC channel 1
	  EI		;
	  RET
;
;------------------------------------------------------------
;
;;
;
; Disconnect Routine
;
; Disconnects by lowering J4-P4 (Hand Shake Out) -connect
;  to DTR on semi-smart modems like Novation J-Cat
;
;  Hangs up modem for 2 seconds
;
;
DISCON:	  MVI	A,5		;OUTPUT TXOFF,RXOFF,DTROFF TO 
	  OUT	PORT		;TO DART PORT 5
	  MVI	A,0
	  OUT   PORT
 	  MVI	B,HNGUPT*10		; WAIT 2 SEC
	  CALL  MTIME
	  MVI	A,5		; THEN RESET DART TO ORIGINAL STATUS
	  OUT	PORT
	  LDA	REG5
	  OUT	PORT
	  RET
;
;
;
; GOODBYE routines are called by MEX prior to exit to CP/M
;
GOODBYE:  MVI	B,GBYTME		;DELAY 300 MS.
	  CALL  MTIME
	  RET
;
;  SET COMMAND PROCESSOR
;
SETCMD:	  MVI	C,SBLANK	;ANY ARGUMENTS?
	  CALL	MEX
	  JC	SETSHO		;IF NOT, DISPLAY DEFAULTS
	  LXI	D,CMDTBL	
	  MVI	C,LOOKUP	
	  CALL  MEX		;PARSE THE ARGUMENT
	  PUSH	H		;SAVE ANY PARSED ARGUMENTS ON STACK
	  RNC			;IF WE HAVE ONE, RETURN TO IT
	  POP	H		;OOPS, INPUT NOT FOUND IN TABLE
SETERR:	  LXI	D,SETEMS
	  MVI	C,PRINT
	  CALL	MEX
	  CALL  CRLF
	  RET
SETEMS:	  DB	CR,LF,'SET command error',CR,LF,'$'
;
SETBAD:	  LXI	D,SETEMS
	  MVI	C,PRINT
	  CALL	MEX
;
CMDTBL:   DB	'?'+80H			; HELP
	  DW	SETHELP
	  DB	'BAU','D'+80H		; SET BAUD
	  DW	STBAUD
	  DB	'PARIT','Y'+80H		; SET PARITY
	  DW	STPRTY
	  DB	'STOPBIT','S'+80H	; SET STOPBITS
	  DW    STSTOP
	  DB	'LENGT','H'+80H		; SET LENGTH
	  DW	STBITS
	  DB 	'PULS','E'+80H		;SET PULSE FOR SM OVERLAY
	  DW	SWPULSE
	  DB	'TON','E'+80H		;SET TONE FOR SM OVERLAY
	  DW    SWTONE
	  DB	'$'			;TABLE TERMINATOR
;
;
;  "SET (no args): PRINT CURRENT STATISTICS
;
SETSHO:	  CALL  MILP
	  DB	CR,LF
	  DB	'SET values:',CR,LF,0
          CALL	CRLF
	  CALL	MILP
	  DB	'Baud Rate: ',TAB,0
	  CALL	BDSHOW
	  CALL	CRLF
	  CALL  SHPRTY
	  CALL	CRLF
	  CALL	SHSTOP
	  CALL	CRLF
	  CALL  SHBITS
	  CALL	CRLF
	  CALL	SHDIAL
	  CALL  CRLF
	  CALL  CRLF
	  RET
;
; "SET ?" processor
;
SETHELP:  CALL	MILP
	  DB	CR,LF,'SET PARITY    - OFF, EVEN or ODD'
	  DB	CR,LF,'SET STOPBITS  - 1, 1.5 or 2'
	  DB	CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
	  DB	CR,LF,'SET BAUD      - 300, 450, 600, 1200, 2400, '
	  DB	'4800, 9600'
	  DB    CR,LF,'SET PULSE     - For Pulse Dialing'
          DB    CR,LF,'SET TONE      - For Tone Dialing'
	  DB	CR,LF,CR,LF,0
	  RET
;
;
; "SET BAUD" processor
;
STBAUD:    MVI	C,BDPARS	;FUNCTION CODE: PARSE A BAUDRATE
	  CALL	MEX		;LET MEX LOOK UP CODE
	  JC	SETERR		;JUMP IF INVALID CODE
STBAUD2	  CALL	PBAUD		;NO, TRY TO SET IT
	  JC	SETERR		;IF NOT ONE OF OURS, BOMB OUT
	  CALL	NITSIO
BDSHOW:	  LDA	MSPEED		;GET CURRENT BAUD RATE
	  MVI	C,PRBAUD	;LET MEX PRINT IT
	  CALL	MEX
	  RET 
;
; This routine sets baud rate passed as MSPEED code in A.
; Returns CY=1 if baud rate not supported.
;
PBAUD:	  PUSH	H		;DON'T ALTER ANYBODY
	  PUSH	D
	  PUSH 	B
	  STA	TSPEED		;put it in a safe spot
	  ADD	A		;double it for offset into table
	  MOV	E,A		;MSPEED CODE TO DE
	  MVI	D,0
	  LXI	H,BAUDTB	;OFFSET INTO TABLE
	  DAD	D
	  MOV	A,M		;FETCH CODE
	  ORA	A		;0 MEANS UNSUPPORTED CODE
	  STC			;PREP CARRY IN CASE UNSUPPORTED
	  JZ	PBEXIT		;EXIT IF BAD
	  STA	CTC1		;
	  INX	H
	  LDA	REG4
	  ANI	0FH
	  ORA	M
	  STA	REG4
	  LDA	TSPEED
	  STA	MSPEED
	  ORA	A		;RETURN NO ERRORS
PBEXIT:	  POP	B
	  POP	D
	  POP	H
	  RET
;
BAUDTB	DB	0,0		;110 (NOT SUPPORTED)
	DB	208,080H	;300
	DB	156,080h	;450 
	DB	208,040H	;600
	DB	0,0
	DB	104,040H	;1200
	DB	52,040H		;2400
	DB	26,040H		;4800
	DB	13,040H		;9600
	  DB	0FH		;19200 (Not Supported) 
	  RET
;
;	SET PARITY command: reset transmit/receive parity
;
;		Parity is controlled by bits 0 and 1 of
;		the byte sent to the SIO write-register
;		4 as follows:
;
;		   Parity	Bit 1	   Bit 0
;	             Off          -          0
;	 	     Odd	  0	     1
;		     Even	  1	     1
;
STPRTY:	  MVI	C,SBLANK	;check for parity code
	  CALL	MEX		;
	  JC	SETERR		;if none, print error
	  LXI	D,PARTBL	;check for proper syntax
	  MVI	C,LOOKUP
	  CALL	MEX
	  PUSH	H		;match found, go do it!
	  RNC			;
	  POP	H		;no match: fix stack and
	  JMP	SETERR		;  print error
;
PROFF:	  LDA	REG4		;get register 4 byte
	  ANI	0FEH		;reset bit 0
	  JMP	PARTB1		;
PREVEN:	  LDA	REG4		;
	  ORI	003H		;set bits 0 & 1
	  JMP	PARTB1		;
PRODD:	  LDA	REG4		;
	  ORI	001H		;set bit 0
	  ANI	0FDH		;reset bit 1
PARTB1:	  STA	REG4		;
	  CALL	NITSIO		;re-initialize the USART
	  CALL	SHPRTY		;print the result
	  RET     		;
SHPRTY:	  CALL	MILP		;display parity
	  DB	'Parity:  ',TAB,' ',0
	  LDA	REG4		;
	  ANI	001H		;test bit 0
	  CPI	0		;if bit0=0 then parity off
	  JNZ	SHPRT1		;
	  CALL	MILP		;
	  DB	'Off',0		;
	  RET
SHPRT1:	  LDA	REG4		;
	  ANI	002H		;test bit 1
	  CPI	0		;if bit1=0 then parity odd
	  JNZ	SHPRT2		;
	  CALL	MILP		;
	  DB	'Odd',0		;
	  RET			;
SHPRT2:	  CALL	MILP		;
	  DB	'Even',0	;
	  RET
;
;	SET PARITY command table
;
PARTBL:	  DB	'OF','F'+80H	;"set parity off"
	  DW	PROFF
	  DB	'EVE','N'+80H	;"set parity even"
	  DW	PREVEN
	  DB	'OD','D'+80H	;"set parity odd"
	  DW	PRODD
	  DB	0		;<<== end of parity table
;
;	SET STOPBITS command: reset number of stop bits
;
;		The number of stop bits is controlled by bits
;		2 and 3 of the byte sent to the SIO write-
;		register 4, as follows:
;
;		    Stop bits	   Bit 3	Bit 2
;			1	     0            1
;		       1.5	     1		  0
;			2	     1		  1
;
;
STSTOP:	  MVI	C,SBLANK	;check for stop bits
	  CALL	MEX		;
	  JC	SETERR		;if none, print error
	  LXI	D,STPTBL	;check for proper syntax
	  MVI   C,LOOKUP
	  CALL	MEX		;
	  PUSH	H		;match found, go do it!
	  RNC			;
	  POP	H		;no match: fix stack and
	  JMP	SETERR		;  print error
;
STOP01:	  LDA	REG4		;get register 4 byte
	  ANI	0F7H		;reset bit 3
	  ORI	004H		;set bit 2
	  JMP	STSTP1		;
STOP02:	  LDA	REG4		;
	  ORI	00CH		;set bits 2 and 3
	  JMP	STSTP1		;
STOP15:	  LDA	REG4		;
	  ORI	008H		;set bit 3
	  ANI	0FBH		;reset bit 2
STSTP1:	  STA	REG4		;
	  CALL	NITSIO		;
	  CALL	SHSTOP		;print the result
	  RET
SHSTOP:	  CALL	MILP		;display stop-bits
	  DB	'Stop bits:',TAB,' ',0
	  LDA	REG4		;
	  ANI	004H		;test bit 2
	  CPI	0		;if bit2=0 then 1.5
	  JNZ	SHSTP1		;
	  CALL	MILP		;
	  DB	'1.5',0		;
	  RET
SHSTP1:	  LDA	REG4		;
	  ANI	008H		;test bit 3
	  CPI	0		;if bit3=0 then 1
	  JNZ	SHSTP2		;
	  CALL	MILP		;
	  DB	'1',0		;
	  RET
SHSTP2:	  CALL	MILP		;
	  DB	'2',0		;
	  RET
;
;	SET STOPBITS command table
;
STPTBL:	  DB	'1'+80H		;"set stop 1"
	  DW	STOP01
	  DB	'2'+80H		;"set stop 2"
	  DW	STOP02
	  DB	'1.','5'+80H	;"set stop 1.5"
	  DW	STOP15
	  DB	0		;<<== End of stop-bits table
;
;	SET LENGTH command: set bits per character
;
;		The number of bits per character is controlled for
;		the receiver circuit by bits 6 and 7 of the byte
;		sent to the SIO write-register 3 and for the trans-
;		mitter circuit by bits 5 and 6 of the byte sent to
;		the SIO write-register 5.  The assumption has been
;		made here that both transmission and reception will
;		be carried on at the same number of bits per charac-
;		ter.  The bit configurations are shown for register
;		3 only, but are the same for register 5:
;
;                       REG5--->Bit 6           Bit 5
;		    BPC	REG3--->Bit 7		Bit 6
;		     5		  0		  0
;		     6		  1   		  0
;		     7		  0		  1
;		     8		  1		  1
;
STBITS:	  MVI	C,SBLANK	;check for bits/char
	  CALL	MEX		;
	  JC	SETERR		;if none, print error
	  LXI	D,BITTBL	;check for proper syntax
	  MVI	C,LOOKUP
	  CALL	MEX
	  PUSH	H		;match found, go do it!
	  RNC			;
	  POP	H		;no match: fix stack and
	  JMP	SETERR		;  print error
;
BIT5:	  LDA	REG3		;
	  ANI	0BFH		;reset bit 6
	  ANI	07FH		;reset bit 7
	  STA	REG3		;
	  LDA	REG5		;
	  ANI	0DFH		;reset bit 5
	  ANI	0BFH		;reset bit 6
	  JMP	STBTS1		;
BIT6:	  LDA	REG3		;
	  ANI	0BFH		;reset bit 6
	  ORI	080H		;set bit 7
	  STA	REG3		;
	  LDA	REG5		;
	  ANI	0DFH		;reset bit 5
	  ORI	040H		;set bit 6
	  JMP	STBTS1		;
BIT7:	  LDA	REG3		;
	  ORI	040H		;set bit 6
	  ANI	07FH		;reset bit 7
	  STA	REG3		;
	  LDA	REG5		;
	  ORI	020H		;set bit 5
	  ANI	0BFH		;reset bit 6
	  JMP	STBTS1		;
BIT8:	  LDA	REG3		;
	  ORI	040H		;set bit 6
	  ORI	080H		;set bit 7
	  STA	REG3		;
	  LDA	REG5		;
	  ORI	020H		;set bit 5
	  ORI	040H		;set bit 6
STBTS1:	  STA	REG5		;
	  CALL	NITSIO		;
	  CALL	SHBITS		;print the result
	  RET
SHBITS:	  CALL	MILP		;display bits/char
	  DB	'Bits/char:',TAB,' ',0
	  LDA	REG5		;
	  ANI	040H		;test bit 6
	  CPI	0		;if bit6=0 then 6 bpc
	  JNZ	SHBTS2		;
	  LDA	REG5		;
	  ANI	020H		;test bit 5
	  CPI	0		;if bit5=0 then 5 bpc
	  JNZ	SHBTS1		;
	  CALL	MILP		;
	  DB	'5',0		;
	  RET			;
SHBTS1:	  CALL	MILP		;
	  DB	'7',0		;
	  RET			;
SHBTS2:	  LDA	REG5		;
	  ANI	020H		;test bit 5
	  CPI	0		;if bit5=0 then 6 bpc
	  JNZ	SHBTS3		;
	  CALL	MILP		;
	  DB	'6',0		;
	  RET			;
SHBTS3:	  CALL	MILP		;
	  DB	'8',0		;
	  RET
;
;	SET LENGTH command table
;
BITTBL:	  DB	'5'+80H		;"set bits 5"
	  DW	BIT5
	  DB	'6'+80H		;"set bits 6"
	  DW	BIT6
	  DB	'7'+80H		;"set bits 7"
	  DW	BIT7
	  DB	'8'+80H		;"set bits 8"
	  DW	BIT8
	  DB	0		;<<== end of bit table
;
	  RET
;
;
;
SWPULSE:  MVI	A,'P'		; Put 'P' into Touch/Pulse byte
	  STA	TOUCHPULSE	; for SM Overlay to grab	
	  JMP	SHDIAL
;
SWTONE	  MVI	A,'T'		; Or put 'T' there
	  STA	TOUCHPULSE
	  
;
SHDIAL:	  LDA	TOUCHPULSE	; Grab Flag 
	  CPI	'T'		; if Tone then say so
	  JZ	TONED
	  CPI	'P'		; likewise if pulse
	  JZ	PULSED
	  LXI	D,BADFLA	; But if bad say so
	  MVI   C,PRINT		; should never get here, just for 
	  CALL	MEX		; safety
	  RET
TONED:	  LXI	D,TONEFLF
	  MVI	C,PRINT
	  CALL	MEX
	  RET
PULSED	  LXI	D,PULSEF
	  MVI	C,PRINT
	  CALL	MEX
	  RET
BADFLA:	  DB	'BAD TOUCH/PULSE FLAG',CR,LF,'$'
TONEFLF	  DB	'Tone Dial','$'
PULSEF    DB    'Pulse Dial','$'
;
; General utility routines
;
MILP:	  MVI	C,ILP		;IN-LINE PRINT
	  JMP	MEX
	  RET
;
MTIME:	  MVI	C,TIMER		;MEX TIMER
	  JMP	MEX
	  RET
;
CRLF:	  CALL	MILP		;PRINT CARRIAGE RETURN, LINE FEED
	  DB	CR,LF,0
	  RET
;
;
;==========================================================================
;                            Data Area
;==========================================================================
;
; Default UART parameters (Initalized for  RS-232 port B)
;
REG3:	  DB	0C1H	;ENABLE RECEIVE AT 8 BITS/CHAR
REG4:	  DB	004H	;NO PARITY, 1 STOP, CLOCK RATE SET AT INITALIZE TIME
REG5:	  DB	06AH	;ENABLE TRANSMIT AT 8 BITS/CHAR
CTC1	  DB     0	;Also set at initalize time
;
; Miscellaneous Default Data
;
;
TSPEED	  DB	1		;TEMP SPEED AREA
;
;
	  END

