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:
parent
8ff45a70df
commit
0c3adce89d
|
@ -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 = ''
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user