欢迎光临散文网 会员登陆 & 注册

【深圳 IO 攻略】第 25 关:肉食打印机

2022-06-08 11:51 作者:ココアお姉ちゃん  | 我要投稿

本文首发于 B 站《深圳 IO》文集(https://www.bilibili.com/read/readlist/rl569860)。原创不易,转载请注明出处。

关卡展示

本关跟第 14 关《三明治合成器》很像,都是通过读取小键盘来给若干输出口输出对应的信号。

首先,【压出机】信号对于三种肉食都是一样的,都是 7 秒钟的 100 信号。只有三个阀的信号是不一样的。

如果我们将阀 0、阀 1、阀 2 依次接到 DX-300 的 p2、p1、p0 口上,那么用 DX-300 的语言描述三种肉食,我们可以得到如下的波形:

  1. 111×1s,0×1s,101×1s,0×1s,101×1s,0×1s,111×1s

  2. 0×1s,10×2s,0×1s,10×2s,0×1s

  3. 11×7s

其中 3 号肉食的波形最简单,可以由主芯片自己完成。而 1 号、2 号肉食的波形较为复杂,主芯片里写不下,需要委托其他的芯片来代为生成波形。电路图和代码如下:

上方的芯片用于生成 1 号肉食的波形,右边的芯片用于生成 2 号肉食的波形,都是硬编码,不再阐述。下方的芯片用于接收小键盘输入及生成 3 号肉食的波形。首先等待小键盘输入(slx x1),然后对该值做三态判断(tcp x1 2)。如果是 1 号肉食,将波形的初值 111 发给上方芯片,委托它去生成 1 号肉食的波形(- mov 111 x0, - jmp 8)。如果是 3 号肉食,则由自身生成时长 7 秒的 11 信号,将初值发给 DX-300(+ mov 11 x2, + jmp 8)。如果是 2 号肉食,则将开头的 1 秒睡眠时长发送给右边的芯片,委托它去生成 2 号肉食的波形(mov 1 x3)。做完以上工作后,生成时长 7 秒的【压出机】信号(mov 100 p1, slp 7),等待阀信号也正确生成后,强制将【压出机】和三个阀信号都清零(mov p1 x2)。

点击左下角的【模拟】,稍等片刻,便会弹出结算界面:

优化成本和代码行数

我们可以将 1 号和 2 号肉食的 7 秒波形存入 ROM 中,然后使用循环结构来大幅减少代码行数。一块 ROM 14 格空间正好可以存下两块肉食,相比于用三块芯片硬编码的设计方案,成本也可以大幅减少。

我们观察一下这个 ROM:地址 7~13 存储的是肉食 1 的 7 秒波形,地址 14~20(即 0~6)存储的是肉食 2 的 7 秒波形。起始地址 = 肉食编号×7。

然后我们来看芯片里的代码。首先等待小键盘的输入(slx x2)并将小键盘的值存入 acc(mov x2 acc),并激活【压出机】信号(mov 100 p1)。如果输入是 3(teq acc 3),那么生成持续 7 秒的 11 阀信号后(+ mov 11 x2, + slp 7),跳到最后强制清除【压出机】和所有的阀信号(mov p1 x3)。如果输入不是 3,那么将输入值乘以 7 后,得到对应肉食波形在 ROM 中的起始地址(- mul 7)。并将 ROM 的地址指针置为该起始地址(- mov acc x1)。接下来,从 ROM 中读取一格波形数据并发送给 DX-300(- mov x0 x3),休眠一秒后(slp 1)检查是否已经读取完毕,地址指针是否到达了 0 或 7(- teq x1 0, - teq x1 7)。如果尚未到达 0 或 7 地址,跳回到第 9 行继续读下一个波形(- jmp 9),直到到达 0 或 7 地址,将 7 秒的波形全部读取并发送完毕后,强制清除【压出机】和所有的阀信号(mov p1 x3)。

成本 ¥14→¥8,代码行数 33→14。

【深圳 IO 攻略】第 25 关:肉食打印机的评论 (共 条)

分享到微博请遵守国家法律