; MXO-HZ20.ASM-- Heath/Zenith H89 and H100 overlay file for MEX. 10/06/85
;
; --> BIG NOTE:  This is a single universal overlay for all of the Heath/Zenith
;     computers (except the H150).  It even takes into account "non-standard"
;     versions of the H89 (ie with the Z89-11 I/O board).  It replaces all
;     previous versions of MXO-H8xx and MXO-HZxx.
;
;     In addition, it has a full featured SET command which allows dynamic
;     changing of the data bits, parity, stop bits, answer delay and more.
;
; 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.
;
;************************************************************************
;************************  SMARTMODEM USERS  ****************************
;*                                                                      *
;* Set SMMODEM label to YES for changing delay until "hangup" with no   *
;* answer and for ORIGINATE/ANSWER OPTION. Also MUST add to             *     
;* MXO-SM13.ASM (or earlier) at "SYSTEM EQUATES":                       *
;*                               NDELAY  EQU  011EH                     *
;*                                                                      *
;* and change:                   RESULT:  MVI C,60 to                   *
;*                               RESULT:  LDA  NDELAY                   *
;*                               MOV  C,A                               *
;*									*	
;* and change SMTIMO to read:  	 SMTIMO:  MVI  B,CR    \		*
;*				 	  MVI  C,SNDCHR \  new code	*
;*					  CALL MEX      /		*
;*					  MVI  A,2			*
;*					  RET				*
;* If you have MXO-SM17.ASM (or later) this patch is NOT necessary      *
;*                                                                      *
;************************************************************************
;*               TYPE "SET ?" AT MEX PROMPT FOR SET OPTIONS             *
;************************************************************************
;       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.
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
; 10/06/85 - Added equate for the H100          - Jim McAfee
; 09/01/85 - Added 2661-3 code, and made the
;            overall code more "universal"      - Jim McAfee                    
; 08/29/85 - Add SET for parity, stop-bits,word
;            length,answer/originate and delay  - Biff Bueffel  
; 05/19/84 - Converted for MEX10                - Biff Bueffel
; 01/10/83 - Updated to work with MDM701        - Irv Hoff
; 10/03/82 - First version of this file
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
YES:            EQU     0FFH
NO:             EQU     0
;
SMMODEM         EQU     YES             ;YES for smartmodem
;
;
H89     EQU     YES     ; Set this to YES if you have an H89, NO if H100
Z8911   EQU     NO      ; Set this to YES if your H89 has the Z89-11
                        ; serial/parallel card (with the 2661-3 UART at 330Q).
                        ; Set this to NO if you have the standard H88-3 card
                        ; or you have the H100
;
         IF H89 AND (NOT Z8911)
;
;The following equates are for the H88-3 card.  You need only set the 
;DPORT and DEFLCR equates to match your configuration
;
DPORT:          EQU     0D8H            ;data port for H89
SPORT:          EQU     DPORT+5         ;status port for H89
LCPORT          EQU     DPORT+3         ;line control port
INTPORT         EQU     DPORT+1         ;interrupt port
MCPORT          EQU     DPORT+4         ;modem control port
SPDPORT0        EQU     DPORT           ;first baud rate control port
SPDPORT1        EQU     DPORT+1         ;second baud rate port
BRPORT          EQU     DPORT+3         ;port to set the BREAK
;
MDRCVB:         EQU     1               ;bit to test for received data
MDRCVR:         EQU     1               ;modem receive ready
MDSNDB:         EQU     20H             ;bit to test for ready to send
MDSNDR:         EQU     20H             ;modem send ready bit
;
SDB8            EQU     00000011B       ;set data bits to 8
SDB7            EQU     00000010B       ;... and 7
SDB6            EQU     00000001B       ;... and 6
SDB5            EQU     0               ;... and 5
RDB             EQU     11111100B       ;reset data bits
DATBITM         EQU     00000011B       ;data bit mask
;
SPOFF           EQU     0               ;set parity to off
SPODD           EQU     00001000B       ;set parity to odd
SPEVEN          EQU     00011000B       ;set parity to even
RPOFF           EQU     11100111B       ;reset parity bits (to off)
PARITYM         EQU     00011000B       ;parity mask
;
SSB1            EQU     0               ;set stop bits to 1
SSB15           EQU     00000100B       ;... and 1.5
SSB2            EQU     00000100B       ;... and 2
RSB             EQU     11111011B       ;reset stop bits
STPBITM         EQU     00000100B       ;stop bit mask
;
DEFLCR          EQU     SDB8+SPOFF+SSB1 ;default values for the line cont. reg
;
SDLAB           EQU     10000000B       ;set divisor latch access bit
;
SBR             EQU     01000000B       ;set break
RBR             EQU     10111111B       ;reset break
;
SRTSDTR         EQU     00000011B       ;set DTR & RTS true (on)
RRTSDTR         EQU     11111100B       ;reset DTR & RTS
;
         ENDIF          ;H89 AND (NOT Z8911)
