aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_asm
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2024-05-16 18:59:53 +0300
committerJan Tuomi <jan@jantuomi.fi>2024-05-16 18:59:53 +0300
commit9a3e2a3d05fc0b6bd0a847e29da0a87934f5a743 (patch)
tree9b8cd310e4b5fe79d3eacfdb284992ae0023bf7e /atk16_asm
parent1045229da08fc1c8168b5ae58d54a1566eefaaac (diff)
Fix another jump issue in assembler, improve monitor
Diffstat (limited to 'atk16_asm')
-rw-r--r--atk16_asm/asm_eval.py13
-rw-r--r--atk16_asm/asm_ops.py8
2 files changed, 12 insertions, 9 deletions
diff --git a/atk16_asm/asm_eval.py b/atk16_asm/asm_eval.py
index 09c3a75..f9a4e3d 100644
--- a/atk16_asm/asm_eval.py
+++ b/atk16_asm/asm_eval.py
@@ -27,10 +27,6 @@ constants: dict[str, str] = {
Symbols = dict[str, int]
-def check_size(bits: int, val: int) -> None:
- if val >= 2 ** bits:
- raise Exception(f"Value does not fit in {bits} bits: 0x{val:>04x}")
-
def eval_symbol(symbols: Symbols, c: str) -> str:
if c in symbols:
return str(symbols[c])
@@ -42,6 +38,9 @@ def eval_symbol(symbols: Symbols, c: str) -> str:
def eval_expr(symbols: Symbols, expr: str, bits: int = 16) -> int:
expr = eval_symbol(symbols, expr)
- ret = eval(expr, symbols.copy()) # eval as Python expr
- check_size(bits, ret)
- return ret
+ val = eval(expr, symbols.copy()) # eval as Python expr
+
+ if val >= 2 ** bits:
+ raise Exception(f"When evaluating expression \"{expr}\":\nValue does not fit in {bits} bits: 0x{val:>04x}")
+
+ return val
diff --git a/atk16_asm/asm_ops.py b/atk16_asm/asm_ops.py
index 3198d4c..65cf0da 100644
--- a/atk16_asm/asm_ops.py
+++ b/atk16_asm/asm_ops.py
@@ -124,7 +124,7 @@ def expand_jpr(addr_reg: str) -> ExpandResult:
@register_primitive
def make_jpi(meta: Meta, symbols: Symbols, imm: int | str) -> int:
"""JPI 0110 XXXI IIII IIII"""
- imm_e = eval_expr(symbols, str(imm), bits=9)
+ imm_e = eval_expr(symbols, str(imm), bits=16)
imm_e = imm_e - meta.address - 1
if imm_e < -(2 ** 8) or imm_e >= 2 ** 8:
@@ -157,8 +157,12 @@ def expand_brr(flag_s: str, addr_reg: str) -> ExpandResult:
def make_bri(meta: Meta, symbols: Symbols, flag_s: str, imm: int | str) -> int:
"""BRI 1000 XFFI IIII IIII"""
flag_s_e = eval_expr(symbols, flag_s, bits=2)
- imm_e = eval_expr(symbols, str(imm), bits=9)
+ imm_e = eval_expr(symbols, str(imm), bits=16)
imm_e = imm_e - meta.address - 1
+
+ if imm_e < -(2 ** 8) or imm_e >= 2 ** 8:
+ raise Exception(f"jpi imm value is not representable in 9 bits: {imm_e}")
+
imm_e = imm_e & (0b111111111)
word = (0b1000 << 12) + \
(flag_s_e << 9) + \