From 9f3cc0b94113fa7ba5162785c6dc3b5faefe53ab Mon Sep 17 00:00:00 2001 From: kdx Date: Thu, 13 Apr 2023 23:34:47 +0200 Subject: fuck indentation --- src/orgaemu.c | 171 +++++++++++++++++++++++++++++----------------------------- 1 file 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 -- cgit v1.2.3