; NOTE:  This overlay is VERY dependent on version of the MODM7xx
;	that it is running with.  As of 5 Nov 84, it is configured
;	for MODM700.COM as distributed.  Be careful if configuring
;	for different versions of MODM7xx.
;	You should be able to configure it for your system just
;	by modifying the two routines SETDTRH and SETDTRL.  They
;	are USART-specific.  Then just overlay this file AFTER
;	overlaying your normal configure file.  Make sure that
;	your normal configure file doesn't go past 3FFH since this
;	one starts at 400H.
;
; MO700RV.ASM  Racal-Vadic VA212PA overlay for MODM700
;
; The Racal-Vadic VA212PA modem is configured as follows
;
;	    1*2  STANDART OPTN	 2*1  ASYNCH/SYNCH
;	    3*2  DATA RATE SEL	 4*1  103 OPERATION
;	    5*3  CHARACTER LEN	 6*1  ORIG/ANS MODE
;	    7*2  SLAVE CLOCK	 8*2  DTR CONTROL
;	    9*2  ATT/UNATT DISC  10*1 LOSS CXR DISC
;	    11*2 REC SPACE DISC  12*2 SEND SPACE DIS
;	    13*1 ABORT DISC	 14*1 REMOT TST RESP
;	    15*4 DSR CONTROL	 16*2 CXR CONTROL
;	    17*1 AUTO LINKING	 18*3 ALB CONTROL
;	    19*6 AUTO ANSWER	 20*1 TERMINAL BELL
;	    21*1 LOCAL COPY	 22*3 DIAL MODE
;	    23*2 BLIND DIAL	 24*1 CALL PROGRESS
;	    25*2 FAIL CALL SEL	 26*9 AUTO REDIAL
;
; #, K, and * may be used in the phone number command line,
; CAL #8K9Kxxx-xxx-xxxx (up to 31 digits).
;
; Initialization routines need to be changed to support your I/O devices
; are: SETDTRH and SETDTRL - Examples for USART
; initialization may be found in BYE2-16.LBR.  The modem is disconnected
; from on-line by dropping the DTR line, this must be implemented in the
; SETDTRL: routine in accordance with your I/O devices.  The modem is
; enabled by setting DTR high and must be implemented in your SETDTRH:
; routine.
;
;	To install the overlay make your changes for the USART
;	dependent routines.  This overlay may directly be used
;	if your system uses the Intel 8251 USART.
;
;	A>DDT MODM700.COM	<== Start with MODM700.COM (or .OBJ)
;	DDT VERS 2.2
;	NEXT   PC
;	4A00  0100
;	-IM7xx-1.HEX
;	-R			<== Read in your normal MDM7xx overlay
;	-IMO700RV.HEX
;	-R			<== Read in this to add PA212 support
;	NEXT   PC
;	4A00  0000
;	-G0
;
;	A>SAVE 73 MODM700.COM
;
; K, # and * are valid characters for the Racal (#8K9Kxxx-xxxx) and may
; be included in the phone number.  #8 is used by some PBX systems to
; have a clear phone line with no call waiting signals. INSURE ALL NAMES
; IN THE PHONE NUMBER LIBRARY HAVE LOWER CASE "k" and phone numbers upper
; case "K" if needed.
;
;***********************************************************************
;
; 11/5/84  - Adjusted for MODM700  -  mabry
; 3/28/84  - Adjusted equates for MDM730  -  mabry
; 3/16/84  - Adjusted equates for MDM728  -  mabry
; 3/5/84   - Adjusted equates for MDM727  -  mabry
; 2/18/84  - Adjusted equates for MDM724  -  mabry
; 2/16/84  - Adjusted equates for MDM723 and modified DIAL routine so
;	it can handle the new 36 number phone number library. - mabry
; 1/5/84   - Set up equates at end for MDM716 and removed all hardware-
;	specific routines (except SETDTRH and SETDTRL) so that
;	this file can be used with most other systems assuming
;	there is an overlay for those systems already. - mabry
; 11/11/83 - Renamed to M7RV-1.ASM, no changes	- Irv Hoff
; 10/15/83 - First version for Racal-Vadic	- Fred Willink
;
;***********************************************************************
;
YES:		EQU	0FFH
NO:		EQU	0
;
CANCEL:		EQU	'X'-40H	;^X = Cancel
ESC:		EQU	'['-40H	;^[ = escape
BELL:		EQU	'G'-40H	;^G = bell character
LF:		EQU	'J'-40H	;^J = linefeed
CR:		EQU	'M'-40H	;^M = carriage RETRN
PRINT:		EQU	9
BDOS:		EQU	0005H
;
LIBLEN:		EQU	34	; Length of each phone number
;
;=======================================================================
;
		ORG	0100H
;
;
		DS	3	; Skip JMP START
;
PMMIMODEM:	DB	NO
SMARTMODEM:	DB	YES	; yes=Racal-Vadic VA122PA the main
				; program test this byte to use the
				; new routines
		DS	1
CLOCK:		DS	1	;clock speed x10, up to 25.5 mhz.
				;2 MHz=20, 3.68 MH=37, 4 MHz=40, etc.
MSPEED:		DS	1	;sets display time for sending a file
				;0=110	1=300  2=450  3=600  4=710
				;5=1200 6=2400 7=4800 8=9600 9=19200
		DS	3
SETUPTST:	DS	1	;yes=non-PMMI setup routine
SCRNTEST:	DS	1	;yes=home cursor and clear screen
		DS	29
;
;
; Handles in/out ports for data and status
;
IN$MODCTL1:	DS	10		;in modem control port
OUT$MODDATP:	DS	10		;out modem data port
IN$MODDATP:	DS	10		;in modem data port
ANI$MODRCVB:	DS	3		;bit to test for receive ready
CPI$MODRCVR:	DS	3		;value of receive bit when ready
ANI$MODSNDB:	DS	3		;bit to test for send ready
CPI$MODSNDR:	DS	3		;value of send bit when ready
;
IN$BAUDRP:	DS	3		 ;in baudrate port
OUT$BAUDRP:	DS	3		 ;out baudrate port
OUT$MODCTL1:	DS	3		 ;out modem control port #1
OUT$MODCTL2:	DS	3		 ;out modem control port #2
;
LOGONPTR:	DS	2
JMP$DIAL:	JMP	DIAL		; \
JMP$DISCONNT:	JMP	DISCONNT	;  > We change these vectors
JMP$GOODBYE:	JMP	GOODBYE		; /
JMP$INITMOD:	DS	3
JMP$NEWBAUD:	RET			; Defeat this one...
		DS	2
JMP$NOPARITY:	RET			;  ...and this one...
		DS	2
JMP$PARITY:	RET			;  ...and this one...
		DS	2
JMP$SETUPR:	DS	3
JMP$SPCLMENU:	RET			;  ...and this one.
		DS	2
JMP$SYSVER:	DS	3
JMP$BREAK:	DS	3
;
JMP$ILPRT:	DS	3
JMP$INBUF:	DS	3
JMP$INLNCOMP:	DS	3
JMP$INMODEM:	DS	3
JMP$NXTSCRN:	DS	3
JMP$TIMER:	DS	3
;
;.....

; After all the absolute locations above will generally be the user's
;  hardware-specific subroutines.  We allow up to 3FFH for those and
;  then start some routines of our own that support the Racal-Vadic PA212
;  modem.  If the user's routines need more room, this might be able to
;  start a little lower, but just a few bytes probably.

	ORG	400H
;
; NOTE: You will have to change these next two routines if you don't
;	have an 8251A for your USART.
;
ENABL	EQU	37H
DTR	EQU	2
;
; Raise DTR to enable modem
;
SETDTRH:  MVI	A,enabl
	  JMP	OUT$MODCTL1
;.....
;
;
; Drop DTR to disable modem
;
SETDTRL:  MVI	A,enabl-dtr
	  JMP	OUT$MODCTL1
	  RET
;.....
;
;		    End of USART dependent routines
;=======================================================================
;
;		     RACAL-VADIC DIALING ROUTINES
;
;=======================================================================
;
; Dialing routine
;
DIAL:	  XRA	A		; Zero out some flags
	  STA	CRFLAG
	  STA	RNGBKFL
	  STA	RINGFLG
	  STA	DOT		; Indicates dot encountered in library
	  LXI	H,0
	  SHLD	DIALCT
	  LXI	H,CMDBUF+1	; Point to character count of user
	  MOV	A,M		;  input to prompt
	  CPI	3+1		; More than 3 letters input ?
	  JC	DIAL1		; No, then go display library of #'s
;
;
; If there were only 3 characters, then "CAL<RET>" was typed -- the user
; obviously expecting to get a phone number (or letter) from the library
; file.  If 4 or more, a number (or letter) was typed in from the menu
; command line, so move the characters down 4 to compensate.  Needed for
; auto-redialing of menu command line entries.
;
	  MOV	C,A
	  MVI	B,0
	  SUI	4		; Adjust count down by 4
	  MOV	M,A		; Store back in CMDBUF+1
	  INX	H		; Point to CMDBUF+2
	  XCHG
	  LXI	H,CMDBUF+6
	  CALL	MOVER		; Move buffer down by 4
	  JMP	DIAL4
;...
;
;
; Comes here if no phone number was manually entered after "CAL" and if
; no phone library letter was entered.	Displays the phone number li-
; brary, then asks for an entry.
;
DIAL1:	  MVI	C,18		; Lines of phone numbers to display
	  LXI	H,NUMBLIB
	  LXI	D,BUFFER
	  CALL	NEWLINE
	  STAX	D
	  INX	D
;
DIAL2:	  MVI	B,LIBLEN
	  CALL	MOVE
	  CALL	SPACES
	  MVI	B,LIBLEN
	  CALL	MOVE
	  CALL	NEWLINE
	  DCR	C
	  JNZ	DIAL2
;
DIAL3:	  MVI	A,'$'
	  STAX	D
	  CALL	CLRTST		;clear screen
	  MVI	C,PRINT
	  LXI	D,BUFFER	;show library
	  CALL	BDOS
	  CALL	JMP$ILPRT
	  DB	CR,LF,'Enter library letter or phone number,',CR,LF
	  DB	'CTL-X quits while dialing or ringing: ',0
	  LXI	D,CMDBUF
	  CALL	INBUF		;get input, library letter or phone #
;
;
; You now have either a library letter or a manually entered phone num-
; ber.	These either came from the menu command line or from the library
; command line.  Next we see if a letter, if so, get the corresponding
; line with phone number from the library.  If a number we ignore the
; library look-up.  (Ringback numbers must end with letter 'R'.)
;
DIAL4:	  LXI	H,CMDBUF+1
	  MOV	A,M		; Get character count
	  ORA	A		; No entry ?
	  JZ	DIALEXIT	;  then exit
	  PUSH	H
	  CALL	DISCONNT	;disconnect the modem and place in idle
	  POP	H
	  MOV	A,M		; Get count again
	  CPI	1		; One character (ie. get phone number
	  JZ	DIAL4A		;  from library) ?
	  MVI	A,YES		; Set dot flag so that we don't skip
	  STA	DOT		;  anything user types in
	  JMP	DIAL9
DIAL4A:
	  INX	H		; Point to user entry
	  MVI	B,'A'		; Need to compare against A-Z
	  MVI	E,0
	  MVI	C,'Z'-'A'+1	; How many to check
	  MOV	A,M		; Get user input character
;
DIAL5:	  CMP	B		; Compare against letter (A-Z)
	  JZ	DIAL6		; Got match
	  INR	B		; Next letter
	  INR	E		; Keep count
	  DCR	C
	  JNZ	DIAL5		; Loop for all letters
; Checked all letters, now do numbers 0-9
	  MVI	B,'0'		; Start at 0
	  MVI	C,'9'-'0'+1	; How many to check
DIAL5A:
	  CMP	B		; Compare against number
	  JZ	DIAL6		; Got match
	  INR	B		; Next number
	  INR	E		; Keep counter
	  DCR	C
	  JNZ	DIAL5A		; Loop for all numbers (0-9)
	  JMP	DIAL9		; This should only happen with illegal
				;  entries.
;
;
; Now have a match between the requested letter and one in the library
; E-reg. holds the decimal equivalent (0-25) of the letter (A-Z) or
; (26-35) of the number (0-9).
;
DIAL6:	  LXI	H,NUMBLIB	; Starting address of library
	  LXI	B,LIBLEN	; Length of each entry of library
	  MOV	A,E
	  ORA	A
	  JZ	DIAL8
;
DIAL7:	  MOV	A,M
	  ORA	A		; Make sure we don't go past library
	  JZ	DIALBAD		; Jump if we do
	  DAD	B		; Index into library by (E)*LIBLEN
	  DCR	E
	  JNZ	DIAL7
;
;
; Now have the line in the phone number library matching the requested
; letter so store that line starting at 'CMDBUF+1'
;
DIAL8:	  MVI	B,LIBLEN
	  LXI	D,CMDBUF+1
	  XCHG
	  MOV	M,B
	  XCHG
	  INX	D
	  CALL	MOVE
;
;
; Now have the full line including phone number in 'CMDBUF' area.
;
DIAL9:	  LDA	SMARTMODEM
	  ORA	A
	  CNZ	SMINIT
;	
DIAL10:	  LXI	H,CMDBUF+1
	  MOV	E,M
	  INX	H
;
DIAL11:	  MOV	A,M
	  ORA	A
	  JZ	DIALBAD
;
;
; Dial a digit, check keyboard for abort
;
	  CALL	DIALA
	  CALL	STAT
	  JZ	DIAL13
	  CALL	KEYIN
	  CPI	CANCEL
	  JNZ	DIAL13
	  JMP	DIALEXIT
;
DIAL13:	  INX	H
	  DCR	E
	  JNZ	DIAL11
;
;
; Show the number of dial attempts
;
	  MVI	B,CR		;end with cr
	  CALL	SNDCHR
;
EATIT:	  CALL	JMP$INMODEM	;gobble the modem response
	  JNC	EATIT
	  CALL	JMP$ILPRT
	  DB	' - try #',0
	  LHLD	DIALCT
	  INX	H
	  SHLD	DIALCT
	  CALL	DECOUT
	  MVI	A,' '
	  CALL	TYPE
	  MVI	B,CR
	  CALL	SNDCHR
;
DIAL14:	  CALL	JMP$INMODEM
	  JNC	DIAL14
	  JMP	SMRESULT
;
DIALAGN:  LDA	CRFLAG
	  ORA	A
	  JNZ	DIALAGN1
	  CALL	JMP$ILPRT
	  DB	' Redial? '
	  DB	'(Y/N/C): ',BELL,0
	  CALL	KBDCHR
	  CALL	CRLF
	  CPI	'N'
	  JZ	DIALAGN2
	  CPI	'Y'
	  JZ	DIALAGN1
	  CPI	'C'
	  JNZ	DIALAGN
	  MVI	A,1
	  STA	CRFLAG
;
DIALAGN1: MVI	B,35
	  CALL	JMP$TIMER
	  CALL	CRLF
	  LDA	RNGBKFL
	  ORA	A
	  JZ	DIAL4
	  STA	CMDBUF+1
	  JMP	DIAL4
;.....
;
;
DIALAGN2: CALL	DIALBGN		;disconnect the modem
	  JMP	MENU
;
;
; Connection has been made
;
CONMADE:  CALL	JMP$ILPRT
	  DB	CR,LF,LF,'CONNECTION MADE',BELL,0
	  LDA	CRFLAG
	  ORA	A
	  JZ	RETRN
	  CALL	JMP$ILPRT
	  DB	' - hit any key to stop the bell ',0
;
CONMADE1: CALL	STAT
	  JZ	CONMADE2
	  CALL	KEYIN
	  XRA	A
	  JMP	RETRN
;
CONMADE2: MVI	B,10
	  CALL	JMP$TIMER
	  MVI	A,BELL
	  CALL	TYPE
	  JMP	CONMADE1
;.....
;
;
; Automatic dialing routine, prints the number being dialed
;
DIALA:	  CALL	TYPE
	  CPI	'R'
	  JNZ	DIALA1
	  PUSH	PSW
	  MOV	A,E
	  CPI	1
	  JZ	RINGBK
	  POP	PSW
;
DIALA1:	  MOV	B,A
	  CALL	DIALAD
	  CPI	'.'		; Are we at a dot in the string ?
	  JNZ	DIALA1A		; Jump around if no
	  MVI	A,YES
	  STA	DOT		; Set flag if yes
DIALA1A:
	  LDA	DOT		; Have we encountered a dot yet ?
	  ORA	A
	  RZ			; RETRN if no
	  MOV	A,B
	  CPI	'*'		;* is valid dial digit
	  JZ	DIALA2
	  CPI	'#'		;# is valid dial digit
	  JZ	DIALA2
	  CPI	'K'		;k indicates wait for next dial tone
	  JZ	DIALA2		;all k's in phone # library should be
	  CPI	'0'		;lower case.
	  RC
	  CPI	'9'+1
	  RNC
;
;
; Sends the digit to the modem.
;
DIALA2:	  MOV	C,A
	  JMP	SNDCHR
;
;
; Print bad library number message and abort if a null is encountered.
;
DIALBAD:  CALL	JMP$ILPRT
	  DB	CR,LF,'++ Bad library number called ++',CR,LF,0
;
DIALEXIT: CALL	DISCONNT
;
DIALEXT1: CALL	CRLF
	  XRA	A
	  STA	CRFLAG
;
DIALEXT2: CALL	JMP$INMODEM
	  JNC	DIALEXT2
	  CALL	JMP$GOODBYE
	  JMP	MENU
;.....
;
;
DIALBGN:  JMP	DISCONNT
;
;
; Do any alternate dialing such as 'MCI' or 'SPRINT'
;
DIALAD:	  MOV	A,B
	  CPI	'<'
	  JNZ	DIALAD1
	  PUSH	H
	  LXI	H,ALTDL1
	  JMP	DIALAD2
;
DIALAD1:  CPI	'>'
	  RNZ
	  PUSH	H
	  LXI	H,ALTDL2
;
DIALAD2:  MOV	A,M
	  CPI	'$'
	  JZ	DIALAD3
	  CALL	TYPE
	  MOV	B,A
	  CALL	SNDCHR
	  INX	H
	  CALL	STAT
	  JZ	DIALAD2
	  CALL	KEYIN
	  CPI	CANCEL
	  JZ	DIALEXIT
	  JMP	DIALAD2
;
DIALAD3:  MVI	A,' '
	  CALL	TYPE
	  POP	H
	  RET
;.....
;
;
; Disconnect the Smartmodem from the phone line
;
GOODBYE:
DISCONNT: CALL	SETDTRL		;drop dtr
	  LXI	H,DISC0		;send the idle command just in case
	  CALL	SENDMDM		;the modem was in command mode instead
				;of on line
DISCONN2: CALL	JMP$INMODEM	;gobble the idle message from the
	  JNC	DISCONN2	;modem after the 'I' command is
	  MVI	B,10		;sent and give it time to
	  CALL	JMP$TIMER	;reinitialize
	  CALL  SETDTRH		; Set DTR active again
	  RET
;.....
;
;
DISC0:	  DB	'I',CR,'$'
DOT:	  DS	1		; Flag for don encountered
;.....
;
;
; Set Smartmodem for dialing
;
SMINIT:	  CALL	SETDTRH		;enable dtr
	  LXI	H,SM$DAL1	;put racal in command mode
	  CALL	SENDMDM
	  JMP	SMRESULT	;get results (hello:i'M READY)
;
SMINIT0:  MVI	B,10
	  CALL	JMP$TIMER
	  LXI	H,SM$DAL2	;put racal in dial mode
	  CALL	SENDMDM
	  CALL	JMP$INMODEM	;gobble the modem echo smresult 
				;will take care of the the rest
	  JMP	SMRESULT	;number?
;
SMINIT1:  RET
;.....
;
;
SM$DAL1:  DB	'E'-40H,CR,'$'	;get into command mode
;
SM$DAL2:  DB	'D',CR,'$'	;dial
;
;
; Send the string pointed to by 'HL' to both the CRT and the modem.
;
SENDOUT:  PUSH	H
	  CALL	SNDNOW
	  POP	H
	  MOV	A,M
	  CPI	'$'
	  RZ
	  MOV	A,M
	  CALL	OUT$MODDATP
	  CALL	TYPE
	  INX	H
	  JMP	SENDOUT
;.....	
;
;
; Send the string pointed to by 'HL' to the modem only
;
SENDMDM:  PUSH	H
	  CALL	SNDNOW
	  POP	H
	  MOV	A,M
	  CPI	'$'
	  RZ
	  CALL	OUT$MODDATP
	  INX	H
	  JMP	SENDMDM
;......
;
;
; Checks for answer from Smartmodem
;
SMRESULT: LXI	H,RESULBUF
	  PUSH	H
;
SMRESUL2: CALL	RCVRDY
	  JZ	SMRESUL1
	  CALL	STAT
	  JZ	SMRESUL2
	  CALL	KEYIN
	  CPI	CANCEL
	  JNZ	SMRESUL2
	  MVI	B,CR
	  CALL	SNDCHR
	  POP	H
	  JMP	DIALEXT1
;
RESULBUF: DS	16
;
SMRESUL1: CALL	JMP$INMODEM
	  JC	SMRESUL4
;
SMRESUL6: ANI	7FH
	  CPI	' '
	  JZ	SMRESUL1	;throw away spaces, lf, cr, nuls
	  CPI	LF		;bell, and * in the resulbuf
	  JZ	SMRESUL1
	  CPI	00H
	  JZ	SMRESUL1
	  CPI	'*'
	  JZ	SMRESUL1
	  CPI	CR
	  JZ	SMRESUL1
	  CPI	BELL
	  JZ	SMRESUL1
	  POP	H
	  MOV	M,A
	  INX	H
	  PUSH	H
	  JMP	SMRESUL2
;
;
; Compare the Racal response
;
SMRESUL4: POP	H
	  LXI	D,RESULBUF
	  CALL	JMP$INLNCOMP
	  DB	'HE',0			;hello:i'M READY
	  JNC	SMINIT0
	  CALL	JMP$INLNCOMP
	  DB	'NU',0			;number?
	  JNC	SMINIT1
	  CALL	JMP$INLNCOMP
	  DB	'BU',0			;busy
	  JNC	NUM$BUSY
	  CALL	JMP$INLNCOMP
	  DB	'DI',0			;dialing...
	  JNC	SMRESULT
	  CALL	JMP$INLNCOMP
	  DB	'RI',0			;ringing...
	  JNC	RING
	  CALL	JMP$INLNCOMP
	  DB	'AN',0			;answer tone
	  JNC	SMRESULT
	  CALL	JMP$INLNCOMP
	  DB	'ON',0			;on line
	  JNC	CONMADE
	  CALL	JMP$INLNCOMP
	  DB	'NO',0			;no dial tone
	  JNC	NO$DT
	  CALL	JMP$INLNCOMP
	  DB	'FA',0			;failed call
	  JNC	FAILCAL
	  CALL	JMP$INLNCOMP
	  DB	'VO',0			;voice
	  JNC	VOICE
	  CALL	JMP$INLNCOMP
	  DB	'ID',0			;idle
	  JNC	FAILCAL
;
SMDM1:	  JMP	FAILCAL
;.....
;
;
VOICE:	  CALL	CRLF
	  CALL	JMP$ILPRT
	  DB	'VOICE !!! pick up reciever and enter RETRN ',BELL,0
	  CALL	KBDCHR
	  CPI	CR
	  JNZ	VOICE
	  CALL	SNDCHR
;
VOICE1:	  CALL	JMP$INMODEM	;gobble modem response
	  JNC	VOICE1
	  CALL	DISCONNT
	  JMP	MENU
;
;
; Failed call is the result of no answer after 60 sec of ringing, wrong
; baud rate, or an incorrect response from the modem.
;
FAILCAL:  CALL	CRLF
	  CALL	JMP$ILPRT
	  DB	'No answer... Failed call....',0
	  JMP	DIALAGN
;
;
; No dial tone can occur when using the alternate dialing option and a
; dial tone is not detected after the pause 'K' or within 5 sec after 
; the start of the modem dialing routine
;
NO$DT:	  CALL	CRLF
	  CALL	JMP$ILPRT
	  DB	'No dial tone present....',0
	  JMP	DIALAGN
;
NUM$BUSY: CALL	CRLF
	  CALL	JMP$ILPRT
	  DB	'Number busy....',0
	  JMP	DIALAGN
;
RING:	  LDA	RINGFLG
	  ORA	A
	  JZ	SMRESULT
	  JMP	RINGBK1
;
;
; Handles the special ringback numbers.  Dials, lets it ring only once,
; hangs up and then redials.
;
RINGFLG:  DB	0
;
RINGBK:	  POP	PSW
	  LDA	CMDBUF+1
	  STA	RNGBKFL
	  STA	RINGFLG
	  SUI	1
	  STA	CMDBUF+1
	  RET
;.....
;
;
; Hang up and redial
;
RINGBK1:  CALL	HANGUP
	  MVI	B,50
	  CALL	JMP$TIMER
	  CALL	CRLF
	  JMP	DIAL9
;.....
;
;
HANGUP:   MVI	B,CR		;abort the dialing process
	  CALL	SNDCHR
	  XRA	A
	  STA	RINGFLG		;clear flag for next dial
;
HANGUP1:  CALL	JMP$INMODEM	;wait for the modem to complete its
	  JNC	HANGUP1		;response to the cr
	  JMP	DISCONNT	;RETRN here
;.....
;
;
; Time-out routine.  Must be called with mask in 'D' reg. for input at
; relative port 2 and number of seconds (times 10) in 'C' reg.
;
WAIT:	  MVI	B,2
	  CALL	JMP$TIMER
	  CALL	IN$MODCTL1
	  ANA	D
	  RZ
	  PUSH	B
	  PUSH	D
	  CALL	STAT
	  JZ	WAIT1
	  CALL	KEYIN
	  CPI	CANCEL
	  JZ	WAIT2
;
WAIT1:	  POP	D
	  POP	B
	  DCR	C
	  JNZ	WAIT
	  STC
	  RET
;.....
;
;
WAIT2:	  POP	D
	  POP	B
	  JMP	DONETD
;.....
;
;
; Patch for STUPENT: to prevent sending of Hayes commands to Racal
;
;
	  ORG	STUPENT
;
;
	  LDA	SETUPTST
	  ORA	A
	  JZ	NOTVLD
	  CALL	JMP$SETUPR
	  JMP	XPRT
;
;
;
; Lets fix the byebye routine. It calls GOODBYE: directly  and not
; through the jump vectors at the begining so make it use the jump
; vectors.
;
;
	  ORG	BYEBYE
;
;
	  LDA	PMMIMODEM
	  ORA	A
	  CNZ	JMP$GOODBYE
	  LDA	SMARTMODEM
	  ORA	A
	  CNZ	JMP$GOODBYE
	  CALL	JMP$ILPRT
	  DB	CR,LF,'<<Exit to CP/M>>',CR,LF,0
	  JMP	EXIT
;.....
;
;
; Fix for DONETD: the routines GOODBYE: and DISCONNT: are the same so
; no need to call twice.
;
;
	  ORG	DONETD
;
;
	  CALL	JMP$ILPRT
	  DB	CR,LF,'<< DISCONNECTED >>',BELL,CR,LF,0
	  CALL	JMP$GOODBYE
	  JMP	MENU0
;
;
;
; M730RV.ASM uses these routines located in the main program.
;  These equates have to be set for particular releases of MDM7xx.
;  Currently they are set for MDM730.
;
ALTDL1:   EQU	0DCEH		;alt dial 1
ALTDL2:   EQU	0DE6H		;alt dial 2
BUFFER:	  EQU	4F00H
BYEBYE:	  EQU	404DH
CLRTST:	  EQU	4862H		;clear screen test
CMDBUF:	  EQU	49A7H		;cmd buffer
CRFLAG:	  EQU	4992H		;cr flag
CRLF:	  EQU	2B7BH		;print crlf
DECOUT:	  EQU	2BBDH
DIALCT:	  EQU	4987H
DONETD:   EQU	2B04H
EXIT:	  EQU	2C5AH
INBUF:	  EQU	2F3EH
KBDCHR:	  EQU	2BAAH		;wait for keyboard input
KEYIN:	  EQU	2B93H		;kbd input
MENU:	  EQU	32EDH		;menu
MENU0:	  EQU	32A6H
MOVE:	  EQU	2C9BH
MOVER:	  EQU	30DFH		;move routine
NEWLINE:  EQU	4814H
NOTVLD:	  EQU	3F78H
NUMBLIB:  EQU	0E00H		;number library
RCVRDY:   EQU	1E38H		;receiver ready
RETRN:    EQU	197EH
RNGBKFL:  EQU	49A2H		;ring back flag
SNDCHR:   EQU	2CA4H		;send character
SNDNOW:   EQU	1E4AH
STUPENT:  EQU	46F1H
SPACES:	  EQU	481DH
STAT:	  EQU	2B88H		;console status
TYPE:	  EQU	2B9DH		;type
XPRT:	  EQU	3DFEH
;
	  END
