; MDSETCOM.COM VERSION 1.0 11/26/85 ; SET SERIAL COMMUNICATION PORT PARAMETERS FOR MICRO DECISION (rev. 2) ; USAGE: COMMAND LINE (OR MENU DRIVEN IF ERROR IN COMMAND LINE) ; SETCOM 2 1200 N 8 2 IS THE DEFAULT MENU DISPLAY ; PROGRAM END DISPLAYS COMMAND LINE EQUIVALENT OF SETTING USED. ; THIS PROGRAM REQUIRES M80, L80, AND LOAD.COM TO COMPILE & LOAD: .Z80 ;USE STANDARD ZILOG Z-80 MNEMONICS ASEG ;ABSOLUTE SEGMENT AT 100H ORG 100H ;LIKE ANY GOOD .COM FILE BEGIN: JP START ;SKIP OVER THIS FIRST BUNCH OF TEXT DB 0DH,'MDSETCOM.COM is a PUBLIC DOMAIN program for the Morrow' DB 0AH,0DH,'Micro-Decision with the revision 2 board. Parameters' DB 0AH,0DH,'expected are: the port number (1 or 2), the baud rate' DB 0AH,0DH,'(20 to 50000), the parity (Even, Odd, or None), the' DB 0AH,0DH,'number of data bits (5 to 8) and the number of stop' DB 0AH,0DH,'bits (1, 1.5, or 2). In real life, that means that' DB 0AH,0DH,' MDSETCOM 1 19200 N 8 1' DB 0AH,0DH,'will set serial port number 1 (the terminal port)' DB 0AH,0DH,'to 19.2 Kbaud with no parity, 8 data bits, and 1 stop' DB 0AH,0DH,'bit. Use MDSETCOM 2 450 N 8 1 to "push" a 300 baud' DB 0AH,0DH,'modem to 450 baud, or goose it to the limit for' DB 0AH,0DH,'print buffers or other hard-wired applications.' DB 0AH,0DH,'The trap door falls thru to a menu, so have fun.',1AH ; DEFINE A FEW LOW MEMORY AREAS: BOOT EQU 0 BDOS EQU 5 BUFFER EQU 80H ; DEFINE SOME HANDY ASCII CHARACTERS: BS EQU 8 LF EQU 0AH CR EQU 0DH ESC EQU 1BH ; THESE MORROW STANDARD CONTOL CODES ARE NEEDED FOR PRETTINESS: CLR EQU 1AH ; CLEAR SCREEN HOME EQU 1EH ; HOME CURSOR ; ONLY 2 BDOS FUNCTION CALLS ARE USED: CONIN EQU 1 ; CONSOLE INPUT PRTSTR EQU 9 ; PRINT STRING ($ TERMINATOR) START: LD SP,BEGIN ; SET UP YOUR OWN STACK SPACE LD HL,BUFFER ;CHECK FOR COMMAND LINE ENTRY LD A,(HL) ; GET CHARATER COUNT OR A ; NO COMMAND LINE ENTRY? JP Z,MENUDRV ; THEN USE THE MENU-DRIVEN PROGRAM LD B,A ;OTHERWISE, GET THE LINE LENGTH CALL SCAN ;RETURN NEXT NON-BLANK CHARACTER CP '1' ;PORT 1? JP C,BLANK ;IF LESS THAN 1, USE THE MENU CP '3' ;MORE THAN 2? JP NC,BLANK ;LIKEWISE UNACCEPTABLE AND 3 ;CONVERT 1 OR 2 TO BINARY LD (PARAMS),A ;AND SAVE IT IN THE PARAMETER AREA CALL SCAN ;SCAN FORWARD TO BAUD RATE PUSH HL ;SAVE POINTER TO BAUD RATE IN COMMAND LINE EX DE,HL ;COMMAND LINE POINTER IN DE LD HL,0 ;INITIALIZE FOR ASCII - BINARY CONVERSION NEXTNUM:LD A,(DE) ; GET DIGIT CP '0' ;IF IT'S LESS THAN ZERO, JR C,NONNUM ;CONVERSION IS FINISHED CP '9'+1 ; IF IT'S GREATER THAN 9 JR NC,NONNUM ; YOU ARE LIKEWISE FINISHED AND 0FH ;MASK 0-9 ASCII TO 0-9 BINARY PUSH DE ;SAVE POINTER TO TEXT LD D,H ;MOVE ACCUMULATED BINARY NUMBER LD E,L ;TO THE DE REGISTER PAIR ADD HL,HL ;SO THAT ADD HL,HL ;YOU CAN ADD HL,HL ;MULTIPLY ADD HL,DE ;IT BY 10 ADD HL,DE ;BEFORE LD E,A ;ADDING LD D,0 ;THE MOST ADD HL,DE ;RECENT DIGIT. POP DE ;RETRIEVE TEXT POINTER INC DE ;GET NEXT CHARACTER DJNZ NEXTNUM ;AND KEEP LOOPING JP BLANK ;(MENU TIME IF YOU RUN OUT OF TEXT) NONNUM: PUSH BC ;SAVE LENGTH PUSH DE ;SAVE POINTER EX DE,HL ;DE=BAUD RATE LD HL,0 ;ZERO DIVIDEND PUSH HL ;ON STACK LD HL,9600 ;CHECK FOR 9600 BAUD OR LESS XOR A ;ZERO FLAGS SBC HL,DE ;IF > 9600 BAUD, USE LD A,1 ;X1 MASK, AND LD HL,1E84H ;DIVIDE INTO 2 MHZ CLOCK RATE LD BC,0880H ;1E8480H=2000000 IN HLC, B=BITS TO SHIFT JR C,GT9600 ; IF NOT GREATER THAN 9600 BAUD, 4 BIT SHIFT: LD B,4 ;1E848H=2000000/16 FOR <=9600 BAUD INC A ;X16 MASK GT9600: LD (FACTOR),A ;SAVE THE X1 OR X16 FLAG XOR A ; ZERO EVERYTHING BEFORE DOING THE DIVISION: DIVIDE: SBC HL,DE ;SUBTRACT BAUD RATE FROM CLOCK EX (SP),HL ; SWAP QUOTIENT & DIVIDEND INC HL ; INCREASE QUOTIENT EX (SP),HL ; QUOTIENT ON STACK, DIVIDEND IN HL JR NC,DIVIDE ;IF DIVIDEND > DIVISOR, KEEP LOOPING EX (SP),HL ; OTHERWISE YOU WENT TOO FAR: DEC HL ; DECREASE QUOTIENT ADD HL,HL ; SHIFT QUOTIENT LEFT 1 BIT EX (SP),HL ; QUOTIENT ON STACK, DIVIDEND IN HL ADC HL,DE ; UN-DO THE EXCESS SUBTRACTION, THEN RL C ;SHIFT DIVIDEND LEFT ADC HL,HL ; 1 BIT, LOOP THRU HOWEVER MANY TIMES DJNZ DIVIDE ; THE BIT SHIFT INDICATES. ADD HL,HL ;DOUBLE THE REMAINDER, SEE IF THE BAUD RATE SBC HL,DE ; IS BIGGER (FOR ROUNDING UP) POP HL ;RETRIEVE THE QUOTIENT FROM THE STACK JR C,NOROUND ;IF THE REMAINDER IS MORE THAN HALF THE BAUD, INC HL ; ROUND UP THE QUOTIENT NOROUND:LD (CDIVIS),HL ; (HEREAFTER KNOWN AS THE BAUD RATE DIVISOR) LD (EXTRAD),HL ; SAVE IT TWICE LD A,18 ;INSTALL LD (PARAMS+4),A ;IN PARAMETER TABLE ;(INSTALL BAUD RATE INFO AS EXTRA TEXT & DIVISOR IN TABLES.) POP HL ; RETRIEVE POINTER TO TEXT IN BUFFER LD D,H ; IN BOTH HL LD E,L ; AND DE. POP BC ; GET LENGTH OF TEXT YET TO PROCESS EX (SP),HL ;SWAP CURRENT POINTER WITH OLD POINTER TO BAUD EX DE,HL ;SWAP OLD & NEW INC HL ;GOOSE IT UP SBC HL,DE ;HL = LENGTH OF BAUD RATE TEXT PUSH BC ;SAVE LENGTH AGAIN LD C,L ;MOVE LENGTH OF TEXT LD B,H ;INTO BC EX DE,HL ;HL > SOURCE OF TEXT IN COMMAND LINE LD DE,EXTRAB ;DE > DESTINATION IN BAUD RATE TABLE LDIR ;MOVE IT OVER LD A,19 ;ADD EXTRA BAUD RATE TO MENU LD (BAUDS),A ;BY GOOSING UP MAX COUNTER POP BC ;RETRIEVE TEXT LENGTH POP HL ; AND TEXT POINTER CALL SCAN ;LOOK PAST THE BAUD RATE AND 4FH ;FORCE CHARACTER TO UPPER CASE LD C,0 ; C = NO PARITY FLAG CP 'N' ; RIGHT? JR Z,SETP ; THEN SET THE PARITY INC C ; C = ODD PARITY FLAG CP 'O' ; RIGHT? JR Z,SETP ; SO DO IT INC C ; C = EVEN PARITY FLAG CP 'E' ; THAT'S WHAT "E" MEANS JP NZ,BLANK ; IF IT'S NOT O,E, OR N, IT'S WRONG. SETP: LD A,C ;SAVE THE PARITY FLAG LD (PARAMS+2),A ;IN THE PARAMETER AREA FOR LATER USE ;NOW PROCESS THE DATA BITS & STOP BITS: CALL SCAN ;NEXT CHARACTER CP '5' ;LESS THAN 5 DATA BITS JR C,ABORTD ;IS AN ABORTION CP '9' ;9 DATA BITS? JR NC,ABORTD ;DON'T BE SILLY. AND 0FH ;MAKE ASCII 5-8 TO BINARY 5-8 LD (PARAMS+3),A ; THEN INSERT IN THE APPROPRIATE PLACE CALL SCAN ;GET THE LAST INFORMATION CP '2' ;2 STOP BITS? LD C,2 ;C = 2 STOP BITS FLAG JR Z,SB2 ;THEN SKIP OUT WITH YOUR INFO CP '1' ; 1 OR 1.5 STOP BITS? JR NZ,ABORTD ;IF IT AIN'T, IT'S WRONG INC HL ; NEXT CHARACTER LD A,(HL) ; IN THE ACCUMULATOR, LD C,0 ;C = 1 STOP BIT FLAG CP '.' ;DECIMAL POINT (AS IN 1.5 STOP BITS)? JR NZ,SB2 ; IF NOT, IT MUST BE 1 STOP BIT INC HL ;NEXT CHARACTER LD A,(HL) ;TO CHECK: CP '5' ; IS IT REALLY 1.5 STOP BITS? JR NZ,ABORTD ;IF NOT, GO TO THE MENU STUFF INC C ;OTHERWISE, C=1 FOR 1.5 STOP BITS SB2: LD A,C ;SAVE THE STOP BIT FLAG LD (PARAMS+1),A ;IN THE PARAMETER AREA, THEN JP TIMES16+3 ;RUN THEM ALL THRU THE PROGRAM SCAN: INC HL ; POINT TO THE NEXT CHARACTER IN THE BUFFER DEC B ; AND DECREASE THE NUMBER OF CHARS TO LOOK AT JR Z,BLANK ;SKIP OUT IF NO MORE CHARS LD A,(HL) ;GET CHAR CP ' ' ;BLANK? JR Z,SCAN ;THEN KEEP LOOKING JR C,BLANK ;EXIT IF IT'S A CONTROL CHARACTER RET ; OTHERWISE RETURN WITH THE GOOD NEWS. BLANK: POP HL ;JERK OUT THE RETURN ADDRESS ABORTD: XOR A ;ZERO OUT THE BUFFER LD (BUFFER),A ;(FOR NO GOOD REASON AT ALL, I GUESS) ; - AND NOW, CONTINUE WITH THE MENU DRIVEN PORTION OF THE PROGRAM ; IF THE COMMAND LINE ENTRY IS INVALID, DO IT MENU DRIVEN: MENUDRV:LD DE,CLS ;THE FIRST-TIME THRU, CLEAR THE SCREEN LD C,PRTSTR ;BY PRINTING OUT THE CLEAR SCREEN FUNCTION CALL BDOS ;WITH THE BDOS CALL PRINT: LD HL,PARAMS ; POINT TO THE PARAMETERS LD A,'0' ; CONVERT BINARY TO ASCII OR (HL) ; 1 OR 2 LD (S1OR2),A ; AND INSTALL INTO THE MENU DISPLAY INC HL ;NEXT PARAMETER: STOP BITS LD E,(HL) ; 0,1,2 FOR 1,1.5,2 STOP BITS LD D,0 ; MEANS 3 BYTES MAX TO INSTALL IN THE MENU, PUSH HL ; SO SAVE POINTER TO PARAMETERS, LD HL,STOPTXT ;HL > TEXT OF STOP BIT VALUES ADD HL,DE ;SKIP OVER ADD HL,DE ;TO THE ADD HL,DE ;DESIRED TEXT, LD DE,STOPS ;THEN MOVE LD BC,3 ;3 BYTES LDIR ;FROM TEXT AREA TO THE MENU. POP HL ;RETRIEVE THE PARAMETER POINTER INC HL ;HL > PARITY PARAMETER LD A,(HL) ; GET 0,1,2 FOR NONE, ODD, EVEN RLCA ; MULTIPLY RLCA ; BY 4 (4 BYTES OF TEXT, RIGHT?) LD E,A ;MOVE OFFSET LD D,0 ;TO DE REGISTER, PUSH HL ;SAVE PARAM. POINTER LD HL,PARTXT ;HL > TEXT OF PARITY WORDS ADD HL,DE ;ADD OFFSET LD DE,PARITY ;NOW MOVE THE TEXT LD BC,4 ;(ALL 4 BYTES OF IT) LDIR ;INTO THE MENU POP HL ;RETRIEVE THE PARAMETER POINTER INC HL ;HL > DATA BITS LD A,'0' ;CREATE ASCII 5,6,7,8 OR (HL) ;FROM THE BINARY 5,6,7,8 LD (BITS),A ;AND PLUG INTO THE MENU TEXT INC HL ;HL > BAUD RATE PARAMETER LD A,(HL) ;(0-17 FOR 50-19200 BAUD) RLCA ; TIMES 2 RLCA ; TIMES 4 ADC A,(HL) ; TIMES 5 (5 BYTES OF TEXT) LD E,A ;DE NOW HOLD THE OFFSET LD D,0 ;TO THE DESIRED BAUD RATE TEXT LD HL,BAUDTXT ;IN THE BAUD RATE TEXT TABLE ADD HL,DE ; ADD IT, LD DE,BAUD ; POINT TO MENU, LD BC,5 ; COUNT THE BYTES, LDIR ; AND SQUIRT IT OUT. LD DE,MENU ;NOW POINT TO THE MENU, BYPASS: LD C,PRTSTR ;SET UP BDOS FUNCTION FOR DISPLAY CALL BDOS ;AND DISPLAY THE MENU INPUT: LD C,CONIN ;GET SOMETHING CALL BDOS ;IN FROM THE KEYBOARD: KEYCHK: CP 'A' ;BELOW "A"? JR C,BADKEY ;I WOULDN'T BELIEVE IT EITHER CP 'Z'+1 ;BETWEEN "A" AND "Z"? JR C,KEYOK ;JUMP OUT FOR FURTHER PROCESSING SUB 20H ;FOLD LOWER CASE INTO UPPER CASE JR KEYCHK ;AND RE-PROCESS TO CHECK RANGE BADKEY: CP ESC ;ESCAPE? JP Z,BOOT ;THEN ESCAPE! LD C,PRTSTR ;OTHERWISE BACKSPACE AND ERASE LD DE,BSERAS ;WHATEVER KEY WAS PRESSED JR BYPASS ;AND LOOP THRU AGAIN KEYOK: SUB 'A' ;NORMALIZE KEY A-F TO 0-5 JR NZ,SKIP1 ;BYPASS THE SET PORT ROUTINE IF B,C,D,E,F LD A,(PARAMS) ;OTHERWISE GET THE PORT NUMBER, XOR 3 ;TOGGLE BETWEEN 1 AND 2 LD (PARAMS),A ;SAVE THE NEW PORT NUMBER JP PRINT ;AND DISPLAY THE NEW MENU SKIP1: DEC A ;C,D,E,F? JR NZ,SKIP2 ;BYPASS THE STOP BIT ROUTINE LD A,(PARAMS+1) ;GET THE STOP BIT PARAMETER INC A ;GOOSE IT UP CP 3 ;0,1,2 ACCEPTED JR C,STOPOK ;OTHERWISE XOR A ;FOLD BACK TO 0, STOPOK: LD (PARAMS+1),A ;SAVE THE NEW PARAMETER, JP PRINT ;DISPLAY THE NEW MENU SKIP2: DEC A ;D,E,F? JR NZ,SKIP3 ;BYPASS THE PARITY SETTING LD A,(PARAMS+2) ;GET 0,1,2 INC A ;GOOSE IT UP 1 CP 3 ;0,1,2 FOR NONE, ODD, EVEN JR C,PTYOK ;IF OUT OF THIS RANGE, XOR A ;FOLD BACK TO 0 PTYOK: LD (PARAMS+2),A ;RE-INSTALL PARITY JP PRINT ;JUMP TO MENU DISPLAY SKIP3: DEC A ;E,F? JR NZ,SKIP4 ;SKIP OVER THE DATA BIT SETTING LD A,(PARAMS+3) ;GET THE DATA BITS INC A ;GOOSE UP THE COUNT CP 9 ;5,6,7,8 DATA BITS JR C,DATOK ;IF TOO MANY, LD A,5 ;FOLD BACK TO 5 DATOK: LD (PARAMS+3),A ;SAVE PARAMETER JP PRINT ;DISPLAY MENU SKIP4: DEC A ;F? JR NZ,SKIP5 ;SKIP OVER THE BAUD SETTING LD A,(PARAMS+4) ;GET BAUD RATE INC A ;GOOSE IT UP CP 18 ;0 THRU 17 ALLOWED BAUDS EQU $-1 ;(UNLESS #18 INSTALLED IN COMMAND LINE) JR C,BAUDOK ;IF NOT ACCEPTABLE, XOR A ;RESET TO THE FIRST BAUD RATE IN TABLE BAUDOK: LD (PARAMS+4),A ;SAVE THE BAUD RATE JP PRINT ;DISPLAY THE MENU SKIP5: DEC A ;BETTER BE DOWN TO ZERO BY NOW... JR NZ,BADKEY ;IF IT AIN'T THE EXIT, IT'S WRONG. ; NOW IS THE TIME TO PROCESS ALL THE PARAMETERS AND SET THE CHIPS: PROCESS:LD A,(PARAMS+4) ;GET THE BAUD RATE POINTER PUSH AF ;SAVE FOR LATER TWEAKING LD HL,DIVISOR ;HL > TABLE OF BAUD RATE DIVISORS RLCA ;BAUD RATE POINTER TIMES 2 LD E,A ;IN ORDER TO GENERATE THE OFFSET LD D,0 ;INTO THE TABLE OF BAUD RATE DIVISORS ADD HL,DE ;HL NOW POINTS TO THE DIVISOR LD A,(HL) ;GET THE DIVISOR INC HL ;(BOTH BYTES) LD H,(HL) ;INTO THE LD L,A ;HL REGISTER PAIR LD (CDIVIS),HL ;SAVE THE DIVISOR IN THE SELF-WRITING AREA POP AF ;RETRIEVE THE BAUD RATE NUMBER CP 15 ;<= 9600 BAUD ? LD A,2 ;THEN USE THE TIMES 16 SETTING JR C,TIMES16 ;IF > 9600 BAUD, DEC A ;SET THE TIMES 1 FLAG TIMES16:LD (FACTOR),A ;IN SELF-WRITING AREA OF PROGRAM LD HL,PARAMS ;FIRST PARAMETER LD A,(HL) ;IS PORT NUMBER (1 OR 2) OR 0F0H ;MAKE IT F1 OR F2 LD (CPORT),A ;RE-WRITE THE PROGRAM WITH THE RIGHT PORT. LD A,(HL) ;BACK TO 1 OR 2 AGAIN RRCA ;SHIFT THE BITS UNTIL THEY RRCA ;SWEEP AROUND TO BITS 6,7 OR 3EH ;ADD IN THE REST OF THE 8253 CONTROL BYTE LD (CSELECT),A ;AND WRITE IT INTO THE PROGRAM. INC HL ; NEXT, GET THE LD A,(HL) ; STOP BIT PARAMETER OR A ;0 MEANS 1 STOP BIT JR Z,STOP1 ;SO SKIP OVER IF SO DEC A ;1 COUNTS DOWN TO 0 JR NZ,STOP2 ;SO NON-ZERO MEANS SKIP OUT. LD A,0B0H ;MUST BE 1.5 STOP BITS DB 1 ;MASK OUT 1 STOP BIT: STOP1: LD A,040H ; 40H IS THE 1 STOP BIT MASK DB 1 ;MASK OUT 2 STOP BIT: STOP2: LD A,0C0H ; 0C0H IS THE 2 STOP BIT MASK LD E,A ;SAVE THE STOP BIT MASK INC HL ;HL > PARITY LD A,(HL) ;IS THE PARAMETER OR A ;ZERO? JR Z,PARITY0 ;THEN SKIP OUT TO SET IT THUS. DEC A ;1 DECREMENTS TO ZERO LD A,10H ;ODD PARITY MASK JR Z,PARITY0 ;SKIP TO INSTALL ODD PARITY LD A,30H ;EVEN PARITY MASK PARITY0:OR E ;SAVE THE PARITY MASK LD E,A ;COMBINED WITH THE STOP BIT MASK INC HL ;HL > DATA BITS LD A,(HL) ; GET IT. SUB 5 ;NORMALIZE 5,6,7,8 TO 0,1,2,3 JR Z,SETBIT ;5 DATA BITS -> ZERO MASK DEC A ;STEP THRU JR Z,BIT6 ;THE DEC A ;POSSIBILITIES JR Z,BIT7 ;ONE AT A TIME LD A,0CH ;LOAD THE 8 DATA BIT MASK. DB 1 ;MASK OUT THE 6 BIT MASK BIT6: LD A,4 ;(6 BIT MASK) DB 1 ;MASK OUT BIT 7 BIT7: LD A,8 ;(7 BIT MASK) SETBIT: OR 2 ;SET FOR 16X BAUD RATE FACTOR EQU $-1 ;SET TO X1 IF OVER 9600 BAUD OR E ;ABSORB THE STOP BIT AND PARITY MASK LD (CCONFIG),A ;AND GO TO THE SELF-MODIFYING CODE: ; LD A,0BEH ;SELECT CHANNEL 1 OR 2 CSELECT EQU $-1 OUT (0F3H),A ;ON THE CTC CHIP LD DE,0683H ;DE = BAUD RATE DIVISOR CDIVIS EQU $-2 LD C,0F2H ;C = PORT TO OUTPUT CPORT EQU $-1 OUT (C),E ;OUTPUT THE DIVISOR OUT (C),D ; (BOTH BYTES) LD A,C ;TAKE THE PORT, AND 3 ;0F1 OR 0F2 BECOMES 1 OR 2 AGAIN RLCA ;DOUBLE THAT TO 2 OR 4 ADD A,0FBH ;FD OR FF FOR PORT 1 OR PORT 2, RESPECTIVELY LD C,A ;C = PORT NUMBER LD A,40H ;RESET 8251 OUT (C),A ;RESET LD A,0CEH ;FLAGS FOR N,8,2 CCONFIG EQU $-1 OUT (C),A ;SET THE SERIAL PARAMETERS LD A,37H ;RESETS ERRORS, SET DSR, ETC. OUT (C),A ;DO IT TO IT, ; NOW PRINT OUT WHAT'S HAPPENED (IN COMMAND LINE FORMAT) LD A,(PARAMS) ;GET PORT OR '0' ;AS ASCII CHARACTER LD (WHAT1),A ;INTO OUTPUT LINE LD A,(PARAMS+4) ;GET LD E,A ;5 TIMES RLCA ;DOUBLED RLCA ;QUADRUPLED ADD A,E ;PLUS 1 LD E,A ;ADD LD D,0 ;OFFSET LD HL,BAUDTXT ;GET ADD HL,DE ;POINTER TO BAUD TEXT LD DE,WHAT2 ;BAUD LD BC,5 ;RATE LDIR ;ACROSS LD A,(PARAMS+2) ;MOVE LD HL,NOE ;N OR O OR E OR A ;ZERO? JR Z,GOTNOE ;EXIT LOOPING:INC HL ;WORK THRU DEC A ;THE JR NZ,LOOPING ;POSSIBILITIES GOTNOE: LD A,(HL) ;SAVE LD (WHAT3),A ;PARITY, LD A,(PARAMS+3) ;DATA OR '0' ;AS ASCII LD (WHAT4),A ;BITS LD A,(PARAMS+1) ;GET STOPS LD E,A ;TIMES RLCA ;3 ADD A,E ;FOR LD E,A ;THEN LD D,0 ;FETCHING LD HL,STOPTXT ;TEXT OF ADD HL,DE ;STOP BITS LD DE,WHAT5 ;STOP BITS LD BC,3 ;ALSO LDIR ;MOVED, LD C,PRTSTR ;DISPLAY LD DE,BYEBYE ;TEXT CALL BDOS ;BEFORE EXIT JP BOOT ;AND THAT'S THE END OF THE PROGRAM ; NOE: DB 'NOE' ; BYEBYE: DB LF,CR,'SETCOM ' WHAT1: DB '2 ' WHAT2: DB '1200 ' WHAT3: DB 'N ' WHAT4: DB '8 ' WHAT5: DB '2 ',LF,CR,'$' ; ; DEFAULT SETTINGS: PARAMS: DB 2 ;PORT NUMBER 2 DB 2 ;2 STOP BITS DB 0 ;NO PARITY DB 8 ;8 DATA BITS DB 8 ;1200 BAUD: SEE DIVISOR + 8 * 2 BYTES ; DIVISOR: ;ASSUMES X16 FOR 9600 BAUD & BELOW, X1 FOR ABOVE. DW 09C4H ;50 BAUD DW 0683H ;75 DW 0470H ;110 DW 03A1H ;135 DW 0341H ;150 DW 01A1H ;300 DW 0116H ;450 BAUD FOR "PUSHING" A 300 BAUD MODEM DW 00D0H ;600 DW 0068H ;1200 (THIS IS THE DEFAULT SETTING FOR PORT 2) DW 0045H ;1800 DW 003FH ;2000 DW 0034H ;2400 DW 001AH ;4800 DW 0011H ;7200 DW 000DH ;9600 DW 008BH ;14400 AT THE X1 SETTING DW 0077H ;16800 AT THE X1 SETTING DW 0068H ;19200 AT THE X1 SETTING EXTRAD: DW 0000H ;ALLOW ROOM FOR A COMMAND LINE DIVISOR ; PARTXT: DB 'NONE' DB 'ODD ' DB 'EVEN' ; STOPTXT:DB '1 ' DB '1.5' DB '2 ' ; CLS: DB CLR,'$' ;CLEAR THE SCREEN MENU: DB HOME ;HOME THE CURSOR DB 'SETCOM: SET SERIAL COMMUNICATIONS PORTS (MORROW REV. 2)' DB LF,CR,LF DB 'FOR COMMAND LINE ENTRY OF PARAMETERS, ' DB 'USE THE FOLLOWING COMMAND FORMAT:',LF,CR,LF DB ' SETCOM [PORT] [BAUD] [PARITY] [DATA BITS] [STOP BITS]' DB LF,CR,LF,' (EXAMPLE: SETCOM 2 19200 N 8 1.5 )',LF,CR,LF DB 'A--> SERIAL PORT NUMBER: ' S1OR2: DB '2',LF,CR,LF DB 'B--> TRANSMIT STOP BITS: ' STOPS: DB '2 ',LF,CR,LF DB 'C--> XMTR - RCVR PARITY: ' PARITY: DB 'NONE',LF,CR,LF DB 'D--> DATA BITS PER CHAR: ' BITS: DB '8',LF,CR,LF DB 'E--> BAUD RATE: ' BAUD: DB '1200 ',LF,CR,LF DB 'F--> FINISH (INSTALL ALL PARAMETERS AS SHOWN ON THE SCREEN)' DB LF,CR,LF DB "POKE SOME KEYS (A'S TO E'S), THEN JUST 'F' OFF" DB " (OR ESCape): " BSERAS: DB BS," ",BS,"$" ; BAUDTXT:DB '50 ' DB '75 ' DB '110 ' DB '135 ' DB '150 ' DB '300 ' DB '450 ' DB '600 ' DB '1200 ' DB '1800 ' DB '2000 ' DB '2400 ' DB '4800 ' DB '7200 ' DB '9600 ' DB '14400' DB '16800' DB '19200' EXTRAB: DB ' ' ;EXTRA BAUD RATE TEXT ; END END BEGIN