;
;			  MCOSB797.ASM
;
;	Patches for overlaying distribution version of MODEM797,
;		for use with the Osborne O-1.
;
;You will want to look this file over carefully, there are a number
;of options that you can use to configure MODEM797 to suit your taste.
;
;
;	TO USE: First edit this file filling in answers for your own
;		equipment.  Then assemble with ASM.COM or equivalent
;		assembler.  Then use DDT to overlay the the results
;		of this program to the original MODEM797.COM file:
;
;		A>DDT MODEM797.COM
;		DDT VERS 2.2
;		NEXT  PC
;		4080 0100
;		-IMCOSB797.HEX		(note the "I" command)
;		-R			(loads in the .HEX file)
;		NEXT  PC
;		4080 0000
;		-G0			(return to CP/M)
;		A>SAVE 64 MODEM797.COM  (now have modified .COM file)
;
;
;12/17/82 - Revised for MODEM796				PLK
;
;12/01/82 - The file is left in the 11/29/82 form as an example of
;	    memory mapped I/O. Osborne owners may want to use the
;	    approach Frank Wancho describes.			PLK
;
;11/30/82 - This file stills uses an old-style and now obsolete form of
;	    accessing the RS232 port directly thru the bank-switching
;	    technique with code in memory above 4000H, all OSBORNEs
;	    should have now been upgraded to at least ROM 1.2, if not
;           1.3 - the latest version. Combined with that upgrade is a
;           new BIOS that supports the IOBYTE. All that has to be done
;	    is toggle the first of the two CON: bits in the IOBYTE
;	    as follows:
;
;	        0 - keyboard + crt (TTY:)
;	        1 - serial port (CRT:)
;								F. J. Wancho
;
;11/29/82 - Version of MODEM797 overlay file for Osborne-1. The
;	    Osborne routines come from an earlier version.	P. L. Kelley
;
TRUE	EQU	0FFH
FALSE	EQU	0
;
BELL	EQU	07H	;bell
CR	EQU	0DH	;carriage return
LF	EQU	0AH	;linefeed
;
MODCTLP	EQU	2A00H		;status register for RS232
MODSNDB	EQU	2		;bit to test for ready to send
MODSNDR	EQU	MODSNDB		;change to 0 if bit is 0 when
				;ready to send
MODRCVB	EQU	1		;bit to test for received data
MODRCVR	EQU	MODRCVB		;change to 0 if bit is 0 when
				;data received
MODDATP	EQU	MODCTLP+1	;data resister for RS232
;
CLR1	EQU	0		;there is no O-1 clear to end
CLR2	EQU	0		;of screen sequence
CLR3	EQU	0		;so all bytes MUST be 0
CLR4	EQU	0
;
SCLR1	EQU	'Z'-40H		;ctrl-Z for O-1 clear screen
SCLR2	EQU	0		;and home cursor
SCLR3	EQU	0		;the unused bytes MUST be 0
SCLR4	EQU	0
;
;
;You can change locations 107H to 120H to suit your taste.
;
;*** WARNING - DO NOT INSERT OR DELETE LINES BEFORE SYSVERMSG: ***
;      THE DEFINED LOCATIONS ARE GIVEN ON THE RIGHT MARGIN.
;
;
		ORG	100H
;
		DS	3	;(for  JMP  START)
PMMIBYTE:	DB	FALSE	;don't change this line			103H
SETUPTST:	DB	TRUE	;don't change this line			104H
SCRNTEST:	DB	TRUE	;don't change this line			105H
CLOCK:		DB	2	;don't change this line			106H
BAKUPBYTE:	DB	FALSE	;true=make .BAK file			107H
CKSUMDFLT:	DB	FALSE	;true=default to Checksum checking	108H
				;false=default to CRC checking
