; M7MM-1.ASM -- MORROW MULTI-I/O OVERLAY FOR MDM7XX 11/11/83 ; ; THIS OVERLAY ADAPTS THE MDM7XX PROGRAM TO USE A MORROW MULT-I/O BOARD ; AND AN EXTERNAL MODEM. THE MULT-I/O BOARD SUPPORTS SEVERAL USERS AT ; THE SAME PORT ADDRESS IN A FASHION SIMILAR TO BANK SELECTING MAIN ; MEMORY. THIS PROGRAM INCLUDES AN INITIALIZATION ROUTINE TO SELECT ; THE BAUD RATE BUT DOES NOT CHANGE THE USER (GROUP) NUMBER WHICH IS ; SET TO GROUP 1. ; ; YOU COULD LOOK AT OTHER OVERLAY FILES TO SEE HOW THE GOODBYE AND/OR ; SETUPR AREAS ARE HANDLED. YOU COULD THEN ADAPT ONE OF THOSE, IF AP- ; PROPRIATE FOR YOUR EQUIPMENT IN THIS OVERLAY. SOME EXAMPLES: ; ; "DP" DATAPOINT 1560 OVERLAY USING 8251 I/O AND CTC TIMERS FOR ; SETTING BAUD RATES ; "H8" HEATH H89 OVERLAY FOR 8250 I/O AND PROGRAMMABLE BAUD RATES ; "HZ" ZENITH 120 OVERLAY FOR 2661B INITIALIZATION AND BAUD RATES ; "XE" XEROX 820II OVERLAY FOR Z80-SIO INTIALIZATION, ETC. ; ; 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 ; EQUIPMENT. THEN ASSEMBLE WITH ASM.COM OR EQUIVALENT ; ASSEMBLER. THEN USE DDT TO OVERLAY THE THE RESULTS ; OF THIS PROGRAM TO THE ORIGINAL .COM FILE: ; ; A>DDT MDM7XX.COM ; DDT VERS 2.2 ; NEXT PC ; 4X00 0100 ; -IM7MM-1.HEX (NOTE THE "I" COMMAND) ; -R ("R" LOADS IN THE .HEX FILE) ; NEXT PC ; 4X00 0000 ; -G0 (RETURN TO CP/M) ; A>SAVE 73 MDM7XX.COM (NOW HAVE A MODIFIED .COM FILE) ; ; = = = = = = = = = = = = = = = = = = ; ; 11/11/83 - RENAMED TO M7MM-1.ASM, NO CHANGES - IRV HOFF ; 07/27/83 - RENAMED TO WORK WITH MDM712 - IRV HOFF ; 07/07/83 - ADAPTED FOR MORROW MULTI-I/O - G. SMITH ; 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 ; ; = = = = = = = = = = = = = = = = = ; 0007 = BELL: EQU 07H ;BELL 000D = CR: EQU 0DH ;CARRIAGE RETURN 001B = ESC: EQU 1BH ;ESCAPE 000A = LF: EQU 0AH ;LINEFEED 0009 = TAB: EQU 09H ;TAB 0005 = BDOS: EQU 0005H ; 00FF = YES: EQU 0FFH 0000 = NO: EQU 0 ; ; ; CHANGE THE FOLLOWING INFORMATION TO MATCH YOUR EQUIPMENT ; 0048 = BASE: EQU 48H ;BASE ADDRESS FOR MULT-I/O BOARD 0002 = GROUP: EQU 2 ;GROUP SELECTION CODE 004F = GRP$CTL: EQU BASE+7 ;GROUP SELECTION PORT ADDRESS 0048 = DLL: EQU BASE ;ACE BAUD RATE DIVISOR (LSB) 0049 = DLM: EQU BASE+1 ;ACE BAUD RATE DIVISOR (MSB) 0049 = IER: EQU BASE+1 ;ACE INTERRUPT ENABLE REGISTER 004B = LCR: EQU BASE+3 ;ACE LINE CONTROL REGISTER 004D = LSR: EQU BASE+5 ;ACE LINE STATUS REGISTER 0048 = RBR: EQU BASE ;ACE RECEIVE BUFFER REGISTER 0048 = THR: EQU BASE ;ACE TRANSMIT HOLD REGISTER 0080 = DLAB: EQU 80H ;DIVISOR LATCH ACCESS BIT 0020 = THRE: EQU 20H ;MODSNDB 0001 = DR: EQU 1 ;MODRCVB 0001 = WLS0: EQU 1 ;WORD LENGTH SELECT BIT 0 0002 = WLS1: EQU 2 ;WORD LENGTH SELECT BIT 1 0004 = STB: EQU 4 ;STOP BIT COUNT (2 STOPS) 0000 = IMASK: EQU 0 ;INTERRUPT MASK -- DISABLE ALL ; 0004 = MODDCDB: EQU 4 ;CARRIER DETECT BIT 0000 = MODDCDA: EQU 0 ;VALUE WHEN ACTIVE 0001 = MODRCVB: EQU 1 ;BIT TO TEST FOR RECEIVE 0001 = MODRCVR: EQU 1 ;VALUE WHEN READY 0020 = MODSNDB: EQU 20H ;BIT TO TEST FOR SEND 0020 = MODSNDR: EQU 20H ;VALUE WHEN READY ; ; 0100 ORG 100H ; ; ; CHANGE THE CLOCK SPEED TO SUIT YOUR SYSTEM ; 0100 DS 3 ;(FOR "JMP START" INSTRUCTION) ; 0103 00 PMMIMODEM: DB NO ;YES=PMMI S-100 MODEM 103H 0104 00 SMARTMODEM: DB NO ;YES=HAYES SMARTMODEM, NO=NON-PMMI 104H 0105 54 TOUCHPULSE: DB 'T' ;T=TOUCH, P=PULSE (SMARTMODEM-ONLY) 105H 0106 28 CLOCK: DB 40 ;CLOCK SPEED IN MHZ X10, 25.5 MHZ MAX. 106H ;20=2 MHH, 37=3.68 MHZ, 40=4 MHZ, ETC. 0107 01 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 0108 05 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. 0109 05 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 010A 05 NOOFCOL: DB 5 ;NUMBER OF DIR COLUMNS SHOWN 10AH 010B 00 SETUPTST: DB NO ;YES=USER-ADDED SETUP ROUTINE 10BH 010C 00 SCRNTEST: DB NO ;CURSOR CONTROL ROUTINE 10CH 010D FF ACKNAK: DB YES ;YES=RESEND A RECORD AFTER ANY NON-ACK 10DH ;NO=RESEND A RECORD AFTER A VALID-NAK 010E 00 BAKUPBYTE: DB NO ;YES=CHANGE ANY FILE SAME NAME TO .BAK 10EH 010F FF CRCDFLT: DB YES ;YES=DEFAULT TO CRC CHECKING 10FH 0110 FF TOGGLECRC: DB YES ;YES=ALLOW TOGGLING OF CRC TO CHECKSUM 110H 0111 00 CONVBKSP: DB NO ;YES=CONVERT BACKSPACE TO RUB 111H 0112 FF TOGGLEBK: DB YES ;YES=ALLOW TOGGLING OF BKSP TO RUB 112H 0113 00 ADDLF: DB NO ;NO=NO LF AFTER CR TO SEND FILE IN 113H ;TERMINAL MODE (ADDED BY REMOTE ECHO) 0114 FF TOGGLELF: DB YES ;YES=ALLOW TOGGLING OF LF AFTER CR 114H 0115 FF TRANLOGON: DB YES ;YES=ALLOW TRANSMISSION OF LOGON 115H ;WRITE LOGON SEQUENCE AT LOCATION LOGON 0116 00 SAVCCP: DB NO ;NO=DO NOT SAVE CCP 116H 0117 00 LOCONEXTCHR: DB NO ;YES=LOCAL COMMAND IF EXTCHR PRECEDES 117H ;NO=EXTERNAL COMMAND IF EXTCHR PRECEDES 0118 FF TOGGLELOC: DB YES ;YES=ALLOW TOGGLING OF LOCONEXTCHR 118H 0119 FF LSTTST: DB YES ;YES=PRINTER AVAILABLE ON PRINTER PORT 119H 011A FF XOFFTST: DB YES ;YES=CHECKS FOR XOFF FROM REMOTE WHILE 11AH ;SENDING A FILE IN TERMINAL MODE 011B FF XONWAIT: DB YES ;YES=WAIT FOR XON AFTER CR WHILE 11BH ;SENDING A FILE IN TERMINAL MODE 011C FF TOGXOFF: DB YES ;YES=ALLOW TOGGLING OF XOFF CHECKING 11CH 011D FF IGNORCTL: DB YES ;YES=CTL-CHARS ABOVE ^M NOT DISPLAYED 11DH 011E 00 EXTRA1: DB 0 ;FOR FUTURE EXPANSION 11EH 011F 00 EXTRA2: DB 0 ;FOR FUTURE EXPANSION 11FH 0120 00 BRKCHR: DB '@'-40H ;^@ = SEND 300 MS. BREAK TONE 120H 0121 0E NOCONNCT: DB 'N'-40H ;^N = DISCONNECT FROM THE PHONE LINE 121H 0122 0C LOGCHR: DB 'L'-40H ;^O = SEND LOGON 122H 0123 10 LSTCHR: DB 'P'-40H ;^P = TOGGLE PRINTER 123H 0124 12 UNSAVE: DB 'R'-40H ;^R = CLOSE INPUT TEXT BUFFER 124H 0125 14 TRANCHR: DB 'T'-40H ;^T = TRANSMIT FILE TO REMOTE 125H 0126 19 SAVECHR: DB 'Y'-40H ;^Y = OPEN INPUT TEXT BUFFER 126H 0127 5E EXTCHR: DB '^'-00H ; ^ = SEND NEXT CHARACTER 127H ; ; 0128 DS 2 ; 128H ; ; 012A CD3202 IN$MODCTL1: CALL MOD$SEL ;IN MODEM CONTROL PORT 12AH 012D DB4D IN LSR 012F C9 RET ;..... ; ; 0130 DS 4 ; 0134 F5 OUT$MODDATP: PUSH PSW ;OUT MODEM DATA PORT 134H 0135 CD3202 CALL MOD$SEL 0138 F1 POP PSW 0139 D348 OUT THR 013B C9 RET ;..... ; ; 013C DS 2 ; 013E CD3202 IN$MODDATP: CALL MOD$SEL ;IN MODEM DATA PORT 13EH 0141 DB48 IN RBR 0143 C9 RET ;..... ; ; 0144 DS 4 ; 0148 E601C9 ANI$MODRCVB: ANI MODRCVB ! RET ;BIT TO TEST FOR RECEIVE READY 148H 014B FE01C9 CPI$MODRCVR: CPI MODRCVR ! RET ;VALUE OF RCV. BIT WHEN READY 14BH 014E E620C9 ANI$MODSNDB: ANI MODSNDB ! RET ;BIT TO TEST FOR SEND READY 14EH 0151 FE20C9 CPI$MODSNDR: CPI MODSNDR ! RET ;VALUE OF SEND BIT WHEN READY 151H 0154 DS 6 ; 156H ; 015A C90000 OUT$MODCTL1: RET ! NOP ! NOP ;OUT MODEM CONTROL PORT #2 15AH 015D C90000 OUT$MODCTL2: RET ! NOP ! NOP ;OUT MODEM CONTROL PORT #1 15DH ; 0160 D701 LOGONPTR: DW LOGON ;FOR USER MESSAGE. 160H 0162 DS 6 ; 162H 0168 C3ED01 JMP$GOODBYE: JMP GOODBYE ; 168H 016B C3EE01 JMP$INITMOD: JMP INITMOD ;GO TO USER WRITTEN ROUTINE 16BH 016E C90000 RET ! NOP ! NOP ;(BY-PASSES PMMI ROUTINE) 16EH 0171 C90000 RET ! NOP ! NOP ;(BY-PASSES PMMI ROUTINE) 171H 0174 C90000 RET ! NOP ! NOP ;(BY-PASSES PMMI ROUTINE) 174H 0177 C33102 JMP$SETUPR: JMP SETUPR ; 177H 017A C33B02 JMP$SPCLMENU: JMP SPCLMENU ; 17AH 017D C3A701 JMP$SYSVER: JMP SYSVER ; 17DH 0180 C3EC01 JMP$BREAK: JMP SENDBRK ; 180H ; ; ; DO NOT CHANGE THE FOLLOWING SIX LINES. ; 0183 JMP$ILPRT: DS 3 ; 183H 0186 JMP$INBUF DS 3 ; 186H 0189 JMP$INLNCOMP: DS 3 ; 189H 018C JMP$INMODEM DS 3 ; 18CH 018F JMP$NXTSCRN: DS 3 ; 18FH 0192 JMP$TIMER DS 3 ; 192H ; ; ; ROUTINE TO CLEAR TO END OF SCREEN. IF USING CLREOS AND CLRSCRN, SET ; SCRNTEST TO YES AT 010AH (ABOVE). ; 0195 CD8301 CLREOS: CALL JMP$ILPRT ; 195H 0198 1000000000 DB 16,0,0,0,0 ;VECTOR MT CODE FOR CLREOS 198H 019D C9 RET ; 19DH ; 019E CD8301 CLRSCRN: CALL JMP$ILPRT ; 19EH 01A1 0400000000 DB 4,0,0,0,0 ;VECTOR MT CODE FOR CLRSCRN 1A1H 01A6 C9 RET ; 1A6H ; 01A7 CD8301 SYSVER: CALL JMP$ILPRT ; 1A7H 01AA 436F6D7075 DB 'Computer with Morrow MIO board -- Port #2' 01D3 0D0A00 DB CR,LF,0 01D6 C9 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. ; ;----------------------------------------------------------------------- ; ; YOU CAN PUT IN A MESSAGE AT THIS LOCATION 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. ; 01D7 486F772061LOGON: DB 'How are you today?',CR,LF,0 ;..... ; ; ; ADD YOUR OWN ROUTINE HERE TO SEND A BREAK TONE TO RESET SOME TIME-SHARE ; COMPUTERS, IF DESIRED. ; 01EC C9 SENDBRK: RET ;..... ; ; ; ADD YOUR OWN ROUTINE HERE TO PUT DTR LOW AND/OR SEND A BREAK TONE. ; CHECK OTHER ROUTINES SUCH AS MDM709DP.ASM WHICH IS USING THIS FEATURE. ; 01ED C9 GOODBYE: RET ;..... ; ; ; YOU CAN USE THIS AREA FOR ANY SPECIAL INITIALIZATION OR SETUP YOU MAY ; WISH TO INCLUDE. EACH MUST STOP WITH A RET. YOU CAN CHECK THE OTHER ; AVAILABLE OVERLAYS FOR IDEAS HOW TO WRITE YOUR OWN ROUTINES IF THAT ; MAY BE OF SOME HELP. ; 01EE 113C02 INITMOD: LXI D,BAUD$MSG ;POINT TO BAUD SELECTION MESSAGE 01F1 0E09 MVI C,9 ;BDOS PRINT STRING CMD 01F3 CD0500 CALL BDOS ;USE BDOS TO PRINT BAUD MESSAGE 01F6 118802 LXI D,BAUD$BUF ;POINT TO 1 CHAR INPUT BUFFER 01F9 0E0A MVI C,10 ;BDOS CMD TO FILL BUFFER FROM CON: 01FB CD0500 CALL BDOS 01FE 3A8A02 LDA CHOICE ;GET THE CHARACTER FROM THE BUFFER 0201 D631 SUI 31H ;SUBTRACT ASCII BIAS 0203 DAEE01 JC INITMOD ;INPUT MUST BE > ZERO 0206 FE04 CPI 4 ;AND LESS THAN 4 0208 D2EE01 JNC INITMOD ;NOW WE HAVE 0,1,2,OR3 IN 'A' REGISTER. 020B 07 RLC ;MULT BY 2 FOR TABLE OFFSET 020C 328A02 STA CHOICE ;SAVE FOR LATER 020F 3E02 MVI A,GROUP ;SELECT GROUP (USER) NUMBER 0211 D34F OUT GRP$CTL 0213 3E80 MVI A,DLAB ;SET DATA LATCH ACCESS BIT 0215 D34B OUT LCR 0217 3A8A02 LDA CHOICE ;GET BACK OFFSET INTO BAUD TABLE 021A 218B02 LXI H,INITBLE ;POINT TO TABLE BASE 021D 85 ADD L ;ADD OFFSET 021E 6F MOV L,A 021F 7E MOV A,M ;GET LOW ORDER BYTE FOR BAUD RATE 0220 D348 OUT DLL 0222 23 INX H ;POINT TO NEXT TABLE ENTRY 0223 7E MOV A,M ;AND SEND IT TO BAUD REGISTER 0224 D349 OUT DLM 0226 3E07 MVI A,WLS0+WLS1+STB ;8 BIT DATA WORD & 2 STOP BITS 0228 D34B OUT LCR 022A DB48 IN RBR ;CLEAR FLAGS 022C 3E00 MVI A,IMASK ;SET INTERRUPT STATUS (ALL DISABLED) 022E D349 OUT IER 0230 C9 RET ;..... ; ; 0231 C9 SETUPR: RET ;..... ; ; 0232 3E02 MOD$SEL: MVI A,GROUP ;GROUP SELECT CODE 0234 D34F OUT GRP$CTL ;GROUP SELECT REGISTER 0236 3E07 MVI A,WLS0+WLS1+STB ;MAKE SURE DLAB IS CLEAR 0238 D34B OUT LCR 023A C9 RET ;..... ; ; ; IF USING THE HAYES SMARTMODEM THIS IS UNAVAILABLE WITHOUT A SPECIAL ; CHANGE. ; 023B C9 SPCLMENU: RET ; ; 023C 0D0A095345BAUD$MSG: DB CR,LF,TAB,'SELECT BAUD RATE (MIO user 1)' 025C 0D0A090931 DB CR,LF,TAB,TAB,'1. 300' 0266 0D0A090932 DB CR,LF,TAB,TAB,'2. 1200' 0271 0D0A090933 DB CR,LF,TAB,TAB,'3. 4800' 027C 0D0A090934 DB CR,LF,TAB,TAB,'4. 9600','$' ; 0288 0100 BAUD$BUF: DB 01,00 028A 00 CHOICE: DB 00 ;..... ; ; ; THE INITIALIZATION TABLE IS NOTHING MORE THAN A LIST OF BYTES TO ; BE SEND TO THE BAUD RATE REGISTERS, IN THE SAME ORDER AS THE CHOICES ; IN THE BAUD MESSAGE ABOVE. NOTE THE MSB,LSB ORDER WITHIN EACH ENTRY. ; 028B 8001 INITBLE: DB 80H,01 ;300 BAUD DIVISOR = 0180H 028D 6000 DB 60H,0 ;1200 BAUD DIVISOR = 0C0H 028F 1800 DB 18H,0 ;4800 BAUD DIVISOR = 018H 0291 0C00 DB 0CH,0 ;9600 BAUD DIVISOR = 00CH ;..... ; ; ; NOTE: MUST TERMINATE PRIOR TO 0400H (WITH SMARTMODEM) ; 0C00H (WITHOUT SMARTMODEM) ;..... ; 0293 END