Moved register lookup to arch.c
authorLukas Krickl <lukas@krickl.dev>
Mon, 19 Feb 2024 12:25:14 +0000 (13:25 +0100)
committerLukas Krickl <lukas@krickl.dev>
Mon, 19 Feb 2024 12:25:14 +0000 (13:25 +0100)
src/archs.c
src/archs.h
src/ulas.c

index db29d807804b8a7de20a9f9ed12bb20fce2db437..82507c26889039fde4f608eb535077335658f14f 100644 (file)
@@ -1,7 +1,6 @@
 #include "archs.h"
 #include "ulas.h"
 
-
 /**
  * Instruction table
  */
@@ -309,10 +308,17 @@ const struct ulas_instr ULASINSTRS_SM83[] = {
 
     {NULL}};
 
+const char *ULAS_SM83_REGS[] = {
+    NULL,   "b",    "c",    "d",    "e",    "h",    "l",   "a",  "bc",
+    "de",   "hl",   "nz",   "z",    "nc",   "c",   "sp",  "af",  "0x00",
+    "0x08", "0x10", "0x18", "0x20", "0x28", "0x30", "0x38"};
+
 void ulas_arch_set(enum ulas_archs arch) {
   switch (arch) {
   case ULAS_ARCH_SM83:
     ulas.arch = (struct ulas_arch){NULL, 0, ULASINSTRS_SM83};
+    ulas.arch.regs_names = ULAS_SM83_REGS;
+    ulas.arch.regs_len = ULAS_SM83_REGS_LEN;
     break;
   default:
     ULASPANIC("Unknown architecture\n");
index e5182ab60d9d269d8d9efd070ead150c0f501750..f0a59b7b11ad17552c82d19bfcc8eb597190a4da 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef ARCHS_H_
 #define ARCHS_H_
 
+// TODO: rename reg constants so that they contain SM83
 enum ulas_asmregs_sm83 {
   // r8
   ULAS_REG_B = 1,
@@ -32,7 +33,9 @@ enum ulas_asmregs_sm83 {
   ULAS_VEC20 = 21,
   ULAS_VEC28 = 22,
   ULAS_VEC30 = 23,
-  ULAS_VEC38 = 24
+  ULAS_VEC38 = 24,
+
+  ULAS_SM83_REGS_LEN
 };
 
 enum ulas_archs { ULAS_ARCH_SM83 };
index 253429f955fbbddd89218ca9a297a42115ff1fb9..6cba149ebb302fdff336362e133874ead4705a15 100644 (file)
@@ -1770,71 +1770,11 @@ char *ulas_strexpr(const char **line, unsigned long n, int *rc) {
 // we should use a register table
 // that is used to look up register tokens
 const char *ulas_asmregstr(unsigned int reg) {
-  switch (reg) {
-  case ULAS_REG_A:
-    return "a";
-  case ULAS_REG_B:
-    return "b";
-  case ULAS_REG_C:
-    return "c";
-  case ULAS_REG_D:
-    return "d";
-  case ULAS_REG_E:
-    return "e";
-  case ULAS_REG_H:
-    return "h";
-  case ULAS_REG_L:
-    return "l";
-  case ULAS_REG_HL:
-    return "hl";
-  case ULAS_REG_DE:
-    return "de";
-  case ULAS_REG_BC:
-    return "bc";
-  case ULAS_REG_NOT_ZERO:
-    return "nz";
-  case ULAS_REG_ZERO:
-    return "z";
-  case ULAS_REG_NOT_CARRY:
-    return "nc";
-  case ULAS_REG_CARRY:
-    return "c";
-  case ULAS_REG_SP:
-    return "sp";
-  case ULAS_REG_AF:
-    return "af";
-  case ULAS_VEC00:
-    return "0x00";
-  case ULAS_VEC08:
-    return "0x08";
-  case ULAS_VEC10:
-    return "0x10";
-  case ULAS_VEC18:
-    return "0x18";
-  case ULAS_VEC20:
-    return "0x20";
-  case ULAS_VEC28:
-    return "0x28";
-  case ULAS_VEC30:
-    return "0x30";
-  case ULAS_VEC38:
-    return "0x38";
-  default:
+  if (reg >= ulas.arch.regs_len) {
     return NULL;
   }
-
-  return NULL;
-}
-
-unsigned int ulas_asmstrreg(const char *s, unsigned long n) {
-  for (int i = 0; i < 10; i++) {
-    const char *rs = ulas_asmregstr(i);
-    if (rs && strncmp(rs, s, n) == 0) {
-      return i;
-    }
-  }
-
-  return -1;
+  
+  return ulas.arch.regs_names[reg];
 }
 
 #define ULAS_INSTRBUF_MIN 4