24mm13-add3: live per-stage dumps (CIN/COUT/AIN/AOUT); op-A confirmed b=|z| pairs; cascade input is accumulated signed state, NOT exp(scr)
This commit is contained in:
@@ -33,6 +33,10 @@ BP_DIV = 0x1803a06a0
|
||||
BP_DC40 = 0x1800dc40
|
||||
BP_EXPVAR = 0x1802dc0e0
|
||||
BP_FN = 0x180529fe0
|
||||
BP_CIN = 0x180529c60
|
||||
BP_COUT = 0x180529ee1
|
||||
BP_AIN = 0x180016140
|
||||
BP_AOUT = 0x18000332c
|
||||
CTX_SLOTS = {'scr': 0x540628, 'trk': 0x540688, 'cur': 0x540678,
|
||||
'fir_ptr': 0x540668}
|
||||
|
||||
@@ -275,7 +279,9 @@ def main():
|
||||
for name, addr in (('COPY', BP_COPY), ('EXP', BP_EXP), ('DF0', BP_DF0),
|
||||
('DF0RET', BP_DF0RET), ('TRACKSAVE', BP_TRACKSAVE),
|
||||
('DIV', BP_DIV), ('DC40', BP_DC40),
|
||||
('EXPVAR', BP_EXPVAR), ('FN', BP_FN)):
|
||||
('EXPVAR', BP_EXPVAR), ('FN', BP_FN),
|
||||
('CIN', BP_CIN), ('COUT', BP_COUT),
|
||||
('AIN', BP_AIN), ('AOUT', BP_AOUT)):
|
||||
if not mapped(addr):
|
||||
print('!! %s@%#x не смапплен — пропуск' % (nm_ := name, addr), flush=True)
|
||||
continue
|
||||
@@ -292,9 +298,11 @@ def main():
|
||||
|
||||
samples = []
|
||||
hits = {'COPY': 0, 'EXP': 0, 'DF0': 0, 'DF0RET': 0, 'TRACKSAVE': 0,
|
||||
'DIV': 0, 'DC40': 0, 'EXPVAR': 0, 'FN': 0}
|
||||
'DIV': 0, 'DC40': 0, 'EXPVAR': 0, 'FN': 0,
|
||||
'CIN': 0, 'COUT': 0, 'AIN': 0, 'AOUT': 0}
|
||||
track_by_tid = {}
|
||||
track_dumps = []
|
||||
regs_by_tid = {}
|
||||
t_start = time.time()
|
||||
|
||||
def snapshot_slots(rec):
|
||||
@@ -402,6 +410,55 @@ def main():
|
||||
continue
|
||||
if kind == 'DF0':
|
||||
track_by_tid[pid] = regs.rdx
|
||||
if kind in ('CIN','COUT'):
|
||||
key='cin_%d'%pid if kind=='CIN' else 'cout_%d'%pid
|
||||
if kind=='CIN':
|
||||
regs_by_tid[pid]=dict(rdx=regs.rdx,r12=regs.r12,
|
||||
rcx=regs.rcx)
|
||||
rec_s={'kind':kind,'tid':pid,'t':round(time.time()-t_start,4)}
|
||||
try:
|
||||
bp=regs_by_tid.get(pid,{})
|
||||
trk=bp.get('rdx',0)
|
||||
if trk>0x10000:
|
||||
rec_s['trk']=rd_f32(trk,4100)
|
||||
# все кривые bands из таблицы ctx+0x540678 (до 4 полос)
|
||||
for bi in range(4):
|
||||
p=rd_q(ctx+0x540678+8*bi)
|
||||
if p>0x10000:
|
||||
rec_s['bands%d'%bi]=rd_f32(p,2050)
|
||||
except OSError as e:
|
||||
rec_s['err']=str(e)
|
||||
samples.append(rec_s); hits[kind]+=1
|
||||
poke(pid, site, (peek(pid, site) & ~0xFF) | obyte)
|
||||
regs.rip = site
|
||||
setregs(pid, regs)
|
||||
pt(PTRACE_SINGLESTEP, pid, 0, 0)
|
||||
os.waitpid(pid, __WALL)
|
||||
poke(pid, site, (peek(pid, site) & ~0xFF) | 0xCC)
|
||||
pt(PTRACE_CONT, pid, 0, 0)
|
||||
continue
|
||||
if kind in ('AIN','AOUT'):
|
||||
key='a_%d'%pid
|
||||
if kind=='AIN':
|
||||
regs_by_tid[pid]=dict(rcx=regs.rcx,rdx=regs.rdx)
|
||||
rec_s={'kind':kind,'tid':pid,'t':round(time.time()-t_start,4)}
|
||||
try:
|
||||
bp=regs_by_tid.get(pid,{})
|
||||
for nm,kk in (('a',bp.get('rcx',0)),('b',bp.get('rdx',0))):
|
||||
if kk>0x10000:
|
||||
rec_s[nm]=rd_f32(kk,4100)
|
||||
rec_s['n']=regs.r8&0xFFFFFFFF if kind=='AIN' else None
|
||||
except OSError as e:
|
||||
rec_s['err']=str(e)
|
||||
samples.append(rec_s); hits[kind]+=1
|
||||
poke(pid, site, (peek(pid, site) & ~0xFF) | obyte)
|
||||
regs.rip = site
|
||||
setregs(pid, regs)
|
||||
pt(PTRACE_SINGLESTEP, pid, 0, 0)
|
||||
os.waitpid(pid, __WALL)
|
||||
poke(pid, site, (peek(pid, site) & ~0xFF) | 0xCC)
|
||||
pt(PTRACE_CONT, pid, 0, 0)
|
||||
continue
|
||||
if kind == 'DF0RET':
|
||||
tp = track_by_tid.get(pid)
|
||||
rec_r = {'kind': 'DF0RET', 'tid': pid,
|
||||
|
||||
Reference in New Issue
Block a user