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:
2026-08-26 15:46:31 +03:00
parent f68081f694
commit b6e7fdc289
2 changed files with 74 additions and 2 deletions
+59 -2
View File
@@ -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,