;
; The following equates are for the H89 using the Z89-11 card or the H100.
; You need only set the DPORT and DEFLCR equates to match your setup.

         IF H89 AND Z8911
DPORT:          EQU     330Q            ;data port for H89
         ENDIF

         IF NOT H89
DPORT:          EQU     0ECH
         ENDIF

         IF (H89 AND Z8911) OR NOT H89
SPORT:          EQU     DPORT+1         ;status port for
LCPORT          EQU     DPORT+2         ;line control port
MCPORT          EQU     DPORT+3         ;modem control port
SPDPORT0        EQU     LCPORT          ;used to make the code ...
SPDPORT1        EQU     LCPORT          ;... truly universal 
BRPORT          EQU     DPORT+3         ;port to set the BREAK
;
MDRCVB:         EQU     2               ;bit to test for received data
MDRCVR:         EQU     2               ;modem receive ready
MDSNDB:         EQU     1               ;bit to test for ready to send
MDSNDR:         EQU     1               ;modem send ready bit
;
SDB8            EQU     00001100B       ;set data bits to 8
SDB7            EQU     00001000B       ;... and 7
SDB6            EQU     00000100B       ;... and 6
SDB5            EQU     0               ;... and 5
RDB             EQU     11110011B       ;reset data bits
DATBITM         EQU     00001100B       ;data bit mask
;
SPOFF           EQU     0               ;set parity to off
SPODD           EQU     00010000B       ;set parity to odd
SPEVEN          EQU     00110000B       ;set parity to even
RPOFF           EQU     11001111B       ;reset parity bits (to off)
PARITYM         EQU     00110000B       ;parity mask
;
SSB1            EQU     01000000B       ;set stop bits to 1
SSB15           EQU     10000000B       ;... and 1.5
SSB2            EQU     11000000B       ;... and 2
RSB             EQU     00111111B       ;reset stop bits
STPBITM         EQU     11000000B       ;stop bit mask
;
SMODE           EQU     1               ;set to asynchronous mode
;
DEFLCR          EQU     SDB8+SSB1+SPOFF+SMODE   ;default values for the
;                                                ... line control reg
;
SBR             EQU     00001000B       ;set break
RBR             EQU     11110111B       ;reset break
;
SRTSDTR         EQU     00100111B       ;set DTR & RTS true (on), also sets
                                        ;RxEN and TxEN true
RRTSDTR         EQU     11011000B       ;reset DTR & RTS
;
         ENDIF          ;(H89 AND Z8911) OR (NOT H89)
;
;
;MEX service processor stuff
;
MEX             EQU     0D00H           ;address of the service processor
INMDM           EQU     255             ;get char from port to A, CY=no more in 
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 sn
RCVCHR          EQU     248             ;recv a char from modem (after rcvrdy)
LOOKUP          EQU     247             ;table search: see CMDTBL comments for i
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
;
BELL:           EQU     07H             ;bell
CR:             EQU     0DH             ;carriage return
ESC:            EQU     1BH             ;escape
LF:             EQU     0AH             ;linefeed
TAB:            EQU     09H             ;TAB
PRINT           EQU     09H             ;BDOS print-string function
;
                ORG     100H
