第 73 环 · 单名问候带余场(「查资料,还有两场在等你」)
第 72 环把单名问候的名字验准了:归属对上才念「查资料,接着聊吧。」可这句话只说了一场。清单里另外两场明明还在,开机第一句却像今天只剩这一场。
这一环只扩一句尾巴:名字验过之后,若清单里还有别的场,就把「,还有N场在等你。」接在名字后面。既叫对人,也把今天还剩几场说清楚。只有这一场时,仍保留第 57 环老句,一字不改。
在单名入口上加一个余场判断。boot_greet 在第 72 环的归属比对通过后,看输入 cnt(清单里活着的会话数):
cnt > 1 → 置 squeue=1、rem=cnt-1,名字后面接 「,还有N场在等你。」27 字节;cnt == 1 → squeue=0 / rem=0,仍走第 57 环「,接着聊吧。」18 字节;rem/squeue 一并归零,旧名字一个字不出现。数字也按中文量词写。新尾巴里的 N 用「一 / 两 / 三 / 四 / 五」,走独立的 qnum_byte,所以第二场是「两场」,不是「二场」。
整行按 64 字节排。名字最长 24 字节,加 27 字节尾巴已超过 48 字节,因此带余场时改用第 58 环的 64 字节通路:补空格到 63、打包 16 字、连写 16 拍落 0x1E0。cnt=1 的老句仍走 48 字节 / 12 字老路。
新增证据。boot_greet 多两个探针输出 rem[3:0] 与 squeue;SoC 新增只读屏摘要 SCREEN49(0xAEC):rem<<20 | squeue<<16 | sbind<<15 | named<<14 | bytes。前 72 圈地址映射一字不改,ISA 一位没动(仍 npu.boot)。
单元仿真 tb_boot_greet73(真同步 SRAM 行为模型):
cnt=3 / 槽 2「查资料」归属 0xA3 →「查资料,还有两场在等你。」64 字节 / 16 字逐位,rem=2 / squeue=1 / sbind=1 / nver=1;cnt=1 →「查资料,接着聊吧。」48 字节,rem=0 / squeue=0,老句不推翻;cnt=2 →「还有一场在等你。」rem=1;cnt=6 →「还有五场在等你。」rem=5,量词与上限都对;0xAA → 退回「你有三场没聊完。」24 字节,rem=0 / squeue=0,「查资料」一个字节都不出现;clear 后 rem/squeue 一并归零。ISA 协同仿真 tb_isa_greet73(真整颗 SoC):目录三场 0xA1(slot0) / 0xA2(slot1) / 0xA3(slot2),最后一场 0xA3 住 slot2;slot2 名字格「查资料」,归属 0x282 = 0xA3(这一场自己的名字)。开机前 BG_ALL=0,一条 npu.boot 跑完恢复与单名问候:
0x1E0 =「查资料,还有两场在等你。」64 字节 / 16 字逐位相同,行尾补空格;BG_NAMED=1 / BG_BYTES=64 / BG_SBIND=1 / BG_SQUEUE=1 / BG_REM=2,全由硬件自报;SCREEN49 = 0x0021C040(rem 2 | queue 1 | bind 1 | named 1 | bytes 64),SCREEN=0x73;npu.wait 没冻死。回归:tb_boot_greet(第 53 环按场数)、tb_boot_greet58(第 58 环念清单)、tb_boot_greet71(第 71 环归属)、tb_boot_greet72(第 72 环单名归属)、tb_isa_greet72 全 RESULT=PASS。第 57 环老句的单名用例按新契约把场数设为 1,继续验「老句不推翻」;tb_min_soc64 的 R57 快照同步为带余场整行,复跑 PASS,主通路 SCREEN=0xF905FD04 与第 25~72 环逐位一致。
只有一个对话窗口的手机,开机第一句就是它唯一的人味。叫对名字是尊重,说清「还有两场在等你」是体贴——不让用户以为过去都被抹掉了。
软硬协同的分寸仍然没变:清单在内存里,名字与归属在内存里,余场判断和整句排版在硬件里;核不查表、不数场、不拼字,一条 npu.boot 就把该叫的人、该交代的场都说全了。
余场点名。开机已经能说「还有两场在等你」,可用户接着问「哪两场?」时,还得自己回去点。下一环让这句余场提示接得住追问:说「那两场呢」,硬件就从活清单里把剩下几场的名字念出来,让开机第一句真正变成一段能继续的对话。