最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【深圳 IO 攻略】第 18 關:遠程退出開關

2022-06-03 19:17 作者:ココアお姉ちゃん  | 我要投稿

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

關卡展示

本關要求當你收到 C2S-RF901 發(fā)來的數(shù)據(jù)包時,按照如下規(guī)則更新三個電源的開關狀態(tài):

  • -1:保持原始狀態(tài)不變;

  • 0:關閉一個電源,具體關閉的電源由第二個數(shù)決定;

  • 1:開啟一個電源,具體開啟的電源由第二個數(shù)決定。

與此同時,當你 5?秒鐘內(nèi)沒收到任何數(shù)據(jù)包時(包括 -1 保持狀態(tài)的數(shù)據(jù)包也算在內(nèi)),關閉所有電源。

這一關我們很容易想到將置位指令和 DX-300 結(jié)合使用。我們將電源 0~2 分別和 DX-300 的 p0~p2 口相連,用芯片中的 acc 寄存器記錄實時的電源狀態(tài)。然后:當我們收到 -1 數(shù)據(jù)包時,不做任何操作;當我們收到以 0 開頭的數(shù)據(jù)包時,將第二個數(shù)所指示的位數(shù)置 0,并將新的 acc 值發(fā)送給 DX-300;當我們收到以 1 開頭的數(shù)據(jù)包時,將第二個數(shù)所指示的位數(shù)置 1,并將新的 acc 值發(fā)送給 DX-300。

可問題在于另一條需求:5?秒鐘沒收到數(shù)據(jù)包時要將所有電源關閉??晌覀兊?acc 已經(jīng)被占用了,dat 又不能做數(shù)學運算,那我該拿什么玩意來計時呢?

其實,計時這方面,我們并不需要 acc 寄存器所支持的所有數(shù)學運算。我們只需要兩種運算:加一和歸零。說到這里,不知道讀者有沒有一種靈機一動的感覺:上一節(jié)提到的 ROM 和 RAM,讀數(shù)據(jù)口時地址值會自增!因此,我們完全可以用 ROM 來實現(xiàn)計時功能!

我們用這樣的方法來操作 ROM:

  • 將 ROM 的 4?號地址空間寫上 -1(作為關閉所有電源的信號),其余位置保持 0;

  • 收到數(shù)據(jù)包時,將 ROM 的地址值?0(相當于讓計時器歸零)

  • 沒有收到數(shù)據(jù)包時,讀一下 ROM 的數(shù)據(jù)口,此時地址值會自己 +1(相當于計時器 +1)。如果讀到的數(shù)值是 0,那么就維持現(xiàn)狀;若讀到了 -1,那么就給 DX-300 賦 0,關閉所有的電源。

為什么要在 ROM 的 4?號地址空間里寫 -1 呢?因為收到數(shù)據(jù)包的時候,我們要將地址值置 0,相當于讓計時器回到“第 0 秒”。而我們選擇在“第 5?秒”時關閉,讀第 4 秒的數(shù)據(jù)時,計時器自增 1 就正好到達了第 5 秒,而我們讀到的卻仍然是“上一秒”的值。所以我們要“提前預判”,在讀第 4 秒的時候就要告知我們的芯片,該關閉全部電源了。

這樣,我們就成功借助了 ROM 實現(xiàn)了“第二個 acc”用于計時。電路圖和代碼如下:

首先我們將當前時鐘周期里的首數(shù)字讀入 dat 暫存(mov x1?dat)。然后我們判斷首數(shù)字到底是 -999 還是 -1、0、1(tcp dat -2)。如果是 -999,那么讀一次 ROM 的數(shù)據(jù)口,令地址值自增 1,相當于計了 1 秒鐘(- tcp x2?0)。如果讀到了小于 0 的值,那么就說明是時候關閉所有的電源信號了,將 acc 歸零,同時將 DX-300 連接的三個電源輸出也都全部歸零(- mov 0 x0, - mov 0 acc)。回到開頭,如果讀到的首數(shù)字不是 -999,那么首先將 ROM 的地址值歸零,相當于將計時器歸零(+ mov 0 x3)。然后進一步判斷首數(shù)字到底是 -1 還是另兩種值。如果首數(shù)字是 -1,則我們只把計時器清零,不對 acc 的值做任何改變。如果首數(shù)字是 0(teq dat 0),那么讀入第二個數(shù)字,并將 acc 對應位置(0:個位,1:十位,2:百位)上的數(shù)字置為 0(+ dst x1 0);如果首數(shù)字是 1(teq dat 1),那么讀入第二個數(shù)字,并將 acc 對應位置上的數(shù)字置為 1(+ dst x1?1)。操作完畢后,將當前的 acc 發(fā)送給 DX-300(mov acc x0),然后休眠一秒(slp 1),進入下一個機器周期。

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

優(yōu)化電量和代碼行數(shù)

注意我提到的以上解釋說明中的這一部分:

如果首數(shù)字是 0(teq dat 0),那么讀入第二個數(shù)字,并將 acc 對應位置(0:個位,1:十位,2:百位)上的數(shù)字置為 0(+ dst x1?0);

如果首數(shù)字是 1(teq dat 1),那么讀入第二個數(shù)字,并將 acc 對應位置上的數(shù)字置為 1(+ dst x1?1)。

首數(shù)字是 0 時將對應位置 0,首數(shù)字是 1 時將對應位置 1。發(fā)現(xiàn)了沒?這兩句話可以合并成“當首數(shù)字 >-1 時,將對應位置修改成這個首數(shù)字”!我們的代碼也可以相應地化簡,不需要依次判斷 dat 是否為 0 和 1 了,只需要判斷 dat 是否大于 -1,滿足條件時將 dst 指令中的第二個操作數(shù)改成 dat 就行了。于是我們將代碼改成了下面這樣:

最終的三項指標為:成本 ¥8,電量 287(比歷史最佳減少了 147 格電),代碼行數(shù) 10(比歷史最佳減少了 1 行代碼)

甚至我們將 mov acc x2 這條指令也加上了 + 號。只有當 acc 的值變化了的時候才需要傳給 DX-300,平時沒有變化的時候完全不需要反復傳同樣的信號。

進一步優(yōu)化電量和代碼行數(shù)

依然是利用那個“讀只寫 p 口,或連接著這些 p 口的 DX-300 時,會得到立即數(shù) 0,同時清零這些 p 口,一舉兩得”的技巧,我們將第 4 行和第 5 行的

兩行代碼合并成下面一行代碼:

最終的三項指標為:成本 ¥8,電量 286(比歷史最佳少了 1 格電),代碼行數(shù) 9(比歷史最佳少了 1 行代碼)

碎碎念

雖然壓縮到了 9 行代碼,最終也只用了 4 個 x 口,但因為用到了 dat 寄存器,所以這塊 MC6000 無法替換成只有四個 x 口的 MC4000X 芯片,成本是降不下來的……

【深圳 IO 攻略】第 18 關:遠程退出開關的評論 (共 條)

分享到微博請遵守國家法律
庄浪县| 博客| 高碑店市| 托里县| 增城市| 淮滨县| 辛集市| 乌什县| 镇赉县| 延安市| 桐梓县| 尼勒克县| 安福县| 宝山区| 武隆县| 衡水市| 威远县| 朔州市| 江口县| 克拉玛依市| 云龙县| 峨山| 蛟河市| 思南县| 德州市| 鹤峰县| 通山县| 任丘市| 安溪县| 涞源县| 焦作市| 塔河县| 义乌市| 鹤山市| 石狮市| 闵行区| 景德镇市| 柯坪县| 石家庄市| 阳江市| 四川省|