【深圳 IO 攻略】第 2 關(guān):信號(hào)放大器

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


這一關(guān)的要求是將【控制輸入】端口的值擴(kuò)大 2 倍送到【控制輸出】端口中。這一關(guān)我們需要接觸一些新的和算術(shù)有關(guān)的指令:
加法指令:add I/R/P,將 acc 寄存器的值加上【指定的數(shù)/寄存器中的數(shù)/從端口獲得的數(shù)】,并覆蓋 acc 寄存器原始的值。
減法指令:sub I/R/P,將?acc 寄存器的值減去【指定的數(shù)/寄存器中的數(shù)/從端口獲得的數(shù)】,并覆蓋 acc 寄存器原始的值。
乘法指令:mul I/R/P,將?acc 寄存器的值乘以【指定的數(shù)/寄存器中的數(shù)/從端口獲得的數(shù)】,并覆蓋 acc 寄存器原始的值。
遺憾的是,這個(gè)游戲里的 MC 系列芯片沒有提供任何除法指令。
以上算術(shù)指令的計(jì)算結(jié)果限定在 -999~+999 范圍內(nèi)。如果計(jì)算結(jié)果低于下限值,則 acc 會(huì)變?yōu)橄孪拗?-999;如果計(jì)算結(jié)果高于上限值,則 acc 會(huì)變?yōu)樯舷拗?+999。
例如,執(zhí)行以下指令后,acc 寄存器的值會(huì)變成 999 而不是 1000:
那么很明顯,我們這一關(guān)需要把【控制輸入】端口的值讀入 acc,然后執(zhí)行乘法指令將讀入的值 ×2(或者執(zhí)行加法指令加上 acc 自身),再執(zhí)行 mov 指令將處理后的值送入【控制輸出】端口即可。執(zhí)行完以上操作后,需要執(zhí)行 slp 指令休眠一秒,以便進(jìn)入下一個(gè)時(shí)鐘周期。若不執(zhí)行休眠指令,則芯片會(huì)在同一個(gè)時(shí)鐘周期內(nèi)死循環(huán)。
現(xiàn)在我們從元件庫中拖入一塊【MC4000】到開發(fā)板中,將這塊芯片的 p0 口和【控制輸入】端口相連,p1 口和【控制輸出】端口相連,并寫出如下代碼:

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