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

【主角DMA?】

是的,主角DMA。你还记得我们怎么利用$2003和$2004寄存器写入SPR-RAM(OAM)的吗?实际上真实系统中这种做法是不可靠的。我们应该利用内存作为OAM,然后向一个寄存器写入值,所有内容都自动拷贝到真实OAM。如果你不懂,那我们做一遍就懂了。

【什么内存?】

就像我上面说的,我们需要使用“变量”内存来复制一份OAM。本教程使用$0300用于复制的OAM。注意NES上只有64个主角(占用64*4B=256B,0x100)。所以基本上你自己定义的变量尽可能放在$0000-$0200内。从$0300-$0400的布局应该同OAM完全一致。

另外记住,$300是一个内存地址,而不像内存变量。我们必须在每次读写后将地址加一,而不是持续读写同一个地址的内容。

我们用偶数在百位用于我们OAM拷贝。我会告诉你为什么的。

好了,希望你理解了上述理论,下面看汇编代码。

;;--- 代码开始 ---;;
	.inesmap 0  ;
	.inesprg 1  ;
	.ineschr 1  ;
	.inesmir 1  ; 

	.bank 1
	.org $FFFA
	.dw 0
	.dw Start
	.dw 0

	.bank 0  ; 代码段
	.org $0000 ; 

	; 普通变量在这里定义

	.org $0300 ; OAM镜像从这里开始

Sprite1_Y:     .db  0   ; 1号主角的纵坐标
Sprite1_T:     .db  0   ; 1号主角的瓷砖编号
Sprite1_S:     .db  0   ; 1号主角的特殊待遇
Sprite1_X:     .db  0   ; 1号主角的横坐标
Sprite2_Y:     .db  0   ; 2号主角的纵坐标
Sprite2_T:     .db  0   ; 不用说了吧?
Sprite2_S:     .db  0   ;
Sprite2_X:     .db  0   ;
; 依此类推去吧。。。

	.org $8000 ; 代码开始

Start:
	;
	; 先卖个关子
	; 后面会给出详细代码

infin:
	jmp infin  ; 死循环
;;--- 代码结束 ---;;

如果你不懂,email我告诉我你到底哪不懂。

【DMA寄存器】

DMA寄存器地址是$4014,我们需要写3进去。为什么是3?因为我们内存OAM在$300处。你向$4014写入n,那么就从$0n00处拷贝内容到真正OAM。也就是说,如果从$0400开始那就写4,如果从$0500开始那就写5,明白?

下面看怎么搬运我们的OAM到真实OAM中:

	lda #$3  ; 也可以写成 #3, 因为显然3的十进制和十六进制表示是相同的
	sta $4014 ; 一旦写入, 拷贝就开始

就是这样,比我们老办法可靠多了,而且更简单!

【怎样按照上述方法修改第九天的代码?】

我们需要做几件事。

首先,拷贝 .org $0300和后面那堆东西到我们旧的变量区。我们再也不用那些变量了,因为我们的主角X,Y都使用OAM拷贝。

其次,使用查找替换功能吧所有X_Pos和Y_Pos改为Sprite1_X和Sprite1_Y。

再次,找到写$2003的代码块,替换为:

	lda #$3  ;
	sta $4014 ;

就是它了!我们用这种方法也节省了几个字节代码空间。

【今日回顾】

希望你喜欢主角DMA,我已经将它尽可能口语化了。我们今天学到了更好的写OAM数据的方法,明天还要看下更好的方法来捕获VBlank。接下来是。。。。。中断!

希望你的代码没有bug。

时间: 2024-10-03 23:49:50

NESASM教程——第十天——主角DMA的相关文章

NESASM教程总述

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

Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAuth2.0的运作模式: 从上图我们可以看到,整个过程进行了2次"握手",最终利用授权的AccessToken进行一系列的请求,相关的过程说明如下: A:由客户端向服务器发出验证请求,请求中一般会携带这些参数 ID标识,例如appId 验证后跳转到的URL(redirectUrl) 状态参数

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制

Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制 在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需要提供AccessToken,因此我们每次在调用高级接口之前,都需要执行一次获取AccessToken的方法,例如: 1 var accessToken = AccessTokenContainer.

struts2官方 中文教程 系列十二:控制标签

介绍 struts2有一些控制语句的标签,本教程中我们将讨论如何使用 if 和iterator 标签.更多的控制标签可以参见 tags reference. 到此我们新建一个struts2 web 项目:struts_basic2 本帖地址:struts2官方 中文教程 系列十二:控制标签 即 http://www.cnblogs.com/linghaoxinpian/p/6941683.html 下载本章节代码 struts2 if标签 我们在thankyou.jsp中添加如下代码: <s:i

【OpenCV新手教程之十八】OpenCV仿射变换 &amp;amp; SURF特征点描写叙述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中.我们一起探讨了OpenCV

Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密 前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到Url对接的设置: 点击[修改设置],可以进入到修改页面: 加密的方式一共有3种: 明文模式,即原始的消息格式 兼容模式,明文.密文将共存,正式发布的产品不建议使用(因为仍然包含了明文,达不到加密的效果) 安全模

Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重

原文:Senparc.Weixin.MP SDK 微信公众平台开发教程(十四):请求消息去重 为了确保信息请求消息的到达率,微信服务器在没有及时收到响应消息(ResponseMessage)的情况下,会多次发送同一条请求消息(RequestMessage),包括MsgId等在内的所有文本内容都是一致的. 这种机制确保了在诸如网络状况不佳的情况下消息的回复成功率,但是有时候由于服务器负荷.本身请求过程就需要好几秒才能完成等情况,多次重复的消息反而成了服务器的负担,甚至对业务和数据也可能造成影响.

【OpenCV入门教程之十八】OpenCV仿射变换 &amp; SURF特征点描述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明

微信官方的多客服接口原理是通过用户发送的信息,开发者服务器返回一条指定类型的响应信息,使用户的对话状态切换到官方的多客服状态(持续一段时间),这段时间内用户发送的所有信息都不会到达开发者的服务器,而是转到多客服的软件上. 需要实现多客服,必须是通过验证的服务号,进入后台的[服务]>[服务中心]>[多客服]进行申请及设置,详细信息可以见官方公告:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=news/vote_wkd_tmpl&lang=