100 REM Base Conversion Program 101 REM By Walid Maalouli 102 REM August 2004 103 PRINT "CTL +: B=BIN D=DEC H=HEX T=2's Comp F=FLT R=RDX C=CLR":PAUSE 110 N=0:N$="":BASE$="DEC":DIM BN$(16) 111 FOR C=1 TO 6:READ HX$(C):NEXT C 112 FOR C=0 TO 15:READ BN$(C):NEXT C 120 DISPLAY ERASE ALL,BASE$;": ";N 130 CALL KEY(K,S) 140 IF S=0 THEN 130 150 IF K=2 AND BASE$="DEC"THEN GOSUB 1500:GOTO 130 151 IF K=2 AND BASE$="HEX"THEN GOSUB 2500:GOTO 130 152 IF K=4 AND BASE$="HEX"THEN GOSUB 1000:GOTO 130 153 IF K=4 AND BASE$="BIN"THEN GOSUB 2000:GOTO 130 154 IF K=4 AND BASE$="FLT"THEN GOSUB 4500:GOTO 130 155 IF K=8 AND BASE$="DEC"THEN GOSUB 500:GOTO 130 160 IF K=8 AND BASE$="BIN"THEN GOSUB 3000:GOTO 130 161 IF K=6 AND BASE$="RDX"THEN DPFLAG=0:GOSUB 3500:GOTO 130 162 IF K=6 AND BASE$="DEC"THEN DPFLAG=0:GOSUB 5000:GOTO 130 163 IF K=18 AND BASE$="FLT"THEN GOSUB 4000:GOTO 130 164 IF K=3 AND BASE$="FLT"THEN DISPLAY AT(1),BASE$;": ";"0.0" ELSE 166 165 N=0:N$="":GOTO 130 166 IF K=3 THEN N$="":N=0:DISPLAY ERASE ALL,BASE$;": ";N:GOTO 130 167 IF K=20 AND (BASE$="HEX"OR BASE$="BIN")THEN GOSUB 5500:GOTO 130 170 IF BASE$="HEX"AND ((K<97 OR K>102)AND (K<48 OR K>57))THEN 130 175 IF BASE$="HEX"AND LEN(N$)=6 THEN 130 176 IF K=45 AND N$=""AND (BASE$="DEC"OR BASE$="FLT")THEN 210 180 IF BASE$="DEC"AND (K<48 OR K>57)THEN 130 190 IF BASE$="BIN"AND ((K<48 OR K>49)OR LEN(N$)=24)THEN 130 200 IF BASE$="FLT"AND (K<48 OR K>57)AND K<>46 THEN 130 201 IF BASE$="RDX"AND ((K<97 OR K>102)AND (K<48 OR K>57))THEN 130 202 IF BASE$="RDX"AND LEN(N$)>16 THEN 130 205 IF K=46 THEN IF DPFLAG=1 THEN 130 ELSE DPFLAG=1 210 N$=N$&CHR$(K) 211 IF N$="-"OR N$="."THEN 220 215 IF BASE$="DEC"THEN N=VAL(N$) 220 DISPLAY ERASE ALL,BASE$;": ";N$ 230 GOTO 130 490 DATA "A","B","C","D","E","F" 495 DATA "0000","0001","0010","0011","0100","0101","0110" 496 DATA "0111","1000","1001","1010","1011","1100","1101","1110","1111" 500 REM Dec to Hex Routine 501 FLAG=0 505 IF N$=""THEN BASE$="HEX":DISPLAY ERASE ALL,BASE$;": ";"0":RETURN 510 IF BASE$="HEX"THEN RETURN 520 IF BASE$="BIN"THEN GOSUB 2000 521 N1=N 525 IF ABS(N)>=16777216 THEN DISPLAY AT(1),"Overflow!":PAUSE ELSE 527 526 DISPLAY ERASE ALL,BASE$;": ";N$:RETURN 527 IF N<0 THEN NFLAG=1:N$=SEG$(N$,2,LEN(N$)-1) 530 RESTORE 900 540 IF N$=""THEN N=0 ELSE N=VAL(N$) 545 READ HB 546 N$="" 560 IF N>=HB THEN RETURN 570 FOR C=1 TO 6:READ HB 580 IF N70 THEN H$=CHR$(ASC(H$)-32) 1080 FOR I=1 TO 6 1090 IF HX$(I)=H$THEN D=I+9:GOTO 1100 ELSE NEXT I 1100 T=T+D*16^(LEN(N$)-C):NEXT C 1110 IF DNEG=1 THEN N=-T ELSE N=T 1120 N$=N1$&STR$(T):DNEG=0 1130 IF CFLAG=1 THEN 1140 ELSE BASE$="DEC":DISPLAY ERASE ALL,BASE$;": ";N$ 1140 RETURN 1500 REM Dec to Bin Routine 1505 IF N$=""THEN BASE$="BIN":DISPLAY ERASE ALL,BASE$;": ";"0":RETURN 1510 GOSUB 500:RETURN 2000 REM Bin to Dec Routine 2010 IF N$=""THEN BASE$="DEC":DISPLAY ERASE ALL,BASE$;": ";"0":RETURN 2020 CFLAG=1:GOSUB 3000:CFLAG=0:GOSUB 1000:RETURN 2500 REM Hex to Bin Routine 2501 IF N$=""THEN BASE$="BIN":DISPLAY ERASE ALL,BASE$;": ";"0":RETURN 2505 N1$="" 2510 FOR C=1 TO LEN(N$) 2520 HN$=SEG$(N$,C,1) 2530 IF ASC(HN$)<58 THEN HN=VAL(HN$):GOTO 2550 2540 IF ASC(HN$)<97 THEN HN=ASC(HN$)-55 ELSE HN=ASC(HN$)-87 2550 N1$=N1$&BN$(HN) 2560 NEXT C 2570 IF NFLAG=1 THEN NFLAG=0:GOTO 2585 2575 IF CFLAG=1 THEN N$=N1$:RETURN 2580 N$=N1$:BASE$="BIN":DISPLAY ERASE ALL,BASE$;": ";N$:RETURN 2585 N$="" 2590 FOR C=1 TO 24-LEN(N1$) 2600 N$=N$&"0":NEXT C 2610 N1$=N$&N1$:N$="" 2620 FOR C=1 TO LEN(N1$) 2720 B$=SEG$(N1$,C,1) 2730 IF B$="1"THEN B$="0" ELSE B$="1" 2740 N$=N$&B$ 2750 NEXT C 2760 IF B$="0"THEN N$=SEG$(N$,1,23)&"1":N1$=N$:GOTO 2820 2765 N1$="":CARRY=1 2770 FOR C=24 TO 1 STEP -1 2780 B$=SEG$(N$,C,1) 2790 IF B$="1"AND CARRY=1 THEN B$="0":GOTO 2810 2800 IF B$="0"AND CARRY=1 THEN B$="1":CARRY=0 2810 N1$=B$&N1$:NEXT C 2820 IF CFLAG=1 THEN N$=N1$:RETURN ELSE 2580 3000 REM BIN to HEX Routine 3001 IF N$=""THEN BASE$="HEX":DISPLAY ERASE ALL,BASE$;": ";"0":RETURN 3005 N1$="":IF LEN(N$)<24 THEN N$=RPT$("0",24-LEN(N$))&N$ 3010 FOR C=1 TO 24 STEP 4 3020 B$=SEG$(N$,C,4) 3030 FOR I=0 TO 15 3040 IF BN$(I)=B$THEN 3050 ELSE NEXT I 3050 IF I<10 THEN N1$=N1$&STR$(I) ELSE N1$=N1$&HX$(I-9) 3055 T$=N1$ 3060 NEXT C 3061 FOR C=1 TO 6:B$=SEG$(T$,C,1) 3062 IF B$="0"THEN N1$=SEG$(T$,C+1,6-C) ELSE 3065 3063 NEXT C 3065 N$=N1$:IF CFLAG=1 THEN RETURN 3070 BASE$="HEX":DISPLAY ERASE ALL,BASE$;": ";N$:RETURN 3500 REM RDX to FLT Routine 3505 N1$="":NEGRDX=0:FRACT$="" 3510 IF SEG$(N$,1,1)=">"THEN 3520 ELSE 3530 3520 FOR C=1 TO 22 STEP 3:N1$=N1$&SEG$(N$,C+1,2):NEXT C:N$=N1$ 3530 IF ASC(SEG$(N$,1,1))>57 THEN NFLAG=1:NEGRDX=1 3540 PREFIX$=SEG$(N$,1,4):N2$=N$:CFLAG=1 3550 IF NFLAG=1 THEN K=8:N$=PREFIX$:GOSUB 646:PREFIX$=SEG$(N$,3,4) 3560 N$=SEG$(PREFIX$,1,2):GOSUB 1000:MULT=VAL(N$) 3570 N$=SEG$(PREFIX$,3,2):GOSUB 1000:INTEG$=N$ 3580 FOR X=5 TO 15 STEP 2:N$=SEG$(N2$,X,2):GOSUB 1000:FRACT$=FRACT$&N$:NEXT X 3590 N=VAL(INTEG$&"."&FRACT$)*(100^(MULT-64)):CFLAG=0 3595 N$=STR$(N):IF SEG$(N$,1,1)="."THEN N$="0"&N$ 3600 IF NEGRDX=1 THEN N=-1*N:N$="-"&N$ 3610 BASE$="FLT":DISPLAY ERASE ALL,BASE$;": ";N$:RETURN 4000 REM FLT to RDX Routine 4005 NEGFLT=0 4010 IF N$=""THEN BASE$="RDX":DISPLAY AT(1),BASE$;": ";RPT$(">00",8):RETURN 4020 IF SEG$(N$,1,1)="."THEN N$="0"&SEG$(N$,1,LEN(N$)-1) 4025 N1=VAL(N$) 4030 IF SEG$(N$,1,1)="-"THEN NEGFLT=1:N$=SEG$(N$,2,LEN(N$)-1) 4040 IF LEN(N$)>15 THEN 4050 ELSE 4070 4050 DISPLAY AT(1),"Overflow!":PAUSE:DISPLAY ERASE ALL,BASE$;": ";N$ 4055 RETURN 4070 P=0:N1$="":ZFLAG=0:P1=POS(N$,".",1):IF P1=0 THEN 4075 ELSE 4079 4075 DISPLAY AT(1),"Not a float number!":PAUSE 4076 DISPLAY ERASE ALL,BASE$;": ";N$:RETURN 4079 IF LEN(N$)<15 THEN N$=N$&RPT$("0",15-LEN(N$)) 4080 IF SEG$(N$,1,1)="0"THEN C=3:ZFLAG=1:P=P-1:GOTO 4090 ELSE 4100 4090 IF SEG$(N$,C,1)="0"THEN P=P-1:C=C+1:GOTO 4090 ELSE 4110 4100 IF SEG$(N$,2,1)<>"."AND P1<>3 THEN P=P1-2 ELSE P=0 4110 IF INT(P/2)<>P/2 THEN P=P-1 4120 D=P/2:R$=STR$(64+D) 4130 N2$=N$:N$=R$:CFLAG=1:GOSUB 500:N1$=N$:N$=N2$ 4135 IF ZFLAG=1 THEN P2=P1-P ELSE P2=P1-P-1 4140 N$=SEG$(N$,1,P1-1)&SEG$(N$,P1+1,LEN(N$)-P1):N2$=N$ 4145 IF P1"&SEG$(N1$,4,2) 4200 FOR L=P2+1 TO 14 STEP 2 4205 IF L>=14 THEN 4225 4210 R$=SEG$(N2$,L,2):N$=R$:IF R$="00"THEN 4220 ELSE GOSUB 500 4220 N1$=N1$&">"&N$:N$=N2$ 4225 NEXT L 4226 N=N1 4227 N$=N1$:IF LEN(N$)<24 THEN N$=N$&">00" 4230 CFLAG=0:BASE$="RDX":DISPLAY ERASE ALL,BASE$;": ";N$:RETURN 4500 REM FLT to DEC Routine 4510 IF N$=""THEN BASE$="DEC":DISPLAY ERASE ALL,BASE$;": ";"0":RETURN 4520 N=VAL(N$):N$=STR$(INT(N)) 4530 BASE$="DEC":DISPLAY ERASE ALL,BASE$;": ";N$:RETURN 5000 REM DEC to FLT Routine 5010 IF N$=""THEN BASE$="FLT":DISPLAY ERASE ALL,BASE$;": ";"0.0":RETURN 5020 IF LEN(N$)>12 THEN 4050 5030 N$=N$&".0":N=VAL(N$):BASE$="FLT" 5040 DISPLAY ERASE ALL,BASE$;": ";N$:RETURN 5500 REM Two's Complement Routine 5510 IF BASE$="BIN"THEN NFLAG=1:N1$=N$:GOSUB 2570:RETURN 5520 NFLAG=1:CFLAG=1:GOSUB 2500:CFLAG=0:GOSUB 3000:RETURN