• 【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中断循环触发

    在时间的巨兽面前,我们只有卑微与无奈的成长
  • 相关阅读:
    《深入理解 Java 虚拟机》读书笔记:线程安全与锁优化
    《深入理解 Java 虚拟机》读书笔记:Java 内存模型与线程
    《深入理解 Java 虚拟机》读书笔记:晚期(运行期)优化
    《深入理解 Java 虚拟机》读书笔记:早期(编译期)优化
    《深入理解 Java 虚拟机》读书笔记:虚拟机字节码执行引擎
    《深入理解 Java 虚拟机》读书笔记:虚拟机类加载机制
    Java学习书籍推荐
    IntelliJ IDEA之新建项目后之前的项目不见了
    剑指Offer之左旋转字符串
    剑指Offer之和为S的两个数字
  • 原文地址:https://www.cnblogs.com/rebeldancer/p/11676625.html
Copyright © 2020-2023  润新知