1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-08-08 13:25:12 +00:00
Files
kickc/src/test/kc/sieve.c
2021-02-04 09:18:27 +01:00

63 lines
1.5 KiB
C

#include <string.h>
#include <c64-time.h>
#include <stdint.h>
#include <division.h>
#include <c64.h>
#include <c64-print.h>
char* const SCREEN = 0x0400;
const uint16_t COUNT = 16384; /* Up to what number? */
const uint8_t SQRT_COUNT = 128; /* Sqrt of COUNT */
uint8_t* sieve = 0x1000;
void main (void) {
//Show lower case font
*D018 = toD018(SCREEN, 0x1800);
print_cls();
print_str("Sieve benchmark - calculating primes");
print_ln();
print_str("between 2 and ");
print_uint_decimal(COUNT);
print_ln();
// Fill sieve with zeros
memset(sieve, 0, COUNT);
clock_start();
unsigned int i = 2;
char* sieve_i = &sieve[i];
while (i < SQRT_COUNT) {
if (!*sieve_i) {
/* Prime number - mark all multiples */
unsigned int j = i*2;
unsigned char* s = &sieve[j];
while (j < COUNT) {
*s = 1;
s += i;
j += i;
}
}
i++;
sieve_i++;
}
clock_t cyclecount = clock()-CLOCKS_PER_INIT;
unsigned int sec100s = (unsigned int)div32u16u(cyclecount, (unsigned int)(CLOCKS_PER_SEC/100));
print_str("100ths seconds used: ");
print_uint_decimal(sec100s);
print_str(" cycles: ");
print_ulong_decimal(cyclecount);
print_ln();
for (i = 2; i < 1300; ++i)
if (!sieve[i]) {
print_uint_decimal(i);
print_char(' ');
}
print_str("...");
while(true) { (*(SCREEN+999))++; }
}