前提知识:

任天堂游戏系统的画面分辨率是256*240像素,基本的显示单位是tile,包含8x8=64个像素

根据电视机的制式不同,NTSC制式只显示256*224,也就是32x28个tile,画面的第一行以及最下方一行的tile是不显示的

PAL制式完整显示32x30个,SMB是以NTSC制式开发的。

AreaParserTaskControl是一个比较核心的程序,其下关联的子程序树完成了几乎全部的的游戏画面绘制工作。

从截图中我们可以看到,这个函数主要是用来循环调用另一个处理程序AreaParserTaskHandler,由变量AreaParserTaskNum控制循环次数。

当AreaParserTaskNum等于0时,会将ColumnSets减一,表示绘制完成1列画面(这里的一列具有4个tile宽度,每行也是4个tile,实际上AreaParserTaskHandler就是绘制了一个4x4大小的tile区域)。

ColumnSets减一之后结果是负数的话就会被bpl指令识别,程序跳转至OutputCol,这里总共绘制了12列,也就是32+16=48个tile宽度的一屏半画面。

AreaParserTaskHandler中则是调用了名为AreaParserTasks的例程树,AreaParserTaskNum会在一开始被赋值为#$08,也就是说AreaParserTaskHandler会被调用8次。

(开头说到SMB是NTSC制式,只会看到28行的tile,4x7=28,至于第8次是为了什么会在后面提到)

我们可以从3050行看到,AreaParserTaskNum是被递减的,并且作为JumpEngine的入参,因此我们得知AreaParserTasks中的例程是从后向前调用的,树中的8个函数刚好每次循环调用一个。

AreaParserTaskNum中的值递减至0时,3052行的RenderAttributeTables最终被调用,从名字中可以看出来这是用来填充属性表的,

侧面说明执行一次AreaParserTasks就是绘制了一个属性表字节对应的4x4=16个tile的屏幕区域(关于属性表命名表之间的关联关系留待以后说明)。

SMB的地图数据是预先压缩好的,AreaParserCore程序用于将这些数据解压(通过ProcessAreaData函数),然后写入到MetatileBuffer(通过RenderSceneryTerrain函数)

第一次调用RenderAreaGraphics都会根据MetatileBuffer中的值,将绘制4x4的tile区域左上方的tile,第二次绘制左下,所以IncrementColumnPos函数会切换绘制目标到另一侧,

一次通过RenderAreaGraphics绘制右上,右下的tile,再次通过IncrementColumnPos切换绘制目标到左侧,待下一次tile绘制。

对以上的主要流程有了了解之后,我们再来详细说明AreaParserCore、RenderAreaGraphics、IncrementColumnPos的具体内容

【SMB源码解析系列】——004.AreaParserTaskControl行列绘制控制程序的更多相关文章

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

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

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

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

  3. 【SMB源码解析系列】——002.RESET中断

    跟随代码结尾处的中断向量,我们可以看到RESET中断所在地址为Start标签处. 这部分代码比较简单,从字面便可基本理解. 1.(682~683)状态寄存器设置,sei指令用于禁用IRQ中断,SMB中 ...

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

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

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

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

  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. Java8新特性(1):Lambda表达式

    Lambda表达式可以理解为一种匿名函数:没有名称,但有参数列表.函数主体.返回类型.它是行为参数化的一种实现,行为参数化是指将不同的行为作为参数传递给方法,方法的所具备的能力取决于它接收的行为参数. ...

  2. WTF Python:有趣且鲜为人知的Python特性

    Python 是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性.但有的时候,Python 的一些输出结果对于初学者来说似乎并不是那么一目了然. 这个有趣的项目意在收集 Pyth ...

  3. Install go1.5 for CentOS7

    https://golang.org/doc/install 下载好后,通过FTPS,传递到Linux里去,放哪里随便你自己,因为被墙了,所以在Windows通过旋风下载了这个玩意儿. 你也可以: w ...

  4. CSS躬行记(7)——合成

    在图形编辑软件中,可以按特定地方式处理不同图层的合成,最新的CSS规范也引入了该功能,并提供了mix-blend-mode和background-blend-mode两个属性.混合模式(blendin ...

  5. token认证和理解

    认知篇:https://blog.csdn.net/FYGu18/article/details/89345490 token失效篇认知:https://segmentfault.com/q/1010 ...

  6. JVM相关参数设置

    Java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  7. 数据挖掘入门系列教程(十一点五)之CNN网络介绍

    在前面的两篇博客中,我们介绍了DNN(深度神经网络)并使用keras实现了一个简单的DNN.在这篇博客中将介绍CNN(卷积神经网络),然后在下一篇博客中将使用keras构建一个简单的CNN,对cifa ...

  8. ajax 技术

    ajax 技术 $.ajax({ url:"", type:'GET', success:function(data){ console.log(data); }, error:f ...

  9. iOS开发之结合asp.net webservice实现文件上传下载

    iOS开发中会经常用到文件上传下载的功能,这篇文件将介绍一下使用asp.net webservice实现文件上传下载. 首先,让我们看下文件下载. 这里我们下载cnblogs上的一个zip文件.使用N ...

  10. 数学--数论--Find Integer(勾股数定理)

    Problem Description people in USSS love math very much, and there is a famous math problem give you ...