MACRO-80 3.44 09-Dec-81 PAGE 1 ; 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 0000' ASEG ;ABSOLUTE SEGMENT AT 100H ORG 100H ;LIKE ANY GOOD .COM FILE 0100 C3 0395 BEGIN: JP START ;SKIP OVER THIS FIRST BUNCH OF TEXT 0103 0D 4D 44 53 DB 0DH,'MDSETCOM.COM is a PUBLIC DOMAIN program for the Morrow' 0107 45 54 43 4F 010B 4D 2E 43 4F 010F 4D 20 69 73 0113 20 61 20 50 0117 55 42 4C 49 011B 43 20 44 4F 011F 4D 41 49 4E 0123 20 70 72 6F 0127 67 72 61 6D 012B 20 66 6F 72 012F 20 74 68 65 0133 20 4D 6F 72 0137 72 6F 77 013A 0A 0D 4D 69 DB 0AH,0DH,'Micro-Decision with the revision 2 board. Parameters' 013E 63 72 6F 2D 0142 44 65 63 69 0146 73 69 6F 6E 014A 20 77 69 74 014E 68 20 74 68 0152 65 20 72 65 0156 76 69 73 69 015A 6F 6E 20 32 015E 20 62 6F 61 0162 72 64 2E 20 0166 50 61 72 61 016A 6D 65 74 65 016E 72 73 0170 0A 0D 65 78 DB 0AH,0DH,'expected are: the port number (1 or 2), the baud rate' 0174 70 65 63 74 0178 65 64 20 61 017C 72 65 3A 20 0180 74 68 65 20 0184 70 6F 72 74 0188 20 6E 75 6D 018C 62 65 72 20 0190 28 31 20 6F 0194 72 20 32 29 0198 2C 20 74 68 019C 65 20 62 61 01A0 75 64 20 72 01A4 61 74 65 01A7 0A 0D 28 32 DB 0AH,0DH,'(20 to 50000), the parity (Even, Odd, or None), the' 01AB 30 20 74 6F 01AF 20 35 30 30 01B3 30 30 29 2C MACRO-80 3.44 09-Dec-81 PAGE 1-1 01B7 20 74 68 65 01BB 20 70 61 72 01BF 69 74 79 20 01C3 28 45 76 65 01C7 6E 2C 20 4F 01CB 64 64 2C 20 01CF 6F 72 20 4E 01D3 6F 6E 65 29 01D7 2C 20 74 68 01DB 65 01DC 0A 0D 6E 75 DB 0AH,0DH,'number of data bits (5 to 8) and the number of stop' 01E0 6D 62 65 72 01E4 20 6F 66 20 01E8 64 61 74 61 01EC 20 62 69 74 01F0 73 20 28 35 01F4 20 74 6F 20 01F8 38 29 20 61 01FC 6E 64 20 74 0200 68 65 20 6E 0204 75 6D 62 65 0208 72 20 6F 66 020C 20 73 74 6F 0210 70 0211 0A 0D 62 69 DB 0AH,0DH,'bits (1, 1.5, or 2). In real life, that means that' 0215 74 73 20 28 0219 31 2C 20 31 021D 2E 35 2C 20 0221 6F 72 20 32 0225 29 2E 20 20 0229 49 6E 20 72 022D 65 61 6C 20 0231 6C 69 66 65 0235 2C 20 74 68 0239 61 74 20 6D 023D 65 61 6E 73 0241 20 74 68 61 0245 74 0246 0A 0D 20 20 DB 0AH,0DH,' MDSETCOM 1 19200 N 8 1' 024A 20 4D 44 53 024E 45 54 43 4F 0252 4D 20 31 20 0256 31 39 32 30 025A 30 20 4E 20 025E 38 20 31 0261 0A 0D 77 69 DB 0AH,0DH,'will set serial port number 1 (the terminal port)' 0265 6C 6C 20 73 0269 65 74 20 73 026D 65 72 69 61 0271 6C 20 70 6F 0275 72 74 20 6E 0279 75 6D 62 65 027D 72 20 31 20 0281 28 74 68 65 0285 20 74 65 72 0289 6D 69 6E 61 MACRO-80 3.44 09-Dec-81 PAGE 1-2 028D 6C 20 70 6F 0291 72 74 29 0294 0A 0D 74 6F DB 0AH,0DH,'to 19.2 Kbaud with no parity, 8 data bits, and 1 stop' 0298 20 31 39 2E 029C 32 20 4B 62 02A0 61 75 64 20 02A4 77 69 74 68 02A8 20 6E 6F 20 02AC 70 61 72 69 02B0 74 79 2C 20 02B4 38 20 64 61 02B8 74 61 20 62 02BC 69 74 73 2C 02C0 20 61 6E 64 02C4 20 31 20 73 02C8 74 6F 70 02CB 0A 0D 62 69 DB 0AH,0DH,'bit. Use MDSETCOM 2 450 N 8 1 to "push" a 300 baud' 02CF 74 2E 20 20 02D3 55 73 65 20 02D7 4D 44 53 45 02DB 54 43 4F 4D 02DF 20 32 20 34 02E3 35 30 20 4E 02E7 20 38 20 31 02EB 20 74 6F 20 02EF 22 70 75 73 02F3 68 22 20 61 02F7 20 33 30 30 02FB 20 62 61 75 02FF 64 0300 0A 0D 6D 6F DB 0AH,0DH,'modem to 450 baud, or goose it to the limit for' 0304 64 65 6D 20 0308 74 6F 20 34 030C 35 30 20 62 0310 61 75 64 2C 0314 20 6F 72 20 0318 67 6F 6F 73 031C 65 20 69 74 0320 20 74 6F 20 0324 74 68 65 20 0328 6C 69 6D 69 032C 74 20 66 6F 0330 72 0331 0A 0D 70 72 DB 0AH,0DH,'print buffers or other hard-wired applications.' 0335 69 6E 74 20 0339 62 75 66 66 033D 65 72 73 20 0341 6F 72 20 6F 0345 74 68 65 72 0349 20 68 61 72 034D 64 2D 77 69 0351 72 65 64 20 0355 61 70 70 6C 0359 69 63 61 74 035D 69 6F 6E 73 0361 2E MACRO-80 3.44 09-Dec-81 PAGE 1-3 0362 0A 0D 54 68 DB 0AH,0DH,'The trap door falls thru to a menu, so have fun.',1AH 0366 65 20 74 72 036A 61 70 20 64 036E 6F 6F 72 20 0372 66 61 6C 6C 0376 73 20 74 68 037A 72 75 20 74 037E 6F 20 61 20 0382 6D 65 6E 75 0386 2C 20 73 6F 038A 20 68 61 76 038E 65 20 66 75 0392 6E 2E 1A ; DEFINE A FEW LOW MEMORY AREAS: 0000 BOOT EQU 0 0005 BDOS EQU 5 0080 BUFFER EQU 80H ; DEFINE SOME HANDY ASCII CHARACTERS: 0008 BS EQU 8 000A LF EQU 0AH 000D CR EQU 0DH 001B ESC EQU 1BH ; THESE MORROW STANDARD CONTOL CODES ARE NEEDED FOR PRETTINESS: 001A CLR EQU 1AH ; CLEAR SCREEN 001E HOME EQU 1EH ; HOME CURSOR ; ONLY 2 BDOS FUNCTION CALLS ARE USED: 0001 CONIN EQU 1 ; CONSOLE INPUT 0009 PRTSTR EQU 9 ; PRINT STRING ($ TERMINATOR) 0395 31 0100 START: LD SP,BEGIN ; SET UP YOUR OWN STACK SPACE 0398 21 0080 LD HL,BUFFER ;CHECK FOR COMMAND LINE ENTRY 039B 7E LD A,(HL) ; GET CHARATER COUNT 039C B7 OR A ; NO COMMAND LINE ENTRY? 039D CA 0493 JP Z,MENUDRV ; THEN USE THE MENU-DRIVEN PROGRAM 03A0 47 LD B,A ;OTHERWISE, GET THE LINE LENGTH 03A1 CD 0482 CALL SCAN ;RETURN NEXT NON-BLANK CHARACTER 03A4 FE 31 CP '1' ;PORT 1? 03A6 DA 048E JP C,BLANK ;IF LESS THAN 1, USE THE MENU 03A9 FE 33 CP '3' ;MORE THAN 2? 03AB D2 048E JP NC,BLANK ;LIKEWISE UNACCEPTABLE 03AE E6 03 AND 3 ;CONVERT 1 OR 2 TO BINARY 03B0 32 0665 LD (PARAMS),A ;AND SAVE IT IN THE PARAMETER AREA 03B3 CD 0482 CALL SCAN ;SCAN FORWARD TO BAUD RATE 03B6 E5 PUSH HL ;SAVE POINTER TO BAUD RATE IN COMMAND LINE 03B7 EB EX DE,HL ;COMMAND LINE POINTER IN DE 03B8 21 0000 LD HL,0 ;INITIALIZE FOR ASCII - BINARY CONVERSION 03BB 1A NEXTNUM:LD A,(DE) ; GET DIGIT 03BC FE 30 CP '0' ;IF IT'S LESS THAN ZERO, 03BE 38 19 JR C,NONNUM ;CONVERSION IS FINISHED 03C0 FE 3A CP '9'+1 ; IF IT'S GREATER THAN 9 03C2 30 15 JR NC,NONNUM ; YOU ARE LIKEWISE FINISHED 03C4 E6 0F AND 0FH ;MASK 0-9 ASCII TO 0-9 BINARY 03C6 D5 PUSH DE ;SAVE POINTER TO TEXT 03C7 54 LD D,H ;MOVE ACCUMULATED BINARY NUMBER 03C8 5D LD E,L ;TO THE DE REGISTER PAIR 03C9 29 ADD HL,HL ;SO THAT MACRO-80 3.44 09-Dec-81 PAGE 1-4 03CA 29 ADD HL,HL ;YOU CAN 03CB 29 ADD HL,HL ;MULTIPLY 03CC 19 ADD HL,DE ;IT BY 10 03CD 19 ADD HL,DE ;BEFORE 03CE 5F LD E,A ;ADDING 03CF 16 00 LD D,0 ;THE MOST 03D1 19 ADD HL,DE ;RECENT DIGIT. 03D2 D1 POP DE ;RETRIEVE TEXT POINTER 03D3 13 INC DE ;GET NEXT CHARACTER 03D4 10 E5 DJNZ NEXTNUM ;AND KEEP LOOPING 03D6 C3 048E JP BLANK ;(MENU TIME IF YOU RUN OUT OF TEXT) 03D9 C5 NONNUM: PUSH BC ;SAVE LENGTH 03DA D5 PUSH DE ;SAVE POINTER 03DB EB EX DE,HL ;DE=BAUD RATE 03DC 21 0000 LD HL,0 ;ZERO DIVIDEND 03DF E5 PUSH HL ;ON STACK 03E0 21 2580 LD HL,9600 ;CHECK FOR 9600 BAUD OR LESS 03E3 AF XOR A ;ZERO FLAGS 03E4 ED 52 SBC HL,DE ;IF > 9600 BAUD, USE 03E6 3E 01 LD A,1 ;X1 MASK, AND 03E8 21 1E84 LD HL,1E84H ;DIVIDE INTO 2 MHZ CLOCK RATE 03EB 01 0880 LD BC,0880H ;1E8480H=2000000 IN HLC, B=BITS TO SHIFT 03EE 38 03 JR C,GT9600 ; IF NOT GREATER THAN 9600 BAUD, 4 BIT SHIFT: 03F0 06 04 LD B,4 ;1E848H=2000000/16 FOR <=9600 BAUD 03F2 3C INC A ;X16 MASK 03F3 32 05CB GT9600: LD (FACTOR),A ;SAVE THE X1 OR X16 FLAG 03F6 AF XOR A ; ZERO EVERYTHING BEFORE DOING THE DIVISION: 03F7 ED 52 DIVIDE: SBC HL,DE ;SUBTRACT BAUD RATE FROM CLOCK 03F9 E3 EX (SP),HL ; SWAP QUOTIENT & DIVIDEND 03FA 23 INC HL ; INCREASE QUOTIENT 03FB E3 EX (SP),HL ; QUOTIENT ON STACK, DIVIDEND IN HL 03FC 30 F9 JR NC,DIVIDE ;IF DIVIDEND > DIVISOR, KEEP LOOPING 03FE E3 EX (SP),HL ; OTHERWISE YOU WENT TOO FAR: 03FF 2B DEC HL ; DECREASE QUOTIENT 0400 29 ADD HL,HL ; SHIFT QUOTIENT LEFT 1 BIT 0401 E3 EX (SP),HL ; QUOTIENT ON STACK, DIVIDEND IN HL 0402 ED 5A ADC HL,DE ; UN-DO THE EXCESS SUBTRACTION, THEN 0404 CB 11 RL C ;SHIFT DIVIDEND LEFT 0406 ED 6A ADC HL,HL ; 1 BIT, LOOP THRU HOWEVER MANY TIMES 0408 10 ED DJNZ DIVIDE ; THE BIT SHIFT INDICATES. 040A 29 ADD HL,HL ;DOUBLE THE REMAINDER, SEE IF THE BAUD RATE 040B ED 52 SBC HL,DE ; IS BIGGER (FOR ROUNDING UP) 040D E1 POP HL ;RETRIEVE THE QUOTIENT FROM THE STACK 040E 38 01 JR C,NOROUND ;IF THE REMAINDER IS MORE THAN HALF THE BAUD, 0410 23 INC HL ; ROUND UP THE QUOTIENT 0411 22 05D5 NOROUND:LD (CDIVIS),HL ; (HEREAFTER KNOWN AS THE BAUD RATE DIVISOR) 0414 22 068E LD (EXTRAD),HL ; SAVE IT TWICE 0417 3E 12 LD A,18 ;INSTALL 0419 32 0669 LD (PARAMS+4),A ;IN PARAMETER TABLE ;(INSTALL BAUD RATE INFO AS EXTRA TEXT & DIVISOR IN TABLES.) 041C E1 POP HL ; RETRIEVE POINTER TO TEXT IN BUFFER 041D 54 LD D,H ; IN BOTH HL 041E 5D LD E,L ; AND DE. 041F C1 POP BC ; GET LENGTH OF TEXT YET TO PROCESS 0420 E3 EX (SP),HL ;SWAP CURRENT POINTER WITH OLD POINTER TO BAUD 0421 EB EX DE,HL ;SWAP OLD & NEW MACRO-80 3.44 09-Dec-81 PAGE 1-5 0422 23 INC HL ;GOOSE IT UP 0423 ED 52 SBC HL,DE ;HL = LENGTH OF BAUD RATE TEXT 0425 C5 PUSH BC ;SAVE LENGTH AGAIN 0426 4D LD C,L ;MOVE LENGTH OF TEXT 0427 44 LD B,H ;INTO BC 0428 EB EX DE,HL ;HL > SOURCE OF TEXT IN COMMAND LINE 0429 11 08FA LD DE,EXTRAB ;DE > DESTINATION IN BAUD RATE TABLE 042C ED B0 LDIR ;MOVE IT OVER 042E 3E 13 LD A,19 ;ADD EXTRA BAUD RATE TO MENU 0430 32 055B LD (BAUDS),A ;BY GOOSING UP MAX COUNTER 0433 C1 POP BC ;RETRIEVE TEXT LENGTH 0434 E1 POP HL ; AND TEXT POINTER 0435 CD 0482 CALL SCAN ;LOOK PAST THE BAUD RATE 0438 E6 4F AND 4FH ;FORCE CHARACTER TO UPPER CASE 043A 0E 00 LD C,0 ; C = NO PARITY FLAG 043C FE 4E CP 'N' ; RIGHT? 043E 28 0B JR Z,SETP ; THEN SET THE PARITY 0440 0C INC C ; C = ODD PARITY FLAG 0441 FE 4F CP 'O' ; RIGHT? 0443 28 06 JR Z,SETP ; SO DO IT 0445 0C INC C ; C = EVEN PARITY FLAG 0446 FE 45 CP 'E' ; THAT'S WHAT "E" MEANS 0448 C2 048E JP NZ,BLANK ; IF IT'S NOT O,E, OR N, IT'S WRONG. 044B 79 SETP: LD A,C ;SAVE THE PARITY FLAG 044C 32 0667 LD (PARAMS+2),A ;IN THE PARAMETER AREA FOR LATER USE ;NOW PROCESS THE DATA BITS & STOP BITS: 044F CD 0482 CALL SCAN ;NEXT CHARACTER 0452 FE 35 CP '5' ;LESS THAN 5 DATA BITS 0454 38 39 JR C,ABORTD ;IS AN ABORTION 0456 FE 39 CP '9' ;9 DATA BITS? 0458 30 35 JR NC,ABORTD ;DON'T BE SILLY. 045A E6 0F AND 0FH ;MAKE ASCII 5-8 TO BINARY 5-8 045C 32 0668 LD (PARAMS+3),A ; THEN INSERT IN THE APPROPRIATE PLACE 045F CD 0482 CALL SCAN ;GET THE LAST INFORMATION 0462 FE 32 CP '2' ;2 STOP BITS? 0464 0E 02 LD C,2 ;C = 2 STOP BITS FLAG 0466 28 13 JR Z,SB2 ;THEN SKIP OUT WITH YOUR INFO 0468 FE 31 CP '1' ; 1 OR 1.5 STOP BITS? 046A 20 23 JR NZ,ABORTD ;IF IT AIN'T, IT'S WRONG 046C 23 INC HL ; NEXT CHARACTER 046D 7E LD A,(HL) ; IN THE ACCUMULATOR, 046E 0E 00 LD C,0 ;C = 1 STOP BIT FLAG 0470 FE 2E CP '.' ;DECIMAL POINT (AS IN 1.5 STOP BITS)? 0472 20 07 JR NZ,SB2 ; IF NOT, IT MUST BE 1 STOP BIT 0474 23 INC HL ;NEXT CHARACTER 0475 7E LD A,(HL) ;TO CHECK: 0476 FE 35 CP '5' ; IS IT REALLY 1.5 STOP BITS? 0478 20 15 JR NZ,ABORTD ;IF NOT, GO TO THE MENU STUFF 047A 0C INC C ;OTHERWISE, C=1 FOR 1.5 STOP BITS 047B 79 SB2: LD A,C ;SAVE THE STOP BIT FLAG 047C 32 0666 LD (PARAMS+1),A ;IN THE PARAMETER AREA, THEN 047F C3 0586 JP TIMES16+3 ;RUN THEM ALL THRU THE PROGRAM 0482 23 SCAN: INC HL ; POINT TO THE NEXT CHARACTER IN THE BUFFER 0483 05 DEC B ; AND DECREASE THE NUMBER OF CHARS TO LOOK AT 0484 28 08 JR Z,BLANK ;SKIP OUT IF NO MORE CHARS 0486 7E LD A,(HL) ;GET CHAR MACRO-80 3.44 09-Dec-81 PAGE 1-6 0487 FE 20 CP ' ' ;BLANK? 0489 28 F7 JR Z,SCAN ;THEN KEEP LOOKING 048B 38 01 JR C,BLANK ;EXIT IF IT'S A CONTROL CHARACTER 048D C9 RET ; OTHERWISE RETURN WITH THE GOOD NEWS. 048E E1 BLANK: POP HL ;JERK OUT THE RETURN ADDRESS 048F AF ABORTD: XOR A ;ZERO OUT THE BUFFER 0490 32 0080 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: 0493 11 06A5 MENUDRV:LD DE,CLS ;THE FIRST-TIME THRU, CLEAR THE SCREEN 0496 0E 09 LD C,PRTSTR ;BY PRINTING OUT THE CLEAR SCREEN FUNCTION 0498 CD 0005 CALL BDOS ;WITH THE BDOS CALL 049B 21 0665 PRINT: LD HL,PARAMS ; POINT TO THE PARAMETERS 049E 3E 30 LD A,'0' ; CONVERT BINARY TO ASCII 04A0 B6 OR (HL) ; 1 OR 2 04A1 32 07A9 LD (S1OR2),A ; AND INSTALL INTO THE MENU DISPLAY 04A4 23 INC HL ;NEXT PARAMETER: STOP BITS 04A5 5E LD E,(HL) ; 0,1,2 FOR 1,1.5,2 STOP BITS 04A6 16 00 LD D,0 ; MEANS 3 BYTES MAX TO INSTALL IN THE MENU, 04A8 E5 PUSH HL ; SO SAVE POINTER TO PARAMETERS, 04A9 21 069C LD HL,STOPTXT ;HL > TEXT OF STOP BIT VALUES 04AC 19 ADD HL,DE ;SKIP OVER 04AD 19 ADD HL,DE ;TO THE 04AE 19 ADD HL,DE ;DESIRED TEXT, 04AF 11 07C6 LD DE,STOPS ;THEN MOVE 04B2 01 0003 LD BC,3 ;3 BYTES 04B5 ED B0 LDIR ;FROM TEXT AREA TO THE MENU. 04B7 E1 POP HL ;RETRIEVE THE PARAMETER POINTER 04B8 23 INC HL ;HL > PARITY PARAMETER 04B9 7E LD A,(HL) ; GET 0,1,2 FOR NONE, ODD, EVEN 04BA 07 RLCA ; MULTIPLY 04BB 07 RLCA ; BY 4 (4 BYTES OF TEXT, RIGHT?) 04BC 5F LD E,A ;MOVE OFFSET 04BD 16 00 LD D,0 ;TO DE REGISTER, 04BF E5 PUSH HL ;SAVE PARAM. POINTER 04C0 21 0690 LD HL,PARTXT ;HL > TEXT OF PARITY WORDS 04C3 19 ADD HL,DE ;ADD OFFSET 04C4 11 07E5 LD DE,PARITY ;NOW MOVE THE TEXT 04C7 01 0004 LD BC,4 ;(ALL 4 BYTES OF IT) 04CA ED B0 LDIR ;INTO THE MENU 04CC E1 POP HL ;RETRIEVE THE PARAMETER POINTER 04CD 23 INC HL ;HL > DATA BITS 04CE 3E 30 LD A,'0' ;CREATE ASCII 5,6,7,8 04D0 B6 OR (HL) ;FROM THE BINARY 5,6,7,8 04D1 32 0805 LD (BITS),A ;AND PLUG INTO THE MENU TEXT 04D4 23 INC HL ;HL > BAUD RATE PARAMETER 04D5 7E LD A,(HL) ;(0-17 FOR 50-19200 BAUD) 04D6 07 RLCA ; TIMES 2 04D7 07 RLCA ; TIMES 4 04D8 8E ADC A,(HL) ; TIMES 5 (5 BYTES OF TEXT) 04D9 5F LD E,A ;DE NOW HOLD THE OFFSET 04DA 16 00 LD D,0 ;TO THE DESIRED BAUD RATE TEXT 04DC 21 08A0 LD HL,BAUDTXT ;IN THE BAUD RATE TEXT TABLE 04DF 19 ADD HL,DE ; ADD IT, 04E0 11 0819 LD DE,BAUD ; POINT TO MENU, 04E3 01 0005 LD BC,5 ; COUNT THE BYTES, MACRO-80 3.44 09-Dec-81 PAGE 1-7 04E6 ED B0 LDIR ; AND SQUIRT IT OUT. 04E8 11 06A7 LD DE,MENU ;NOW POINT TO THE MENU, 04EB 0E 09 BYPASS: LD C,PRTSTR ;SET UP BDOS FUNCTION FOR DISPLAY 04ED CD 0005 CALL BDOS ;AND DISPLAY THE MENU 04F0 0E 01 INPUT: LD C,CONIN ;GET SOMETHING 04F2 CD 0005 CALL BDOS ;IN FROM THE KEYBOARD: 04F5 FE 41 KEYCHK: CP 'A' ;BELOW "A"? 04F7 38 08 JR C,BADKEY ;I WOULDN'T BELIEVE IT EITHER 04F9 FE 5B CP 'Z'+1 ;BETWEEN "A" AND "Z"? 04FB 38 10 JR C,KEYOK ;JUMP OUT FOR FURTHER PROCESSING 04FD D6 20 SUB 20H ;FOLD LOWER CASE INTO UPPER CASE 04FF 18 F4 JR KEYCHK ;AND RE-PROCESS TO CHECK RANGE 0501 FE 1B BADKEY: CP ESC ;ESCAPE? 0503 CA 0000 JP Z,BOOT ;THEN ESCAPE! 0506 0E 09 LD C,PRTSTR ;OTHERWISE BACKSPACE AND ERASE 0508 11 089C LD DE,BSERAS ;WHATEVER KEY WAS PRESSED 050B 18 DE JR BYPASS ;AND LOOP THRU AGAIN 050D D6 41 KEYOK: SUB 'A' ;NORMALIZE KEY A-F TO 0-5 050F 20 0B JR NZ,SKIP1 ;BYPASS THE SET PORT ROUTINE IF B,C,D,E,F 0511 3A 0665 LD A,(PARAMS) ;OTHERWISE GET THE PORT NUMBER, 0514 EE 03 XOR 3 ;TOGGLE BETWEEN 1 AND 2 0516 32 0665 LD (PARAMS),A ;SAVE THE NEW PORT NUMBER 0519 C3 049B JP PRINT ;AND DISPLAY THE NEW MENU 051C 3D SKIP1: DEC A ;C,D,E,F? 051D 20 0F JR NZ,SKIP2 ;BYPASS THE STOP BIT ROUTINE 051F 3A 0666 LD A,(PARAMS+1) ;GET THE STOP BIT PARAMETER 0522 3C INC A ;GOOSE IT UP 0523 FE 03 CP 3 ;0,1,2 ACCEPTED 0525 38 01 JR C,STOPOK ;OTHERWISE 0527 AF XOR A ;FOLD BACK TO 0, 0528 32 0666 STOPOK: LD (PARAMS+1),A ;SAVE THE NEW PARAMETER, 052B C3 049B JP PRINT ;DISPLAY THE NEW MENU 052E 3D SKIP2: DEC A ;D,E,F? 052F 20 0F JR NZ,SKIP3 ;BYPASS THE PARITY SETTING 0531 3A 0667 LD A,(PARAMS+2) ;GET 0,1,2 0534 3C INC A ;GOOSE IT UP 1 0535 FE 03 CP 3 ;0,1,2 FOR NONE, ODD, EVEN 0537 38 01 JR C,PTYOK ;IF OUT OF THIS RANGE, 0539 AF XOR A ;FOLD BACK TO 0 053A 32 0667 PTYOK: LD (PARAMS+2),A ;RE-INSTALL PARITY 053D C3 049B JP PRINT ;JUMP TO MENU DISPLAY 0540 3D SKIP3: DEC A ;E,F? 0541 20 10 JR NZ,SKIP4 ;SKIP OVER THE DATA BIT SETTING 0543 3A 0668 LD A,(PARAMS+3) ;GET THE DATA BITS 0546 3C INC A ;GOOSE UP THE COUNT 0547 FE 09 CP 9 ;5,6,7,8 DATA BITS 0549 38 02 JR C,DATOK ;IF TOO MANY, 054B 3E 05 LD A,5 ;FOLD BACK TO 5 054D 32 0668 DATOK: LD (PARAMS+3),A ;SAVE PARAMETER 0550 C3 049B JP PRINT ;DISPLAY MENU 0553 3D SKIP4: DEC A ;F? 0554 20 0F JR NZ,SKIP5 ;SKIP OVER THE BAUD SETTING 0556 3A 0669 LD A,(PARAMS+4) ;GET BAUD RATE 0559 3C INC A ;GOOSE IT UP 055A FE 12 CP 18 ;0 THRU 17 ALLOWED 055B BAUDS EQU $-1 ;(UNLESS #18 INSTALLED IN COMMAND LINE) MACRO-80 3.44 09-Dec-81 PAGE 1-8 055C 38 01 JR C,BAUDOK ;IF NOT ACCEPTABLE, 055E AF XOR A ;RESET TO THE FIRST BAUD RATE IN TABLE 055F 32 0669 BAUDOK: LD (PARAMS+4),A ;SAVE THE BAUD RATE 0562 C3 049B JP PRINT ;DISPLAY THE MENU 0565 3D SKIP5: DEC A ;BETTER BE DOWN TO ZERO BY NOW... 0566 20 99 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: 0568 3A 0669 PROCESS:LD A,(PARAMS+4) ;GET THE BAUD RATE POINTER 056B F5 PUSH AF ;SAVE FOR LATER TWEAKING 056C 21 066A LD HL,DIVISOR ;HL > TABLE OF BAUD RATE DIVISORS 056F 07 RLCA ;BAUD RATE POINTER TIMES 2 0570 5F LD E,A ;IN ORDER TO GENERATE THE OFFSET 0571 16 00 LD D,0 ;INTO THE TABLE OF BAUD RATE DIVISORS 0573 19 ADD HL,DE ;HL NOW POINTS TO THE DIVISOR 0574 7E LD A,(HL) ;GET THE DIVISOR 0575 23 INC HL ;(BOTH BYTES) 0576 66 LD H,(HL) ;INTO THE 0577 6F LD L,A ;HL REGISTER PAIR 0578 22 05D5 LD (CDIVIS),HL ;SAVE THE DIVISOR IN THE SELF-WRITING AREA 057B F1 POP AF ;RETRIEVE THE BAUD RATE NUMBER 057C FE 0F CP 15 ;<= 9600 BAUD ? 057E 3E 02 LD A,2 ;THEN USE THE TIMES 16 SETTING 0580 38 01 JR C,TIMES16 ;IF > 9600 BAUD, 0582 3D DEC A ;SET THE TIMES 1 FLAG 0583 32 05CB TIMES16:LD (FACTOR),A ;IN SELF-WRITING AREA OF PROGRAM 0586 21 0665 LD HL,PARAMS ;FIRST PARAMETER 0589 7E LD A,(HL) ;IS PORT NUMBER (1 OR 2) 058A F6 F0 OR 0F0H ;MAKE IT F1 OR F2 058C 32 05D8 LD (CPORT),A ;RE-WRITE THE PROGRAM WITH THE RIGHT PORT. 058F 7E LD A,(HL) ;BACK TO 1 OR 2 AGAIN 0590 0F RRCA ;SHIFT THE BITS UNTIL THEY 0591 0F RRCA ;SWEEP AROUND TO BITS 6,7 0592 F6 3E OR 3EH ;ADD IN THE REST OF THE 8253 CONTROL BYTE 0594 32 05D1 LD (CSELECT),A ;AND WRITE IT INTO THE PROGRAM. 0597 23 INC HL ; NEXT, GET THE 0598 7E LD A,(HL) ; STOP BIT PARAMETER 0599 B7 OR A ;0 MEANS 1 STOP BIT 059A 28 06 JR Z,STOP1 ;SO SKIP OVER IF SO 059C 3D DEC A ;1 COUNTS DOWN TO 0 059D 20 06 JR NZ,STOP2 ;SO NON-ZERO MEANS SKIP OUT. 059F 3E B0 LD A,0B0H ;MUST BE 1.5 STOP BITS 05A1 01 DB 1 ;MASK OUT 1 STOP BIT: 05A2 3E 40 STOP1: LD A,040H ; 40H IS THE 1 STOP BIT MASK 05A4 01 DB 1 ;MASK OUT 2 STOP BIT: 05A5 3E C0 STOP2: LD A,0C0H ; 0C0H IS THE 2 STOP BIT MASK 05A7 5F LD E,A ;SAVE THE STOP BIT MASK 05A8 23 INC HL ;HL > PARITY 05A9 7E LD A,(HL) ;IS THE PARAMETER 05AA B7 OR A ;ZERO? 05AB 28 07 JR Z,PARITY0 ;THEN SKIP OUT TO SET IT THUS. 05AD 3D DEC A ;1 DECREMENTS TO ZERO 05AE 3E 10 LD A,10H ;ODD PARITY MASK 05B0 28 02 JR Z,PARITY0 ;SKIP TO INSTALL ODD PARITY 05B2 3E 30 LD A,30H ;EVEN PARITY MASK 05B4 B3 PARITY0:OR E ;SAVE THE PARITY MASK 05B5 5F LD E,A ;COMBINED WITH THE STOP BIT MASK MACRO-80 3.44 09-Dec-81 PAGE 1-9 05B6 23 INC HL ;HL > DATA BITS 05B7 7E LD A,(HL) ; GET IT. 05B8 D6 05 SUB 5 ;NORMALIZE 5,6,7,8 TO 0,1,2,3 05BA 28 0E JR Z,SETBIT ;5 DATA BITS -> ZERO MASK 05BC 3D DEC A ;STEP THRU 05BD 28 06 JR Z,BIT6 ;THE 05BF 3D DEC A ;POSSIBILITIES 05C0 28 06 JR Z,BIT7 ;ONE AT A TIME 05C2 3E 0C LD A,0CH ;LOAD THE 8 DATA BIT MASK. 05C4 01 DB 1 ;MASK OUT THE 6 BIT MASK 05C5 3E 04 BIT6: LD A,4 ;(6 BIT MASK) 05C7 01 DB 1 ;MASK OUT BIT 7 05C8 3E 08 BIT7: LD A,8 ;(7 BIT MASK) 05CA F6 02 SETBIT: OR 2 ;SET FOR 16X BAUD RATE 05CB FACTOR EQU $-1 ;SET TO X1 IF OVER 9600 BAUD 05CC B3 OR E ;ABSORB THE STOP BIT AND PARITY MASK 05CD 32 05E9 LD (CCONFIG),A ;AND GO TO THE SELF-MODIFYING CODE: ; 05D0 3E BE LD A,0BEH ;SELECT CHANNEL 1 OR 2 05D1 CSELECT EQU $-1 05D2 D3 F3 OUT (0F3H),A ;ON THE CTC CHIP 05D4 11 0683 LD DE,0683H ;DE = BAUD RATE DIVISOR 05D5 CDIVIS EQU $-2 05D7 0E F2 LD C,0F2H ;C = PORT TO OUTPUT 05D8 CPORT EQU $-1 05D9 ED 59 OUT (C),E ;OUTPUT THE DIVISOR 05DB ED 51 OUT (C),D ; (BOTH BYTES) 05DD 79 LD A,C ;TAKE THE PORT, 05DE E6 03 AND 3 ;0F1 OR 0F2 BECOMES 1 OR 2 AGAIN 05E0 07 RLCA ;DOUBLE THAT TO 2 OR 4 05E1 C6 FB ADD A,0FBH ;FD OR FF FOR PORT 1 OR PORT 2, RESPECTIVELY 05E3 4F LD C,A ;C = PORT NUMBER 05E4 3E 40 LD A,40H ;RESET 8251 05E6 ED 79 OUT (C),A ;RESET 05E8 3E CE LD A,0CEH ;FLAGS FOR N,8,2 05E9 CCONFIG EQU $-1 05EA ED 79 OUT (C),A ;SET THE SERIAL PARAMETERS 05EC 3E 37 LD A,37H ;RESETS ERRORS, SET DSR, ETC. 05EE ED 79 OUT (C),A ;DO IT TO IT, ; NOW PRINT OUT WHAT'S HAPPENED (IN COMMAND LINE FORMAT) 05F0 3A 0665 LD A,(PARAMS) ;GET PORT 05F3 F6 30 OR '0' ;AS ASCII CHARACTER 05F5 32 0653 LD (WHAT1),A ;INTO OUTPUT LINE 05F8 3A 0669 LD A,(PARAMS+4) ;GET 05FB 5F LD E,A ;5 TIMES 05FC 07 RLCA ;DOUBLED 05FD 07 RLCA ;QUADRUPLED 05FE 83 ADD A,E ;PLUS 1 05FF 5F LD E,A ;ADD 0600 16 00 LD D,0 ;OFFSET 0602 21 08A0 LD HL,BAUDTXT ;GET 0605 19 ADD HL,DE ;POINTER TO BAUD TEXT 0606 11 0655 LD DE,WHAT2 ;BAUD 0609 01 0005 LD BC,5 ;RATE 060C ED B0 LDIR ;ACROSS 060E 3A 0667 LD A,(PARAMS+2) ;MOVE MACRO-80 3.44 09-Dec-81 PAGE 1-10 0611 21 0647 LD HL,NOE ;N OR O OR E 0614 B7 OR A ;ZERO? 0615 28 04 JR Z,GOTNOE ;EXIT 0617 23 LOOPING:INC HL ;WORK THRU 0618 3D DEC A ;THE 0619 20 FC JR NZ,LOOPING ;POSSIBILITIES 061B 7E GOTNOE: LD A,(HL) ;SAVE 061C 32 065B LD (WHAT3),A ;PARITY, 061F 3A 0668 LD A,(PARAMS+3) ;DATA 0622 F6 30 OR '0' ;AS ASCII 0624 32 065D LD (WHAT4),A ;BITS 0627 3A 0666 LD A,(PARAMS+1) ;GET STOPS 062A 5F LD E,A ;TIMES 062B 07 RLCA ;3 062C 83 ADD A,E ;FOR 062D 5F LD E,A ;THEN 062E 16 00 LD D,0 ;FETCHING 0630 21 069C LD HL,STOPTXT ;TEXT OF 0633 19 ADD HL,DE ;STOP BITS 0634 11 065F LD DE,WHAT5 ;STOP BITS 0637 01 0003 LD BC,3 ;ALSO 063A ED B0 LDIR ;MOVED, 063C 0E 09 LD C,PRTSTR ;DISPLAY 063E 11 064A LD DE,BYEBYE ;TEXT 0641 CD 0005 CALL BDOS ;BEFORE EXIT 0644 C3 0000 JP BOOT ;AND THAT'S THE END OF THE PROGRAM ; 0647 4E 4F 45 NOE: DB 'NOE' ; 064A 0A 0D 53 45 BYEBYE: DB LF,CR,'SETCOM ' 064E 54 43 4F 4D 0652 20 0653 32 20 WHAT1: DB '2 ' 0655 31 32 30 30 WHAT2: DB '1200 ' 0659 20 20 065B 4E 20 WHAT3: DB 'N ' 065D 38 20 WHAT4: DB '8 ' 065F 32 20 20 0A WHAT5: DB '2 ',LF,CR,'$' 0663 0D 24 ; ; DEFAULT SETTINGS: 0665 02 PARAMS: DB 2 ;PORT NUMBER 2 0666 02 DB 2 ;2 STOP BITS 0667 00 DB 0 ;NO PARITY 0668 08 DB 8 ;8 DATA BITS 0669 08 DB 8 ;1200 BAUD: SEE DIVISOR + 8 * 2 BYTES ; 066A DIVISOR: ;ASSUMES X16 FOR 9600 BAUD & BELOW, X1 FOR ABOVE. 066A 09C4 DW 09C4H ;50 BAUD 066C 0683 DW 0683H ;75 066E 0470 DW 0470H ;110 0670 03A1 DW 03A1H ;135 0672 0341 DW 0341H ;150 0674 01A1 DW 01A1H ;300 0676 0116 DW 0116H ;450 BAUD FOR "PUSHING" A 300 BAUD MODEM 0678 00D0 DW 00D0H ;600 MACRO-80 3.44 09-Dec-81 PAGE 1-11 067A 0068 DW 0068H ;1200 (THIS IS THE DEFAULT SETTING FOR PORT 2) 067C 0045 DW 0045H ;1800 067E 003F DW 003FH ;2000 0680 0034 DW 0034H ;2400 0682 001A DW 001AH ;4800 0684 0011 DW 0011H ;7200 0686 000D DW 000DH ;9600 0688 008B DW 008BH ;14400 AT THE X1 SETTING 068A 0077 DW 0077H ;16800 AT THE X1 SETTING 068C 0068 DW 0068H ;19200 AT THE X1 SETTING 068E 0000 EXTRAD: DW 0000H ;ALLOW ROOM FOR A COMMAND LINE DIVISOR ; 0690 4E 4F 4E 45 PARTXT: DB 'NONE' 0694 4F 44 44 20 DB 'ODD ' 0698 45 56 45 4E DB 'EVEN' ; 069C 31 20 20 STOPTXT:DB '1 ' 069F 31 2E 35 DB '1.5' 06A2 32 20 20 DB '2 ' ; 06A5 1A 24 CLS: DB CLR,'$' ;CLEAR THE SCREEN 06A7 1E MENU: DB HOME ;HOME THE CURSOR 06A8 53 45 54 43 DB 'SETCOM: SET SERIAL COMMUNICATIONS PORTS (MORROW REV. 2)' 06AC 4F 4D 3A 20 06B0 53 45 54 20 06B4 53 45 52 49 06B8 41 4C 20 43 06BC 4F 4D 4D 55 06C0 4E 49 43 41 06C4 54 49 4F 4E 06C8 53 20 50 4F 06CC 52 54 53 20 06D0 28 4D 4F 52 06D4 52 4F 57 20 06D8 52 45 56 2E 06DC 20 32 29 06DF 0A 0D 0A DB LF,CR,LF 06E2 46 4F 52 20 DB 'FOR COMMAND LINE ENTRY OF PARAMETERS, ' 06E6 43 4F 4D 4D 06EA 41 4E 44 20 06EE 4C 49 4E 45 06F2 20 45 4E 54 06F6 52 59 20 4F 06FA 46 20 50 41 06FE 52 41 4D 45 0702 54 45 52 53 0706 2C 20 0708 55 53 45 20 DB 'USE THE FOLLOWING COMMAND FORMAT:',LF,CR,LF 070C 54 48 45 20 0710 46 4F 4C 4C 0714 4F 57 49 4E 0718 47 20 43 4F 071C 4D 4D 41 4E 0720 44 20 46 4F 0724 52 4D 41 54 0728 3A 0A 0D 0A MACRO-80 3.44 09-Dec-81 PAGE 1-12 072C 20 20 53 45 DB ' SETCOM [PORT] [BAUD] [PARITY] [DATA BITS] [STOP BITS]' 0730 54 43 4F 4D 0734 20 5B 50 4F 0738 52 54 5D 20 073C 5B 42 41 55 0740 44 5D 20 5B 0744 50 41 52 49 0748 54 59 5D 20 074C 5B 44 41 54 0750 41 20 42 49 0754 54 53 5D 20 0758 5B 53 54 4F 075C 50 20 42 49 0760 54 53 5D 0763 0A 0D 0A 20 DB LF,CR,LF,' (EXAMPLE: SETCOM 2 19200 N 8 1.5 )',LF,CR,LF 0767 20 28 45 58 076B 41 4D 50 4C 076F 45 3A 20 20 0773 53 45 54 43 0777 4F 4D 20 32 077B 20 31 39 32 077F 30 30 20 4E 0783 20 38 20 31 0787 2E 35 20 20 078B 20 29 0A 0D 078F 0A 0790 41 2D 2D 3E DB 'A--> SERIAL PORT NUMBER: ' 0794 20 53 45 52 0798 49 41 4C 20 079C 50 4F 52 54 07A0 20 4E 55 4D 07A4 42 45 52 3A 07A8 20 07A9 32 0A 0D 0A S1OR2: DB '2',LF,CR,LF 07AD 42 2D 2D 3E DB 'B--> TRANSMIT STOP BITS: ' 07B1 20 54 52 41 07B5 4E 53 4D 49 07B9 54 20 53 54 07BD 4F 50 20 42 07C1 49 54 53 3A 07C5 20 07C6 32 20 20 0A STOPS: DB '2 ',LF,CR,LF 07CA 0D 0A 07CC 43 2D 2D 3E DB 'C--> XMTR - RCVR PARITY: ' 07D0 20 58 4D 54 07D4 52 20 2D 20 07D8 52 43 56 52 07DC 20 50 41 52 07E0 49 54 59 3A 07E4 20 07E5 4E 4F 4E 45 PARITY: DB 'NONE',LF,CR,LF 07E9 0A 0D 0A 07EC 44 2D 2D 3E DB 'D--> DATA BITS PER CHAR: ' 07F0 20 44 41 54 07F4 41 20 42 49 07F8 54 53 20 50 MACRO-80 3.44 09-Dec-81 PAGE 1-13 07FC 45 52 20 43 0800 48 41 52 3A 0804 20 0805 38 0A 0D 0A BITS: DB '8',LF,CR,LF 0809 45 2D 2D 3E DB 'E--> BAUD RATE: ' 080D 20 42 41 55 0811 44 20 52 41 0815 54 45 3A 20 0819 31 32 30 30 BAUD: DB '1200 ',LF,CR,LF 081D 20 0A 0D 0A 0821 46 2D 2D 3E DB 'F--> FINISH (INSTALL ALL PARAMETERS AS SHOWN ON THE SCREEN)' 0825 20 46 49 4E 0829 49 53 48 20 082D 28 49 4E 53 0831 54 41 4C 4C 0835 20 41 4C 4C 0839 20 50 41 52 083D 41 4D 45 54 0841 45 52 53 20 0845 41 53 20 53 0849 48 4F 57 4E 084D 20 4F 4E 20 0851 54 48 45 20 0855 53 43 52 45 0859 45 4E 29 085C 0A 0D 0A DB LF,CR,LF 085F 50 4F 4B 45 DB "POKE SOME KEYS (A'S TO E'S), THEN JUST 'F' OFF" 0863 20 53 4F 4D 0867 45 20 4B 45 086B 59 53 20 28 086F 41 27 53 20 0873 54 4F 20 45 0877 27 53 29 2C 087B 20 54 48 45 087F 4E 20 4A 55 0883 53 54 20 27 0887 46 27 20 4F 088B 46 46 088D 20 28 4F 52 DB " (OR ESCape): " 0891 20 45 53 43 0895 61 70 65 29 0899 3A 20 20 089C 08 20 08 24 BSERAS: DB BS," ",BS,"$" ; 08A0 35 30 20 20 BAUDTXT:DB '50 ' 08A4 20 08A5 37 35 20 20 DB '75 ' 08A9 20 08AA 31 31 30 20 DB '110 ' 08AE 20 08AF 31 33 35 20 DB '135 ' 08B3 20 08B4 31 35 30 20 DB '150 ' 08B8 20 08B9 33 30 30 20 DB '300 ' 08BD 20 MACRO-80 3.44 09-Dec-81 PAGE 1-14 08BE 34 35 30 20 DB '450 ' 08C2 20 08C3 36 30 30 20 DB '600 ' 08C7 20 08C8 31 32 30 30 DB '1200 ' 08CC 20 08CD 31 38 30 30 DB '1800 ' 08D1 20 08D2 32 30 30 30 DB '2000 ' 08D6 20 08D7 32 34 30 30 DB '2400 ' 08DB 20 08DC 34 38 30 30 DB '4800 ' 08E0 20 08E1 37 32 30 30 DB '7200 ' 08E5 20 08E6 39 36 30 30 DB '9600 ' 08EA 20 08EB 31 34 34 30 DB '14400' 08EF 30 08F0 31 36 38 30 DB '16800' 08F4 30 08F5 31 39 32 30 DB '19200' 08F9 30 08FA 20 20 20 20 EXTRAB: DB ' ' ;EXTRA BAUD RATE TEXT 08FE 20 ; END MACRO-80 3.44 09-Dec-81 PAGE S Macros: Symbols: 048F ABORTD 0501 BADKEY 0819 BAUD 055F BAUDOK 055B BAUDS 08A0 BAUDTXT 0005 BDOS 0100 BEGIN 05C5 BIT6 05C8 BIT7 0805 BITS 048E BLANK 0000 BOOT 0008 BS 089C BSERAS 0080 BUFFER 064A BYEBYE 04EB BYPASS 05E9 CCONFIG 05D5 CDIVIS 001A CLR 06A5 CLS 0001 CONIN 05D8 CPORT 000D CR 05D1 CSELECT 054D DATOK 03F7 DIVIDE 066A DIVISOR 001B ESC 08FA EXTRAB 068E EXTRAD 05CB FACTOR 061B GOTNOE 03F3 GT9600 001E HOME 04F0 INPUT 04F5 KEYCHK 050D KEYOK 000A LF 0617 LOOPING 06A7 MENU 0493 MENUDRV 03BB NEXTNUM 0647 NOE 03D9 NONNUM 0411 NOROUND 0665 PARAMS 07E5 PARITY 05B4 PARITY0 0690 PARTXT 049B PRINT 0568 PROCESS 0009 PRTSTR 053A PTYOK 07A9 S1OR2 047B SB2 0482 SCAN 05CA SETBIT 044B SETP 051C SKIP1 052E SKIP2 0540 SKIP3 0553 SKIP4 0565 SKIP5 0395 START 05A2 STOP1 05A5 STOP2 0528 STOPOK 07C6 STOPS 069C STOPTXT 0583 TIMES16 0653 WHAT1 0655 WHAT2 065B WHAT3 065D WHAT4 065F WHAT5 No Fatal error(s)  047B SB2