aboutsummaryrefslogtreecommitdiffstats
path: root/resources/asm/ext_string_io.py
blob: e00ac78fd1d6f335b5313c61b5ed4651dd204d0e (plain)
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
from atk16_asm.asm_ops 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,
}