The anti-log table ($D000-$DFFF in Main Memory) contains data used to convert base-2 exponents into unsigned numbers. There is also a Log Table and a Sine Table.
The log and anti-log tables are useful for converting values between their number form and exponent form. When numbers are encoded into exponent form, simple math operations take on more complex effects. For example ‘add’ and ‘subtract’ become ‘multiply’ and ‘divide,’ ‘shift-left’ becomes ‘square’ and ‘shift-right’ becomes ‘square-root,’ and ‘divide by 3’ will produce ‘cube root.’ Once the exponent is converted back to a number, the result will be apparent. This process is imperfect, but quite fast.
For applications where many multiplies and divides must be performed in the absence of many additions and subtractions, exponential encoding can greatly speed things up. Exponential encoding is also useful for compressing numbers into fewer bits – sacrificing resolution at higher magnitude. In many applications, such as audio synthesis, the nature of signals is logarithmic in both frequency and magnitude. Processing such data in exponent form is quite natural and efficient, as it lends a ‘linear’ simplicity to what is actually logarithmic. The code examples given below use each tables’ samples verbatim. Higher resolution could be achieved by linearly interpolating between table samples, since the slope change is very slight from sample to sample. The cost, though, would be larger code and lower execution speed.
The anti-log table is comprised of 2,048 unsigned words which are each the lower 16-bits of a 17-bit mantissa (the 17th bit is implied and must be set separately). To use this table, shift the top 11 bits of the exponent fraction (bits 15..5) into bits 11..1 and isolate. Add $D000 for the anti-log table base. Read the word at that location into the result – this is the mantissa. Next, shift the mantissa left to bits 30..15 and set bit 31 – the missing 17th bit of the mantissa. The last step is to shift the result right by 31 minus the exponent integer in bits 20..16. The exponent is now converted to an unsigned number.
DAT ' Convert exponent to number ' ' on entry: exp holds 21-bit exponent with 5 integer bits and 16 fraction bits ' on exit: num holds 32-bit unsigned value ' expnum mov num,exp 'get exponent into number shr num,#15-11 'justify exponent fraction as word offset and num,table_mask 'isolate table offset bits or num,table_antilog 'add anti-log table address rdword num,num 'read mantissa word into number shl num,#15 'shift mantissa into bits 30..15 or num,num0 'set top bit (17th bit of mantissa) shr exp,#20-4 'shift exponent integer into bits 4..0 xor exp,#$1F 'inverse bits to get shift count shr num,exp 'shift number into final position expnum_ret ret '47..62 clocks '(variance is due to HUB sync on RDWORD) num0 long $80000000 '17th bit of the mantissa table_mask long $0FFE 'table offset mask table_antilog long $C000 'anti-log table base exp long 0 'input num long 0 'output
Propeller Help Version 1.1
Copyright © Parallax Inc.
5/13/2009