NESASM教程——第十二天——VBlank和中断

【VBlank?】

如果你不知道什么是VBlank, 那么假装我给了你一条鳟鱼;

如果你知道什么是VBlank,那么假装我给了你一条鳟鱼;

如果你不确定一条鳟鱼和NES有什么关系,那么假装我给了你一条鳟鱼;

既然我们房间里有一股想象中的鱼臭味,那么让我们学习更好的方式来与VBlank同步。

【我们怎么用它?】

首先我们有个标签,比如VBlank_Routine,无哦一我们把它放在段1的地址$FFFA处,就像这样:

	.bank 1
	.org $FFFA
	.dw VBlank_Routine ; VBlank中断向量
	.dw Start ; 复位向量
	.dw 0  ; 当BRK指令执行时的中断向量,改天再谈

	.bank 0
	.org $0000  ;保留一个变量VBlankOrNo
VBlankOrNo  .db 0
	.org $8000  ;code
VBlank_Routine:
	;VBlank子程序开始
	inc VBlankOrNo
	; 使变量VBlankOrNo增1
	rti  ; RTI 意思是中断返回 (Interrupt RETurn or ReTurn from Interrupt)

Start:
	;主程序开始
	;
;waitforvblank:  旧代码
;	lda $2002  旧代码
;	bpl waitforvblank 旧代码
;  新代码如下

WaitForVBlank:
	lda VBlankOrNo ; A = VBlankOrNO
	cmp #1         ; if A == 1 说明发生了VBlank
	bne WaitForVBlank ; 没有发生VBlank,循环
	dec VBlankOrNo ; 发生了VBlank,使变量VBlankOrNo减一,变为0

	; 代码如旧

希望你懂了总体思想。

哦对了,别忘了将PPU控制寄存器中的“Generate VBlank Bit"设为1(我记得是bit7,可以复习第三天内容)。

修改后的代码比之前旧的循环更稳定。

晚安~

时间: 2024-10-25 11:57:58

NESASM教程——第十二天——VBlank和中断的相关文章

NESASM教程总述

本教程是关于使用NESASM汇编器为任天堂娱乐系统(NES, Nintendo Entertainment System)编程的.该教程由浅入深,简化了NES汇编学习过程.在进一步尝试前你几乎必须了解另一种汇编语言,因为本文假设你(哪怕一丁点)基本汇编常识是具备的.例如了解GBA或者Intel x86汇编将对理解基础有很大帮助.祝你在学习NES汇编编程的旅途中一切顺利! 第一天--开始NES汇编 第二天--源代码文件结构 第三天--关于NES编程 第四天--制作并载入调色板 第五天--显示主角

NESASM教程——第十天——主角DMA

[主角DMA?] 是的,主角DMA.你还记得我们怎么利用$2003和$2004寄存器写入SPR-RAM(OAM)的吗?实际上真实系统中这种做法是不可靠的.我们应该利用内存作为OAM,然后向一个寄存器写入值,所有内容都自动拷贝到真实OAM.如果你不懂,那我们做一遍就懂了. [什么内存?] 就像我上面说的,我们需要使用"变量"内存来复制一份OAM.本教程使用$0300用于复制的OAM.注意NES上只有64个主角(占用64*4B=256B,0x100).所以基本上你自己定义的变量尽可能放在$

NESASM教程——第五天——主角出场

[主角] 主角和背景比起来,你肯定觉得背景会更简单.错!主角才简单得要命. 制造主角只需要向SPR-RAM写入一点点内容(主角的x,y坐标,tile编号,等等). 等等,我觉得咱们得先绘制主角的图片才行,走起~:) [Tile Layer Pro] 存储主角像素块的表格称为Pattern Table,大小4KB,位于PPU $0000~$0FFF或$1000~1FFF(由PPU 控制寄存器设置,见第三天内容). 绘制像素块的工具可以用Tile Layer Pro,我们从一个空白的像素块开始. 运

