mirror of
https://github.com/irmen/prog8.git
synced 2026-04-20 11:17:01 +00:00
73 lines
1.4 KiB
Lua
73 lines
1.4 KiB
Lua
%import textio
|
|
%import ciatimer
|
|
|
|
; note: Prog8 has a complete CRC32 routine in its library: math.crc32
|
|
|
|
|
|
main {
|
|
sub start() {
|
|
txt.lowercase()
|
|
cia.calibrate()
|
|
test.benchmark_name()
|
|
test.benchmark()
|
|
void test.benchmark_check()
|
|
cia.print_time()
|
|
repeat {}
|
|
}
|
|
}
|
|
|
|
test {
|
|
|
|
const long EXPECTED = $e1fa84c6
|
|
long crc_result
|
|
|
|
sub benchmark_name()
|
|
{
|
|
txt.print("crc32.p8\n")
|
|
txt.print("Calculates the CRC32 of the C64 Kernal\n")
|
|
}
|
|
|
|
sub benchmark()
|
|
{
|
|
crc_result = CRC32($e000, $2000)
|
|
}
|
|
|
|
sub benchmark_check() -> bool
|
|
{
|
|
txt.print("CRC=")
|
|
txt.print_ulhex(crc_result, true)
|
|
|
|
if crc_result == EXPECTED
|
|
{
|
|
txt.print(" [OK]\n")
|
|
return false
|
|
}
|
|
|
|
txt.print(" [FAIL] - expected ")
|
|
txt.print_ulhex(EXPECTED, true)
|
|
txt.nl()
|
|
return true
|
|
}
|
|
|
|
sub CRC32(^^ubyte data, uword length) -> long {
|
|
; CRC-32/CKSUM
|
|
long crc
|
|
|
|
repeat length
|
|
{
|
|
crc ^= (@(data) as long)<<24 ; currently there's no easy way to affect only the MSB of the variable
|
|
|
|
repeat 8
|
|
{
|
|
crc <<=1
|
|
if_cs
|
|
crc ^= $04c11db7
|
|
}
|
|
data++
|
|
}
|
|
crc ^= $ffffffff
|
|
return crc
|
|
}
|
|
|
|
}
|