1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
from asm_ops import *
from ext_std import *
def to_char_code(c: str):
return ord(c)
_counter = 0
def get_unique_name(prefix: str):
global _counter
ret = f"{prefix}_{_counter}"
_counter += 1
return ret
def expand_put_char(cursor_reg: str, scratch_reg: str, c: str) -> ExpandResult:
c = c.strip("\"")
return [
["ldi", str(to_char_code(c)), scratch_reg],
["str", scratch_reg, cursor_reg],
*expand_addi(cursor_reg, "1", cursor_reg),
]
def expand_put_string(cursor_reg: str, scratch_reg: str, *rest: str) -> ExpandResult:
string = " ".join(rest)
string = string.strip("\"")
result: ExpandResult = []
for c in string:
result += expand_put_char(cursor_reg, scratch_reg, c)
return result
def expand_cursor_to_line(cursor_reg: str, line: int) -> ExpandResult:
lbl_data = get_unique_name("cursor_to_line_data")
lbl_jmpover = get_unique_name("cursor_to_line_jmpover")
line_width = 64
return [
["jpi", lbl_jmpover],
["@label", lbl_data],
[f"text_mem + {line} * {line_width}"],
["@label", lbl_jmpover],
["ldi", lbl_data, cursor_reg],
["ldr", cursor_reg, cursor_reg],
]
def expand_new_line(cursor_reg: str) -> ExpandResult:
return [
*expand_slri(cursor_reg, "6", cursor_reg),
*expand_addi(cursor_reg, "1", cursor_reg),
*expand_slli(cursor_reg, "6", cursor_reg),
]
expansions: OpExpansionDict = {
"put_char": expand_put_char,
"cursor_to_line": expand_cursor_to_line,
"put_string": expand_put_string,
"new_line": expand_new_line,
}
|