💾 Archived View for gem.librehacker.com › gemlog › tech › 20221011-0.gmi captured on 2024-08-31 at 12:46:57. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-01-29)
-=-=-=-=-=-=-
I've been a bit distracted lately with my astronomy studies, but I have still been working with Mecrisp Stellaris Forth here and there. I asked in the #mecrisp IRC channel if anybody had a software implementation of the CRC32 checksum algorithm available for Mecrisp Stellaris. They told me no, but that it would be a great idea for me to make one and contribute it. So, I did.
The main appeal of CRC32 is that it is very simple to implement, especially if you store the polynomial lookup table in memory. Here are links to my code:
https://codeberg.org/infrared/mf-rp2040/src/commit/82ff68e023d84e563fa33c4b54ec329595fd492e/ARRAY.FS
https://codeberg.org/infrared/mf-rp2040/src/commit/82ff68e023d84e563fa33c4b54ec329595fd492e/CRC32.FS
ARRAY.FS is just a few helper words to make storing arrays of data look nicer. CRC32.FS is just the polynomial lookup table (256 32-bit values) and these two words:
\ ****************************************************************** \ PARAMETERS: \ W1: CURRENT CHECKSUM (32 BITS) \ C: NEXT BYTE OF INPUT DATA \ OUTPUT: \ W2: NEXT CHECKSUM \ ****************************************************************** : CRC32_STEP ( W1 C -- W2 ) OVER $FF AND XOR CELLS LOOKUP + @ SWAP 8 RSHIFT XOR ; \ ****************************************************************** \ PARAMETERS: \ U: NUMBER OF BYTES \ A: START ADDRESS OF DATA \ OUTPUT: \ W: CHECKSUM \ ****************************************************************** : CRC32 ( U A -- W ) $FFFFFFFF -ROT DUP ROT + SWAP DO I C@ CRC32_STEP LOOP $FFFFFFFF XOR ;
The first word is a helper word. CRC32 is the loop which takes a byte count and a starting memory address, and then outputs the checksum for the data in that memory area.
As a word of caution, the code just uses C@ to fetch each byte, so I'm not sure if that works for all use cases. More specifically, I don't know if all Stellaris targets support reading firmware with C@.