深圳IO —— 一个汇编编程小游戏

目录

  • 简介
  • 数据手册
    • 接口
      • 简单 I/O
      • XBus
      • 简单 I/O 对比 XBus
    • 语言参考
      • 程序结构
      • 注释
      • 标签
      • 寄存器
        • acc
        • dat
        • p0、p1、x0、x1、x2、x3
        • null 伪寄存器
      • 指令操作数
      • 确保进行足够的睡眠 (slp)!
      • 基本指令
      • 算法指令
      • 条件指令
      • 隐藏指令
  • 游戏界面
  • DIY

版本:


简介

在这里插入图片描述
以下介绍摘自未来软件园
       《深圳IO(SHENZHEN I/O)》是由硬核编程游戏开发商Zachtronics打造一款玩法新颖的模拟+解谜游戏。游戏中玩家需要利用手头的芯片,按照要求条件输出信号,制成一些电器元件产品。由于游戏中的数字都是用十进制存储的,上手相对容易许多,而且为了减少成本和运行功耗,本游戏有极高的重玩价值。《深圳IO(SHENZHEN I/O)》和Zachtronics此前开发的《太空化学》、《无限工厂》、《TIS-100》一样,这款模拟+解谜游戏相信是许多硬核玩家的必备之作。

数据手册

       游戏专门准备了数据手册,属实是震撼到我了
在这里插入图片描述
在这里插入图片描述

接口

       MCxxxx 微型控制器上有两种接口:简单 I/O 接口和 XBus 接口。请注意,它们之间不可交互,只得将同类型的引脚相互连接。

简单 I/O

       简单 I/O 值是从 0 到 100 的连续电平信号。简单 I/O 引脚无标记。
       简单 I/O 用于将微型控制器与按钮、开关或麦克风等简单输入以及 LED、扬声器或电机等简单输出连接起来。
       以上介绍摘自手册
在这里插入图片描述
       说是简单IO,但我觉得和现实中的DACADC更像。

XBus

       XBus 值是一系列不连续数据包,范围在从 -999 到 999 的区间内,包含边界值。XBus 引脚用黄点标记。
       XBus 结构通常用于在两台微型控制器之间传输数据,或也可在一台微型控制器和键盘或数字显示器等复杂输入输出端口间进行传输。
       以上介绍摘自手册
在这里插入图片描述
       就当成一种封装好的协议接口就行,一帧数据范围为 -999 到 999。

简单 I/O 对比 XBus

       以下介绍摘自手册
       可随时对简单 I/O 引脚进行读写,而不需要考虑连接设备的状态。
       与之不同,XBus 采用的是同步协议。只有当一端的读取接口尝试读取,同时另一端的写入接口尝试写入的时候,数据才能通过 XBus 引脚进行传输。如尝试发起读或写操作时,所有连接设备都未能配合进行相应的[写或读]操作,则发起的操作会被阻塞

语言参考

       以下介绍摘自手册
在这里插入图片描述

程序结构

       在 MCxxxx 中,每行程序都必须由以下结构组合而成:
              标签 条件 指令 注释
       所有组成部分都为非必要的可选成分,但必须按照规定顺序(如有)出现。以下几行为正确语法示例:

# 该行是一条注释。
loop: # 循环到 ACC 值为 10teq acc 10
+ jmp endmov 50 x2add 1jmp loop
end:mov 0 acc # 重置计数器

注释

       在“#”符号后直到该行结束的所有文字都会作为注释被忽略。注释能通过在程序内部描述代码行为,帮助开发者提高效率。

标签

       标签必须出现在行首,后面跟一个冒号(“:”)。标签对应的是 jmp 指令,用于跳到某个目标地址。标签必须以字母开头,可以包含字母、数字和下划线

寄存器

在这里插入图片描述
在这里插入图片描述

       寄存器是 MCxxxx 指令操作数据的读取来源和写入目的地。不同 MCxxxx 模型使用的寄存器集合各不相同。如果一台微型控制器未装备某类寄存器,使用该类寄存器就会导致错误。