;
;Change the clock speed if needed, to match your system
;
                DS      3       ;(for  "JMP   START" instruction)
;
                DS      1       ;                                       103H
                DS      1       ;                                       104H
TPULSE:         DB      'T'     ;T=touch, P=pulse (Smartmodem-only)     105H
CLOCK:          DB      20      ;clock speed in MHz x10, 25.5 MHz max.  106H
                                ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
MSPEED:         DB      5       ;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
COLUMS:         DB      5       ;number of DIR columns shown            10AH
SETFLG:         DB      YES     ;yes=user-added Setup routine           10BH
SCRTST:         DB      YES     ;Cursor control routine                 10CH
                DS      1       ;                                       10DH
BAKFLG:         DB      NO      ;yes=change any file same name to .BAK  10EH
CRCFLG:         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      NO      ;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
                DS      1       ;                                       115H
                                ;write logon sequence at location LOGON
SAVCCP:         DB      YES     ;yes=do not overwrite CCP               116H
                DS      1       ;                                       117H
                DS      1       ;                                       118H
LSTTST:         DB      YES     ;yes=printer available on printer port  119H
XOFTST:         DB      NO      ;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
NDELAY:         DB      30      ;Modem no answer delay                  11EH
EXTRA:          DS      1       ;                                       11FH
BRKCHR:         DB      '@'-40H ;^@ = Send a 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
UNSAVE:         DB      'R'-40H ;^R = Close input text buffer           124H
TRNCHR:         DB      'T'-40H ;^T = Transmit file to remote           125H
SAVCHR:         DB      'Y'-40H ;^Y = Open input text buffer            126H
EXTCHR:         DB      '^'-40H ;^^ = Send next character               127H
;
                DS      2               ;                               128H
;
INCTL1:         IN      SPORT ! RET     ;in modem control port          12AH
                DS      7
OTDATA:         OUT     DPORT ! RET     ;out modem data port            134H
                DS      7
INPORT:         IN      DPORT ! RET     ;in modem data port             13EH
                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	17		;				154H
DISCV:		JMP	DISCON		;disconnect			
GOODBV:		JMP	GOODBY		;				168H
INMODV:		JMP	DEFINI 		;go to user written routine	16BH
					;Note this change from earlier vers.
NEWBDV:		JMP	NEWBAUD		;Change baudrate		16EH
		RET  !	NOP  !	NOP	;				171H
		RET  !	NOP  !	NOP	;				174H
SETUPV:		JMP	SETCMD		;				177H
		DS	3		;Not used by MEX		17AH
VERSNV:		JMP	SYSVER		;				17DH
BREAKV:		JMP	SBREAK		;				180H
;
;Do not change the following six lines.
;
ILPRTV:		DS	3		;				183H
INBUFV:		DS	3		;				186H
INCMPV:		DS	3		;				189H
INMDMV:		DS	3		;				18CH
		DS	3		;				18FH
TIMERV:		DS	3		;				192H
;
;The following clear the screen for the H19 or H89 terminal
;
CLREOS:		LXI	D,EOSMSG
		MVI	C,PRINT
		CALL	MEX
		RET			
;
CLS:		LXI	D,CLSMSG
		MVI	C,PRINT
		CALL	MEX
		RET			
;
;
SYSVER:		CALL    MILP
		DB	'Version for Heath/Zenith '

		 IF H89
		DB	'H89'
		 ENDIF
	
		 IF NOT H89
		DB	'H100'
		 ENDIF

		DB	' with '

		 IF H89 AND (NOT Z8911)
		DB	'8250'
		 ENDIF

		 IF H89 AND Z8911
		DB	'2661-3'
		 ENDIF

		 IF NOT H89
		DB	'2661-2'
		 ENDIF

		DB	' UART',CR,LF,0
		RET	
