10 ! CONVERT.BAS !========================================================================& ! PROGRAM NAME: CONVERT.BAS || REVISED & ! WRITTEN BY: THOMAS D. NORLING || AUTHORIZED BY: & ! DATE: 15-SEP-86 || DATE: & ! || & ! DEBUGGED BY: || REVISED BY: & ! DATE: || DATE: & ! || & ! CERTIFIED BY: || CERTIFIED BY: & ! DATE: || DATE: & ! || & ! REVISION: # 001 || REVISION: & !======================================================================== 20 ON ERROR GOTO 9000 25 REM ****************LABELS ROUTINE***************************** 26 CLS$ = ESC+"[H"+ESC+"[J" !CLEAR FROM TOP DOWN 27 L10$ = ESC+"[14H" !POSITION CURSOR ON LINE 10 28 NRM$ = ESC+"[m" !NORMAL VIDEO 29 CLL$ = ESC+"[K" !CLEAR FROM CURSOR TO EOL 30 HE$="0123456789ABCDEF" 31 LRG$ = ESC+"#6" !PRINT IN DOUBLE WIDTH CHAR'S. 32 L23$=ESC+"[23H" 52 INV$ = ESC+"[7m" !INVERSE VIDEO 54 NRM$ = ESC+"[m" !NORMAL VIDEO 56 CLS2$ = ESC+"[2H"+ESC+"[J" !CLEAR FROM LINE 2 DOWN 58 XYZZY$="BAD NUMBER PLEASE RE-ENTER" 60 TEMP$=STRING$(20-LEN(XYZZY$)/2,32)+XYZZY$ 62 TEMP2$=TEMP$+STRING$(40-LEN(TEMP$)+LEN(TEMP$),32) 64 MESAGE$=L23$+LRG$+INV$+TEMP2$+NRM$ 82 C2$ = "'"+STRING$(39,67) ! STATEMENTS 85 INSTID$="NUMBER-CONVERSION" 90 TEMP$=STRING$(20-LEN(INSTID$)/2,32)+INSTID$ 92 TEMP2$=TEMP$+STRING$(40-LEN(TEMP$)+LEN(TEMP$),32) 94 HEADER$=CLS$+LRG$+INV$+TEMP2$+NRM$ 99 PRINT HEADER$; 100 REM *********************************************************************** 101 PRINT CLS2$; 110 PRINT ESC;"[2H";LRG$;"$ # B "\PRINT 112 PRINT LRG$;"AND XOR OR" \ PRINT 114 PRINT LRG$;"ADD SUB " \ PRINT 115 PRINT LRG$;"INV = INVERT BITS ROL = ROTATE LEFT" \ PRINT 116 PRINT LRG$;"ROR = ROTATE RIGHT EX = EXIT" \ PRINT 130 PRINT LRG$;"INPUT NUMBER";CLL$; 140 INPUT A$ A$ = EDIT$(A$,162) 145 PRINT ESC;"[23H";LRG$;INV$;" ";NRM$; 150 B$=LEFT$(A$,1) 160 IF B$="$" THEN GOSUB 500 \ GOSUB 5000 \ GOTO 110 170 IF B$="#" THEN GOSUB 600 \ GOSUB 5000 \ GOTO 110 180 IF B$="B" THEN GOSUB 700 \ GOSUB 5000 \ GOTO 110 185 IF A$="EX" THEN GOSUB 10000 \ GOTO 110 186 IF A$="INV" THEN GOSUB 2200 \ GOSUB 5000 \ GOTO 110 187 IF A$="" THEN 110 188 IF A$="ROL" THEN GOSUB 2300 \ GOSUB 5000 \ GOTO 110 189 IF A$="ROR" THEN GOSUB 2400 \ GOSUB 5000 \ GOTO 110 190 IF LEFT$(A$,3)="AND" THEN GOSUB 2500 \ GOSUB 5000 \ GOTO 110 191 IF LEFT$(A$,3)="XOR" THEN GOSUB 2600 \ GOSUB 5000 \ GOTO 110 192 IF LEFT$(A$,2)="OR" THEN GOSUB 2700 \ GOSUB 5000 \ GOTO 110 193 IF LEFT$(A$,3)="ADD" THEN GOSUB 2800 \ GOSUB 5000 \ GOTO 110 194 IF LEFT$(A$,3)="SUB" THEN GOSUB 2900 \ GOSUB 5000 \ GOTO 110 200 GOSUB 800 \ GOSUB 5000 \ GOTO 110 500 REM ********************************************************************** 501 H$=RIGHT$(A$,2) 505 DE=0 510 FOR X=1 TO LEN(H$) 520 GOSUB 1000 530 DE=DE+2^((LEN(H$)-X)*4)*(N-1) 540 NEXT X 546 DES=DE \ DES$=STR$(DES) 550 GOSUB 2000 565 GOSUB 3000 566 DES=VAL(DES$) 570 RETURN 600 REM *********************************************************************** 610 OC$=RIGHT$(A$,2) 615 FOR N=1 TO LEN(OC$) \ IF VAL(MID$(OC$,N,1))>7 THEN 995 616 NEXT N 620 DE=0 630 FOR X=1 TO LEN(OC$) 640 DE=DE+VAL(MID$(OC$,X,1))*2^((LEN(OC$)-X)*3) 650 NEXT X 660 DES=DE \ DES$=STR$(DES) 670 GOSUB 2000 675 DES=VAL(DES$) 680 GOSUB 4000 682 DES=VAL(DES$) 685 RETURN 700 REM *********************************************************************** 710 BI$=RIGHT$(A$,2) 715 FOR N=1 TO LEN(BI$) \ IF VAL(MID$(BI$,N,1))>1 THEN 995 716 NEXT N 720 DE=0 730 FOR X=1 TO LEN(BI$) 740 DE=DE+VAL(MID$(BI$,LEN(BI$)-X+1,1))*2^(X-1) 750 NEXT X 760 DES=DE \ DES$=STR$(DES) 765 GOSUB 2055 770 GOSUB 3000 775 DES=VAL(DES$) 780 GOSUB 4000 784 DES=VAL(DES$) 785 RETURN 800 REM *********************************************************************** 805 IF LEFT$(A$,1)="-" THEN 900 810 DES$=A$ 820 DE=VAL(A$) 830 DES=DE 840 GOSUB 2000 850 GOSUB 3000 855 DES=VAL(DES$) 860 GOSUB 4000 862 DES=VAL(DES$) 865 RETURN 900 REM *********************************************************************** 910 COMP=VAL(A$) 915 IF COMP<-128 THEN 995 920 COMP=256+COMP \ A$=STR$(COMP) 925 GOTO 810 995 PRINT MESAGE$ 996 GOTO 110 1000 REM ********************************************************************** 1010 N=1 1020 IF MID$(H$,X,1)=MID$(HE$,N,1) THEN RETURN 1025 IF N>15 THEN 1040 1030 N=N+1 \ GOTO 1020 1040 GOTO 995 2000 REM *********************************************************************** 2001 BI$="" \ BX$="" 2010 N=DE/2 2020 IF N-INT(N)=.5 THEN BI$="1"+BI$ ELSE BI$="0"+BI$ 2030 DE=INT(N) 2040 IF DE=0 THEN 2055 2050 GOTO 2010 2055 IF LEN(BI$)>15 THEN 2060 2056 BI$="0"+BI$ \ GOTO 2055 2060 BI2$=BI$ 2061 BX$="" 2062 FOR N=LEN(BI$) TO 1 STEP -1 2070 IF N/4-INT(N/4)=0 THEN BX$=BX$+" " 2080 BX$=BX$+MID$(BI$,LEN(BI$)-N+1,1) 2090 NEXT N 2100 BI$=BX$ 2105 IF LEFT$(BI$,1)=" " THEN BI$=RIGHT$(BI$,2) 2110 RETURN 2200 REM *********************************************************************** 2210 BI$="" 2220 FOR N=1 TO LEN(BI2$) 2230 IF MID$(BI2$,N,1)="1" THEN BI$=BI$+"0" 2240 IF MID$(BI2$,N,1)="0" THEN BI$=BI$+"1" 2250 NEXT N 2255 BI2$=BI$ 2260 GOTO 715 2300 REM *********************************************************************** 2310 BI$="" 2320 BI$=RIGHT$(BI2$,2)+LEFT$(BI2$,1) 2330 GOTO 715 2400 REM *********************************************************************** 2410 BI$="" 2420 BI$=RIGHT$(BI2$,LEN(BI2$))+LEFT$(BI2$,LEN(BI2$)-1) 2430 GOTO 715 2500 REM ********************************************************************** 2505 BZ$=BI2$ 2510 A$=RIGHT$(A$,4) 2520 IF LEFT$(A$,1)="$" THEN GOSUB 500 \ GOTO 2555 2530 IF LEFT$(A$,1)="#" THEN GOSUB 600 \ GOTO 2555 2540 IF LEFT$(A$,1)="B" THEN GOSUB 700 \ GOTO 2555 2550 GOSUB 800 2555 BI$="" 2560 FOR N=1 TO 16 2565 IF MID$(BZ$,N,1)="1" AND MID$(BI2$,N,1)="1" THEN BI$=BI$+"1" \ GOTO 2575 2570 BI$=BI$+"0" 2575 NEXT N 2580 GOTO 715 2600 REM ********************************************************************** 2605 BZ$=BI2$ 2610 A$=RIGHT$(A$,4) 2620 IF LEFT$(A$,1)="$" THEN GOSUB 500 \ GOTO 2655 2630 IF LEFT$(A$,1)="#" THEN GOSUB 600 \ GOTO 2655 2640 IF LEFT$(A$,1)="B" THEN GOSUB 700 \ GOTO 2655 2650 GOSUB 800 2655 BI$="" 2660 FOR N=1 TO 16 2665 IF MID$(BZ$,N,1) = MID$(BI2$,N,1) THEN BI$=BI$+"1" \ GOTO 2675 2670 BI$=BI$+"0" 2675 NEXT N 2680 GOTO 715 2700 REM ********************************************************************** 2705 BZ$=BI2$ 2710 A$=RIGHT$(A$,3) 2720 IF LEFT$(A$,1)="$" THEN GOSUB 500 \ GOTO 2755 2730 IF LEFT$(A$,1)="#" THEN GOSUB 600 \ GOTO 2755 2740 IF LEFT$(A$,1)="B" THEN GOSUB 700 \ GOTO 2755 2750 GOSUB 800 2755 BI$="" 2760 FOR N=1 TO 16 2765 IF MID$(BZ$,N,1)="1" OR MID$(BI2$,N,1)="1" THEN BI$=BI$+"1" \ GOTO 2775 2770 BI$=BI$+"0" 2775 NEXT N 2780 GOTO 715 2800 REM ********************************************************************** 2805 DES2$=DES$ 2810 A$=RIGHT$(A$,4) 2820 IF LEFT$(A$,1)="$" THEN GOSUB 500 \ GOTO 2855 2830 IF LEFT$(A$,1)="#" THEN GOSUB 600 \ GOTO 2855 2840 IF LEFT$(A$,1)="B" THEN GOSUB 700 \ GOTO 2855 2850 GOSUB 800 2855 A$=STR$(DES+VAL(DES2$)) 2870 GOTO 800 2900 REM ********************************************************************** 2905 DES2$=DES$ 2910 A$=RIGHT$(A$,4) 2920 IF LEFT$(A$,1)="$" THEN GOSUB 500 \ GOTO 2955 2930 IF LEFT$(A$,1)="#" THEN GOSUB 600 \ GOTO 2955 2940 IF LEFT$(A$,1)="B" THEN GOSUB 700 \ GOTO 2955 2950 GOSUB 800 2955 A$=STR$(VAL(DES2$)-DES) 2970 GOTO 800 3000 REM *********************************************************************** 3001 OC$="" 3010 N=DES/8-INT(DES/8) 3020 OC$=STR$(N*8)+OC$ 3030 DES=INT(DES/8) 3040 IF DES=0 THEN RETURN 3050 GOTO 3010 4000 REM ********************************************************************** 4010 H$="" 4020 N=DES/16-INT(DES/16) 4030 H$=MID$(HE$,N*16+1,1)+H$ 4040 DES=INT(DES/16) 4050 IF DES=0 THEN RETURN 4060 GOTO 4020 5000 REM ********************************************************************** 5001 PRINT L10$;LRG$;"BINARY = ";BI$;CLL$ \ PRINT 5005 PRINT LRG$;"OCTAL = ";OC$;CLL$ \ PRINT 5010 PRINT ESC;"[18H";LRG$;"HEX = ";H$;CLL$; \ PRINT \ PRINT 5030 PRINT LRG$;"DECIMAL = ";DES$;CLL$\ PRINT 5035 IF LEN(BI$)>19 THEN 5050 5040 PRINT ESC;"[22H";LRG$;"HIGH BYTE = ";INT(VAL(DES$)/256);CLL$; 5045 PRINT ESC;"[22;25H";LRG$;"LOW BYTE = ";(VAL(DES$)/256-INT(VAL(DES$)/256))*256;CLL$; 5046 PRINT 5050 !IF LEN(H$)=2 AND VAL(DES$)>127 THEN GOTO 5070 5060 !RETURN 5070 IF (VAL(DES$)/256-INT(VAL(DES$)/256))*256 <128 THEN 5090 5075 PRINT ESC;"[20;25H";"2's-COMP = "; 5080 PRINT (VAL(DES$)/256-INT(VAL(DES$)/256))*256-256 5090 RETURN 9000 IF ERR=52 THEN RESUME 995 10000 PRINT ESC;"[23H";CLL$; 10010 END