day 5, pretty blinkenlights mem, awful performance

This commit is contained in:
2025-12-05 01:31:39 -06:00
parent 1be8a18ccb
commit fda2b0d523
2 changed files with 315 additions and 0 deletions

85
lib.h
View File

@@ -34,6 +34,7 @@ void exit_group(uint64_t code) {
#define str(s) #s
typedef uint64_t bcdint;
typedef uint64_t num;
static
void printns(size_t len, unsigned char chars[len]) {
@@ -81,6 +82,23 @@ void printd(unsigned long v) {
write(STDOUT_FILENO, p, count);
}
static
void snprintd(unsigned long v, size_t n, unsigned char d[n]) {
memset(d, 0, n);
if (!v) {
d[n-1] = '0';
return;
}
unsigned char *p = d+n;
unsigned count = 0;
while (v) {
p--;
*p = '0' + (v % 10);
v /= 10;
if (p == d) return;
}
}
static
void printh(unsigned long v) {
if (!v) {
@@ -103,6 +121,28 @@ void printh(unsigned long v) {
write(STDOUT_FILENO, p, count);
}
static
void snprinth(unsigned long v, size_t n, unsigned char d[n]) {
memset(d, 0, n);
if (!v) {
d[n-1] = '0';
return;
}
unsigned char *p = d+n;
unsigned count = 0;
while (v) {
p--;
if ((v & 0x0F) < 0xA) {
*p = '0' + (v & 0x0F);
} else {
*p = 'A' - 0xA + (v & 0x0F);
}
v >>= 4;
if (p == d) return;
}
while (p >= d) *p-- = 0;
}
static
void print_hex_char(unsigned char v) {
char buf[2];
@@ -169,3 +209,48 @@ static bcdint bcdadd(bcdint a, bcdint b) {
t2 = (t2 >> 2) | (t2 >> 3);
return t1 - t2;
}
// https://homepage.cs.uiowa.edu/~jones/bcd/bcd.html
static bcdint bcdcomp(bcdint a) {
bcdint t1, t2, t3, t4, t5, t6;
t1 = 0xFFFFFFFFFFFFFFFF - a;
t2 = - a;
t3 = t1 ^ 0x0000000000000001;
t4 = t2 ^ t3;
t5 = ~t4 & 0x1111111111111110;
t6 = (t5 >> 2) | (t5 >> 3);
return t2 - t6;
}
static bcdint bcdsub(bcdint a, bcdint b) {
return bcdadd(a, bcdcomp(b));
}
static num bcdtonum(bcdint a) {
return 0
+ ((a >> 0) & 0xF) * 1
+ ((a >> 4) & 0xF) * 10
+ ((a >> 8) & 0xF) * 100
+ ((a >> 12) & 0xF) * 1000
+ ((a >> 16) & 0xF) * 10000
+ ((a >> 24) & 0xF) * 100000
+ ((a >> 28) & 0xF) * 1000000
+ ((a >> 32) & 0xF) * 10000000
+ ((a >> 36) & 0xF) * 100000000
+ ((a >> 40) & 0xF) * 1000000000
+ ((a >> 44) & 0xF) * 10000000000
+ ((a >> 48) & 0xF) * 100000000000
+ ((a >> 52) & 0xF) * 1000000000000
+ ((a >> 56) & 0xF) * 10000000000000
+ ((a >> 60) & 0xF) * 100000000000000;
}
static bcdint numtobcd(num a) {
bcdint r = 0;
while (a) {
r <<= 4;
r |= (a % 10);
a /= 10;
}
return r;
}