;------
;
;This routine sends a 300 ms. break tone to reset some time-share
;computers.

SBREAK:   IN	BRPORT
	  ORI	SBR	
	  OUT	BRPORT
	  JMP	DISC1

;------
GOODBY:	  RET			;Not done here

;------
;
;Disconnect the modem	

DISCON:	  XRA	A
	  OUT	MCPORT		;SET DTR AND RTS LOW
;
DISC1:	  MVI	B,3		;WAIT 300 MS.
	  MVI	C,TIMER
	  CALL	MEX	
	  LDA	LCR		;stored version of line control register
	  OUT	LCPORT 
	  MVI	A,SRTSDTR
	  OUT	MCPORT 		;set DTR & RTS high
	  RET
;.....
;
;The following is used to initialize the H89/H100 UART.
;Note that on initialization the program jumps to DEFINI, which uses
;MSPEED to set the default modem speed, and the values at LCR: to set
;parity, data bits, etc.

DEFINI:	  LDA	MSPEED
	  JMP	NEWBAUD
;
NITMOD:   MVI	A,0	;this is set by LOADBD
	  STA	MSPEED	;store new modem speed
	  DI		;disable interrupts
;	
	 IF H89 AND (NOT Z8911)
	  XRA	A
	  OUT	INTPORT 	;clear interrupts
	  MVI	A,SDLAB
	  OUT	LCPORT	;set devisor latch access bit
	 ENDIF		;H89 AND (NOT Z8911)
;
LSPSPD:	  MVI	A,0		;Value set by LOADBD.
	  OUT	SPDPORT0	;With the 2661 this is mode register 1 = LCR
				;With the 8250 this is the LSB of baud rate
MSPSPD:	  MVI	A,0		;Value set by LOADBD
	  OUT	SPDPORT1	;With 2661 this is mode register 2 = baud rate
				;With 8250 this is MSB of baud rate
;
	 IF H89 AND (NOT Z8911)
	  LDA	LCR		;Already done above if 2661
	  OUT	LCPORT
	 ENDIF			;H89 AND (NOT Z8911)
;
	  MVI	A,SRTSDTR	;Set RTS & DTR
	  OUT	MCPORT
	  EI			;restore interrupts to normal
	  RET
;.....
;
;Set command processor
;
SETCMD:	  MVI	C,SBLANK	;ANY ARGUMENTS?
	  CALL  MEX
	  JC	SETSHO		;IF NOT, DISPLAY DEFAULT(S)
	  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:	CALL 	MILP
	  DB	CR,LF,'SET command error',CR,LF,0
	  RET
;
;Argument table
;
CMDTBL:   DB	'?'+80H			;HELP
	  DW	SETHELP
;
	   IF	SMMODEM
	  DB	'ORI','G'+80H		;ORIGINATE MODE
	  DW	ORIG
	  DB	'ANSWE','R'+80H		;ANSWER MODE
	  DW	ANS
	  DB	'TON','E'+80H		;TONE DIALING
	  DW	STTONE
	  DB	'PULS','E'+80H		;PULSE DIALING
	  DW	STPULSE
	  DB	'DELA','Y'+80H		;SET DELAY
	  DW	DELAY
           ENDIF		;SMMODEM
;
	  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	0			;TABLE TERMINATOR
;
;
; "SET (no args): PRINT CURRENT STATISTICS
;
SETSHO:	  CALL  MILP	
	  DB	CR,LF
	  DB	'SET values:',CR,LF,CR,LF,0

           IF SMMODEM
	  CALL	MDSHOW
	  CALL	CRLF
	  CALL	TPSHOW
	  CALL	CRLF
	  CALL	DLSHOW
	  CALL	CRLF		
	   ENDIF		;SMMODEM