TOGGLECRC:	DB	TRUE	;true=allow toggling of Checksum to CRC	109H
CONVBKSP:	DB	FALSE	;true=convert backspace to rub		10AH
TOGGLEBK:	DB	TRUE	;true=allow toggling of bksp to rub	10BH
ADDLF:		DB	FALSE	;true=add LF after CR			10CH
TOGGLELF:	DB	TRUE	;true=allow toggling of LF after CR	10DH
TRANLOGON:	DB	FALSE	;true=allow transmission of logon	10EH
				;write logon sequence at location LOGON
SAVCCP:		DB	FALSE	;true=do not overwrite CCP		10FH
LOCONEXTCHR:	DB	FALSE	;true=local command if EXTCHR precedes	110H
				;false=not local command if EXTCHR precedes
TOGGLELOC:	DB	TRUE	;true=allow toggling of LOCONEXTCHR	111H
LSTTST:		DB	TRUE	;true=allow toggling of printer on/off	112H
				;in terminal mode, set to false if your
				;printer can't keep up with the modem
XOFFTST:	DB	FALSE	;true=allow testing of XOFF from remote 113H
				;while transmitting a file in terminal mode
XONWAIT:	DB	FALSE	;true=wait for XON after sending CR	114H
				;while transmitting a file in terminal mode
TOGXOFF:	DB	TRUE	;true=allow toggling of XOFF testing	115H
MSPEED:		DB	1	;0=110 1=300 2=450 3=600 4=710 5=1200   116H
				;default modem speed, PMMI routines
				;reset this value and so should your own
				;modem routines
BYTDLY:		DB	0	;0=0 delay, 1=0.02 sec, -- ,9=0.18 sec  117H
				;default time to send character in
				;terminal mode file transfer
CRDLY:		DB	0	;0=0 delay, 1=0.08 sec, -- ,9=0.72 sec	118H
				;default time for extra wait after CR
				;in terminal mode file transfer
BELRPT:		DB	30	;bell repeat time = value*0.03 sec	119H
EXITCHR:	DB	'E'-40H	; ^E = Exit without disconnect		11AH
LOGCHR:		DB	'O'-40H	; ^O = Send logon			11BH
LSTCHR:		DB	'P'-40H	; ^P = Toggle printer			11CH
UNSAVE:		DB	'R'-40H	; ^R = Close input text buffer		11DH
TRANCHR:	DB	'T'-40H ; ^T = Transmit file to remote		11EH
SAVECHR:	DB	'Y'-40H	; ^Y = Open input text buffer		11FH
EXTCHR:		DB	'W'-40H	; ^W = Send next character		120H
		DS	6	;don't change, used only by PMMI	121H
IN$MODCTLP:	JMP	MXSTAT		;test for status		127H
OUT$MODDATP:	JMP	MXOUT		;output data to modem		12AH
IN$MODDATP:	JMP	MXIN		;get data from modem		12DH
ANI$MODSNDB:	ANI	MODSNDB ! RET	;bit to test for send ready	130H
CPI$MODSNDR:	CPI	MODSNDR ! RET	;value of send bit when ready	133H
ANI$MODRCVB:	ANI	MODRCVB ! RET	;bit to test for receive ready	136H
CPI$MODRCVR:	CPI	MODRCVR ! RET	;value of rcv. bit when ready	139H
		DS	15		;PMMI only calls		13CH
LOGONPTR:	DW	LOGON		;				14BH
JMP$INITMOD:	JMP	MXINIT		;go to user written routine	14DH
JMP$SETUPR:	JMP	MXSETBAUD	;				150H
;
CLREOS:		CALL	JMP$ILPRT	;				153H
		DB	CLR1,CLR2,CLR3,CLR4,0
		RET
;
CLRSCRN:	CALL	JMP$ILPRT	;				15CH
		DB	SCLR1,SCLR2,SCLR3,SCLR4,0
		RET
;
JMP$ILPRT:	DS	3	;					165H
JMP$ILCOMP:	DS	3	;					168H
JMP$INBUFF:	DS	3	;					16BH
JMP$SYSVER:	JMP	SYSVERMSG;					16EH
JMP$DIALPL:	DS	3	;					171H
JMP$DISCONNT:	DS	3	;					174H
;
SYSVERMSG:			;					16EH
	CALL	JMP$ILPRT
	DB	'Version for: OSBORNE O-1',CR,LF,0
	RET

