Data update

This commit is contained in:
Ingy döt Net 2026-04-30 12:34:36 -04:00
parent 4bb20c9b71
commit cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions

View file

@ -0,0 +1,166 @@
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
#define EXECUTE(...) \
execute((uint8_t[]){ __VA_ARGS__ }, sizeof((uint8_t[]){ __VA_ARGS__ }))
#define NOP 0b000'00000
#define LDA 0b001'00000 |
#define STA 0b010'00000 |
#define ADD 0b011'00000 |
#define SUB 0b100'00000 |
#define BRZ 0b101'00000 |
#define JMP 0b110'00000 |
#define STP 0b111'00000
static uint8_t execute(uint8_t program[], size_t sizeof_program) {
uint8_t mem[32];
memcpy(mem, program, sizeof_program * sizeof(*program));
for(uint8_t acc, pc = 0;; pc &= 0x1f) {
uint8_t oc = mem[pc++];
uint8_t op = oc >> 5;
uint8_t oa = oc & 0x1f;
switch(op) {
case 0b000:
continue;
case 0b001:
acc = mem[oa];
continue;
case 0b010:
mem[oa] = acc;
continue;
case 0b011:
acc += mem[oa];
continue;
case 0b100:
acc -= mem[oa];
continue;
case 0b101:
if(acc != 0) continue;
case 0b110:
pc = oa;
continue;
case 0b111:
return acc;
}
}
}
int main(int argc, char **argv) {
printf(" 2+2: %"PRIu8"\n", EXECUTE(
LDA 3,
ADD 4,
STP ,
0,
2,
2
));
printf(" 7*8: %"PRIu8"\n", EXECUTE(
LDA 12,
ADD 10,
STA 12,
LDA 11,
SUB 13,
STA 11,
BRZ 8,
JMP 0,
LDA 12,
STP ,
8,
7,
0,
1
));
printf(" fibonacci: %"PRIu8"\n", EXECUTE(
LDA 14,
STA 15,
ADD 13,
STA 14,
LDA 15,
STA 13,
LDA 16,
SUB 17,
BRZ 11,
STA 16,
JMP 0,
LDA 14,
STP ,
1,
1,
0,
8,
1
));
printf("linkedlist: %"PRIu8"\n", EXECUTE(
LDA 13,
ADD 15,
STA 5,
ADD 16,
STA 7,
NOP ,
STA 14,
NOP ,
BRZ 11,
STA 15,
JMP 0,
LDA 14,
STP ,
LDA 0,
0,
28,
1,
0,
0,
0,
6,
0,
2,
26,
5,
20,
3,
30,
1,
22,
4,
24
));
printf(" prisoner: %"PRIu8"\n", EXECUTE(
NOP ,
NOP ,
STP ,
0,
LDA 3,
SUB 29,
BRZ 18,
LDA 3,
STA 29,
BRZ 14,
LDA 1,
ADD 31,
STA 1,
JMP 2,
LDA 0,
ADD 31,
STA 0,
JMP 2,
LDA 3,
STA 29,
LDA 1,
ADD 30,
ADD 3,
STA 1,
LDA 0,
ADD 30,
ADD 3,
STA 0,
JMP 2,
0,
1,
3
));
return 0;
}

View file

@ -0,0 +1,179 @@
enum begin NOP = 0, LDA, STA, ADD, SUB, BRZ, JMP, STP end
local ops = {NOP = NOP, LDA = LDA, STA = STA, ADD = ADD,
SUB = SUB, BRZ = BRZ, JMP = JMP, STP = STP}
local function load(prog)
local mem = table.create(31, 1)
for i = 0, 31 do mem[i] = 0 end
local lines = prog:rstrip():split("\n")
for i = 1, #lines do
local line = lines[i]:strip()
local split = line:split(" ")
local instr = split[1]
local addr = 0
if #split == 2 then addr = tonumber(split[2]) end
if ops[instr] then
mem[i - 1] = ops[instr] * 32 + addr
else
local v = tonumber(instr)
if v then mem[i - 1] = v end
end
end
return mem
end
local function output(acc)
print(acc)
end
local function interp(prog)
local acc = 0
local pc = 0
local mem = load(prog)
while true do
local instr = mem[pc] >> 5
local addr = mem[pc] % 32
pc += 1
switch instr do
case LDA:
acc = mem[addr]
break
case STA:
mem[addr] = acc
break
case ADD:
acc += mem[addr]
if acc > 255 then acc -= 256 end
break
case SUB:
acc -= mem[addr]
if acc < 0 then ac += 256 end
break
case BRZ:
if acc == 0 then pc = addr end
break
case JMP:
pc = addr
break
end
if instr == STP or pc > 31 then break end
end
output(acc)
end
local progs = {
[[
LDA 3
ADD 4
STP
2
2
]],
[[
LDA 12
ADD 10
STA 12
LDA 11
SUB 13
STA 11
BRZ 8
JMP 0
LDA 12
STP
8
7
0
1
]],
[[
LDA 14
STA 15
ADD 13
STA 14
LDA 15
STA 13
LDA 16
SUB 17
BRZ 11
STA 16
JMP 0
LDA 14
STP
1
1
0
8
1
]],
[[
LDA 13
ADD 15
STA 5
ADD 16
STA 7
NOP
STA 14
NOP
BRZ 11
STA 15
JMP 0
LDA 14
STP
LDA 0
0
28
1
6
0
2
26
5
20
3
30
1
22
4
24
]],
[[
0
0
STP
NOP
LDA 3
SUB 29
BRZ 18
LDA 3
STA 29
BRZ 14
LDA 1
ADD 31
STA 1
JMP 2
LDA 0
ADD 31
STA 0
JMP 2
LDA 3
STA 29
LDA 0
ADD 30
ADD 3
STA 0
LDA 1
ADD 30
ADD 3
STA 1
JMP 2
0
1
3
]]
}
for progs as prog do interp(prog) end