code:
break on
cls
dim $c[100]
dim $ans
;
; Big Hex2Dec Converter
;
; Version 1.1
;
; by cj
;
$hex=@address
gosub HEXCALC
"0x" $hex " = " $ans ?
;---------------------------------------------------------------------police line, do not cross----------
quit
:HEXCALC
;
; Inputs:
; $hex = string that contains a hexadecimal number
;
; Outputs:
; $ans = string that contains the decimal version of $hex
;
if len($hex)/2<len($hex)-len($hex)/2
$hex="0"+$hex ; add leading 0 if required
endif
if len($hex)<9 ; KiX can do this calc without help
$ans=val("&"+$hex)
"KiX can do this without any help from me..." ? return
endif
if len($hex)>12 ; too big for this script at this time...but maybe later
"$$hex too long, max length=12 at the moment..." ?
quit quit
endif
$num=val("&"+substr($hex, 1, len($hex)-6)) $num1="$num" $num2="16777216"
gosub multiply
$num1=$ans $num=val("&"+substr($hex, len($hex)-5, 6)) $num2="$num"
gosub add
return
:MULTIPLY
;
; Inputs:
; $num1, $num2 = strings that contain numbers
;
; Outputs:
; $ans = string that contains $num1 multiplied by $num2
;
$ans="" $s=0 $b=0
do
$n=$s $a=0
do
;; val(substr($num2, len($num2)-$b, 1)) " * " val(substr($num1, len($num1)-$a, 1)) " : " $n ?
$c[$n]=$c[$n]+val(substr($num2, len($num2)-$b, 1)) * val(substr($num1, len($num1)-$a, 1))
$a=$a+1
$n=$n+1
until $a=len($num1)
$s=$s+1 $b=$b+1
until $b=len($num2)
$s=$n ; stopping point for next loop
;; $n=0 do "$$c[" $n "] = " $c[$n] ? $n=$n+1 until $n=$s
$n=0
do
if $c[$n]>9
$h=$c[$n] $h="$h"
;; $h ?
$c[$n+1]=$c[$n+1]+val(substr($h, 1, len($h)-1))
$c[$n]=val(substr($h, len($h), 1))
endif
$n=$n+1
until $n=$s
$n=$s-1 do $ans=$ans+$c[$n] $c[$n]=0 $n=$n-1 until $n=-1
return
:ADD
;
; Inputs:
; $num1, $num2 = strings that contain numbers
;
; Outputs:
; $ans = string that contains $num1 added to $num2
;
while len($num1)>len($num2) $num2="0" + $num2 loop ; add leading zeros to smallest number
while len($num2)>len($num1) $num1="0" + $num1 loop
$ans=""
$s=len($num1)
$n=0 do $c[$n]=val(substr($num2, len($num2)-$n, 1)) + val(substr($num1, len($num1)-$n, 1)) $n=$n+1 until $n=$s
$n=0 do if $c[$n]>9 $h=$c[$n] $h="$h" $c[$n+1]=$c[$n+1]+val(substr($h, 1, len($h)-1)) $c[$n]=val(substr($h, len($h), 1)) endif $n=$n+1 until $n=$s
$n=$s-1 do $ans=$ans+$c[$n] $c[$n]=0 $n=$n-1 until $n=-1
return
Note that the :ADD and :MULTIPLY subs can handle very large numbers.
I can post more info on them , but a quick glance at Rogers code shows that it's prob the same.