Code: Select all
Procedure.s Oct(number.q)
Protected s.s=Space(8*SizeOf(Character))
For a = 7 To 0 Step -1
PokeS(@s+a*SizeOf(Character),Str(number & 7),SizeOf(Character),#PB_String_NoZero)
number >> 3
Next
ProcedureReturn Trim(s,"0")
EndProcedure
;converts and assigns a variable with a constant in the given base 2,8,16
Macro _DEC(var,val,base)
EnableASM
CompilerSelect base
CompilerCase 2
mov var, val#b
CompilerCase 8
mov var, val#o
CompilerCase 16
mov var, 0#val#h
CompilerEndSelect
DisableASM
EndMacro
;take a string from respective bases 16,8,2 convert to decimal
Procedure.q ConvertToDecimal(*n.Character, base)
Protected d.u, r.q
Repeat
d = *n\c - 48
If d > 9
d | 32 : If d > 48 : d - 39 : EndIf
EndIf
If d >= base : Break : EndIf
r = (r * base) + d
*n + SizeOf(Character)
ForEver
ProcedureReturn r
EndProcedure
Define a.i
_DEC(a,10101,2)
Debug "Dec " + Str(a) + " Bin " + Bin(a)
_DEC(a,644,8)
Debug "Dec " + Str(a) + " Oct " + Oct(a)
_DEC(a,ABC123,16)
Debug "Dec " + Str(a) + " Hex " + Hex(a)
Debug ConvertToDecimal(@"ABC123",16)
Debug ConvertToDecimal(@"644",8)
Debug ConvertToDecimal(@"10101",2)