From: Lukas Krickl Date: Mon, 19 Feb 2024 12:25:14 +0000 (+0100) Subject: Moved register lookup to arch.c X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=001420f19edbd39de4597c35ca5c884305fe6270;p=ulas%2F.git Moved register lookup to arch.c --- diff --git a/src/archs.c b/src/archs.c index db29d80..82507c2 100644 --- a/src/archs.c +++ b/src/archs.c @@ -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"); diff --git a/src/archs.h b/src/archs.h index e5182ab..f0a59b7 100644 --- a/src/archs.h +++ b/src/archs.h @@ -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 }; diff --git a/src/ulas.c b/src/ulas.c index 253429f..6cba149 100644 --- a/src/ulas.c +++ b/src/ulas.c @@ -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