第 64 环 · 删除回执念名字(删掉时说清删的是哪一场)
第 63 环让「删掉第二场」真的删掉了第二场,可回执只说「好,第二场删掉了。」——用户听见一个序号,还得自己回想第二场是哪一场;如果删错了,也听不出来。
这一环让硬件在删除之前,先读这一场自己的名字格,把回执改成「好,<名字>删掉了。」。删掉的是谁,一句话说清。
name_pick 的删除支路多读一格名字。第 63 环取到第 N 条活清单条目后直接排序号回执;这一环先按条目里的槽号算出名字格地址,读完 6 字(24 字节、零填充)再排回执:
0x200 + 槽号×6,6 字读完;名字有效长度取第一个 0 字节之前(最多 12 字节 = 4 个汉字);0x230 对话缓冲区;NP_DELNM(0xF9C 写口)=1 开启;0 仍是第 63 环老语义,老用例可以逐位对表。本圈 OS 在进入删除试验前打开它。活清单:[0xB3 家里的事 / 槽2] [0xB4 跑步计划 / 槽3]
说「删掉第二场」→ 取第 2 条 0xB4 / 槽 3
→ 读名字格 0x200 + 3×6 → 「跑步计划」12 字节
→ 回「好,跑步计划删掉了。」6+12+12 = 30 字节
→ fs_start idx=2 → 删完 NP_CNT=1
说「删掉第一场」→ 取第 1 条 0xB3 / 槽 2
→ 读名字格 0x200 + 2×6 → 「家里的事」12 字节
→ 回「好,家里的事删掉了。」30 字节 → NP_CNT=0
(若复用上一场名字,第二字就会是「跑步」→ 自曝)
软硬接口。NP_DELNM(0xF9C 写)开关;NP_DELNAME(0xF9C 读,bit5=named、bit4:0=len)探针;新观察点 SCREEN40(0xFFC)。前 63 圈地址映射一字不改;ISA 一位没动(还是 npu.name)。
协同仿真 tb_min_soc64:接着第 63 环剩下的两场(0xB3 家里的事 / 0xB4 跑步计划),然后:
0xB4 / 槽3,NP_DELNAMED=1 / NP_DELNLEN=12 / NP_BYTES=30 / NP_DELDONE=1 / NP_CNT=1,0x230 与「好,跑步计划删掉了。」逐字相同;0xB3 / 槽2,回执「好,家里的事删掉了。」30 字节,NP_CNT=0;w1 = 0xB7E88CBC(跑步)vs 0xAEE58CBC(家里)——硬件没有复用上一场的名字;fs_start + fs_idx,与 npu.forget 同一条,核不发第二条指令;NP_DELNAMED=0 / NP_DELNLEN=0。主通路 SCREEN=0xF905FD04、SCREEN2~39 与第 25~63 环逐位一致。单元仿真 tb_name_pick64(名字回执 / 另一场名字 / 越界 / 不是删除 / 序号点选 / 全名 / 空名字 / 空名字格兜底)与协同 tb_min_soc64 通过;tb_name_pick63 / tb_min_soc63 复跑也通过(开关=0 时老语义不变)。
只有一个对话窗口的手机,删除是少见但危险的动作。用户说「删掉第二场」,AI 回「好,跑步计划删掉了。」——这一句话同时完成了执行和确认:用户当场知道删对了没有,不需要再去翻清单。
这也是软硬协同该有的样子:名字不是 UI 层临时拼的字符串,而是会话记忆里的一等公民;删除回执由芯片在删除前读同一格名字、同一拍排字,OS 只把 0x230 这一行搬到屏幕上。
删除可撤回。这一环删对了会说清名字,可一旦删错,名字和上下文就一起没了。下一环让删除先不真删——把整场 K/V + 名字收进「待删区」,给用户一句「删错了还能救回来」的后悔时间。