; MXO-UD10.ASM - UDS 212 A/D MODEM OVERLAY FOR MEX
;
; You will want to look this file over carefully. There are a number of
; things that will have to be done to adapt your computer overlay file
; for proper interaction with this modem overlay file.
;
;
; Edit this file for your preferences then follow the "TO USE:" example
; shown below.
;
; TO USE: Assemble with ASM.COM or equivalent
; assembler. Then use MLOAD21.COM (or later) to combine
; this overlay with the original MEXxx.COM file, and your
; computer specific overlay file.( MXO-xxxx in the example
; given below).
;
; A>MLOAD21 MEX.COM=MEXxx.COM,MXO-UD10,MXO-xxxx
;
; >>>> Report bugs to fortfone rcp/m 414-563-9932 <<<<<<<<<<<<
;
; = = = = = = = = = = = = = = = = = =
;
YES EQU 0FFH
NO EQU 000H
;
; UDSNEW - If yes, this is a revised UDS 212 A/D. The new
; models can be disconnected by sending the string 'XXXT' followed
; by carriage return. Older models can only be disconnected by
; dropping DTR low for at least 60 msec. Define UDSNEW to be yes
; if you want to use the 'XXXT' disconnect string, Define UDSNEW
; to be NO to use the DTR disconnect method. (The computer overlay
; must intercept the DISCV vector, drop DTR, then JMP to the original
; DISCV vector address.)
;
UDSNEW EQU YES
;
;
; *NOTES* As an owner of a UDS 212-A/D modem you are probably aware
; of the consequences regarding training the modem at one baud rate
; and then changing baud rates without untraining the modem first.
; The poor thing will go crazy. Using this overlay *requires* the
; user to always disconnect a call before changing baud rates.
; The Ctl-J + N command will disconnect the modem and then untrain
; the ACU. Do *NOT* make a completed call, exit terminal mode
; with Ctl-J + E, and then try to change baud rates. (Incomplete or
; aborted calls don't count, the modem is automatically untrained
; if the call isn't completed.) If you're in doubt, enter terminal
; mode and give the disconnect command, Ctl-J + N, this will insure
; the modem is disconnected and 'untrained'.
;
;
; MEX11 if YES will compile the patches for the smartmodem entry points
; that are new to MEX version 1.10 (MEX11)
;
MEX11 EQU NO
;
;
BDOS EQU 005H
CR: EQU 0DH ;carriage return
LF: EQU 0AH ;linefeed
;
; MEX service processor stuff
;
MEX EQU 0D00H ; MEX SERVICE PROCESSOR ENTRY POINT
INMDM EQU 255 ;get char from port to A, CY=no more in 100 ms
TIMER EQU 254 ;delay 100ms * reg B
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 chara (B) to the modem (after sndrdy)
RCVCHR EQU 248 ;recv a char from modem (after rcvrdy)
LOOKUP EQU 247 ;table search: see CMDTBL comments for info
PARSFN EQU 246 ;parse filename from input stream
BDPARS EQU 245 ;parse baud-rate from input stream
SBLANK EQU 244 ;scan input stream to next non-blank
EVALA EQU 243 ;evaluate numeric from input stream
LKAHED EQU 242 ;get nxt char w/o removing from input
GNC EQU 241 ;get char from input, cy=1 if none
ILP EQU 240 ;inline print
DECOUT EQU 239 ;decimal output
PRBAUD EQU 238 ;print baud rate
;
CONOUT EQU 2 ; simulated BDOS functions, for MEX
PRINT EQU 9
INBUF EQU 10
;
; PDIAL completion codes to be returned to MEX
;
PCARR EQU 0 ; CARRIER DETECT, CONNECTION MADE
PBSY EQU 1 ; PHONE IS BUSY
PNOANS EQU 2 ; NO ANSWER
PABRT EQU 3 ; KEYBD ABORT
PERR EQU 4 ; MODEM ERROR
;
;
;
;
;
ORG 0162H ; MEX main overlay
DIALV: JMP PDIAL ;jump to modem dialing routine 162H
DISCV: JMP MDMDSC ;jump to modem disconnect routine 165H
;
; NOTE: User must drop DTR for at least 60 msec and then call MDMRST
; to properly disconnect the UDS 212 A/D
;
;
ORG 0B00H
;
; Entry point to dialing routine. This routine saves all the digits in
; a buffer, dialing the number only after all digits/commands have been
; received. It then monitors the ACU call progress responses and returns
; the proper success/failure codes to MEX.
;
PDIAL: EI
CPI 254
JZ STDIAL ; start of dialing sequence, reset pointers
CPI 255
JNZ DDIGIT ; store digit, will dial the whole number later
;
; all digits recieved, time to dial the number.
;
XRA A ; Null terminate the phone number
CALL DDIGIT
;
;
CALL FLUSH ; Flush the modem input
MVI B,3 ; 0.3 second delay, Baud rate might have changed,
MVI C,TIMER ; this lets your UART adjust to the new rate (?).
CALL MEX
CALL FLUSH ; Flush input again.
;
; First step is to train the modem to the current baud rate.
;
CALL MDMTRN ; Send the modem training command 'EN'
JC DLERR ; Exit upon training error.
;
; Now dial the number
;
MVI A,'D' ; Dialing command = 'D'
CALL SEND1
LXI H,DNUMBR ; Send the phone number
CALL SNDSTR
MVI A,CR ; Send a Return to start the dialing procedure
CALL SEND1
;
; Begin call progress monitoring
;
MVI B,20 ; Delay 2 seconds, to let modem get started.
MVI C,TIMER
CALL MEX
;
XRA A ; clr the completion code flag
STA CCODE
;
; Look for 'COMPLETE', 'BUSY', or 'ABORT' responses followed by
; a cr,lf combination. If there is no response from the modem in
; 25.5 seconds, report an error.
;
PDLP0: MVI B,0 ; no response timeout counter 0=25.5 sec
PDLP1: DCR B
JZ DLERR ; Exit upon timeout error
PUSH B
MVI C,CHEKCC ; Check for Ctl-C from Keyboard
CALL MEX
JZ PDABRT
MVI C,INMDM
CALL MEX
POP B
JC PDLP1 ; try again, if no chara
;
PDLP2: CPI 'C' ; Check for the letter 'C' as in 'COMPLETE'
JNZ PDLP3
STA CCODE
;
PDLP3: CPI 'Y' ; Check for the letter 'Y' as in 'BUSY'
JNZ PDLP4
STA CCODE
;
PDLP4: CPI LF ; Check for LF to terminate the response line
JNZ PDLP0 ; reset timer and check for next chara
;
; LF has been received, if 'C' was received, we were a success, if not
; it was busy or aborted
;
LDA CCODE
CPI 'C'
JZ PDOK
;
CPI 'Y'
JZ PBUSY
; Default must be No answer/No ABT
MVI A,PNOANS
JMP MDMRST
;
PBUSY: MVI A,PBSY ; phone busy code
JMP MDMRST ; reset modem to untrained state
;
DLERR: MVI A,PERR ; modem error code
JMP MDMRST
;
PDABRT: POP B
MVI A,PABRT ; Keyboard abort code
;
; MDMRST - Reset the ACU to an untrained state. Aborts any
; dialing operation in progress.
;
; Send 'Q'. Send 'OG0'.
; Send 3 space characters, for timing
;
MDMRST: EI
PUSH PSW ; Save 'A', trashes all other reg's
CALL FLUSH
MVI A,'Q' ; Abort dialing in progress
CALL SEND1 ;
CALL GCOLON ; Check if ACU is alive
JC MDMRS1 ;
LXI H,CLRSTR ; Send the 'OG0' command string
CALL SNDSTR ; Send it if ACU was alive
MDMRS1: CALL FLUSH
POP PSW ; restore 'A'
RET
;
PDOK: MVI A,PCARR
RET
;
; start the dialing process, reset the dial pointer
;
STDIAL: LXI H,DNUMBR
SHLD DPTR
RET
;
; Add a digit to the phone number string
;
DDIGIT: LHLD DPTR
MOV M,A
INX H
SHLD DPTR
RET
;
;
TRNSTR: DB 'EN',0
CLRSTR: DB 'OG0 ',0
CCODE: DB 0 ; Completion code byte
DNUMBR: DS 40 ; storage for phone number
DPTR: DW DNUMBR ; Pointer into DNUMBR for next digit
;
;
; Support routines
;
; Send null terminated string to modem
;
SNDSTR: MOV A,M
ORA A
RZ ; Null terminated string
INX H
PUSH H
CALL SEND1
POP H
JMP SNDSTR
;
; Send One chara to modem
;
SEND1: PUSH PSW
SND1LP: MVI C,SNDRDY
CALL MEX
JNZ SND1LP
POP PSW
MOV B,A
MVI C,SNDCHR
JMP MEX
;
; 'Train' the modem ACU
;
MDMTRN: LXI H,TRNSTR ; Send the training string
CALL SNDSTR
CALL GCOLON ; Check for a ':' from the modem
RC ; CY=1 indicates training error
XRA A ; CY=0
RET
;
; Get a colon response from the modem, if there is a character
; timeout before receiving colon, return CY=1 to indicate error
; All other characters are accepted, up to a maximum of 30
;
GCOLON: MVI C,INMDM
MVI B,30
GCOLP: PUSH B
CALL MEX
POP B
RC ; return CY=1 upon modem timeout..
CPI ':'
RZ ; return CY=0 upon receving ':'
DCR B
STC
RZ ; return CY=1 upon too many characters
JMP GCOLP
;
FLUSH: MVI C,INMDM ; Read until there are no more charas in 100msec
CALL MEX
JNC FLUSH
RET
;
;
MDMDSC: PUSH PSW
;
IF UDSNEW
LXI H,DSCSTR
CALL SNDSTR
CALL GCOLON
ENDIF ; UDSNEW
;
CALL MDMRST ; untrain the modem ACU
MVI B,10 ; 1 sec delay, let the command reach the modem and
MVI C,TIMER ; give it time to reset itself.
CALL MEX
POP PSW
RET
;
DSCSTR: DB 'XXXT',CR,0
;
; NEW MEX1.10 Additional Code
;
IF MEX11
SSET: MVI C,ILP
CALL MEX
DB 'SSET Command is not supported'
DB CR,LF,0
DUMMY: RET
;
; MEX 1.10 Smartmodem patch points, not used for UDS 212 A/D
;
ORG 0D55H ; Fixed at address 0D55H
DW DUMMY ; SMINIT - not used.
DW SSET ; SSET command not implemented.
DW DUMMY ; SMEXIT - not used.
ENDIF ; MEX11
;
END