; M7SY-3.ASM - SANYO MBC-1000 computer overlay file for MDM722+. 2/17/84 ; ; 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. ; ; This file adapts the Sanyo MBC-1000 computer to the modem program. ; ; ; THIS MODIFICATION MAKES USE OF TIMER 2 ON THE 8253 TIMER IC (IC4) ; OF THE SERIAL I/O BOARD OF THE SANYO MBC-1000. ; ; To use this program, the serial I/O board must be modified as follows: ; ; 1. Cut etch from IC18 Pin 1 to JP2 Pin 8. ; 2. Install jumper from IC18 Pin 1 to IC4 Pin 18. ; 3. Install jumper from IC4 Pin 17 to JP2 Pin 8. ; 4. Install jumper from IC4 Pin 16 to IC4 Pin 14. ; 5. Move jumper strap to JP2 Pin 8 for programmable baud rate, other ; pins (1-7) can still be used for standard baud rate selections. ; 6. Hardware modification is now complete. ; ; *** THIS VERSION SETS UP THE USART FOR 8 BITS, NO PARITY, 1 STOP BIT *** ; ; Edit this file for your preferences then follow the "TO USE:" example ; shown below. ; ; Use the "SET" command to change the baudrate when desired. It starts ; out at 1200 baud when the program is first called up. Because of tem- ; perature and component variations, you mave have to alter the timing ; parameters in OK300 and OK1200, plus or minus 1 or 2 numbers, if CRC ; errors occur to frequently during transmission and reception. ; ; = = = = = = = = = = = = = = = = = = ; ; 02/17/84 - Renamed M7SY-3.ASM with improvements on 3 bugs. (1) Use ; MDM722 or later to eliminate the problems with Contol X when ; dialing. (2) Altered the parameter for 300 baud set for 0240h ; to 0241h to eliminate overwhelming CRC errors during Send. ; (3) Irv Hoff et al take note. For some reason, the Sanyo's ; lock up after a connect. When the message "hit any key to ; stop the bell" occurs, there is a subsequent CALL STAT and ; CALL KEYIN that gets the Sanyo's in a tight loop. Change ; the CALL STAT to a JMP RETURN (goes directly to the Terminal ; mode without waiting for a keystroke) to avoid the problem ; while waiting for someone more astute than me to fix the bug. ; I even tried patching in my specific BIOS addresses in a num- ; ber of places, figuring the problem was in INITADR--but to no ; avail. ; ; Bob Sandel Canton, MI (leave msg with TCBBS 1-313-846-6127 ; or Keith Peterson's Royal Oak CP/M 1-313-759-6569 ) ; ; ; 02/01/84 - Blended MDM711SN w the top of MDM719.ASM ; - Made Default Baud Rate 1200; Added back LOADBD to update MSPEED ; - ^P back on at LSTTST;changed LOGON back to ^L;set TOUCHPULSE ; - back to P=Pulse;added cosmetic remarks;BUFSIZ=XFRSIZ=16K ; - Bob Sandel Canton, MI ; ; 08/01/83 - Altered MDM711NE for the Sanyo MBC-1000 ; computer using an external modem - Dave Hardy ; ; 07/01/83 - Revised for use with MDM711 - Irv Hoff ; 06/22/83 - Revised for use with MDM710 - Irv Hoff ; ; = = = = = = = = = = = = = = = = = = ; VERSION: EQU 719 ;MDM719 (01/22/84) -- CP/M MODEM PROGRAM ; ; COPYRIGHTED 1984 BY IRV HOFF (TO DETER COMMERCIAL USE) ; ; THIS TELEPHONE MODEM PROGRAM USES THE CHRISTENSEN PROTOCOL. IT HAS ; BOTH CHECKSUM AND 'CRC' CAPABILITY FOR ERROR-DETECTION. IT SUPPORTS ; DIALING AND AUTO-REDIALING FOR THE S-100 PMMI, HAYES SMARTMODEM 300 ; AND 1200 AND U.S. ROBOTICS MODEMS. IT SUPPORTS UP TO TWO ALTERNATE ; DIALING SYSTEMS SUCH AS 'MCI', 'SPRINT', ETC. IT IS COPYRIGHTED TO ; DETER COMMERCIALISM. IT MAY BE USED FOR NON-PROFIT PURPOSES OR CAN ; BE ALTERED OR UPDATED IF AGAIN RELEASED TO THE PUBLIC DOMAIN. ; ; OTHER EXTERNAL MODEMS MAY BE READILY USED, ALTHOUGH MANUAL DIALING ; MAY BE NECESARY. OVERLAYS HAVE BEEN MADE ALLOWING RAPID ADAPTATION ; TO VARIOUS COMPUTERS. THE PROGRAM CONFORMS READILY TO NUMEROUS I/O ; DEVICES INCLUDING THE 2661, 8250, 8251, Z80-SIO, ETC. ; ; NOTE: Current version (722+)is 71 sectors long. Use this figure with ; DDT, etc. to merge the appropriate overlay, regardless of what ; the overlay may call for (such as 66 sectors for overlays made ; during MDM712 era or 69 sectors during the MDM 719 era. ) ; ;NOTE: M7NM-6.ASM (or later if applicable) must be used with ; this version. That has the 'SAVSIZ' byte just prior ; to the 'NUMBLIB:' phone number library. ; ;*********************************************************************** ; If you improve or modify this program please attempt to upload to TCBBS ; Dearborn, MI (313) 846-6127. If there is insufficient disk space, ; leave a message on MINICBBS there. ; ; ; 02/01/84 ******* WARNING Some Bugs remain TO USE ANCHOR XII ******* ; Still having trouble with CAL (lockup after connect); Can receive ; at 300 & 1200 but can only send at 1200 baud. Control X does ; does not really terminate dial. ATDP, manual dial, works fine!! ; If you work it out (leave msg w TCBBS 1-313-846-6127) Bob Sandel ; ; 01/22/84 Fixed Irv's error in GETACK routine which prevented the ; MDM719 robust improvement (added by Bob Plouffe) from working. ; Changed ACKNAK to NO so default will require valid NAK ; rather than non-ACK. This is part of the robust improvements, ; NOT because of any special ArpaNet requirement. Changed ; SHOWHEX to true for distribution version so users would have ; HEX and DECIMAL reporting while transferring files (most users ; have told me they prefer to see both). Changed PMMI dialing ; pulse default to 10pps which most exchanges will accept. ; (This can be set to other pulse rates in the user overlay). ; - Keith Petersen, W8SDZ ; ;*********************************************************************** ; ; GENERAL INTEREST: When transferring files modem-to-modem, the batch ; mode is extremely useful. It allows automatic transmission of nu- ; merous files while the operator at the receiving end does virtually ; nothing. It can be used for single files or with wildcards. With ; normal single program transfer, the receiving end switches from CRC ; to checksum in one minute and times out completely in 100 seconds. ; (In batch mode it times out in 3 minutes for receive.) This offers ; ample opportunity to transfer programs between individuals. ; ;*********************************************************************** ; ; 01/21/84 NUMBLIB now automatically starts on even page. 0D00H for ; MDM718 this version. Made the buffer size for file transfer inde- ; pendent from the buffer size for ASCII capture to disk. It ; had been 16k both since MODEM770. The file transfer size is ; now set to 4k for default. Most systems can easily use 16k ; but some very slow ones may need 8k or 4k. Set via XFRSIZ. ; (May be set with DDT by changing byte just prior to start of ; NUMLIB, which is 0CFFH in this case.) Now recognizes single ; digit result codes for auto-dial modems. Added code for the ; new Anchor modems which recognize busy signals and can start ; a redial immediately. Thanks for ideas from Wayne Masters, ; Ron Fowler, Fred Viles and others. - Irv Hoff ; ; 07/27/83 Added two alternate dialing routines such as MCI and SPRINT. ; MDM712 Fixed "disk space remaining" to read correctly with CP/M+. ; - Irv Hoff ; ; 07/01/83 Changed TERM to allow use of the printer port for modem use. ; MDM711 - Irv Hoff ; ; 06/22/83 MAJOR CHANGE: Added autodialing and automatic continuous ; MDM710 redialing for Hayes Smartmodem 300 or 1200, ; U.S. Robotics in addition to the PMMI modem ; for S-100 computers. - Irv Hoff ; ; 01/01/83 First version. Can be assembled with ASM.COM. (Previously ; MDM700 it was necessary to have the MODEM7.LIB file and use MAC.COM ; to assemble the program.) Selected MDM700 as a new program ; ;*********************************************************************** ; PORT: EQU 0A4H ; Sanyo MBC-1000 Serial Port ; MODCTL1: EQU PORT+1 ;modem STATUS port MODCTL2: EQU PORT+1 ;CHANGED FOR SANYO CONTROL PORT MODDATP: EQU PORT ;modem data port CTIMER: EQU 0A3H ;8253 baud rate counter/timer ; MODRCVB: EQU 02H ;modem receive bit (DAV) MODRCVR: EQU 02H ;modem receive ready MODSNDB: EQU 01H ;modem send bit MODSNDR: EQU 01H ;modem send ready bit ; ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SPECIAL EQUATES FOR PMMI ; BAUDRP: EQU PORT+2 ;modem baud rate port BRKMSK: EQU 0FBH ;mask to set break EVPARMSK: EQU 20H ;mask to set even parity NOPARMSK: EQU 10H ;mask to reset to no parity ODPARMSK: EQU 0CFH ;mask to set odd parity ; ANSWMOD: EQU 1EH ;answer mode ORIGMOD: EQU 1DH ;originate mode WAITCTS: EQU 150 ;number of seconds (x5) to wait for the ;computer to answer after PMMI auto-dial ;100=20 sec, 150=30 sec, 255=51 sec. ;any number 0-255 acceptable ; ; (END OF SPECIAL PMMI EQUATES) ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; YES: EQU 0FFH NO: EQU 0 ; ; BUFSIZ: EQU 16 ;buffer size in Kbytes for ASCII capture to disk ;(16k is one file extent) XFRSIZ: EQU 16 ;file transfer buffer in Kbytes. Do not make ;any larger than BUFSIZ. 16k works fine on all ;but very slowest systems ; BDNMCH: EQU 75H ;bad name match ERRLIM: EQU 10 ;maximum allowable consecutive errors ERRCRC: EQU 6 ;CRC tries, then switches to CHECKSUM LIBLEN: EQU 34 ;length of each phone library entry ; SHOWHEX:EQU YES ;yes, show hex record count - no, do not show ; RUB: EQU 7FH ;rub CRC: EQU 'C' ;requests 'CRC' instead of 'CKSUM' ESC: EQU '['-40H ;^[ = escape SOH: EQU 'A'-40H ;^A = start of header EOT: EQU 'D'-40H ;^D = end of text EXITCHR:EQU 'E'-40H ;^E = exit character ACK: EQU 'F'-40H ;^F = acknowledge OKNMCH: EQU 'F'-40H ;^F = ok name match BELL: EQU 'G'-40H ;^G = bell character BKSP: EQU 'H'-40H ;^H = backspace LF: EQU 'J'-40H ;^J = linefeed CR: EQU 'M'-40H ;^M = carriage return XON: EQU 'Q'-40H ;^Q = XON character XOFF: EQU 'S'-40H ;^S = XOFF character NAK: EQU 'U'-40H ;^U = not acknowledge CANCEL EQU 'X'-40H ;^X = cancel send or receive EOFCHAR:EQU 'Z'-40H ;^Z = end of file ; ; ORG 0100H ; ; DS 3 ; for JUMP START instruction ; ; ; THESE ROUTINES AND EQUATES ARE AT THE BEGINNING OF THE PROGRAM SO ; THEY CAN BE PATCHED BY A MONITOR OR OVERLAY FILE WITHOUT RE-ASSEMBLING ; THE PROGRAM. ; PMMIMODEM: DB NO ;yes=PMMI modem, no=non-PMMI modem SMARTMODEM: DB YES ;yes=HAYES Smartmodem or Anchor Automation Mark XII TOUCHPULSE: DB 'P' ;T=touch, P=pulse (Smartmodem-only) ; CLOCK: DB 40 ;clock speed x .1, 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 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 NOOFCOL: DB 4 ;number of directory columns was 5 SETUPTST: DB YES ;yes=non-PMMI setup routine SCRNTEST: DB YES ;yes=if home cursor and clear screen ;routine at CLRSCRN ACKNAK: DB YES ;yes=resend a record after any non-ACK ;no=resend a record after a valid NAK (robust) BAKUPBYTE: DB NO ;yes=make .BAK file CRCDFLT: DB YES ;yes=default to CRC checking ;no=default to Checksum checking TOGGLECRC: DB YES ;yes=allow toggling of Checksum to CRC CONVBKSP: DB NO ;yes=convert backspace to rub TOGGLEBK: 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) TOGGLELF: DB YES ;yes=allow toggling of LF after CR TRANLOGON: DB YES ;yes=allow transmission of logon ;write logon sequence at location LOGON SAVCCP: DB YES ;yes=do not overwrite CCP LOCNXTCHR: DB NO ;yes=local cmd if EXTCHR precedes ;no=not local cmd if EXTCHR precedes TOGGLELOC: 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 XOFFTST: DB YES ;yes=allow testing of XOFF from remote ;while sending a file in terminal mode XONWAIT: DB NO ;yes=wait for XON after sending CR while ;transmitting a file in terminal mode TOGXOFF: DB YES ;yes=allow toggling of XOFF testing IGNORCTL: 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 NOCONNCT: DB 'N'-40H ;^N = Disconnect from phone line LOGCHR: DB 'L'-40H ;^L = Send logon LSTCHR: DB 'P'-40H ;^P = Toggle printer UNSAVECHR: DB 'R'-40H ;^R = Close input text buffer TRANCHR: DB 'T'-40H ;^T = Transmit file to remote SAVECHR: DB 'Y'-40H ;^Y = Open input text buffer EXTCHR: DB '^'-40H ;^^ = Send next character ; ; ; Equates used only by PMMI routines grouped together here. ; PULSERATE: DB 250 ;125=20pps dialing, 250=10pps CHGBAUD: DB 'B'-40H ;^B = Used with PMMIMODEM in terminal ;mode to change baud rate on fly ; ; ; Handles in/out ports for data and status ; IN$MODCTL1: IN MODCTL1 ! RET ;in modem control port DS 7 ;spares if needed for non-PMMI OUT$MODDATP: OUT MODDATP ! RET ;out modem data port DS 7 ;spares if needed for non=PMMI IN$MODDATP: IN MODDATP ! RET ;in modem data port DS 7 ;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 ; ; ;====================== SPECIAL PMMI PORTS ============================= ; IN$BAUDRP: IN BAUDRP ! RET ;in baudrate port OUT$BAUDRP: OUT BAUDRP ! RET ;out baudrate port OUT$MODCTL1: OUT MODCTL1 ! RET ;out modem control port #1 OUT$MODCTL2: OUT MODCTL2 ! RET ;out modem control port #2 ; ;================== END OF SPECIAL PMMI PORTS ========================== ; ; LOGONPTR: DW LOGON JMP$DIAL: DS 3 JMP$DISCONNT: DS 3 JMP$GOODBYE: JMP GOODBYE JMP$INITMOD: JMP INITMOD RET ! NOP ! NOP RET ! NOP ! NOP RET ! NOP ! NOP JMP$SETUPR: JMP SETUPR JMP$SPCLMENU: JMP SPCLMENU JMP$SYSVER: JMP SYSVER JMP$BREAK JMP SENDBRK ; ; ; NEXT SIX LINES SHOULD NOT BE CHANGED BY USER OVERLAY AS THESE GO TO ; SPECIFIC LOCATIONS IN THE MAIN PROGRAM, NOT IN THE OVERLAY. ; JMP$ILPRT: DS 3 JMP$INBUF: DS 3 JMP$INLNCOMP: DS 3 JMP$INMODEM: DS 3 JMP$NXTSCRN: DS 3 JMP$TIMER: DS 3 ; ; ; Clear sequences are for Televideo, Lear Siegler, etc. Change to match ; your terminal. (Heath uses ESC 4AH for clear to end of screen, ESC 45H ; to clear screen. Lear Siegler and others use ESC 79H for clear to end ; of screen and ESC 3AH to clear screen.) Room allowed for four bytes. ; (Last zero needed for stopping the string display. Any extra 0's just ; act as NOP's.) ; CLREOS: CALL JMP$ILPRT ;was ILPRT DB 0,0,0,0,0 ;dave hardy had 059h,0,0,0,0 RET ;..... ; ; CLRSCRN:CALL JMP$ILPRT ; was ILPRT DB 1AH,0,0,0,0 ; was 1eh,59h,59h,00 in dave hardy version RET ;..... ; ; ;======================= SIGN-ON MESSAGE ============================== ; ; Send version number and date ; SYSVER: CALL JMP$ILPRT ; was LDA DB ' Sanyo MBC-1000 & Anchor Mark XII modem 1200 Baud' DB CR,LF,cr,lf,cr,lf db 'MDM722.COM--------M7SY-2.HEX-------M7NM-6RS.HEX' db cr,lf,cr,lf ;I use above to track patches: customize at will db 0 ;end of message flag RET ;..... ; SYSVER1:JMP SYSVER ;..... ; ; ;==================== LOGON MESSAGE (IF ANY) =========================== ; ; Insert your logon message here. End with a 0 (for"CALL ILPRT"). ; PMMIusers have 59 bytes available, non-PMMI users have approximately ; 2K bytes available as they can overwrite all the following PMMI rou- ; tines if they wish. This method allows the external overlays to have ; plenty of room. It keeps the phone number library at a fixed location. ; LOGON: DB 'Your Name?',CR,LF DB 0 ;to terminate the logon message ;..... ; ;=========== ANCHOR MARK XII INITIALIZATION ADDED ===================== ; ; Insert your initialization routine here if needed. Can replace the ; following special PMMI area to set speed and auto-dial. Over 950 ; bytes are available for this purpose. (End your routine with a RET.) ; ; ;======================================================================= ; ; This routine allows a 300 ms. break tone to be send to reset some ; time-share computers. ; SENDBRK: MVI A,1FH ;SEND A BREAK TONE JMP GOODBYE1 ;..... ; ; ; This routine sends a 300 ms. break tone and sets DTR low for the same ; length of time to disconnect some modesm such as the Bell 212A, etc. ; GOODBYE: MVI A,08H ;SEND BREAK, TURN OFF DTR ; GOODBYE1: OUT MODCTL1 ;SEND TO STATUS PORT MVI B,3 ;WAIT 300 MS. CALL JMP$TIMER MVI A,37H ;NORMAL SEND/RECEIVE WITH DTR OUT MODCTL1 ;SEND TO STATUS PORT RET ;..... ; ; ; Sanyo MBC-1000 initialization -- sets the 8251A for 8 bits, 1 stop bit, ; no parity, 1200 Baud (was 300 baud) ; INITMOD: MVI A,5 ;TRANSFER TIME FOR 1200 Baud (was 1=300 BAUD) STA MSPEED MVI A,96H ;Set up counter/timer to be baud rate clock OUT CTIMER LDA V1 OUT CTIMER-1 MVI A,087H ;INSURE OUT OF MODE state OUT MODCTL1 ;MODEM STATUS PORT out modctl1 ;slight extra delay MVI A,40H ;INITIALIZE USART OUT MODCTL1 ;MODEM STATUS PORT LDA V2 ADI 4CH ;8 DATA BITS, 1 STOP, NO PARITY OUT MODCTL1 ;MODEM STATUS PORT MVI A,17H ;DTR, RCV, XMT, ERROR RST:hardy had 27h w RTS OUT MODCTL1 ;MODEM STATUS PORT IN PORT ;CLEAR DATA PORT RET ; V1 DB 010H ;COUNTER VALUE(dflt = 1200; was 040h=300 baud) V2 DB 2 ;CLOCK DIVISOR 2 works from 150 to 1200 baud ;..... ;========== NON-PMMI SETUP (SPEED CHANGE, ETC.) IF ANY ============== ; ; Insert your speed change and/or auto-dialing routines here. ; Over 950 bytes are available (INCLUDING INITMOD, above). ; End your routine with a RET. ; ; SETUPR: LXI D,BAUDBUF ;POINT TO NEW INPUT BUFFER CALL JMP$ILPRT DB 'Input Baud Rate (300, 1200): ',0 ;, 1800, 2400): ',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 '1200',0 JNC OK1200 ; CALL JMP$INLNCOMP ;killed these lines so only 300/1200 plays ; DB '1800',0 ; JNC OK1800 ; CALL JMP$INLNCOMP ; DB '2400',0 ; JNC OK2400 CALL JMP$ILPRT ;ALL MATCHES FAILED, TELL OPERATOR DB '++ Incorrect entry ++',CR,LF,BELL,0 JMP SETUPR ;TRY AGAIN ; OK300: LXI H,0241H ;V1=41h V2=02h ******* WARNING ****** ; ;V1 was 40h minor adjustment of the value ;of V1 may be required because of individual ;crystal, component or temperature variations. SHLD V1 ;SAVE PARAMETERS FOR 300 BAUD MVI A,1 ;MSPEED 300 BAUD VALUE JMP LOADBD ;jump to load: Dave you forgot this !! ; OK1200: LXI H,0210H ;V1=10h V2=02h See Warning in OK300 SHLD V1 MVI A,5 JMP LOADBD ; ; killed the followings lines to restrict baud set to 300 & 1200 ; ;OK1800: LXI H,01A0H ;V1=A0h V2=01h ; SHLD V1 ; MVI A,6 ; JMP loadbd ; ;OK2400: LXI H,0180H ;V1=80h V2=01h ; SHLD V1 ; MVI A,6 ; JMP loadbd ; LOADBD: STA INITMOD+1 ;change time-to-send to match baudrate JMP INITMOD ;reset MSPEED TO NEW BAUDRATE ; ; ; BAUDBUF: DB 10,0 DS 10 ;..... ; ; ; (END OF INITMOD AND SETUP ROUTINES) ;======================================================================= ; ; ; These routines can be used for your equipment. End with RET. If ; using the Hayes Smartmodem this is unavailable without a special ad- ; dress change. ; SPCLMENU: RET ; ;======================================================================= ; ; ; NOTE: MUST TERMINATE PRIOR TO 0400H (with Smartmodem) ; 0C00H (without Smartmodem) ; ; END ; ************************************************