!**************************** AMUS Program Label ******************************
!* Filename: CVT.BAS                                         Date: 10/29/90
!* Category: UTIL         Hash Code:                      Version: 2.0(0)
!* Initials: HIS/LTD      Name: John Paiement
!* Company: Holidair Insurance Services, Ltd.       Telephone #: 6044124047
!* Related Files: CVT.PNT, CVT.HLP
!* Min. Op. Sys.:                               Expertise Level: BEG
!* Special: d/BASIC 1.1 required to compile and run this utility
!* Description: This revision of CVT.BAS is a full function calculator, with
!* memory functions.  Also, it now supports values entered as a PPN for
!* conversion.
!***************************************************************************
!* NOTE:   d/BASIC 1.1 required to compile & run this utility.  CVT.HLP file
!*               must go in the HLP: account
!*
!* Usage:  The numeric base to be input is selected from a bar.input
!*         so to enter a Hex number you would press 'H' then input the
!*         numeric value.  If the value of any input is greater than
!*         FFFFh, the RAD50 and BINARY values are not displayed.
!*
!*         The function keys around the keypad are how you select the
!*         Mathematical/logical operations for the calculator. Logical
!*         NOT will display the NOT(val entered) with no accumulation.
!*
!******************************************************************************

program CVT,2.0(0)

       map1 G1$,       S,30
       map1 G2$,       S,30
       map1 G1,  F
       map1 G2,  F
       map1 X,   F

function inkey$()
       return ucs(chr(getkey(not(.keypress))))
endfunc

function valinp(G1$)

       G2$ = "DHORBP" + chr(13) + chr(45) + chr(44) + "Q"+ chr(168) + chr(169) + chr(160) + chr(161) + chr(164) + chr(167) + chr(165) + chr(166) + chr(128) + chr(129) + chr(130) + chr(173)
       G1 = instr(1,G2$,G1$)

       G2 = G1 <> 0

       return G2

