From d4733b7be77acd90d1d60e10d6381f52cb76ce58 Mon Sep 17 00:00:00 2001
From: Abdelrahman Said <said.abdelrahman89@gmail.com>
Date: Sun, 5 Mar 2023 13:58:12 +0000
Subject: [PATCH] Updated decode_register to use flat array instead of branches

---
 8086_assembly_01/dasm.cpp | 77 +++++++++------------------------------
 1 file changed, 18 insertions(+), 59 deletions(-)

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]);
 }