diff options
author | kdx <kikoodx@paranoici.org> | 2023-04-13 23:56:16 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-04-13 23:56:16 +0200 |
commit | bb465e00c234c9f73f5ad18e2a10dd0709702737 (patch) | |
tree | bfa205eaaff7502faa2d48c325a87aacc8d78cf5 /src | |
parent | a721fdf3dfefa817701371a62c834619055d7ce7 (diff) | |
download | orga-bb465e00c234c9f73f5ad18e2a10dd0709702737.tar.gz |
support entire spec
Diffstat (limited to 'src')
-rw-r--r-- | src/orgaemu.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/orgaemu.c b/src/orgaemu.c index 38bd412..b3c712d 100644 --- a/src/orgaemu.c +++ b/src/orgaemu.c @@ -109,10 +109,42 @@ exec_op(uint16_t *mem, long pc) push(a); return pc + 1; } + case OP_OVR: { + const uint16_t a = pop(); + const uint16_t b = pop(); + push(b); + push(a); + push(b); + return pc + 1; + } + case OP_EQU: + push(pop() == pop()); + return pc + 1; + case OP_NEQ: + push(pop() != pop()); + return pc + 1; + case OP_GTH: { + const uint16_t b = pop(); + const uint16_t a = pop(); + push(a > b); + return pc + 1; + } + case OP_LTH: { + const uint16_t b = pop(); + const uint16_t a = pop(); + push(a < b); + return pc + 1; + } + case OP_JEZ: + if (pop() == 0) + return mem[pc + 1]; + return pc + 2; case OP_JNZ: if (pop() != 0) return mem[pc + 1]; return pc + 2; + case OP_JMP: + return mem[pc + 1]; case OP_JRT: push_rs(pc + 2); return mem[pc + 1]; @@ -129,15 +161,30 @@ exec_op(uint16_t *mem, long pc) mem[a] = b; return pc + 1; } + case OP_RED: + push(getchar()); + return pc + 1; case OP_WRT: putchar(pop()); return pc + 1; case OP_ADD: push(pop() + pop()); return pc + 1; + case OP_SUB: { + const uint16_t b = pop(); + const uint16_t a = pop(); + push(a - b); + return pc + 1; + } case OP_MUL: push(pop() * pop()); return pc + 1; + case OP_DIV: { + const uint16_t b = pop(); + const uint16_t a = pop(); + push(a / b); + return pc + 1; + } case OP_AND: push(pop() & pop()); return pc + 1; @@ -147,6 +194,20 @@ exec_op(uint16_t *mem, long pc) case OP_XOR: push(pop() ^ pop()); return pc + 1; + case OP_LSF: { + const uint16_t shift = pop(); + const uint16_t a = pop(); + push(a << shift); + return pc + 1; + } + case OP_RSF: { + const uint16_t shift = pop(); + const uint16_t a = pop(); + push(a >> shift); + return pc + 1; + } + case OP_SLP: + return pc + 1; case OP_INC: push(pop() + 1); return pc + 1; |