第 75 环 · 余场翻页(「还有呢」接着念剩下的场)
第 74 环让「那两场呢?」有了答案,可一页最多念三场,第四场以后只用一个「等」字带过。用户听完自然接一句「还有呢?」——软件仍得自己记住念到哪、重新扫清单、跳过已念过的场、再拼一句。
这一环把「翻页」接住:同一条 npu.rem 引擎带着跨页状态,cont=1 从上次停下的地方接着念;第二页起句首改成「接着还有」,页末如实报「还剩几场」;全念完后再问,就回一句「都念完了。」
引擎里加一张 16 位「处理过」位图 pg_mask。按清单条目号置位(不是槽号——槽会被复用),念过的场、归属对不上的场、名字格全 0 的场都标为已处理。续页重扫清单时,已处理的条目直接跳过,不会重复念,也不会被一个念不出名字的场永远卡住。
页状态留在片上。pg_page / pg_left / pg_tspoke / pg_finished / pg_cur:页号、本页后还剩几场、累计念了几场、是否已念完、这一串问句锚定的当前会话号。新问句(cont=0)全部清零;续页时若当前场换了,也按新问句重来,不拿旧页上下文。
句子换头、尾巴按剩余量决定。第一页「还有」,第二页起「接着还有」12 字节;名字之间仍是「、」,一页最多三个名字;本页后还有能念的场就补「等。」,否则只补「。」。最长 12 + 3×(3+12) + 6 = 63 字节,仍塞得进 64 字节一行。
退路多一条。续页时已经没有可念的场 →「都念完了。」15 字节(ok=0 / err=1),不再重复名字;第 74 环的两条退路(「没有别的场了。」/「还有N场,没起名字。」)原样保留。
ISA 再省一条。新增 npu.rem.next(custom-2 funct3=101,机器码 0x0000505B),与 npu.rem 共用同一条引擎;前 74 圈编码与地址映射一位不动。MMIO 侧新页 0xB00:RP_NEXT 续页、RP_RST2 清翻页状态、SCREEN51,只读 RP_PAGE / RP_LEFT / RP_TSPOKE / RP_CONTUSED / RP_FINISHED。
单元 tb_rem_pick75(真同步 SRAM 模型,八场、当前 slot0 0xA1):
page=0 / pg_left=4 / pg_tspoke=3;page=1 / pg_left=1 / pg_tspoke=6 / contused=1;page=2 / pg_left=0 / pg_tspoke=7 / finished=1;ok=0 / err=1,一个名字都不重复;cont=0 清零重来;cont=1 但当前场换成 0xBB → 按新问句从第 0 页重来;ISA 协同 tb_isa_greet75(真整颗 SoC,五场目录、当前 0xA3):
一条 npu.rem → 0x1E0「还有记一笔、工作那场、跑步计划等。」51 字节
SCREEN50 = 0x00701540
一条 npu.rem.next → 0x1E0「接着还有读论文。」24 字节
page=1 / left=0 / tspoke=4 / cont=1 / finished=1
再一条 npu.rem.next → 0x1E0「都念完了。」15 字节,页号停在 1、累计仍 4
SCREEN51 = 0x104C4130 / SCREEN = 0x75
回归:tb_rem_pick74、tb_isa_greet74、tb_isa_greet73、tb_riscv_core、tb_boot_greet73 全部 PASS;第 74 环「那几场呢」与开机问候路径一个字没漂。
pg_left 只数「还没处理的余场」,不能沿用 nothers - nspoken:否则归属不符/空名字的场会让翻页永远翻不完;pg_left != 0,不能只看「本页念满三场」;SCREEN50 的偏移是 8(a6) 不是 4(a6)——0xAF4 是 RP_DONE,写错会把完成位当屏幕摘要;翻页之后,用户听完第二页想选其中一场,只能说全名。下一环让每页的名字带上序号:念「第二个」就能切到本页第二场,把「念清单」接成「点清单」。