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
/
MXO-UR13.ASM
< prev
next >
Wrap
Assembly Source File
|
2000-06-30
|
50KB
|
1,168 lines
Title 'MEX overlay for the U.S. Robotics (S-100) 1.3'
;
;
;
REV EQU 13 ;overlay revision level
;
; MEX OVERLAY VERSION 1.3: mods by Jesse Eaton on 10/14/84
; Cleaned up break to prevent garbage after brk.
; Fixed bug in parity logic. The call to
; PARITV: restores parity mode in SIO to its
; value prior to a call to NOPARV:.
; Call to NOPARV: is transparent to SET cmd.
; NOTE: If parity is incorrect it can cause no response to initial
; NAK for R mode file transfers resulting in timeouts.
; Incorrect parity can also cause incorrect header # error.
; Normally parity = none should be specified.
;
; MEX OVERLAY VERSION 1.2: mods by Jesse Eaton on 10/11/84
; corrected error when dialing from library
; with auto baud setting.
; corrected bugs in SET command and expanded it's
; functionality to include auto answer tone and
; answer on ring #.
; SET now allows parity bit setting.
; SET now also allows setting full/half duplex.
; NOTE: The manual answer logic via "ATA" command and parity setting
; from outside the SET command may need additional work.
; Also note that you can add the S10 register in INITMSG:
; IF your ROM chip set supports it. Older versions did not.
; My USR S-100 modem is connected on a line with "call waiting"
; and will drop carrier if an incoming call generates the
; call waiting beep tone. I got a newer ROM (U3 A7.9) and tried
; to keep the carrier on by setting S10=255. It did not help
; me but it might help you on a different phone system. Older
; ROM versions will not generate a response (0-5 or Verbose) if
; any unrecognized "AT" commands sush as "ATH" or "S10" are
; are issued to the modem. You can test them in Terminal mode.
; Unknown commands are merely ignored instead of hanging the
; modem with newer proms.
;
; REQUEST: If you can shed light on any of the above comments or
; this overlay in general I can be contacted via Arpanet
; mail. My address is Eaton.HFED @ HI-MULTICS.
;
;
; MEX OVERLAY VERSION 1.1: mods to break routine 10/10/84 by Jesse Eaton
; added help ? msg to SET command
;
; MEX OVERLAY VERSION 1.0: written 04/27/84 by Ron Fowler
; U.S.Robotics Version 1.0: written 08/11/84 by Ray Broz & Mike Smith
;
; This overlay is a combination of Ron's PMMI and Smart Modem Overlays
; with the required changes to make it work with the U.S. Robotics S-100
; autodial modem.
;
;------------------------------------------------------------
;
; Misc equates
;
NO EQU 0
YES EQU NOT NO
TPA EQU 100H
NULL EQU 0
CR EQU 0DH
LF EQU 0AH
TAB EQU 09H
BELL EQU 07H
MAXWAIT EQU 60 ;maximum time to wait for connection
CLRSCN EQU YES ;set yes to use clear screen commands
ANSRNG EQU '3' ;SET RING default 1-9 (answer on ring #)
S10 EQU YES ;S10 can be used with newer model modems
;see note above. (older ROM versions will
;hang if this register is used)
;
; US Robotics port definitions
;
PORT EQU 30H ;US Robotics base port
MDMCOM EQU PORT+1 ;modem command port
MDMMOD EQU PORT+1 ;modem mode port
MDMSTS EQU PORT+1 ;modem status port
MDMDAT EQU PORT ;modem data port
;
; US Robotics bit definitions
;
MDRCVB EQU 00000010B ;modem receive bit
MDRCVR EQU 00000010B ;modem receive ready bit
MDSNDB EQU 00000001B ;modem send bit
MDSNDR EQU 00000001B ;modem send ready bit
OPARIT EQU 00010000B ;odd-parity bits
EPARIT EQU 00110000B ;even-parity bits
NPARIT EQU 00000000B ;no-parity bits
;
; US Robotics masks (v1.2 je)
;
XMITRDY EQU 00000001B ;mask for transmit ready
BRKMSK EQU 00001000B ;mask to set break
PARMSK EQU 11001111B ;mask to remove parity bits
BDMSKL EQU 01111100B ;mask for baudrate bits in mode (v1.2 je)
BDMSKH EQU 11011111B ;mask for baudrate bits in command
CARMSK EQU 10000000B ;carrier present mask
INMODE EQU 01001110B ;initial mode word
INCOMM EQU 00110111B ;initial command word
;
;
; Modem control command words
;
CLEAR EQU 'Z' ;idle mode
ANMODE EQU 'A' ;answer mode
ORIGMD EQU 'Z' ;originate mode
RESET EQU 40H ;usart reset
;
;
; MEX service processor stuff
;
MEX EQU 0D00H ;address of the service processor
INMDM EQU 255 ;get char from port to A
TIMER EQU 254 ;delay 100ms * reg B
TMDINP EQU 253 ;B=# secs to wait for char
CHEKCC EQU 252 ;check for ^C from KBD
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
RCVCHR EQU 248 ;recv a char from modem
LOOKUP EQU 247 ;table search
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
ILP EQU 240 ;inline print
DECOUT EQU 239 ;decimal output
PRBAUD EQU 238 ;print baud rate
;
;
CONOUT EQU 2 ;simulated BDOS function 2
PRINT EQU 9 ;simulated BDOS function 9
INBUF EQU 10 ;simulated BDOS function 10
;
ORG TPA ;we begin
;
;
DS 3 ;MEX has a JMP START here
;
; The following variables are located at the beginning of the program
; to facilitate modification without the need of re-assembly. They will
; be moved in MEX 2.0.
; The PMMI DB's are REQUIRED to maintain compatabilty with MEX.
;
PMODEM: DB NO ;yes=PMMI modem \ / These 2 locations are
SMODEM: DB YES ;yes=Smartmodem / \ not referenced by MEX
TPULSE: DB 'T' ;T=touch, P=pulse (not referenced by MEX)
CLOCK: DB 40 ;clock speed x .1, up to 25.5 mhz.
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 5 ;default time to send character in
;terminal mode file transfer (0-9)
;0=0 delay, 1=10 ms, 5=50 ms, 9=90 ms
CRDLY: DB 5 ;end-of-line delay after CRLF in terminal
;mode file transfer for slow BBS systems
;0=0 delay, 1=100 ms, 5=500 ms, 9=900 ms
COLUMS: DB 5 ;number of directory columns
SETFL: DB YES ;yes=user-defined SET command
SCRTST: DB NO ;yes=if home cursor and clear screen
;routine at CLRSCRN
DB 0 ;spare
BAKFLG: DB YES ;yes=make .BAK file
CRCDFL: DB NO ;yes=default to CRC checking
;no=default to Checksum checking
TOGCRC: DB YES ;yes=allow toggling of Checksum to CRC
CVTBS: DB NO ;yes=convert backspace to rub
TOGLBK: DB YES ;yes=allow toggling of bksp to rub
ADDLF: DB NO ;no=no LF after CR to send file in
;terminal mode (added by remote echo)
TOGLF: DB YES ;yes=allow toggling of LF after CR
TRNLOG: DB NO ;yes=allow transmission of logon
;write logon sequence at location LOGON
SAVCCP: DB YES ;yes=do not overwrite CCP
LOCNXT: DB NO ;yes=local cmd if EXTCHR precedes
;no=not local cmd if EXTCHR precedes
TOGLOC: DB YES ;yes=allow toggling of LOCNXTCHR
LSTTST: DB YES ;yes=allow toggling of printer on/off
;in terminal mode. Set to no if using
;the printer port for the modem
XOFTST: DB NO ;yes=allow testing of XOFF from remote
;while sending a file in terminal mode
XONWT: DB NO ;yes=wait for XON after sending CR while
;transmitting a file in terminal mode
TOGXOF: DB YES ;yes=allow toggling of XOFF testing
IGNCTL: DB YES ;yes=do not send control characters
;above CTL-M to CRT in terminal mode
;no=send any incoming CTL-char to CRT
EXTRA1: DB 0 ;for future expansion
EXTRA2: DB 0 ;for future expansion
BRKCHR: DB '@'-40H ;^@ = Send a 300 ms. break tone
NOCONN: DB 'N'-40H ;^N = Disconnect from phone line
LOGCHR: DB 'L'-40H ;^L = Send logon
LSTCHR: DB 'P'-40H ;^P = Toggle printer
UNSVCH: DB 'R'-40H ;^R = Close input text buffer
TRNCHR: DB 'T'-40H ;^T = Transmit file to remote
SAVCHR: DB 'Y'-40H ;^Y = Open input text buffer
EXTCHR: DB '^'-40H ;^^ = Send next character
;
; Equates used only by PMMI routines grouped together here.
;
PRATE: DB 250
DB 0
;
; Low-level modem I/O routines: this will be replaced with
; a jump table in MEX 2.0 (you can insert jumps here to longer
; routines if you'd like ... I'd recommend NOT putting part of
; a routine in this area, then jumping to the rest of the routine
; in the non-fixed area; that will complicate the 2.0 conversion)
;
INCTL1: IN MDMSTS ;in modem control port
RET
DB 0,0,0,0,0,0,0 ;spares if needed
;
OTDATA: OUT MDMDAT ;out modem data port
RET
DB 0,0,0,0,0,0,0 ;spares if needed
;
INPORT: IN MDMDAT ;in modem data port
RET
DB 0,0,0,0,0,0,0 ;spares if needed
;
; Bit-test routines. These will be merged with the above
; routines in MEX 2.0 to provide a more reasonable format
;
MASKR: ANI MDRCVB ! RET ;bit to test for receive ready
TESTR: CPI MDRCVR ! RET ;value of receive bit when ready
MASKS: ANI MDSNDB ! RET ;bit to test for send ready
TESTS: CPI MDSNDR ! RET ;value of send bit when ready
;
;
; Unused area: was once used for special PMMI functions,
; Now used only to retain compatibility with MDM overlays.
; You may use this area for any miscellaneous storage you'd
; like but the length of the area *must* be 12 bytes.
;
DS 12
;
; Special modem function jump table:
;
LOGON: DS 2 ;needed for MDM compatability
DIALV: JMP PDIAL ;dial digit in A
DISCV: JMP PDISC ;disconnect the modem
GOODBV: JMP DUMMY ;called before exit to CP/M
INMODV: JMP DUMMY ;initialization
NEWBDV: JMP PBAUD ;set baud rate
NOPARV: JMP NOPAR ;set modem for no-parity
;this call is transparent to SET cmd (je)
PARITV: JMP PARITY ;set modem parity
;to value prior to nopar call (je)
SETUPV: JMP SETCMD ;SET cmd:
SPMENV: DS 3 ;not used with MEX
VERSNV: JMP SYSVER ;sign-on message
BREAKV: JMP PBREAK ;send a break
;
; For MEX 2.0 compatibility, you should not try to use these
; routines, since this table will go away with MEX 2.0 (use the MEX
; service call processor instead).
;
ILPRTV: DS 3 ;replace with MEX function 9 (WHAT IS THIS?)
INBUFV: DS 3 ;replace with MEX function 10 (AND THIS?)
ILCMPV: DS 3 ;replace with MEX function 247
INMDMV: DS 3 ;replace with MEX function 255
NXSCRV: DS 3 ;not supported by MEX
TIMERV: DS 3 ;replace with MEX function 254
;
;
; Clear/screen and clear/end-of-screen. Each routine must use the
; full 9 bytes alloted (may be padded with nulls).
;
CLREOS: LXI D,EOSMSG ;clear to end of screen
MVI C,PRINT
CALL MEX
RET
;
;
CLS: LXI D,CLSMSG ;clear screen
MVI C,PRINT
CALL MEX
RET
;
; strings to clear-to-end-of-screen, and clear-screen (VISUAL 55/VT52)
EOSMSG: DB 1BH,'k','$' ;clear to end-of-screen (je)
CLSMSG: DB 1BH,'v','$' ;clear whole screen (je)
;
;
; Modem initialization.
;
NOAT: MVI A,0FFH ;set for 8251 initialization only
STA ONLYSIO ;"AT" commands are not sent
CALL CURRNT
XRA A ;reset onlysio
STA ONLYSIO
RET
NITMOD: LXI H,COMMND ;
MVI M,INMODE ;store modem setup
INX H ;for future reference
MVI M,INCOMM
CURRNT: MVI A,NULL ;entry point to resend
OUT MDMMOD ;modem command and mode
OUT MDMCOM ;words
OUT MDMMOD ;clear command register
MVI A,RESET
OUT MDMCOM ;reset usart
LDA COMMND ;current modem mode word
OUT MDMMOD
LDA COMMND+1 ;current modem command word
OUT MDMCOM
LDA ONLYSIO ;get sio only flag
;this flag was created because a full
;modem init causes interferrence with
;automatic dialing from library with
;baud rate specified. ONLYSIO is set
;and reset in baud and par routine
ORA A ;complete modem init=0
RNZ ;sio only=ff (baud or parity change)
LXI H,INITMSG ;send modem initialization string
CALL SMSEND
RET
;
; US Robotics send-break routine (v1.3 je)
;
PBREAK: LDA COMMND+1 ;get 2nd modem control byte
ORI 1FH ;set break bit (don't change speed)
OUT MDMCOM ;send it to modem
MVI B,3
MVI C,TIMER
CALL MEX ;wait for 300 ms.
CALL NOAT ;reset sio to orig values
RET
;
; The following code disconnects a call in progress.
; The US Robotics hangs itself up, and returns to
; command state.
;
PDISC: MVI B,12
MVI C,TIMER ;wait 1.2 seconds
CALL MEX
LXI H,USESC ;send '+++'
CALL SMSEND
MVI B,12 ;wait 1.2 seconds
MVI C,TIMER
CALL MEX
RET
;
USESC DB '+++',0 ;disconnect from line
;
;
; exit routine
;
DUMMY: RET ;we don't need one
;
;
; This is the DIAL routine called by MEX to dial a digit.
;
; The following status codes are returned in the A register
;
; 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
;
; <No other codes should be returned after an end-dial sequence>
;
;
PDIAL: 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 PNTR
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,CR ;STUFF END-OF-LINE INTO BUFFER
INX H ;FOLLOWED BY TERMINATOR
MVI M,0
LDA TPULSE ;GET OVERLAY'S TOUCH-TONE FLAG
STA SMDIAL+3 ;PUT INTO STRING
LXI H,SMDIAL ;POINT TO DIALING STRING
CALL SMSEND ;SEND IT
MVI C,INMDM
CALL MEX ;CATCH ANY OUTPUT FROM THE MODEM
;
; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM FOR UP TO
; 60 SECONDS: YOU MAY CHANGE THE EQUATE VALUE FOR THE FOLLOWING LINE
; "MODE ANS" WILL (TEMP) SET IT TO 20 SECONDS DUE TO THE MODEM'S RESTRICTION
;
RESULT: MVI C,MAXWAIT ;<<== MAXIMUM TIME TO WAIT FOR RESULT
SMWLP: 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 SMTEST ;JUMP IF MODEM HAD A CHAR
PUSH B ;NO, TEST FOR CONTROL-C FROM CONSOLE
MVI C,CHEKCC
CALL MEX
POP B
JNZ SMNEXT ;IF NOT, JUMP
MVI B,CR ;YES, SHUT DOWN THE MODEM
MVI C,SNDCHR
CALL MEX
MVI A,3 ;RETURN ABORT CODE
RET
SMNEXT: DCR C ;NO
JNZ SMWLP ;CONTINUE
;
; ONE MINUTE WITH NO MODEM RESPONSE (OR NO CONNECTION)
;
SMTIMO: MVI A,2 ;RETURN TIMEOUT CODE
RET
;
; MODEM GAVE US A RESULT, CHECK IT
;
SMTEST: ANI 7FH ;IGNORE ANY PARITY
CALL SMANAL ;TEST THE RESULT
JC RESULT ;GO TRY AGAIN IF UNKNOWN RESPONSE
MOV A,B ;A=RESULT
PUSH PSW ;SAVE IT
SMTLP: MVI C,INMDM ;EAT ANY ADDITIONAL CHARS FROM SMARTMODEM
CALL MEX
JNC SMTLP ;UNTIL 100MS OF QUIET TIME
POP PSW ;RETURN THE CODE
RET
;
SMANAL: STA ANSBD ;store baud rate for "MODE ANS" (v1.3 je)
MVI B,0 ;prep connect code
CPI '1' ;numeric version of "CONNECT"
RZ
CPI '5' ;numeric version of "CONNECT 1200"
RZ
INR B ;US Robotics can't do busy
INR B ;prep no connect code B=2
CPI '3' ;numeric version of "NO CONNECT"
RZ
INR B ;we already checked for ^C
INR B ;prep modem error B=4
CPI '4' ;numeric version of "ERROR"
RZ
ANSBD: DB 0 ;1=300, 5=1200 baud for "MODE ANS" (v1.3 je)
;
; UNKNOWN RESPONSE, RETURN CARRY TO CALLER. BUT FIRST,
; FLUSH THE UNKNOWN RESPONSE LINE FROM THE MODEM.
;
WTLF: CPI LF ;LINEFEED?
STC
RZ ;END IF SO
MVI C,INMDM ;NO. GET NEXT CHAR
CALL MEX
JNC WTLF ;UNLESS BUSY, LOOP
RET
;
; SMARTMODEM UTILITY ROUTINE: SEND STRING TO MODEM
;
SMSEND: MVI C,SNDRDY ;WAIT FOR MODEM READY
CALL MEX
JNZ SMSEND
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 SMSEND
;
; DATA AREA
;
INITMSG:DB 'AT' ;modem attention (carrier must be off)
DB 'V' ;verbosity
DB '0' ;verbose=1, terse=0
DB 'X' ;extended result to be sent?
DB '1' ;yes=1 (0-5), no=0 (0-4)
;
; *** DO NOT CHANGE THE ABOVE SETTINGS
;
DB 'M' ;monitor speaker
SPKFLG: DB '1' ;on=2, until carrier=1, off=0
DB 'F' ;duplex
DUPFLG: DB '1' ;full=1, half=0
DB 'S0=' ;answer on ring
ONRING: DB '0' ;#=1-9 (usr max=255), no ans=0
;modified by ANSRNG equate
;SET ORIG resets this byte to '0'
DB 'S7=' ;carrier wait time
TIMFLG: DB '15' ;15, 20, 30 or 60 seconds
IF S10 ;use only with newer modems ***********
DB 'S10=255' ;(see change notes)
ENDIF ;S10 ;used to determine carrier dropout time
DB CR ;usr command mode terminator
DB 0 ;initmsg stopper
ANSNOW: DB 'ATA',CR,0 ;enter answer mode (send ans tone)
;(wait for carrier from orig modem)
SMDIAL: DB 'ATD' ;dial attention
DB 'T' ;tone=T, pulse=P, ","=2 sec delay (in dialbf)
DIALBF: DS 52 ;2* 24 CHAR MAX, + CR + NULL + SLOP
DIALPT: DS 2 ;DIAL POSITION POINTER
;
; Set baud-rate code in A . US Robotics supports only four rates,
; which are validated here.
;
PBAUD: PUSH H ;don't alter anybody
PUSH D
PUSH B
MOV E,A ;code to DE
MVI D,0
LXI H,BAUDTB ;offset into table
DAD D
MOV A,M ;fetch code
ORA A ;0? (means unsupported code)
STC ;return error for STBAUD caller
JZ PBEXIT ;exit if so
MOV B,A
LXI H,MSPEED
MOV M,E
LXI H,BAUDCD
DAD D
MOV C,M
LXI H,COMMND
MOV A,M
ANI BDMSKL ;modified 110 baud for 2 stop bits (v1.2 je)
ORA B
MOV M,A
INX H
MOV A,M
ANI BDMSKH
ORA C
MOV M,A
CALL NOAT ;init 8251 sio only
PBEXIT: POP B ;all done
POP D
POP H
RET
;
; table of baud rate divisors for supported rates
; modified 110 for 2 stop bits. (v1.2 je)
;
BAUDTB: DB 83H,3,0,2,0 ;110,300,450,610,710 (v1.2 je)
DB 2,0,0,0,0 ;1200,2400,4800,9600,19200
BAUDCD: DB 0,20H,0,0,0
DB 20H,0,0,0,0
;
; Sign-on message
;
SYSVER: CALL NITMOD ;init modem with defaults
LXI D,SOMESG
MVI C,PRINT
CALL MEX
CARRSH: CALL CRLF
LXI D,NOMESG
CALL CARRCK
MVI C,PRINT
CNZ MEX
LXI D,CARMSG
MVI C,PRINT
CALL MEX
RET
;
SOMESG: DB 'U.S. Robotics (S-100) overlay V. '
DB REV/10+'0'
DB '.'
DB REV MOD 10+'0'
DB ':',CR,LF,'$'
;
NOMESG: DB 'NO $'
CARMSG: DB 'CARRIER PRESENT',CR,LF,LF,'$'
;
; Check US Robotics for carrier present (Z=yes)
;
CARRCK: IN MDMSTS
CMA
ANI CARMSK
RET
;
; Newline on console
;
CRLF: MVI A,CR
CALL TYPE
MVI A,LF ;fall into TYPE
;
; type char in A on console
;
TYPE: PUSH H ;save 'em
PUSH D
PUSH B
MOV E,A ;align output character
MVI C,CONOUT ;print via MEX
CALL MEX
POP B
POP D
POP H
RET
;
; Data area
;
ERRFLG: DB 0 ;connection error code
COMMND: DS 2 ;current modem status storage
ORGFLG: DB '0' ;initiate to "normal"(originate)
;'0'=orig,'1'-'9'=ring,ffh='ATA'
ONLYSIO: DB 0 ;ff=don't send "AT" commands to modem
;
;------------------------------------------------------------
;
; The remainder of this overlay implements a very versatile
; SET command (v1.2 je)
;
; Control is passed here after MEX parses a SET command.
;
SETCMD: MVI C,SBLANK ;any arguments?
CALL MEX
JC SETSHO ;if not, go print out values
LXI D,CMDTBL ;parse command
CALL TSRCH ;from table
PUSH H ;any address on stack
RNC ;if we have one, execute it
POP H ;nope, fix stack
SETERR: LXI D,SETEMS ;print error
MVI C,PRINT
CALL MEX
RET
;
; SET with parameters is not allowed if carrier is present (v1.2 je)
;
SETNOK:
IF CLRSCN ;clear screen cmds
CALL CLS
ENDIF ;CLRSCN
LXI D,SETNOM ;set not allowed with carrier present
MVI C,PRINT
CALL MEX
MVI A,0FFH ;prevent clearing screen at setsho
STA NOCLR
CALL SETSHO ;display current parameters
XRA A ;reset flag
STA NOCLR
RET
NOCLR: DB 0 ;prevents clearing screen in setsho if=ff
SETNOM: DB CR,LF,'The requested SET command is not allowed',CR,LF
DB 'when a carrier is present. The connection',CR,LF
DB 'must be broken first.',CR,LF,LF,'$'
;
SETEMS: DB CR,LF,'SET command error',CR,LF,'$'
;
; SET command table ... note that tables are constructed of command-
; name (terminated by high bit=1) followed by word-data-value returned
; in HL by MEX service processor LOOKUP. Table must be terminated by
; a binary zero.
;
; Note that LOOKUP attempts to find the next item in the input stream
; in the table passed to it in HL ... if found, the table data item is
; returned in HL; if not found, LOOKUP returns carry set.
;
CMDTBL: DB '?'+80H ;"set ?"
DW STHELP
DB 'BAU','D'+80H ;"set baud"
DW STBAUD
DB 'MOD','E'+80H ;"set mode"
DW STMODE
DB 'SPEA','K'+80H ;"set speaker on/off"
DW STSPKR
DB 'WAI','T'+80H ;"set time"
DW STTIME
DB 'PA','R'+80H ;"set parity"
DW STPAR
DB 'DUPL','X'+80H ;"set full/half duplex"
DW STDUP
;
DB 0 ;<<=== table terminator
;
; SET <no-args>: print current statistics
;
SETSHO:
IF CLRSCN ;clear screen cmds
LDA NOCLR ;see if we already have an err msg on screen
ORA A
JNZ STSHO ;yes, don't clear screen
CALL CLS ;clear screen
ENDIF ;CLRSCN
STSHO: CALL CARRSH ;show carrier present/not present
LXI H,SHOTBL ;get table of SHOW subroutines
SETSLP: MOV E,M ;get table address
INX H
MOV D,M
INX H
MOV A,D ;end of table?
ORA E
RZ ;exit if so
PUSH H ;save table pointer
XCHG ;adrs to HL
CALL GOHL ;do it
CALL CRLF ;print newline
MVI C,CHEKCC ;check for console abort
CALL MEX
POP H ;it's done
JNZ SETSLP ;continue if no abort
RET
;
GOHL: PCHL
;
; table of SHOW subroutines
;
SHOTBL: DW BDSHOW ;baud rate
DW MDSHOW ;mode
DW SPSHOW ;speaker
DW TMSHOW ;wait time
DW PSHOW ;parity
DW DSHOW ;duplex
DW HLSHOW ;v1.1 je
DW 0 ;<<== table terminator
;
; SET ? processor
;
STHELP:
IF CLRSCN ;clear screen
CALL CLS
ENDIF ;CLRSCN
LDA RINGNO ;get number of rings
STA HLRING ;set it in help message
LXI D,HLPMSG
MVI C,PRINT
CALL MEX
RET
;
; Display SET ? message (v1.1 je)
;
HLSHOW: LXI D,HLQMSG
MVI C,PRINT
CALL MEX
RET
HLQMSG: DB CR,LF,'Type SET ? for help.',CR,LF,'$'
;
; The help message
;
HLPMSG:
IF NOT CLRSCN
DB CR,LF
ENDIF ;NOT CLRSCN
DB 'SET COMMAND (recommended defaults first) '
DB '"U.S. ROBOTICS VERSION"',CR
DB LF,LF,'SET BAUD 1200 (1200 baud + 1 stop bit)'
DB CR,LF,' 600 (600 baud + 1 stop bit)'
DB CR,LF,' 300 (300 baud + 1 stop bit)'
DB CR,LF,' 110 (110 baud + 2 stop bits)'
DB CR,LF,'SET MODE ORIG (orignate mode) *'
DB CR,LF,' ANS (answer tone sent immediately) *'
DB CR,LF,' RING (answer on ring #'
HLRING: DB '3'
DB ') *'
DB CR,LF,'SET SPEAK TEMP (speaker on until carrier) *'
DB CR,LF,' ON (speaker always on) *'
DB CR,LF,' OFF (speaker always off) *'
DB CR,LF,'SET WAIT 15 (15 seconds) *'
DB CR,LF,' 20 (20 seconds) *'
DB CR,LF,' 30 (30 seconds) *'
DB CR,LF,' 60 (60 seconds) *'
DB CR,LF,'SET PAR NO (no parity + 8 data bits)'
DB CR,LF,' ODD (odd parity + 7 data bits)'
DB CR,LF,' EVEN (even parity + 7 data bits)'
DB CR,LF,'SET DUPLX FULL (full duplex) *'
DB CR,LF,' HALF (half duplex) *',CR,LF
DB CR,LF,'* = CARRIER CANNOT BE PRESENT FOR THESE COMMANDS'
DB CR,LF,'$'
;
; SET BAUD processor (v1.2 je)
; carrier may be on or off
;
STBAUD: MVI C,BDPARS ;function code
CALL MEX ;let MEX look up code
JC SETERR ;invalid code?
CALL PBAUD ;no, try to set it
JC SETERR ;not-supported code
BDSHOW: CALL ILPRT ;display baud
DB 'BAUD RATE: ',0
LDA MSPEED
MVI C,PRBAUD ;use MEX routine
CALL MEX
RET
;
; SET MODE processor (v1.2 je)
; carrier must be off
;
STMODE: CALL CARRCK ;is carrier present?
JZ SETNOK ;z=yes, SET MODE not allowed with carrier
LXI D,MODTBL ;lookup next input item in table
CALL TSRCH
JC SETERR ;if not found, error
MOV A,L ;L='0' orig, L=ff ans, L='1'-'9' ring #
STA ORGFLG
CPI '0' ;orgflg contains ascii 0-9 or ffh
JZ MDORIG ;originate
JM MDANS ;answer
MDRING: LDA RINGNO ;get ring # to answer on
STA ONRING ;store in modem init string
STA RINGNB ;store in display string
CALL CURRNT ;send modem init string
JMP MDSHOW ;display mode
MDORIG: MVI A,'0' ;set for no ans in init string
STA ONRING
CALL CURRNT ;send modem init string
MDSHOW: CALL ILPRT ;show mode
DB 'MODE: ',0
LDA ORGFLG ;orig='0', ans=ff, ring='1'-'9'
CPI '0' ;orgflg contains ascii 0-9 or ffh
JZ ORIGP ;display orig
CALL ILPRT
DB 'Answer on Ring #'
RINGNB: DB '3' ;default is 3 rings
DB 0 ;stopper
RET
ORIGP: CALL ILPRT
DB 'Originate'
DB 0
RET
;
; This routine is used primarily for remote ends which have
; originate only modems without autodialing. You must issue
; the "ATA" command before the carrier is detected from remote.
; It is temporary in nature and will revert to RING or ORIGINATE
; the next time an "AT" command other than "ATA" is sent to the
; modem, depending on mode prior to last "ATA".
; NOTE: THE BAUD RATE MAY CHANGE UPON CONNECTION (v1.3 je)
;
MDANS: CALL ILPRT ;answer mode
DB 'MODE: '
DB 'Sending Answer Tone "Now"',CR,LF
DB ' '
DB 'Remote Modem must send Originate',CR,LF
DB ' '
DB 'tone within '
MDTIME: DB '15' ;modifying S7 in modem had no effect
;on the "ATA" cmd so I removed the
;logic to change this value (je)
DB ' seconds!',CR,LF
DB ' '
DB 'Originator Determines Baud Rate.'
DB CR,LF,0
LXI H,ANSNOW ;send answer tone now
CALL SMSEND ;send "ATA" to modem
;
; This logic reset the orgflg back to orig or ring since the
; manual answer mode is a one shot operation.
; Then the result of the ANS command is reported and baud rate
; switching is done if required. (v1.3 je)
;
LDA ONRING ;get init string rings
STA ORGFLG ;set orgflg to orig or ring (not ans)
MVI A,20 ;set max time for connection
STA RESULT+1
CALL RESULT ;wait for modem response
PUSH PSW ;save return code
MVI A,MAXWAIT ;reset to max of 60 sec
STA RESULT+1
POP PSW ;retrieve return code
CPI 0 ;connection?
JZ ACNCT ;yes
CPI 2 ;timeout?
JZ ANCNCT ;yes
CPI 3 ;ctl-c abort?
JZ KABORT ;yes
CALL ILPRT ;modem reported error
DB CR,LF,BELL
DB 'USR Modem Returned "FAILED" Status',CR,LF,LF,0
RET
ACNCT: LDA ANSBD ;get connected baud rate
SBI 30H ;convert from dec to hex
STA MSPEED ;set speed byte
CPI 1 ;300 baud?
JNZ A1200 ;no, must be 1200
CALL ILPRT
DB CR,LF,BELL,'300',0
JMP ACOM
A1200: CALL ILPRT
DB CR,LF,BELL,'1200',0
ACOM: CALL ILPRT
DB ' BAUD CONNECTION DETECTED',CR,LF
DB 'You may enter Terminal (T/L/E) Mode.',CR,LF,LF,0
CALL PBAUD ;change baud rate in sio
RET
ANCNCT: CALL ILPRT ;no connection
DB CR,LF,BELL,'TIMEOUT -'
DB ' No Orignate Tone Received.',CR,LF,LF,0
RET
KABORT: CALL ILPRT ;ctl-c abort by user
DB CR,LF,'ABORTED',CR,LF,LF,0
RET
;
; MODE argument table
;
MODTBL: DB 'ORI','G'+80H ;"set mode orig"
DB '0',0
DB 'AN','S'+80H ;"set mode ans"
DB 0FFH,0
DB 'RIN','G'+80H ;"answer on ring #"
RINGNO: DB ANSRNG ;default is set for you taste at equate
DB 0
;
DB 0 ;<<=== table terminator
;
; The speaker on the US Robotics board can get annoying
; so we included this routine to turn it off. If you
; are truly masochistic you can turn it on all the time.
; Carrier must be off.
;
STSPKR: CALL CARRCK ;check for carrier
JZ SETNOK ;z=yes, command not allowed
LXI D,SPKTBL ;lookup next input item in table
CALL TSRCH
JC SETERR ;if not found, error
MOV A,L
STA SPKFLG
CALL CURRNT ;send init buff
SPSHOW: CALL ILPRT ;show speaker setting
DB 'SPEAKER: ',0
LDA SPKFLG
CPI '0'
JZ SDOFF
CPI '2'
JZ SDON
CALL ILPRT
DB 'On Until Carrier Detected',0
RET
SDOFF: CALL ILPRT
DB 'Always Off',0
RET
SDON: CALL ILPRT
DB 'Always On',0
RET
;
; SPEAKER argument table
;
SPKTBL: DB 'OF','F'+80H ;"set sound off"
DB '0',0
DB 'O','N'+80H ;"set sound on"
DB '1',0
DB 'TEM','P'+80H ;"set sound on until carrier"
DB '2',0
;
DB 0 ;<<=== table terminator
;
;
; The US Robotics allows for soft setting of the time to
; wait for answer from the other end. It can be anywhere
; in the range of 0 to 255 seconds. We have arbitrarily
; chosen 15, 20, 30 and 60 seconds... If you don't like
; these times... change them.
; Carrier must be off.
;
STTIME: CALL CARRCK ;is carrier on?
JZ SETNOK ;z=yes, SET WAIT not allowed if carrier
LXI D,TIMETBL ;lookup next input item in table
CALL TSRCH
JC SETERR ;if not found, error
SHLD TIMFLG
CALL CURRNT ;send modem init string
TMSHOW: CALL ILPRT ;show time setting
DB 'WAIT TIME: ',0
LDA TIMFLG
CPI '1'
JZ TM15
CPI '2'
JZ TM20
CPI '3'
JZ TM30
CALL ILPRT
DB '60 Seconds',0
RET
TM30: CALL ILPRT
DB '30 Seconds',0
RET
TM20: CALL ILPRT
DB '20 Seconds',0
RET
TM15: CALL ILPRT
DB '15 Seconds',0
RET
;
; TIME argument table
;
TIMETBL: DB '1','5'+80H ;"set time 15"
DB '15'
DB '2','0'+80H ;"set time 20"
DB '20'
DB '3','0'+80H ;"set time 30"
DB '30'
DB '6','0'+80H ;"set time 60"
DB '60'
;
DB 0 ;<<=== table terminator
;
; Parity setting logic. Even and Odd parity setting requires
; 7 data bits. No parity requires 8 data bits. The number
; of stop bits is determined by baud rate.
; As of version 1.2 I don't know if there is outside entry other
; than through the SET command. If there is a need to come in
; externally entry can be made at PARITY: and NOPAR:.
; An assumption is being made at the PARITY: entry. (see comments there)
; Carrier may be on or off.
;
; CAUTION: NO PARITY MUST BE SPECIFIED IF OBJECT FILES ARE TO BE TRANSFERRED
;
STPAR: LXI D,PARTBL ;lookup next input item in table
CALL TSRCH
JC SETERR ;if not found, error
MOV A,L
STA PARFLG
CPI '0'
JZ NONE8 ;no parity
CPI '1'
JZ ODD7 ;odd parity
EVEN7: LDA COMMND ;get mode byte
ORI 38H ;send even parity with 7 data bits
ANI 0FBH
JMP PARCOM ;go to common routine
NONE8: LDA COMMND ;get mode byte
ORI 0CH ;send no parity with 8 data bits
ANI 0CFH
JMP PARCOM ;go to common routine
ODD7: LDA COMMND ;get mode byte
ORI 18H ;send odd parity with 7 data bits
ANI 0DBH
PARCOM: STA COMMND ;resave mode byte
CALL NOAT ;init of 8251 only
PSHOW: CALL ILPRT ;show parity setting
DB 'PARITY: ',0
LDA PARFLG
CPI '0'
JZ PARNO
CPI '1'
JZ PARODD
PAREVN: CALL ILPRT
DB 'Even',0
RET
PARNO: CALL ILPRT
DB 'None',0
RET
PARODD: CALL ILPRT
DB 'Odd',0
RET
;
; Set parity to its original value after call to nopar (v1.3 je)
; Called by MEX (transparent to SET cmd)
;
PARITY: CALL NOAT ;init sio only (no AT cmd)
RET
;
; MEX calls this routine to set modem for no parity.
; This is transparent to the SET command (v1.3 je)
;
NOPAR: LDA COMMND ;get current parity setting
PUSH PSW ;save it
ANI PARMSK ;clear parity enable bit
ORI NPARIT ;set for no parity
STA COMMND ;this is temporary in sio until set parity
;changes it to its previous value (je)
CALL NOAT ;init sio only (no AT cmd)
POP PSW ;get original sio mode byte
LXI H,COMMND ;hl = mode byte upon return
MOV M,A ;restore mode byte
RET
PARFLG: DB '0' ;default to no parity
;
; PARITY argument table
;
PARTBL: DB 'NON','E'+80H ;"set no parity"
DB '0',0
DB 'OD','D'+80H ;"set odd parity"
DB '1',0
DB 'EVE','N'+80H ;"set even parity"
DB '2',0
;
DB 0 ;<<=== table terminator
;
; Full or Half Duplex setting (v1.2 je)
; Normally Full duplex is all that is required but in
; case there is a need to change it you can.
; Carrier must not be present.
;
STDUP: CALL CARRCK ;check for carrier present
JZ SETNOK ;z=yes, SET DUPLX is not allowe
LXI D,DUPTBL ;lookup next input item in table
CALL TSRCH
JC SETERR ;if not found, error
MOV A,L
STA DUPFLG
CALL CURRNT ;send init buff including "AT" cmd
DSHOW: CALL ILPRT ;show duplex setting
DB 'DUPLEX: ',0
LDA DUPFLG
CPI '0'
JZ HDPLX ;half duplex
CALL ILPRT
DB 'Full',0
RET
HDPLX: CALL ILPRT
DB 'Half',0
RET
;
; DUPLEX argument table
;
DUPTBL: DB 'FUL','L'+80H ;"set full duplex"
DB '1',0
DB 'HAL','F'+80H ;"set half duplex"
DB '0',0
;
DB 0 ;<<=== table terminator
;
; Compare next input-stream item in table @DE; CY=1
; if not found, else HL=matched data item
;
TSRCH: MVI C,LOOKUP ;get function code
JMP MEX ;pass to MEX processor
;
; Print in-line message ... blows away C register
;
ILPRT: MVI C,ILP ;get function code
JMP MEX ;go do it
;
;
END