;
;	UPMMI.ASM ver 2.0 as of 4/27/80
;	   by Keith Petersen, W8SDZ
;
;This is the user area for BSTAM version 4.3 for use with
;a PMMI MM-103 modem.
;
;	IF YOU WISH TO USE OTHER REGISTERS SUCH AS HL,BC,DE
;	(NOT INCLUDING  SP  REGISTER)
;	BE SURE TO PUSH BSTAM'S REGISTERS ON TO STACK AND POP
;	THEM BACK OFF BEFORE RETURNING TO BSTAM.
;	THERE IS AMPLE ROOM TO PUSH ALL REGISTERS ONTO BSTAM'S
;	STACK, PLUS ROOM FOR 10 LEVELS OF CALL'S.
;
;	THERE ARE 300 BYTES OF USER SPACE AVAILABLE TO YOU.
;
;	THE JUMP'S CODED AT THE BEGINNING OF THIS PROGRAM
;	CANNOT BE MOVED IN ANY WAY.
;
;	DEFINE PORTS
;
PMCTL1	EQU	0C0H	;PMMI UART STATUS PORT
PMDATA	EQU	PMCTL1+1 ;PMMI UART DATA PORT
PMMDMS	EQU	PMCTL1+2 ;PMMI MODEM CHIP STATUS PORT
PMCTL2	EQU	PMCTL1+3 ;PMMI MODEM CHIP CONTROL PORT
;
;	CONDITIONAL ASSEMBLY SWITCH
;
FASTCLK	EQU	0	;0 = 2 MHZ, 1 = 4 MHZ SYSTEM CLOCK
;
;	DEFINE ASCII CHARACTERS USED
;
CR	EQU	0DH	;CARRIAGE RETURN
LF	EQU	0AH	;LINE FEED
;
BEGIN:	ORG	103H
;
INITIL	JMP	INITIU	;UART/USART INITIALIZATION ENTRY POINT
INSPORT	JMP	INSPRU	;STATUS PORT READ ENTRY POINT
ERRSET	JMP	ERRSTU	;UART/USART ERROR RESET ENTRY POINT
INPORT	JMP	INPRTU	;READ DATA PORT ENTRY POINT
OUTPORT	JMP	OUTPRU	;WRITE DATA PORT ENTRY POINT
;
;
;	THIS IS THE UART/USART INITIALIZATION ROUTINE.
;	TO BE COMPATIBLE WITH MOST BSTAM USERS USE FOLLOWING
;	INITIALIZATION GUIDE LINES:
;	1. USE 1 STOP BIT	(OPTIONAL - 2)
;	2. USE 8 DATA BITS	(MUST)
;	3. USE 1 START BIT	(MUST)
;	4. USE 16X FOR CLOCK RATE 	(MUST)
;	5. USE ASYNCHRONOUS MODE ONLY	(MUST)
;
;
INITIU:	CALL	SIGNON	;TELL USER WHAT'S IMPLEMENTED
	RET		;RETURN TO BSTAM
;
;
;	THIS IS THE STATUS READ PORT ROUTINE.
;	WHEN EXITING THIS ROUTINE BSTAM EXPECTS IN REGISTER A
;	THE FOLLOWING BITS TO BE SET IF NEEDED:
;	1. 20 BIT SET IF FRAMING ERROR
;	2. 10 BIT SET IF OVERRUN ERROR
;	3. 08 BIT SET IF PARITY  ERROR
;	4. 04 BIT SET IF TRANSMITTER EMPTY (TEOC)
;	5. 02 BIT SET IF RECEIVER READY (DAV)
;	6. 01 BIT SET IF TRANSMITTER READY (TBMT)
;	7. DO NOT SET THE 80 BIT OR 40 BIT
;
;	BEFORE WE DO THE UART STATUS CHECK WE WILL CHECK TO
;	SEE IF CARRIER IS LOST.
;
INSPRU:	PUSH	B	;SAVE REGISTERS USED
	PUSH	D
;
	IF	NOT FASTCLK ;FOR 2MHZ SYSTEM CLOCK
	MVI	B,15	;WAIT UP TO 15 SECONDS
	ENDIF
;
	IF	FASTCLK	;FOR 4MHZ SYSTEM CLOCK
	MVI	B,30	;WAIT UP TO 15 SECONDS
	ENDIF
