; MXO-AP12.ASM     Apple overlay file for MEX10.COM     06/03/84
;
REV	EQU	12
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
; 06/03/84   Completely MEXized, with all new lables, exclusive use of
;	     MEX processor, and a MEX SET routine which allows setting
;	     baud rate, smodem speaker on/off, and smodem auto answer
;	     on/off.  Type SET ? for command syntax, SET for current 
;	     settings.					-Norman Beeler	
; 05/27/84   Modified initialization routine (CPS) to check for carrier
;	     before initializing, to allow exiting MEX to CPM, (intentional
;	     or otherwise) and re-entering MEX without dropping line.
;	     Changed smodem wait-for-answer to 20 sec (Ma Bell charges for 
;	     30 sec, busy signal or not)		-Norman Beeler
;
; 05/17/84   Revised MDM7AP-4.ASM and renamed as MEX overlay.  Added
;	     PBAUD subroutine to allow auto baud set by MEX.   
;						        - Norman Beeler
;		 
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
; This overlay file enables Apple II computers with various serial 
; cards and external modems to use the MEX10  phone modem program.
; It supports the following Apple configurations:
;
;	1.Microsoft Z80 card or equivalent
;			 or
;	2.         PCPI Applicard
;			with	
;	a) CCS 7710 serial interface and external modem
;	b) SSM serial interface and external modem
;	c) Apple communications interface and external modem
;	d) Mountain Hardware CPS Multifunction card and external modem
;	e) Prometheus Versacard with software baud select and ext. modem
;
; 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.
; Much of the information contained here is not in the MEX10.ASM file.
;
; Edit this file for your preferences then follow the "TO USE:" example.
;
; Use the "SET" command to change the baudrate during program execution.  
;
; To use SET with the Prometheus Versacard a small hardware mod must be
; made, since the Versacard only supports baud rate selection via DIP 
; switches. This Mod will allow the Versacard to be switched between
; 300 and 1200 baud via software.
; A wire should be attached from Pin #12 on U16 (IC marked 8126)
; on the Versacard into Annunciator #3 (Pin #12) on the Apple game port.
; This will allow switch #4 on s2 of the Versacard to be toggled by setting
; or clearing annunciator #3. The default baud rate is set at MSPEED Below
; either (300 or 1200). Note: This method could be extended to all other
; Versacard baud rates and by using Annunciators 0,1,2 but 300 and
; 1200 are really needed for a modem program. The DIP switches on the
; Versacard should be set as follows:		-Tony Antonucci
;
; On switch bank #2: 
;			s2 - ON
;			s3 - OFF
;			s4 - OFF
;			s5 - OFF
;
;
;	TO USE: First edit this file filling in answers for your own
;		equipment.  Then assemble with ASM.COM or equivalent
;		assembler.  Then follow instructions in MEX doc to 
;		overlay program.
;

;
BELL:		EQU	07H	;bell
CR:		EQU	0DH	;carriage return
ESC:		EQU	1BH	;escape
LF:		EQU	0AH	;linefeed
TAB:		EQU	09H	;tab
;
YES:		EQU	0FFH
NO:		EQU	0
;
SLOT:		EQU	2	;slot of serial interface
SLOTOFF:	EQU	16*SLOT	;serial card slot offset
;
APPLICARD	EQU	NO 	;YES for Applicard
CCS:		EQU	NO	;YES for CCS 7710
VERSA:		EQU	NO 	;YES for Prometheus Versacard
COMCARD:	EQU	NO	;YES for Apple comcard
SSC:		EQU	NO	;YES for Super Serial Card
SSM:		EQU	NO	;YES for SSM serial card
CPS:		EQU	YES     ;YES for CPS card
;
		 IF 	APPLICARD
OFFSET		EQU	0C000H	;Applicard/Apple addressing offset
;
RDBYTE:		EQU	0FFE0H	;Read a byte from apple (A=byte)
WRBYTE:		EQU	0FFE3H	;Write a byte to apple (c=byte)
RDWORD		EQU	0FFE6H	;Read 2 bytes from apple (de=bytes)
WRWORD:		EQU	0FFE9H	;Write 2 bytes to apple (de=bytes)
RDNBYTS:	EQU	0FFECH  ;Read N bytes (de=count, hl=buffer)
WRNBYTS:	EQU	0FFEFH  ;Write N bytes (de=count, hl=buffer)
PEEK1BYTE:	EQU	6	;Command to peek 1 byte in apple
POKE1BYTE:	EQU	7	;Command to poke 1 byte in apple
		 ENDIF		;APPLICARD 
;
		 IF	NOT APPLICARD
OFFSET		EQU	0E000H	;Microsoft z80 (and everybody else)
		 ENDIF		;NOT APPLICARD
;
		 IF	VERSA
AN3SET:		EQU	0E05FH	;set annunciator #3
AN3CLR:		EQU	0E05EH	;clr	  "
		 ENDIF		;Versacard hardware mod support
;
		 IF	CCS
MODDAT:		EQU	  081H+OFFSET+SLOTOFF	;data port of CCS 7710
MODCT2:		EQU	  080H+OFFSET+SLOTOFF	;status port of CCS 7710
		 ENDIF		;endif CCS
;
		 IF	COMCARD OR VERSA
MODDAT:		EQU	  08FH+OFFSET+SLOTOFF	;data port of Comcard
MODCT2:		EQU	  08EH+OFFSET+SLOTOFF	;status port of Comcard
		 ENDIF		;endif Comcard or Versacard
;
		 IF	SSM
MODDAT:		EQU	  085H+OFFSET+SLOTOFF	;data port of SSM
MODCT2:		EQU	  084H+OFFSET+SLOTOFF	;status port of SSM
		 ENDIF		;endif SSM
;
		 IF	SSC
MODDAT:		EQU	  088H+OFFSET+SLOTOFF	;data port of Apple Super Serial Card
MODCT2:		EQU	  089H+OFFSET+SLOTOFF	;modem status port of Super Serial Card
MDRCVB:		EQU	08H	;bit to test for received data
MDRCVR:		EQU	08H	;modem receive ready
MDSNDB:		EQU	10H	;bit to test for ready to send
MDSNDR:		EQU	10H	;modem send ready bit
		 ENDIF		;endif SSC
;
;
; (Any slot with any CPS function assigned to it may be used.)
;
		 IF	CPS
MODCT1:		EQU	  0FEH+OFFSET+SLOT*100H  ;control port of CPS card
MODDAT:		EQU	  0FAH+OFFSET+SLOT*100H  ;data port of CPS card
MODCT2:		EQU	  0FBH+OFFSET+SLOT*100H  ;status port of CPS card
MDRCVB:		EQU	02H			;bit to test for receive
MDRCVR:		EQU	02H			;value when ready
MDSNDB:		EQU	01H			;bit to test for send
MDSNDR:		EQU	01H			;value when ready
MDDCDB:		EQU	01000000B		;DCD carrier bit mask
MDDCDR:		EQU	01000000B		;value if carrier received
MDDSRB:		EQU	10000000B		;DSR bit mask (used instead
MDDSRR:		EQU	10000000B		;...of dcd for BYE compat
;
; Command port equates
;
CBASE:		EQU	00000101B	;Command base
RESET:		EQU	00010000B	;Reset errors
DTR:		EQU	00000010B	;Turn on DTR
RTS:		EQU	00100000B	;Turn on RTS
		 ENDIF		;endif CPS
;
;
; Apple status bit equates for CCS, Comcard, Versacard and SSM
;
		 IF	NOT SSC AND NOT CPS
MDSNDB:		EQU	02H	;bit to test for send
MDSNDR:		EQU	02H	;value when ready
MDRCVB:		EQU	01H	;bit to test for receive
MDRCVR:		EQU	01H	;value when ready
		 ENDIF		;not SSC and not CPS
;
;
; We have software control over the Super Serial, CPS cards and
; Versacard; if hardware mod is made, so SETCMDTST is YES for
; those cards, below.
;.......
;  MEX processor stuff
;.......
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
PRINT	EQU	9		;simulated BDOS function 9
INBUF	EQU	10		;input buffer, same structure as BDOS 10
;
; ************************************************************************
		ORG	100H
;
;
; Change the clock speed to match your equipment.  The Microsoft Softcard
; operates at 2 MHz.
;
		DS	3	;(for  "JMP   START" instruction)
;
PMODEM:		DB	NO	;yes=PMMI S-100 Modem			103H
SMODEM:		DB	YES	;yes=HAYES Smartmodem, no=non-pmmi	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 MHz, 37=3.68 MHz, 40=4 MHz, etc.
				;Applicard values should not be multiplied
				;by 10 because of 6502 overhead
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
				;program when used. 
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
SETFL:		DB	YES	;yes=user-added Setup routine		10BH
SCRTST:		DB	YES 	;Cursor control routine 		10CH
		DB	0 	;was ACKNAK, now a spare	10DH
BAKFLG:		DB	YES	;yes=change any file same name to .BAK	10EH
CRCDFLT:	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 LOCNXT	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
EXTRA1:		DB	0	;for future expansion			11EH
EXTRA2:		DB	0	;for future expansion			11FH
BRKCHR:		DB	'B'-40H	;^B = 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
TRNCHR:		DB	'T'-40H ;^T = Transmit file to remote		125H
SAVCHR:		DB	'Y'-40H	;^Y = Open input text buffer		126H
EXTCHR:		DB	'W'-40H	;^W = Send next character		127H
		DS	2		;				128H
;
	IF	NOT APPLICARD
;
INCTL2:		LDA	MODCT2 ! RET	;in modem control port		12AH
		DS	6		;spares
OUTDATA:	STA	MODDAT ! RET	;out modem data port		134H
		DS	6
INPORT:		LDA	MODDAT ! RET	;in modem data port		13EH
		DS	6		;spares if needed
;
	ENDIF				;NOT APPLICARD
;
	IF	APPLICARD
;
INCTL2:		JMP	RD$MODCT2 					12AH
		DS	7
OUTDATA:	JMP	WR$MODDAT
		DS	7
INPORT:		JMP	RD$MODDAT
		DS	7
;
	ENDIF				;APPLICARD
;
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		;PMMI only calls		154H
;
LOGON:		DS	2		;not used by MEX  		160H
DIALV:		DS	3		;not used in this overlay	162H
DISCV:		JMP	MDINIT		;drops DTR to hang-up fast!
GOODBV:		JMP	GOODBYE		;called before exit to CPM	168H
INMODV:		JMP	INITMOD		;go to user written routine	16BH
NEWBDV:		JMP	PBAUD		;changes baud with phone #
NOPARV:		RET  !	NOP  !	NOP	;set modem for no-parity 	171H
PARITV:		RET  !	NOP  !	NOP	;set modem parity         	174H
SETUPV:		JMP	SETCMD		;				177H
SPMENV:		DS 	3		;not used by MEX		17AH
VERSNV:		JMP	SYSVER		;				17DH
BREAKV:		JMP	SENDBRK		;				180H
;
;
; Do not change the following six lines.
;
ILPRTV:		DS	3		;replace with MEX function 9 	183H
INBUFV:		DS	3		;replace with MEX functin 10	186H
ILCMPV:		DS	3		;replace with table lookup funct 247
INMDMV:		DS	3		;replace with MEX function 255	18CH
NXSCRV:		DS	3		;not supported by MEX		18FH
TIMERV:		DS	3		;replace with MEX function 254	192H
;
;
CLREOS:		LXI	D,EOSMSG	;				195H
		MVI	C,PRINT
		CALL	MEX
		RET			;				19DH
;
CLS:		LXI	D,CLSMSG	;				19EH
		MVI	C,PRINT
		CALL	MEX
		RET			;				1A6H
;----------------------------
;
;		*** END OF FIXED FORMAT AREA ***
;
;----------------------------
;
	IF	APPLICARD
RD$MODCT2:			;Read the modem control port
	PUSH 	D
	LXI	D,MODCT2
	CALL	PEEK
	POP	D
	RET
;
WR$MODCT2:			;Write the modem control port
	PUSH	D
	LXI	D,MODCT2
	CALL	POKE
	POP	D
	RET
;
RD$MODDAT:			;Read the modem data port
	PUSH	D
	LXI	D,MODDAT
	CALL	PEEK
	POP 	D
	RET
;
WR$MODDAT:			;Write the modem data port
	PUSH	D
	LXI	D,MODDAT
	CALL	POKE
	POP	D
	RET
;
RD$MODCTL2:			;read the baud rate port
	PUSH	D
	LXI	D,MODCTL2
	CALL	PEEK
	POP	D
	RET
;
WR$MODCTL2:			;Write the modem baud rate port
	PUSH	D
	LXI	D,MODCTL2
	CALL	POKE
	POP	D
	RET
;
WR$MODCMDP:			;write the control port 2
	PUSH D
	LXI D,MODCMDP
	CALL	POKE
	POP	D
	RET
;
PEEK:				;Peek at 1 byte in the apple
				;Entry  DE=address
				;Exit   A=data
	PUSH	B
	MVI	C,PEEK1BYTE
	CALL	WRBYTE
	CALL	WRWORD
	CALL	RDBYTE
	POP	B
	RET
;
POKE:				;Poke 1 byte into the apple
				;Entry DE=address
				;Exit  A=data
	PUSH	B
	MOV	B,A
	MVI	C,POKE1BYTE
	CALL	WRBYTE
	CALL	WRWORD
	MOV	C,B
	CALL	WRBYTE
	POP	B
	RET
;
	ENDIF		;APPLICARD
;
;..........
; You can add your own routine here to send a break tone to reset time-
; share computers, if desired.
;
	 IF NOT CPS
SENDBRK:	RET
	 ENDIF		;endif not CPS
;
	 IF CPS
SENDBRK:	MVI	A,80H	;open the command register
		STA	MODCT1	;by storing 80H in MODCT1
		MVI	A,3FH	;send a break by storing
		STA	MODCT2	;$3F in MODCT2
		XRA	A	;close the command register
		STA	MODCT1	;by storing 00H in MODCT1
		RET
	 ENDIF		;endif CPS
;
; You can add your own routine here to set DTR low and/or send a break
; tone to disconnect.
;
GOODBYE:			;just return for MEX to allow return
				;to system w/o dropping line
	RET
;
;.....
;
;
; The following address is used to set data bits, parity, stop bits
; and baud rate on the Super Serial Card.
;
	 IF SSC
;MODDLL:	EQU	 0E0ABH		;SSC ACIA control register
;
;
; Control over number of data bits, parity and number of stop
; bits (thru MSB300:) has not been implemented.  These must be
; set using the slide switches on the Super Serial Card.
;
; The following is used to initialize the Apple SSC on execution of the
; program.  Change it to initialize the modem port on your micro if you
; wish.  It initializes to 300 baud.
;
INITMOD:
	MVI	A,1		;default transfer time to 300
	STA	MSPEED
	LDA	MODDLL		;current baudrate from MODDLL
	ANI   0F0H		;zero the last 4 bits
;
INITMOD1:
	ORI   BDSET             ;get default baudrate (300)
	STA	MODDLL		;store default baudrate
	RET
	 ENDIF			;SSC
;.....
;
;
; The following may be used to initialize the Mountain Hardware CPS
; Multifunction Card for eight bits, no parity, one stop bit, and
; 1200 baud.  This does not alter the CPS defaults outside of MEX
;
	 IF CPS
INITMOD: 
	CALL	CARRCK		;check for carrier already present
	RZ			;if it is, don't do the rest!
	MVI	A,5
	CALL 	PBAUD
	MVI	A,1
	CALL	PBAUD
	CALL	MDINIT		;Initialize modem 
	MVI	A,5
	CALL 	PBAUD
	RET			;INITMOD return
;
INITMOD1:
	CALL	OPENCMD		;Open CPS command register
	MVI	A,37H		;initialize the serial chip
	STA	MODCT2		;by storing 37H in MODCT2
	MVI	A,4EH		;set 1 stop bit, no parity
	STA	MODDAT		;by storing $4E in MODDAT
	LDA     BDSET           ;set baud rate at BDSET  by storing
	STA	MODDAT		;in MODDAT (same address - the two 
				;registers cycle with each write)
	CALL    CLOSECMD	;Close CPS command register
	RET
;
;
OPENCMD:			;Open the CPS command register
	MVI	A,80H
	STA	MODCT1
	RET	
;
;
CLOSECMD:			;Close the CPS command register
	 MVI	A,0
	 STA	MODCT1
	 RET
;
;
MDINIT:				;Turns off DTR and re-initializes
	CALL	OPENCMD		;Open the cmd register
	MVI	A,CBASE		;Turn off DTR
	STA	MODCT2
	MVI	B,10		;Wait 1 second
	MVI     C,TIMER
	CALL	MEX
	MVI	A,CBASE+DTR+RTS ;Turn everything back on
	STA	MODCT2
	CALL	CLOSECMD	;Close the cmd register
	MVI	B,10		;Wait 1 second
	MVI	C,TIMER
	CALL	MEX
	LXI	H,SMATZ		;Send 'ATZ' to initialize modem
	CALL	SMSEND
	MVI	B,10		;Wait 1 more sec (sigh)
	MVI	C,TIMER
	CALL	MEX
	RET
;
SMATZ:	DB	'ATS7=20',CR,0
;....
;
; SMODEM UTILITY ROUTINE: SEND STRING TO MODEM
;
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
;
; carrier detect routine
;
CARRCK:
	LDA	MODCT2		;look at modem status port
	ANI	MDDSRB 		;mask for DSR-change if using DCD
	CPI	MDDSRR		;see if carrier is present (0=yes)
	RET
;
	ENDIF				;CPS
;
;.....
;
; The following routine initializes the Versacard to the default 
; baud rate which is set at MSPEED above. If MSPEED is set to something
; other then 300 or 1200 this routine does'nt alter The annunciator
; settings.
;
       	 IF VERSA 
INITMOD:LDA	MSPEED		;set annunciators to known state
	CPI	1		;is it 300 ?
	JZ	OK300
	CPI	5		;is it 1200 ?
	JZ	OK1200
	RET
	 ENDIF			;Versacard
;.....
;
	 IF NOT SSC AND NOT CPS AND NOT VERSA
INITMOD:RET			;intialization goes here, if needed
SETCMD:	RET			;routine to change baud rates, if needed
	 ENDIF			;NOT SSC AND NOT CPS
;.....
;
; Changes the modem baud rate with phone list entry
;.....
;
;
; Set baud-rate code in A (if supported by your modem overlay).  PMMI
; supports only five rates, which are validated here. NOTE: this routine
; (ie, the one vectored through NEWBDV) should update MSPEED with the
; passed code, but ONLY if that rate is supported by the hardware.
;
PBAUD:	PUSH	H		;don't alter anybody
	PUSH	D
	PUSH	B
	MOV	E,A		;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)
	
	JZ	PBEXIT		;exit if so
	STA	BDSET 		;good rate, set it
	CALL	INITMOD1	;Baud set subroutine
	STA	BAUDSV		;save it
	MOV	A,E		;get speed code back
	STA	MSPEED		;make it current
	JMP	PBEXIT + 1	;jump error flag set
