home *** CD-ROM | disk | FTP | other *** search
- ; Title 'MEX Overlay for the XEROX 820-II Computer Version 2.0'
- ;
- ;
- REV EQU 20 ;overlay revision level
- ;
- ; MEX Overlay for XEROX 820-II and XEROX 820-I Computers with
- ; external modems. The following table
- ; outlines the SET command options:
- ;
- ; Available for
- ; SET Command
- ;
- ; DELAY <n> (seconds) YES
- ; BAUD <rate> YES
- ; ORIG (originate mode) YES
- ; ANSWER (mode) YES
- ; TONE (dialing) YES
- ; PULSE (dialing) YES
- ; MONITOR (speaker on) YES
- ; QUIET (speaker off) YES
- ; PARITY (Odd, Even, None) YES
- ; STOPBITS (1, 1.5, 2) YES
- ; LENGTH (5, 6, 7, or 8) YES
- ;
- ;
- ;............
- ;
- ; This overlay includes the smartmodem dialing routine from
- ; MXO-SM10.ASM by Ron Fowler which has been slightly modified
- ; to allow programmable delay for answer. (Note that this is
- ; different from the "ATS7=nn".). Also, see the note at the
- ; ANS: label for the answer mode with the internal modem.
- ;
- ; This overlay is intended to be fully compatible with the
- ; MEX structure and should be readily upward compatible with
- ; the predicted MEX 2.0.
- ;
- ; Calling conventions for the various overlay entry points
- ; are detailed more fully in the PMMI overlay (MXO-PMxx.ASM,
- ; where xx=revision number).
- ;
- ; History:
- ;
- ; 05/30/85 Added equates for 300/1200/ or USR2400 to initialize the
- ; modem properly and take advantage of all available codes
- ; from the different modems. Added auto baud set for 1200
- ; baud fall-back when using a USR2400. Ade equates for
- ; ANCHOR 1200 for it's special ideocyncracies.
- ; Russ Pencin
- ;
- ; 05/28/85 Added the NOPAR and PARITY Mex calls. A few minor cleanups.
- ; Ron Carter
- ; 05/14/85 Appropriated all of the code from the MXO-KP28 overlay.
- ; Removed code pertaining to internal modems. Added code
- ; to support the U.S. Robotics Courier 2400 extended responce
- ; messages ( enabled by equate). This overlay will work on
- ; both 820-I and 820-II Russ Pencin TDC
- ;
- ; Credits:
- ;
- ; All of the individuals who perfected the KP28 overlay.
- ; M7KP-1 overlay structure by Irv Hoff
- ; Smartmodem dialing routine by Ron Fowler
- ;
- ; Bug Reports:
- ;
- ; Would appreciate a note of any problems be left on the
- ; THE Dallas Connection RCP/M (214) 238-1016 (300/1200/2400)
- ;
- ;
- ;------------------------------------------------------------
- ;
- ; Misc equates
- ;
- NO EQU 0
- YES EQU 0FFH
- TPA EQU 100H
- CR EQU 13
- LF EQU 10
- TAB EQU 9
- ;
- ; PLEASE SET ONLY ONE OF THE FOLLOWING THREE EQUATES TO YES !
- ;
- USR2400 EQU NO ;Yes, if using A U.S.Robotics 2400
- B1200 EQU NO ;Yes, if using a Hayes 1200 compatible
- B300 EQU NO ;Yes, if using a Hayes 300 compatible
- ANCHOR EQU YES ;Yes, if using an Anchor XII modem
- ;
- IF ANCHOR
- DIALAB EQU 041H ;special Anchor Modem Dial Abort
- ENDIF
- ;
- IF NOT ANCHOR
- DIALAB EQU CR ;Hayes and USR use CR to abort dial
- ENDIF
- ;
- ;
- ; XEROX 820-II port definitions
- ;
- EXPORT EQU 04H ;base external port
- EXTCT1 EQU EXPORT+2 ;external modem status port
- EXTDAT EQU EXPORT ;external modem data port
- BAUDRP EQU 00H ;external modem baud rate port
- ;
- ; XEROX 820-II bit definitions
- ;
- MDRCVB EQU 01H ;modem receive bit (DAV)
- MDRCVR EQU 01H ;modem receive ready
- MDSNDB EQU 04H ;modem send bit
- MDSNDR EQU 04H ;modem send ready bit
- ;
- ; MEX Service Processor
- ;
- MEX EQU 0D00H ;address of the service processor
- 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 character 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 function 2: console char out
- PRINT EQU 9 ;simulated BDOS function 9: print string
- INBUF EQU 10 ;input buffer, same structure as BDOS 10
- ;
- ;
- ;
- ORG TPA ;we begin
- ;
- DS 3 ;MEX has a JMP START here
- ;
- DS 2 ;not used by MEX
- TPULSE: DB 'T' ;T=touch, P=pulse (Used by this overlay)
- CLOCK: DB 40 ;clock speed x .1, up to 25.5 mhz.
- ;
- IF B300
- MSPEED: DB 1 ;sets display time for sending a file
- ENDIF ;0=110 1=300 2=450 3=600 4=710 ;5=1200 6=2400 7=4800 8=9600 9=19200
- ;
- IF B1200 OR ANCHOR
- MSPEED: DB 5 ;SET 1200 BAUD
- ENDIF
- ;
- IF USR2400
- MSPEED: DB 6 ;SET 2400 BAUD
- ENDIF
- ;
- BYTDLY: DB 9 ;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 9 ;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 4 ;number of directory columns
- SETFL: DB YES ;yes=user-defined SET command
- SCRTST: DB YES ;yes=if home cursor and clear screen
- ;routine at CLRSCRN
- DB 0 ;was once ACKNAK, now spare
- BAKFLG: DB YES ;yes=make .BAK file
- CRCDFL: DB YES ;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 YES ;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 NO ;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
- ;
- DS 2 ;not used
- ;
- ; Low-level modem I/O routines.
- ;
- INCTL1: JMP INC ;in modem control port
- DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI
- ;
- OTDATA: JMP OUTD ;out modem data port
- DB 0,0,0,0,0,0,0 ;spares if needed for non=PMMI
- ;
- INPORT: JMP IND ;in modem data port
- DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI
- ;
- ; Bit-test routines.
- ;
- 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
- ;
- DS 12
- ;
- LOGON: DS 2 ;needed for MDM compat, not ref'd by MEX
- DIALV: JMP DIAL
- DISCV: JMP DISCON
- GOODBV: JMP GOODBYE ;called before exit to CP/M
- INMODV: JMP NITMOD ;initialization. Called at cold-start
- NEWBDV: JMP PBAUD ;set baud rate
- NOPARV: JMP NOPAR ;set modem for no-parity
- PARITV: JMP PARITY ;set modem parity
- SETUPV: JMP SETCMD ;SET cmd: jump to a RET if you don't write SET
- SPMENV: DS 3 ;not used with MEX
- VERSNV: JMP SYSVER ;Overlay's voice in the sign-on message
- BREAKV: JMP SBREAK ;send a break
- ;
- ; MDM calls supported in MEX 1.0 but not recommended for use.
- ;
- ILPRTV: DS 3 ;replace with MEX function 9
- INBUFV: DS 3 ;replace with MEX function 10
- ILCMPV: DS 3 ;replace with table lookup funct. 247
- INMDMV: DS 3 ;replace with MEX function 255
- NXSCRV: DS 3 ;not supported by MEX (returns w/no action)
- TIMERV: DS 3 ;replace with MEX function 254
- ;
- CLREOS: LXI D,EOSMSG
- MVI C,PRINT
- CALL MEX
- RET
- ;
- CLS: LXI D,CLSMSG
- MVI C,PRINT
- CALL MEX
- RET
- ;
- ; end of fixed area
- ;
- ;------------------------------------------------------------
- ;
- ; Low level modem routine area
- ;
- INC: MVI A,10H
- OUT EXTCT1
- IN EXTCT1
- RET
- ;
- IND: IN EXTDAT
- ANI 07FH
- MASK EQU $-1
- RET
- ;
- OUTD: OUT EXTDAT
- RET
- ;
- ; Print out the overlay version
- ;
- SYSVER: CALL MILP
- DB CR,LF
- DB 1AH,1BH,')XEROX 820-II or -I with extended Set-up.'
- DB CR,LF,'Communicating '
- ;
- IF USR2400
- DB '@2400 baud----- Version '
- ENDIF
- ;
- IF B1200 OR ANCHOR
- DB '@1200 baud----- Version '
- ENDIF
- ;
- IF B300
- DB '@300 baud------ Version '
- ENDIF
- ;
- DB REV/10+'0'
- DB '.'
- DB REV MOD 10+'0'
- DB 1BH,'(',CR,LF
- ;
- IF USR2400
- DB 'Configured for U.S.Robotics Courier 2400',CR,LF
- ENDIF
- ;
- IF B1200
- DB 'Configured for Hayes compatible 1200 baud modem',CR,LF
- ENDIF
- ;
- IF B300
- DB 'Configured for Hayes compatible 300 baud modem',CR,LF
- ENDIF
- ;
- IF ANCHOR
- DB 'Configured for Anchor Signalman Mark XII',CR,LF
- ENDIF
- ;
- DB 0
- RET
- ;
- ; Break, disconnect and goodbye routines
- ;
- ;
- SBREAK: MVI A,5
- OUT EXTCT1
- LDA REG5
- ORI 10H ;SEND A BREAK TONE
- JMP GOODBYE1
- ;
- IF NOT ANCHOR
- DISCON: MVI A,5
- OUT EXTCT1 ;SEND TO THE STATUS PORT
- LDA REG5
- ANI 68H ;TURN OFF DTR
- ENDIF
- ;
- IF ANCHOR
- DISCON: MVI B,20
- MVI C,TIMER ;wait 2 seconds
- CALL MEX
- LXI H,SMATN ;send '+++'
- CALL SMSEND
- MVI B,40 ;wait 4 more seconds (Anchor is slow)
- MVI C,TIMER
- CALL MEX
- LXI H,SMDISC ;send 'ATH'
- CALL SMSEND
- MVI B,1 ;wait 1 second
- MVI C,TIMER
- CALL MEX
- RET
- ENDIF
- ;
- ;
- GOODBYE1: OUT EXTCT1
- MVI B,3 ;DELAY 300 MS.
- MVI C,TIMER
- CALL MEX
- GOODBYE: MVI A,5
- OUT EXTCT1
- LDA REG5 ;RESTORE TO NORMAL
- OUT EXTCT1
- RET
- ;
- ; Initialize RS-232 port, default modes.
- ;
- NITMOD: CALL INC ;SEE IF MODEM IS CONNECTED, I.E., RETURNING
- ANI 08H ; TO ACTIVE MODEM FROM CPM
- RNZ ;SKIP IF CONNECTED
- CALL NITSIO ;INITIALIZE EXTERNAL RS-232 PORT
- ;
- NITMOD2: LDA DFBAUD ;SET DEFAULT BAUD RATE
- OUT BAUDRP ;SEND TO BAUD GENERATOR
- LDA MONFLG ;GET MONITOR DEFAULT
- ORA A
- MVI A,'0' ;SPEAKER OFF
- JZ NITMOD4
- MVI A,'1' ;SPEAKER ON
- NITMOD4: STA SMINIT+3 ;PUT IT IN SMINIT STRING
- LDA ANSFLG ;GET MODE DEFAULT
- ORA A
- MVI A,'0' ;ORIGINATE
- JZ NITMOD5
- MVI A,'1' ;ANSWER
- NITMOD5: STA SMINIT+8 ;PUT IT IN SMINIT STRING
- LXI H,SMINIT
- SINIT: CALL SMSEND ;SEND THE INIT STRING
- SMTLP1: MVI C,INMDM ;WAIT FOR MODEM RESPONSE
- CALL MEX
- JNC SMTLP1 ;EAT EVERYTHING UNTIL SILENCE FOR
- RET ; 100 MSEC
- ;
- ; Initialize the Zilog SIO chip
- ;
- NITSIO: MVI A,00H ;Select reg. 0
- OUT EXTCT1
- LDA REG0 ;Command byte
- OUT EXTCT1
- MVI A,04H ;Select reg. 4
- OUT EXTCT1
- LDA REG4 ;Receive/transmit control byte
- OUT EXTCT1
- MVI A,03H ;Select reg. 3
- OUT EXTCT1
- LDA REG3 ;Receiver logic byte
- OUT EXTCT1
- MVI A,05H ;Select reg. 5
- OUT EXTCT1
- LDA REG5 ;Transmitter logic byte
- OUT EXTCT1
- RET
- ;
- ; Set to mask parity from input
- ;
- NOPAR: MVI A,07FH
- STA MASK
- RET
- ;
- ; Set to not mask parity from input
- ;
- PARITY: MVI A,0FFH
- STA MASK
- RET
- ;
- ; Set command processor
- ;
- SETCMD: MVI C,SBLANK ;ANY ARGUMENTS?
- CALL MEX
- JC SETSHO ;IF NOT, DISPLAY DEFAULT(S)
- LXI D,ECMDTBL
- SETCMD1: MVI C,LOOKUP
- CALL MEX ;PARSE THE ARGUMENT
- PUSH H ;SAVE ANY PARSED ARGUMENTS ON STACK
- RNC ;IF WE HAVE ONE, RETURN TO IT
- POP H ;OOPS, INPUT NOT FOUND IN TABLE
- SETERR: LXI D,SETEMS
- MVI C,PRINT
- CALL MEX
- RET
- SETEMS: DB CR,LF,07H,'SET command error',CR,LF,'$'
- ;
- ; Argument table
- ;
- ECMDTBL: DB '?'+80H ; HELP
- DW SETHELP
- DB 'ORI','G'+80H ; ORIGINATE MODE
- DW ORIG
- DB 'ANSWE','R'+80H ; ANSWER MODE
- DW ANS
- DB 'TON','E'+80H ; TONE DIALING
- DW STTONE
- DB 'PULS','E'+80H ; PULSE DIALING
- DW STPULSE
- DB 'MONITO','R'+80H ; MONITOR ON
- DW MONIT
- DB 'QUIE','T'+80H ; MONITOR OFF
- DW QUIET
- DB 'BAU','D'+80H ; SET BAUD
- DW STBAUD
- DB 'DELA','Y'+80H ; SET DELAY
- DW DELAY
- DB 'PARIT','Y'+80H ; SET PARITY
- DW STPRTY
- DB 'STOPBIT','S'+80H ; SET STOPBITS
- DW STSTOP
- DB 'LENGT','H'+80H ; SET LENGTH
- DW STBITS
- DB 0 ;TABLE TERMINATOR
- ;
- ;
- ; "SET (no args): PRINT CURRENT STATISTICS
- ;
- SETSHO: CALL MILP
- DB CR,LF
- DB 1AH,'Current SET values:',CR,LF,0
- CALL CRLF
- CALL MODEMSH
- CALL CRLF
- CALL MDSHOW
- CALL CRLF
- CALL TPSHOW
- CALL CRLF
- CALL BDSHOW
- CALL CRLF
- CALL DLSHOW
- CALL CRLF
- CALL CRLF
- CALL SHPRTY
- CALL CRLF
- CALL SHSTOP
- CALL CRLF
- CALL SHBITS
- CALL CRLF
- CALL MONSHO
- CALL CRLF
- CALL CRLF
- RET
- ;
- ; "SET ?" processor
- ;
- SETHELP: CALL MILP
- DB 1AH,CR,LF,'SET ORIG - Originate Mode'
- DB CR,LF,'SET ANSWER - Answer Mode'
- DB CR,LF,'SET TONE - Use Tone Dialing'
- DB CR,LF,'SET PULSE - Use Pulse Dialing'
- DB CR,LF,'SET DELAY - <N> seconds to wait for answer'
- DB CR,LF,'SET QUIET - Disable Speaker'
- DB CR,LF,'SET MONITOR - Enable Speaker'
- DB CR,LF,'SET PARITY - OFF <or> EVEN <or> ODD'
- DB CR,LF,'SET STOPBITS - 1 <or> 1.5 <or> 2'
- DB CR,LF,'SET LENGTH - 5 <or> 6 <or> 7 <or> 8'
- DB CR,LF,'SET BAUD - 110, 300, 600, 1200, 2400, '
- DB '4800, 9600, 19200'
- DB CR,LF,CR,LF,0
- RET
- ;
- ; "SET MODEM" processor
- ;
- EXTM: EQU $
- MODEMSH: CALL MILP
- DB 'External Modem',0
- RET
- ;
- ; "SET BAUD" processor
- ;
- STBAUD: MVI C,BDPARS ;FUNCTION CODE: PARSE A BAUDRATE
- CALL MEX ;LET MEX LOOK UP CODE
- JC SETERR ;JUMP IF INVALID CODE
- CALL PBAUD ;NO, TRY TO SET IT
- JC SETERR ;IF NOT ONE OF OURS, BOMB OUT
- BDSHOW: LDA MSPEED ;GET CURRENT BAUD RATE
- MVI C,PRBAUD ;LET MEX PRINT IT
- CALL MEX
- RET
- ;
- ; This routine sets baud rate passed as MSPEED code in A.
- ; Returns CY=1 if baud rate not supported.
- ;
- PBAUD: PUSH H ;DON'T ALTER ANYBODY
- PUSH D
- PUSH B
- MOV E,A ;MSPEED 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 ;PREP CARRY IN CASE UNSUPPORTED
- JZ PBEXIT ;EXIT IF BAD
- PUSH PSW ;NO, SET THE RATE
- MVI A,47H
- OUT BAUDRP
- POP PSW
- OUT BAUDRP
- STA DFBAUD ;SAVE CURRENT RATE
- MOV A,E ;GET MSPEED CODE BACK
- STA MSPEED ;SET IT
- ORA A ;RETURN NO ERRORS
- PBEXIT: POP B
- POP D
- POP H
- RET
- ;
- BAUDTB: DB 02H ;110
- DB 05H ;300
- DB 0 ;450 (not supported)
- DB 06H ;600
- DB 0 ;710 (not supported)
- DB 07H ;1200
- DB 0AH ;2400
- DB 0CH ;4800
- DB 0EH ;9600
- DB 0FH ;19200
- ;
- SET12: PUSH PSW
- PUSH H ;DON'T ALTER ANYBODY
- PUSH D
- PUSH B
- MVI A,47H
- OUT BAUDRP
- MVI A,07H
- OUT BAUDRP
- STA DFBAUD ;SAVE CURRENT RATE
- MVI A,05H ;GET MSPEED CODE BACK
- STA MSPEED ;SET IT
- ORA A ;RETURN NO ERRORS
- POP B
- POP D
- POP H
- POP PSW
- RET
- ;
- ; Set mode processor
- ;
- ORIG: XRA A
- STA ANSFLG ;SET ORIG FLAG
- LXI H,SMO ;SEND OUT ATS0=0
- CALL SINIT
- JMP MDSHOW
- ANS: MVI A,0FFH
- STA ANSFLG ;SET ANS FLAG
- LXI H,SMA ;SEND OUT ATS0=1
- CALL SINIT
- ;
- ;
- MDSHOW: LDA ANSFLG
- ORA A
- JZ MDORIG
- MDSHW1: CALL MILP
- DB 'Answer mode',0
- RET
- MDORIG: CALL MILP
- DB 'Originate mode',0
- RET
- SMO: DB 'ATS0=0',CR,0
- SMA: DB 'ATS0=1',CR,0
- ;
- ; Monitor control processor
- ;
- QUIET: XRA A
- STA MONFLG
- LXI H,SMQT
- CALL SINIT
- JMP MONSHO
- MONIT: MVI A,0FFH
- STA MONFLG
- LXI H,SMMON
- CALL SINIT
- MONSHO: LDA MONFLG
- ORA A
- JZ MONOFF
- CALL MILP
- DB 'Monitor Speaker: On',0
- RET
- MONOFF: CALL MILP
- DB 'Monitor Speaker: Off',0
- RET
- SMQT: DB 'ATM0',CR,0
- SMMON: DB 'ATM1',CR,0
- ;
- ; Set dial processor
- ;
- STTONE: MVI B,'T'
- JMP SDIAL1
- STPULSE: MVI B,'P'
- SDIAL1: LDA TPULSE
- CPI B
- JZ TPSHOW
- MOV A,B
- STA TPULSE
- TPSHOW: LDA TPULSE
- CPI 'T'
- JZ TPTONE
- CALL MILP
- DB 'Pulse Dialing',0
- RET
- TPTONE: CALL MILP
- DB 'Tone Dialing',0
- RET
- ;
- ; Set delay processor
- ;
- DELAY: MVI C,EVALA
- CALL MEX
- MOV A,H
- ORA A
- JNZ SETERR
- MOV A,L
- STA NDELAY
- DLSHOW: CALL MILP
- DB 'Answer Delay is ',0
- LDA NDELAY
- MOV L,A
- MVI H,0
- MVI C,DECOUT
- CALL MEX
- CALL MILP
- DB ' seconds',0
- RET
- ;
- ; SET PARITY command: reset transmit/receive parity
- ;
- ; Parity is controlled by bits 0 and 1 of
- ; the byte sent to the SIO write-register
- ; 4 as follows:
- ;
- ; Parity Bit 1 Bit 0
- ; Off - 0
- ; Odd 0 1
- ; Even 1 1
- ;
- STPRTY: MVI C,SBLANK ;check for parity code
- CALL MEX ;
- JC SETERR ;if none, print error
- LXI D,PARTBL ;check for proper syntax
- MVI C,LOOKUP
- CALL MEX
- PUSH H ;match found, go do it!
- RNC ;
- POP H ;no match: fix stack and
- JMP SETERR ; print error
- ;
- PROFF: LDA REG4 ;get register 4 byte
- ANI 0FEH ;reset bit 0
- JMP PARTB1 ;
- PREVEN: LDA REG4 ;
- ORI 003H ;set bits 0 & 1
- JMP PARTB1 ;
- PRODD: LDA REG4 ;
- ORI 001H ;set bit 0
- ANI 0FDH ;reset bit 1
- PARTB1: STA REG4 ;
- CALL NITSIO ;re-initialize the USART
- CALL SHPRTY ;print the result
- RET ;
- SHPRTY: CALL MILP ;display parity
- DB 'Parity: ',TAB,' ',0
- LDA REG4 ;
- ANI 001H ;test bit 0
- CPI 0 ;if bit0=0 then parity off
- JNZ SHPRT1 ;
- CALL MILP ;
- DB 'Off',0 ;
- RET
- SHPRT1: LDA REG4 ;
- ANI 002H ;test bit 1
- CPI 0 ;if bit1=0 then parity odd
- JNZ SHPRT2 ;
- CALL MILP ;
- DB 'Odd',0 ;
- RET ;
- SHPRT2: CALL MILP ;
- DB 'Even',0 ;
- RET
- ;
- ; SET PARITY command table
- ;
- PARTBL: DB 'OF','F'+80H ;"set parity off"
- DW PROFF
- DB 'EVE','N'+80H ;"set parity even"
- DW PREVEN
- DB 'OD','D'+80H ;"set parity odd"
- DW PRODD
- DB 0 ;<<== end of parity table
- ;
- ; SET STOPBITS command: reset number of stop bits
- ;
- ; The number of stop bits is controlled by bits
- ; 2 and 3 of the byte sent to the SIO write-
- ; register 4, as follows:
- ;
- ; Stop bits Bit 3 Bit 2
- ; 1 0 1
- ; 1.5 1 0
- ; 2 1 1
- ;
- ;
- STSTOP: MVI C,SBLANK ;check for stop bits
- CALL MEX ;
- JC SETERR ;if none, print error
- LXI D,STPTBL ;check for proper syntax
- MVI C,LOOKUP
- CALL MEX ;
- PUSH H ;match found, go do it!
- RNC ;
- POP H ;no match: fix stack and
- JMP SETERR ; print error
- ;
- STOP01: LDA REG4 ;get register 4 byte
- ANI 0F7H ;reset bit 3
- ORI 004H ;set bit 2
- JMP STSTP1 ;
- STOP02: LDA REG4 ;
- ORI 00CH ;set bits 2 and 3
- JMP STSTP1 ;
- STOP15: LDA REG4 ;
- ORI 008H ;set bit 3
- ANI 0F8H ;reset bit 2
- STSTP1: STA REG4 ;
- CALL NITSIO ;
- CALL SHSTOP ;print the result
- RET
- SHSTOP: CALL MILP ;display stop-bits
- DB 'Stop bits:',TAB,' ',0
- LDA REG4 ;
- ANI 004H ;test bit 2
- CPI 0 ;if bit2=0 then 1.5
- JNZ SHSTP1 ;
- CALL MILP ;
- DB '1.5',0 ;
- RET
- SHSTP1: LDA REG4 ;
- ANI 008H ;test bit 3
- CPI 0 ;if bit3=0 then 1
- JNZ SHSTP2 ;
- CALL MILP ;
- DB '1',0 ;
- RET
- SHSTP2: CALL MILP ;
- DB '2',0 ;
- RET
- ;
- ; SET STOPBITS command table
- ;
- STPTBL: DB '1'+80H ;"set stop 1"
- DW STOP01
- DB '2'+80H ;"set stop 2"
- DW STOP02
- DB '1.','5'+80H ;"set stop 1.5"
- DW STOP15
- DB 0 ;<<== End of stop-bits table
- ;
- ; SET LENGTH command: set bits per character
- ;
- ; The number of bits per character is controlled for
- ; the receiver circuit by bits 6 and 7 of the byte
- ; sent to the SIO write-register 3 and for the trans-
- ; mitter circuit by bits 5 and 6 of the byte sent to
- ; the SIO write-register 5. The assumption has been
- ; made here that both transmission and reception will
- ; be carried on at the same number of bits per charac-
- ; ter. The bit configurations are shown for register
- ; 3 only, but are the same for register 5:
- ;
- ; BPC Bit 7 Bit 6
- ; 5 0 0
- ; 6 1 0
- ; 7 0 1
- ; 8 1 1
- ;
- STBITS: MVI C,SBLANK ;check for bits/char
- CALL MEX ;
- JC SETERR ;if none, print error
- LXI D,BITTBL ;check for proper syntax
- MVI C,LOOKUP
- CALL MEX
- PUSH H ;match found, go do it!
- RNC ;
- POP H ;no match: fix stack and
- JMP SETERR ; print error
- ;
- BIT5: LDA REG3 ;
- ANI 0BFH ;reset bit 6
- ANI 07FH ;reset bit 7
- STA REG3 ;
- LDA REG5 ;
- ANI 0DFH ;reset bit 5
- ANI 0BFH ;reset bit 6
- JMP STBTS1 ;
- BIT6: LDA REG3 ;
- ANI 0BFH ;reset bit 6
- ORI 080H ;set bit 7
- STA REG3 ;
- LDA REG5 ;
- ANI 0DFH ;reset bit 5
- ORI 040H ;set bit 6
- JMP STBTS1 ;
- BIT7: LDA REG3 ;
- ORI 040H ;set bit 6
- ANI 07FH ;reset bit 7
- STA REG3 ;
- LDA REG5 ;
- ORI 020H ;set bit 5
- ANI 0BFH ;reset bit 6
- JMP STBTS1 ;
- BIT8: LDA REG3 ;
- ORI 040H ;set bit 6
- ORI 080H ;set bit 7
- STA REG3 ;
- LDA REG5 ;
- ORI 020H ;set bit 5
- ORI 040H ;set bit 6
- STBTS1: STA REG5 ;
- CALL NITSIO ;
- CALL SHBITS ;print the result
- RET
- SHBITS: CALL MILP ;display bits/char
- DB 'Bits/char:',TAB,' ',0
- LDA REG5 ;
- ANI 040H ;test bit 6
- CPI 0 ;if bit6=0 then 6 bpc
- JNZ SHBTS2 ;
- LDA REG5 ;
- ANI 020H ;test bit 5
- CPI 0 ;if bit5=0 then 5 bpc
- JNZ SHBTS1 ;
- CALL MILP ;
- DB '5',0 ;
- RET ;
- SHBTS1: CALL MILP ;
- DB '7',0 ;
- RET ;
- SHBTS2: LDA REG5 ;
- ANI 020H ;test bit 5
- CPI 0 ;if bit5=0 then 6 bpc
- JNZ SHBTS3 ;
- CALL MILP ;
- DB '6',0 ;
- RET ;
- SHBTS3: CALL MILP ;
- DB '8',0 ;
- RET
- ;
- ; SET LENGTH command table
- ;
- BITTBL: DB '5'+80H ;"set bits 5"
- DW BIT5
- DB '6'+80H ;"set bits 6"
- DW BIT6
- DB '7'+80H ;"set bits 7"
- DW BIT7
- DB '8'+80H ;"set bits 8"
- DW BIT8
- DB 0 ;<<== end of bpc table
- ;
- ;
- ;
- ; 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).
- ;
- ; 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 reported by modem
- ; 6 - No dial tone reported by modem
- ;
- ; <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
- ;
- ; Dialing routine
- ;
- ;
- DIAL: LHLD DIALPT ;FETCH POINTER
- CPI 254 ;START DIAL?
- JZ STDIAL1 ;JUMP IF SO
- CPI 255 ;END DIAL?
- JZ ENDIAL1 ;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
- ;
- STDIAL1: LXI H,DIALBF ;SET UP BUFFER POINTER
- SHLD DIALPT
- RET
- ;
- ; Here on an end-dial sequence
- ;
- ENDIAL1: 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
- WAITSM: MVI C,INMDM
- CALL MEX ;CATCH ANY OUTPUT FROM THE MODEM
- JNC WAITSM ;LOOP UNTIL NO MORE CHARACTERS
- ;
- ; THE FOLLOWING LOOP WAITS FOR A RESULT FROM THE MODEM.
- ;
- RESULT: LDA NDELAY ;GET DELAY COUNT
- MOV C,A
- 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
- CALL SMDMOFF ;YES, SHUT DOWN THE MODEM
- MVI A,3 ;RETURN ABORT CODE
- RET
- SMNEXT: DCR C ;NO
- JNZ SMWLP ;CONTINUE
- ;
- ; NO MODEM RESPONSE WITHIN THE TIME SPECIFIED IN SET DELAY COMMAND
- ;
- SMTIMO: CALL SMDMOFF
- 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: MVI B,0 ;PREP CONNECT CODE
- CPI 'C' ;"CONNECT"?
- RZ
- IF USR2400 OR B1200 OR ANCHOR
- CPI '1' ;NUMERIC VERSION OF "CONNECT"
- RZ
- CPI '5' ;NUMERIC VERSION OF "CONNECT 1200"
- JZ SET12 ;Insure that Baud gets set to 1200
- ENDIF
- INR B ;PREP BUSY CODE B=1
- CPI 'B'
- RZ
- IF USR2400 OR ANCHOR
- CPI '7'
- RZ
- ENDIF
- INR B ;PREP NO CONNECT MSG B=2
- CPI 'N' ;N=NO CONNECT
- RZ
- IF USR2400 OR B1200 OR ANCHOR
- CPI '3' ;NUMERIC VERSION OF "NO CONNECT"
- RZ
- ENDIF
- MVI B,4 ;PREP MODEM ERROR
- CPI 'E' ;E=ERROR
- RZ
- IF USR2400 OR B1200 OR ANCHOR
- CPI '4' ;NUMERIC VERSION OF "ERROR"
- RZ
- ENDIF
- IF USR2400
- MVI B,6
- CPI '6' ;No Dial Tone Detected
- RZ
- ENDIF
- ;
- ;
- ; 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
- ;
- ; Utility sub-routines
- ;
- 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
- ;
- SMDMOFF: MVI B,DIALAB
- MVI C,SNDCHR
- CALL MEX
- MVI B,10
- CALL MTIME
- ;
- IF ANCHOR
- RET
- ENDIF
- ;
- IF NOT ANCHOR
- JMP DISCON ;MAKE SURE IT IS OFF
- ENDIF
- ;
- MILP: MVI C,ILP
- JMP MEX
- RET
- ;
- MTIME: MVI C,TIMER
- JMP MEX
- RET
-
- COMMA: CALL MILP
- DB ', ',0
- RET
- ;
- CRLF: CALL MILP
- DB CR,LF,0
- RET
- ;
- ;
- ;==========================================================================
- ; Data Area
- ;==========================================================================
- ;
- ; Default UART parameters
- ;
- REG0: DB 00011000B ;RESET CHANNEL A
- REG3: DB 11000001B ;ENABLE RECEIVE AT 8 BITS/CHAR
- REG4: DB 01000100B ;NO PARITY, 1 STOP BIT, CLOCK X16
- REG5: DB 11101010B ;ENABLE TRANSMIT AT 8 BITS/CHAR
- ;
- ; Miscellaneous Default Data
- ;
- SMDIAL: DB 'ATDT '
- DIALBF: DS 52 ;2* 24 CHAR MAX, + CR + NULL + SLOP
- DIALPT: DS 2 ;DIAL POSITION POINTER
- EOSMSG: DB 17H,'$' ;CLEAR TO END-OF-SCREEN
- CLSMSG: DB 1AH,'$' ;CLEAR WHOLE SCREEN
- DIGIT DB 0 ;SAVE DIALED DIGIT
- MSPDSV: DB 0 ;SAVE EXTERNAL MODEM MSPEED
- ;
- IF B300
- DFBAUD: DB 05 ;5: 300, 6: 600, 7: 1200, 0EH: 9600
- ENDIF
- ;
- IF B1200 OR ANCHOR
- DFBAUD: DB 07 ;1200 BAUD
- ENDIF
- ;
- IF USR2400
- DFBAUD: DB 0AH ;2400 BAUD
- ENDIF
- ;
- IF ANCHOR
- MONFLG: DB 00H ;No monitor in ANCHOR
- SMATN: DB '+++',0 ;ANCHOR uses Smartmodem codes for disconnect
- SMDISC: DB 'ATH',CR,0
- ENDIF
- ;
- IF NOT ANCHOR
- MONFLG: DB 0FFH ;0: MONITOR OFF - 0FFH: MONITOR ON
- ENDIF
- ;
- ANSFLG: DB 0 ;0: ORIGINATE - 0FFH: ANS
- NDELAY: DB 30 ;NO. SECONDS FOR ANSWER
- ;
- IF USR2400
- SMINIT: DB 'ATM1 S0=0 S7=60 X4 V0 Q0',CR,0 ;Lot's of extended codes
- ENDIF
- ;
- IF B1200 OR ANCHOR
- SMINIT: DB 'ATM1 S0=0 S7=60 X1 V0 Q0',CR,0 ;Some extended codes
- ENDIF
- ;
- IF B300
- SMINIT: DB 'ATM1 S0=0 S7=60',CR,0 ;CAN'T USE EXTENDED COMMANDS
- ENDIF
- END
-