;
;	1 SECOND TIME DELAY ROUTINE. ENTER WITH DESIRED NUMBER OF
;	SECONDS IN B REGISTER.
;
ONESEC:	LXI	D,50000 ;VALUE FOR 2 MHZ CLOCK
;
TLOOP:	IN	PMMDMS	;GET MODEM CHIP STATUS
	ANI	04H	;GET CTS (CARRIER DETECT) BIT
	JZ	CARROK	;CARRIER NOT LOST, EXIT AND RETURN
	DCR	E	;DECREMENT TIME DELAY VALUE
	JNZ	TLOOP	;NOT DONE, DO ANOTHER LOOP
	DCR	D	;DECREMENT TIME DELAY VALUE
	JNZ	TLOOP	;NOT DONE, DO ANOTHER LOOP
	DCR	B	;DECREMENT NUMBER OF SECONDS
	JNZ	ONESEC	;NOT DONE, DO ANOTHER ONE SEC DELAY
;
;	IF WE GET TO HERE, WE HAVE LOST CARRIER FOR 15 SECONDS
;
	POP	D	;RESTORE REGS
	POP	B
	XRA	A
	OUT	PMCTL1	;CAUSE MODEM TO...
	OUT	PMCTL2	;...HANG UP
	LXI	D,LSTMSG ;POINT TO MESSAGE
	MVI	C,9
	CALL	5	;PRINT IT
	JMP	0	;EXIT TO CP/M WARM BOOT
;
LSTMSG:	DB	CR,LF,'    ++CARRIER LOST++'
	DB	CR,LF,'The modem is now DISCONNECTED'
	DB	CR,LF,'$'
;
;	CARRIER IS NOT LOST
;
CARROK:	POP	D	;RESTORE DE REGS
	POP	B
;
;	NOW GET UART STATUS FOR BSTAM.
;	IN THIS CASE WE DISCARD ALL ERROR TEST BITS BECAUSE
;	THE PMMI MODEM HAS NO WAY TO RESET THE ERROR FLAGS
;	ONCE THEY ARE UP, CAUSING A CONTINUOUS DISPLAY OF
;	ERROR MESSAGES IN BSTAM.
;
	IN	PMCTL1	;GET PMMI UART STATUS
	ANI	07H	;STRIP ALL BUT TEOC, DAV AND TBMT BITS
	RET
;
;	THIS IS THE ERROR RESET FOR UART/USART ROUTINE.
;	THE PMMI MODEM HAS NO WAY TO RESET THE ERROR FLAGS,
;	SO WE JUST DO A RETURN.
;
ERRSTU:	RET		;RETURN TO BSTAM
;
;
;	THIS IS THE READ DATA PORT ROUTINE.
;	BEFORE THIS ROUTINE IS ENTERED THE 02 BIT OF
;	STATUS READ ROUTINE MUST HAVE BEEN SET.
;	DO NOT CLEAR THE 80 BIT FROM THE DATA INPUT PORT.
;	RETURN WITH REGISTER A LOADED WITH INPUT DATA.
;
INPRTU:	IN	PMDATA	;GET DATA FROM PORT
	RET		;RETURN TO BSTAM
;
;
;	THIS IS THE WRITE DATA PORT ROUTINE.
;	BEFORE THIS ROUTINE IS ENTERED THE 04 BIT AND 01 BIT
;	OF STATUS READ MUST BE SET.
;	DO NOT CLEAR THE 80 BIT FROM THE DATA OUTPUT PORT.
;	REGISTER A CONTAINS THE OUTPUT DATA.
;
OUTPRU:	OUT	PMDATA	;SEND DATA TO REMOTE CPU
	RET		;RETURN TO BSTAM
;
SIGNON:	PUSH	B
	PUSH	D
	PUSH	H
	LXI	D,MESSGE
	MVI	C,9
	CALL	5		;ANNOUNCE VERSION TO USER
	POP	H
	POP	D
	POP	B
	RET
;
MESSGE:	DB	CR,LF,CR,LF
	DB	'PMMI Modem ver 2.0 - no initialization done,'
	DB	CR,LF,'tests for loss of carrier.'
	DB	CR,LF,'$'
;
	END	BEGIN

