From 8923a2006d821f5eecf36e1f9fa5ed29bb286d39 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Thu, 24 Oct 2024 20:58:09 -0500 Subject: [PATCH] Init --- .gitignore | 2 + includes/opcodes.h | 22 +++++++++++ src/main.c | 5 +++ src/opcodes.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 .gitignore create mode 100644 includes/opcodes.h create mode 100644 src/main.c create mode 100644 src/opcodes.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2477855 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode/ +tags diff --git a/includes/opcodes.h b/includes/opcodes.h new file mode 100644 index 0000000..ee0481d --- /dev/null +++ b/includes/opcodes.h @@ -0,0 +1,22 @@ +#ifndef OPCODES_H +#define OPCODES_H + +#include +#include +#include + +typedef enum { + R1 = 0, R2, R3, R4, R5, R6, R7, R8 = 7 +} Registers; + +typedef enum { + ADD = 0x01, SUB, MUL, DIV, AND, OR, XOR, NOT, SHL, SHR, NOP, CMP, JMP, JG, JL, + OUTB, INB, HLT, ENI, INT, LIVT, PUSHA, POPA, CALL, RET, PUSH, POP +} Mnemonic; + +int IsOpcode(const char*, Mnemonic*); +int IsRegister(const char*, Registers*); +void GetMnemonicText(Mnemonic mnemonic, char buffer[12]); +void GetRegisterText(Registers reg, char buffer[3]); + +#endif \ No newline at end of file diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..267b874 --- /dev/null +++ b/src/main.c @@ -0,0 +1,5 @@ +#include + +int main(int argc, char** argv) { + printf("Hello World\n"); +} \ No newline at end of file diff --git a/src/opcodes.c b/src/opcodes.c new file mode 100644 index 0000000..c9f03f3 --- /dev/null +++ b/src/opcodes.c @@ -0,0 +1,97 @@ +#include "../includes/opcodes.h" +#include +#include +#include + +#define OPCODECOUNT 34 + +struct _instruction { + char* Name; + Mnemonic Mnemonic; +}; + +struct _instruction instructions[OPCODECOUNT] = { + { "copya", COPYA }, + { "copyab", COPYAB }, + { "copyra", COPYRA }, + { "copyrab", COPYRAB }, + { "copyrara", COPYRARA }, + { "copyrarab", COPYRARAB }, + { "copy", COPY }, + { "copyi", COPYI }, + { "copyb", COPYB }, + { "cmp", CMP }, + { "cmpi", CMPI }, + { "add", ADD }, + { "sub", SUB }, + { "and", AND }, + { "xor", XOR }, + { "or", OR }, + { "not", NOT }, + { "shr", SHR }, + { "shl", SHL }, + { "inc", INC }, + { "dec", DEC }, + { "push", PUSH }, + { "pop", POP }, + { "jmpi", JMPI }, + { "jmp", JMP }, + { "jz", JZ }, + { "jg", JG }, + { "jl", JL }, + { "nop", NOP }, + { "call", CALL }, + { "ret", RET } + //yld +}; + +void GetMnemonicText(Mnemonic mnemonic, char buffer[12]) { + memset(buffer, '\0', 12); + + for(int i = 0; i < OPCODECOUNT; i++) { + if (instructions[i].Mnemonic == mnemonic) { + strncpy(buffer, instructions[i].Name, 11); + break; + } + } +} + +void GetRegisterText(Registers reg, char buffer[4]) { + memset(buffer, '\0', 4); + + if (reg < R1 || reg > R8) return; + + buffer[0] = 'r'; + buffer[1] = reg + 49; +} + +int IsOpcode(const char* text, Mnemonic* opcode) { + if (!text) return 0; + + for(unsigned long i = 0; i < sizeof(instructions) / sizeof(struct _instruction); i++) { + if (strcmp(instructions[i].Name, text) == 0) { + if (opcode) *opcode = instructions[i].Mnemonic; + return 1; + } + } + + return 0; +} + +int IsRegister(const char* text, Registers* reg) { + if (!text) return 0; + + int length = strlen(text); + Registers r = R8; + + if (length != 2) return 0; + if (text[0] != 'r') return 0; + + if (!isdigit(text[1])) return 0; + + r = text[1] - 0x31; + + if (reg) *reg = r; + + return 1; +} \ No newline at end of file