跟随代码结尾处的中断向量,我们可以看到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. Scrapy中的crawlspider

    crawlspider 能自动的获取url并提交请求 命令:scrapy genspider -t crawl spidername 'example.cn' 所导入的模块 # -*- coding: ...

  2. 2019-2020-1 20199328《Linux内核原理与分析》第三周作业

    加载内核 这里可以看出有些东西隔一段时间就会打印出来 查看mymain.c 开头的一些语句不再描述 每10000次循环打印一次 这里还是针对的mymain.c文件,这里我们可以根据自己的计算机对频率进 ...

  3. 日志分析工具ELK(五)

    八.Kibana实践 选择绝对时间和相对时间 搜索 还可以添加相关信息 自动刷新页面时间,也可以关闭 创建图像,可视化 编辑Markdown,创建一个值班联系表 值班联系表 保存 再创建一个饼图;查看 ...

  4. SAP采购订单入库后不允许修改单价增强

    需求:在根据采购订单做了入库凭证之后,如果用户反审批采购订单去修改单价,系统提示‘已收货,不允许修改单价’. 判断流程:是否有入库凭证 如果采购订单条件按采购信息记录定价,这个价格本来就不能修改,只能 ...

  5. JS面向对象编程之对象

    在AJAX兴起以前,很多人写JS可以说都是毫无章法可言的,基本上是想到什么就写什么,就是一个接一个的函数function,遇到重复的还得copy,如果一不小心函数重名了,还真不知道从何开始查找错误,因 ...

  6. 源码学习VUE之Observe

    在文章 源码学习VUE之响应式原理我们大概描述了响应式的实现流程,主要写了observe,dep和wather的简易实现,以及推导思路.但相应代码逻辑并不完善,今天我们再来填之前的一些坑. Obser ...

  7. canvas 绘图api的位置问题

    很久没碰canvas了,今天因为canvas绘图的为之问题浪费了一些时间. 我们知道canvas的默认宽高是300X150嘛. 实际使用的时候当然是自定义一个高宽啦. 通常我们会习惯性地在js中通过c ...

  8. ip地址与运算 ipcalc命令

    http://man.linuxde.net/ipcalc 转载于:https://blog.51cto.com/sonlich/2064133

  9. chrome清除缓存、不使用缓存而刷新快捷键

    Ctrl+Shift+Del  清除Google浏览器缓存的快捷键 Ctrl+Shift+R  重新加载当前网页而不使用缓存内容 转载于:https://www.cnblogs.com/JAVA-ST ...

  10. Codeforces Round #622 (Div. 2) 1313 B Different Rules

    B. Different Rules Nikolay has only recently started in competitive programming, but already qualifi ...