home *** CD-ROM | disk | FTP | other *** search
- ; M7QX-3.ASM -- Epson QX-10 overlay file for VALDOCS 1.1X 06/06/84
- ;
- ; Overlay file for MDM730 (and later), Epson QX-10, and the
- ; D.C. Hayes Smartmodem 300 or 1200, US Robotics modems, the
- ; Anchor Automation Signalman Mark XII, Prometheus, or similiar
- ; modems which use the DC Hayes Smartmodem protocols. It is
- ; designed to be used with a .SYS extent as a VALDOCS applica-
- ; tion from the <M>enu of Applications, <R>un specific program,
- ; or <E>xit to TPM options. It will also run under TPM-II
- ; without VALDOCS (using a .SYS or .COM extent) or under
- ; CP/M A2.21 or B2.20 if given a .COM file extent. It
- ; incorporates the special SET menu advantages of Bruce
- ; Ratoff's ATXMODEM, plus it offers the ability to toggle
- ; on or off the 7th bit mask. This permits the use of QX-10
- ; graphics when desired, but retains the ability to use this
- ; same program on mainframes such as Compuserve. This overlay
- ; is specifically tailored to MDM730 and makes direct calls to
- ; addresses in the main program. You must change these addresses
- ; to use this overlay with a later MDM7XX series program.
- ; For standardization among the four operating systems used on
- ; the QX-10, I have chosen ^B for the sendbreak character,
- ; and ^Z to transmit control characters above ^M to the remote.
- ;
- ;******************************************************************************
- ;
- ; NOTE: All improvements to this overlay intended for distribution must be
- ; compatible with VALDOCS. Send all updates to either the Technical RCPM/RBBS
- ; (313)846-6127, or CompuServe CP/MIG (PCS-47), Area XA0 along with a message
- ; addressed to the SYSOP. They, in turn, will make official release. If you
- ; wish to discuss the overlay, leave a message for Chris Hopkins, 71026,1407 on
- ; CompuServe's EpsOnLine SIG (PCS-19), or EMAIL.
- ;
- ;******************************************************************************
- ;
- ; Switch settings for the D.C. Hayes Smartmodem and Smartmodem 1200 are:
- ;
- ; SW1 SW2 SW3 SW4 SW5 SW6 SW7 SW8
- ; UP ANY ANY ANY ANY UP ANY* DN
- ;
- ; These settings are compatible with those used in VALDOCS MAIL to prevent
- ; unnecessary changing of settings. This program resets switches 2 thru 5
- ; by software, so their physical settings have no effect.
- ;
- ; *Depends on type of telephone jack used.
- ;.....
- ; You will want to look this file over carefully. There are a number of
- ; options that you can use to configure the program to suit your taste.
- ;
- ; Edit this file for your preferences then follow the "TO USE:" example
- ; shown below.
- ;
- ; TO USE: First edit this file, filling in answers for your own
- ; preferences. Assemble with ASM.COM or equivalent
- ; assembler to obtain a file named M7QX-3.HEX. Then
- ; use DDT to overlay the HEX file on the original .COM file:
- ;
- ; A>DDT MDM730.COM
- ; DDT VERS 2.2
- ; NEXT PC
- ; 4A00 0100
- ; -IM7QX-3.HEX (note the "I" command)
- ; -R ("R" loads in the .HEX file)
- ; NEXT PC
- ; 4A00 0000
- ; -G0 (return to CP/M)
- ; A>SAVE 73 QXMDM3.SYS (now have a modified .SYS file)
- ; (can also make a .COM file now)
- ;
- ; = = = = = = = = = = = = = = = = = = =
- ; 06/06/84 - Renamed to M7QX-3.ASM and added addresses for MDM740.ASM.
- ; - Added BYEBYE messages for CP/M, TPM and VALDOCS.
- ; - Corrected error in hardware initiation that forgot to tell the
- ; QX-10 baudrate timer the speed in use according to the CMOS.
- ; - Corrected timing problem in VALDOCS during ^T text transfer.
- ; - Corrected GOODBYE and SENDBRK to reset to parameters that were in
- ; use before the break. Previously, it always reset to 8 bit words,
- ; 1 stop bit and no parity.
- ; - Corrected timing problems for VALDOCS by placing CLOCKSET routine
- ; at START. Previously, timing set did not occur until INITMOD.
- ; -Chris Hopkins
- ; 04/15/84 - Removed macros to allow assembly using ASM.COM, and revised to
- ; work with MDM730.
- ; - Added cursor control routines for signon.
- ; - Added toggle in SET command to allow selection of QX-10 graphics
- ; for use in the terminal mode. Subsequent selection of 7-bit
- ; words or 8-bit words with the 7th bit masked cancels the
- ; graphics selection. - Chris Hopkins
- ; 03/11/84 - Renamed to M7QX-2.ASM and revised to work with MDM727.
- ; - Added subroutines to provide [ Using TPM ], [ Using CP/M ] and
- ; [ Using VALDOCS ] statements following signon message. - CH
- ; 01/22/84 - Revised M712QS.ASM to fit MDM718-720, renamed overlay to
- ; M7QX-1.ASM to conform to new format.
- ; - Added sendbreak routine and revised signon - Chris Hopkins
- ; 10/13/83 - Checks for CP/M or TPM to prevent crashing CP/M
- ; with TPM backdoor calls. - BRR
- ; 10/11/83 - Detects presence of SYSINIT and uses its interrupt-driven
- ; serial routines if present. - BRR
- ; 10/10/83 - Stop bits, parity, word size in SETUPR - BRR
- ; 08/14/83 - Cosmetic changes only for MDM712 - Bruce Ratoff
- ; 07/26/83 - QX-10 version created from GP file - Bruce Ratoff
- ; 07/01/83 - Revised to work with MDM711 - Irv Hoff
- ; 07/01/83 - Revised to work with MDM710 - Irv Hoff
- ; 05/27/83 - Updated to work with MDM709 - Irv Hoff
- ; 05/15/83 - Revised to work with MDM708 - Irv Hoff
- ; 04/11/83 - Updated to work with MDM707 - Irv Hoff
- ; 04/04/83 - First version of this file - Irv Hoff
- ;
- ; = = = = = = = = = = = = = = = = =
- ;
- BELL: EQU 07H ;bell
- CR: EQU 0DH ;carriage return
- ESC: EQU 1BH ;escape
- LF: EQU 0AH ;linefeed
- ;
- YES: EQU 0FFH
- NO: EQU 0
- ;
- ;------------------------------------------------------------------------------
- ; The following equates are addresses in the main program of MDM730.COM. If
- ; this overlay is adapted to a later version, these may have to be changed.
- ;
- PMMIMENU: EQU 09EDH ;addr of SPCLMENU in basic program
- ;available as extra patch area.
- ;For MDM730 use 09EDH
- ;For MDM740 use 0A78H
- ;Must match byte of basic program.
- ;
- START: EQU 13CAH ;addr of START in basic program.
- ;For MDM730-740 use 13CAH
- ;
- SPEED4: EQU 1A7EH ;addr of SPEED4 in basic program.
- ;For MDM730-740 use 1A7EH
- ;
- TERML: EQU 1F01H ;addr of TERML in basic program.
- ;Use 1F01 for MDM730-740
- ;
- GRAFMASK: EQU TERML+10 ;addr of 7th bit mask in TERML
- ;
- BYEBYE: EQU 404DH ;addr of BYEBYE in basic program.
- ;For MDM730-740 use 404DH
- ;
- ;------------------------------------------------------------------------------
- ; The following information is specific to the Epson QX-10.
- ;
- PORT: EQU 011H ;QX-10 base port
- MODCTL1: EQU PORT+2 ;Modem control port
- MODDATP: EQU PORT ;Modem data in port
- MODDATO: EQU PORT ;Modem data out port
- TPORTS: EQU 007H ;Baud rate setup port
- TPORTC: EQU 006H ;Baud rate counter port
- MODRCVB: EQU 1 ;Bit to test for receive
- MODRCVR: EQU 1 ;Value when ready
- MODSNDB: EQU 4 ;Bit to test for send
- MODSNDR: EQU 4 ;Value when ready
- CRAM: EQU 35 ;CMOS RAM baud rate storage
- MOSADR: EQU 3DH ;CMOS RAM address port
- MOSDAT: EQU 3CH ;CMOS RAM data port
- ;
- ORG 100H
- ;.....
- ; Change the clock speed to suit your system
- ;
- DS 3 ;(for "JMP START" instruction)
- PMMIMODEM: DB NO ;yes=PMMI S-100 Modem, no=non-PMMI 103H
- AUTODIAL: DB YES ;yes=HAYES Smartmodem or lookalike 104H
- TOUCHPULSE: DB 'T' ;T=touch, P=pulse (Smartmodem-only) 105H
- CLOCK: DB 40 ;clock speed in MHz x10, 25.5 MHz max. 106H
- ;20=2 MHh, 37=3.68 MHz, 40=4 MHz, etc.
- MSPEED: DB 1 ;When booting up, the program will set 107H
- ;this flag to match the QX-10's current
- ;CMOS baud rate.
- BYTDLY: DB 5 ;0=0 delay, 1=10ms, 5=50ms - 9=90ms 108H
- ;default time to send character in ter-
- ;minal mode file transfer for slow BBS.
- CRDLY: DB 5 ;0=0 delay, 1=100ms, 5=500ms - 9=900ms 109H
- ;default time for extra wait after CRLF
- ;in terminal mode file transfer
- NOOFCOL: DB 5 ;number of DIR columns shown 10AH
- SETUPTST: DB YES ;yes=user-added SETUP routine 10BH
- SCRNTEST: DB YES ;Cursor control routine 10CH
- RETRY: DB YES ;yes=reset the error limit to try again 10DH
- ;no=abort after 10 consecutive errors
- ;(ARPANET users should select yes)
- BAKUPBYTE: DB YES ;yes=change any file same name to .BAK 10EH
- CRCDFLT: DB YES ;yes=default to CRC checking 10FH
- TOGGLECRC: DB YES ;yes=allow toggling of CRC to Checksum 110H
- CONVRUB: DB NO ;yes=convert rub to backspace 111H
- TOGGLERUB: DB YES ;yes=allow toggling of rub to backspace 112H
- ADDLF: DB NO ;no=no LF after CR to send file in 113H
- ;terminal mode (added by remote echo)
- TOGGLELF: DB YES ;yes=allow toggling of LF after CR 114H
- TRANLOGON: DB YES ;yes=allow transmission of logon 115H
- ;write logon sequence at location LOGON
- SAVCCP: DB NO ;yes=do not overwrite CCP 116H
- LOCONEXTCHR: DB NO ;yes=local command if EXTCHR precedes 117H
- ;no=external command if EXTCHR precedes
- TOGGLELOC: DB YES ;yes=allow toggling of LOCONEXTCHR 118H
- LSTTST: DB YES ;yes=printer available on printer port 119H
- XOFFTST: DB NO ;yes=checks for XOFF from remote while 11AH
- ;sending a file in terminal mode
- XONWAIT: DB NO ;yes=wait for XON after CR while 11BH
- ;sending a file in terminal mode
- TOGXOFF: DB YES ;yes=allow toggling of XOFF checking 11CH
- IGNORCTL: DB NO ;yes=CTL-chars above ^M not displayed 11DH
- TPMFLG: DB NO ;set by the program, always no here 11EH
- VALFLG: DB NO ;set by the program, always no here 11FH
- BRKCHR: DB 'B'-40H ;^B = Send 300 ms. break tone 120H
- ;(CP/M A & B don't permit CONTROL-@)
- NOCONNCT: DB 'N'-40H ;^N = Disconnect from the phone line 121H
- LOGCHR: DB 'L'-40H ;^L = Send logon 122H
- LSTCHR: DB 'P'-40H ;^P = Toggle printer 123H
- UNSAVE: DB 'R'-40H ;^R = Close input text buffer 124H
- TRANCHR: DB 'T'-40H ;^T = Transmit file to remote 125H
- SAVECHR: DB 'Y'-40H ;^Y = Open input text buffer 126H
- EXTCHR: DB 'Z'-40H ;^Z = Send next character 127H
- ;(CP/M A doesn't permit CONTROL-^ while
- ;..CP/M B requires SHIFT CONTROL-^ to get
- ;..the character, so we standardized with this)
- DS 2 ; 128H
- ;.....
- ; Handles in/out ports for data and status:
- ;
- IN$MODCTL1: IN MODCTL1 ! RET ;in modem control port 12AH
- ;INITMOD makes this a jump to SYSI$STAT
- ;when run under VALDOCS
- DS 7 ;spares
- OUT$MODDATP: OUT MODDATP ! RET ;out modem data port 134H
- ;INITMOD makes this a jump to SYSI$OUT
- ;when run under VALDOCS
- DS 7 ;spares
- IN$MODDATP: IN MODDATP ! RET ;in modem data port 13EH
- ;INITMOD makes this a jump to SYSI$IN
- ;when run under VALDOCS
- DS 7 ;spares
- ANI$MODRCVB: ANI MODRCVB ! RET ;bit to test for receive ready 148H
- CPI$MODRCVR: CPI MODRCVR ! RET ;value of rcv. bit when ready 14BH
- ANI$MODSNDB: ANI MODSNDB ! RET ;bit to test for send ready 14EH
- CPI$MODSNDR: CPI MODSNDR ! RET ;value of send bit when ready 151H
- DS 6 ;bypasses PMMI routines 156H
- ;
- OUT$MODCTL1: RET ! NOP ! NOP ;out modem control port #1 15AH
- OUT$MODCTL2: RET ! NOP ! NOP ;out modem control port #2 15DH
- ;
- LOGONPTR: DW LOGON ;for user message. 160H
- DS 3 ;do not change 162H
- JMP$DISCONNT: RET ! NOP ! NOP ;not needed with QX-10/Smartmdm 165H
- JMP$GOODBYE: JMP GOODBYE ; 168H
- JMP$INITMOD: JMP INITMOD ;go to user written routine 16BH
- RET ! NOP ! NOP ;(by-passes PMMI routine) 16EH
- RET ! NOP ! NOP ;(by-passes PMMI routine) 171H
- RET ! NOP ! NOP ;(by-passes PMMI routine) 174H
- JMP$SETUPR: JMP SETUPR ; 177H
- JMP$SPCLMENU: JMP SPCLMENU ; 17AH
- JMP$SYSVER: JMP SYSVER ; 17DH
- JMP$BREAK: JMP SENDBRK ;INITMOD makes this a 180H
- ;jump to SYSI$BREAK when run
- ;under VALDOCS
- ; Do not change the following six lines. They go to specific locations in the
- ; main program, not the overlay.
- ;
- JMP$ILPRT: DS 3 ; 183H
- JMP$INBUF: DS 3 ; 186H
- JMP$INLNCOMP: DS 3 ; 189H
- JMP$INMODEM: DS 3 ; 18CH
- JMP$NXTSCRN: DS 3 ; 18FH
- JMP$TIMER: DS 3 ; 192H
- ;.....
- ; Routine to clear to end of screen. If using CLREOS and CLRSCRN, set
- ; SCRNTEST to YES at 010CH (above). Room allowed for four bytes. Last zero
- ; needed for stopping the string display. Any extra zeros just act as NOPs.
- ;
- CLREOS: CALL JMP$ILPRT ; 195H
- DB ESC,059H,0,0,0 ;Hex code for ESC Y 198H
- RET ; 19DH
- ;
- CLRSCRN: CALL JMP$ILPRT ; 19EH
- DB 01AH,0,0,0,0 ;Hex for Control Z 1A1H
- RET ; 1A6H
- ;.....
- ; NOTE: You can change the SYSVER and LOGON messages to be longer or
- ; shorter. The following overlay routines must terminate before 0400H.
- ;
- SYSVER: CALL CPMMODE ;Set CP/M emulation mode 1A7H
- CALL CLRSCRN ;
- CALL JMP$ILPRT ;
- DB ESC,3DH,2AH,3DH,'WELCOME TO QX-MODEM'
- DB ESC,3DH,2CH,3DH,'For the Epson QX-10'
- DB ESC,3DH,2EH,3FH,0
- RET
- ;.....
- ; You can put a message at this location which will be called up with
- ; CTL-L if TRANLOGON has been set TRUE. In this overlay version, approximately
- ; 8 bytes are available for LOGON message. A common usage of this feature is
- ; 'FIRSTNAME;LASTNAME;PASSWORD' separated by semi-colons for use in signing
- ; on to remote bulletin boards with only one keystroke. The logon capability
- ; has lost much of its importance with the addition of function keys to the
- ; program. The length of this overlay has left little room for the logon
- ; sequence. End with a 0.
- ;
- LOGON: DB 'Hello',CR,LF,0
- ;.....
- ; Sets DTR low for 300ms
- ;
- GOODBYE: MVI A,5 ;point to register 5
- OUT MODCTL1
- LDA TXBYT ;fetch the most recent TXBYT sent
- ANI 7FH ;set the DTR bit low
- ;
- GOODBYE1: OUT MODCTL1 ;send it
- MVI B,3 ;delay 300ms
- CALL JMP$TIMER
- MVI A,5 ;point to register 5
- OUT MODCTL1
- LDA TXBYT ;restore previous condition by sending
- OUT MODCTL1 ;..the original TXBYT
- RET
- ;.....
- ; This is a continuation of BYEBYE from end of overlay.
- ;
- BYEBYE1: RZ ;if CP/M, back to main program
- LDA VALFLG ;if not CP/M, is it VALDOCS?
- ORA A
- CZ TPMMSG ;no? then print TPM
- CNZ VALMSG ;if yes, then VALDOCS
- RET ;back to main program
- ;.....
- ; The following SENDBRK routine sends a break tone to reset some time-share
- ; computers, such as BRS After Dark and Dialog's Knowledge Index. However, it
- ; will usually cause an immediate disconnect when on line with an RBBS/RCPM
- ; system. This routine is automatically replaced by SYSI$BREAK if run under
- ; VALDOCS.
- ;
- SENDBRK: MVI A,5 ;point to register 5
- OUT MODCTL1
- LDA TXBYT ;get TXBYT currently in use
- ORI 10H ;turn sendbreak bit on
- JMP GOODBYE1
- ;.....
- ; This routine shuttles from TPM to CP/M
- ;
- CPMMODE: LXI D,0CCCCH ;Put request for CP/M in D reg
- BDOSMODE: MVI C,12
- JMP 5
- ;......
- ; This routine sets the CLOCK equate for computations at the very beginning of
- ; the main program.
- ;
- CLOCKSET: LXI H,0 ;Set HL to 0 since these three bytes
- ;were stolen from main program START
- ;subroutine
- CALL CPMMODE ;get system version
- MOV A,E
- CPI 'T' ;is this CP/M?
- RNZ ;if CP/M, quit here
- MVI A,YES ;store flag saying TPM in use
- STA TPMFLG
- LXI D,0
- CALL BACKDOOR ;if VALDOCS SYSINIT module is not
- ;loaded, returns 0FFH in A register
- INR A
- RZ ;If no SYSINIT, quit here
- MVI A,YES ;tell flag that VALDOCS is loaded
- STA VALFLG
- MVI A,2 ;Replace clock value with this to
- STA CLOCK ;..reduce apparent speed for overhead
- ;..calls if using VALDOCS
- RET
- ;.....
- ; This routine checks to see what system the program is running under. It
- ; announces it at signon and, if VALDOCS SYSINIT module is loaded, it rewrites
- ; code to direct the use of backdoor subroutines needed by VALDOCS.
- ;
- INITMOD: CALL JMP$ILPRT
- DB '[ Using ',0
- LDA TPMFLG ;is this CP/M or TPM?
- ORA A
- PUSH PSW
- CZ CPMMSG ;if CP/M, go get message
- POP PSW
- JZ NOSYSINIT ;..and go back to work
- LDA VALFLG ;we're this far, must be TPM or VALDOCS
- ORA A ;which is it?
- PUSH PSW
- CZ TPMMSG ;if TPM, go get message
- POP PSW
- JZ NOSYSINIT ;..and then skip ahead
- CALL VALMSG ;now this far, must be VALDOCS
- MVI A,0C3H ;Mod modem I/O to use BACKDOOR routines
- STA IN$MODCTL1
- STA OUT$MODDATP
- STA IN$MODDATP
- LXI H,SYSI$STAT
- SHLD IN$MODCTL1+1
- LXI H,SYSI$OUT
- SHLD OUT$MODDATP+1
- LXI H,SYSI$IN
- SHLD IN$MODDATP+1
- LXI H,SYSI$BREAK
- SHLD JMP$BREAK+1
- MVI A,2
- STA ANI$MODSNDB+1
- STA CPI$MODSNDR+1
- MVI A,11H ;load op code for LXI D and then store
- STA SPEED4 ;..speed to insure correct...
- LXI H,1275 ;..timing is used under VALDOCS...
- SHLD SPEED4+1 ;..for ^T text transfers
- MVI A,0 ;put NOP to fill
- STA SPEED4+3
- LXI D,4FFH ;Re-enable BACKDOOR interrupt stuff
- CALL BACKDOOR
- ;.....
- ; If SYSINIT was not loaded, program comes here to see if carrier is present
- ; (DCD active), and then reset the modem if not.
- ;
- NOSYSINIT: CALL JMP$ILPRT ;send cursor to bottom of page
- DB ESC,3DH,36H,20H,0
- MVI A,CRAM ;point to QX-10 CMOS baud rate address
- DI ;disable interrupts
- OUT MOSADR ;
- IN MOSDAT ;get CMOS status byte
- EI ;enable interrupts
- ANI 0FH ;set flags & strip off all but baudrate
- CPI 3 ;operating at 300 baud?
- JNZ TEST1200 ;if not, see if 1200
- LXI H,CSPDTBL+12 ;if 300, point to that speed in table
- NOSYSINIT1: MOV E,M ;load baudrate into D-E
- INX H
- MOV D,M
- XCHG ;now put it in H-L
- CALL FINDRATE ;tell the timer and set MSPEED flag
- NOSYSINIT2: CALL SIOINIT ;send out default SIO initialization
- CALL IN$MODCTL1 ;look at status of DCD
- ANI 8 ;is connection active?
- RNZ ;if yes, initialization already done
- LXI H,MDMRESET
- CALL SEND ;Reset the modem
- RET
- ;.....
- ; If baudrate set on CMOS was not 300, program comes here to see if it is 1200
- ; baud. If not, a prompt is called to allow user to set either 300 or 1200.
- ; The Smartmodem can only be addressed at those two speeds.
- ;
- TEST1200: CPI 5 ;is it 1200 baud?
- PUSH PSW ;save the flags
- CNZ AGAIN ;if not, means we weren't at 300 or
- ;1200, so get a SET prompt to fix.
- POP PSW ;bring flags back
- JNZ NOSYSINIT2 ;continue with new speed from prompt
- LXI H,CSPDTBL+20 ;was 1200, so point to 1200 in table
- JMP NOSYSINIT1 ;back to work
- ;.....
- ; This series of bytes initialize the Smartmodem, and are taken from the
- ; owner's manual.
- ;
- MDMRESET: DB 'ATE1M1Q0V1S0=0S11=55',CR,0
- ;E1=set switch 4, echo on in local cmd
- ;M1=speaker on til carrier detect
- ;Q0=set switch 3, result codes sent
- ;V1=set switch 2, word result codes
- ;S0=0=set switch 5, mdm will not answer
- ;S11=55=touchtone dial speed
- ;CR,0=send it. Must end with a zero
- ;
- CPMMSG: CALL JMP$ILPRT
- DB 'CP/M ]',0
- RET
- ;
- TPMMSG: CALL JMP$ILPRT
- DB 'TPM ]',0
- RET
- ;
- VALMSG: CALL JMP$ILPRT
- DB 'VALDOCS ]',0
- RET
- ;.....
- ; This subroutine is used in place of SENDBRK when running under VALDOCS
- ;
- SYSI$BREAK: PUSH D
- LXI D,07FFH ;send break
- CALL BACKDOOR
- MVI B,3 ;wait 300ms
- CALL JMP$TIMER
- LXI D,0700H ;turn sendbreak off
- CALL BACKDOOR
- POP D
- RET
- ;.....
- ; This subroutine is called in place of IN MODCTL1 when running under VALDOCS
- ;
- SYSI$STAT: PUSH D
- MVI D,3 ;Get SYSINIT serial port status byte
- ;and return it in the A register
- CALL BACKDOOR
- POP D
- RET
- ;
- ;.....
- ; This subroutine is called in place of OUT MODDATP when running under VALDOCS
- ;
- SYSI$OUT: PUSH D
- PUSH PSW
- MOV E,A ;get char to send from A and move to E
- MVI D,2 ;send it
- CALL BACKDOOR
- POP PSW
- POP D
- RET
- ;
- ;......
- ; This subroutine is called in place of IN MODDATP when running under VALDOCS
- ;
- SYSI$IN: PUSH D
- MVI D,1 ;receive a character, put it in A
- CALL BACKDOOR
- POP D
- RET
- ;.....
- ; This back door subroutine (BDS03) provides support for the B side of
- ; the 7201 MPSCC, otherwise known as the "serial port", when using VALDOCS.
- ;
- BACKDOOR: PUSH H ;Save unused registers
- PUSH B
- PUSH D ;Save BACKDOOR call arguments
- LXI D,0AAAAH ;Set TPM mode
- CALL BDOSMODE
- POP D ;Get back BACKDOOR arguments
- LXI B,(3 SHL 8)+40 ;Function codes for BACKDOOR serial
- ;routines, 3 (BDS03) in the B reg
- ;and 40 in the C reg.
- CALL 5 ;Call TPM
- PUSH PSW ;Save result of BACKDOOR call
- CALL CPMMODE ;Go back into CP/M mode
- POP PSW ;Restore BACKDOOR result
- POP B ;Restore registers
- POP H
- RET
- ;.....
- ; Sends out the serial I/O initialization
- ;
- SIOINIT: PUSH H
- MVI C,MODCTL1 ;modem control port
- MVI B,MINLEN ;length of modem init table
- LXI H,MINTBL ;point to init table
- DB 0EDH,0B3H ;sneak in Z80 op code to OTIR the init
- ;table
- POP H
- RET
- ;.....
- ; Modem initialization table. Default settings: 8 bit words, no parity, 1 stop
- ; bit, transmit and receive enabled.
- ;
- MINTBL: DB 4 ;point to register 4
- PARBYT: DB 44H ;the parity byte
- DB 3 ;point to register 3
- RXBYT: DB 0C1H ;the receive byte
- DB 5 ;point to register 5
- TXBYT: DB 0EAH ;the transmit byte
- MINLEN: EQU $-MINTBL
- ;
- EVNPAR: LXI B,0FC03H
- SETPAR: LDA PARBYT
- ANA B
- ORA C
- STA PARBYT
- SETPXX: CALL SIOINIT
- JMP GDLUP ;go back for another parameter
- ;
- ODDPAR: LXI B,0FC01H
- JMP SETPAR
- ;
- NOPAR: LXI B,0FC00H
- JMP SETPAR
- ;
- ONESTOP: LXI B,0F304H
- JMP SETPAR
- ;
- TWOSTOP: LXI B,0F30CH
- JMP SETPAR
- ;
- BIT7: MVI A,7FH ;load mask in A
- STA GRAFMASK ;store it in main program TERML routine
- MVI A,41H
- STA RXBYT
- MVI A,0AAH
- BIT7XX: STA TXBYT
- JMP SETPXX
- ;
- GRAFON: MVI A,0FFH ;load mask in A
- STA GRAFMASK ;store it at TERML, lets 7th bit pass
- JMP BIT8
- ;
- GRAFOFF: MVI A,7FH ;load mask in A
- STA GRAFMASK ;store it at TERML, stops 7th bit
- BIT8: MVI A,0C1H
- STA RXBYT
- MVI A,0EAH
- JMP BIT7XX
- ;.....
- ; Make modem's speed flag match QX-10's
- ;
- SETMSPEED: MVI A,CRAM ;point to baudrate address
- DI ;stop interrupts
- OUT MOSADR
- IN MOSDAT ;get status byte
- EI ;ok to interrupt now
- ANI 0FH ;strip all but baudrate, set flags
- LXI H,MSPDTBL ;load HL with table address
- ADD L ;make the conversion
- MOV L,A ;
- JNC SETMSPD2 ;carry? if not, jump
- INR H ;if yes, increment MSB of pointer
- ;
- SETMSPD2: MOV A,M ;move table value to register A
- STA MSPEED ;store it at MSPEED
- RET
- ;
- ;.....
- ; This table gives MSPEED values for QX-10 CMOS baud rate values.
- ; Note that lower rates do not match and approximations are used.
- ;
- MSPDTBL: DB 0,0,0,1,3,5,6,7,8,2
- ;
- TBLADR: DW 0
- ;
- ;******************************************************************************
- ; NOTE: All above overlay routines must end before 0400H
- ;******************************************************************************
- ;
- ORG PMMIMENU ;pop over to second patch area
- ;(overlays PMMI special menu)
- ;.....
- ; Clock speed table. This gives the timer chip divisors for each baud rate.
- ; Must be in same order as MSPDTBL.
- ;
- CSPDTBL: DW 110,1135 ; 0
- DW 135,924 ; 1
- DW 150,832 ; 2
- DW 300,416 ; 3
- DW 600,208 ; 4
- DW 1200,104 ; 5
- DW 2400,52 ; 6
- DW 4800,26 ; 7
- DW 9600,13 ; 8
- DW 450,277 ; 9
- ;
- NXTARG: CALL SCNTOB
- RC
- ;
- SCNNB: LDAX D
- CPI ' '
- RNZ
- INX D
- DCR B
- JNZ SCNNB
- STC
- RET
- ;
- SCNTOB: LDAX D
- CPI ' '
- RZ
- RC
- INX D
- DCR B
- JNZ SCNTOB
- STC
- RET
-
- ;
- KEYBUF: DB 10
- DB 0,0,0,0,0,0
- DB 0,0,0,0,0,0
- ;.....
- ; Send a string to the Smartmodem
- ;
- SEND: MOV A,M ;Get a character
- INX H
- ORA A ;End of the string?
- RZ
- MOV C,A ;No, send it
- CALL PUT
- CALL JMP$INMODEM ;Eat echo
- JMP SEND
- ;
- PUT: CALL IN$MODCTL1 ;Get modem status
- CALL ANI$MODSNDB ;Test send bits
- CALL CPI$MODSNDR
- JNZ PUT
- MOV A,C
- JMP OUT$MODDATP
- ;.....
- ; The following routine changes the baud rate, parity and word length for
- ; the QX-10 from the SET menu.
- ;
- SETUPR: LDAX D ;Look at passed-in byte count
- CPI 5 ;Enuf for possible baud rate?
- JC AGAIN ;No, prompt for one
- MOV B,A ;Save byte count
- INX D ;Point to first byte
- CALL NXTARG ;Skip to next argument
- MOV A,B
- JNC SETUP1
- ;
- AGAIN: CALL JMP$ILPRT
- DB 'Enter Baud Rate and/or Options: ',0
- LXI D,KEYBUF
- CALL JMP$INBUF ;read baud rate from console
- LXI D,KEYBUF+1
- LDAX D
- INX D
- ;
- SETUP1: MOV L,A ;Force null at end of buffer
- MVI H,0
- DAD D
- MVI M,0
- LXI H,0
- ;
- GDLUP: LDAX D
- INX D
- ORA A
- JZ GDONE
- CPI ' ' ;Ignore spaces
- JZ GDLUP
- SUI '0' ;Try for digit
- JC BADRATE
- CPI 10
- JNC BADRATE
- MOV B,H
- MOV C,L
- DAD H
- DAD H
- DAD B
- DAD H
- MVI B,0
- MOV C,A
- DAD B
- JMP GDLUP
- ;
- BADRATE: ADI '0' ;Fix bias from conversion routine
- CPI 'E' ;Check option letters for
- JZ EVNPAR ;Even parity
- CPI 'O'
- JZ ODDPAR ;Odd parity
- CPI 'N'
- JZ NOPAR ;No parity
- CPI 'S'
- JZ ONESTOP ;One stop bit
- CPI 'T'
- JZ TWOSTOP ;Two stop bits
- CPI 'A'
- JZ BIT7 ;ASCII mode (7 data bits)
- CPI 'B'
- JZ GRAFOFF ;Binary mode (8 data bits) with 7th bit
- ;masked
- CPI 'G'
- JZ GRAFON ;8 data bits, but with no masking to
- ;permit use of QX-10 graphics in
- ;terminal mode
- CALL JMP$ILPRT ;Anything else gets error
- DB CR,LF,'[ Invalid rate ]',CR,LF,0
- JMP AGAIN
- ;
- GDONE: MOV A,H
- ORA L
- JZ QUIT
- ;.....
- ; Enter here with baud rate in HL to set baud rate of timer.
- ;
- FINDRATE: PUSH H ;save baud rate
- LXI H,CSPDTBL ;load table address
- SHLD TBLADR ;store it there
- POP H ;get baud back
- LXI B,0A00H
- ;
- CLP: PUSH H
- LHLD TBLADR ;get address back
- MOV E,M ;move value to E
- INX H ;advance pointer
- MOV D,M ;other half in D
- INX H
- XTHL
- XCHG ;switch
- ORA A ;prepare for true subtract by clearing
- DB 0EDH,52H ;sneak in Z80 op code to SBC HL,DE
- XCHG ;switch again
- XTHL
- JZ DOIT
- INX H
- INX H
- SHLD TBLADR
- POP H
- INR C
- DCR B
- JNZ CLP
- JMP BADRATE
- ;
- DOIT: POP D
- MVI A,0B6H
- OUT TPORTS
- MOV A,M
- INX H
- OUT TPORTC
- MOV A,M
- OUT TPORTC
- CALL IN$MODDATP
- CALL IN$MODDATP
- MVI A,CRAM
- DI ;Disable interrupts
- OUT MOSADR
- MOV A,C
- OUT MOSDAT
- EI ;Enable interrupts
- ;
- QUIT: JMP SETMSPEED
- ;.....
- ; This special menu is unavailable without putting the actual address of
- ; SPCLMENU (in the basic program) in the overlay above at the PMMIMENU equate.
- ;
- SPCLMENU: CALL JMP$NXTSCRN
- CALL JMP$ILPRT
- DB ' Additional SET options for QX-10',cr,lf,lf
- DB ' Parity:',cr,lf
- DB ' E - Even',cr,lf
- DB ' O - Odd',cr,lf
- DB ' N - None',cr,lf,lf
- DB ' Stop bits:',cr,lf
- DB ' S - Single (1)',cr,lf
- DB ' T - Two (2)',cr,lf,lf
- DB ' Data bits (word length):',cr,lf
- DB ' A - ASCII mode (7 data bits)',cr,lf
- DB ' B - Binary mode (8 data bits)',cr,lf
- DB ' G - Graphics mode (8 data bits, no masking)'
- DB CR,LF,LF
- DB ' Examples:',cr,lf
- DB ' SET 300ETA',cr,lf
- DB ' SET B',cr,lf
- DB ' SET NSG 1200',cr,lf
- DB 0
- RET
- ;
- ;******************************************************************************
- ; NOTE: THE ABOVE MUST TERMINATE PRIOR TO 0CBB FOR MDM730 THRU MDM740.
- ;******************************************************************************
- ;
- ;.....
- ; This routine modifies the basic program to call CLOCKSET before timing rates
- ; are computed. The overlayed bytes (LXI H,0) are placed at the beginning
- ; of CLOCKSET.
- ;
- ORG START
- CALL CLOCKSET
- ;.....
- ; This subroutine overlays BYEBYE of basic program to add capability of send-
- ; ing correct signoff messages as program exits through BYE command.
- ;
- ORG BYEBYE+20
- DB CR,LF,'[ Exit to ',0
- LDA TPMFLG ;is this CP/M or TPM?
- ORA A
- CZ CPMMSG ;if CP/M, go get message
- CALL BYEBYE1 ;go continue this
- ;
- END
- ;