Skip to content

Commit f583d1e

Browse files
Merge pull request #4 from scopeInfinity/jmp_instructions
Support ALU constant-read, LOAD and STORE instructions
2 parents 7982860 + 2db43b4 commit f583d1e

File tree

13 files changed

+441
-227
lines changed

13 files changed

+441
-227
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ clean:
1010
include emulator/Makefile.mk
1111

1212
pytest:
13-
pytest -s
13+
pytest -s --log-cli-level=DEBUG
1414

1515
test: pytest test_verilog_modules
1616

planner/asm/line_parser.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
from enum import Enum
2-
import re
31
from typing import List, Tuple, Optional
42
from planner import unit, util
53

6-
4+
def address_of(op: unit.Operand):
5+
if op == unit.Operand.CONSTANT:
6+
return unit.Operand.ADDRESS
7+
if op == unit.Operand.ADDRESS:
8+
return unit.Operand.DADDRESS
9+
raise AssertionError("can't take address of %s" % op)
710

811
def parse_line(line: str) -> Tuple[Optional[str], Optional[List[Tuple[unit.Operand, unit.LazyLabel]]]]:
912
try:
@@ -28,16 +31,20 @@ def parse_line(line: str) -> Tuple[Optional[str], Optional[List[Tuple[unit.Opera
2831
op = op.strip()
2932
if len(op) == 0:
3033
raise ValueError("no-length operand found in %s" % line)
34+
optype = unit.Operand.CONSTANT
35+
if op.startswith("[") and op.endswith("]"):
36+
optype = address_of(optype)
37+
op = op[1:-1].strip()
38+
if op.startswith("[") and op.endswith("]"):
39+
optype = address_of(optype)
40+
op = op[1:-1].strip()
41+
3142
if op.startswith("R"):
3243
if len(op) != 2 or op[1] not in "0123456789":
3344
raise ValueError("Invalid mem-register {op} provided, only R0..R9 supported.")
34-
optype = unit.Operand.ADDRESS
35-
op = op[1:]
36-
elif op.startswith("[") and op.endswith("]"):
37-
optype = unit.Operand.ADDRESS
38-
op = op[1:-1].strip()
39-
else:
40-
optype = unit.Operand.CONSTANT
45+
optype = address_of(optype)
46+
op = str(int(op[1:])*4)
47+
4148
try:
4249
value = unit.LazyLabel(util.LABEL_CONSTANT, int(op, 0)) # automatically understand base-10 and base-16
4350
except ValueError as e:

planner/asm/line_parser_test.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,14 @@ def test_parse_line_success(self):
3030
(unit.Operand.ADDRESS, 22),
3131
(unit.Operand.ADDRESS, 15)])
3232

33+
name, tokens = line_parser.parse_line("load [ 0x16 ] , [[15 ]]")
34+
self.assertEqual(name, "LOAD")
35+
self.assertEqual(tokens, [
36+
(unit.Operand.ADDRESS, 22),
37+
(unit.Operand.DADDRESS, 15)])
38+
3339
def test_parse_line_failures(self):
3440
with self.assertRaises(ValueError):
3541
line_parser.parse_line("mov [10],, [20]")
36-
with self.assertRaises(ValueError):
37-
line_parser.parse_line("mov [10], [[20]]")
3842
with self.assertRaises(ValueError):
3943
line_parser.parse_line("mov 10 10")

planner/asm/program_parser.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ def parse_data(self, tokens: List[str]):
149149
sz = 1
150150
elif tokens[1] == "dw":
151151
sz = 2
152+
elif tokens[1] == "dd":
153+
sz = 4
152154
else:
153155
raise ValueError("unsupported data size provided")
154156

@@ -157,7 +159,7 @@ def parse_data(self, tokens: List[str]):
157159
assert val >= 0 and val < (2**(8*sz))
158160

159161
for _ in range(times):
160-
for byte in val.to_bytes(sz, 'big'):
162+
for byte in val.to_bytes(sz, 'little'):
161163
self.add_data(unit.Data(byte))
162164

163165
def parse_bss(self, tokens: List[str]):

planner/asm/program_parser_test.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
movc R3, 1
1616
loop:
1717
cmp R1, R2
18-
jeq loop_exit
18+
jz loop_exit
1919
add R1, R3
2020
mov [last_value], R1
2121
out 0x00, R1
@@ -26,6 +26,9 @@
2626
section .data
2727
last_value db 0
2828
29+
section .bss
30+
no_use: resb 32
31+
2932
""".splitlines()
3033

3134
class AsmParserTest(TestCase):

0 commit comments

Comments
 (0)