1
0
mirror of https://github.com/mnaberez/py65.git synced 2024-06-10 02:29:29 +00:00

Support for relative mem/disassembly/fill ranges

This commit is contained in:
Patrick Surry 2023-07-24 16:19:18 -04:00
parent 8ff45a70df
commit 0c3adce89d
2 changed files with 21 additions and 18 deletions

View File

@ -435,16 +435,11 @@ class Monitor(cmd.Cmd):
self.stdout.write("\r$%s ?Syntax\n" % addr)
def do_disassemble(self, args):
splitted = shlex.split(args)
if len(splitted) != 1:
split = shlex.split(args)
if len(split) != 1:
return self.help_disassemble()
address_parts = splitted[0].split(":")
start = self._address_parser.number(address_parts[0])
if len(address_parts) > 1:
end = self._address_parser.number(address_parts[1])
else:
end = start
start, end = self._address_parser.range(split[0], self._mpu.pc, False)
max_address = (2 ** self._mpu.ADDR_WIDTH) - 1
cur_address = start
@ -784,7 +779,7 @@ class Monitor(cmd.Cmd):
return self.help_fill()
try:
start, end = self._address_parser.range(split[0])
start, end = self._address_parser.range(split[0], self._mpu.pc)
filler = []
for piece in split[1:]:
value = self._address_parser.number(piece)
@ -831,7 +826,7 @@ class Monitor(cmd.Cmd):
if len(split) != 1:
return self.help_mem()
start, end = self._address_parser.range(split[0])
start, end = self._address_parser.range(split[0], self._mpu.pc)
line = self.addrFmt % start + ":"
chrs = ''

View File

@ -84,17 +84,25 @@ class AddressParser(object):
except ValueError:
raise KeyError("Label not found: %s" % num)
def range(self, addresses):
"""Parse a string containing an address or a range of addresses
into a tuple of (start address, end address)
def range(self, addresses, default_start=0, no_wrap=True):
"""
matches = re.match('^([^:,]+)\s*[:,]+\s*([^:,]+)$', addresses)
if matches:
start, end = map(self.number, matches.groups(0))
Parse a string containing an address or a range of addresses
into a tuple of (start address, end address).
Start should be an address, label or empty implying default, e.g. _mpu.pc
A singleton implies a single byte.
A range specified with : or , extends to the end address or label
A range specified with / interprets end as an offset from start
"""
# split and keep delim, e.g. 123+456 => ['123', '+', '456']
parts = re.split(r'([:,/])', addresses.strip())
start = self.number(parts[0]) if parts[0] else default_start
if len(parts) >= 3:
v = self.number(parts[2])
end = start + max(0, v-1) if parts[1] == '/' else v
else:
start = end = self.number(addresses)
end = start
if start > end:
if no_wrap and start > end:
start, end = end, start
return (start, end)