【深圳 IO 攻略】第 20 關(guān):袖珍易經(jīng)預(yù)測(cè)儀

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

本關(guān)要求當(dāng)出現(xiàn)【按鈕】信號(hào)時(shí),讀取【預(yù)測(cè)符】里接下來 6 個(gè)時(shí)鐘周期的信號(hào),并將最終的占卜結(jié)果寫到顯示屏上?!绢A(yù)測(cè)符】里的 6 個(gè)時(shí)鐘周期的信號(hào)依次對(duì)應(yīng)顯示屏上從下到上的正方形是否點(diǎn)亮,100 為點(diǎn)亮,0 為熄滅。
這一關(guān)不算太難,我們用兩個(gè) DX-300 連接右邊的顯示屏,然后用位運(yùn)算生成兩個(gè)三位數(shù),等兩個(gè)三位數(shù)都正確生成后,同時(shí)發(fā)給兩個(gè) DX-300 即可。電路圖和代碼如下:


我們首先將占卜信號(hào)用 DX-300 轉(zhuǎn)換一下,將 0/100 信號(hào)轉(zhuǎn)換成 0/1 信號(hào),以方便后續(xù)使用置位指令將對(duì)應(yīng)位置成 0 或 1。
這里,我們使用 dat 寄存器來存儲(chǔ)前 3 個(gè)占卜信號(hào)的 DX-300 值。但是當(dāng)前 3 個(gè)占卜信號(hào)還沒有出現(xiàn)時(shí),我們要把什么值放到 dat 里呢?0 顯然不行,因?yàn)橥耆赡艹霈F(xiàn)前三個(gè)都是關(guān)閉的 000 信號(hào),當(dāng) dat 是 0 時(shí),你根本無法分辨目前是“尚未收到前 3 個(gè)信號(hào)”還是“前 3 個(gè)信號(hào)都是 0”。所以我們必須要選擇一個(gè)和 DX-300 的 8 種三位數(shù)完全不一樣的數(shù)字,定義為“尚未收到前 3 個(gè)信號(hào)”。這里我們選擇了 999。
那么我們現(xiàn)在來看程序。首先我們判斷當(dāng)前的按鈕信號(hào)是不是大于 0(tcp p0 0)。如果按鈕信號(hào)為 0,不執(zhí)行任何操作,關(guān)閉一切 + - 前綴指令,直接跳到最后休眠(slp 1)。當(dāng)按鈕信號(hào)為 100 時(shí),我們先將 dat 初始化為 999,表示“正在等待前 3 格信號(hào)”(+ mov 999 dat)。然后,我們?cè)诮酉聛淼?3 個(gè)周期里,根據(jù)轉(zhuǎn)換后的 0/1 占卜信號(hào),將 acc 的個(gè)位、十位、百位依次設(shè)為 0/1(+ dst 0 x0, + slp 1, + dst 1 x0, + slp 1, + dst 2 x0)。設(shè)置完畢后,判斷 dat 是否是 999(+ teq dat 999)。目前很明顯是 999,那么我們將 acc 里表示的前 3 格的狀態(tài)值存入 dat(+ mov acc dat),休眠一秒后(+ slp 1)回到第 3 行(+ jmp 3),繼續(xù)設(shè)置后 3 格的狀態(tài)。等再次到達(dá)第 8 行時(shí),dat 已經(jīng)不再是 999,那么說明 6 格狀態(tài)全部設(shè)置完畢,我們將前 3 格和后 3 格的狀態(tài)值依次發(fā)給兩個(gè) DX-300,更新顯示屏的占卜狀態(tài)(- mov dat x2, - mov acc x3)。做完以上操作后,休眠一秒,等待下一次占卜任務(wù)(slp 1)。
點(diǎn)擊左下角的【模擬】,稍等片刻,便會(huì)彈出結(jié)算界面:

優(yōu)化代碼行數(shù)
第八行 + teq dat 999 后,我們將“不成立”的邏輯寫在前面,“成立”的邏輯寫在后面。代碼就變成了下面這樣:
然后我們驚奇地發(fā)現(xiàn),第 12?行的?+ slp 1 和第 14?行的 slp 1 可以合并,最終代碼變成下面的樣子:
