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
/
MODEMS
/
MODEM7
/
M7-SCAT.AQM
/
M7-SCAT.ASM
Wrap
Assembly Source File
|
2000-06-30
|
27KB
|
1,099 lines
; M7SCAT.ASM Novation Smart-Cat overlay for MDM714 - 03/10/84
; NOTES: (1) This overlay will not work with MDM724. (CEH)
; (2) The machine dependent code in this overlay is for
; the H/Z H-89. It might need to be changed for you use.
;
; This overlay is a modification of M7RV-1.ASM, which was written for
; the Racal-Vadic VA212PA modem. That overlay had some problems with
; sending characters out to the modem too fast for it to accept them.
; This problem was corrected in the overlay for the VA3451. This overlay
; was, in turn, created from it. The delay timer routine is called TIMER5,
; and is called with a delay value in the B register. This value is
; obtained from the value that is stored at the TDELAY equate, which
; must be selected before assembly. TDELAY is the number of 100mS
; segments in the delay. The default value for the Smart-Cat is 3.
;
; A DEBUG feature had been added that can be selected by setting the
; DBUG equate to YES. This function was added mainly to permit
; debugging with full control over the DTR signal to the phone. This
; function might be desired as a permanent feature. It becomes one of
; the SET choices if selected, and appears in the SET menu.
;
; This overlay is configured for the Heath/Zenith H-89. Other machines
; will require changes to the PORT addresses and functions and the
; INITMOD routine as required for a particular UART. Also, change
; SETUPR, SETDTRH, and SETDTRL as required. Changes might also be
; needed at the CLREOS and CLRSCRN DB values. The SYSVER can be
; configured to any reasonable signon desired.
;
; Caution is advised in setting up names in the internal number library.
; The Smart-Cat does not have an offline command arrangement, as found
; in the Hayes SmartModem and The Vadic units. It reserves the character
; '%' to tell the modem that a command is comming. This character is
; not sent out to the line, and will be accepted at any time to set the
; modem into the command mode. This character is sent out by the program
; as a preamble to sending out the phone number. IT SHOULD NEVER be
; included in the library listing in ANY location. The modem also recog-
; nizes several other characters that may be placed within the phone
; number string. They are 'I' (impulse dialing - default is DTMF),
; 'P' (pause), and 'W' (wait). Also '*' and '#' (used in PABX dialing).
; All other alpha characters are discarded by the program.
; The reserved alpabetical characters may appear in the name field of
; the library listing, BUT ONLY AS LOWER CASE CHARACTERS). The program
; scans the entire library entry for the number; hence, NO RESERVED
; character or NO DIGIT may appear unless it is actually part of the
; number. If Novation ever adopts the procedure of sending control
; strings only when DTR is off, then placing the modem in UNLISTEN
; mode when DTR is on, this problem can be solved.
;
; Another consequence of this arrangement is that the modem can not be
; used for XMODEM transfers unless it is placed into the UNLISTEN mode,
; either by internal switch or by terminal mode command. After this is
; done, the power must be cycled to get it back into command mode. It
; also defaults to 7-bit characters for ASCII operation. It must be set
; for 8-bit characters for XMODEM transfers.
;
; This code may not be optimum by any means. The TDELAY value of 3
; might be reduced without causing problems. The 3.5 second delay that
; is provided at DISCONNT2 to provide plenty of time for the modem to
; recover from a disconnect might be greater than needed and slows the
; response to redialing. The disabled code at DISCONNT that was supposed
; to help reinitialize the modem prevented the program from working,
; perhaps because there was insufficient time delay to recover from it.
; the %I initialization command was not used because the modem takes
; 5-10 seconds to cycle through its routine. It might have been used
; to some advantage. If the program seems slow, the user is invited to
; experiment with these values and features.
;
; The Novation Smart-Cat modem is configured as follows:
;
; SWITCH SETTING RESULT
; 1 OFF Transparent mode not forced
; 2 ON Not quiet mode
; 3 ON Verbose responses (required here)
; 4 ON 1200 baud default data rate
; 5 OFF Auto-answer off
; 6 OFF Carrier detect not required.
;
; For PABX use, # and * may be used on the phone number command line.
; (Read the manual for use of the I, P, and W commands within the number).
;
; Initialization routines need to be changed to support your I/O devices
; are INITMOD:, SETUPR: 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 using a Zilog Z-80 SIO for I/O and a CTC for the baud
; rate clock, just change ports and time constant for CTCs
;
; A>DDT MDM7xx.COM (Any .COM version of MDM714)
; DDT VERS 2.2
; NEXT PC
; 4300 0100
; -IM7SCAT.HEX
; -R
; NEXT PC
; 4300 0000
; -G0 (or CTRL-C)
;
; A>SAVE 66 M7SCAT.COM
;
;***********************************************************************
;
; 03/10/84 - Configured for the Novation
; Smart-Cat Modem and called M7SCAT.ASM - Charles Horn
; 03/03/84 - Configured for the VA3451 and
; called M7RV3451.ASM - Charles Horn
; 11/11/83 - Renamed to M7RV-1.ASM, no changes - Irv Hoff
; 10/15/83 - First version for Racal-Vadic - Fred Willink
;
;***********************************************************************
;
; Change these equates for YOUR ports
; Change the value at MODDATP if it does not match what you are using.
;
MODDATP: EQU 0D8H ;data port for H89
MODCTL1: EQU MODDATP+5 ;status port for H89
MODRCVB: EQU 1 ;bit to test for received data
MODRCVR: EQU 1 ;modem receive ready
MODSNDB: EQU 20H ;bit to test for ready to send
MODSNDR: EQU 20H ;modem send ready bit
;
;
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
YES: EQU 0FFH
NO: EQU 0
;
DBUG: EQU YES ;Set to NO for normal use (CEH)
;
TDELAY: EQU 3 ;DELAY5 value. 1=100 mS, 2=200mS,etc.
;
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 return
PRINT: EQU 9
BDOS: EQU 0005H
;
LIBLEN: EQU 34
;
;=======================================================================
;
ORG 0100H
;
;
JMP START ;skip the data area below
;
PMMIMODEM: DB NO
SMARTMODEM: DB YES ; yes=Novation Smart-Cat. The main
; program test this byte to use the
; new routines
DS 1
CLOCK: DB 20 ;clock speed x10, up to 25.5 mhz.
;2 MHz=20, 3.68 MH=37, 4 MHz=40, etc.
MSPEED: DB 5 ;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
BYTDLY: DB 0 ;Default time to send character in
;terminal mode file transfer (0-9)
CRDLY: DB 0 ;End of line delay after CRLF in terminal
;mode file transfer (0-9).
;0=zero delay, 1=10mS, 5=50mS, 9=90mS.
NOOFCOL: DB 5 ;number of columns in directory
SETUPTST: DB YES ;yes=non-PMMI setup routine
SCRNTEST: DB YES ;yes=home cursor and clear screen
DS 29
;
;
; Handles in/out ports for data and status
;
IN$MODCTL1: IN MODCTL1 ! RET ;in modem control port
DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI
OUT$MODDATP: OUT MODDATP ! RET ;out modem data port
DB 0,0,0,0,0,0,0 ;spares if needed for non=PMMI
IN$MODDATP: IN MODDATP ! RET ;in modem data port
DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI
ANI$MODRCVB: ANI MODRCVB ! RET ;bit to test for receive ready
CPI$MODRCVR: CPI MODRCVR ! RET ;value of receive bit when ready
ANI$MODSNDB: ANI MODSNDB ! RET ;bit to test for send ready
CPI$MODSNDR: CPI MODSNDR ! RET ;value of send bit when ready
;
IN$BAUDRP: RET ! NOP ! NOP ;in baudrate port
OUT$BAUDRP: RET ! NOP ! NOP ;out baudrate port
OUT$MODCTL1: OUT MODCTL1 ! RET ;out modem control port #1
OUT$MODCTL2: RET ! NOP ! NOP ;out modem control port #2
;
LOGONPTR: DW LOGON
JMP$DIAL: JMP DIAL
JMP$DISCONNT: JMP DISCONNT
JMP$GOODBYE: JMP GOODBYE
JMP$INITMOD: JMP INITMOD
JMP$NEWBAUD: RET
DS 2
JMP$NOPARITY: RET
DS 2
JMP$PARITY: RET
DS 2
JMP$SETUPR: JMP SETUPR
JMP$SPCLMENU: RET
DS 2
JMP$SYSVER: JMP SYSVER
JMP$BREAK RET
DS 2
;
JMP$ILPRT: JMP ILPRT
JMP$INBUF: JMP INBUF
JMP$INLNCOMP: JMP INLNCOMP
JMP$INMODEM: JMP INMODEM
JMP$NXTSCRN: JMP NXTSCRN
JMP$TIMER: JMP TIMER
;
;
; Clear sequences are for H/Z H-89. Change to match
; your terminal.
;
CLREOS: CALL ILPRT
DB ESC,'J',0,0,0 ;HZ-89
RET
;.....
;
;
CLRSCRN: CALL ILPRT
DB ESC,'E',0,0,0 ;HZ-89
RET
;.....
;
;
;======================== SIGN-ON MESSAGE ==============================
;
; Send version number and date
;
SYSVER: CALL ILPRT
DB 'Version for the Novation SmartCat Modem',CR,LF
DB '(Starts at 1200 Baud)',CR,LF,0
RET
;.....
;
;
;==================== LOGON MESSAGE (IF ANY) ===========================
;
; Insert your logon message here. End with a 0 (for "CALL ILPRT").
;
LOGON: DS 59 ;UP TO 59 CHARACTERS ALLOWED
DB 0 ;TO TERMINATE THE LOGON MESSAGE
;.....
;
;
;===================== USART INITIALIZATION ============================
;
; Begining of USART dependent routines change as needed
;
;=======================================================================
;
; NOTE: The DTR line is used to control the modem
;
INITMOD: MVI A,5 ;default transfer speed to 1200 baud
STA MSPEED
DI ;turn off interrupts for init.
XRA A
OUT MODDATP+1 ;interrupt enable register
MVI A,80H ;insure out of mode to set baud rate
OUT MODDATP+3 ;line control register
OUT MODDATP+3 ;again
;
LSPSPD: MVI A,60H ;default 'LSP' speed for 1200 baud
OUT MODDATP ;register for 'LSP' speed if enabled
;
MSPSPD: MVI A,00H ;default 'MSP' speed for 1200 baud
OUT MODDATP+1 ;register for 'MSP' speed if enabled
;
MVI A,03H ;8-level, 1 stop bit, no parity
OUT MODDATP+3 ;line control register
MVI A,01H ;set 'DTR' for proper modem output level
OUT MODDATP+4 ;modem control register
EI ;restore interrupts to normal
RET
;.....
;The following routine changes the baud rate for the H89 with the SET
; command.
;
;SETUPR = SPEED CHANGE
SETUPR: LXI D,BAUDBUF ;point to input buffer for INLNCOMP
CALL JMP$ILPRT
IF DBUG
DB '(DTR ON: Type ON) (DTR OFF: Type OFF)',CR,LF
ENDIF ;DBUG
DB 'Input Baud Rate (300, 450, 600, 1200, 9600): ',0
CALL JMP$INBUF
LXI D,BAUDBUF+2
CALL JMP$INLNCOMP ;compare BAUDBUF+2 with characters below
DB '300',0
JNC OK300 ;go if got match
CALL JMP$INLNCOMP
DB '450',0
JNC OK450
CALL JMP$INLNCOMP
DB '600',0
JNC OK600
CALL JMP$INLNCOMP
DB '1200',0
JNC OK1200
CALL JMP$INLNCOMP
DB '9600',0
JNC OK9600
;
IF DBUG ;not normally needed
CALL JMP$INLNCOMP
DB 'ON',0
JNC SETDTRH
CALL JMP$INLNCOMP
DB 'OFF',0
JNC SETDTRL
ENDIF ;DBUG
;
CALL JMP$ILPRT ;all matches failed - tell operator
DB '++ Incorrect entry ++',CR,LF,BELL,0
JMP SETUPR ;try again
;
OK300: MVI A,1 ;MSPEED 300 baud value
LHLD BD300 ;get 300 baud parameters in HL
JMP LOADBD ;go load them
;
OK450: MVI A,2
LHLD BD450
JMP LOADBD
OK600: MVI A,3
LHLD BD600
JMP LOADBD
;
OK1200: MVI A,5
LHLD BD1200
JMP LOADBD
;
OK9600: MVI A,8
LHLD BD9600
;
LOADBD: STA INITMOD+1 ;store speed to show transfer time
MOV A,L ;get least significant baud rate byte
STA LSPSPD+1 ;store in INITMOD
MOV A,H ;get most signifcant baud rate byte
STA MSPSPD+1 ;store in INITMOD
JMP INITMOD ;reset H89 8250
;
;
; Table of baud rate parameters
;
BD300: DW 0180H
BD450: DW 0100H
BD600: DW 00C0H
BD1200: DW 0060H
BD9600: DW 000CH
;
BAUDBUF: DB 10,0
DS 10
;
;
;RAISE DTR TO ENABLE MODEM
;
SETDTRH: MVI A,01H
OUT MODDATP+4
RET
;
;DROP DTR TO DISABLE MODEM
;
SETDTRL: MVI A,00H
OUT MODDATP+4
RET
;
; End of USART dependent routines
;=======================================================================
;
; RACAL-VADIC DIALING ROUTINES
;
;=======================================================================
;
; Dialing routine
;
DIAL: XRA A
STA CRFLAG
STA RINGBKFL
STA RINGFLG
LXI H,0
SHLD DIALCT
LXI H,CMDBUF+1
MOV A,M
CPI 3+1
JC DIAL1 ;if only CAL was entered
;
;
; 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
MOV M,A
INX H
XCHG
LXI H,CMDBUF+6
CALL MOVER
JMP DIAL4 ;with letter or number at CMDBUF+2
;...
;
;
; 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,13
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 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
ORA A
JZ DIALEXIT ;no entry in command line exit
PUSH H
CALL DISCONNT ;hangup modem and drop DTR
POP H
INX H
MVI B,'A'
MVI E,0
MVI C,26
MOV A,M
;
DIAL5: CMP B
JZ DIAL6 ;If a letter
INR B
INR E
DCR C
JZ DIAL9 ;If a number
JMP DIAL5
;
;
; Now have a match between the requested letter and one in the library
; E-reg. holds the decimal equivalent (1-26) of the letter (A-Z).
;
DIAL6: LXI H,NUMBLIB ;come here if a letter
LXI B,LIBLEN
MOV A,E
ORA A
JZ DIAL8
;
DIAL7: MOV A,M
ORA A
JZ DIALBAD
DAD B
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 ;comes here if CAL (number)
ORA A
CNZ SMINIT ;turns DTR back on
;
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 to start dialing
CALL TIMER5 ;preset delay (CEH)
CALL SENDCHR
MVI B,30 ;wait 3 sec for SmartCat to echo number
CALL TIMER ;...and gobble whatever
;
EATIT: CALL JMP$INMODEM ;gobble anything else that remains
JNC EATIT
;
CALL ILPRT
DB ' - try #',0
LHLD DIALCT
INX H
SHLD DIALCT
CALL DECOUT
MVI A,' '
CALL TYPE
;
DIAL14: CALL JMP$INMODEM ;gobble some more if there
JNC DIAL14
JMP SMRESULT
;
DIALAGN: LDA CRFLAG
ORA A
JNZ DIALAGN1
CALL 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 TIMER
CALL CRLF
LDA RINGBKFL
ORA A
JZ DIAL4
STA CMDBUF+1
JMP DIAL4
;.....
;
;
DIALAGN2: CALL DIALBGN ;disconnect the modem
JMP MENU
;
;
; Connection has been made
;
CONMADE: CALL ILPRT
DB CR,LF,LF,'CONNECTION MADE',BELL,0
LDA CRFLAG
ORA A
JZ RETURN
CALL ILPRT
DB ' - hit any key to stop the bell ',0
;
CONMADE1: CALL STAT
JZ CONMADE2
CALL KEYIN
XRA A
JMP RETURN
;
CONMADE2: MVI B,10
CALL TIMER
MVI A,BELL
CALL TYPE
JMP CONMADE1
;.....
;
;
; Automatic dialing routine, prints the number being dialed
;
DIALA: CALL TYPE ;comes here with character in A
CPI 'R'
JNZ DIALA1
PUSH PSW
MOV A,E
CPI 1 ;was 'R' last character?
JZ RINGBK
POP PSW
;
DIALA1: MOV B,A
CALL DIALAD
MOV A,B
CPI '*' ;* is valid dial digit, must not be in name
JZ DIALA2
CPI '#' ;# is valid dial digit, must not be in name
JZ DIALA2
CPI 'I' ;I indicates pulse dialing is requested.
JZ DIALA2 ;all I's, P's, and W's
CPI 'P' ;in the library names MUST be lower case.
JZ DIALA2
CPI 'W'
JZ DIALA2
CPI '0'
RC
CPI '9'+1
RNC
;
;
; Must be a number. Send it to the modem
;
DIALA2:
MOV C,A
CALL TIMER5 ;preset delay (CEH)
JMP SENDCHR ;In main program. RETs to caller
;
;
; Print bad library number message and abort if a null is encountered.
;
DIALBAD: CALL 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,ALTDIAL1
JMP DIALAD2
;
DIALAD1: CPI '>'
RNZ
PUSH H
LXI H,ALTDIAL2
;
DIALAD2: MOV A,M
CPI '$'
JZ DIALAD3
CALL TYPE
MOV B,A
CALL TIMER5 ;preset delay (CEH)
CALL SENDCHR ;In main program
INX H
CALL STAT
JZ DIALAD2
CALL KEYIN
CPI CANCEL
JZ DIALEXIT
JMP DIALAD2
;
DIALAD3: MVI A,' '
CALL TYPE
POP H
RET
;.....
;
;
; Provide a preset delay between command characters to the modem (CEH)
; (See header for usege)
;
TIMER5:
PUSH H ;Save all registers
PUSH D
PUSH B
PUSH PSW
MVI A,TDELAY ;Get selected delay value
ANA A ;Zero?
JZ TIMER5A ;If so - no delay
MOV B,A ;Number of 100 mS intervals
CALL TIMER
TIMER5A: POP PSW ;Restore registers
POP B
POP D
POP H
RET
;.....
;
;
; Disconnect the Smartmodem from the phone line
;
GOODBYE:
DISCONNT: CALL SETDTRH ;in case it wasn't
;(disbled)LXI H,DISC0 ;send the hangup command
;(disbled)CALL SENDMDM
;
CALL TIMER5 ;delay some and
DISCONN2: CALL JMP$INMODEM ;gobble any return garbage
JNC DISCONN2
CALL SETDTRL ;now drop the DTR
MVI B,35 ;and give modem time to
CALL TIMER ;reinitialize
RET
;.....
;
;
DISC0: DB '%H',CR,'$' ;not called if disabled above but is
;..... ;used by the HANGUP routine.
;
;
; Set Smartmodem for dialing
;
SMINIT: CALL SETDTRH ;enable dtr
LXI H,SM$DAL1 ;put out the dial command
CALL SENDMDM
RET
;
SMINIT1: RET
;.....
;
;
SM$DAL1: DB '%D ','$' ;send the <CM>, DIAL command, and SPACE
;
;
; Send the string pointed to by 'HL' to both the CRT and the modem.
;
SENDOUT: PUSH H
CALL SENDNOW
POP H
MOV A,M
CPI '$'
RZ
MOV A,M
CALL TIMER5 ;preset delay between string char (CEH)
CALL OUT$MODDATP ;Call to main program
CALL TYPE
INX H
JMP SENDOUT
;.....
;
;
; Send the string pointed to by 'HL' to the modem only
;
SENDMDM: PUSH H
CALL SENDNOW
POP H
MOV A,M
CPI '$'
RZ
CALL TIMER5 ;preset delay between string char (CEH)
CALL OUT$MODDATP ;Call to main program
INX H
JMP SENDMDM
;......
;
;
; Checks for answer from Smartmodem
;
SMRESULT: LXI H,RESULBUF
PUSH H
;
SMRESUL2: CALL RCVREADY ;loop here 'till something happens
JZ SMRESUL1
CALL STAT
JZ SMRESUL2
CALL KEYIN
CPI CANCEL
JNZ SMRESUL2
MVI B,CR
CALL TIMER5 ;preset delay (CEH)
CALL SENDCHR ;Call to main program
POP H
JMP DIALEXT1
;
RESULBUF: DS 16
;
SMRESUL1: CALL JMP$INMODEM
JC SMRESUL4 ;no more characters coming
;
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
CPI '%'
JZ SMRESUL1
POP H
MOV M,A
INX H
PUSH H
JMP SMRESUL1 ;get next char for RESULBUF
;
;
; Compare the SmartCat response
;
SMRESUL4: POP H
LXI D,RESULBUF
CALL INLNCOMP
DB 'OK',0 ;should never happen in dialing
JNC DISCONNT ;....routine
CALL INLNCOMP
DB 'BUSY',0 ;busy response
JNC NUM$BUSY
CALL INLNCOMP
DB 'NO AN',0 ;no answer
JNC FAILCAL
CALL INLNCOMP
DB 'NO DI',0 ;no dialtone
JNC NO$DT
CALL INLNCOMP
DB 'RI',0 ;ringing...
JNC RING
CALL INLNCOMP
DB 'CONNECT',0 ;connection made...
JNC CONMADE
CALL INLNCOMP
DB 'CONN L',0 ;connection lost...
JNC CARLOST
;
SMDM1: JMP FAILCAL
;.....
;
;
; Carrier lost is a result of the remote end hanging up or a failure
; in the telephone circuit. This is reported by the SmartCat.
;
CARLOST: CALL CRLF
CALL ILPRT
DB 'Connection lost....',0
JMP DISCONNT
;.....
;
;
; 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 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 'P' or within 5 sec after
; the start of the modem dialing routine
;
NO$DT: CALL CRLF
CALL ILPRT
DB 'No dial tone present....',0
JMP DIALAGN
;
NUM$BUSY: CALL CRLF
CALL ILPRT
DB 'Number busy....',0
JMP DIALAGN
;
RING: CALL CRLF
CALL ILPRT
DB 'Ringing....',0
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 RINGBKFL
STA RINGFLG
SUI 1
STA CMDBUF+1
RET
;.....
;
;
; Hang up and redial
;
RINGBK1: CALL CRLF
CALL ILPRT
DB 'Ringback active - hanging up on first ring....',0
CALL HANGUP
MVI B,50
CALL TIMER
CALL CRLF
JMP DIAL9
;.....
;
;
HANGUP: MVI B,CR ;abort the dialing process
CALL SENDCHR
CALL TIMER5 ;delay some
LXI H,DISC0 ;send the hangup command
CALL SENDMDM
XRA A
STA RINGFLG ;clear flag for next dial
CALL TIMER5 ;wait some
;
HANGUP1: CALL JMP$INMODEM ;wait for the modem to complete its
JNC HANGUP1 ;response to the abort
JMP DISCONNT ;return 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 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 DONETCD
;.....
;
;
; Patch for SETUPENT: to prevent sending of Hayes commands to SmartCat
;
;
ORG 404BH
;
;
SETUPENT: LDA SETUPTST
ORA A
JZ NOTVLD
CALL JMP$SETUPR
JMP XPRT
;
NOTVLD: EQU 39A3H
;
;
; Lets fix the byebye routine it calls GOODBYE: directly and not
; through the jump vectors at the begining
;
;
ORG 39C6H
;
;
BYEBYE: LDA PMMIMODEM
ORA A
CNZ JMP$GOODBYE
LDA SMARTMODEM
ORA A
CNZ JMP$GOODBYE
CALL ILPRT
DB CR,LF,'<<Exit to CP/M>>',CR,LF,0
JMP EXIT
;.....
;
;
; Fix for ILPRT: when exits routine the stack dose not contain the cor-
; rect location of the next instruction. Shouldn't make any difference
; as points to NOP, but?
;
;
ORG 262EH
;
;
ILPRT: XTHL
;
ILPRT1: MOV A,M
INX H
ORA A
JZ ILPRT2
CALL CTYPE
JMP ILPRT1
;
CTYPE: EQU 257BH
ILPRT2 EQU 263BH
;
;
; Fix for DONETCD: the routines GOODBYE: and DISCONNT: are the same so
; no need to call twice.
;
;
ORG 2511H
;
;
DONETCD: CALL ILPRT
DB CR,LF,'<< DISCONNECTED >>',BELL,CR,LF,0
CALL JMP$GOODBYE
JMP MENU0
;
MENU0: EQU 2CB6H
;
;
; M712RACL.ASM uses these routines located in the main program
;
TIMER: EQU 0B80H ;timer routine
INLNCOMP: EQU 2A2BH ;compare routine
ILPRT: EQU 262EH ;print string routine
CRLF: EQU 2588H ;print crlf
CMDBUF: EQU 42F8H ;cmd buffer
RINGBKFL: EQU 42F4H ;ring back flag
KEYIN: EQU 25A0H ;kbd input
STAT: EQU 2595H ;console status
SENDCHR: EQU 26B7H ;send character
RCVREADY: EQU 188DH ;reciever ready
INMODEM: EQU 1AD2H ;in modem
KBDCHR: EQU 25C1H ;wait for keyboard input
CRFLAG: EQU 42E5H ;cr flag
ALTDIAL1: EQU 0BD0H ;alt dial 1
ALTDIAL2: EQU 0BE8H ;alt dial 2
TYPE: EQU 25B4H ;type
MENU: EQU 2CFDH ;menu
NUMBLIB: EQU 0C00H ;number library
BUFFER: EQU 4700H
CLRTST: EQU 41B7H ;clear screen test
MOVER: EQU 2AFAH ;move routine
MOVE: EQU 26AEH
SPACES: EQU 415DH
INBUF: EQU 2951H
DECOUT: EQU 25D4H
INBUF: EQU 2951H
NXTSCRN: EQU 4187H
RETURN: EQU 14CAH
SENDNOW: EQU 189FH
DONETCD: EQU 2511H
DIALCT: EQU 42DAH
NEWLINE: EQU 4154H
START: EQU 0F75H ;start
EXIT: EQU 2671H
XPRT: EQU 382FH
;
END