;INSERT YOUR LOGON HERE, MUST END IN 0.
LOGON:	DB	0
;
MXIN:	CALL	$-$	;patched to call input routine
	RET
;
MXOUT:	CALL	$-$	;patched to call output routine
	RET
;
MXSTAT:
	CALL	$-$	;patched to call status routine
	RET
;
MXINIT:
	LDA	FINITFLG
	ORA	A
	RZ
	CMA
	STA	FINITFLG
	LHLD	6	;find top of user RAM
	LXI	D,-100H	;step down a little
	DAD	D
	PUSH	H	;save it
	LXI	D,BDJ	;point to source of code
	LXI	B,CDLEN+2	;set length of code
	XCHG
	DB	0EDH,0B0H ; Z80 LDIR
;
	LHLD	6	;get BDOS address back
	POP	D
	PUSH	D
	INX	D	;point to address position
	XCHG
	MOV	M,E	;patch in address
	INX	H
	MOV	M,D
;
	POP	H
	SHLD	6	;transfer BDOS jump
;
	LXI	D,OSIN-BDJ
	DAD	D	;compute address of OSIN routine
	SHLD	MXIN+1	;patch call
	LXI	D,OSOUT-OSIN
	DAD	D
	SHLD	MXOUT+1	;patch call
	LXI	D,OSTAT-OSOUT
	DAD	D
	SHLD	MXSTAT+1
;
	MVI	A,1		;MSPEED 300 baud value
	STA	MSPEED
	MVI	C,56H		;for 300 baud
STBAUD:	PUSH	H
	CALL	OSET
	POP	H
	XRA	A	;clear carry
	RET
;
OSET:	LHLD	1	;get BIOS+3 address
	MVI	L,3CH	;special Osborne routine
	PCHL		;branch to it
;
MXSETBAUD:
	PUSH	H
AGAIN:	LXI	D,BAUDBUF	;point to input buffer for ILCOMP
	CALL	JMP$ILPRT
	DB	'Input Baud Rate (300, 1200): ',0
	CALL	JMP$INBUFF
	LXI	D,BAUDBUF+2
	CALL	JMP$ILCOMP	;compare BAUDBUF+2 with characters below
	DB	'300',0
	MVI	A,1		;MSPEED 300 baud
	MVI	C,56H		;O-1 300 baud
	JNC	OK		;go if got match
	CALL	JMP$ILCOMP
	DB	'1200',0
	MVI	A,5
	MVI	C,55H
	JNC	OK
	CALL	JMP$ILPRT	;all matches failed - tell operator
	DB	'++ Incorrect entry ++',CR,LF,BELL,0
	JMP	AGAIN		;try again
;
OK:	STA	MSPEED		;set MSPEED
	POP	H
	JMP	STBAUD
;
BAUDBUF:	DB	10,0
		DS	10
;
FINITFLG:	DB	TRUE
;
;
; --- ROUTINES THAT GET COPIED UP TO TOP OF MEMORY ---
;		JUST UNDER THE BDOS
;
BDJ:	JMP	$-$	;this gets patched to jump to BDOS entry
;
OSIN:	DI		;disable interrupts
	OUT	0	;switch to alternate page
	LDA	MODDATP	;get data byte
	OUT	1	;switch back pages
	EI		;re-enable interrupts
	RET
;
OSOUT:	DI		;disable interrupts
	OUT	0	;switch to alternate page
	STA	MODDATP	;send data byte
	OUT	1	;switch back pages
	EI		;re-enable interrupts
	RET
;
OSTAT:	DI		;disable interrupts
	OUT	0	;switch to alternate page
	LDA	MODCTLP	;get status byte
	OUT	1	;switch back pages
	EI		;re-enable interrupts
	RET
CDLEN:	EQU	$-BDJ	;length of code to copy
;
;
	END
;