欢迎光临散文网 会员登陆 & 注册

【深圳 IO 攻略】第 22 关:加密货币存储终端

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

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

关卡展示

本关的【读卡器】会不定期地发送一些数据包,有时候是长度为 8 的卡号数据,表示用户插卡;有时候是一个 -1,表示当前已插卡的用户退卡。在用户插着卡时,会塞入一些面值 20/50/100 元的纸币,我们需要记录用户在插卡期间存入了多少金额,并在用户退卡时,向【网络端口】输出长度为 9 的【卡号 + 存钱金额】数据包。

本关因为卡号是 8 位数字,单纯的 acc、dat 寄存器是存不下的。这时候我们必须要借助外部的随机存储器 RAM 来动态存储当前用户的卡号,存钱期间用 acc 寄存器记录存钱金额,等到用户退卡时,我们再从 RAM 中重新把卡号读出来,从 acc 里将存钱金额读出来,一起发送到【网络】端口。电路图和代码如下:

一块芯片写不下所有的逻辑代码,必须分成两块芯片写。左边的 MC6000 用于处理用户插卡时的“记录卡号”和“记录已存金额”两项任务,而当用户退卡时,左边的芯片将当前用户的已存金额发给右边的 MC4000X,委托它将卡号和金额发送给网络端口。


我们先看左边的芯片。第 1~6 行的代码和第 13 关《古钱币付款终端》里统计投入金额的代码是一样的套路,都是为了计算当前用户迄今为止已投入的金额数量,我不再重复阐述。

从第 7 行开始,都是根据从读卡器读到的数字,进行相应的操作。首先,我们将当前时钟周期里读卡器的首数字放入 dat(mov x0 dat),然后判断首数字是 -999、-1 还是非负数(tcp dat -1)。如果是 -999,表示读卡器中暂无数据,直接跳到最后休眠一秒(- jmp e)。如果读卡器是非负数,说明读到了卡号,我们将卡号的每一位数存入 RAM(+ mov dat x2),休眠一秒后继续读取(+ jmp e),直到卡号的所有位数都读取完毕,读卡器中无缓存数据,读到 -999 为止。而当首数字是 -1 时,我们关闭所有的 + - 号指令,跳到第 12 行:我们将当前用户的已存金额发送给右边的芯片(mov acc x3),同时清除 acc 寄存器,准备记录下一个客户的已存金额(sub acc)。做完以上操作后,休眠一秒,进入下一个时钟周期(slp 1)。

现在我们看右边的芯片。右边的芯片用 acc 寄存器表示“上一次读取的卡号是第几位数”。首先等待左边芯片发送退卡信号(slx x3)。等待到了以后,从 RAM 里连续读取数字发往【网络】端口(mov x0 x2)。我们从第 0 位数开始读,当刚刚读的不是第 7 位数时(tcp acc 7),令下一次要读取的位数 +1(- add 1),并跳回到第 2 行继续读(- jmp 2),直到将所有 8 位数都读完后,将左边芯片发来的已存金额数量发给右边的【网络】端口(mov x3 x2),同时将已读位数清零,准备迎接下一次任务(sub acc)。

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


【深圳 IO 攻略】第 22 关:加密货币存储终端的评论 (共 条)

分享到微博请遵守国家法律