Revision: 1802
Author: wattymage
Date: Mon Mar 15 10:56:08 2010
Log: initial alpha sample
http://code.google.com/p/jallib/source/detail?r=1802

Added:
 /trunk/catpad/math_mw.jal

=======================================
--- /dev/null
+++ /trunk/catpad/math_mw.jal   Mon Mar 15 10:56:08 2010
@@ -0,0 +1,594 @@
+-- Title: math_mw
+
+-- ----------------------------------------------------------------------
+-- Title: math.jal - Collection of mathematical functions.
+-- Authors: Rob Hamerling, Michael Watterson
+-- Copyright (c) 2009, all rights reserved.
+-- Adapted-by:
+-- Compiler: 2.4l
+--
+-- This file is part of jallib  (http://jallib.googlecode.com)
+-- Released under the ZLIB license (http://www.opensource.org/licenses/zlib-license.html)
+--
+-- Description:
+-- Collection of mathematical routines.
+--
+-- Sources: Several authors.
+--
+-- Notes:
+--
+
+-- --------------------------------------------------------
+-- Calculate the square root of an unsigned 16-bits integer
+-- Returns an 8-bits integer
+-- Original author: Kyle York
+-- --
+function sqrt16(word in x) return byte is
+   var word m, y
+
+   m = 0x4000
+   y = 0
+   while (m != 0) loop
+      var word b
+
+      b = y | m
+      y = y >> 1
+      if (x >= b) then
+         x = x - b
+         y = y | m
+      end if
+      m = m >> 2
+   end loop
+   return byte(y)
+end function
+
+
+-- --------------------------------------------------------
+-- Calculate the square root of an unsigned 32-bits integer
+-- Returns a 16-bits integer
+-- Original author: Kyle York
+-- --
+function sqrt32(dword in x) return word is
+   var dword m, y
+
+   m = 0x40000000
+   y = 0
+   while (m != 0) loop
+      var dword b
+
+      b = y | m
+      y = y >> 1
+      if (x >= b) then
+         x = x - b
+         y = y | m
+      end if
+      m = m >> 2
+   end loop
+   return word(y)
+end function
+
+-- Author: Michael Watterson
+
+function digitsWord(word in valu)return byte is
+var byte temp = 1
+var dword index = 9
+        while (dword(valu) > index) loop
+           index = index * 10 +9
+           temp = temp +1
+        end loop
+        return temp
+end function
+
+-- fixed point math is 8 bits for decimal in this library.
+--    approx two decimal paces, the part after "point" is 0 to 255
+--    sword fixed point numbers are thus -127.00 to +127.00 approx
+--    if you want bigger numbers replace all swords by sdwords and
+--         sdwords by sbyte*8 if the compiler can do the math still.
+function byteToFixed (byte in anInt) return sword is
+     return ((sword(anInt)) << 8)
+end function
+
+function truncFixed (sword in fixedPoint) return sbyte  is
+     return ( sbyte(fixedPoint >> 8))
+end function
+
+function roundFixed (sword in fixedPoint) return sbyte  is
+        if ((fixedPoint & 0x10) >0)  then    -- 128 and more = 0.5
+             return ( sbyte(fixedPoint >> 8) +1)
+        else
+             return ( sbyte(fixedPoint >> 8))
+        end  if
+end function
+
+-- unlike integer max is 128 * 128  *256 approx
+function multFixed (sword in a, sword in b) return sdword is
+     return ((sdword(a) * sdword(b)) >> 8) -- fix point
+end function
+
+function divFixed (sword in a, sword in b) return sword  is
+    return ( sword((sdword(a) * sdword (256)) / sdword(b)) >> 8)
+end function
+
+-- probably a better way to do this!
+function modFixed (sword in a, sword in b) return sword is
+ return ( a - sword(sdword(b)*((sdword(a) * sdword (256)) / sdword(b))
8))
+end function
+
+-- sin values scaled to (256 * 1.0) -1 for values above Zero
+-- (i.e. add one to lookup if using table directly for other than Zeroth Element)
+-- apart from zero, all values are 1 less than actual
+-- to allow storage in 1 byte each
+const byte SINLOOKUP[] = {0, 3, 8, 12, 17, 21, 26, 30, 35, 39, 43, 48, 52, 57, + 61, 65, 70, 74, 78, 82, 87, 91, 95, 99, 103, 107, 111, 115, 119, 123, 127, + 131, 135, 138, 142, 146, 149, 153, 157, 160, 164, 167, 170, 174, 177, 180, + 183, 186, 189, 192, 195, 198, 201, 203, 206, 209, 211, 214, 216, 218, 221, + 223, 225, 227, 229, 231, 233, 235, 236, 238, 240, 241, 242, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 253, 254, 254, 254, 255, 255, 255, 255 }
+-- 0 to 90 degrees in 1 degree steps
+
+-- 8bit resolution sin function R x Sin (angle) in degrees -32767 to +32767
+-- result can be same magnitude and opposite sign
+
+-- use to generate audio waves by changing angle at a fixed speed.
+-- if using all 360 degrees in one degree steps, then frequency is step rate / 360 +-- at nyquist frequency you only need 0 and 180 degrees, i.e. 1/2 sample rate. +-- if sample rate is 48kHz then for 12kHz you have only 4 samples, i.e. 90 degree steps
+-- at 1.2kHz thus you use 9 degree steps.
+-- 1 degree steps is thus  133.33  Hz if step speed is 48KHz
+-- PWM can be loaded via this lookup
+-- use 128 and add 127 to answer for 8 bit PWM
+-- use 512 and add 511 to answer for 10bit PWM
+-- if summing two frequencies, peak value is twice, so add as swords < 16383 and
+-- divide sum by 2!
+-- Author: Michael Watterson
+
+-- works with fixed point numbers 256 = 1.0
+function rSin8( sword in radius, sword in angle ) return sword is
+var sword yPos
+    --make sure works for ANY angle ...
+    While (angle < 0)   loop
+        angle = angle + 360
+    end Loop
+    While (angle >= 360)   loop
+        angle = angle - 360
+    end Loop
+    Case angle of
+    0:  yPos = 0
+    90: yPos = radius
+    180: yPos =0
+    270: yPos = -radius
+    otherwise
+        block
+ -- add or subtract one as lookups above zero have -1 so 256x 1.0
+            -- fits in one byte
+            If (angle > 0) & (angle < 90) Then
+                yPos = sword(SINLOOKUP[angle]) + 1
+             elsif (angle > 90) & (angle < 180) Then
+                angle = angle - 90
+                yPos = sword(SINLOOKUP[(90 - angle)]) + 1
+            elsif (angle > 180) & (angle < 270) Then
+                angle = angle - 180
+                yPos = -sword(SINLOOKUP[angle]) - 1
+            elsif (angle > 270) & (angle < 360) Then
+                angle = angle - 270
+                yPos = -sword(SINLOOKUP[(90 - angle)]) - 1
+            End If
+            yPos = yPos * radius / 256
+        end block
+    End case
+    return (yPos)
+end function
+
+-- Author: Michael Watterson
+function rCos8( sword in radius, sword in angle ) return sword is
+var sword xPos
+    --make sure works for ANY angle ...
+    While (angle < 0)   loop
+        angle = angle + 360
+    end Loop
+    While (angle >= 360)   loop
+        angle = angle - 360
+    end Loop
+    Case angle of
+    0:  xPos = radius
+    90: xPos = 0
+    180: xPos = -radius
+    270: xPos = 0
+    otherwise
+        block
+ -- add or subtract one as lookups above zero have -1 so 256x 1.0
+            -- fits in one byte
+            If (angle > 0) & (angle < 90) Then
+                xPos = sword(SINLOOKUP[(90 - angle)]) + 1
+             elsif (angle > 90) & (angle < 180) Then
+                angle = angle - 90
+                xPos = -sword(SINLOOKUP[angle]) - 1
+            elsif (angle > 180) & (angle < 270) Then
+                angle = angle - 180
+                xPos = -sword(SINLOOKUP[(90 - angle)]) - 1
+            elsif (angle > 270) & (angle < 360) Then
+                angle = angle - 270
+                xPos = sword(SINLOOKUP[angle]) + 1
+            End If
+            xPos = xPos * radius / 256
+        end block
+    End case
+    return (xPos)
+end function
+
+-- use to rotate angle of a line by calculating endpoints
+-- use to generate quadrature waves by changing angle at a fixed speed.
+-- if using all 360 degrees in one degree steps, then frequency is step rate / 360
+-- Author: Michael Watterson
+procedure PolarToCartesian(sword in radius, sword in angle, sword out xPos, sword out yPos) is
+    --make sure works for ANY angle ...
+    While (angle < 0)   loop
+        angle = angle + 360
+    end Loop
+    While (angle >= 360)   loop
+        angle = angle - 360
+    end Loop
+    Case angle of
+    0:
+         block
+         xPos = radius
+         yPos = 0
+         end block
+    90:
+       Block
+        xPos = 0
+        yPos = radius
+        end block
+    180:
+        block
+        xPos = -radius
+        yPos = 0
+        end block
+    270:
+         block
+         xPos = 0
+         yPos = -radius
+         end block
+    otherwise
+        block
+ -- add or subtract one as lookups above zero have -1 so 256 x 1.0
+            -- fits in one byte
+           If (angle > 0) & (angle < 90) Then
+                yPos = sword(SINLOOKUP[angle]) + 1
+                xPos = sword(SINLOOKUP[(90 - angle)]) + 1
+            elsif (angle > 90) & (angle < 180) Then
+                angle = angle - 90
+                xPos = -sword(SINLOOKUP[angle]) - 1
+                yPos = sword(SINLOOKUP[(90 - angle)]) + 1
+            elsif (angle > 180) & (angle < 270) Then
+                angle = angle - 180
+                xPos = -sword(SINLOOKUP[(90 - angle)]) - 1
+                yPos = -sword(SINLOOKUP[angle]) - 1
+            elsif (angle > 270) & (angle < 360) Then
+                angle = angle - 270
+                xPos = sword(SINLOOKUP[angle]) + 1
+                yPos = -sword(SINLOOKUP[(90 - angle)]) - 1
+            End If
+            xPos = xPos * radius / 256
+            yPos = yPos * radius / 256
+        end block
+    End case
+End procedure
+
+
+-- Random number  psuedo random number generators
+-- http://www.coyotegulch.com/products/libcoyotl/twisted_road/index.html
+-- wikipedia on both these:
+-- BlumBlumShub : good for crypographic stuff, not so good for MonteCarlo etc. +-- Mersenne Twister: not good for crypo. But good for MonteCarlo and other stuff
+--  it needs a 624 doubleword array though, 4 x 624 bytes!
+
+-- A simple version of the pretty poor rand generator of C and C++
+--  is a linear congruential generator
+-- a bit better than RANDU (wikipedia)
+var volatile  dword _lgr_next = 1    -- private!
+
+-- rand is our pseudo variable
+function  rand() return word is
+    _lgr_next = _lgr_next * 1103515245 + 12345
+    return (word((_lgr_next / 65536) % 32767))
+end function
+
+procedure rand_Seed(word in seed) is
+    _lgr_next = seed
+end procedure
+
+--/* A C-program for TT800 : July 8th 1996 Version */
+--/* by M. Matsumoto, email: [email protected] */
+--/* genrand() generate one pseudorandom number with double precision */
+--/* which is uniformly distributed on [0,1]-interval */
+--/* for each call.  One may choose any initial 25 seeds */
+-- /* except all zeros. */
+
+-- /* See: ACM Transactions on Modelling and Computer Simulation, */
+-- /* Vol. 4, No. 3, 1994, pages 254-266. */
+
+-- #include <stdio.h>
+-- #define N 25
+--- #define M 7
+-- block
+const N = 25
+const M = 7
+var sword k = 0
+var dword x[N]={ --/* initial 25 seeds, change as you wish */
+       0x95f24dab, 0x0b685215, 0xe76ccae7, 0xaf3ec239, 0x715fad23,
+       0x24a590ad, 0x69e4b5ef, 0xbf456141, 0x96bc1b7b, 0xa7bdf825,
+       0xc1de75b7, 0x8858a9c9, 0x2da87693, 0xb657f9dd, 0xffdc8a9f,
+       0x8121da71, 0x8b823ecb, 0x885d05f5, 0x4e20cd47, 0x5a9ad5d9,
+       0x512c0c03, 0xea857ccd, 0x4cc1d30f, 0x8891a8a1, 0xa6b7aadb
+    }
+var dword mag01[2]={
+        0x0, 0x8ebfd028 --/* this is magic vector `a', don't change */
+    }
+
+function genrand() return dword is       -- uses more RAM than rand()
+
+var dword y
+    if (k == N) then -- { /* generate N words at one time */
+      var sword kk = 0
+      while kk < (N - M)  loop --(kk=0;kk<N-M;kk++) {
+             x[kk] = x[kk+M] ^ (x[kk] >> 1) ^ mag01[x[kk] % 2]
+             kk = kk + 1
+      end loop
+      while kk < N loop --  (; kk<N;kk++) {
+             x[kk] = x[kk+(M-N)] ^ (x[kk] >> 1) ^ mag01[x[kk] % 2]
+             kk = kk + 1
+      end loop
+      k=0
+    end if
+    y = x[k];
+    y = y ^ (y << 7) & 0x2b5b2500; /* s and b, magic vectors */
+    y = y ^ (y << 15) & 0xdb8b0000; /* t and c, magic vectors */
+ y = y & 0xffffffff --; /* you may delete this line if word size = 32 */
+--/*
+--   the following line was added by Makoto Matsumoto in the 1996 version
+--   to improve lower bit's corellation.
+--   Delete this line to o use the code published in 1994.
+--*/
+--    y = y^(y >> 16)   -- /* added to the 1994 version */
+    k = k+ 1
+    return( y)
+end function
+--end block
+
+   -- http://en.wikipedia.org/wiki/Cyclic_redundancy_check
+   -- http://www.ross.net/crc/download/crc_v3.txt
+   -- lookup table for IEEE 802.3  32bit CRC
+ -- x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
+const byte CRC32_803_3[] = {
+ 0x00,0x00,0x00,0x00, 0x96,0x30,0x07,0x77, 0x2C,0x61,0x0E,0xEE, 0xBA,0x51,0x09,0x99, + 0x19,0xC4,0x6D,0x07, 0x8F,0xF4,0x6A,0x70, 0x35,0xA5,0x63,0xE9, 0xA3,0x95,0x64,0x9E, + 0x32,0x88,0xDB,0x0E, 0xA4,0xB8,0xDC,0x79, 0x1E,0xE9,0xD5,0xE0, 0x88,0xD9,0xD2,0x97, + 0x2B,0x4C,0xB6,0x09, 0xBD,0x7C,0xB1,0x7E, 0x07,0x2D,0xB8,0xE7, 0x91,0x1D,0xBF,0x90, + 0x64,0x10,0xB7,0x1D, 0xF2,0x20,0xB0,0x6A, 0x48,0x71,0xB9,0xF3, 0xDE,0x41,0xBE,0x84, + 0x7D,0xD4,0xDA,0x1A, 0xEB,0xE4,0xDD,0x6D, 0x51,0xB5,0xD4,0xF4, 0xC7,0x85,0xD3,0x83, + 0x56,0x98,0x6C,0x13, 0xC0,0xA8,0x6B,0x64, 0x7A,0xF9,0x62,0xFD, 0xEC,0xC9,0x65,0x8A, + 0x4F,0x5C,0x01,0x14, 0xD9,0x6C,0x06,0x63, 0x63,0x3D,0x0F,0xFA, 0xF5,0x0D,0x08,0x8D, + 0xC8,0x20,0x6E,0x3B, 0x5E,0x10,0x69,0x4C, 0xE4,0x41,0x60,0xD5, 0x72,0x71,0x67,0xA2, + 0xD1,0xE4,0x03,0x3C, 0x47,0xD4,0x04,0x4B, 0xFD,0x85,0x0D,0xD2, 0x6B,0xB5,0x0A,0xA5, + 0xFA,0xA8,0xB5,0x35, 0x6C,0x98,0xB2,0x42, 0xD6,0xC9,0xBB,0xDB, 0x40,0xF9,0xBC,0xAC, + 0xE3,0x6C,0xD8,0x32, 0x75,0x5C,0xDF,0x45, 0xCF,0x0D,0xD6,0xDC, 0x59,0x3D,0xD1,0xAB, + 0xAC,0x30,0xD9,0x26, 0x3A,0x00,0xDE,0x51, 0x80,0x51,0xD7,0xC8, 0x16,0x61,0xD0,0xBF, + 0xB5,0xF4,0xB4,0x21, 0x23,0xC4,0xB3,0x56, 0x99,0x95,0xBA,0xCF, 0x0F,0xA5,0xBD,0xB8, + 0x9E,0xB8,0x02,0x28, 0x08,0x88,0x05,0x5F, 0xB2,0xD9,0x0C,0xC6, 0x24,0xE9,0x0B,0xB1, + 0x87,0x7C,0x6F,0x2F, 0x11,0x4C,0x68,0x58, 0xAB,0x1D,0x61,0xC1, 0x3D,0x2D,0x66,0xB6, + 0x90,0x41,0xDC,0x76, 0x06,0x71,0xDB,0x01, 0xBC,0x20,0xD2,0x98, 0x2A,0x10,0xD5,0xEF, + 0x89,0x85,0xB1,0x71, 0x1F,0xB5,0xB6,0x06, 0xA5,0xE4,0xBF,0x9F, 0x33,0xD4,0xB8,0xE8, + 0xA2,0xC9,0x07,0x78, 0x34,0xF9,0x00,0x0F, 0x8E,0xA8,0x09,0x96, 0x18,0x98,0x0E,0xE1, + 0xBB,0x0D,0x6A,0x7F, 0x2D,0x3D,0x6D,0x08, 0x97,0x6C,0x64,0x91, 0x01,0x5C,0x63,0xE6, + 0xF4,0x51,0x6B,0x6B, 0x62,0x61,0x6C,0x1C, 0xD8,0x30,0x65,0x85, 0x4E,0x00,0x62,0xF2, + 0xED,0x95,0x06,0x6C, 0x7B,0xA5,0x01,0x1B, 0xC1,0xF4,0x08,0x82, 0x57,0xC4,0x0F,0xF5, + 0xC6,0xD9,0xB0,0x65, 0x50,0xE9,0xB7,0x12, 0xEA,0xB8,0xBE,0x8B, 0x7C,0x88,0xB9,0xFC, + 0xDF,0x1D,0xDD,0x62, 0x49,0x2D,0xDA,0x15, 0xF3,0x7C,0xD3,0x8C, 0x65,0x4C,0xD4,0xFB, + 0x58,0x61,0xB2,0x4D, 0xCE,0x51,0xB5,0x3A, 0x74,0x00,0xBC,0xA3, 0xE2,0x30,0xBB,0xD4, + 0x41,0xA5,0xDF,0x4A, 0xD7,0x95,0xD8,0x3D, 0x6D,0xC4,0xD1,0xA4, 0xFB,0xF4,0xD6,0xD3, + 0x6A,0xE9,0x69,0x43, 0xFC,0xD9,0x6E,0x34, 0x46,0x88,0x67,0xAD, 0xD0,0xB8,0x60,0xDA, + 0x73,0x2D,0x04,0x44, 0xE5,0x1D,0x03,0x33, 0x5F,0x4C,0x0A,0xAA, 0xC9,0x7C,0x0D,0xDD, + 0x3C,0x71,0x05,0x50, 0xAA,0x41,0x02,0x27, 0x10,0x10,0x0B,0xBE, 0x86,0x20,0x0C,0xC9, + 0x25,0xB5,0x68,0x57, 0xB3,0x85,0x6F,0x20, 0x09,0xD4,0x66,0xB9, 0x9F,0xE4,0x61,0xCE, + 0x0E,0xF9,0xDE,0x5E, 0x98,0xC9,0xD9,0x29, 0x22,0x98,0xD0,0xB0, 0xB4,0xA8,0xD7,0xC7, + 0x17,0x3D,0xB3,0x59, 0x81,0x0D,0xB4,0x2E, 0x3B,0x5C,0xBD,0xB7, 0xAD,0x6C,0xBA,0xC0, + 0x20,0x83,0xB8,0xED, 0xB6,0xB3,0xBF,0x9A, 0x0C,0xE2,0xB6,0x03, 0x9A,0xD2,0xB1,0x74, + 0x39,0x47,0xD5,0xEA, 0xAF,0x77,0xD2,0x9D, 0x15,0x26,0xDB,0x04, 0x83,0x16,0xDC,0x73, + 0x12,0x0B,0x63,0xE3, 0x84,0x3B,0x64,0x94, 0x3E,0x6A,0x6D,0x0D, 0xA8,0x5A,0x6A,0x7A, + 0x0B,0xCF,0x0E,0xE4, 0x9D,0xFF,0x09,0x93, 0x27,0xAE,0x00,0x0A, 0xB1,0x9E,0x07,0x7D, + 0x44,0x93,0x0F,0xF0, 0xD2,0xA3,0x08,0x87, 0x68,0xF2,0x01,0x1E, 0xFE,0xC2,0x06,0x69, + 0x5D,0x57,0x62,0xF7, 0xCB,0x67,0x65,0x80, 0x71,0x36,0x6C,0x19, 0xE7,0x06,0x6B,0x6E, + 0x76,0x1B,0xD4,0xFE, 0xE0,0x2B,0xD3,0x89, 0x5A,0x7A,0xDA,0x10, 0xCC,0x4A,0xDD,0x67, + 0x6F,0xDF,0xB9,0xF9, 0xF9,0xEF,0xBE,0x8E, 0x43,0xBE,0xB7,0x17, 0xD5,0x8E,0xB0,0x60, + 0xE8,0xA3,0xD6,0xD6, 0x7E,0x93,0xD1,0xA1, 0xC4,0xC2,0xD8,0x38, 0x52,0xF2,0xDF,0x4F, + 0xF1,0x67,0xBB,0xD1, 0x67,0x57,0xBC,0xA6, 0xDD,0x06,0xB5,0x3F, 0x4B,0x36,0xB2,0x48, + 0xDA,0x2B,0x0D,0xD8, 0x4C,0x1B,0x0A,0xAF, 0xF6,0x4A,0x03,0x36, 0x60,0x7A,0x04,0x41, + 0xC3,0xEF,0x60,0xDF, 0x55,0xDF,0x67,0xA8, 0xEF,0x8E,0x6E,0x31, 0x79,0xBE,0x69,0x46, + 0x8C,0xB3,0x61,0xCB, 0x1A,0x83,0x66,0xBC, 0xA0,0xD2,0x6F,0x25, 0x36,0xE2,0x68,0x52, + 0x95,0x77,0x0C,0xCC, 0x03,0x47,0x0B,0xBB, 0xB9,0x16,0x02,0x22, 0x2F,0x26,0x05,0x55, + 0xBE,0x3B,0xBA,0xC5, 0x28,0x0B,0xBD,0xB2, 0x92,0x5A,0xB4,0x2B, 0x04,0x6A,0xB3,0x5C, + 0xA7,0xFF,0xD7,0xC2, 0x31,0xCF,0xD0,0xB5, 0x8B,0x9E,0xD9,0x2C, 0x1D,0xAE,0xDE,0x5B, + 0xB0,0xC2,0x64,0x9B, 0x26,0xF2,0x63,0xEC, 0x9C,0xA3,0x6A,0x75, 0x0A,0x93,0x6D,0x02, + 0xA9,0x06,0x09,0x9C, 0x3F,0x36,0x0E,0xEB, 0x85,0x67,0x07,0x72, 0x13,0x57,0x00,0x05, + 0x82,0x4A,0xBF,0x95, 0x14,0x7A,0xB8,0xE2, 0xAE,0x2B,0xB1,0x7B, 0x38,0x1B,0xB6,0x0C, + 0x9B,0x8E,0xD2,0x92, 0x0D,0xBE,0xD5,0xE5, 0xB7,0xEF,0xDC,0x7C, 0x21,0xDF,0xDB,0x0B, + 0xD4,0xD2,0xD3,0x86, 0x42,0xE2,0xD4,0xF1, 0xF8,0xB3,0xDD,0x68, 0x6E,0x83,0xDA,0x1F, + 0xCD,0x16,0xBE,0x81, 0x5B,0x26,0xB9,0xF6, 0xE1,0x77,0xB0,0x6F, 0x77,0x47,0xB7,0x18, + 0xE6,0x5A,0x08,0x88, 0x70,0x6A,0x0F,0xFF, 0xCA,0x3B,0x06,0x66, 0x5C,0x0B,0x01,0x11, + 0xFF,0x9E,0x65,0x8F, 0x69,0xAE,0x62,0xF8, 0xD3,0xFF,0x6B,0x61, 0x45,0xCF,0x6C,0x16, + 0x78,0xE2,0x0A,0xA0, 0xEE,0xD2,0x0D,0xD7, 0x54,0x83,0x04,0x4E, 0xC2,0xB3,0x03,0x39, + 0x61,0x26,0x67,0xA7, 0xF7,0x16,0x60,0xD0, 0x4D,0x47,0x69,0x49, 0xDB,0x77,0x6E,0x3E, + 0x4A,0x6A,0xD1,0xAE, 0xDC,0x5A,0xD6,0xD9, 0x66,0x0B,0xDF,0x40, 0xF0,0x3B,0xD8,0x37, + 0x53,0xAE,0xBC,0xA9, 0xC5,0x9E,0xBB,0xDE, 0x7F,0xCF,0xB2,0x47, 0xE9,0xFF,0xB5,0x30, + 0x1C,0xF2,0xBD,0xBD, 0x8A,0xC2,0xBA,0xCA, 0x30,0x93,0xB3,0x53, 0xA6,0xA3,0xB4,0x24, + 0x05,0x36,0xD0,0xBA, 0x93,0x06,0xD7,0xCD, 0x29,0x57,0xDE,0x54, 0xBF,0x67,0xD9,0x23, + 0x2E,0x7A,0x66,0xB3, 0xB8,0x4A,0x61,0xC4, 0x02,0x1B,0x68,0x5D, 0x94,0x2B,0x6F,0x2A, + 0x37,0xBE,0x0B,0xB4, 0xA1,0x8E,0x0C,0xC3, 0x1B,0xDF,0x05,0x5A, 0x8D,0xEF,0x02,0x2D
+}
+-- or generate a new one
+
+-- From http://www.ross.net/crc/download/crc_v3.txt
+
+--Here is the specification for the CRC-32 algorithm which is reportedly
+--used in PKZip, AUTODIN II, Ethernet,  FDDI and PNG images
+--
+--   Name   : "CRC-32"
+--   Width  : 32
+--   Poly   : 04C11DB7    msbit first
+--   Init   : FFFFFFFF
+--   RefIn  : True
+--   RefOut : True
+--   XorOut : FFFFFFFF
+--   Check  : CBF43926
+--  Its polynomial can be written
+--  msbit-first as 0x04C11DB7, or lsbit-first as 0xEDB88320.
+-- There are really only two forms: normal and reflected. Normal
+-- shifts to the left and covers the case of algorithms with Refin=FALSE
+-- and Refot=FALSE. Reflected shifts to the right and covers algorithms
+-- with both those parameters true. (If you want one parameter true and
+-- the other false, you'll have to figure it out for yourself!) The
+-- polynomial is embedded in the lookup table (to be discussed). The
+-- other parameters, Init and XorOt can be coded as macros. Here is the
+-- 32-bit normal form (the 16-bit form is similar).
+--
+--   unsigned long crc_normal ();
+--   unsigned long crc_normal (blk_adr,blk_len)
+--   unsigned char *blk_adr;
+--   unsigned long  blk_len;
+--   {
+--    unsigned long crc = INIT;
+--    while (blk_len--)
+--       crc = crctable[((crc>>24) ^ *blk_adr++) & 0xFFL] ^ (crc << 8);
+--    return crc ^ XOROT;
+--   }
+--
+-- Here is the reflected form:
+--
+--   unsigned long crc_reflected ();
+--   unsigned long crc_reflected (blk_adr,blk_len)
+--   unsigned char *blk_adr;
+--   unsigned long  blk_len;
+--   {
+--    unsigned long crc = INIT_REFLECTED;
+--    while (blk_len--)
+--       crc = crctable[(crc ^ *blk_adr++) & 0xFFL] ^ (crc >> 8));
+--    return crc ^ XOROT;
+
+-- // Msbit-first
+-- rem = (rem leftShift 8) xor big_endian_table[(leftmost 8 bits of rem) rightShift (n-8)]
+--
+-- // Lsbit-first
+-- rem = (rem rightShift 8) xor little_endian_table[rightmost 8 bits of rem]
+
+-- not tested
+-- translated from "c" on http://www.eccpage.com/crc-32b.c
+-- CRC_POLY_32 is for pkzip Xmodem etc, other 32bit CRCs may use a different
+--  polynomial
+var byte crcTable_32[256]
+
+const dword CRC_POLY_32  = 0xEDB88320   -- lsbit-first
+
+procedure crcgen(dword in poly ) is
+var dword      crc
+var sword      i, j
+
+       -- should be poly = 0xEDB88320 allegedly
+       for 256 using i loop
+               crc = dword(i)
+               j = 8
+               for 8 loop
+                       if ((crc & 1) > 0) then
+                               crc = (crc >> 1) ^ poly
+                       else
+                               crc = crc >> 1
+                       end if
+                       j = j -1
+               end loop
+               crcTable_32[i] = byte(crc & 0xFF)
+       end loop
+end procedure
+
+-- not tested
+-- pass array of data and see what CRC should be, to compare on receive
+-- or append on transmitt
+function getcrc32(byte in datas[] )return  dword is
+var dword  crc
+var word indec
+       crc = 0xFFFFFFFF
+       for count(datas) using indec loop
+ crc = ((crc>>8) & 0x00FFFFFF) ^ dword(CRC32_803_3[ byte((crc^dword(datas[indec])) & 0xFF )])
+       end loop
+       return( crc^0xFFFFFFFF )
+end function
+
+
+
+procedure BCD4add (byte in out bcda[4], byte in incb[]) is
+
+var byte carry, hia, hib, index, loopCount
+    carry = 0
+    loopCount = byte(count(incb))
+    if loopCount > count(bcda) then
+       loopCount = count(bcda)
+    end if
+    index = 1
+    for loopCount loop
+         hia = bcda[index] >> 4
+         hib = incb[index] >> 4
+         bcda[index] = bcda[index] & 0xF
+         incb[index] = incb[index] & 0xF
+         carry = bcda[index] + incb[index] + carry
+         if (carry < 10) then
+            bcda[index] = carry
+         elsif carry > 19  then          -- up to 9 + 9 + 9 = 27
+            bcda[index] = carry -20
+         elsif carry > 9   then
+            bcda[index] = carry -10
+         end if
+         carry = carry - bcda[index]
+         -- now do high nibble
+         carry = hib + hia + carry
+         if carry < 10 then
+            hia = carry
+         elsif carry > 19  then           -- up to 9 + 9 + 9 = 27
+            hia = carry -20
+         elsif carry > 9   then
+            hia = carry -10
+         end if
+         carry =  carry - hia
+         -- now add in high nibble
+          bcda[index] =  bcda[index] + (hia << 4)
+          index = index+1
+    end loop
+    While (carry > 0 ) & (index < count(bcda)) loop
+        hia = bcda[index] >> 4
+        bcda[index] = bcda[index] & 0xF
+        carry = bcda[index]  + carry
+         if carry < 10 then
+            bcda[index] = carry
+         elsif carry > 19  then          -- up to 9 + 9 + 9 = 27
+            bcda[index] = carry -20
+         elsif carry > 9   then
+            bcda[index] = carry -10
+         end if
+         carry = carry - bcda[index]
+        -- now do high nibble
+         carry = hia + carry
+         if carry < 10 then
+            hia = carry
+         elsif carry > 19 then           -- up to 9 + 9 + 9 = 27
+            hia = carry -20
+         elsif carry > 9  then
+            hia = carry -10
+         end if
+         carry =  carry - hia
+         -- now add in high nibble
+         bcda[index] =  bcda[index] + (hia << 4)
+         index = index+1
+    end loop
+
+
+
+end procedure
+

--
You received this message because you are subscribed to the Google Groups 
"jallib" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/jallib?hl=en.

Reply via email to