;
	  CALL	BDSHOW
	  CALL	CRLF
	  CALL  SHPRTY
	  CALL	CRLF
	  CALL	SHSTOP
	  CALL	CRLF
	  CALL  SHBITS
	  CALL	CRLF
	  RET
;
;"SET ?" processor
;
SETHELP:  CALL	MILP

  	   IF SMMODEM
	  DB	CR,LF,'SET ORIG'
	  DB	CR,LF,'SET ANSWER'
	  DB	CR,LF,'SET TONE'
	  DB	CR,LF,'SET PULSE'
	  DB	CR,LF,'SET DELAY     - <N> seconds'
	   ENDIF		;SMMODEM
;
	  DB	CR,LF,'SET PARITY    - OFF, EVEN or ODD'
	  DB	CR,LF,'SET STOPBITS  - 1, or 2'
	  DB	CR,LF,'SET LENGTH    - 5, 6, 7 or 8'
	  DB	CR,LF,'SET BAUD      - 300, 600, 1200, 2400, '
	  DB	'4800, 9600'
	  DB	CR,LF,CR,LF,0
	  RET
;
;"SET BAUD" processor
;
STBAUD:	  MVI	C,SBLANK	;
	  CALL	MEX
	  JC	SETERR		;
	  LXI	D,BDTBL
	  MVI	C,LOOKUP
	  CALL	MEX		;Parse argument
	  PUSH	H		;Save any parsed argument addrs on stack
	  RNC			;If we have one, return to it
	  POP	H		;Oops, input not found in table
	  CALL	MILP		;Tell user input not valid
	  DB	CR,LF,'That baudrate not supported by SET command',CR,LF,0
	  RET
;
BDTBL:	  DB	'30','0'+80H
	  DW	OK300
	  DB	'60','0'+80H
	  DW	OK600
	  DB	'120','0'+80H
	  DW	OK1200
	  DB	'240','0'+80H
	  DW	OK2400
	  DB	'480','0'+80H
	  DW	OK4800
	  DB	'960','0'+80H
	  DW	OK9600
	  DB	0
;
OK300:	  MVI	A,1		;MSPEED 300 baud value
	  LHLD	BD300		;get 300 baud parameters in HL
	  JMP	LOADBD		;go load them
;
OK600:	  MVI	A,3
	  LHLD	BD600
	  JMP	LOADBD
;
OK1200:	  MVI	A,5
	  LHLD	BD1200
	  JMP	LOADBD
;
OK2400:   MVI	A,6
	  LHLD	BD2400
	  JMP	LOADBD
;
OK4800:	  MVI	A,7
	  LHLD	BD4800
	  JMP	LOADBD
;
OK9600:	  MVI	A,8
	  LHLD	BD9600
	  JMP	LOADBD
;
LOADBD:	  STA	NITMOD+1	;store speed to show transfer time

	   IF H89 AND (NOT Z8911)
	  MOV	A,L		;get least significant baud rate byte
	  STA	LSPSPD+1	;store in NITMOD
	  MOV	A,H		;get most signifcant baud rate byte
	   ENDIF	;H89 AND (NOT Z8911)

	   IF (H89 AND Z8911) OR (NOT H89)
 	  LDA	LCR		;sets the line control register
	  STA	LSPSPD+1
	  MOV	A,L
	   ENDIF	;(H89 AND Z8911) OR (NOT H89)

	  STA	MSPSPD+1	;store in NITMOD
	  JMP	NITMOD		;reset H89 8250
;
NEWBAUD:  CPI	1
	  JZ	OK300
	  CPI	3
	  JZ	OK600
	  CPI	5
	  JZ	OK1200
	  CPI	6
	  JZ	OK2400
	  CPI	7
	  JZ	OK4800
	  CPI	8
	  JZ	OK9600
	  RET
;
;Table of baud rate parameters
;
	 IF H89 AND (NOT Z8911)
