aboutsummaryrefslogtreecommitdiffstats
path: root/src/assembler_eval.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/assembler_eval.py')
-rw-r--r--src/assembler_eval.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/assembler_eval.py b/src/assembler_eval.py
new file mode 100644
index 0000000..3473ab8
--- /dev/null
+++ b/src/assembler_eval.py
@@ -0,0 +1,39 @@
+constants: dict[str, str] = {
+ # Registers
+ "rz": "0",
+ "ra": "1",
+ "rb": "2",
+ "rc": "3",
+ "rd": "4",
+ "rf": "5",
+ "rg": "6",
+ # ALU instructions
+ "al_plus": "0",
+ "al_minus": "1",
+ "al_and": "2",
+ "al_or": "3",
+ "al_xor": "4",
+ "al_shift_lr": "5",
+ "al_shift_ar": "6",
+ "al_shift_ll": "7",
+ # ALU flags
+ "f_carry": "0",
+ "f_overflow": "1",
+ "f_zero": "2",
+ "f_sign": "3",
+}
+
+labels: dict[str, int] = {}
+
+def eval_symbol(c: str) -> str:
+ if c in labels:
+ return str(labels[c])
+
+ if c in constants:
+ return constants[c]
+
+ return c
+
+def eval_expr(expr: str) -> int:
+ expr = eval_symbol(expr)
+ return eval(expr, labels.copy()) # eval as Python expr