home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
MEX
/
MXM-CM11.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
8KB
|
246 lines
TITLE 'MEX Cermetek Infomate 212a overlay V1.1'
;
; (DELETE ABOVE TITLE LINE IF ASSEMBLING WITH ASM)
;
; Cermetek overlay for MEX: revision 1.1
; Written 08/22/84 by Paul Traina with grateful thanks to Ronald G. Fowler
; Last revision: 08/24/84 (PST)
;
; This modules adapts MEX for the Cermetek Infomate 212a Intelligent Modem.
; The main function of this module is to provide dialing capability; the
; disconnect vector is ancillary.
;
;----------------------------------------------------------------
;
; 08/24/84 Updated for MEX version 1.1 -- Paul Traina
;
; 08/22/84 This is based upon original work by RGF. I can take
; no credit for the intelligence needed to make this module,
; but if there is some blame for it malfunctioning, I'll take
; that, because I was the one who performed the cut-job.
; -- Paul Traina
;
;----------------------------------------------------------------
;
; This overlay will work with any modem overlay that terminates
; prior to 0900H
;
; System Constants
;
DIALV EQU 0162H ; Location of DIAL vector in overlay
DISCV EQU 0165H ; Location of DISCONNECT vector in overlay
DIALOC EQU 0900H ; Dialing code goes here
MEX EQU 0D00H ; "CALL MEX"
;
; Following are function codes for the MEX service call processor
;
INMDM EQU 255 ; Return char form MDM in A, CY=no chr in 100ms
TIMER EQU 254 ; Wait B*100ms
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)
ILP EQU 240 ; Inline print routine
;
CR EQU 13 ; Ascii carriage-return
LF EQU 10 ; Ascii line-feed
APPOS EQU 027H ; Ascii appostrophe
;
ORG DIALV ; Overlay the dialing vector
JMP DIAL
;
; This is the DIAL routine called by MEX to dial a digit. The digit
; to be dialed is passed in the A register. Note that two special
; codes must be intercepted as non-digits: 254 (start dial sequence)
; and 255 (end-dial sequence). Mex will always call DIAL with 254
; in the accumulator prior to dialing a number. Mex will also call
; dial with 255 in A as an indication that dialing is complete. Thus,
; the overlay may use these values to "block" the number, holding it
; in a buffer until it is completely assembled (in fact, that's the
; scheme employed here for the Smartmodem).
;
; After the 254-start-dial sequence, MEX will call the overlay with
; digits, one-at-a-time. MEX will make no assumptions about the dig-
; its, and will send each to the DIAL routine un-inspected (some modems,
; like the Smartmodem, allow special non-numeric characters in the
; phone number, and MEX may make no assumptions about these).
;
; After receiving the end-dial sequence (255) the overlay must take
; whatever end-of-dial actions are necessary *including* waiting for
; carrier at the distant end. The overlay should monitor the keyboard
; during this wait (using the MEX keystat service call), and return
; an exit code to MEX in the A register, as follows:
;
; 0 - Carrier detected, connection established
; 1 - Far end busy (only for modems that can detect this condition)
; 2 - No answer (or timed out waiting for modem response)
; 3 - Keyboard abort (^C only: all others should be ignored)
; 4 - Error reported by modem
; 5 - No ring detected (only for modems that can detect this condition)
; 6 - No dial tone (only for modems that can detect this condition)
;
; <No other codes should be returned after an end-dial sequence>
;
; The overlay should not loop forever in the carrier-wait routine, but
; instead use either the overlay timer vector, or the INMDMV (timed 100
; ms character wait) service call routine.
;
; The DIAL routine is free to use any of the registers, but must return
; the above code after an end-dial sequence
;
ORG DIALOC
;
DIAL: LHLD DIALPT ; Fetch pointer
CPI 254 ; Start dial?
JZ STDIAL ; Jump if so
CPI 255 ; End dial?
JZ ENDIAL ; Jump if so
;
; Not start or end sequence, must be a digit to be sent to the modem
;
MOV M,A ; Put char in buffer
INX H ; Advance pointer
SHLD DIALPT ; Stuff pointer
RET ; All done
;
; Here on a start-dial sequence
;
STDIAL: LXI H,DIALBF ; Set up buffer pointer
SHLD DIALPT
RET
;
; Here on an end-dial sequence
;
ENDIAL: MVI M,0 ; Terminate buffer
CALL IMLRN ; Learn new baud rate
LXI H,IMDIAL ; Point to dialing string
CALL IMSEND ; Send it
LXI H,IMEND ; Point to terminal part of string
CALL IMSEND
MVI C,INMDM
CALL MEX ; Catch any output from the modem
;
; The following loop waits for a result from the modem (up to
; 60 seconds: You may change this value in the following line)
;
RESULT: MVI C,60 ; <<== MAXIMUM TIME TO WAIT FOR RESULT
IMWLP: PUSH B
MVI B,1 ; Check for a char, up to 1 sec wait
MVI C,TMDINP ; Do timed input
CALL MEX
POP B
JNC IMTEST ; Jump if modem had a char
PUSH B ; No, test for ^C from console
MVI C,CHEKCC
CALL MEX
POP B
JNZ IMNEXT ; If not, jump
CALL DISCV ; Disconnect for 1 second if possible
LXI H,IMABRT ; Send abort string
CALL IMSEND
WTABRT: MVI C,INMDM ; Wait for any garbage
CALL MEX
JNC WTABRT
MVI A,3 ; Return abort code
RET
IMNEXT: DCR C ; No
JNZ IMWLP ; Continue
;
; One minute with no modem response
;
IMTIMO: MVI A,4 ; Return with modem error
RET
;
; Modem gave us a result, check it
;
IMTEST: ANI 127 ; Ignore any parity
CALL IMANAL ; Test the result
JC RESULT ; Go try again if unknown response
MOV A,B ; A=result
PUSH PSW ; Save it
IMTLP: MVI C,INMDM ; Eat any additional chars from modem
CALL MEX
JNC IMTLP ; Until 100ms of quiet time
POP PSW ; Return the code
RET
;
IMANAL: MVI B,0 ; Prep connect code B=0
CPI 'A' ; Answer?
RZ
MVI B,1 ; Prep busy code B=1
CPI 'B' ; Busy?
RZ
MVI B,2 ; Prep no connect message B=2
CPI 'N' ; No answer?
RZ
MVI B,4 ; Prep error B=4
CPI 'W' ; Wrong baud rate?
RZ
MVI B,6 ; Prep no dial tone B=6
CPI 'X' ; No phone connected?
RZ
;
CPI 'V' ; Voice (which mex does not support)
JNZ WTCR ; Error
PUSH D ; Message
PUSH H
MVI C,ILP
CALL MEX
DB 'VOICE ',0
POP H
POP D
;
; Unknown response, return carry to caller, do not flush unknown response
;
WTCR: STC ; Set flag if so
RET
;
; Utility routine, learn baud rate
;
IMLRN: LXI H,IMLERN
IMLRN1: MVI C,SNDRDY ; Wait for modem ready
CALL MEX
JNZ IMLRN1
PUSH H ; Wait 200ms
MVI B,2
MVI C,TIMER
CALL MEX
POP H
MOV A,M ; Fetch next character
INX H
ORA A ; End?
RZ ; Done if so
MOV B,A ; No, position for sending
MVI C,SNDCHR ; Nope, send the character
CALL MEX
JMP IMLRN1
;
; Utility routine: send string to modem
;
IMSEND: MVI C,SNDRDY ; Wait for modem ready
CALL MEX
JNZ IMSEND
MOV A,M ; Fetch next character
INX H
ORA A ; End?
RZ ; Done if so
MOV B,A ; No, position for sending
MVI C,SNDCHR ; Nope, send the character
CALL MEX
JMP IMSEND
;
; DATA AREA
;
IMDIAL: DB CR,'N'-40H,'N ~',CR,CR,CR ; Init to new attn character
DB '~U 1',CR,CR,CR ; Unlisten
DB '~D ',APPOS ; ~D 'num'^M
DIALBF: DS 52 ; 2* 24 char max,+cr+null+slop
DIALPT: DS 2 ; Dial position pointer
IMEND: DB APPOS,CR,0 ; End part of dial string
IMABRT: DB '~',CR,'~',CR,CR,0 ; Abort string
IMLERN: DB ' XY',CR,0 ; Learn baud rate
;
END