Title 'MEX overlay for Osborne Executive, version 1.1' ; ; ; (delete above title line if not assembling with MAC) ; ; REV EQU 11 ;overlay revision level ; ; MEX Overlay for Osborne EXECUTIVE with external ; modem connected to the MODEM port (port 0CH). ; ; Incorporates a fully implemented SET BAUD function ; using the MEX processor. The initialization routine ; has been modified to allow sending an initialization ; string to the modem. (The string is defined at the ; end of this overlay.) This is for the US Robotics ; Password modem. (It sets dialing to tone mode, ; turns on the echo mode, turns on the extended response ; codes, and defeats the auto-answer function.) It can ; be eliminated or modified for appropriate use. ; ; If you exit to CPM without disconnecting, when you ; re-enter MEX, the program will skip the initialization ; procedure (both port initialization and modem ; initialization) and remind you to do a SET BAUD to the ; rate in effect. Although the rate has not been changed, ; later functions may not operate properly. You may cover ; this in advance by entering the command on the command ; line when re-calling MEX. For example: ; MEX SET BAUD 300; T ; ; Assembly notes: ; This overlay incorporates a disconnect routine which ; lowers DTR for 300 ms. Accordingly, if you use the ; Smartmodem overlay, set DISC to FALSE in MXO-SMxx.ASM. ; ; If your modem does not require an initialization string, ; you may replace the string at SMINIT by a single DB 0. ; ; ; Calling conventions for the various overlay entry points ; are detailed more fully in the PMMI overlay (MXO-PMxx.ASM, ; where xx=revision number). ; ; History as a MEX overlay: ; ; 07/01/84 v1.1: Provided support for all MEX baud rates. ; Made overlay clonable at any baud rate. ; Included additional SET routines. ; ; 06/24/84 MEXified the overlay - Bob Abrahams, Los Angeles, CA ; Named MXO-OX10.ASM CIS 72406,1355 ; ; History as a MDM overlay: ; ; 11/11/83 Renamed to M7OX-1.ASM - Irv Hoff ; 07/27/83 Renamed to work with MDM712 - Irv Hoff ; : : : ; : : : ; 07/17/83 Combined George Peace Osborne version ; with Roy Robinson Osborne version ; then renamed MDM711OX.ASM - Irv Hoff ; ;------------------------------------------------------------ ; ; Misc equates: ; NO EQU 0 YES EQU NOT NO TPA EQU 100H CR EQU 13 LF EQU 10 TAB EQU 9 ESC EQU 27 BELL EQU 7 ; ; Osborne EXECUTIVE port definitions: ; PORT EQU 0Ch ;base port (data or status) MODCT1 EQU PORT+1 ;modem control port MODDAT EQU PORT ;modem data port BAUDRP EQU 04h ;modem baud rate port ; ; Osborne EXECUTIVE bit definitions: ; MDRCVB EQU 01H ;modem receive bit (DAV) MDRCVR EQU 01H ;modem receive ready MDSNDB EQU 04H ;modem send bit MDSNDR EQU 04H ;modem send ready bit ; ; MEX Service Processor codes: ; MEX EQU 0D00H ;address of the service processor INMDM EQU 255 ;get char from port to A, CY=no more in 100 ms TIMER EQU 254 ;delay 100ms * reg B TMDINP EQU 253 ;B=# secs to wait for char, cy=no char CHEKCC EQU 252 ;check for ^C from KBD, Z=present SNDRDY EQU 251 ;test for modem-send ready RCVRDY EQU 250 ;test for modem-receive ready SNDCHR EQU 249 ;send a character to the modem (after sndrdy) RCVCHR EQU 248 ;recv a char from modem (after rcvrdy) LOOKUP EQU 247 ;table search: see CMDTBL comments for info PARSFN EQU 246 ;parse filename from input stream BDPARS EQU 245 ;parse baud-rate from input stream SBLANK EQU 244 ;scan input stream to next non-blank EVALA EQU 243 ;evaluate numeric from input stream LKAHED EQU 242 ;get nxt char w/o removing from input GNC EQU 241 ;get char from input, cy=1 if none ILP EQU 240 ;inline print DECOUT EQU 239 ;decimal output PRBAUD EQU 238 ;print baud rate ; CONOUT EQU 2 ;simulated BDOS function 2: console char out PRINT EQU 9 ;simulated BDOS function 9: print string INBUF EQU 10 ;input buffer, same structure as BDOS 10 ; ; ------------------------------------- ; ; From MEXPAT10 -- to establish as terminal escape character ORG 0D1Fh ESCCHR: DB ESC ;Terminal mode escape character = ; ; ------------------------------------ ; ORG TPA ;we begin ; DS 3 ;MEX has a JMP START here ; ; PMODEM: DB NO ;yes=PMMI modem \ / These 2 locations are not SMODEM: DB YES ;yes=Smartmodem / \ referenced by MEX TPULSE: DB 'T' ;T=touch, P=pulse (not referenced by MEX) CLOCK: DB 40 ;clock speed x .1, up to 25.5 mhz. ;4 MHz for Osborne Executive 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 3 ;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 8 ;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 COLUMS: DB 5 ;number of directory columns SETFL: DB YES ;yes=user-defined SET command SCRTST: DB YES ;yes=if home cursor and clear screen ;routine at CLRSCRN ACKNAK: DB 0 ;was once ACKNAK, now spare BAKFLG: DB NO ;yes=make .BAK file CRCDFL: DB YES ;yes=default to CRC checking ;no=default to Checksum checking TOGCRC: DB YES ;yes=allow toggling of Checksum to CRC CVTBS: DB NO ;yes=convert backspace to rub TOGLBK: 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) TOGLF: DB YES ;yes=allow toggling of LF after CR TRNLOG: DB NO ;yes=allow transmission of logon ;write logon sequence at location LOGON SAVCCP: DB YES ;yes=do not overwrite CCP LOCNXT: DB YES ;yes=local cmd if EXTCHR precedes ;no=not local cmd if EXTCHR precedes TOGLOC: 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 XOFTST: DB NO ;yes=allow testing of XOFF from remote ;while sending a file in terminal mode XONWT: DB NO ;yes=wait for XON after sending CR while ;transmitting a file in terminal mode TOGXOF: DB YES ;yes=allow toggling of XOFF testing IGNCTL: 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 'B'-40H ;^@ = Send a 300 ms. break tone NOCONN: DB 'N'-40H ;^N = Disconnect from phone line LOGCHR: DB 'I'-40H ;^L = Send logon LSTCHR: DB 'P'-40H ;^P = Toggle printer UNSVCH: DB 'R'-40H ;^R = Close input text buffer TRNCHR: DB 'T'-40H ;^T = Transmit file to remote SAVCHR: DB 'Y'-40H ;^Y = Open input text buffer EXTCHR: DB '\'-40H ;^\ = Send next character ; DS 2 ;not used ; ; Low-level modem I/O routines. ; INCTL1: MVI A,10H OUT MODCT1 IN MODCT1 ;in modem control port RET DB 0,0,0 ;spares, if needed (10 bytes total) ; OTDATA: OUT MODDAT ;out modem data port RET DB 0,0,0,0,0,0,0 ;spares, if needed (10 bytes total) ; INPORT: IN MODDAT ;in modem data port RET DB 0,0,0,0,0,0,0 ;spares, if needed (10 bytes total) ; ; Bit-test routines. ; MASKR: ANI MDRCVB ! RET ;bit to test for receive ready TESTR: CPI MDRCVR ! RET ;value of receive bit when ready MASKS: ANI MDSNDB ! RET ;bit to test for send ready TESTS: CPI MDSNDR ! RET ;value of send bit when ready ; DS 12 ; ; LOGON: DS 2 ;needed for MDM compat, not ref'd by MEX DIALV: DS 3 DISCV: JMP DISCON GOODBV: JMP GOODBYE ;called before exit to CP/M INMODV: JMP NITMOD ;initialization. Called at cold-start NEWBDV: JMP PBAUD ;set baud rate NOPARV: DS 3 ;set modem for no-parity PARITV: DS 3 ;set modem parity SETUPV: JMP SETCMD ;SET cmd: jump to a RET if you don't write SET SPMENV: DS 3 ;not used with MEX VERSNV: JMP SYSVER ;Overlay's voice in the sign-on message BREAKV: JMP SBREAK ;send a break ; ; The following jump vector provides the overlay with access to special ; routines in the main program (retained and supported in the main pro- ; gram for MDM overlay compatibility). These should not be modified by ; the overlay. ; ; Note that for MEX 2.0 compatibility, you should not try to use these ; routines, since this table will go away with MEX 2.0 (use the MEX ; service call processor instead). ; ILPRTV: DS 3 ;replace with MEX function 240 INBUFV: DS 3 ;replace with MEX function 10 ILCMPV: DS 3 ;replace with table lookup funct. 247 INMDMV: DS 3 ;replace with MEX function 255 NXSCRV: DS 3 ;not supported by MEX (returns w/no action) TIMERV: DS 3 ;replace with MEX function 254 ; CLREOS: CALL ILPRT DB ESC,'Y',0 RET DB 0,0 ; CLS: CALL ILPRT DB ESC,'Z',0 RET DB 0,0 ; ; ; end of fixed area ; ILPRT: MVI C,ILP ;MEX In-line print JMP MEX ; SYSVER: CALL ILPRT DB 'For Osborne Executive MODEM port, ver. ' DB REV/10+'0' DB '.' DB REV MOD 10+'0' DB CR,LF,0 RET ; ; This routine allows a 300 ms. break tone to be sent to reset some ; time-share computers. ; SBREAK: MVI A,5 OUT MODCT1 MVI A,0F8H ;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 modems such as the Bell 212A, etc. ; DISCON: MVI A,5 OUT MODCT1 ;SEND TO THE STATUS PORT MVI A,68H ;TURN OFF DTR ; GOODBYE1: OUT MODCT1 MVI B,3 ;DELAY 300 MS. MVI C,TIMER CALL MEX GOODBYE: MVI A,5 OUT MODCT1 MVI A,0E8H ;RESTORE TO NORMAL, 8 BITS, DTR ON, ETC. OUT MODCT1 RET ;..... ; ; ; Osborne EXECUTIVE RS232 initialization -- ; Checks to see if a call is in progress (carrier on). If so, ; it sends a warning message. Otherwise it sets the CTC timer ; 04h for send and receive baudrate and sends the modem ; initialization string. ; ; NITMOD: ; CALL INCTL1 ;GET SIO STATUS ANI 08H ;SEE IF CARRIER IS PRESENT JZ NODCD ;IF NOT, DO NORMAL INITIALIZE CALL ILPRT ;IF SO, ISSUE SPECIAL MESSAGE INSTEAD DB CR,LF DB '++ Call in progress --',CR,LF DB ' SET BAUD to rate in effect for this call. ++' DB BELL,CR,LF,LF,0 RET ; NODCD: MVI A,00H ;SELECT REG. OUT MODCT1 MVI A,18H ;THROW OUT OF MODE OUT MODCT1 MVI A,04H ;SELECT REG. OUT MODCT1 MVI A,44H ;SET ASCII PARAMETERS OUT MODCT1 MVI A,03H ;SELECT REG. OUT MODCT1 MVI A,0C1H ;ENABLE RECEIVE OUT MODCT1 MVI A,05H ;SELECT REG. OUT MODCT1 MVI A,0EAH ;ENABLE SEND, DTR, RTS OUT MODCT1 LDA MSPEED ;GET INITIAL BAUD RATE CALL PBAUD ;SET UP INITIAL RATE ; LXI H,SMINIT ;MODEM INITIALIZATION STRING CALL SMSEND ;SEND TO MODEM SMTLP: MVI B,1 MVI C,TMDINP ;EAT ANY RESPONSE CHARACTERS CALL MEX JNC SMTLP ;UNTIL 100 MS OF QUIET TIME RET ; SMSEND: MVI C,SNDRDY ;WAIT FOR MODEM READY CALL MEX JNZ SMSEND MOV A,M ;FETCH NEXT CHARACTER INX H ORA A ;END? RZ ;DONE IF SO MOV B,A ;NO, POSITION FOR SENDING MVI C,SNDCHR ;NOPE, SEND THE CHARACTER CALL MEX JMP SMSEND ; ; Sets the modem speed via the SET command. ; SETCMD: MVI C,SBLANK ;ANY ARGUMENTS? CALL MEX JC BDSHOW ;IF NOT, DISPLAY BAUD RATE MVI C,LKAHED ;LOOK AT NEXT CHARACTER CALL MEX ;TO SEE IF DIGIT 1-9 CPI '1' ;IS IT TOO SMALL? JC NOTNUM CPI '9'+1 ;IS IT TOO BIG? JC STBAUD NOTNUM: LXI D,CMDTBL MVI C,LOOKUP CALL MEX ;PARSE THE ARGUMENT PUSH H ;SAVE ANY PARSED ARGUMENTS ON STACK RNC ;IF WE HAVE ONE, RETURN TO IT POP H ;OOPS, INPUT NOT FOUND IN TABLE SETERR: CALL ILPRT DB CR,LF,'++ SET command error ++',BELL,CR,LF,LF,0 RET ; ; Argument table ; CMDTBL: DB '?'+80H ;HELP DW STHELP DB 'BAU','D'+80H ;"SET BAUD" DW STBAUD DB 'INI','T'+80H ;"SET INIT" DW NITMOD DB 0 ;TABLE TERMINATOR ; ; "SET ?" processor ; STHELP: CALL ILPRT DB CR,LF,'SET or SET BAUD ' DB CR,LF,' is one of:' DB ' 110 300 450 600 710 1200 2400 4800 9600 19200' DB CR,LF,LF,0 RET ; ; "SET BAUD" processor ; STBAUD: MVI C,BDPARS ;FUNCTION CODE: PARSE A BAUDRATE CALL MEX ;LET MEX LOOK UP CODE JC SETERR ;JUMP IF INVALID CODE CALL PBAUD ;NO, TRY TO SET IT JC SETERR ;IF NOT ONE OF OURS, BOMB OUT BDSHOW: CALL ILPRT ;DISPLAY BAUD DB 'Baud: ',0 LDA MSPEED ;GET CURRENT BAUD RATE MVI C,PRBAUD ;LET MEX PRINT IT CALL MEX CALL ILPRT ;CR,LF DB CR,LF,0 RET ; ; This routine sets baud rate passed as MSPEED code in A. ; Returns CY=1 if baud rate not supported (if supported, ; this routine must set the new MSPEED code). ; PBAUD: PUSH H ;DON'T ALTER ANYBODY PUSH D PUSH B STA MSPEED ;ALL RATES SUPPORTED ADD A ;DOUBLE IT MOV E,A ;MSPEED CODE TO DE MVI D,0 LXI H,BAUDTB ;OFFSET INTO TABLE DAD D MOV A,M ;FETCH LSB CODE OUT BAUDRP ;SEND IT INX H ;SECOND BYTE MOV A,M ;FETCH MSB CODE OUT BAUDRP ;SEND IT ORA A ;RETURN NO ERRORS PBEXIT: POP B POP D POP H RET ; BAUDTB: ;TABLE OF VALUES TO SEND TO 8253 TIMER ;SEND LSB, THEN MSB (NOTE: PSEUDO-OP DW ;STORES LSB THEN MSB, SO SEQUENCE IS CORRECT.) DW 0417H ;110 DW 0180H ;300 DW 0100H ;450 DW 00C0H ;600 DW 00A2H ;710 DW 0060H ;1200 DW 0030H ;2400 DW 0018H ;4800 DW 000CH ;9600 DW 0006H ;19200 ; ; SMINIT: DB 'ATTE1X1S0=0',CR,0 ;MODEM INITIALIZE STRING ; END