00010000 PROC 0 ARG() DEBUG X0(0) X1(1) X2(2) X3(3) X4(4) X5(5) X6(6) X7(7) X8(8) X9(9) XA(10) XB(11) XC(12) XD(13) XE(14) XF(15) VAL() HEX 00020000 IF &DEBUG = DEBUG THEN CONTROL LIST CONLIST SYMLIST 00030000 IF &STR(&ARG) ^= THEN DO 00040000 WRITE &EVAL(&ARG) 00050000 EXIT CODE(0) 00060000 END 00070000 ERROR GOTO NASTY 00080000 LOOP: - 00081000 IF &HEX = THEN SET MODE = DECIMAL 00082000 ELSE SET MODE = HEX 00090000 WRITENR &MODE ARG: 00100000 READ 00110000 IF &STR(&SYSDVAL) = ? THEN DO 00120000 WRITE ENTER AN AN ALGEBRAIC EXPRESSION, USING DECIMAL INTEGERS AND +, -, * AND / 00130000 WRITE START YOUR EXPRESSION WITH +, -, * OR / TO ACCUMULATE RESULTS. 00140000 WRITE ENTER THE WORD 'HEX' TO ENTER 'HEX' MODE 00150000 WRITE ENTER THE WORD 'DECIMAL' TO ENTER 'DECIMAL' MODE 00160000 WRITE JUST HIT THE 'ENTER' KEY TO END THE PROGRAM 00170000 WRITE WARNING: IN 'HEX' MODE, YOU MUST ACCUMULATE ONE OPERATION AT A TIME. 00180000 GOTO LOOP 00190000 END 00200000 SET OP = 00210000 IF &LENGTH(&STR(&SYSDVAL)) = 0 THEN EXIT CODE(0) 00220000 IF &STR(&SYSDVAL) = HEX THEN DO 00230000 SET HEX = HEX 00240000 GOTO LOOP 00250000 END 00260000 IF &STR(&SYSDVAL) = DECIMAL THEN DO 00270000 SET HEX = 00280000 GOTO LOOP 00290000 END 00300000 IF &LENGTH(&STR(&SYSDVAL)) > 1 THEN DO 00310000 SET OP = &SUBSTR(1,&SYSDVAL) 00320000 SET SYSDVAL = &SUBSTR(2:&LENGTH(&STR(&SYSDVAL)),&SYSDVAL) 00330000 END 00331000 IF &HEX = THEN DO 00340000 IF &STR(&OP) = &STR(+) OR &STR(&OP) = &STR(-) THEN SET ARG = &STR(&ARG.&OP.&SYSDVAL) 00350000 ELSE IF &STR(&OP) = &STR(*) OR &STR(&OP) = &STR(/) THEN SET ARG = &STR((&ARG.)&OP.&SYSDVAL) 00360000 ELSE DO 00370000 SET SYSDVAL = &STR(&OP.&SYSDVAL) 00380000 SET ARG = &STR(&SYSDVAL) 00390000 SET VAL = 00400000 SET OP = 00410000 END 00411000 END 00412000 ELSE DO 00413000 IF &STR(&OP) = &STR(+) OR &STR(&OP) = &STR(-) THEN SET ARG = &STR(&ARG.&OP.X'&SYSDVAL') 00414000 ELSE IF &STR(&OP) = &STR(*) OR &STR(&OP) = &STR(/) THEN SET ARG = &STR((&ARG.)&OP.X'&SYSDVAL') 00415000 ELSE DO 00416000 SET SYSDVAL = &STR(&OP.&SYSDVAL) 00417000 SET ARG = &STR(X'&SYSDVAL') 00418000 SET VAL = 00419000 SET OP = 00419100 END 00419200 END 00420000 IF &HEX = HEX THEN DO 00430000 IF &LENGTH(&STR(&SYSDVAL)) < 8 THEN SET SYSDVAL = &SUBSTR(&LENGTH(&STR(&SYSDVAL)):7,0000000)&SYSDVAL 00440000 SET X = &SUBSTR(1,&SYSDVAL) 00450000 IF &X > 7 OR &X < 0 THEN DO 00460000 SET A = &EVAL(-2147483647) 00470000 SET B = &STR(&&X)&SUBSTR(1,&SYSDVAL) 00480000 SET B = &B - 8 00490000 SET A = &A + &B * 268435456 00491000 SET C = -1 00500000 END 00510000 ELSE DO 00530000 SET B = &STR(&&X)&SUBSTR(1,&SYSDVAL) 00540000 SET A = &B * 268435456 00541000 SET C = 0 00550000 END 00560000 SET B = &STR(&&X)&SUBSTR(2,&SYSDVAL) 00570000 SET A = &A + &B * 16777216 00580000 SET B = &STR(&&X)&SUBSTR(3,&SYSDVAL) 00590000 SET A = &A + &B * 1048576 00600000 SET B = &STR(&&X)&SUBSTR(4,&SYSDVAL) 00610000 SET A = &A + &B * 65536 00620000 SET B = &STR(&&X)&SUBSTR(5,&SYSDVAL) 00630000 SET A = &A + &B * 4096 00640000 SET B = &STR(&&X)&SUBSTR(6,&SYSDVAL) 00650000 SET A = &A + &B * 256 00660000 SET B = &STR(&&X)&SUBSTR(7,&SYSDVAL) 00670000 SET A = &A + &B * 16 00680000 SET B = &STR(&&X)&SUBSTR(8,&SYSDVAL) 00690000 SET A = &A + &B + &C 00700000 SET SYSDVAL = &A 00710000 END 00720000 SET VAL = &EVAL(&VAL &OP &SYSDVAL) 00770000 SET A = &VAL 00780000 IF &A < 0 THEN DO 00790000 SET A = &A + 2147483647 00800000 SET A = &A + 1 00810000 SET B = &A 00820000 SET A = &A / 268435456 00830000 SET B = &B - &A * 268435456 00840000 SET HSTR = &SUBSTR(&A+1,89ABCDEF) 00850000 END 00860000 ELSE DO 00870000 SET B = &A 00880000 SET A = &A / 268435456 00890000 SET B = &B - &A * 268435456 00900000 SET HSTR = &SUBSTR(&A+1,01234567) 00910000 END 00920000 SET A = &B 00930000 SET B = &B / 16777216 00940000 SET A = &A - &B * 16777216 00950000 SET HSTR = &HSTR.&SUBSTR(&B+1,0123456789ABCDEF) 00960000 SET B = &A 00970000 SET A = &A / 1048576 00980000 SET B = &B - &A * 1048576 00990000 SET HSTR = &HSTR.&SUBSTR(&A+1,0123456789ABCDEF) 01000000 SET A = &B 01010000 SET B = &B / 65536 01020000 SET A = &A - &B * 65536 01030000 SET HSTR = &HSTR.&SUBSTR(&B+1,0123456789ABCDEF) 01040000 SET B = &A 01050000 SET A = &A / 4096 01060000 SET B = &B - &A * 4096 01070000 SET HSTR = &HSTR.&SUBSTR(&A+1,0123456789ABCDEF) 01080000 SET A = &B 01090000 SET B = &B / 256 01100000 SET A = &A - &B * 256 01110000 SET HSTR = &HSTR.&SUBSTR(&B+1,0123456789ABCDEF) 01120000 SET B = &A 01130000 SET A = &A / 16 01140000 SET B = &B - &A * 16 01150000 SET HSTR = &HSTR.&SUBSTR(&A+1,0123456789ABCDEF) 01160000 SET HSTR = &HSTR.&SUBSTR(&B+1,0123456789ABCDEF) 01170000 WRITE &STR(&ARG) = &VAL = X'&HSTR' 01180000 GOTO LOOP 01190000 NASTY: - 01200000 WRITE &STR(&ARG) CAN NOT BE EVALUATED. ENTER A QUESTION MARK FOR HELP. 01210000 SET ARG = 01220000 SET VAL = 01230000 GOTO LOOP