diff --git a/8086_assembly_01/dasm.cpp b/8086_assembly_01/dasm.cpp index 6695545..34b9ff2 100644 --- a/8086_assembly_01/dasm.cpp +++ b/8086_assembly_01/dasm.cpp @@ -96,64 +96,23 @@ uint16_t decode_mode(uint16_t instruction) { } void decode_register(uint16_t instruction, bool word, char *dest) { - uint16_t reg_mask = 0x07; + static uint16_t reg_mask = 0x07; - switch (instruction & reg_mask) { - case 0x00: - if (word) { - strcpy(dest, "ax"); - } else { - strcpy(dest, "al"); - } - break; - case 0x01: - if (word) { - strcpy(dest, "cx"); - } else { - strcpy(dest, "cl"); - } - break; - case 0x02: - if (word) { - strcpy(dest, "dx"); - } else { - strcpy(dest, "dl"); - } - break; - case 0x03: - if (word) { - strcpy(dest, "bx"); - } else { - strcpy(dest, "bl"); - } - break; - case 0x04: - if (word) { - strcpy(dest, "sp"); - } else { - strcpy(dest, "ah"); - } - break; - case 0x05: - if (word) { - strcpy(dest, "bp"); - } else { - strcpy(dest, "ch"); - } - break; - case 0x06: - if (word) { - strcpy(dest, "si"); - } else { - strcpy(dest, "dh"); - } - break; - case 0x07: - if (word) { - strcpy(dest, "di"); - } else { - strcpy(dest, "bh"); - } - break; - } + // clang-format off + static const char *table[16] = { + "al", "ax", + "cl", "cx", + "dl", "dx", + "bl", "bx", + "ah", "sp", + "ch", "bp", + "dh", "si", + "bh", "di" + }; + // clang-format on + + uint16_t offset = instruction & reg_mask; + + // Multiply offset by 2 since each row has 2 columns + strcpy(dest, table[offset * 2 + (uint16_t)word]); }