endfunc

       map1 FLT,                       F
       map1 OPT,                       F
       map1 DGT,                       F
       map1 OP'SAV,                    F
       map1 M'VAL,                     F
       map1 ACCUM,                     F

       map1 OP$,                       S,50, " addsubtmult div and or  not xor"
       map1 STR1NG,            S,25
       map1    REDRAW,         F,,     1

       map1 PLUS,              F,,     1
       map1 SUBT,              F,,     2
       map1 MULT,              F,,     3
       map1 DIVD,              F,,     4
       map1 L'AND,             F,,     5
       map1 L'OR,              F,,     6
       map1 L'NOT,             F,,     7
       map1 L'XOR,             F,,     8
       map1    MEM'ADD,                F,,  9
       map1    MEM'IN,         F,,  10
       map1    MEM'OUT,                F,,  11
       map1 H'LP,              F,,  12

       map1    OPER,           F,,     PLUS

       map1    NUM,                    F,,     6
       map1    DECIMAL,                F,,     1
       map1    HEXADEC,                F,,     2
       map1    OCTAL,                  F,,     3
       map1    R'D50,                  F,,     4
       map1    B1NARY,                 F,,     5
       map1 P'PN,              F,,     6
       map1 FINI,              F,,     7
       map1 CLR'MEM,   F,,     8
       map1 CLR'DSPLAY,        F,,     9
       map1 XIT,                       F,,     10
       map1 D'SPLAY,           F,,     20
       map1 ACCUMULATE,        F,,     30

       set funkey
       print tab(-1,0);tab(-1,29);
       load.mask "CVT" named "CVT"
       put.mask "CVT"

       switch OPT

               print tab(3,42);OP$[OPER*4-3,OPER*4];

               case ACCUMULATE
                       when OPER = MULT
                               ACCUM *= FLT
                       wend
                       when OPER = SUBT
                               ACCUM -= FLT
                       wend
                       when OPER = DIVD
                               ACCUM = ACCUM / FLT
                       wend
                       when OPER = PLUS
                               ACCUM += FLT
                       wend
                       when OPER = L'AND
                               ACCUM = ACCUM and FLT
                       wend
                       when OPER = L'OR
                               ACCUM = ACCUM or FLT
                       wend
                       when OPER = L'NOT
                               FLT = not(FLT)
                       wend
                       when OPER = L'XOR
                               ACCUM = ACCUM xor FLT
                       wend

                       OPT = D'SPLAY
                       again
               endcase

               case DECIMAL
                       FLT = val(STR1NG)
                       OPT = ACCUMULATE
                       again
               endcase

               case HEXADEC
                       FLT = cvthex(STR1NG)
                       OPT = ACCUMULATE
                       again
               endcase

               case OCTAL
                       FLT = cvtoct(STR1NG)
                       OPT = ACCUMULATE
                       again
               endcase

               case R'D50
                       FLT = 0

                       for X = 1 to 3

                               DGT = asc(STR1NG[X,X]) - 64
                               if DGT = -32 then DGT = 0
                               if DGT = -28 then DGT = 27
                               if DGT < 0 then DGT += 46
                               FLT += (DGT * (1600 * abs(X = 1))) + (DGT * (40 * abs(X = 2))) + (DGT * (abs(X = 3)))

                       next

                       if FLT > 65535 then FLT = 65535
                       OPT = ACCUMULATE
                       again
               endcase

               case B1NARY
                       FLT = cvtbin(STR1NG)
                       OPT = ACCUMULATE
                       again
               endcase

               case P'PN

                       X = instr(1,STR1NG,",")

                       when X = 0

                               print tab(24,1);chr(7);"Format your PPN enty as '[x,x]' please";
                               FLT = 0

                       else

                               if STR1NG[1,1] <> "[" then STR1NG = "[" + STR1NG : X += 1
                               if STR1NG[len(STR1NG),len(STR1NG)] <> "]" then STR1NG += "]"

                               FLT = cvtoct(STR1NG[2,X-1]) * 256
                               FLT += cvtoct( STR1NG[X+1, (len(STR1NG)-1)])

                       wend

                       OPT = D'SPLAY
                       again

               endcase

               case FINI
                       FLT = ACCUM
                       OPT = D'SPLAY
                       OPER = PLUS
                       again
               endcase

               case XIT
                       print tab(24,1);tab(-1,28);
                       break
               endcase

               case D'SPLAY
                       display.field #DECIMAL of "CVT" from FLT
                       display.field #HEXADEC of "CVT" from hex$(FLT)
                       display.field #OCTAL of "CVT" from oct$(FLT)

                       display.field #(DECIMAL+NUM) of "CVT" from M'VAL
                       display.field #(HEXADEC+NUM) of "CVT" from hex$(M'VAL)
                       display.field #(OCTAL+NUM) of "CVT" from oct$(M'VAL)

                       when FLT < 65536 and FLT >= 0

                               display.field #R'D50 of "CVT" from rad50$(FLT)
                               display.field #B1NARY of "CVT" from rjust$(bin$(FLT),16)
                               display.field #P'PN of "CVT" from "[" + oct$(int(FLT/256)) + "," + oct$(FLT - int(int(FLT/256) * 256)) + "]"

                       else

                               display.field #R'D50 of "CVT" from "---"
                               display.field #B1NARY of "CVT" from ""

                       wend

                       when M'VAL < 65536 and M'VAL >= 0

                               display.field #(R'D50+NUM) of "CVT" from rad50$(M'VAL)
                               display.field #(B1NARY+NUM) of "CVT" from rjust$(bin$(M'VAL),16)

                       else

                               display.field #(R'D50+NUM) of "CVT" from "---"
                               display.field #(B1NARY+NUM) of "CVT" from ""

                       wend

                       OPT = 0
                       again
               endcase

               case CLR'DSPLAY
                       ACCUM = 0
                       FLT = 0
                       OPER = PLUS
                       OPT = D'SPLAY
                       again
               endcase

               case CLR'MEM
                       M'VAL = 0
                       OPT = D'SPLAY
                       again
               endcase

               default case
                       STR1NG = ""

                       repeat

                               print tab(24,60);tab(-1,9);tab(-1,29);
                               STR1NG = inkey$()
                               print tab(24,60);tab(-1,9);tab(-1,29);

                       until valinp(STR1NG)

                       print tab(24,1);tab(-1,9);
                       OPT = G1

                       when OPT < 7

                               display.field #OPT of "CVT" from ""
                               accept.field #OPT of "CVT" into STR1NG

                       else

                               when ( OPT <> XIT and OPT <> CLR'DSPLAY )

                                       OP'SAV = OPER
                                       OPER = OPT - XIT

                                       when OPER = MEM'ADD
                                               OPER = OP'SAV
                                               M'VAL += FLT
                                               OPT = D'SPLAY
                                       wend

                                       when OPER = MEM'IN
                                               OPER = OP'SAV
                                               M'VAL = FLT
                                               OPT = D'SPLAY
                                       wend

                                       when OPER = MEM'OUT
                                               OPER = OP'SAV
                                               FLT = M'VAL
                                               OPT = ACCUMULATE
                                       wend

                                       when OPER = H'LP
                                               rundos "HELP CVT"
                                               print tab(-1,0);
                                               put.mask "CVT"
                                               OPT = D'SPLAY
                                               OPER = OP'SAV
                                       wend

                               wend

                       wend

                       again
               endcase

       endswitch

       reset funkey

END