BD300:	  DW	0180H
BD600:	  DW	00C0H
BD1200:	  DW	0060H
BD2400:	  DW	0030H
BD4800:	  DW	0018H
BD9600:   DW	000CH
	 ENDIF		;H89

	 IF H89 AND Z8911
BD300:	  DB	0F5H
BD600:	  DB	0F6H
BD1200:	  DB	0F7H
BD2400:	  DB	0FAH
BD4800:	  DB	0FCH
BD9600:   DB	0FEH
	 ENDIF		;H89 AND Z8911

	 IF NOT H89
BD300:	  DB	0F6H
BD600:	  DB	0F7H
BD1200:	  DB	0F8H
BD2400:	  DB	0FBH
BD4800:	  DB	0FCH
BD9600:   DB	0FDH
	 ENDIF		;NOT H89
;
BDSHOW:	  LDA	MSPEED		;GET CURRENT BAUD RATE
	  MVI	C,PRBAUD	;LET MEX PRINT IT
	  CALL	MEX
	  RET 
;
	  IF    SMMODEM
;
;SET MODE PROCESSOR 
;
ORIG:	  XRA	A
	  STA	ANSFLG		;SET ORIG FLAG
	  LXI	H,SMO		;SEND OUT ATS0=0
	  CALL	SMSEND
	  RET
;
ANS:	  MVI	A,0FFH
	  STA	ANSFLG		;SET ANS FLAG
	  LXI	H,SMA		;SEND OUT ATS0=1
	  CALL	SMSEND
	  RET			;EXIT 
;
;Send string to the SmartModem
;
SMSEND:	  MVI	C,SNDRDY	;WAIT FOR MODEM READY
	  CALL	MEX
	  JNZ	SMSEND
	  MOV	A,M		;FETCH NEXT CHARACTER
	  INX	H
	  ORA	A		;END?
	  RZ			;DONE IF SO
	  MOV	B,A		;NO, POSITION FOR SENDING
	  MVI	C,SNDCHR	;NOPE, SEND THE CHARACTER
	  CALL	MEX
	  JMP	SMSEND
;
MDSHOW:	  LDA	ANSFLG
	  ORA	A
	  JZ	MDORIG		
	  CALL	MILP
	  DB	'Auto-answer mode',0
	  RET
MDORIG:	  CALL	MILP
	  DB	'Originate mode',0
	  RET
;
SMO:	  DB	'ATS0=0',CR,0
SMA:	  DB	'ATS0=1',CR,0
;
;Set dial processor
;
STTONE:	  MVI	A,'T'
	  JMP	SDIAL1
STPULSE:  MVI	A,'P'
SDIAL1:   STA	TPULSE
	  RET
TPSHOW:	  LDA	TPULSE
	  CPI	'T'
	  JZ	TPTONE
	  CALL	MILP
	  DB	'Pulse Dial',0
	  RET
TPTONE:	  CALL	MILP
	  DB	'Tone Dial',0	  
	  RET
;
;Set delay processor
;
DELAY:	  MVI	C,EVALA
	  CALL	MEX
	  MOV	A,H
	  ORA	A
	  JNZ	SETERR
	  MOV	A,L
	  STA	NDELAY
	  RET
DLSHOW:	  CALL	MILP
	  DB	'Answer Delay is ',0
	  LHLD	NDELAY
	  MVI	H,0
	  MVI	C,DECOUT
	  CALL	MEX
	  CALL	MILP
	  DB	' seconds',0
	  RET
;
	  ENDIF		;SMMODEM
;
;------
;	SET PARITY command: reset transmit/receive parity
;
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
	  JC	SETERR
 	  LDA	LCR
	  ANI	RPOFF		;Reset parity bits (also sets parity off)
	  PCHL			;go to the proper section
;
PREVEN:	  ORI	SPEVEN
	  JMP	PARTB1
PRODD:	  ORI	SPODD
PARTB1:	  STA	LCR		;Also comes to this point if set parity to off
	  JMP	NITMOD
