diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2024-05-16 18:59:53 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2024-05-16 18:59:53 +0300 |
| commit | 9a3e2a3d05fc0b6bd0a847e29da0a87934f5a743 (patch) | |
| tree | 9b8cd310e4b5fe79d3eacfdb284992ae0023bf7e /atk16_asm | |
| parent | 1045229da08fc1c8168b5ae58d54a1566eefaaac (diff) | |
Fix another jump issue in assembler, improve monitor
Diffstat (limited to 'atk16_asm')
| -rw-r--r-- | atk16_asm/asm_eval.py | 13 | ||||
| -rw-r--r-- | atk16_asm/asm_ops.py | 8 |
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) + \ |
