【SMB源码解析系列】——002.RESET中断
跟随代码结尾处的中断向量,我们可以看到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中断的更多相关文章
- 【SMB源码解析系列】——003.SMB游戏基本框架
前面有了解到RESET中断相关代码,结尾处通过一句jmp进入了无限循环,之后CPU将会在每一帧PUU进入VBlank状态时,接收NMI中断信号, 跳转至NMI代码处继续执行,直到遇见RTI指令时又返回 ...
- 【SMB源码解析系列】——001.JumpEngine函数
在SMB的源码中大概有不到20处看起来很奇怪的指令,它的格式是通过jsr指令调用一个名为JumpEngine的函数,其后并不是跟随某些后续的逻辑指令,而是通过.dw定义了一系列16位地址. 我们可以看 ...
- 【SMB源码解析系列】——004.AreaParserTaskControl行列绘制控制程序
前提知识: 任天堂游戏系统的画面分辨率是256*240像素,基本的显示单位是tile,包含8x8=64个像素 根据电视机的制式不同,NTSC制式只显示256*224,也就是32x28个tile,画面的 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- Cwinux源码解析系列
Cwinux源码解析系列
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
- TiKV 源码解析系列文章(三)Prometheus(上)
本文为 TiKV 源码解析系列的第三篇,继续为大家介绍 TiKV 依赖的周边库 rust-prometheus,本篇主要介绍基础知识以及最基本的几个指标的内部工作机制,下篇会介绍一些高级功能的实现原理 ...
随机推荐
- redis: 事务管理(九)
redis的事务 不保证原子性 三个步骤:开启事务.命令入队.执行事务 开启事务:multi 执行事务:exec 127.0.0.1:6379> multi #开启事务 OK 127.0.0.1 ...
- Jmeter系列(2)- Jmeter工具介绍、Jmeter安装目录介绍、Jmeter面板介绍
如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html Jmeter支持哪些测试场景? Jme ...
- mybatis源码学习:从SqlSessionFactory到代理对象的生成
目录 一.根据XML配置文件构建SqlSessionFactory 二.通过SqlSessionFactory创建SqlSession 三.getMapper获取动态代理对象 一.根据XML配置文件构 ...
- hashlib的md5计算
hashlib的md5计算 hashlib概述 涉及加密服务:Cryptographic Services 其中 hashlib是涉及 安全散列 和 消息摘要 ,提供多个不同的加密算法借口,如SHA1 ...
- Java中Random类
Random:产生随机数的类 构造方法: public Random();没有给种子,用的是默认种子,是当前时间的毫秒值. public Random(long seed);给出指定的种子 //给定种 ...
- GoJS 教程新手入门(资源整理,解决方案)
以下几个是我在百度.谷歌 上能找到的比较全的GoJs的一些东西,希望对各位有所帮助! 如有外网网站不能访问请自行FQ GoJS官网 第一个推荐的是GoJS的一个类似于社区的问题讨论区,这里面初学者的一 ...
- PHP如何实现判断提交的是什么方式
function get_request_method() { // $_SERVER包含了诸多头信息.路径.以及脚本位置等等信息的数组,这个数组中的项目有web服务器创建. if (isset($_ ...
- [Inno Setup] 安装完成后调用函数
如果使用了通配符,每拷贝一个文件,函数都会被调用一次. Source: "path\test.exe"; DestDir: {app}; AfterInstall: LoadPer ...
- 【Linux常见命令】rm命令
rm - remove files or directories rm命令用于删除一个文件或者目录. 语法: rm [OPTION]... FILE... 参数: -f 强制删除文件 -r 递归,用于 ...
- 控制台报错 [WDS] Disconnected!
Webpack 的 HMR 功能,是通过 WebSocket 实现的推送 JSON Patch,同时需要第三方库支持. 具体解决方案: 热加载(HMR)是 Webpack Dev Server 最强大 ...