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-UD10.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
16KB
|
669 lines
; MXM-UD10.ASM - MEX1.10 Smart modem overlay for UDS 212 A/D modem
;
; TO USE: Edit the UDSNEW parameter for your particular modem.
; 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 below).
;
; A>MLOAD21 MEX.COM=MEXxx.COM,MXM-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
;
;
; *NOTE* 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'.
;
;---------------
;
; Misc equates
;
BDOS EQU 005H
CR: EQU 0DH ;carriage return
LF: EQU 0AH ;linefeed
;
;---------------
;
; MEX service processor equates
;
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
PRNTBL EQU 237 ;print command table in columnar format
PRID EQU 236 ;print MEX ID on console
;
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
PNRING EQU 5 ; NO RING
PNDIAL EQU 6 ; NO DIAL TONE
;
;----------------
;
; MEX Baud rate codes
;
BD110 EQU 0
BD300 EQU 1
BD450 EQU 2
BD600 EQU 3
BD710 EQU 4
BD1200 EQU 5
BD2400 EQU 6
BD4800 EQU 7
BD9600 EQU 8
BD1920 EQU 9
;
;-----------------
;
; Entry points in the computer overlay area
;
ORG 0162H ; MEX main overlay
JMP PDIAL ;jump to modem dialing routine 162H
JMP MDMDSC ;jump to modem disconnect routine 165H
MSPEED: EQU 0107H ;MEX speed code byte
SET8BT: EQU 0171H ;Set serial port for 8-bit data, no parity
SETNRM: EQU 0174H ;Set serial port for normal operation.
;
;----------------
;
; New MEX 1.10 Smartmodem overlay patch points.
;
ORG 0D55H ; Fixed at address 0D55H
DW DUMMY ; SMINIT - not used.
DW SSET ; SSET command processor
DW DUMMY ; SMEXIT - not used.
;
;---------------
;
; Smartmodem code begins at 0900H
;
ORG 0900H
;
;---------------
;
; PDIAL - Actual dial service routine.
;
; 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.
;
; This routine is called by MEX with a dialing digit (ASCII) in the
; A register. The routine can use all registers. The routine is called
; with the special value 254 (decimal) to indicate the beginning of a
; dialing sequence. The special value 255 indicates the end of the
; dialing sequence, and requires the PDIAL routine to return one of the
; MEX dialing completion codes in the A register.
;
PDIAL: 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
;
; check for 300/1200 baud rate. Modem ACU will not work at other rates.
;
LDA MSPEED
CPI BD300
JZ PDIAL0
CPI BD1200
JZ PDIAL0
;
CALL ILPRT
DB CR,LF,'Baud rate must be 300/1200 for Auto Dial - ',0
JMP DLERR ; return the modem error code
;
; Return error code if an invalid dialing character was received.
;
PDIAL0: LDA ERRFLG
ORA A
JZ PDIAL1
;
CALL ILPRT
DB CR,LF,'Invalid Digit/Chara in dial string - ',0
JMP DLERR ; return the modem error code
;
PDIAL1: CALL FLUSH ; Flush the modem input
CALL SET8BT ; Set the serial port for 8-bit operation.
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.
;
LXI H,DOPTS ; Send the options commands
CALL SNDSTR
CALL FLUSH ; Ignore modem responses
;
; Now dial the number
;
MVI A,'D' ; Dialing command = 'D'
CALL SEND1
LXI H,DPREFX ; Send the dialing prefix
CALL SNDSTR
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
;
CALL FLUSH ; Flush the "DIALING - " message
; *** Note: cannot abort with Control-C while waiting on first dial tone ***
MVI B,30 ; get a chara, time out after 30 seconds
MVI C,TMDINP
CALL MEX
JC DLERR ; Timeout = Modem error
CPI 'D'
JNZ PDLER ; No Dial tone error - exit
CALL FLUSH ; Flush the "D.T. - " message
;
; Got past first Dial Tone, now look for the following completion msgs.
; If there is no response in 25.5 seconds, report a modem error to MEX.
;
; COMPLETE
; NO ABT - ABORT
; BUSY - ABORT
; NO D.T. - ABORT
; NO ANSWER - ABORT
;
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
;
PDL20: MVI C,INMDM ; Flush charas until LF or a timeout is rcv'd.
CALL MEX
JC PDL21
CPI LF
JNZ PDL20
PDL21: MVI A,PCARR ; Return carrier detect (success) code to MEX
CALL SETNRM ; reset serial port for normal operation.
RET
;
PDLP3: CPI 'B' ; Check for the letter 'B' as in 'BUSY'
JNZ PDLP4
MVI A,PBSY ; Return the busy error code
JMP MDMRST
;
PDLP4: CPI '.' ; Check for '.' as in 'NO D.T.'
JNZ PDPLP5
PDLER: MVI A,PNDIAL ; Return the No dial tone error code
JMP MDMRST
;
PDPLP5: CPI 'A' ; Check for 'A' as in 'NO ANSWER/NO ABT'
JNZ PDLP0 ; Get/check another chara from modem
MVI A,PNOANS ; Return the no answer error code
JMP MDMRST
;
DLERR: MVI A,PERR ; Return the modem error code
JMP MDMRST
;
PDABRT: POP B
MVI A,PABRT ; Keyboard abort code
JMP MDMRST
;
;---------------
;
; Start the dialing process, reset the dial pointer, error flag
;
STDIAL: LXI H,DNUMBR ; Reset the dial string pointer
SHLD DPTR
XRA A ; Clear the error flag
STA ERRFLG
RET
;
;---------------
;
; Add another digit to the phone number string
;
DDIGIT: CPI ',' ; map ',' into 'D' (delay)
JNZ DDGT1
MVI A,'D'
;
; Check digit/chara for validity
;
DDGT1: CALL CHKDGT
JC DGTERR
;
; Load valid digit into phone num string
; Dashes and spaces are ignored...
;
CPI '-'
RZ
CPI ' '
RZ
LHLD DPTR
MOV M,A
INX H
SHLD DPTR
RET
;
; Invalid digit, set flag and exit.
;
DGTERR: MVI A,PERR ; Must use the modem error code
STA ERRFLG
RET
;
;---------------
;
; CHKDGT - Check for valid dialing digit/char
; Returns CY=1 if invalid chara
;
CHKDGT: MOV B,A ; Save orig char in B
LXI H,CHRSTR
MOV A,M
;
DGTLP: CMP B
RZ ; Character is ok, return CY=0
INX H ; Chk for end of table
MOV A,M
ORA A
JNZ DGTLP
;
STC ; CY=1 indicates error
RET
;
CHRSTR: DB 0 ; 0 is a valid digit, must be first digit of table.
DB '0123456789' ; Valid dialing digits
DB 'PDWT' ; Special ACU commands, Pulse,Delay,Wait,Tone
DB 'pdwt' ; Lower case versions okay.
DB '- ' ; Allow dash and space for clarity
DB 0 ; end of table
;
TRNSTR: DB 'EN',0
;
CLRSTR: DB 'OG0 ',0
;
CCODE: DB 0 ; Completion code byte
;
DNUMBR: DS 50 ; storage for phone number
;
DPTR: DW DNUMBR ; Pointer into DNUMBR for next digit
;
ERRFLG: DB 0 ; Digit error flag
;
;---------------
;
; 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
;
; Table Search, - for SSET command parsing
;
TSRCH: MVI C,LOOKUP
JMP MEX
;
; In-Line Print, null-terminated string
;
ILPRT: MVI C,ILP
JMP MEX
;
; CRLF - Send CR,LF to console
;
CRLF: CALL ILPRT
DB CR,LF,0
RET
;
;---------------
;
; '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
;
;---------------
;
; MDMRST - Reset the ACU to an untrained state. Aborts any
; dialing operation in progress. Preserves register A
;
; Send 'Q' to abort dial operation
; Send 'OG0' to untrain the ACU. (if ACU is active)
;
MDMRST: EI
PUSH PSW ; Save 'A', trashes all other reg's
CALL SET8BT ; Set port for 8 bit data
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 ;
MDMRS1: CALL FLUSH
CALL SETNRM ;reset the serial port for normal oper.
CALL FLUSH
POP PSW ; restore 'A'
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 charas from modem, returns upon timeout.
;
FLUSH: MVI C,INMDM ; Read until there are no more charas in 100msec
CALL MEX
JNC FLUSH
RET
;
;---------------
;
; Disconnect modem from phone line and untrain the ACU.
;
; Uses the Disconnect string if the modem has the new EPROM.
; Otherwise the computer overlay must drop DTR for at least
; 60 msec to disconnect the modem.
;
MDMDSC: PUSH PSW
;
IF UDSNEW
CALL SET8BT
CALL FLUSH
LXI H,DSCSTR
CALL SNDSTR
ENDIF ; UDSNEW
;
CALL MDMRST ; untrain the modem ACU
CALL FLUSH ; extra delay for modem to reset itself.
POP PSW
RET
;
IF UDSNEW
DSCSTR: DB 'XXXT',CR,0
ENDIF ; UDSNEW
;
;--------------------------------
;
; SSET command processing routine
;
SSET: MVI C,SBLANK
CALL MEX
JC SETSHO
LXI D,CMDTBL
CALL TSRCH
PUSH H
RNC
POP H
SETERR: CALL ILPRT
DB CR,LF,'SSet command error',CR,LF,0
RET
;
;
CMDTBL: DB '?'+80H
DW SETHLP
DB 'PREFI','X'+80H ; dialing prefix string
DW SETPRE
DB 'OPTION','S'+80H ; Options command string
DW SETOPT
; INSERT ADDITIONAL SSET COMMANDS HERE
DB 0 ;End of table
;
;---------------
;
; SSET <no-args> display status of all 'sset' items
;
SETSHO: CALL CRLF
LXI H,SHOTBL
SETSLP: MOV E,M
INX H
MOV D,M
INX H
MOV A,D
ORA E
JZ CRLF ;Exit thru CRLF
PUSH H
XCHG
CALL GOHL
CALL CRLF
POP H
JMP SETSLP
;
GOHL: PCHL
;
; table of Show routine addresses
;
SHOTBL: DW OPTSHO ; Option commands
DW PRESHO ; show the dialing prefix string
; Add other status routines here
DW 0 ; End of table
;
;-----------------------
;
; SSET ? print available SSET commands
;
SETHLP: CALL ILPRT
DB CR,LF,'Available SSET Commands: (UDS-212 A/D)',0
;
LXI H,CMDTBL
MVI C,PRNTBL
CALL MEX
CALL CRLF
JMP CRLF ; Exit thru CRLF
;
;--------------
;
; SSET PREFIX {string} Change the dialing prefix string, default is 'P'
; other useful prefixes are T, P9W, etc.
;
; SSET PREFIX Print current string.
; SSET PREFIX "" Set prefix to null string
; SSET PREFIX string Set prefix to 'string'
; SSET PREFIX "string" (Quotes are optional, same as above)
;
SETPRE: MVI C,SBLANK ; Isolate the space terminated string
CALL MEX
JC PRESHO ; Show current string
;
MVI B,(ENDPRE-DPREFX)-2 ; B=Max length of string
LXI H,DPREFX
MVI C,GNC ; MEX service code for get next chara
SETPLP: PUSH H
PUSH B
CALL MEX ; Fetch chara, CY=1 means end of string
JC SETPEX
; Verify chara as a valid dialing digit.
CPI '"'
CNZ CHKDGT
JNC SETP1
; Invalid digit, report error, terminate PREFIX string.
CALL ILPRT
DB CR,LF,'Invalid character in PREFIX string'
DB CR,LF,0
JMP SETPEX
; Store good digit, except quote marks
SETP1: POP B
POP H
CPI '"'
JZ SETPLP
MOV M,A ; Store new chara
INX H
DCR B ; Check for string too long
JNZ SETPLP ; get next chara
JMP SETPX1 ; Exit, if no more room
SETPEX: POP B
POP H
SETPX1: MVI M,0 ; Finished. Insert 0, insert 'RET'
INX H
MVI M,0C9H ; Insert RET instruction
; Fall thru to PRESHO
;
;---------------
;
; PRESHO Show current dial prefix string.
;
PRESHO: CALL ILPRT
DB 'Dialing prefix: ',0
CALL ILPRT
DPREFX: DB 'P' ; dialing prefix string, default = 'P'
DB 0,0,0,0,0,0,0,0,0,0,0 ; Max of 12 charas
DB 0 ; String must be null-terminated, *plus* a RET inst.
RET
ENDPRE:
;
;--------------
;
; SSET OPTIONS {string} Change the dialing options string, default is 'OF1'
; other useful options are OBx
;
; SSET OPTIONS Print current string.
; SSET OPTIONS "" Set options to null string
; SSET OPTIONS string Set options to 'string'
; SSET OPTIONS "string" (Quotes are optional, same as above)
;
SETOPT: MVI C,SBLANK ; Isolate the space terminated string
CALL MEX
JC OPTSHO ; Show current string
;
MVI B,(ENDOPT-DOPTS)-2 ; B=Max length of string
LXI H,DOPTS
MVI C,GNC ; MEX service code for get next chara
SETOLP: PUSH H
PUSH B
CALL MEX ; Fetch chara, CY=1 means end of string
POP B
POP H
JC SETOP1
CPI '"' ; ignore quote charas
JZ SETOLP
MOV M,A ; Store new chara
INX H
DCR B ; Check for string too long
JNZ SETOLP ; get next chara
;
SETOP1: MVI M,0 ; Finished. Insert 0, insert 'RET'
INX H
MVI M,0C9H ; Insert RET instruction
; Fall thru to PRESHO
;
;--------------
;
; OPTSHO
;
OPTSHO: CALL ILPRT
DB 'Modem Options : ',0
CALL ILPRT
DOPTS: DB 'OB1',0,0,0,0,0,0 ; 18 charas max, default=OB1
DB 0,0,0,0,0,0,0,0,0
DB 0
RET
ENDOPT:
;
;----------------
;
DUMMY: RET ; Do nothing routine.
;
;
;
END