Skip to content

Commit 7a2dac8

Browse files
committed
Fixes, tweaks, z80 linear disassembly in cli
1 parent c918ef1 commit 7a2dac8

File tree

2 files changed

+30
-14
lines changed

2 files changed

+30
-14
lines changed

cli.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import colorama
1616

1717
sys.path.append('..')
18+
import debugger.gdblike as gdblike
1819
import debugger.gdb as gdb
1920
import debugger.utils as utils
2021
import debugger.DebugAdapter as DebugAdapter
@@ -72,11 +73,22 @@ def disasm(data, addr):
7273
if arch == 'z80':
7374
from z80dis import z80
7475
lines = []
75-
while data:
76-
decoded = z80.decode(data, addr)
77-
lines.append(z80.disasm(decoded))
78-
data = data[decoded.len:]
76+
77+
offset = 0
78+
while offset < len(data):
79+
try:
80+
decoded = z80.decode(data[offset:], addr)
81+
except Exception:
82+
break
83+
84+
addrstr = '%s%04X%s' % (GREEN, addr+offset, NORMAL)
85+
bytestr = hexlify(data[offset:offset+decoded.len]).decode('utf-8').ljust(8)
86+
asmstr = z80.disasm(decoded)
87+
lines.append('%s: %s %s' % (addrstr, bytestr, asmstr))
88+
7989
addr += decoded.len
90+
offset += decoded.len
91+
8092
return '\n'.join(lines)
8193
else:
8294
import capstone
@@ -265,9 +277,7 @@ def adjust_ctrl_c():
265277
arg1 = sys.argv[1]
266278
if re.match(r'^.*:\d+$', arg1):
267279
(host, port) = arg1.split(':')
268-
adapter = gdb.DebugAdapterGdb()
269-
adapter.setup()
270-
adapter.connect(host, int(port))
280+
adapter = gdblike.connect_sense(host, int(port))
271281
else:
272282
if '~' in arg1:
273283
arg1 = os.expanduser(arg1)
@@ -405,6 +415,8 @@ def adjust_ctrl_c():
405415
else:
406416
print('unrecognized: %s' % text)
407417

418+
except NotImplementedError:
419+
print('not implemented')
408420
except KeyboardInterrupt as e:
409421
print("ctrl+c detected! breaking in!\n")
410422
break_into()

gdblike.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import socket
99
import binascii
1010
import xml.parsers.expat
11+
import xml.etree.ElementTree as ET
1112

1213
from . import rsp
1314
from . import DebugAdapter
@@ -50,7 +51,7 @@ def connect(host, port):
5051

5152
def connect_sense(address, port):
5253
# connect to gdbserver, sense environment, return appropriate adapter
53-
sock = gdblike.connect(address, port)
54+
sock = connect(address, port)
5455
rsp_conn = rsp.RspConnection(sock)
5556

5657
adapt = None
@@ -69,12 +70,15 @@ def connect_sense(address, port):
6970
if feature_name:
7071
# select adapter type based on feature name
7172
if feature_name == 'mame.z80':
73+
from . import mame_coleco
7274
adapt = mame_coleco.DebugAdapterMameColeco()
73-
elif feature_name == 'com.apple.debugserver.x86_64':
75+
elif feature_name.startswith('com.apple.debugserver'): # eg 'com.apple.debugserver.x86_64'
76+
from . import lldb
7477
adapt = lldb.DebugAdapterLLDB
7578
else:
7679
return None
7780
if not adapt:
81+
# TODO: can we "see" this if we're positioned above?
7882
adapt = gdblike.DebugAdapterGdbLike
7983

8084
adapt.setup()
@@ -83,7 +87,7 @@ def connect_sense(address, port):
8387
return adapt
8488

8589
finally:
86-
if not ok:
90+
if not adapt:
8791
sock.close()
8892

8993
def preexec():
@@ -447,9 +451,9 @@ def handle_stop(self, reason, data):
447451

448452
reply = self.rspConn.tx_rx('?')
449453
context = rsp.packet_T_to_dict(reply)
450-
if not 'thread' in context:
451-
raise DebugAdapter.GeneralError('determing thread responsible for stop')
452-
self.tid = context.get('thread')
454+
#if not 'thread' in context:
455+
# raise DebugAdapter.GeneralError('determing thread responsible for stop')
456+
self.tid = context.get('thread', 0)
453457

454458
def get_remote_file(self, fpath):
455459
#print('get_remote_file(%s)' % fpath)
@@ -633,7 +637,7 @@ def go_generic(self, gotype, handler_async_pkt=None):
633637
# https://sourceware.org/gdb/current/onlinedocs/gdb/Stop-Reply-Packets.html#Stop-Reply-Packets
634638
if reply[0] == 'T':
635639
tdict = rsp.packet_T_to_dict(reply)
636-
self.active_thread_tid = tdict['thread']
640+
self.active_thread_tid = tdict.get('thread', 0)
637641
(reason, reason_data) = self.thread_stop_pkt_to_reason(tdict)
638642

639643
# exit status

0 commit comments

Comments
 (0)