aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-04-13 23:34:47 +0200
committerkdx <kikoodx@paranoici.org>2023-04-13 23:34:47 +0200
commit9f3cc0b94113fa7ba5162785c6dc3b5faefe53ab (patch)
tree6d782b8d2b0fa7f73c85f58aa1042ff03c38ac35
parente1e94814565bfe659e6d879fcd1dcd4fe575d965 (diff)
downloadorga-9f3cc0b94113fa7ba5162785c6dc3b5faefe53ab.tar.gz
fuck indentation
-rw-r--r--src/orgaemu.c171
1 files changed, 87 insertions, 84 deletions
diff --git a/src/orgaemu.c b/src/orgaemu.c
index cb1d6e2..74fd41f 100644
--- a/src/orgaemu.c
+++ b/src/orgaemu.c
@@ -70,93 +70,96 @@ pop_rs(void)
return rstack[rstack_ptr];
}
+static long
+exec_op(uint16_t *mem, long pc)
+{
+ switch (mem[pc]) {
+ case OP_NOP:
+ return pc + 1;
+ case OP_LIT:
+ push(mem[pc + 1]);
+ return pc + 2;
+ case OP_POP:
+ pop();
+ return pc + 1;
+ case OP_NIP: {
+ const uint16_t a = pop();
+ pop();
+ push(a);
+ return pc + 1;
+ }
+ case OP_SWP: {
+ const uint16_t a = pop();
+ const uint16_t b = pop();
+ push(a);
+ push(b);
+ return pc + 1;
+ }
+ case OP_DUP: {
+ const uint16_t a = pop();
+ push(a);
+ push(a);
+ return pc + 1;
+ }
+ case OP_JNZ:
+ if (pop() != 0)
+ return mem[pc + 1];
+ return pc + 2;
+ case OP_JRT:
+ push_rs(pc + 2);
+ return mem[pc + 1];
+ case OP_RET:
+ if (rstack_ptr > 0)
+ return pop_rs();
+ return MEM_SIZE;
+ case OP_LDA:
+ push(mem[pop()]);
+ return pc + 1;
+ case OP_STA: {
+ const uint16_t a = pop();
+ const uint16_t b = pop();
+ mem[a] = b;
+ return pc + 1;
+ }
+ case OP_WRT:
+ putchar(pop());
+ return pc + 1;
+ case OP_ADD:
+ push(pop() + pop());
+ return pc + 1;
+ case OP_MUL:
+ push(pop() * pop());
+ return pc + 1;
+ case OP_AND:
+ push(pop() & pop());
+ return pc + 1;
+ case OP_ORA:
+ push(pop() | pop());
+ return pc + 1;
+ case OP_XOR:
+ push(pop() ^ pop());
+ return pc + 1;
+ case OP_INC:
+ push(pop() + 1);
+ return pc + 1;
+ case OP_DEC:
+ push(pop() - 1);
+ return pc + 1;
+ default:
+ fprintf(stderr, "unhandled opcode %04x\n", mem[pc]);
+ if (mem[pc] <= OP_SLP)
+ fprintf(stderr, "(%s)\n", ops[mem[pc]]);
+ exit(fail());
+ }
+}
+
static void
exec_data(uint16_t *mem)
{
- for (long pc = 0; pc < MEM_SIZE;) {
- switch (mem[pc]) {
- case OP_NOP:
- break;
- case OP_LIT:
- push(mem[pc + 1]);
- pc += 1;
- break;
- case OP_POP:
- pop();
- break;
- case OP_NIP: {
- const uint16_t a = pop();
- pop();
- push(a);
- } break;
- case OP_SWP: {
- const uint16_t a = pop();
- const uint16_t b = pop();
- push(a);
- push(b);
- } break;
- case OP_DUP: {
- const uint16_t a = pop();
- push(a);
- push(a);
- } break;
- case OP_JNZ:
- if (pop() != 0) {
- pc = mem[pc + 1];
- continue;
- }
- pc += 1;
- break;
- case OP_JRT:
- push_rs(pc);
- pc = mem[pc + 1];
- continue;
- case OP_RET:
- if (rstack_ptr > 0) {
- pc = pop_rs() + 1;
- break;
- }
- return;
- case OP_LDA:
- push(mem[pop()]);
- break;
- case OP_STA: {
- const uint16_t a = pop();
- const uint16_t b = pop();
- mem[a] = b;
- } break;
- case OP_WRT:
- putchar(pop());
- break;
- case OP_ADD:
- push(pop() + pop());
- break;
- case OP_MUL:
- push(pop() * pop());
- break;
- case OP_AND:
- push(pop() & pop());
- break;
- case OP_ORA:
- push(pop() | pop());
- break;
- case OP_XOR:
- push(pop() ^ pop());
- break;
- case OP_INC:
- push(pop() + 1);
- break;
- case OP_DEC:
- push(pop() - 1);
- break;
- default:
- fprintf(stderr, "unhandled opcode %04x\n", mem[pc]);
- if (mem[pc] <= OP_SLP)
- fprintf(stderr, "(%s)\n", ops[mem[pc]]);
- exit(fail());
- }
- pc += 1;
- }
+ long pc = 0;
+ do
+ pc = exec_op(mem, pc);
+ while (pc < MEM_SIZE);
}
int