【深圳 IO 攻略】第 6 關:調(diào)諧最優(yōu)化引擎

本文首發(fā)于 B 站《深圳 IO》文集(https://www.bilibili.com/read/readlist/rl569860)。原創(chuàng)不易,轉(zhuǎn)載請注明出處。
關卡展示

這一關我們需要參考一下數(shù)據(jù)手冊來決定該如何編寫我們的代碼:

這一頁的核心就一句話:AUDIO_OUT = (AUDIO_IN - 50) × 4 + 50。
然后我們觀察時序圖,發(fā)現(xiàn)當【最優(yōu)化】端口信號為 0 時,我們將聲音信號原樣輸出;而當【最優(yōu)化】端口信號為 100 時,我們需要將聲音信號按照上面的公式進行最優(yōu)化處理后輸出。
首先我們遇到了第一個難題,就是這一關有三個簡單 IO 信號,但是我們的芯片只有兩個 p 口可以使用。這時候,我們發(fā)現(xiàn)【最優(yōu)化】這個端口只有 0 和 100 兩種信號,因此可以用之前提到的 DX-300 轉(zhuǎn)換成 x 口信號,這樣同一塊芯片就能接收 3 個簡單 IO 口的信號了。如圖所示:

因為最優(yōu)化接在 DX-300 的 p2 接口上,DX-300 里的三位數(shù)只有百位會受影響,所以原始的 0/100 信號都會原樣輸出到 MC4000 的 x0 口上。
然后,有了以往的經(jīng)驗后,我們很容易寫出這樣的代碼:

首先使用 tcp 測試指令讓 x0 和 50 比大?。╰cp x0 50)。比 50 小說明最優(yōu)化信號為 0,直接將 p0 的信號原樣輸出給 p1(- mov p0 p1)。比 50 大說明最優(yōu)化信號為 100,需要將 p0 的信號處理后再發(fā)送給 p1。此時,我們將 p0 的值存入 acc(+ mov p0 acc),然后依次進行 -50(+ sub 50),×4(+ mul 4)和 +50(+ add 50)的運算后,將運算后的結(jié)果發(fā)送給 p1(+ mov acc p1)。以上指令執(zhí)行完畢后,休眠一個周期(slp 1),準備進入下一個周期。
一個很容易想到的優(yōu)化方案
有沒有覺得以上算術(shù)過程過于繁瑣?其實數(shù)據(jù)手冊里給我們的公式并沒有化簡到最簡形式。這個公式其實小學生都會化簡:
AUDIO_OUT
= (AUDIO_IN - 50)?×?4 + 50
= AUDIO_IN × 4 - 200 + 50
= AUDIO_IN × 4 - 150
最優(yōu)化的過程只需要乘和減兩步運算就行了,不需要三步運算。因此以上代碼中的
可以縮減為以下兩行:
最終的設計方案如下:

點擊左下角的【模擬】,稍等片刻,便會彈出結(jié)算界面:
