; MXO-IN13.ASM -- INTEL 8251 I/O mapped overlay for MEX10-12. 12/31/84
;
; 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 Intel 8251 I/O chip.
; Much of the information contained here is not in the main file.
;
; Edit this file for your preferences then follow the "TO USE:" example
; shown below.
;
; Use the MEX "SET" command to change the baudrate when desired.  When
; the program is first called up the baud rate is set to 300.  The
; initial baud rate can be changed by setting to the desired baud rate
; and "CLONEing".
;
; The baud rate switch for the modem port must be set to 1200 baud, even
; if the port will only be used at 300 baud.
;
; 	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.
;
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
; 12/31/84 - Adapted for Intel 8251 from	- David Miles
; 	     MXO-HZ13				
; 05/22/84 - Rewritten for MEX10		- Biff Bueffel
; 07/27/83 - Renamed to work with MDM712	- Irv Hoff
; 07/01/83 - Revised to work with MDM711	- Irv Hoff
; 06/22/83 - Revised to work with MDM710	- Irv Hoff
; 05/27/83 - Revised to work with MDM709	- Irv Hoff
; 05/15/83 - Revised to work with MDM708	- Irv Hoff
; 04/11/83 - Updated to work with MDM707	- Irv Hoff
; 04/04/83 - Updated to work with MDM706	- Irv Hoff
; 02/27/83 - Updated to work with MDM705	- Irv Hoff
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; 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 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
;
PRINT	EQU	9		; MEX/BDOS print-string function call
;
BELL	EQU	07H		; bell
CR	EQU	0DH		; carriage return
ESC	EQU	1BH		; escape
LF	EQU	0AH		; linefeed
;
YES	EQU	0FFH
NO	EQU	0
;
;
MODDATP	EQU	12H		; data port for 8251
MODCTL1	EQU	MODDATP+1	; status port for 8251
MODRCVB	EQU	2		; bit to test for received data
MODRCVR	EQU	2		; modem receive ready
MODSNDB	EQU	1		; bit to test for ready to send
MODSNDR	EQU	1		; modem send ready bit
;
		ORG	100H
;
		DS	3	; (for  "JMP   START" instruction)
;
PMMIMODEM:  	DB	NO	; yes=PMMI S-100 Modem			103H
SMARTMODEM: 	DB	NO	; yes=HAYES Smartmodem, no=non-Hayes	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	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
NOOFCOL:    	DB	5	; number of DIR columns shown		10AH
SETUPTST:   	DB	YES	; yes=user-added Setup routine		10BH
SCRNTEST:   	DB	YES	; Cursor control routine		10CH
ACKNAK:		DB	YES	; yes=resend a record after any non-ACK	10DH
				; no=resend a record after a valid NAK
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	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)
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	YES	; yes=do not overwrite CCP		116H
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
BRKCHR:		DB	'@'-40H	; ^@ = Send a 300 ms. break tone		120H
NOCONNCT:   	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
TRANCHR:    	DB	'T'-40H ; ^T = Transmit file to remote		125H
SAVECHR:    	DB	'Y'-40H	; ^Y = Open input text buffer		125H
EXTCHR:		DB	'^'-40H	; ^^ = Send next character		126H
;
		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 rec ready
CPI$MODRCVR:	CPI     MODRCVR ! RET   ; value when ready
ANI$MODSNDB:	ANI     MODSNDB ! RET   ; bit to test snd ready
CPI$MODSNDR:	CPI     MODSNDR ! RET   ; value when ready
		DS	12
;
		DS	2		; for user message.		160H
		DS	6		; 				162H
JMP$GOODBYE:	JMP	GOODBYE		; 				168H
JMP$INITMOD:	JMP	INITMOD		; go to user written routine	16BH
JMP$NEWBAUD	JMP	NEWBAUD		; Reset baudrate			16EH
		RET  !	NOP  !	NOP	; (by-passes PMMI routine)	171H
		RET  !	NOP  !	NOP	; (by-passes PMMI routine)	174H
JMP$SETUPR:	JMP	SETUPR		; 				177H
		DS	3		; 				17AH
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
; .....
;
;
CLREOS:	 LXI	D,EOSMSG
	 MVI	C,PRINT
	 CALL	MEX
	 RET
;
CLRSCRN: LXI	D,CLSMSG
	 MVI	C,PRINT
	 CALL	MEX
	 RET
;
EOSMSG:	 DB	'$'
CLSMSG:	 DB	'$'
;.....
;
;
SYSVER:	MVI	C,ILP
	CALL	MEX
	DB	'Version for 8251 I/O port'
	DB	CR,LF,0
	RET
; .....
;
;
; This routine allows a 300 ms. break tone to be send to reset some
; time-share computers.
;
SENDBRK: RET
; .....
;
;
; This routine sends a 300 ms. break tone and sets DTR low for the same
; length of time to disconnect some modems such as the Bell 212A, etc.
;
GOODBYE: RET
; .....
;
;
; The following is used in setting up the 8251 I/O port.
;
INITMOD: LDA	MSPEED		; initialize port using old rate code
;
NEWBAUD: CPI	1		; 300 baud code?
	 LXI	H,CTL300	; load pointer to 300 baud ctl byte
	 JZ	SETBAUD		; do it to it.
	 CPI	5		; check for 1200 baud
	 LXI	H,CTL1200
	 RNZ			; return now if none of above
;
SETBAUD: STA	MSPEED		; save new baud rate
	 MVI	A,0AAH		; dummy command
	 OUT	MODCTL1		; send to port to get attention
	 NOP !	NOP		; wait for slow ports
	 MVI	A,40H		; reset command
	 OUT	MODCTL1
	 NOP !	NOP
	 MOV	A,M		; get command byte
	 OUT	MODCTL1
	 NOP !	NOP
	 MVI	A,37H		; reset RTS, ERR, DTR. enable XMT and REC
	 OUT	MODCTL1
	 NOP !	NOP
	 IN	MODDATP		; wake up port
;
TELL:	 MVI	C,ILP
	 CALL	MEX		; Print current baud rate
	 DB	CR,LF,'Baud rate is now: ',0
	 LDA	MSPEED
	 MVI	C,PRBAUD
	 CALL	MEX
	 MVI	C,ILP
	 CALL	MEX
	 DB	CR,LF,0
	 XRA	A
	 RET
;
; The following changes the baud rate with the SET command.
;
SETUPR:	 MVI	C,SBLANK	; Any arguments?
	 CALL	MEX
	 JC	TELL		; If not, go display baud
	 LXI	D,CMDTBL
	 MVI	C,LOOKUP
	 CALL	MEX		; Parse argument
	 MOV	A,L		; put baud code in accum
	 JNC	NEWBAUD		; set baud if argument good
	 MVI	C,ILP		; Tell user input not valid
	 CALL	MEX
	 DB	CR,LF,'Only 300 and 1200 allowed on SET command',CR,LF,0
	 RET
;
CMDTBL:	 DB	'30','0'+80H
	 DW	0001		; 300 baud code
	 DB	'120','0'+80H
	 DW	0005		; 1200 baud code
	 DB	0
;
; TABLE OF BAUDRATE PARAMETERS FOR 8251
;
CTL300:	 DB	0CFH		; control byte for 300 baud
CTL1200: DB	0CEH		; control byte for 1200 baud
;
BAUDBUF: DB	10,0
	 DS	10
;.....
;
;
; NOTE:  MUST TERMINATE PRIOR TO 0B00H (with Smartmodem)
;
	 END
;
