aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2023-04-09 19:50:43 +0300
committerJan Tuomi <jans.tuomi@gmail.com>2023-04-09 19:50:43 +0300
commita58375eee5d607fbb44620752195eafb9407685e (patch)
tree975650c219cfa49dad2c227adf577f7bf1fbb2f5
parentcdbb38ddd23c9f14efefd2ae11b04dbe965b3540 (diff)
Fix relative addressing off-by-one bug
-rw-r--r--digital/atk16_mem.dig4
-rwxr-xr-xsrc/assembler.py4
-rw-r--r--src/test.atk166
3 files changed, 6 insertions, 8 deletions
diff --git a/digital/atk16_mem.dig b/digital/atk16_mem.dig
index c5ce679..e3f3bc2 100644
--- a/digital/atk16_mem.dig
+++ b/digital/atk16_mem.dig
@@ -67,8 +67,8 @@
</entry>
<entry>
<string>Data</string>
- <data>4203,5040,8000,420a,4414,650,4802,2900,38c0,12c0,441e,4810,651
-,7500,4202,f000,4201,f000</data>
+ <data>6001,8000,420a,4414,650,4801,2900,38c0,12c0,441e,651,8402,4202
+,f000,4201,f000</data>
</entry>
</elementAttributes>
<pos x="740" y="100"/>
diff --git a/src/assembler.py b/src/assembler.py
index 7deb0f0..7420a04 100755
--- a/src/assembler.py
+++ b/src/assembler.py
@@ -174,7 +174,7 @@ def make_jpr(addr_reg: str) -> list[int]:
def make_jpi(address: int, imm: str) -> list[int]:
"""JPI 0110 XXXI IIII IIII"""
imm_e = eval_expr(imm)
- imm_e -= address
+ imm_e = imm_e - address - 1
word = (0b0110 << 12) + \
imm_e
return [word]
@@ -192,7 +192,7 @@ def make_bri(address: int, flag_s: str, imm: str) -> list[int]:
"""BRI 1000 XFFI IIII IIII"""
flag_s_e = eval_expr(flag_s)
imm_e = eval_expr(imm)
- imm_e -= address
+ imm_e = imm_e - address - 1
word = (0b1000 << 12) + \
(flag_s_e << 9) + \
imm_e
diff --git a/src/test.atk16 b/src/test.atk16
index da7c7c8..1a7c773 100644
--- a/src/test.atk16
+++ b/src/test.atk16
@@ -2,8 +2,7 @@
; ROM (and program execution) starts at offset 0x0
@address 0x0
- ldi RA program
- jpr RA
+ jpi program
@label ram_offset
0x8000 ; store ram offset for later memory access
@@ -20,9 +19,8 @@
; Check that 10 + 20 = 30
mov RC RA ; RA := result of sum
ldi RB 30 ; RB := 30
- ldi RD success
sub RA RB RC ; RC := RA - RB
- br f_zero RD ; if result is zero, jump to success
+ bri f_zero success ; if result is zero, jump to success
ldi RA 2 ; RA := 2 to signal failure
hlt