#include #include #include #include "cpu.h" #include "log.h" #include "opc.h" #define REGa(x) (((x) & 0x1FFF) << 45) #define REGb(x) (((x) & 0x1FFF) << 32) #define REGc(x) (((x) & 0x1FFF) << 19) #define IMMc(x) ((x) & 0xFFFFFFFF) inst_t compile(const char *line) { char mnem[5]; int64_t a = 0, b = 0, c = 0; /* register file size */ if (sscanf(line, ".REGS %"SCNi64"", &a) == 1) return a; /* ADD, SUB, MUL, DIV, MOD, AND, OR */ if (sscanf(line, "%4s r%"SCNi64", r%"SCNi64", r%"SCNi64"", mnem, &a, &b, &c) == 4) return mnemonic2opc(mnem) | REGa(a) | REGb(b) | REGc(c); /* LW, SW */ if (sscanf(line, "%4s r%"SCNi64", r%"SCNi64", %"SCNi64"", mnem, &a, &b, &c) == 4) return mnemonic2opc(mnem) | REGa(a) | REGb(b) | IMMc(c); /* CMP */ if (sscanf(line, "%4s r%"SCNi64", r%"SCNi64"", mnem, &a, &b) == 3) return mnemonic2opc(mnem) | REGa(a) | REGb(b); /* MOV, BEZ */ if (sscanf(line, "%4s r%"SCNi64", %"SCNi64"", mnem, &a, &c) == 3) return mnemonic2opc(mnem) | REGa(a) | IMMc(c); /* EQ, NE, LT, LE, GE, GT, PUSH, POP */ if (sscanf(line, "%4s r%"SCNi64"", mnem, &a) == 2) return mnemonic2opc(mnem) | REGa(a); /* JMP, CALL */ if (sscanf(line, "%4s %"SCNi64"", mnem, &c) == 2) return mnemonic2opc(mnem) | IMMc(c); /* RET, SYS */ if (sscanf(line, "%4s", mnem) == 1) return mnemonic2opc(mnem); return 0xFFFFFFFFFFFFFFFF; }