; ; M7MH-2.ASM -- Morrow Decision MD-11 computer 08/09/84 ; w/ SmartModem on Auxillary Port ; overlay file for MDM7xx. ; ;------------------------------------------------------------------------- ; ; 08/09/84 - Updated, more baud rates - George Reding ; 07/01/84 - First version of M7MH-1.ASM - George Reding ; Modified from M7GP-1.ASM by - Irv Hoff ; ;------------------------------------------------------------------------- ; Updated version based on additional information obtained from the Morrow ; Corp via Xerox (local service representative). This will allow operation ; at most any baudrate - not previously implemented. This version is for ; the Zilog SIO/9 chip (identical to the Zilog SIO except only channel A ; is operational). An Intel 8253 CTC chip is used to control baud rates. ; ; Thanks to those who helped me with first version, namely creators of the ; patch named B3SIO.ASM, plus advice from David Bowerman and Gordon Regar. ; - G.Reding 08/09/84 ;------------------------------------------------------------------------- ; ; TO USE: First edit this file selecting your desired options, ; then assemble with MAC, ASM, or equivalent assembler. ; Morrow MD-11 users then use SID or DDT to overlay the ; results of this program to the original COM file. ; ; ; A>SAVE <-- type this first ; ; A>DDT MDM7xx.COM ; DDT VERS 2.2 ; NEXT PC ; 4A00 0100 ; -IM7MH-2.HEX (note the "I" command) ; -R ("R" loads in the .HEX file) ; NEXT PC ; 4A00 0000 ; -G0 (return to CP/M) ; ; CP/M 3 SAVE - Version 3.0 ; Enter file (type RETURN to exit): MDM7xx.COM <-- new filename ; Beginning hex address 0100 <-- from having used DDT or SID ; Ending hex address 4A00 <-- you enter both of these ; ; A> (now have a modified .COM file) ; ;------------------------------------------------------------------------- ; ; SIO & CTC Chip Equates ; """""""""""""""""""""" ; Port addresses: ; BPORT: EQU 50H ;Aux Port divisor latch of 8253 CTC. BPORT2: EQU 53H ;counter timer mode control. BASEP: EQU 70H ;Zilog SIO/9. Identical to Zilog SIO, ;except only channel A is operational ; (MD-11 Aux Port uses channel A) DATPORT: EQU BASEP ;data port STPORT: EQU BASEP+1 ;status/control port ; ; STPORT commands (output to STPORT): ; RESCHN: EQU 00011000B ;reset channel RESSTA: EQU 00010000B ;reset external status WRREG1: EQU 00000000B ;value to write to register 1 WRREG3: EQU 11000001B ;8 bits/char, rx on WRREG4: EQU 01000100B ;16x, 1 stop, no parity DTROFF: EQU 00000000B ;dtr and rts off DTRON: EQU 11101010B ;drt on, rts on, tx on, 8 bit/char ONINS: EQU 00110000B ;error reset BRKON: EQU 11111010B ;dtr on, rts on, tx on, break on, 8 bit/char BRKOFF: EQU 11101010B ;dtr on, rts on, tx on, break off, 8 bit/char ; ; STPORT status masks: ; DAV: EQU 00000001B ;data available TRDY: EQU 00000100B ;transmit buffer empty DCD: EQU 00001000B ;data carrier detect CTS: EQU 00100000B ;clear to send input status ; ;------------------------------------------------------------------------- ; BELL: EQU 07H ;bell CR: EQU 0DH ;carriage return ESC: EQU 1BH ;escape LF: EQU 0AH ;linefeed ; YES: EQU 0FFH NO: EQU 0 ; ; Change the following information to match your equipment ; MODCTL1: EQU STPORT ;MODEM CONTROL PORT MODDATP: EQU DATPORT ;MODEM DATA IN PORT MODDATO: EQU DATPORT ;MODEM DATA OUT PORT MODDCDB: EQU DCD ;CARRIER DETECT BIT MODDCDA: EQU 0 ;VALUE WHEN ACTIVE MODCTL2: EQU STPORT ;2ND MODEM CONTROL PORT MODRCVB: EQU DAV ;BIT TO TEST FOR RECEIVE MODRCVR: EQU DAV ;VALUE WHEN READY MODSNDB: EQU TRDY ;BIT TO TEST FOR SEND MODSNDR: EQU TRDY ;VALUE WHEN READY ; ;------------------------------------------------------------------------- ; ORG 100H ; ; Change the clock speed to suit your system ; DS 3 ;(for "JMP START" instruction) ; PMMIMODEM: DB NO ;yes=PMMI S-100 Modem 103H SMARTMODEM: DB YES ;yes=HAYES Smartmodem, no=non-PMMI 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 ;0=110 1=300 2=450 3=600 4=710 5=1200 107H ;6=2400 7=4800 8=9600 9=19200 default BYTDLY: DB 5 ;0=0 delay 1=10ms 5=50 ms - 9=90 ms 108H ;default time to send character in ter- ;minal mode file transfer for slow BBS. CRDLY: DB 5 ;0=0 delay 1=100 ms 5=500 ms - 9=900 ms 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 ACKNAK: DB YES ;yes=resend a record after any non-ACK 10DH ;no=resend a record after a valid-NAK BAKUPBYTE: DB NO ;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 CONVBKSP: DB NO ;yes=convert backspace to rub 111H TOGGLEBK: DB YES ;yes=allow toggling of bksp to rub 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 YES ;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 YES ;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 YES ;yes=CTL-chars above ^M not displayed 11DH EXTRA1: DB 0 ;for future expansion 11EH EXTRA2: DB 0 ;for future expansion 11FH BRKCHR: DB '@'-40H ;^@ = Send 300 ms. break tone 120H 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 '^'-40H ;^^ = Send next character 127H DS 2 ; 128H ; IN$MODCTL1: IN MODCTL1 ! RET ;in modem control port 12AH DS 7 OUT$MODDATP: OUT MODDATP ! RET ;out modem data port 134H DS 7 IN$MODDATP: IN MODDATP ! RET ;in modem data port 13EH DS 7 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 ; 156H ; OUT$MODCTL1: OUT MODCTL1 ! RET ;out modem control port #2 15AH OUT$MODCTL2: OUT MODCTL2 ! RET ;out modem control port #1 15DH ; LOGONPTR: DW LOGON ;for user message. 160H DS 6 ; 162H 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 ; 180H ; ; Do not change the following six lines. ; 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 010AH (above). ; CLREOS: CALL JMP$ILPRT ; 195H DB ESC,59H,0,0,0 ; 198H RET ; 19DH ; ; CLRSCRN: CALL JMP$ILPRT ; 19EH DB 1EH,ESC,59H,0,0 ; 1A1H RET ; 1A6H ; ; SYSVER: CALL JMP$ILPRT ; 1A7H DB 'Version for Morrow Decision MD-11',CR,LF DB 'with SmartModem on Auxillary Port',CR,LF DB 0 RET ; ;----------------------------------------------------------------------- ; NOTE: You can change the SYSVER message to be longer or shorter. The ; END of your LAST routine should terminate by 0400H (601 bytes ; available after start of SYSVER) if using the Hayes Smartmodem ; or by address 0C00H (2659 bytes) otherwise. ;----------------------------------------------------------------------- ; ; Put in a message here which can be called up with CTL-O if TRANLOGON has ; been set TRUE. You can use several lines if desired. End with a 0. ; LOGON: DB 'This is a Morrow Decision MD-11 computer' DB CR,LF DB 0,0,0,0,0,0 ; ; ;************************************************************************* ; If any of your routines zap anything other than the Accumulator, then ; you must preserve all other registers. ;************************************************************************* ; ; This will send a break tone to reset some time-share computers. ; SENDBRK: MVI A,5 ;setup to write reg 5 OUT STPORT MVI A,BRKON ;dtr on, rts on, tx on, break on, 8 bit/char OUT STPORT MVI B,3 ;300ms of break CALL JMP$TIMER MVI A,5 ;setup to write reg 5 OUT STPORT MVI A,BRKOFF ;dtr on, rts on, tx on, break off, 8 bit/char OUT STPORT RET ; ; ; This will turn off DTR, etc causing modem to hangup. ; GOODBYE: MVI A,5 ;setup to write reg 5 OUT STPORT MVI A,DTROFF ;clear dtr causing hangup OUT STPORT MVI B,3 ;for 300ms CALL JMP$TIMER MVI A,5 ;setup to write reg 5 OUT STPORT MVI A,DTRON ;dtr on, rts on, tx on, 8 bit/char OUT STPORT ;so we can use modem again RET ;return ; ; ; Setup the modem port (MD-11 Aux Port). ; INITMOD: MVI A,4 ;setup to write reg 4 OUT STPORT MVI A,WRREG4 ;16x, 1 stop, no parity OUT STPORT ; MVI A,1 ;setup to write reg 1 OUT STPORT MVI A,WRREG1 ;value to write to register 1 OUT STPORT ; MVI A,3 ;setup to write reg 3 OUT STPORT MVI A,WRREG3 ;initialize receive register OUT STPORT ; MVI A,5 ;setup to write reg 5 OUT STPORT MVI A,DTRON ;dtr on, 8 bit/char, tx enable, rts OUT STPORT ;so we can use modem ; IN DATPORT ;clean out garbage IN DATPORT ;make sure its clear JMP SET300 ;setup default baud (300) ;and return ; ; ; The following set the baud rate for the modem. If you do not support a ; particular rate, then put the label in front of the SETINV routine. If ; the baud rate change was successful, make SURE the Zero flag is set. ; SETUPR: LXI D,BAUDBUF ;point to new input buffer CALL JMP$ILPRT DB 'Select baud rate ' DB '(300, 450, 600, 710, 1200): ',0 CALL JMP$INBUF LXI D,BAUDBUF+2 CALL JMP$INLNCOMP ;compare baudbuf+2 with below DB '300',0 JNC SET300 ;if match, do it CALL JMP$INLNCOMP ;else check.. DB '450',0 JNC SET450 CALL JMP$INLNCOMP ;..until we DB '600',0 JNC SET600 CALL JMP$INLNCOMP ;..find a match DB '710',0 JNC SET710 CALL JMP$INLNCOMP ;..and do it DB '1200',0 JNC SET1200 CALL JMP$ILPRT ;else say no match DB '++ Incorrect entry ++',CR,LF,BELL,0 JMP SETUPR ;try again ; ; SET300: MVI A,1 ;value for MSPEED STA MSPEED ;store it ; MVI A,3EH ;Aux:= Mode 3 (Channel 0) OUT BPORT2 ;counter timer mode control LXI H,BD300 ;baud rate value JMP SETBAUD ;go finish setting ; ; SET450: MVI A,2 STA MSPEED MVI A,3EH OUT BPORT2 LXI H,BD450 JMP SETBAUD ; ; SET600: MVI A,3 STA MSPEED MVI A,3EH OUT BPORT2 LXI H,BD600 JMP SETBAUD ; ; SET710: MVI A,4 STA MSPEED MVI A,3EH OUT BPORT2 LXI H,BD710 JMP SETBAUD ; ; SET1200: MVI A,5 STA MSPEED MVI A,3EH OUT BPORT2 LXI H,BD1200 ; ; SETBAUD: MOV A,L OUT BPORT ;Aux Port divisor latch LOW MOV A,H OUT BPORT ;Aux Port divisor latch HIGH XRA A ;say rate okay RET ;return ; ; ; The returns a 255 because we were not able to set to the proper baud rate ; because either the serial port or the modem cant handle it. ; SET110: DS 0 ;110 baud not supported ; SETINV: ORI 0FFH ;make sure zero flag is not set RET ;return ; ; ; The following divisors for BPORT (Aux Port divisor latch) for the Morrow ; MD-11 were obtained from Morrow Corp, except the 450 and 710 bps which I ; calculated based on the others (correct?). Bauds other than 300 and 1200 ; I haven't tested - no means to do so. Labels correspond with baud rates. ; -G.Reding 08/09/84 BD110: EQU 08E0H BD300: EQU 0341H BD450: EQU 022DH BD600: EQU 01A1H BD710: EQU 0160H BD1200: EQU 00D0H BD2400: EQU 0068H BD4800: EQU 0034H BD9600: EQU 001AH BD19200: EQU 000DH ; ; BAUDBUF: DB 10,0 DS 10 ; ; ; If using Hayes Smartmodem following is unavailable without a special ; change. ; SPCLMENU: RET ; ; ; NOTE: MUST TERMINATE PRIOR TO 0400H (with Smartmodem) ; 0C00H (without Smartmodem) ; END ;