acc

       acc 是 MCxxxx 系列微型控制器的通用主寄存器,用于进行内部计算。如未特别说明,所有数学计算都将使用并修改 acc 的值。

dat

       dat 是一个额外的寄存器,只有部分 MCxxxx 系列机型安装了该类寄存器。绝大多数可使用 acc 的场景,都能使用 dat 替代。
       MCxxxx 微型处理器的内部寄存器(acc 和部分机型上的 dat)初始值都为 0。
在这里插入图片描述

p0、p1、x0、x1、x2、x3

       从 MCxxxx 微型控制器的引脚读取或写入数据时,要用到引脚寄存器(p0、p1、x0、x1、x2、x3)。
       通过引脚读取和写入数据,让一台 MCxxxx 微型控制器可以同另一台与之相连的适配设备开展通讯和协作。MCxxxx 系列微型控制器的所有引脚都配备了简单 I/O 或 XBus 接口功能。请参照相应设备规格书了解有关引脚功能的详细内容。

null 伪寄存器

       null 是一个伪寄存器。从 null 寄存器读取数值,会得到 0 值。写入 null 寄存器则不会有任何变化。一般用于丢弃来自Xbus接口的数据。

指令操作数

       各个类型的指令都要求一个固定的操作数。如果一条指令要求相应操作数,则写法如下:开头是指令名,后跟所有操作数,全部由空格分开。为提高开发效率,MCxxxx 编程系统不需使用多余的标点来隔开指令操作数。
       以下注释详细描述了指令操作数:
在这里插入图片描述

确保进行足够的睡眠 (slp)!

       CPU 通常比读写信号显示的速度快得多。
       CPU 可以在一个时间单位内执行大量指令。
       CPU 可以通过睡眠 (sleep) 进入到下一个时间单位。
       要让 CPU 进入 sleep 状态,就要使用 slp 指令,规定睡眠的时间单元。

基本指令

nop
       该指令无效。
mov R/I R
       将第一个操作数复制到第二个操作数中。
jmp L
       跳到既定标签位置,执行下一行指令。
slp R/I
       在操作数规定数量的时间单位内保持睡眠状态。
slx P
       保持睡眠状态,直到可以从操作数中规定的 XBus 引脚读入数据。

算法指令

       存储器可存储从 -999 到 999 之间的整数,包含边界值。如果一个算法操作的计算结果超出了该范围,系统将保存允许的最接近数值。例如,如果 acc 的值为 800,对其执行 add 400 指令后,系统会将 999 存入 acc。
add R/I
       将第一个操作数的值与 acc 存储器的值相加,并将结果存入 acc 存储器。
sub R/I
       从 acc 存储器的值中减去第一个操作数的值,并将结果存入 acc 存储器。
mul R/I
       将第一个操作数的值与 acc 存储器的值相乘,并将结果存入 acc 存储器。
not
       如果 acc 的值为 0,则将 100 值存入 acc。否则,将 0 值存入 acc。
dgt R/I
       从 acc 存储器中分离出操作数规定的位数值,并将结果存入 acc 存储器。
dst R/I R/I
       分离出 acc 值中第一个操作数规定的位数值,将该值设为第二个操作数的数值。
       以下是 dgt 和 dst 指令的使用范例:
在这里插入图片描述

条件指令

       所有 MCxxxx 编程语言的指令都允许有条件执行。在某条指令前添加“+”或“-”号可以借助测试指令允许或禁止执行该指令。当一条指令被测试指令禁止执行时,系统就会跳过该指令,且不会消耗能量。没有前缀符号的指令不会被禁止执行,因而每次都会正常执行。所有有条件指令在初始时都处于禁止执行状态。必须运行测试指令,才能允许执行有条件指令。
teq R/I R/I
       测试第一个操作数 (A) 是否等于第二个操作数 (B) 的值。
在这里插入图片描述
tgt R/I R/I
       测试第一个操作数 (A) 是否大于第二个操作数 (B) 的值。
在这里插入图片描述
tlt R/I R/I
       测试第一个操作数 (A) 是否小于第二个操作数 (B) 的值。