PBEXIT:	STC			;set return error for STBAUD caller
	POP	B		;all done
	POP	D
	POP	H
	RET
;
; table of baud rate parameters for supported rates
;
	  IF	CPS	
BAUDTB:	DB	0,035h,0,0,0		;110,300,450,610,710
	DB	037h,0,0,0,0		;1200,2400,4800,9600,19200
BAUDSV: DB	037H			;1200 bps default
BDSET:	DB	037H
	  ENDIF ;CPS
;
	   IF 	SSC
BAUDTB:	DB	0,0006,0,0,0		;110,300,450,610,710
	DB	0007,0,0,0,0		;1200,2400,4800,9600,19200
BAUDSV: DB	0006			;300 bps default
BDSET:	DB	0006
	  ENDIF ;SSC
;
	   IF VERSA
BAUDTB:	DB	0,0E05EH,0,0,0		;110,300,450,610,710 (CLR AN#3)
	DB	0E05FH,0,0,0,0		;1200,2400,4800,9600,19200 (Set AN#3)
BAUDSV:	DB	0E05EH			;300 bps default
BDSET:	DB	0E05EH
	  ENDIF ;CPS
;
;
; Sign-on message
;
SYSVER:	LXI	D,VERMSG
	MVI	C,PRINT
	CALL	MEX
CARSHOW: LXI	D,NOMESG		;tell about carrier
	CALL	CARRCK			;check for it
	MVI	C,PRINT
	CNZ	MEX			;print the "NO" if no carrier
	LXI	D,CARMSG		;print "carrier present"
	MVI	C,PRINT
	CALL	MEX
	CALL	CRLF
	RET
;
;
NOMESG:	DB	'no $'
CARMSG:	DB	'carrier present','$'
;
; Newline on console
;
CRLF:	MVI	A,CR
	CALL	TYPE
	MVI	A,LF		;fall into TYPE
;
; type char in A on console
;
TYPE:	PUSH	H		;save 'em
	PUSH	D
	PUSH	B
	MOV	E,A		;align output character
	MVI	C,CONOUT	;print via MEX
	CALL	MEX
	POP	B
	POP	D
	POP	H
	RET
;
; Data area
;
ERRFLG:	DB	0		;connection error code
SPKST:	DB	YES		;default to speaker on
ANST:	DB	NO		;default to not answer
;
;------------------------------------------------------------
;
; The remainder of this overlay implements a very versatile
; SET command -- if you prefer not to write a SET for your
; modem, you may delete the code from here to the END statement.
;
;
; Control is passed here after MEX parses a SET command.
;
SETCMD:	CALL 	CARRCK		;first check for carrier
	JZ	CARRON		;if carrier, jmp to on msg and print
	MVI	C,SBLANK	;any arguments?
	CALL	MEX
	JC	SETSHO		;if not, go print out values
	LXI	D,CMDTBL	;parse command
	CALL	TSRCH		;from table
	PUSH	H		;any address on stack
	RNC			;if we have one, execute it
	POP	H		;nope, fix stack
SETERR:	LXI	D,SETEMS	;print error
	MVI	C,PRINT
	CALL	MEX
	RET
;
CARRON:	LXI	D,CONMSG	;print carrier on msg
	MVI	C,PRINT
	CALL	MEX
	RET
;
CONMSG:	DB	CR,LF,'Carrier on...can not set',CR,LF,'$'
SETEMS:	DB	CR,LF,'SET command error',CR,LF,'$'
;
; SET command table ... note that tables are constructed of command-
; name (terminated by high bit=1) followed by word-data-value returned
; in HL by MEX service processor LOOKUP.  Table must be terminated by
; a binary zero.
;
; Note that LOOKUP attempts to find the next item in the input stream
; in the table passed to it in HL ... if found, the table data item is
; returned in HL; if not found, LOOKUP returns carry set.
;
CMDTBL:	DB	'?'+80H			;"set ?"
	DW	STHELP
	DB	'BAU','D'+80H		;"set baud"
	DW	STBAUD
	DB	'SPK','R'+80H		;"set spkr"
	DW	STSPKR
	DB	'ANS','R'+80H		;"set ans(wer)"
	DW	STANSR
;
	DB	0		;<<=== table terminator
;
; SET <no-args>: print current statistics
;
SETSHO:	LXI	H,SHOTBL	;get table of SHOW subroutines
SETSLP:	MOV	E,M		;get table address
	INX	H
	MOV	D,M
	INX	H
	MOV	A,D		;end of table?
	ORA	E
	RZ			;exit if so
	PUSH	H		;save table pointer
	XCHG			;adrs to HL
	CALL	GOHL		;do it
	CALL	CRLF		;print newline
	MVI	C,CHEKCC	;check for console abort
	CALL	MEX
	POP	H		;it's done
	JNZ	SETSLP		;continue if no abort
	RET
;
GOHL:	PCHL
;
; table of SHOW subroutines
;
SHOTBL:	DW	CARSHOW
	DW	BDSHOW
	DW	SPKSHOW
	DW	ANSHOW
	DW	0		;<<== table terminator
;
; SET ?  processor
;
STHELP:	CALL 	CLS			;clear screen
	LXI	D,HLPMSG
	MVI	C,PRINT
	CALL	MEX
	RET
;
; The help message
;
HLPMSG:	DB	CR,LF,'SET Commands, Smartmodem version:',CR,LF
	DB	CR,LF,'SET BAUD 300 <or> 1200'
	DB	CR,LF,'SET SPKR ON <or> OFF'
	DB	CR,LF,'SET ANSR ON <or> OFF'
	DB	CR,LF,LF,'$'
;
; SET BAUD processor
;
STBAUD:	MVI	C,BDPARS	;function code
	CALL	MEX	
	JC	SETERR		;invalid code
	CALL	PBAUD		;try to set it
	JC	SETERR		;unsupported code
BDSHOW:	CALL	ILPRT		;display baud
	DB	'Baud rate:',TAB,' ',0
	LDA	MSPEED
	MVI	C,PRBAUD	;use MEX routine
	CALL	MEX
	RET
;
;............
;
;	SET SPEAKER  processor
;............
STSPKR:	LXI	D,SPKTBL		;look for valid input
	CALL 	TSRCH			
	JC	SETERR			;error if not valid
	MOV	A,L			;looks good, move it
	STA 	SPKST
	CPI	YES			;speaker on or off?
	JZ	SPKON			;wants it on-skip to speaker on
	LXI 	H,SPOFMSG		;wants it off-load msg and send
	CALL	SMSEND			;...to modem
	JMP	SPKSHOW			;show the reset on screen
SPKON:	LXI	H,SPONMSG		;wants it on-load msg and send
	CALL	SMSEND			;...to modem
SPKSHOW: CALL	ILPRT			;display status msg- on or off
	DB	'Speaker is:',TAB,' ',0
	LDA 	SPKST
	CPI 	YES
	JZ	SPSHON
	CALL	ILPRT
	DB	'Off',0
	RET
SPSHON: CALL 	ILPRT
	DB	'On',0
	RET
;
SPKTBL:	DB	'O','N'+80H		;command table for speaker on or off,
	DB	YES,0			;also used for Answer on or off
	DB	'OF','F'+80H
	DB	NO,0
	DB	0
;
SPONMSG: DB	'ATM1',CR,0		;smodem msg for speaker on
SPOFMSG: DB	'ATM0',CR,0		;smodem msg for speaker off
;
;..........
;
;   SET AUTO ANSWER processor
;.........
STANSR:	LXI	D,SPKTBL		;same table used for STSPKR & STANSR
	CALL 	TSRCH			;tests for on or off
	JC	SETERR
	MOV	A,L
	STA 	ANST
	CPI	YES
	JZ	ANSON
	LXI 	H,ANOFMSG
	CALL	SMSEND
	JMP	ANSHOW
ANSON:	LXI	H,ANONMSG
	CALL	SMSEND
ANSHOW: CALL	ILPRT
	DB	'Auto-answer is:',TAB,' ',0
	LDA 	ANST
	CPI 	YES
	JZ	ANSHON
	CALL	ILPRT
	DB	'Off',CR,LF,0
	RET
ANSHON: CALL 	ILPRT
	DB	'On',CR,LF,0
	RET
;
ANONMSG: DB	'ATS0=1',CR,0
ANOFMSG: DB	'ATS0=0',CR,0
;
;.........
; Compare next input-stream item in table @DE; CY=1
; if not found, else HL=matched data item
;
TSRCH:	MVI	C,LOOKUP	;get function code
	JMP	MEX		;pass to MEX processor
;
; Print in-line message ... blows away C register
;
ILPRT:	MVI	C,ILP		;get function code
	JMP	MEX		;go do it
;
;------------------------------------------------------------
;
EOSMSG:		DB	1BH,59H,0,0,'$'	;clear to end of screen message
;
CLSMSG:		DB	1BH,2AH,0,0,'$'	;clear screen message
;
VERMSG:		DB	CR,LF,LF,LF,TAB,TAB,TAB,'Version for Apple ][',CR,LF
		DB	TAB,TAB,TAB,'    with '
;
			IF VERSA
		DB	'Versacard'
			ENDIF
;
			IF SSC
		DB	'Super Serial Card'
			ENDIF
;
			IF COMCARD
		DB	'Comcard'
			ENDIF
;
			IF CPS
		DB	'CPS card',CR,LF
			ENDIF
;
			IF CCS OR SSM
		DB	'Serial card'
			ENDIF
;
		DB	TAB,TAB,TAB,'HAYES Smart modem',CR,LF
		DB	TAB,TAB,'Overlay V. ',REV/10+'0','.'
		DB	REV MOD 10+'0',':',' By Norman Beeler'
		DB	CR,LF,LF,'$'
;----------------------
; NOTE: MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
;
	END
