【深圳 IO 攻略】第 6 关:调谐最优化引擎

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

这一关我们需要参考一下数据手册来决定该如何编写我们的代码:

这一页的核心就一句话:AUDIO_OUT = (AUDIO_IN - 50) × 4 + 50。
然后我们观察时序图,发现当【最优化】端口信号为 0 时,我们将声音信号原样输出;而当【最优化】端口信号为 100 时,我们需要将声音信号按照上面的公式进行最优化处理后输出。
首先我们遇到了第一个难题,就是这一关有三个简单 IO 信号,但是我们的芯片只有两个 p 口可以使用。这时候,我们发现【最优化】这个端口只有 0 和 100 两种信号,因此可以用之前提到的 DX-300 转换成 x 口信号,这样同一块芯片就能接收 3 个简单 IO 口的信号了。如图所示:

因为最优化接在 DX-300 的 p2 接口上,DX-300 里的三位数只有百位会受影响,所以原始的 0/100 信号都会原样输出到 MC4000 的 x0 口上。
然后,有了以往的经验后,我们很容易写出这样的代码:

首先使用 tcp 测试指令让 x0 和 50 比大小(tcp x0 50)。比 50 小说明最优化信号为 0,直接将 p0 的信号原样输出给 p1(- mov p0 p1)。比 50 大说明最优化信号为 100,需要将 p0 的信号处理后再发送给 p1。此时,我们将 p0 的值存入 acc(+ mov p0 acc),然后依次进行 -50(+ sub 50),×4(+ mul 4)和 +50(+ add 50)的运算后,将运算后的结果发送给 p1(+ mov acc p1)。以上指令执行完毕后,休眠一个周期(slp 1),准备进入下一个周期。
一个很容易想到的优化方案
有没有觉得以上算术过程过于繁琐?其实数据手册里给我们的公式并没有化简到最简形式。这个公式其实小学生都会化简:
AUDIO_OUT
= (AUDIO_IN - 50) × 4 + 50
= AUDIO_IN × 4 - 200 + 50
= AUDIO_IN × 4 - 150
最优化的过程只需要乘和减两步运算就行了,不需要三步运算。因此以上代码中的
可以缩减为以下两行:
最终的设计方案如下:

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