Steam游戏:深圳IO
近期,接触到深圳IO这个游戏,在学习深度学习网络的主线任务中开启了汇编语言的支线任务,发现学习下汇编语言还是挺有趣的,而且还挺锻炼编程思维。
身为一个完全没学过嵌入式系统或者汇编语言的小白,目前已经“玩”了 38h,玩到了精确食品称这一关,记录一些理解。
讽刺的是,这个“Shenzhen IO”游戏并不能在国服玩,要注册海外账号才行。
精确食品称功能需求
和我们日常使用的电子秤别无二致,这个秤有“开机”,“关机”,“净重”(去皮)这三个功能。
代码实现
这个设计实现的思路很简单,左边的芯片用来判断目前电子秤的状态,在按下“按钮”后,应该开机(dat置1),还是关机(dat置0),还是纪录皮重,并把目前重量清零(dat置3)。
这个设计确实可以满足需求,但是看下结果,在全球玩家中属于吊车尾的段位。
而看到产品成本最佳是¥5,那毫无疑问:
这个电子秤是可以用一个MC6000实现的!
代码的优化思路
在学习高级语言的时候,往往会应用把多条简单的逻辑组合起来,做很复杂的功能的逻辑,也就是说,有的时候打代码,都可以“不带脑子”,只要按条件,简单粗暴地全部敲完就完事了。
但是这种做法,在汇编这种“低级”语言,往往行不通,主要因为:芯片限制了代码行数,而且汇编语言在嵌套逻辑中的能力,比较高级语言确实非常难用。
起码在深圳IO这个游戏中是这样的,涉及到嵌套逻辑,真的是非常头疼,而高级语言直接多写几层if就行了
所以在用汇编的时候,必须要“带脑子”,在写程序之前就要想好代码如何能做的精简且聪明。而我个人总结的最重要的方法就是:进行条件合并,找到关键条件。
代码优化方法
信号规划
如果只使用一块MC6000芯片,那可以操作的acc必须用来做净重,dat用为记录皮重(输入为毛重)
条件整理
本设计任务的核心重点&难点就在于如何区分“开机”,“关机”,“置零(去皮)”这三个功能。
①开机条件
- 按钮=100
- 重量(毛重)=0
- 皮重=999(开机前的状态必定时关机,关机状态定义为净重=-999)
②关机条件
- 按钮=100
- 重量(毛重)=0
- 皮重=0
③置零条件
- 按钮=100
- 重量(毛重)>0
- 皮重=0(目前皮重还是0,在下一个状态,皮重会等于此时的毛重)
下面开始整理合并,首先,三个功能可以合并成两个,开机和置零本质上是一个状态(开机皮重为0)
接下来,只要从以上条件中,找到最简洁的能区分关机和置零状态的充分条件
就行了。
那就是:
①置零条件
- 重量≠皮重
②关机条件
- 重量=皮重
找到这个条件,就可以构建新的设计了。
设计优化
运行结果,world best design!