From 6165e2dde32a8f425e54d4f061146b366d5a2e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benedikt=20B=C3=B6hm?= Date: Sat, 4 Jul 2009 10:49:19 +0200 Subject: adapt emulator for generator changes: - new instructions (push, pop, call, ret) - new pseudo-registers (bp, sp, rv) - new binary format - dynamic register file size - removed obsolete instructions --- src/emu/asm.c | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) (limited to 'src/emu/asm.c') diff --git a/src/emu/asm.c b/src/emu/asm.c index caca72a..8e39202 100644 --- a/src/emu/asm.c +++ b/src/emu/asm.c @@ -5,28 +5,49 @@ #include "log.h" #include "opc.h" +#define REGa(x) (((x) & 0x1F) << 21) +#define REGb(x) (((x) & 0x1F) << 16) +#define REGc(x) (((x) & 0x1F) << 11) +#define IMMc(x) ((x) & 0xFFFF) + uint32_t compile(const char *line) { - char mnem[4]; + char mnem[5]; int32_t a = 0, b = 0, c = 0; + static size_t regs = 0; + + /* register file size */ + if (sscanf(line, ".REGS %d", &a) == 1) { + regs = a; + return a; + } + + /* ADD, SUB, MUL, DIV, MOD, AND, OR */ + if (sscanf(line, "%s r%d, r%d, r%d", mnem, &a, &b, &c) == 4) + return mnemonic2opc(mnem) | REGa(a) | REGb(b) | REGc(c); + + /* LW, SW */ + if (sscanf(line, "%s r%d, r%d, %d", mnem, &a, &b, &c) == 4) + return mnemonic2opc(mnem) | REGa(a) | REGb(b) | IMMc(c); - /* arithmetic & logic */ - if (sscanf(line, "%3s r%2d, r%2d, r%2d", mnem, &a, &b, &c) == 4) - return mnemonic2opc(mnem) | ((a & 0x1F) << 21) | ((b & 0x1F) << 16) | ((c & 0x1F) << 11); + /* CMP */ + if (sscanf(line, "%s r%d, r%d", mnem, &a, &b) == 3) + return mnemonic2opc(mnem) | REGa(a) | REGb(b); - /* load/store & branch */ - if (sscanf(line, "%3s r%2d, r%2d, %d", mnem, &a, &b, &c) == 4) - return mnemonic2opc(mnem) | ((a & 0x1F) << 21) | ((b & 0x1F) << 16) | (c & 0xFFFF); + /* MOV, BEZ */ + if (sscanf(line, "%s r%2d, %d", mnem, &a, &c) == 3) + return mnemonic2opc(mnem) | REGa(a) | IMMc(c); - if (sscanf(line, "%3s r%2d, %d", mnem, &b, &c) == 3) - return mnemonic2opc(mnem) | ((b & 0x1F) << 16) | (c & 0xFFFF); + /* EQ, NE, LT, LE, GE, GT, PUSH, POP */ + if (sscanf(line, "%s r%d", mnem, &a) == 2) + return mnemonic2opc(mnem) | REGa(a); - /* jump */ - if (sscanf(line, "%3s r%2d", mnem, &a) == 2) - return mnemonic2opc(mnem) | ((a & 0x1F) << 21); + /* JMP, CALL */ + if (sscanf(line, "%s %d", mnem, &c) == 2) + return mnemonic2opc(mnem) | IMMc(c); - /* misc */ - if (sscanf(line, "%3s", mnem) == 1) + /* RET, SYS */ + if (sscanf(line, "%s", mnem) == 1) return mnemonic2opc(mnem); return 0xFFFFFFFF; -- cgit v1.2.3