跟随代码结尾处的中断向量,我们可以看到RESET中断所在地址为Start标签处。

这部分代码比较简单,从字面便可基本理解。

1.(682~683)状态寄存器设置,sei指令用于禁用IRQ中断,SMB中并没有用到它,cld指令用于设置CPU在执行数学运算指令时以二进制进行
2.(684~685)PPU_CTRL_REG1($2000)端口初始化设置,这里要对任天堂游戏系统的硬件控制端口有所了解,暂时可以先记住D7位为0表示禁用NMI中断
3.(686~687)TXS指令用于通过X寄存器设置栈寄存器的值,一般在代码最初指向栈顶(#$FF)
4.(688~691)读PPU_STATUS然后调用BPL指令是一个较为常见的组合,只有当PPU进入VBlank状态,才会结束循环,一般会调用2次,主要用于PPU的预热
5.(692~703)这里我们先看一下703行的InitializeMemory函数,它的主要作用是将RAM中的数据进行初始化(写入#$00),但是根据Y寄存器的值,
可以略过某些地址范围,使该范围内的地址空间保存原样。
Y寄存器的值可能为#ColdBootOffset或#WarmBootOffset,WarmBootOffset会控制InitializeMemory函数初始化RAM时略过一部分内存空间,
其中就包括了TopScoreDisplay所在位置
TopScoreDisplay中保存的是游戏最高得分的各位数字(待确定),如果格式正确,说明游戏确实正常运行过;
WarmBootValidation是会在Start代码的706行明确写入#$A5的,可以用来确认当前是否是通过复位按钮第二次进入RESET中断。
6.(704~705)InitializeMemory函数调用结束后A寄存器的值会是#$00,这里直接写入了SND_DELTA_REG+1,用于初始化音乐相关的控制端口进行初始化,
OperMode则是标记了当前游戏场景,#$00表示标题画面场景(SMB中共有4个主要场景)
7.(708)PseudoRandomBitReg用于生成伪随机数
8.(709~712)SND_MASTERCTRL_REG同样是音乐相关的控制端口,PPU_CTRL_REG2($2001)则是PPU控制端口
9.(713)MoveAllSpritesOffscreen函数用于将所有精灵对象的坐标移动到屏幕之外,是一个比较常用的画面刷新函数
10.(714)InitializeNameTables用于初始化命名表中的数据
11.(715)DisableScreenFlag用于画面渲染过程中控制画面显示
12.(716~718)Mirror_PPU_CTRL_REG1是PPU_CTRL_REG1的状态缓存空间,用于控制PPU状态的切换,一般配合WritePPUReg1这个PPU状态写入函数使用,
这里启用了NMI中断(D7位设置为1),使程序能够继续执行
13.(719)Start程序到此就结束了,之后会通过JMP指令进入无限循环指令,等待NMI中断循环触发

【SMB源码解析系列】——002.RESET中断的更多相关文章

  1. 【SMB源码解析系列】——003.SMB游戏基本框架

    前面有了解到RESET中断相关代码,结尾处通过一句jmp进入了无限循环,之后CPU将会在每一帧PUU进入VBlank状态时,接收NMI中断信号, 跳转至NMI代码处继续执行,直到遇见RTI指令时又返回 ...

  2. 【SMB源码解析系列】——001.JumpEngine函数

    在SMB的源码中大概有不到20处看起来很奇怪的指令,它的格式是通过jsr指令调用一个名为JumpEngine的函数,其后并不是跟随某些后续的逻辑指令,而是通过.dw定义了一系列16位地址. 我们可以看 ...

  3. 【SMB源码解析系列】——004.AreaParserTaskControl行列绘制控制程序

    前提知识: 任天堂游戏系统的画面分辨率是256*240像素,基本的显示单位是tile,包含8x8=64个像素 根据电视机的制式不同,NTSC制式只显示256*224,也就是32x28个tile,画面的 ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  7. Cwinux源码解析系列

      Cwinux源码解析系列

  8. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  9. TiKV 源码解析系列文章(三)Prometheus(上)

    本文为 TiKV 源码解析系列的第三篇,继续为大家介绍 TiKV 依赖的周边库 rust-prometheus,本篇主要介绍基础知识以及最基本的几个指标的内部工作机制,下篇会介绍一些高级功能的实现原理 ...

随机推荐

  1. kafka高吞吐量之消息压缩

    背景 保证kafka高吞吐量的另外一大利器就是消息压缩.就像上图中的压缩饼干. 压缩即空间换时间,通过空间的压缩带来速度的提升,即通过少量的cpu消耗来减少磁盘和网络传输的io. 消息压缩模型 消息格 ...

  2. 2020/4/26 大数据的zookeeper分布式安装

    大数据的zookeeper分布式安装 **** 前面的文章已经提到Hadoop的伪分布式安装.现在就在原有的基础上安装zookeeper. 首先启动Hadoop平台 [root@master ~]# ...

  3. Ansible playbook 编程

    Ansible playbook 编程详解与各种小案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: ...

  4. Web前端开发必不可少的9个开源框架

    大多数人想到Web开发时,通常会想到HTML或JavaScript,往往忽略了CSS,根据Wikipedia的说法,CSS既是网页中最重要也是最常被遗忘的部分之一,尽管它是万维网的三大基础技术之一. ...

  5. 数据结构(C语言版)---查找

    1.查找表:同一类型的数据元素构成的集合. 2.对查找表进行的操作:查询某特定元素.检索满足条件的元素的属性.插入元素.删除元素. 1)若对查找表进行的操作只涉及前两种,则为静态查找表:需要进行插入和 ...

  6. sqli lab 1-4

    less-1 爆库 id=1222' union select 1,group_concat(schema_name),database() from information_schema.schem ...

  7. java中functional interface的分类和使用

    目录 简介 Functional Interface Function:一个参数一个返回值 BiFunction:接收两个参数,一个返回值 Supplier:无参的Function Consumer: ...

  8. Python抓取新浪新闻数据(二)

    以下是抓取的完整代码(抓取了网页的title,newssource,dt,article,editor,comments)举例: 转载于:https://blog.51cto.com/2290153/ ...

  9. Vs Code在Vue项目中v-for指令提示错误的解决办法

    最近在做一个Vue项目,在其中用到v-for指令时,发现Vs Code报错,如下图(代码是没有任何问题的),在网上找了一下解决办法,希望能帮助到更多人. 解决方法: 打开    文件-首选项-设置 将 ...

  10. iOS9.2.1 App从AppStore上下载闪退问题

    首先这是小编的第一篇文章,我是一名做iOS开发的小白,出于爱好会更新发表些相关的技术文章,偶尔也会发些视频.恳请大家不要去嘲笑一个努力的人,要是做的不好请多多评论,反正我也不改. 好了!敲黑板!!说正 ...