;
SHPRTY:	  CALL	MILP
	  DB	'Parity:  ',TAB,' ',0
	  LDA	LCR
	  ANI	PARITYM
	  CPI	SPOFF	;parity off?
	  JNZ	SHPRT1
	  CALL	MILP
	  DB	'Off',0
	  RET
SHPRT1:	  CPI	SPODD	;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	PARTB1
	  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
;

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		;
	  JC	SETERR		;print error
	  LDA	LCR
	  ANI	RSB		;reset stop bits
	  PCHL			;go do it

STOP01:	  ORI	SSB1
	  JMP	STSTP1
STOP15:	  ORI	SSB15
	  JMP	STSTP1
STOP02:	  ORI	SSB2
STSTP1:	  STA	LCR
	  JMP	NITMOD
;
;
SHSTOP:	  CALL	MILP		;display stop-bits
	  DB	'Stop bits:',TAB,' ',0
	  LDA	LCR		;
	  ANI	STPBITM
	  CPI	SSB1
	  JNZ	SHSTP2
	  CALL	MILP
	  DB	'1',0
	  RET
SHSTP2:	  CPI	SSB2
          JNZ	SHSTP15
	  CALL	MILP
	  DB	'2'
;
	 IF H89 AND (NOT Z8911)
	  DB	' or 1.5 if 5 bit data words'
	 ENDIF
;
	  DB 	0
	  RET
SHSTP15:	
	  CALL	MILP
	  DB	'1.5',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	;1.5 stop bits
	  DW	STOP15
	  DB	0		;<<== End of stop-bits table
;
;-------
;	SET LENGTH command: set bits per character
 

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
	  JC	SETERR
	  LDA	LCR
	  ANI	RDB		;reset data bits (also = 5 bit)
          PCHL			;go do function

BIT6:	  ORI	SDB6	;6 bits
	  JMP	STBTS1	  
BIT7:	  ORI	SDB7	;7 bits
	  JMP	STBTS1
BIT8:	  ORI	SDB8	;8 bits
STBTS1:	  STA	LCR	;also comes here if set bits to 5
	  JMP	NITMOD

SHBITS:	  CALL	MILP		;display bits/char
	  DB	'Bits/char:',TAB,' ',0
	  LDA	LCR		;
	  ANI	DATBITM
	  JZ	SHDB5
	  CPI	SDB6
	  JZ	SHDB6
	  CPI	SDB7
	  JZ	SHDB7
	  CALL	MILP
	  DB	'8',0
	  RET
SHDB7:	  CALL 	MILP
	  DB	'7',0
	  RET
SHDB6:	  CALL	MILP
	  DB	'6',0
	  RET
SHDB5:	  CALL	MILP
	  DB	'5',0
	  RET

;
;	SET LENGTH command table
 
BITTBL:	  DB	'5'+80H		;"set bits 5"
	  DW	STBTS1
	  DB	'6'+80H		;"set bits 6"
	  DW	BIT6
          DB	'7'+80H		;7 BITS
	  DW	BIT7
       	  DB	'8'+80h		;8 bits
	  DW	BIT8
	  DB	0		;<<== end of bpc table
;
;General utility routines
;
MILP:	  MVI	C,ILP		;IN-LINE PRINT
	  JMP	MEX
	  RET
;
CRLF:     CALL  MILP            ;PRINT CARRIAGE RETURN, LINE FEED
          DB    CR,LF,0
          RET
;
;
;
;==========================================================================
;                           Data Area
;==========================================================================
;
LCR:      DB    DEFLCR
ANSFLG:   DB    0
;
;
BAUDBUF:  DB    10,0
          DS    10
;
EOSMSG:   DB    ESC,'J',0,0,0,'$'                       
CLSMSG:   DB    ESC,'E',0,0,0,'$'
;------------------------------------------------------------------
;
;NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
;
         IF (0B00H-1-$) SHR 12
ERROR:  EQU     NOVALUE         ; PROGRAM IS TOO LARGE
         ENDIF

          END
