aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2024-02-25 17:51:09 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2024-02-25 17:51:09 +0200
commit3ac72608e8fc708277137fde62193c8763268ff5 (patch)
tree389cb9d26c89ad8a0369213e6d867c5ba51abcc8
parent93c07558e5209d608c6f1d833507db4cb1579ad7 (diff)
Fixes
-rw-r--r--atk16_asm/asm_eval.py1
-rw-r--r--atk16_emu/debugger.py59
2 files changed, 52 insertions, 8 deletions
diff --git a/atk16_asm/asm_eval.py b/atk16_asm/asm_eval.py
index 5a8267c..09c3a75 100644
--- a/atk16_asm/asm_eval.py
+++ b/atk16_asm/asm_eval.py
@@ -1,3 +1,4 @@
+
constants: dict[str, str] = {
# Registers
"RA": "0",
diff --git a/atk16_emu/debugger.py b/atk16_emu/debugger.py
index 86dbcbe..02ea5f5 100644
--- a/atk16_emu/debugger.py
+++ b/atk16_emu/debugger.py
@@ -1,4 +1,6 @@
from getch import getche
+import re
+from typing import Literal
from .emu import Machine
from dataclasses import dataclass
from .colors import C
@@ -20,6 +22,10 @@ def try_parse_num(s: str) -> int | None:
else:
return None
+def without_colors(s: str):
+ ansi_escape = re.compile(r'\x1b\[([0-9A-Za-z]+)(;[0-9A-Za-z]+)*m')
+ return ansi_escape.sub('', s)
+
class Debugger:
HISTORY_MAX_LEN = 1000
@@ -36,6 +42,8 @@ class Debugger:
self.history_cmpl_index = 0
self.history_buffer: list[Machine] = []
+ self.inline_evaled_symbols_enabled: Literal["off", "dec", "hex"] = "off"
+
def load_rom_image(self, rom_image_path: str) -> None:
self.rom_image_path = rom_image_path
with open(rom_image_path, "rb") as f:
@@ -122,6 +130,21 @@ class Debugger:
print()
+ def inline_eval_symbols(self, dbg_text: str, base: Literal["dec", "hex"]) -> str:
+ parts = dbg_text.split(" ")
+ regs = ["RA", "RB", "RC", "RD", "RE", "RF", "RG", "RH"]
+ result_parts = []
+ for part in parts:
+ if part in regs:
+ reg_value = self.machine.__getattribute__(part.lower()).value
+ reg_value = f"0x{reg_value:>04x}" if base == "hex" else str(reg_value)
+ with_value = f"{part} " + C.WARNING + f"[{reg_value}]" + C.ENDC
+ result_parts.append(with_value)
+ else:
+ result_parts.append(part)
+
+ return " ".join(result_parts)
+
def print_pc_context(self):
print(C.UNDERLINE + "Program context" + C.ENDC)
for i in range(-4, 5):
@@ -138,9 +161,18 @@ class Debugger:
if addr in self.dbg_addr_info:
dbg_info = self.dbg_addr_info[addr]
- labels: str = C.OKCYAN + f"[{' '.join(dbg_info.labels)}] " + C.ENDC if len(dbg_info.labels) > 0 else ""
- dbg_text = f"{dbg_info.text:<{self.dbg_text_col_width}}"
+
+ if self.inline_evaled_symbols_enabled != "off" and i == 0:
+ dbg_text = self.inline_eval_symbols(dbg_info.text, base=self.inline_evaled_symbols_enabled)
+ dbg_text_len = len(without_colors(dbg_text))
+ if dbg_text_len < self.dbg_text_col_width:
+ dbg_text += " " * (self.dbg_text_col_width - dbg_text_len)
+ else:
+ dbg_text = f"{dbg_info.text:<{self.dbg_text_col_width}}"
+
dbg_orig = f"{dbg_info.original_text:<{self.dbg_original_text_col_width}}"
+
+ labels: str = C.OKCYAN + f"[{' '.join(dbg_info.labels)}] " + C.ENDC if len(dbg_info.labels) > 0 else ""
print(f" {dbg_text} {dbg_orig} {labels}({dbg_info.src_info})")
else:
print()
@@ -184,9 +216,9 @@ class Debugger:
load_path = self.rom_image_path
self.load_rom_image(load_path)
-
self.reset()
- print("Machine reset.")
+
+ print(C.WARNING + "Machine reset.\n" + C.ENDC)
elif cmd == "r":
if self.time_traveling_enabled:
@@ -218,7 +250,7 @@ class Debugger:
break
if not self.machine.running:
- print(C.FAIL + "Machine halted." + C.ENDC)
+ print(C.FAIL + "Machine halted.\n" + C.ENDC)
elif cmd == "b":
if not self.time_traveling_enabled:
@@ -266,7 +298,7 @@ class Debugger:
self.history_buffer.pop()
if not self.machine.running:
- print(C.FAIL + "Machine halted." + C.ENDC)
+ print(C.FAIL + "Machine halted.\n" + C.ENDC)
continue
if self.time_traveling_enabled:
@@ -275,14 +307,14 @@ class Debugger:
self.machine.step()
if not self.machine.running:
- print(C.FAIL + "Machine halted." + C.ENDC)
+ print(C.FAIL + "Machine halted.\n" + C.ENDC)
elif cmd == "s":
self.machine.print_state_summary()
elif cmd == "0":
self.reset()
- print("Machine reset.")
+ print(C.WARNING + "Machine reset.\n" + C.ENDC)
elif cmd == "t":
self.time_traveling_enabled = not self.time_traveling_enabled
@@ -293,6 +325,16 @@ class Debugger:
print(C.WARNING + f"Time traveling mode: {'on' if self.time_traveling_enabled else 'off'}" + C.ENDC + "\n")
+ elif cmd == "e":
+ if self.inline_evaled_symbols_enabled == "off":
+ self.inline_evaled_symbols_enabled = "dec"
+ elif self.inline_evaled_symbols_enabled == "dec":
+ self.inline_evaled_symbols_enabled = "hex"
+ else:
+ self.inline_evaled_symbols_enabled = "off"
+
+ print(C.WARNING + f"Inline symbol eval: {self.inline_evaled_symbols_enabled}" + C.ENDC + "\n")
+
else:
print(f"Unknown command: {cmd}")
@@ -304,6 +346,7 @@ class Debugger:
print(" b step backward (if in time traveling mode)")
print(" B set or remove breakpoint")
print(" s show state summary")
+ print(" e toggle inline symbol eval on current line")
print(" 0 reset machine state")
print(" l load ROM image and reset machine state")
print(" q quit")