在这里插入图片描述
tcp R/I R/I
       比较第一个操作数 (A) 和第二个操作数 (B) 的值。
在这里插入图片描述

隐藏指令

       来自游戏中期的“秘密指令”邮件
在这里插入图片描述
gen P R/I R/I
       它能方便地在所有简单I/O引脚上生成脉冲!该信号会在开(100)和关(0)之间跳转,你想要持续多少时间单位都行,取决于最后两个操作数的数值。

gen P X Y
# 相当于:
mov 100 P
slp X
mov 0 P
slp Y

@符号
       加在所需应用的语句前,使其只执行1次,一般用于初始化。
在这里插入图片描述

游戏界面

       随着游戏进度,将会有不同的任务发布。每个任务完成后游戏会给出你的方案的产品成本、电量使用、代码行数;
在这里插入图片描述
       信息栏给出了甲方的要求:
在这里插入图片描述
       确认栏给出了需要的时序波形
在这里插入图片描述
       左下角提供了单步调试和全速仿真等功能,最下方的拖动条控制仿真的速度。
在这里插入图片描述
界面右侧是器件选择
在这里插入图片描述
界面中间是PCB,可以放置器件和编写程序。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DIY

在这里插入图片描述
你甚至可以在游戏中设计俄罗斯方块!视频见【深圳I/O】我在游戏里玩游戏之俄罗斯方块 —— 0第十名0
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity shader 编辑器扩展类 ShaderGUI

这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下。 效果如图: shader 的编辑器扩展分为2种方法: 是通过UnityEditor下的ShaderGUI类来实现的,形式比较近似于我们一般对unity编辑器的扩展方式。是通…

【电路补习笔记】9、电容式开关电源(电荷泵)

目录分类原理电荷泵基础开关电容稳压器的细调功能电荷泵的电压增益调节输出电容(Co)优点电容式开关稳压器减小纹波相关应用老师的主页:唐老师讲电赛 视频地址: 电源大师3——电容式开关电源(电荷泵)工作原理…

CPU 硬盘性能到底相差多少

本文以一个现代的、实际的个人电脑为对象,分析其中CPU(Intel Core 2 Duo 3.0GHz)以及各类子系统的运行速度——延迟和数据吞吐量。通过粗略的估算PC各个组件的相对运行速度,希望能给大家留下一个比较直观的印象。本文中的数据来自…

【电路补习笔记】10、电感式开关电源(BUCK 降压电路)