NESASM教程——第一天——开始NES汇编

[关于NES汇编] 我的天,你正准备学习用汇编写NES程序?那么,如果你真想这么做,本文应该有所帮助.也许你已经读过我的正在进行中的GameBoy高级汇编系列文章.在我的GBA汇编教程中,指出你在进行汇编编程前应该先了解GBA C语言编程.我对于NES汇编也这样说,但是针对NES CPU没有好的C编译器.所以我只想说,写NES代码前要了解点GBA汇编或Intel 汇编,因为NES相比前面两者有点难. 我们将使用NESASM.exe作为我们的汇编器.可以从这里下载(http://patater.c

NESASM教程——第二天——源文件的结构

[发生了什么?] 嗯,你是个NES小白程序员,今天我们将学习一个NESASM代码文件的结构.不幸的是,我们的汇编器对缩进非常讲究,一行的开始位置只能放标签,放其他所有内容都必须加一个[TAB]键缩进.尽管这样听上去很糟糕,但这样确实提高了可读性,让你更容易理解代码,尤其是大程序. [关于段(Bank)] 不不不,Bank不会帮你拿着你的钱,它们帮你拿着你的程序和数据.我们将经常用三个段: 段 0 -- 放我们的代码,起始于$8000 段 1 -- 中断向量表,很重要,起始于$FFFA 段 2 -

NESASM教程——第六天——跳转和按键处理

[读取按键] 我们假设你要读取的是一个普通的方形NES手柄,而不是一些其他乱七八糟的东西.为了知道一个按键是否按下,你一次一键地读取0x4016(手柄1)或0x4017(手柄2).如果按键按下,右边的bit0将被置位(1).你用1同它相"与",若结果不为0则跳转.在你读取任何内容之前,你需要先复位手柄(选通). [选通/复位] 为了选通/复位手柄,我们写入一个1然后一个0到0x4016(手柄1)或0x4017(手柄2).可以这么搞: lda #$01 sta $4016 lda #$0

NESASM教程——第三天——NES编程相关

[PPU] NES上发生的一切都需要通过图形方式输出,我们需要对PPU(图像处理单元)编程.其实很简单,就是向特定内存地址写一些数值,然后PPU的设置就被修改为你设置的值.NES所有编程都使用所谓的内存映射寄存器(MMR)实现.如果你给GBA编过程序,肯定知道MMR.但对于Intel芯片知识来说,MMR是个外星人. [二进制注意事项] 为了绝对清晰,我们将按以下顺序给出内存寄存器的比特(0x63): bit: 7  6  5  4  3  2  1  0 val:0  1  1  0  0  0

NESASM教程——第四天——制作、载入调色板

[啥?!] 然.今天将创建并载入调色板.为了创建调色板,我们将使用程序PAL.exe,我在第一天给你的那个zip文件中有这个.运行它,你将看到一个窗口,有32个灰色的盒子,你可以从底部彩色盒子中选取绘制颜色填充它们.当你制作调色板时一定要保证每行第一个颜色是黑色,否则你后面制作背景和主角时会看到很多意外的东西. 保存调色板为our.pal. *新的段落:什么是调色板,简单直接* *如果我本文后面说了一些和这段矛盾的东西,忽略它* 调色板基本上是一组可供选择的颜色.我们的调色板有32种颜色,占用3

NESASM教程——第七天——使用内存

[从哪里获得?] 我们做任何其他事情之前,最好展示怎么使用内存用于我们自己的数据.这个数据可能是任何东西,例如你需要存储的数字或主角的X/Y坐标值.我们将使用自由内存:位于CPU $0000. [怎样使用?] 代码段0用ORG伪指令定位到$0000,为一些内存贴上标签,然后ORG定位到$8000开始我们的代码. 创建一个带标签的内存(也就是创建一个变量),可使用汇编操作.db,就像这样: .bank 0 .org $0000 label1: .db 0 byte1: .db $A5 ; .db后