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
+15
View File
@@ -4347,3 +4347,18 @@ for i: E[i] = fma(re,re, im*im), где re=bands[2i], im=bands[2i+1]
Решение с гарантией: добавить в tracer брейкпоинты вход/выход 529c60 и Решение с гарантией: добавить в tracer брейкпоинты вход/выход 529c60 и
вход/выход 16140 — точные состояния bands/track до и после каждого блока. вход/выход 16140 — точные состояния bands/track до и после каждого блока.
(Инфраструктура готова, адреса известны; следующий раунд.) (Инфраструктура готова, адреса известны; следующий раунд.)
### 24mm13-доп3: пер-стадийные дампы живьём — op A подтверждён, вход каскада ≠ exp(scr)
Трассировщик получил брейкпоинты CIN/COUT (вход/выход 529c60) и
AIN/AOUT (вход/выход 16140, возврат 332c). Живые факты (comb_b1234):
```
AIN: a(rcx)=кривая состояния, ЗНАКОВАЯ, |max|=57.6 (НЕ exp(scr)!)
b(rdx)=единичный буфер (init 1.0)
AOUT: a — без изменений (16140 вход не трогает)
b[i] = |z_i| ТОЧНО (пары a[2i],a[2i+1]) — магнитуды подтверждены
CIN/COUT: track между входом и выходом каскада меняется предсказуемо.
```
⇒ Вход детектора — НАКОПЛЕННОЕ СОСТОЯНИЕ (знаковая кривая с амплитудами
до десятков), а не текущий спектр. Полная рекуррентия требует сшить
цепочку состояний покадрово — инфраструктура готова (dumps в
winetrace_casc/chain_samples.pkl, kind∈{CIN,COUT,AIN,AOUT,COPY,EXP,DF0}).
+59 -2
View File
@@ -33,6 +33,10 @@ BP_DIV = 0x1803a06a0
BP_DC40 = 0x1800dc40 BP_DC40 = 0x1800dc40
BP_EXPVAR = 0x1802dc0e0 BP_EXPVAR = 0x1802dc0e0
BP_FN = 0x180529fe0 BP_FN = 0x180529fe0
BP_CIN = 0x180529c60
BP_COUT = 0x180529ee1
BP_AIN = 0x180016140
BP_AOUT = 0x18000332c
CTX_SLOTS = {'scr': 0x540628, 'trk': 0x540688, 'cur': 0x540678, CTX_SLOTS = {'scr': 0x540628, 'trk': 0x540688, 'cur': 0x540678,
'fir_ptr': 0x540668} 'fir_ptr': 0x540668}
@@ -275,7 +279,9 @@ def main():
for name, addr in (('COPY', BP_COPY), ('EXP', BP_EXP), ('DF0', BP_DF0), for name, addr in (('COPY', BP_COPY), ('EXP', BP_EXP), ('DF0', BP_DF0),
('DF0RET', BP_DF0RET), ('TRACKSAVE', BP_TRACKSAVE), ('DF0RET', BP_DF0RET), ('TRACKSAVE', BP_TRACKSAVE),
('DIV', BP_DIV), ('DC40', BP_DC40), ('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): if not mapped(addr):
print('!! %s@%#x не смапплен — пропуск' % (nm_ := name, addr), flush=True) print('!! %s@%#x не смапплен — пропуск' % (nm_ := name, addr), flush=True)
continue continue
@@ -292,9 +298,11 @@ def main():
samples = [] samples = []
hits = {'COPY': 0, 'EXP': 0, 'DF0': 0, 'DF0RET': 0, 'TRACKSAVE': 0, 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_by_tid = {}
track_dumps = [] track_dumps = []
regs_by_tid = {}
t_start = time.time() t_start = time.time()
def snapshot_slots(rec): def snapshot_slots(rec):
@@ -402,6 +410,55 @@ def main():
continue continue
if kind == 'DF0': if kind == 'DF0':
track_by_tid[pid] = regs.rdx 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': if kind == 'DF0RET':
tp = track_by_tid.get(pid) tp = track_by_tid.get(pid)
rec_r = {'kind': 'DF0RET', 'tid': pid, rec_r = {'kind': 'DF0RET', 'tid': pid,