目录分类封装焊线式覆晶式开关电源三种基本的非隔离开关电源纹波(ripple)开关电源的元件构成有源开关肖特基二极管或快恢复二极管不使用普通硅二极管的原因电感电容分压电阻(输出电压设置)工作原理工作模式连续模式(co…

php中Session的生成机制、回收机制和存储机制探究

转载:http://www.jb51.net/article/53938.htm这篇文章主要介绍了php中Session的生成机制、回收机制和存储机制探究,可以帮助大家对Session有一个全面的了解,需要的朋友可以参考下1、php中session的生成机制我们先来分析一下PHP中是怎么生成一个session的。设计出session的目的是…

wsl2 Ubuntu 18.04 安装 ROS

目录前期准备安装ROS初始化rosdep测试前期准备 WSL的安装见旧版 WSL 的手动安装步骤从步骤4开始弄。 图形界面安装见在WSL中使用GPU:WSL2 Ubuntu 18.04 CUDA Gnome图形界面环境配置 界面汉化见WSL-Ubuntu安装中文语言 这里使用鱼香ROS大佬的一键安装脚本&…

GPU CUDA 经典入门指南

转自:http://luofl1992.is-programmer.com/posts/38830.html CUDA编程中,习惯称CPU为Host,GPU为Device。编程中最开始接触的东西恐怕是并行架构,诸如Grid、Block的区别会让人一头雾水,我所看的书上所讲述的内容比较抽象…

用PyQt实现透明桌面时钟小部件

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding: utf-8 -*-Created on 2012-4-6author: wangxiaoimport sys from PyQt4 import QtGui, QtCore from PyQt4.QtCore import Qt from PyQt4.QtCore import QPoint from PyQt4.QtCore…

实现织梦dedecms百度主动推送(实时)网页抓取

做百度推广的时候,如何让百度快速收录呢,下面提供了三种方式,今天我们主要讲的是第一种。 如何选择链接提交方式 1、主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保…

【RK3399Pro学习笔记】十八、点亮LED灯(python、C语言、bash)

目录GPIOpython3python-peripherypython2RPiC语言SysFs方式编写gpiolib.cgpiolib.hmain.c编译测试wiringPibash平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本:Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 GPIO (机翻)下表显示了座子的引脚&am…

Linux中python、C++和C语言的多线程用法整理(_thread、threading、thread和pthread)

目录python3开始学习Python线程_thread常量和函数:锁对象试用基本功能试用线程同步threading函数常量类线程本地数据线程对象锁对象递归锁对象条件对象信号量对象Semaphore 例子事件对象定时器对象栅栏对象在 with 语句中使用锁、条件和信号量测试Cstd::threadstd::…

Swing-BoxLayout用法-入门

注:本文内容源于http://www.java3z.com/cwbwebhome/article/article20/200016.html?id4797;细节内容根据笔者理解有修改。 BoxLayout 可以把控件依次进行水平或者垂直排列布局,这是通过参数 X_AXIS、Y_AXIS 来决定的。X_AXIS 表示水平排列&a…

Python开发利器之UliPad

一、安装Ulipad 因为ulipad编辑器使用的是wxpython编写的gui,所以我们需要第三方库wxpython的支持,先讲一下Ulipad在Windows系统环境下的安装: 1. 确实自己的windows版本,32位还是64位的。2. 查看自己安装的 Python版本&#xff0…

flask接收前台的form数据

html 记得访问从服务里打开 表单html 不能直接打开表单html https://www.cnblogs.com/wanghaonull/p/6340096.html

树莓派Raspbian Buster/Debian 10 安装ROS

目录一些补充安装ROS初始化rosdep测试平台:树莓派4B 系统版本: 2020-05-27-raspios-buster-arm64.img 一些补充 系统安装参考 【树莓派学习笔记】一、烧录系统、(无屏幕)配置Wifi和SSH服务 【树莓派学习笔记】二、(无屏幕)SSH远程登录、图形界面及系统…

树莓派安装Ubuntu MATE及ROS系统

目录解锁SSH换源安装VNC服务安装ROS初始化rosdep和环境测试平台:树莓派4B 系统版本: ubuntu-mate-20.04.1-desktop-armhfraspi.img 在Raspberry Pi Download Options下载系统镜像 在树莓派资源下载 | 树莓派实验室下载工具 使用SDForm…

jQuery学习笔记(四)

jQuery对表单、表格的操作及更多应用 表单应用 一个表单组成部分: 表单标签、表单域及表单按钮 单行文本框应用获取和失去焦点事件 $(function(){ $(":input").focus(function(){ //获取焦点触发事件 $(this).addClass("focus"); //增加样…

Flask最强攻略 - 跟DragonFire学Flask - 第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法

https://www.cnblogs.com/DragonFire/p/9259999.html 是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT {name: Old, age:…

【Jetson Nano学习笔记】1. 系统镜像和ROS的安装

目录安装系统换源安装VNC服务安装ROS初始化rosdep和环境测试平台:Jetson Nano 系统版本:4.6.1 安装系统 在Jetson Download Center下载镜像: 在树莓派资源下载 | 树莓派实验室下载工具 使用SDFormatter格式化内存卡 使用balenaEtcher烧录镜…

我的Android进阶之旅------Android利用Sensor(传感器)实现水平仪功能的小例

这里介绍的水平仪,指的是比较传统的气泡水平仪,在一个透明圆盘内充满液体,液体中留有一个气泡,当一端翘起时,该气泡就会浮向翘起的一端。 利用方向传感器返回的第一个参数,实现了一个指南针小应用。我的And…