aboutsummaryrefslogtreecommitdiffstats
path: root/src/assembler_ops.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/assembler_ops.py')
-rw-r--r--src/assembler_ops.py56
1 files changed, 27 insertions, 29 deletions
diff --git a/src/assembler_ops.py b/src/assembler_ops.py
index 0177140..2313bfd 100644
--- a/src/assembler_ops.py
+++ b/src/assembler_ops.py
@@ -3,16 +3,21 @@ from assembler_eval import *
from dataclasses import dataclass
@dataclass
+class Options:
+ stack_pointer = "RG"
+ csr_scratch = "RF"
+
+@dataclass
class Meta:
address: int
- options: dict[str, str]
+ options: Options
def make_alr(meta: Meta, alu_op: str, left: str, right: str, target: str) -> list[int]:
"""ALR 0000 TTTL LLRR RSSS"""
- target_e = eval_expr(target)
- left_e = eval_expr(left)
- right_e = eval_expr(right)
- alu_op_e = eval_expr(alu_op)
+ target_e = eval_expr(target, bits=3)
+ left_e = eval_expr(left, bits=3)
+ right_e = eval_expr(right, bits=3)
+ alu_op_e = eval_expr(alu_op, bits=3)
word = (0b0000 << 12) + \
(target_e << 9) + \
(left_e << 6) + \
@@ -22,12 +27,10 @@ def make_alr(meta: Meta, alu_op: str, left: str, right: str, target: str) -> lis
def make_ali(meta: Meta, alu_op: str, left: str, imm: str, target: str) -> list[int]:
"""ALI 0001 TTTL LLII ISSS"""
- target_e = eval_expr(target)
- left_e = eval_expr(left)
- imm_e = eval_expr(imm)
- if imm_e >= 2**3:
- raise Exception("ALI immediate value does not fit in 3 bits: " + str(imm_e))
- alu_op_e = eval_expr(alu_op)
+ target_e = eval_expr(target, bits=3)
+ left_e = eval_expr(left, bits=3)
+ imm_e = eval_expr(imm, bits=3)
+ alu_op_e = eval_expr(alu_op, bits=3)
word = (0b0001 << 12) + \
(target_e << 9) + \
(left_e << 6) + \
@@ -37,8 +40,8 @@ def make_ali(meta: Meta, alu_op: str, left: str, imm: str, target: str) -> list[
def make_ldr(meta: Meta, to_reg: str, addr_reg: str) -> list[int]:
"""LDR 0010 TTTR RRXX XXXX"""
- to_reg_e = eval_expr(to_reg)
- addr_reg_e = eval_expr(addr_reg)
+ to_reg_e = eval_expr(to_reg, bits=3)
+ addr_reg_e = eval_expr(addr_reg, bits=3)
word = (0b0010 << 12) + \
(to_reg_e << 9) + \
(addr_reg_e << 6)
@@ -46,8 +49,8 @@ def make_ldr(meta: Meta, to_reg: str, addr_reg: str) -> list[int]:
def make_str(meta: Meta, from_reg: str, addr_reg: str) -> list[int]:
"""STR 0011 TTTR RRXX XXXX"""
- from_reg_e = eval_expr(from_reg)
- addr_reg_e = eval_expr(addr_reg)
+ from_reg_e = eval_expr(from_reg, bits=3)
+ addr_reg_e = eval_expr(addr_reg, bits=3)
word = (0b0011 << 12) + \
(from_reg_e << 9) + \
(addr_reg_e << 6)
@@ -55,8 +58,8 @@ def make_str(meta: Meta, from_reg: str, addr_reg: str) -> list[int]:
def make_ldi(meta: Meta, to_reg: str, imm: str) -> list[int]:
"""LDI 0100 TTTI IIII IIII"""
- to_reg_e = eval_expr(to_reg)
- imm_e = eval_expr(imm)
+ to_reg_e = eval_expr(to_reg, bits=3)
+ imm_e = eval_expr(imm, bits=9)
word = (0b0100 << 12) + \
(to_reg_e << 9) + \
imm_e
@@ -64,26 +67,23 @@ def make_ldi(meta: Meta, to_reg: str, imm: str) -> list[int]:
def make_jpr(meta: Meta, addr_reg: str) -> list[int]:
"""JPR 0101 XXXR RRXX XXXX"""
- addr_reg_e = eval_expr(addr_reg)
+ addr_reg_e = eval_expr(addr_reg, bits=3)
word = (0b0101 << 12) + \
(addr_reg_e << 6)
return [word]
def make_jpi(meta: Meta, imm: str) -> list[int]:
"""JPI 0110 XXXI IIII IIII"""
- imm_e = eval_expr(imm)
+ imm_e = eval_expr(imm, bits=9)
imm_e = imm_e - meta.address - 1
- if imm_e >= 2**9:
- raise Exception("JPI relative value does not fit in 9 bits: " + str(imm_e))
-
word = (0b0110 << 12) + \
imm_e
return [word]
def make_brr(meta: Meta, flag_s: str, addr_reg: str) -> list[int]:
"""brr 0111 XFFR RRXX XXXX"""
- flag_s_e = eval_expr(flag_s)
- addr_reg_e = eval_expr(addr_reg)
+ flag_s_e = eval_expr(flag_s, bits=2)
+ addr_reg_e = eval_expr(addr_reg, bits=3)
word = (0b0111 << 12) + \
(flag_s_e << 9) + \
(addr_reg_e << 6)
@@ -91,11 +91,9 @@ def make_brr(meta: Meta, flag_s: str, addr_reg: str) -> list[int]:
def make_bri(meta: Meta, flag_s: str, imm: str) -> list[int]:
"""BRI 1000 XFFI IIII IIII"""
- flag_s_e = eval_expr(flag_s)
- imm_e = eval_expr(imm)
+ flag_s_e = eval_expr(flag_s, bits=2)
+ imm_e = eval_expr(imm, bits=9)
imm_e = imm_e - meta.address - 1
- if imm_e >= 2**9:
- raise Exception("BRI relative value does not fit in 9 bits: " + str(imm_e))
word = (0b1000 << 12) + \
(flag_s_e << 9) + \
imm_e
@@ -103,7 +101,7 @@ def make_bri(meta: Meta, flag_s: str, imm: str) -> list[int]:
def make_lpc(meta: Meta, target: str) -> list[int]:
"""LPC 1001 TTTX XXXX XXXX"""
- target_e = eval_expr(target)
+ target_e = eval_expr(target, bits=3)
word = (0b1001 << 12) + \
(target_e << 9)
return [word]