REV EQU 12 ;overlay revision level ; ; MEX STARPLEX OVERLAY VERSION 1.0: written 07/16/84 by Bill Meahan ; 1951 S. Globe ; Westland, MI 48185 ;---------------------------------------------------------------------------- ; Modified: 01-Dec-85 Chuck Sadoian ; 821 Newton Drive ; Dinuba, CA 93618 ; 209-591-2631 ; ; Version 1.2 For the Bondwell 2 portable computer ; ; Renamed MXO-BW12.ASM ; ; This version has been tested on a Bondwell 2 Portable Computer and ; Mex version 1.14. Overlay allows for adjusting the baud rate, parity, ; stop bits and character length of the Bondwell's USART. IT DOES NOT, ; HOWEVER, UPDATE THE BIOS AREAS WHERE THESE VALUES ARE STORED. Therefore, ; when the Bondwell program SETUP is run, it will show existing values that ; may or may not be valid, depending on what USART functions were done while ; using MEX. ;---------------------------------------------------------------------------- ; ; ; This is a MEX overlay file for the National Semiconductor STARPLEX. ; Derived from the PMMI overlay by Ronald G. Fowler. ; ; This overlay should also work (except for the serial printer support) with ; systems based on the following single-board computers: ; Intel National ; SBC80/20 BLC80/204 ; SBC80/20-4 BLC80/24 ; SBC80/24 BLC80/316 ; SBC80/30 ; ; Intel development systems may have different addresses for the ports, but ; use the same arrangement of 8253 baud rate generators and 8251 USART's so ; this overlay should be EASILY adaptible to those systems as well. ; ;------------------------------------------------------------ ; ; Misc equates ; NO EQU 0 YES EQU 0FFH TPA EQU 100H CR EQU 13 LF EQU 10 TAB EQU 9 XON EQU 011H XOFF EQU 013H ; ; Bondwell port definitions ; PORT EQU 040H ;bondwell base port (data or status) MODCT1 EQU PORT+1 ;modem control port MODDAT EQU PORT ;modem data port MODCT2 EQU PORT+1 ;modem status port BAUDRP EQU 010H ;modem baud rate port BAUDMD EQU 013H ;modem baud rate mode control port ; ; Bondwell bit definitions ; MDRCVB EQU 02H ;modem receive bit (dav) MDRCVR EQU 02H ;modem receive ready MDSNDB EQU 01H ;modem send bit MDSNDR EQU 01H ;modem send ready bit ; ; CTSMSK EQU 4 ;mask for cts bit BRKMSK EQU 8 ;mask to set break PARMSK EQU 0CFH ;mask to remove parity bits OPARIT EQU 10H ;odd-parity bits EPARIT EQU 30H ;even-parity bits NPARIT EQU 00H ;no-parity bits PARTST EQU 10H ;mask to test parity enabled bit EVNTST EQU 20H ;mask to test even parity bit MODEMK EQU 06EH ;mode mask MODEGO EQU 027H ;default control command RSTCTL EQU 040H ;reset usart command BITS7 EQU 08H ;mask for 7 bit characters BITS8 EQU 0CH ;mask for 8 bit characters BITS8T EQU 04H ;mask to test for 8 bit characters STBIT1 EQU 040H ;mask to set 1 stop bit STBI15 EQU 080H ;mask to set 1.5 stop bits STBIT2 EQU 0C0H ;mask to set 2 stop bits ; ; ; MEX service processor stuff ... MEX supports an overlay service ; processor, located at 0D00H (and maintained at this address from ; version to version). If your overlay needs to call BDOS for any ; reason, it should call MEX instead; function calls below about ; 240 are simply passed on to the BDOS (console and list I/O calls ; are specially handled to allow modem port queueing, which is why ; you should call MEX instead of BDOS). MEX uses function calls ; above about 244 for special overlay services (described below). ; ; Some sophisticated overlays may need to do file I/O; if so, use ; the PARSFN MEX call with a pointer to the FCB in DE to parse out ; the name. This FCB should support a spare byte immediately pre- ; ceeding the actual FCB (to contain user # information). If you've ; used MEX-10 for input instead of BDOS-10 (or you're parsing part ; of a SET command line that's already been input), then MEX will ; take care of DU specs, and set up the FCB accordingly. There- ; after all file I/O calls done through the MEX service processor ; will handle drive and user with no further effort necessary on ; the part of the programmer. ; 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 ; ORG TPA ;we begin ; ; DS 3 ;mex has a jmp start here ; ; The following variables are located at the beginning of the program ; to facilitate modification without the need of re-assembly. They will ; be moved in MEX 2.0. ; STRPLX: DB NO ;yes=bondwell modem \/ these 2 locations are not SMODEM: DB NO ;yes=smartmodem /\ referenced by mex TPULSE: DB 'T' ;T=tone, P=pulse (used by smartmodem overlay) CLOCK: DB 40 ;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 1 ;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 1 ;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 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 NO ;yes=local cmd if extchr precedes ;no=not local cmd if extchr precedes TOGLOC: DB YES ;yes=allow toggling of locnxtchr LSTTST: DB NO ;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 '@'-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 'A'-40H ;^A = send next character ; ; Equates used only by Bondwell routines grouped together here. ; DB 0 ;not used DB 0 ;not used ; ; Low-level modem I/O routines: this will be replaced with ; a jump table in MEX 2.0 (you can insert jumps here to longer ; routines if you'd like ... I'd recommend NOT putting part of ; a routine in this area, then jumping to the rest of the routine ; in the non-fixed area; that will complicate the 2.0 conversion) ; INCTL1: IN MODCT1 ;in modem control port RET DB 0,0,0,0,0,0,0 ;spares if needed for non-bondwell ; OTDATA: OUT MODDAT ;out modem data port RET DB 0,0,0,0,0,0,0 ;spares if needed for non=bondwell ; INPORT: IN MODDAT ;in modem data port RET DB 0,0,0,0,0,0,0 ;spares if needed for non-bondwell ; ; Bit-test routines. These will be merged with the above ; routines in MEX 2.0 to provide a more reasonable format ; 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 ; ; ; Unused area: was once used for special Bondwell functions, ; Now used only to retain compatibility with MDM overlays. ; You may use this area for any miscellaneous storage you'd ; like but the length of the area *must* be 12 bytes. ; DS 12 ; ; Special modem function jump table: ; LOGON: DS 2 ;needed for mdm compat, not ref'd by mex DIALV: DS 3 ;dial digit in a (see info at pdial) DISCV: DS 3 ;disconnect the modem GOODBV: JMP DUMMY ;called before exit to cp/m INMODV: JMP NITMOD ;initialization. called at cold-start NEWBDV: JMP PBAUD ;set baud rate NOPARV: JMP DUMMY ;set modem for no-parity PARITV: JMP DUMMY ;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 PBREAK ;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 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 ; ; ; Clear/screen and clear/end-of-screen. Each routine must use the ; full 9 bytes alloted (may be padded with nulls). ; ; These routines (and other screen routines that MEX 2.0 will sup- ; port) will be accessed through a jump table in 2.0, and will be ; located in an area that won't tie the screen functions to the ; modem overlay (as the MDM format does). ; CLREOS: LXI D,EOSMSG MVI C,PRINT CALL MEX RET ; ; CLS: LXI D,CLSMSG ;null unless patched MVI C,PRINT CALL MEX RET ; ;------------------------------------------------------------ ; ; *** END OF FIXED FORMAT AREA *** ; ;------------------------------------------------------------ ; ; Modem initialization. ; NITMOD: MVI A,5 ;default to 1200 baud on start-up [cs] CALL PBAUD LDA MODMOD ;default mode command in a ALTINI: ;alternate entry point for mode change routines PUSH PSW ;save mode command on stack XRA A ;force 8251 usart to look for reset command OUT MODCT2 OUT MODCT2 OUT MODCT2 MVI A,RSTCTL ;reset usart OUT MODCT2 POP PSW ;retreive mode command STA MODMOD ;save copy for future use OUT MODCT2 ;set usart mode MVI A,MODEGO ;enable transmitter and receiver OUT MODCT2 RET ; ; Bondwell send-break routine ; PBREAK: LDA MODCTB ;get the last modem control byte ORI BRKMSK ;set the transmit break bit low OUT MODCT2 ;send it to the modem LXI B,02FEH ;b=2, c=254 CALL MEX ;send a space tone for 200 ms. LDA MODCTB ;get the last modem control byte OUT MODCT2 ;restore to normal ; ; exit routine ; DUMMY: RET ;we don't need one ; ; ; ; Set baud-rate code in A ; PBAUD: PUSH H ;don't alter anybody PUSH D PUSH B STA MSPEED ADD A ;double value to get word address MOV E,A ;code to de MVI D,0 LXI H,BAUDTB ;offset into table DAD D MOV C,M ;fetch code INX H MOV B,M MVI A,076H OUT BAUDMD ;control counter MOV A,C OUT BAUDRP MOV A,B OUT BAUDRP ;good rate, set it PBEXIT: POP B ;all done POP D POP H RET ; ; table of baud rate divisors for supported rates ; BAUDTB: DW 2160,832,576,416,356 ;110,300,450,600,710 DW 208,104,52,26,13 ;1200,2400,4800,9600,19200 ;note: 450 & 710 not supported on ;on the bondwell [cs] ; ; Sign-on message ; SYSVER: LXI D,SOMESG MVI C,PRINT CALL MEX RET ; SOMESG: DB CR,LF,'Bondwell 2 overlay By Chuck Sadoian, Version ' DB REV/10+'0' DB '.' DB REV MOD 10+'0' DB CR,LF,LF,'$' ; ; ; ; ; Newline on console ; CRLF: MVI A,CR CALL TYPE MVI A,LF ;fall into type ; ; type char in A on console ; TYPE: PUSH H ;save 'em PUSH D PUSH B MOV E,A ;align output character MVI C,CONOUT ;print via mex CALL MEX POP B POP D POP H RET ; ; strings to clear-to-end-of-screen, and clear-screen ; EOSMSG: DB 01BH,'Y','$' ;clear to end-of-screen CLSMSG: DB 01BH,'*','$' ;clear whole screen ; ; Data area ; ERRFLG: DB 0 ;connection error code MODMOD DB MODEMK ;uart-control byte image BAUDSV: DB 05 ;current baud rate (dflt 1200) MODCTB: DB MODEGO ;modem control byte ; ;------------------------------------------------------------ ; ; The remainder of this overlay implements a very versatile ; SET command -- ; ; ; Control is passed here after MEX parses a SET command. ; SETCMD: MVI C,SBLANK ;any arguments? CALL MEX JC SETSHO ;if not, go print out values LXI D,CMDTBL ;parse command CALL TSRCH ;from table PUSH H ;any address on stack RNC ;if we have one, execute it POP H ;nope, fix stack SETERR: LXI D,SETEMS ;print error MVI C,PRINT CALL MEX RET ; SETEMS: DB CR,LF,'SET command error',CR,LF,'$' ; ; SET command table ... note that tables are constructed of command- ; name (terminated by high bit=1) followed by word-data-value returned ; in HL by MEX service processor LOOKUP. Table must be terminated by ; a binary zero. ; ; Note that LOOKUP attempts to find the next item in the input stream ; in the table passed to it in HL ... if found, the table data item is ; returned in HL; if not found, LOOKUP returns carry set. ; CMDTBL: DB '?'+80H ;"set ?" DW STHELP DB 'BAU','D'+80H ;"set baud" DW STBAUD DB 'PARIT','Y'+80H ;"set parity" DW SETPAR DB 'BIT','S'+80H ;"set bits" DW SETBIT DB 'STO','P'+80H ;"set stop" DW SETSTO ; DB 0 ;<<=== table terminator ; ; SET : print current statistics ; SETSHO: CALL CRLF LXI H,SHOTBL ;get table of show subroutines SETSLP: MOV E,M ;get table address INX H MOV D,M INX H MOV A,D ;end of table? ORA E JNZ NEXT ;continue if non-zero CALL CRLF ;else this is the end of table, do newline RET ;and exit NEXT: PUSH H ;save table pointer XCHG ;adrs to hl CALL GOHL ;do it CALL CRLF ;print newline MVI C,CHEKCC ;check for console abort CALL MEX POP H ;it's done JNZ SETSLP ;continue if no abort RET ; GOHL: PCHL ; ; table of SHOW subroutines ; SHOTBL: DW BDSHOW DW PARSHO DW BITSHO DW STOSHO DW 0 ;<<== table terminator ; ; SET ? processor ; STHELP: LXI D,HLPMSG MVI C,PRINT CALL MEX RET ; ; The help message ; HLPMSG: DB CR,LF,LF,'SET command, Bondwell version:',CR,LF,LF DB CR,LF,'SET BAUD (110 300 600 1200 2400 4800 9600 19200)' DB CR,LF,'SET PARITY ODD EVEN OFF' DB CR,LF,'SET BITS 7 8' DB CR,LF,'SET STOP 1 1.5 2' DB CR,LF,LF,'$' ; ; SET BAUD processor ; STBAUD: MVI C,BDPARS ;function code CALL MEX ;let mex look up code JC BDBAUD ;invalid code CPI 2 ;code 2, 450 baud? JZ BDBAUD ;yes, not supported, invalid CPI 4 ;code 4, 710 baud? JZ BDBAUD ;yes, not supported, invalid CALL PBAUD ;no, try to set it JC SETERR ;not-supported code BDSHOW: CALL ILPRT ;display baud DB 'Baud rate: ',0 LDA MSPEED MVI C,PRBAUD ;use mex routine CALL MEX RET ; BDBAUD: LXI D,MSGB ;report bad baud rate MVI C,PRINT CALL MEX RET ; MSGB: DB CR,LF,'Invalid Baud Rate Specified',CR,LF,LF,'$' ; ; SET PARITY processor ; SETPAR: LXI D,PARTBL ;point to argument table CALL TSRCH ;look for match with allowed arguments JC SETERR ;process error if found LDA MODMOD ;get current mode byte ANI PARMSK ;mask away current parity bits ORA L ;add new parity bits CALL ALTINI PARSHO: CALL ILPRT ;show current status DB 'Parity: ',0 LDA MODMOD ;get current mode word ANI PARTST ;test for parity enabled JNZ PAR ;skip if it is CALL ILPRT DB 'Off',0 RET PAR: LDA MODMOD ANI EVNTST ;test mode byte for even parity JNZ PAREVN ;skip if it is CALL ILPRT DB 'Odd',0 RET PAREVN: CALL ILPRT DB 'Even',0 RET ; ;PARITY argument table ; PARTBL: DB 'OD','D'+80H DB OPARIT,0 DB 'EVE','N'+80H DB EPARIT,0 DB 'OF','F'+80H DB NPARIT,0 DB 0 ; ;SET BITS processor ; SETBIT: LXI D,BITTBL ;point to argument table CALL TSRCH ;look for match with allowed arguments JC SETERR ;process error if found LDA MODMOD ;get current mode command ANI (NOT BITS8) AND 255 ;mask away current bits ORA L ;set new bits CALL ALTINI ;change mode BITSHO: CALL ILPRT ;show current status DB 'Bits: ',0 LDA MODMOD ;get current mode word ANI BITS8 ;test for number of bits JZ SETERR ANI BITS8T JNZ B8 ;skip if it is CALL ILPRT DB '7',0 RET B8: CALL ILPRT DB '8',0 RET ; ;BITS argument table ; BITTBL: DB '8'+80H DB BITS8,0 DB '7'+80H DB BITS7,0 DB 0 ; ;SET STOP processor ; SETSTO: LXI D,STPTBL ;point to argument table CALL TSRCH ;look for match with allowed arguments JC SETERR ;process error if found LDA MODMOD ;get current mode command ANI (NOT STBIT2) AND 255 ;mask away current bits ORA L ;set new bits CALL ALTINI ;change mode STOSHO: CALL ILPRT ;show current status DB 'Stop Bits: ',0 LDA MODMOD ;get current mode word ANI STBIT2 ;test for number of bits JZ SETERR RLC RLC ADD A ;form word table index LXI H,STJTBL ;get address of jump table ADD L ;point to address of proper routine MOV L,A MVI A,0 ADC H MOV H,A MOV A,M ;get address of proper routine INX H MOV H,M MOV L,A PCHL ;branch to proper routine PRT1: CALL ILPRT DB '1',0 RET PRT2: CALL ILPRT DB '2',0 RET PRT15: CALL ILPRT DB '1.5',0 RET ; STJTBL: ;jump table for stop bit show routines DW SETERR DW PRT1 DW PRT15 DW PRT2 ; ;STOP argument table ; STPTBL: DB '1'+80H DB STBIT1,0 DB '1.','5'+80H DB STBI15,0 DB '2'+80H DB STBIT2,0 DB 0 ; ; Compare next input-stream item in table @DE; CY=1 ; if not found, else HL=matched data item ; TSRCH: MVI C,LOOKUP ;get function code JMP MEX ;pass to mex processor ; ; Print in-line message ... blows away C register ; ILPRT: MVI C,ILP ;get function code JMP MEX ;go do it ;------------------------------------------------------------------------------ ; ; End of Bondwell MEX modem overlay and patches ; ;------------------------------------------------------------ ; END