; MXO-OS22.ASM - OSBORNE 1 OVERLAY 24 AUG 84 ; for MEX11.COM - Changed START location to 0EB9H ; Mark S. Stein, Morton Grove RBBS RCP/M (312) 470-0017 ; ; MXO-OS21.ASM - Osborne I Overlay 10JULY84 ; for MEX10.COM & MDM7xx.COM file - 10 JULY 84 10JULY84 ; ; This version is a synthesis of MXO-OS01, MXO-OS12. The primary 10JULY84 ; change from Bob Schultz's MXO-OS01 version is implementation of 10JULY84 ; the NEWBD vector, allowing support of the optional baud rate 10JULY84 ; entry for phone numbers. ; ; -- Howard Gerber, WB5YWS 10JULY84 ; contact me through the OZZ-HAM RCP/M (713) 893-0424 10JULY84 ; or The Weekender (713) 492-8700 10JULY84 ; Bob Schultz's notes follow: 10JULY84 ; This file is derived from MDM711OS.ASM by Irv Hoff and Paul Kelly. ; It was necessary to put in some kludges to make it work with MEX10. ; The problem was that MEX10 called the modem routines before it called ; the modem initialization routine. Since the modem routines MUST be ; above 4000H, ozy wasn't very happy. While I was at it, I cleaned up ; the baud rate routines so that the default baud rate can be set by ; setting MSPEED to the desired value. I also added a send break routine ; and a disconnect routine. Unfortunately, these routines will work only ; if you use the modem connector rather than the RS-232 connector. It ; seems that ozy was designed to use the RS-232 connector to be able to ; drive a printer at the same time that the modem connector is being used. ; I don't know why anyone would want a serial printer when a parallel ; printer is cheaper, but that's the way OCC did it. The problem with ; sending a break through the serial port is the MC6850 ACIA can only send ; a break when RTS is ON. This is quite reasonable, but the hardware ; design of the Osborne I clamps the transmitted data from the RS-232 ; connector to a MARK when RTS is on. Since a break is a SPACE, this ; doesn't work very well. The only solutions are: 1) Build an interface ; to convert the modem connector signals to proper RS-232 signals ; 2) Modify the main logic board. This looks like it would be very ; easy to do, but I haven't tried it. Just lift the ends of the resistors ; R20 (10K) and R35 (1.0K) that are connected together and connect the ; ends off the board with a wire. I don't know if the resistors are ; labeled, or even if the mod will work. It should, but there are as ; many gotcha's in hardware as there are in software. Good luck. If you ; do make the mod, set the RS232 EQU to NO. ; This file should also work with MDM730 -- I mean MDM740 or perhaps it's ; now MDM750. Just set MEX to off. But if you can get MEX, why bother ; with MDM? ; A few helpful hints for MEX10. When MEX starts up, it tries to READ ; INI.MEX. You can create the INI file with an editor and put any MEX ; commands that you want into it. Or else you can disable the feature ; with STAT INITFILE OFF and then clone it. When you get sick of the ; prompt that you get when entering terminal mode type POKE $40A0 $C9 ; and then clone it. The clone number is two bytes at 5335H with the ; low order byte first. ; I'm releasing this file as version 0.1 without as much testing as I'd ; like to do only because I can hear the anguished cries of Osborne owners ; who are faced with yet another version of MDM and can't get MEX running. ; When I have more time, I'll release an upgraded version 1.0. ; You can contact me through just about any RCPM system in Toronto. ; Bob Schultz ; = = = = = = = = = = = = = = = = = = BELL: EQU 07H ;bell CR: EQU 0DH ;carriage return ESC: EQU 1BH ;escape LF: EQU 0AH ;linefeed YES: EQU 0FFH NO: EQU 0 START: EQU 0EB9H ;location MEX10 jumps to -- for kludge RS232: EQU YES ;set this to YES if you're ; using the RS232 connector ;and to NO if you're using the modem connector MEX: EQU YES ;set this to YES for MEX10 ;and to NO for MDM7 ; values to send to 6850 control register for ; 8 bits, no parity, 1 stop bit IF RS232 ;RTS MUST be off BAUD3: EQU 56H ;300 baud 8-bit no parity BAUD12: EQU 55H ;1200 baud 8-bit no parity ENDIF IF NOT RS232 ;RTS on seems reasonable BAUD3: EQU 16H ;300 baud 8-bit no parity BAUD12: EQU 15H ;1200 baud 8-bit no parity BRKBIT: EQU 60H ;bits to set to send break RTSBIT: EQU 40H ;bit to turn off RTS ENDIF MODCTLP: EQU 2A00H ;status register for RS232 MODDATP: EQU MODCTLP+1 ;data resister for RS232 MODSNDB: EQU 2 ;bit to test for ready to send MODSNDR: EQU 2 ;modem send ready when high MODRCVB: EQU 1 ;bit to test for received data MODRCVR: EQU 1 ;modem receive ready when high ORG 100H IF MEX JMP INITMOD ;I hate this kludge ENDIF IF NOT MEX DS 3 ENDIF 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 5 ;0=110 1=300 2=450 3=600 4=710 5=1200 107H ;6=2400 7=4800 8=9600 9=19200 default BYTDLY: DB 9 ;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 9 ;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 4 ;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 NO ;yes=allow transmission of logon 115H ;write logon sequence at location LOGON SAVCCP: DB NO ;no=do not save CCP, may be overwritten 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 EXTRA1: DB 0 ;for future expansion 11EH EXTRA2: DB 0 ;for future expansion 11FH BRKCHR: DB 'B'-40H ;^B = Send a 300 ma. break tone 120H NOCONNCT: DB 'N'-40H ;^N = Disconnect from the phone line 121H LOGCHR: DB 'W'-40H ;^W = 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$MODCTLP: CALL $-$ ! RET ;get the I/O status 12AH DS 6 ;patched to OSTAT by INITMOD OUT$MODDATP: CALL $-$ ! RET ;send a character to the I/O 134H DS 6 ;patched to OSOUT by INITMOD IN$MODDATP: CALL $-$ ! RET ;get a character from the I/O 13EH DS 6 ;patched to OSIN by INITMOD 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 12 ; 156H LOGONPTR: DW LOGON ;for user message. 160H DS 3 ; 162H JMP$DISCON JMP DISCON ; 165h JMP$GOODBYE: JMP GOODBYE ; 168H JMP$INITMOD: IF MEX RET ! NOP ! NOP ;already initialized by kludge 16BH ENDIF IF NOT MEX JMP INITMOD ;initialize modem code and 6850 ENDIF IF MEX JMP NEWBD ; support optional NEWBD 10JULY84 16EH ENDIF IF NOT MEX RET ! NOP ! NOP ;(by-passes PMMI routine) 16EH ENDIF 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 CLREOS: CALL JMP$ILPRT ; 195H DB 0,0,0,0,0 ;O-1 has no clear EOS. 198H RET ; 19DH CLRSCRN: CALL JMP$ILPRT ; 19EH DB 1AH,0,0,0,0 ;O-1 clear screen, home cursor 1A1H RET ; 1A6H SYSVER: CALL JMP$ILPRT ; 1A7H DB CR,LF DB 01BH,')' ;into half intensity DB 'For the Osborne 1: ' DB 01BH,'(' ;out of half intensity DB 'Revised by M. Stein - 08/24/84' DB CR,LF,LF,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. ; ;----------------------------------------------------------------------- ; You can put in a message at this location which can be called up with ; CTL-W if TRANLOGON has been set TRUE. You can put in several lines if ; desired. End with a 0. LOGON: DB 0 ; Sends a 300 msec break. Will work only with the modem connector. SENDBRK: IF NOT RS232 PUSH H LDA BAUD ;turn on break ORI BRKBIT CALL OSET MVI B,3 ;wait for 300 ms CALL JMP$TIMER LDA BAUD ;turn off break CALL OSET POP H ENDIF RET ; Drops RTS for 3 sec. RTS is not available on the RS232 connector. DISCON: IF NOT RS232 PUSH H LDA BAUD ;drop RTS ORI RTSBIT CALL OSET MVI B,30 ;wait for 3 sec CALL JMP$TIMER LDA BAUD ;restore RTS CALL OSET POP H ENDIF RET ; if you put a routine in here, it should NOT do a disconnect when ; using MEX. That's handled by the DISCON routine above GOODBYE: RET ; You can put any items in this area you wish to display that are of in- ; terest to those using this equipment. If using the Hayes Smartmodem ; this is unavailable without a special address change. End the routine ; with a RET. SPCLMENU: RET ; This is the Osborne initialization routine. INITMOD: IF NOT MEX ;MEX could not be cloned if this code was in LDA FINITFLG ;flag set yet? ORA A RNZ ;return if have already been here INR A STA FINITFLG ;set flag ENDIF LHLD 0005H+1 ;FIND START OF BDOS LXI D,-0100H ;GO TO FIRST PAGE AHEAD OF BDOS DAD D ;HL NOW POSITIONED ONE PAGE BELOW BDOS PUSH H ;SAVE THE ADDRESS LXI D,BDJ ;POINT TO OUR ROUTINE TO PUT THERE LXI B,CDLEN+2 ;SET LENGTH OF CODE XCHG DB 0EDH,0B0H ;Z80 LDIR LHLD 0005H+1 ;GET BDOS ADDRESS BACK ONCE MORE POP D ;GET THE STARTING ADDRESS OFF STACK PUSH D ;PUT IT BACK ON THE STACK INX D ;POINT TO ADDRESS POSITION XCHG ;PUT INTO 'HL' MOV M,E ;STORE 'LSP' ADDRESS INX H ;GET 'LSP' LOCATION MOV M,D ;STORE 'MSP' ADDRESS POP H ;GET THE ADDRESS BACK ONCE MORE SHLD 0005H+1 ;NEW ADDRESS TO PROTECT FOR OVERWRITE LXI D,OSIN-BDJ ;GET THE LENGTH OF ROUTINE TO MOVE DAD D ;COMUTE ADDRESS OF THE 'OSIN' ROUTINE SHLD IN$MODDATP+1 ;PATCH CALL FOR "GET CHAR." ROUTINE LXI D,OSOUT-OSIN DAD D SHLD OUT$MODDATP+1 ;PATCH CALL FOR "SEND CHAR." ROUTINE LXI D,OSTAT-OSOUT DAD D SHLD IN$MODCTLP+1 ;PATCH CALL FOR "GET STATUS" ROUTINE MVI C,BAUD3 ;300 baud for 6850 LDA MSPEED CALL NEWBD ; set baud rate 10JULY84 IF MEX JMP START ;more kludge ENDIF IF NOT MEX RET ENDIF NEWBD: CPI 1 ; 10JULY84 JZ OK300 ; 10JULY84 CPI 5 ; 10JULY84 JZ OK1200 ; 10JULY84 RET ; 10JULY84 OK300: MVI A,1 ; MSPEED 300 bps 10JULY84 MVI C,BAUD3 ; 01 300 bps 10JULY84 STA MSPEED ; 10JULY84 JMP STBAUD ; 10JULY84 OK1200: MVI A,5 ; MSPEED 1200 bps 10JULY84 MVI C,BAUD12 ; 01 1200 bps 10JULY84 STA MSPEED ; 10JULY84 STBAUD: PUSH H ; 10JULY84 CALL OSET1 ; set baud rate 10JULY84 POP H ; 10JULY84 XRA A ; clear carry 10JULY84 RET ; 10JULY84 ; stuff the control register on the 6850 OSET: MOV C,A OSET1: LHLD 1 ;GET BIOS+3 ADDRESS MVI L,3CH ;SPECIAL OSBORNE ROUTINE PCHL ;BRANCH TO IT ; Change the baud rate with the SET command SETUPR: PUSH H AGAIN: LXI D,BAUDBUF ;POINT TO INPUT BUFFER CALL JMP$ILPRT DB 'Input Baud Rate (300, 1200): ',0 CALL JMP$INBUF LXI D,BAUDBUF+2 CALL JMP$INLNCOMP ;COMPARE BAUDBUF+2 WITH CHARACTERS BELOW DB '300',0 MVI A,1 ;MSPEED 300 BAUD MVI C,BAUD3 ;OSBORNE 300 BAUD JNC OK ;GO IF GOT MATCH CALL JMP$INLNCOMP DB '1200',0 MVI A,5 ;MSPEED 1200 BAUD MVI C,BAUD12 ;OSBORNE 1200 BAUD JNC OK CALL JMP$ILPRT ;ALL MATCHES FAILED - TELL OPERATOR DB '++ Incorrect entry ++',CR,LF,BELL,0 JMP AGAIN ;TRY AGAIN OK: STA MSPEED ;SET MSPEED MOV A,C STA BAUD ;save 6850 control register image CALL OSET POP H XRA A ;CLEAR CARRY RET BAUDBUF: DB 10,0 DS 10 BAUD: DS 1 IF NOT MEX FINITFLG: DB 0 ENDIF ; --- ROUTINES THAT GET PLACED JUST UNDER 'BDOS' OVERLAYING 'CCP' BDJ: JMP $-$ ;THIS GETS PATCHED TO JUMP TO BDOS ENTRY OSIN: DI ;DISABLE INTERRUPTS OUT 0 ;SWITCH TO ALTERNATE PAGE LDA MODDATP ;GET DATA BYTE OUT 1 ;SWITCH PAGES BACK EI ;RE-ENABLE INTERRUPTS RET OSOUT: DI ;DISABLE INTERRUPTS OUT 0 ;SWITDH TO ALTERNATE PAGE STA MODDATP ;SEND DATA BYTE OUT 1 ;SWITCH PAGES BACK EI ;RE-ENABLE INTERRUPTS RET OSTAT: DI ;DISABLE INTERRUPTS OUT 0 ;SWITCH TO ALTERNATE PAGE LDA MODCTLP ;GET STATUS BYTE OUT 1 ;SWITCH PAGES BACK EI ;RE-ENABLE INTERRUPTS RET CDLEN: EQU $-BDJ ;LENGTH OF CODE TO COPY ;----------------------------------------------------------------------- ; ; NOTE: MUST TERMINATE PRIOR TO 0400H (with Smartmodem) ; 0C00H (without Smartmodem) ; END