sdowdy@charon.unm.edu (Stephen Dowdy) (04/21/88)
I have seen several requests for DTE_HAYES drivers in the past, and
decided to post this one. There are some flaky things with getting
a hayes to work on a vax, but it does work. (mostly)
Some of the original DTE_DF03.MAR and modifications got chopped off.
I originally got a copy from J Hobbs and modified it to do some other stuff
including supporting multiple dial etc. I really wanted to do some more
stuff, but i didn't know MACRO, and spent quite some time getting it all
to work (while trying to figure out Vax Macro)... (and having fun with the
following problem) (don't rag on me for crummy macro coding, this was my
first attempt at vms system coding., and it works even!)
There are some important things to note when getting this to work.
The hayes will do something pretty bizzarre if it is in a certain mode.
If you have response codes enabled, as soon as the Hayes gets a DTR drop
from the vax, it sends "Hey, I lost the connection", which the VAX sees
as "Oh, Login request!" , after which it times out (30 seconds or so), and
the cycle repeats. So Disable response codes in the dip switch settings.
They get turned on by the software during the connection, but the modem
appears to get reset to initial settings when the connection is closed.
So be careful how you set the dip switches. This driver works fairly well,
in general, though i have seen the terminal port go into the endless
"hello/goodbye" cycle occasionally.
I didn't get a chance to clean it up and include some things i wanted to,
so take it as it is...
--stephen dowdy
............... Cut Here ......................
.TITLE DTE_MT224 - SET HOST/DTE dialer module (MT224 Hayes Compatible)
.IDENT 'X-1'
;++
;
; FACILITY:
;
; SET HOST/DTE
;
; ABSTRACT:
;
; Provide modem-specific support for autodialing on a MultiTech 224
; Activated as a sharable image when
; SET HOST ttcn: /DTE/DIAL=(number:string,MODEM_TYPE=MT224)
; is run.
;
; ENVIRONMENT:
;
; VAX/VMS, user mode.
;
;--
;
; Jake VanNoy, : 11-Apr-1984
;
; taken from DTE_DF03.MAR, modified by
; J Hobbs 10-Jun-1985
;
; Stephen Dowdy (UNM CIRT ACS ApSys)
; added P,W,T to list of valid parameters, check on return
; status, loops for checking status' on multi-dialtone
; requests, etc...
;
; Installation / Assembly instructions:
; MACRO DTE_MT224
; LINK/SHARE DTE_MT224
; COPY DTE_MT224.EXE SYS$SHARE:
; INSTALL CREATE SYS$SHARE:DTE_MT224/OPEN/SHARE
;**
.SBTTL DECLARATIONS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Include Files:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$SHRDEF ; shared messages
$STSDEF ; status fields
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Macros:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Equated Symbols:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
REM$_FACILITY = ^X1FE
REM$_BADVALUE = SHR$_BADVALUE!<REM$_FACILITY@16>
CR = 13
LF = 10
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Common Storage:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; The MT224 command buffer allows 40 chars + "AT".
;; Several additional settings are invoked to force the MT224 to act in
;; a known fashion.
;; T - Tone Dial
;; B1 - Force waits for Dial Tone
;; V0 - Enable digit response codes
;; X0 - Basic response set
;; Q0 - Enable response code emissions (temporarily)
;; It should be ensured that the modem is in a state where no spurious
;; characters will be sent to the driver
;;
dial_string_desc: .long dial_string_str_len
.long 0
dial_string_str: .ascii /ATTB1V0X0Q0D000000000000000000000000000000/<cr>
dial_string_str_len = .-dial_string_str
CONN_DESC: .LONG CONN_STR_LEN ; length
.LONG 0 ; will get filled in by code
CONN_STR: .ASCII <CR><LF>/Connection made to remote port/<CR><LF>
CONN_STR_LEN = .-CONN_STR
FAIL_DESC: .LONG FAIL_STR_LEN ; length
.LONG 0 ; will get filled in by code
FAIL_STR: .ASCII <CR><LF>/Failed to connect to remote port/<CR><LF>
FAIL_STR_LEN = .-FAIL_STR
read_desc: .long read_length
.long 0
READ_BUFFER: .BLKB 2 ; read buffer
read_length = .-read_buffer
IOSB: .LONG 0,0 ; I/O status
READ_STATUS: .LONG 0 ; completion status
USER_CHAN: .LONG 0 ; command channel own storage
.SBTTL DTE_HAYES - autodial routine
;++
;
; FUNCTIONAL DESCRIPTION:
;
; perform the necessary autodial protocol on an autodial modem
;
; CALLING SEQUENCE:
;
; DIAL_ROUTINE (number_desc, port_chan, command_chan)
;
; INPUT PARAMETERS:
;
; 4(AP) - descriptor of string specified in NUMBER:string
; 8(AP) - channel number of port MODEM is connected to
; 12(AP) - channel number of user's terminal
;
; IMPLICIT INPUTS:
; NONE
;
; OUTPUT PARAMETERS:
; NONE
;
; IMPLICIT OUTPUTS:
; NONE
;
; COMPLETION CODES:
;
; R0 - status
;
; SIDE EFFECTS:
; NONE
;
;--
number = 4
port_chan = 8
command_chan = 12
.TRANSFER DIAL_ROUTINE
.MASK DIAL_ROUTINE
BRW DIAL_ROUTINE+2
.ENTRY DIAL_ROUTINE,^M<R2,R3,R4>
MOVZWL command_chan(AP),user_chan ; save for later
MOVL number(AP),R2 ; fetch address of descriptor
MOVZWL (R2),R3 ; length of string
MOVL 4(R2),R4 ; address
;
; Loop through string to check for illegal characters
;
10$:
CMPB #^A/,/,(R4) ; "," is pause character
BEQL 20$ ; branch if match
CMPB #^A/P/,(R4) ; "P" is Pulse Dial
BEQL 20$ ; branch if match
CMPB #^A/T/,(R4) ; "T" is Tone Dial
BEQL 20$ ; branch if match
CMPB #^A/W/,(R4) ; "W" is Wait for Dial Tone
BEQL 20$ ; branch if match
;
CMPB #^A/0/,(R4) ; check for number
BGTRU 30$ ; Branch if less than legal
CMPB #^A/9/,(R4) ; check for number
BLSSU 30$ ; Branch if more than legal
20$: INCL R4 ; next character
SOBGTR R3,10$ ; legal character, loop
BRB 40$ ; continue, number ok
;
; error in number string
;
30$: PUSHL number(AP) ; signal error
PUSHL #1 ; number of FAO args
PUSHL #REM$_BADVALUE ; error type
CALLS #3,G^LIB$SIGNAL ; error
MOVL #REM$_BADVALUE!STS$M_INHIB_MSG,R0 ; return status
RET ; return
40$:
;
; number string ok, continue.
; queue read for status string
;
; first read for dialtone notification
BSBW READ_STR ; read status string
BLBC R0,100$ ; exit on error
;
; Write string to modem
;
MOVL number(AP), R2 ; fetch descriptor address
movzwl (R2),r3
movc5 r3,@4(r2),#^A/ /,#30,dial_string_str+12
movab dial_string_str,dial_string_desc+4
movab dial_string_desc,r2
bsbw write_str
blbc r0,100$
50$:
$HIBER_S ; wait for read to complete
MOVL READ_STATUS,R0 ; set status
MOVZWL #SS$_RETRY,R3 ; load register
CMPL R3,R0 ; check if another status needed
BNEQ 100$ ; Connected or failure
BSBW READ_STR ; read status string
BLBC R0,100$ ; exit on error
BRB 50$ ; check on next status
100$:
RET
.SBTTL WRITE_STR - write string to port channel
;++
;
; FUNCTIONAL DESCRIPTION:
;
; write a string to the DTE port
;
; CALLING SEQUENCE:
;
; BSBW WRITE_STR
;
; INPUT PARAMETERS:
;
; R2 - address of descriptor to write
;
; COMPLETION CODES:
;
; R0 - status
;
;--
WRITE_STR:
$QIOW_S -
CHAN = port_chan(AP),- ; channel
FUNC = #IO$_WRITEVBLK!IO$M_NOFORMAT,- ; write no format
P1 = @4(R2),- ; address
P2 = (R2) ; length
RSB
.SBTTL READ_STR - read status string from port
;++
;
; FUNCTIONAL DESCRIPTION:
;
; Read the status string from the MODEM, allowing a maximum
; of 60 seconds for the event to occur.
; (sed) i changed this to 30, who wants to wait for a full
; minute to find out it failed?
;
; CALLING SEQUENCE:
;
; BSBW READ_STR
;
; INPUT PARAMETERS:
; NONE
;
; COMPLETION CODES:
;
; R0 - status
;
;--
; FUNC = #IO$_READVBLK!IO$M_TIMED!IO$M_PURGE!IO$M_NOECHO!IO$M_TRMNOECHO, -
READ_STR:
$QIO_S -
CHAN = port_chan(AP),- ; channel
FUNC = #IO$_READVBLK!IO$M_TIMED!IO$M_PURGE!IO$M_NOECHO!IO$M_TRMNOECHO, -
- ; read timed, purge
IOSB = IOSB,- ; I/O status
ASTADR = READ_DONE,- ; ast routine
P1 = READ_BUFFER,- ; address
P2 = #2,- ; length
P3 = #30 ; timeout
RSB ; exit with status
.SBTTL READ_DONE - ast for read completion
;++
;
; FUNCTIONAL DESCRIPTION:
;
; Check for timeout or status character
;
; CALLING SEQUENCE:
;
; CALLed as AST routine
;
; INPUT PARAMETERS:
; NONE
;
; COMPLETION CODES:
;
; R0 - status
;
;--
.ENTRY READ_DONE,^M<R2>
MOVZWL IOSB,R0 ; get status of read
BLBC R0,100$ ; branch if timeout
MOVZWL #SS$_RETRY, R0 ; set for dialtone, retry status later
MOVZBL READ_BUFFER,R2 ; fetch data
CMPB #^A/6/,R2 ; DIALTONE detected?
BEQL 100$ ; wake up to queue next read
CMPB #^A/1/,R2 ; CONNECT detected?
BNEQ 10$ ; branch if not
MOVAB conn_desc,R2 ; set up string
MOVAB conn_str,4(R2) ; set up string
BSBW WRITE_STR_TO_USER ; tell user, ready
BLBC R0,100$ ; exit on error
MOVL #SS$_NORMAL,R0 ; ready
BRB 100$ ; exit
10$:
MOVAB fail_desc,R2 ; set up string
MOVAB fail_str,4(R2) ; set up string
BSBW WRITE_STR_TO_USER ; tell user, ready
MOVZWL #SS$_HANGUP,R0 ; status
100$: MOVL R0,READ_STATUS ; save status
$WAKE_S ; wake main stream
RET
.SBTTL WRITE_STR_TO_USER - write string to command channel
;++
;
; FUNCTIONAL DESCRIPTION:
;
; write a string to the user terminal channel
;
; CALLING SEQUENCE:
;
; BSBW WRITE_STR_TO_USER
;
; INPUT PARAMETERS:
;
; R2 - address of descriptor to write
;
; COMPLETION CODES:
;
; R0 - status
;
;--
WRITE_STR_TO_USER:
$QIOW_S -
CHAN = user_chan,- ; channel
FUNC = #IO$_WRITEVBLK,- ; write
P1 = @4(R2),- ; address
P2 = (R2) ; length
RSB
.END
--
$!#######################################################################
$! stephen dowdy (UNM CIRT) Albuquerque, New Mexico, 87131 (505) 277-8044
$! Usenet: {convex,ucbvax,gatech,csu-cs,anl-mcs}!unmvax!charon!sdowdy
$! BITNET: sdowdy@unmb
$! Internet: sdowdy@charon.UNM.EDU
$! Team SPAM in '87! SPAAAAAAAAAAAAAAAAAAAAMMMMMMM!
$!#######################################################################