; Title 'MEX Overlay for Kaypros Version 4.3' ; REV EQU 43 ;OVERLAY REVISION LEVEL ; ; ; MEX Overlay for Kaypro Computers, use MXM overlay for ; external modem dial functions. ; ; A full-featured SET command processor is implemented. ; The following table outlines the SET command options: ; ; SET Command ; ; BAUD Set modem to Baud rate specified. ; Baud rates supported are 110, 300, ; 600, 1200, 2400, 4800, 9600, 19200 ; ; PARITY Set Parity to Odd, Even, or Off ; STOPBITS Set number of Stop Bits to 1, 1.5, 2 ; LENGTH Set word length to 5, 6, 7, 8 ; ; Use the SSET command to change settings in the MXM modem ; overlay. (Not needed unless you have a smartmodem with ; auto dialer and you want to use the DIAL command.) ; ; This overlay is intended to be fully compatible with the ; MEX structure and should be readily upward compatible with ; the predicted MEX 2.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: ; ; 08/16/85 4.3 Removed Smartmodem code from MXO-KPS4.AQM to ; make this MXO-KP43.AQM overlay which can be used ; with external MXM modem overlays. (Such as the ; MXM-SM?? for external smartmodems or the MXM-2401 ; for external SM2400 and USR2400 modems. The MXM ; overlays are needed to support DIAL and SSET.) ; (Use the MXO-K484 overlay if you have an internal ; modem or the MXO-KPS4 if you use an external ; Smartmodem 1200 or Anchor. Both of these last two ; contain modem code in the MXO overlay and do not ; need an MXM overlay.) ; -- Kim Levitt ; ; 12/20/84 4.0 Fixed bugs in send break and initialization routines. ; -- Kim Levitt ; ; 11/25/84 3.0 Added SILENT option to quiet that damn beep-beep- ; beep while dialing out. Speaker will come on at ; end of dialing. ; -- Kim Levitt ; ; 9/19/84 2.0 Fixed bug in DISCON routine that left DTR/RTS off, ; added "soft" abort (any key except ^C) to abort a ; CALL in progress, but not repeats or next CALL cmds. ; -- Kim Levitt ; ; 9/9/84 1.0 The universal Kaypro overlay distributed previously ; combined support for both the internal modem on the 4'84 ; and external smartmodems. This overlay supports external ; smartmodems only, and thus provides more flexibility for ; expansion and adaptability to new MEX releases. The only ; additional feature of this overlay is support for ; entering Terminal mode via generation of manual Originate ; or Answer carrier tones. Clarity of documentation for ; the SET command has also been improved. ; Terry Carroll ; ; ; Credits: ; ; M7KP-1 overlay structure by Irv Hoff ; Parity, Length and Stopbits routines by Norm Saunders ; MXO-KP overlay structure by John Smith ; Art work by Terry Carroll ; Bug fix/feature added by Kim Levitt ; Based on an idea by an inspired hacker ; Music by John Williams ; Directed by Stanley Kubrick ; ;------------------------------------------------------------ ; ; Miscellaneous equates ; NO EQU 0 YES EQU 0FFH ; TPA EQU 100H ; CR EQU 13 LF EQU 10 TAB EQU 9 ; ; Silent dial option: ; SILENT EQU YES ;if YES, speaker is silenced during dial ; ; (NOTE: This may not work on all "smart" modems, it works on the ; Hayes.. Set it to NO if it doesn't dial out ok...) ; ; Kaypro port definitions ; EXPORT EQU 04H ;base external port EXTCT1 EQU EXPORT+2 ;external modem status port EXTDAT EQU EXPORT ;external modem data port BAUDRP EQU 00H ;external modem baud rate port ; ; Kaypro 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 ; 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 ; DCONIO EQU 6 ;BDOS Direct Console IO function # DCONIN EQU 0FFH ;BDOS DCONIO Flag for input BDOS EQU 5 ;BDOS Function caller ; ; ORG TPA ;we begin ; DS 3 ;MEX has a JMP START here ; DS 2 ;not used by MEX TPULSE: DB 'T' ;T=touch, P=pulse (Used by this overlay) CLOCK: DB 46 ;clock speed x .1, up to 25.5 mhz. 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 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 DB 0 ;was once ACKNAK, now spare BAKFLG: DB YES ;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 NO ;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 NO ;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 NOCONN: DB 'N'-40H ;^N = Disconnect from phone line LOGCHR: DB 'L'-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: JMP INC ;in modem control port DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI ; OTDATA: JMP OUTD ;out modem data port DB 0,0,0,0,0,0,0 ;spares if needed for non=PMMI ; INPORT: JMP IND ;in modem data port DB 0,0,0,0,0,0,0 ;spares if needed for non-PMMI ; ; 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: RET!NOP!NOP 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: RET!NOP!NOP ;set modem for no-parity PARITV: RET!NOP!NOP ;set modem parity SETUPV: JMP SETCMD ;SET cmd: jump to a RET if you don't write SET SPMENV: RET!NOP!NOP ;not used with MEX VERSNV: JMP SYSVER ;Overlay's voice in the sign-on message BREAKV: JMP SBREAK ;send a break ; ; MDM calls supported in MEX 1.0 but not recommended for use. ; ILPRTV: DS 3 ;replace with MEX function 9 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: LXI D,EOSMSG MVI C,PRINT CALL MEX RET ; CLS: LXI D,CLSMSG MVI C,PRINT CALL MEX RET ;------------------------------------------------------------ ; ; end of fixed area ; ;------------------------------------------------------------ ; ; Low level modem routine area ; INC: MVI A,10H OUT EXTCT1 IN EXTCT1 RET ; IND: IN EXTDAT RET ; OUTD: OUT EXTDAT RET ; ; Print out the overlay version ; SYSVER: CALL MILP DB 'KAYPRO Overlay --- Version ' DB REV/10+'0' DB '.' DB REV MOD 10+'0' DB CR,LF,CR,LF DB 0 RET ; ; Break, disconnect and goodbye routines ; SBREAK: MVI A,5 OUT EXTCT1 LDA REG5 ORI 9AH ;Send a break OUT EXTCT1 MVI B,3 ;DELAY 300 MS. CALL MTIME MVI A,5 OUT EXTCT1 LDA REG5 OUT EXTCT1 ;stop break RET ; ; Disconnect Routine ; DISCON: MVI A,5 OUT EXTCT1 ;SEND TO THE STATUS PORT MVI A,68H ;TURN OFF DTR/RTS OUT EXTCT1 MVI B,10 ;DELAY 1 SEC. CALL MTIME MVI A,5 OUT EXTCT1 MVI A,0EAH ;TURN 'EM BACK ON AGAIN OUT EXTCT1 RET ; ; GOODBYE routines are called by MEX prior to exit to CP/M ; GOODBYE: RET ;NOTE: EXIT TO CP/M WITH NO CHANGE TO ;CONNECT STATUS OR SETTINGS (PARITY, ETC) ; ; Initialize RS-232 port, Smartmodem, and default modes. ; NITMOD: CALL INC ;SEE IF MODEM IS CONNECTED, I.E., RETURNING ANI 08H ; TO ACTIVE MODEM FROM CPM RNZ ;SKIP IF CONNECTED CALL NITSIO LDA MSPEED ;GET DEFAULT BAUD RATE CALL PBAUD ;SET IT RET ; ; Initialize the Zilog SIO chip ; NITSIO: MVI A,00H ;Select reg. 0 OUT EXTCT1 LDA REG0 ;Command byte OUT EXTCT1 MVI A,04H ;Select reg. 4 OUT EXTCT1 LDA REG4 ;Receive/transmit control byte OUT EXTCT1 MVI A,03H ;Select reg. 3 OUT EXTCT1 LDA REG3 ;Receiver logic byte OUT EXTCT1 MVI A,05H ;Select reg. 5 OUT EXTCT1 LDA REG5 ;Transmitter logic byte OUT EXTCT1 RET ; ; Set command processor ; SETCMD: MVI C,SBLANK ;ANY ARGUMENTS? CALL MEX JC SETSHO ;IF NOT, DISPLAY DEFAULT(S) 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: LXI D,SETEMS MVI C,PRINT CALL MEX CALL CRLF RET SETEMS: DB CR,LF,'SET command error',CR,LF,'$' ; ; Argument table ; CMDTBL: DB '?'+80H ; HELP DW SETHELP DB 'BAU','D'+80H ; SET BAUD DW STBAUD DB 'PARIT','Y'+80H ; SET PARITY DW STPRTY DB 'STOPBIT','S'+80H ; SET STOPBITS DW STSTOP DB 'LENGT','H'+80H ; SET LENGTH DW STBITS DB 0 ;TABLE TERMINATOR ; ; ; "SET (no args): PRINT CURRENT STATISTICS ; SETSHO: CALL MILP DB CR,LF DB 'SET values:',CR,LF,0 CALL CRLF CALL BDSHOW CALL CRLF CALL SHPRTY CALL CRLF CALL SHSTOP CALL CRLF CALL SHBITS CALL CRLF CALL CRLF RET ; ; "SET ?" processor ; SETHELP: CALL MILP DB CR,LF,'SET PARITY - OFF, EVEN or ODD' DB CR,LF,'SET STOPBITS - 1, 1.5 or 2' DB CR,LF,'SET LENGTH - 5, 6, 7 or 8' DB CR,LF,'SET BAUD - 110, 300, 600, 1200, 2400, ' DB '4800, 9600, 19200' DB CR,LF,CR,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: LDA MSPEED ;GET CURRENT BAUD RATE MVI C,PRBAUD ;LET MEX PRINT IT CALL MEX RET ; ; This routine sets baud rate passed as MSPEED code in A. ; Returns CY=1 if baud rate not supported. ; PBAUD: PUSH H ;DON'T ALTER ANYBODY PUSH D PUSH B MOV E,A ;MSPEED CODE TO DE MVI D,0 LXI H,BAUDTB ;OFFSET INTO TABLE DAD D MOV A,M ;FETCH CODE ORA A ;0 MEANS UNSUPPORTED CODE STC ;PREP CARRY IN CASE UNSUPPORTED JZ PBEXIT ;EXIT IF BAD OUT BAUDRP ;IF OK, SET IT MOV A,E ;GET MSPEED CODE BACK STA MSPEED ;SET IT ORA A ;RETURN NO ERRORS PBEXIT: POP B POP D POP H RET ; BAUDTB: DB 02H ;110 DB 05H ;300 DB 0 ;450 (not supported) DB 06H ;600 DB 0 ;710 (not supported) DB 07H ;1200 DB 0AH ;2400 DB 0CH ;4800 DB 0EH ;9600 DB 0FH ;19200 ; ; SET PARITY command: reset transmit/receive parity ; ; Parity is controlled by bits 0 and 1 of ; the byte sent to the SIO write-register ; 4 as follows: ; ; Parity Bit 1 Bit 0 ; Off - 0 ; Odd 0 1 ; Even 1 1 ; STPRTY: MVI C,SBLANK ;check for parity code CALL MEX ; JC SETERR ;if none, print error LXI D,PARTBL ;check for proper syntax MVI C,LOOKUP CALL MEX PUSH H ;match found, go do it! RNC ; POP H ;no match: fix stack and JMP SETERR ; print error ; PROFF: LDA REG4 ;get register 4 byte ANI 0FEH ;reset bit 0 JMP PARTB1 ; PREVEN: LDA REG4 ; ORI 003H ;set bits 0 & 1 JMP PARTB1 ; PRODD: LDA REG4 ; ORI 001H ;set bit 0 ANI 0FDH ;reset bit 1 PARTB1: STA REG4 ; CALL NITSIO ;re-initialize the USART CALL SHPRTY ;print the result RET ; SHPRTY: CALL MILP ;display parity DB 'Parity: ',TAB,' ',0 LDA REG4 ; ANI 001H ;test bit 0 CPI 0 ;if bit0=0 then parity off JNZ SHPRT1 ; CALL MILP ; DB 'Off',0 ; RET SHPRT1: LDA REG4 ; ANI 002H ;test bit 1 CPI 0 ;if bit1=0 then parity odd JNZ SHPRT2 ; CALL MILP ; DB 'Odd',0 ; RET ; SHPRT2: CALL MILP ; DB 'Even',0 ; RET ; ; SET PARITY command table ; PARTBL: DB 'OF','F'+80H ;"set parity off" DW PROFF DB 'EVE','N'+80H ;"set parity even" DW PREVEN DB 'OD','D'+80H ;"set parity odd" DW PRODD DB 0 ;<<== end of parity table ; ; SET STOPBITS command: reset number of stop bits ; ; The number of stop bits is controlled by bits ; 2 and 3 of the byte sent to the SIO write- ; register 4, as follows: ; ; Stop bits Bit 3 Bit 2 ; 1 0 1 ; 1.5 1 0 ; 2 1 1 ; ; STSTOP: MVI C,SBLANK ;check for stop bits CALL MEX ; JC SETERR ;if none, print error LXI D,STPTBL ;check for proper syntax MVI C,LOOKUP CALL MEX ; PUSH H ;match found, go do it! RNC ; POP H ;no match: fix stack and JMP SETERR ; print error ; STOP01: LDA REG4 ;get register 4 byte ANI 0F7H ;reset bit 3 ORI 004H ;set bit 2 JMP STSTP1 ; STOP02: LDA REG4 ; ORI 00CH ;set bits 2 and 3 JMP STSTP1 ; STOP15: LDA REG4 ; ORI 008H ;set bit 3 ANI 0FBH ;reset bit 2 STSTP1: STA REG4 ; CALL NITSIO ; CALL SHSTOP ;print the result RET SHSTOP: CALL MILP ;display stop-bits DB 'Stop bits:',TAB,' ',0 LDA REG4 ; ANI 004H ;test bit 2 CPI 0 ;if bit2=0 then 1.5 JNZ SHSTP1 ; CALL MILP ; DB '1.5',0 ; RET SHSTP1: LDA REG4 ; ANI 008H ;test bit 3 CPI 0 ;if bit3=0 then 1 JNZ SHSTP2 ; CALL MILP ; DB '1',0 ; RET SHSTP2: CALL MILP ; DB '2',0 ; RET ; ; SET STOPBITS command table ; STPTBL: DB '1'+80H ;"set stop 1" DW STOP01 DB '2'+80H ;"set stop 2" DW STOP02 DB '1.','5'+80H ;"set stop 1.5" DW STOP15 DB 0 ;<<== End of stop-bits table ; ; SET LENGTH command: set bits per character ; ; The number of bits per character is controlled for ; the receiver circuit by bits 6 and 7 of the byte ; sent to the SIO write-register 3 and for the trans- ; mitter circuit by bits 5 and 6 of the byte sent to ; the SIO write-register 5. The assumption has been ; made here that both transmission and reception will ; be carried on at the same number of bits per charac- ; ter. The bit configurations are shown for register ; 3 only, but are the same for register 5: ; ; BPC Bit 7 Bit 6 ; 5 0 0 ; 6 1 0 ; 7 0 1 ; 8 1 1 ; STBITS: MVI C,SBLANK ;check for bits/char CALL MEX ; JC SETERR ;if none, print error LXI D,BITTBL ;check for proper syntax MVI C,LOOKUP CALL MEX PUSH H ;match found, go do it! RNC ; POP H ;no match: fix stack and JMP SETERR ; print error ; BIT5: LDA REG3 ; ANI 0BFH ;reset bit 6 ANI 07FH ;reset bit 7 STA REG3 ; LDA REG5 ; ANI 0DFH ;reset bit 5 ANI 0BFH ;reset bit 6 JMP STBTS1 ; BIT6: LDA REG3 ; ANI 0BFH ;reset bit 6 ORI 080H ;set bit 7 STA REG3 ; LDA REG5 ; ANI 0DFH ;reset bit 5 ORI 040H ;set bit 6 JMP STBTS1 ; BIT7: LDA REG3 ; ORI 040H ;set bit 6 ANI 07FH ;reset bit 7 STA REG3 ; LDA REG5 ; ORI 020H ;set bit 5 ANI 0BFH ;reset bit 6 JMP STBTS1 ; BIT8: LDA REG3 ; ORI 040H ;set bit 6 ORI 080H ;set bit 7 STA REG3 ; LDA REG5 ; ORI 020H ;set bit 5 ORI 040H ;set bit 6 STBTS1: STA REG5 ; CALL NITSIO ; CALL SHBITS ;print the result RET SHBITS: CALL MILP ;display bits/char DB 'Bits/char:',TAB,' ',0 LDA REG5 ; ANI 040H ;test bit 6 CPI 0 ;if bit6=0 then 6 bpc JNZ SHBTS2 ; LDA REG5 ; ANI 020H ;test bit 5 CPI 0 ;if bit5=0 then 5 bpc JNZ SHBTS1 ; CALL MILP ; DB '5',0 ; RET ; SHBTS1: CALL MILP ; DB '7',0 ; RET ; SHBTS2: LDA REG5 ; ANI 020H ;test bit 5 CPI 0 ;if bit5=0 then 6 bpc JNZ SHBTS3 ; CALL MILP ; DB '6',0 ; RET ; SHBTS3: CALL MILP ; DB '8',0 ; RET ; ; SET LENGTH command table ; BITTBL: DB '5'+80H ;"set bits 5" DW BIT5 DB '6'+80H ;"set bits 6" DW BIT6 DB '7'+80H ;"set bits 7" DW BIT7 DB '8'+80H ;"set bits 8" DW BIT8 DB 0 ;<<== end of bpc table ; ; General utility routines ; MILP: MVI C,ILP ;IN-LINE PRINT JMP MEX RET ; MTIME: MVI C,TIMER ;MEX TIMER JMP MEX RET ; CRLF: CALL MILP ;PRINT CARRIAGE RETURN, LINE FEED DB CR,LF,0 RET ; ;========================================================================== ; Data Area ;========================================================================== ; ; Default UART parameters (Initalized for External RS-232) ; REG0: DB 00011000B ;RESET CHANNEL A REG3: DB 11000001B ;ENABLE RECEIVE AT 8 BITS/CHAR REG4: DB 01000100B ;NO PARITY, 1 STOP BIT, CLOCK X16 REG5: DB 11101010B ;ENABLE TRANSMIT AT 8 BITS/CHAR ; ; Miscellaneous Default Data ; EOSMSG: DB 17H,'$' ;CLEAR TO END-OF-SCREEN CLSMSG: DB 1AH,'$' ;CLEAR WHOLE SCREEN ; END