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  1  1

所以,第7比特位于最左边,第0比特位于最右边。

【设置PPU】

注意首先要做的一件事是设置PPU。我们只需向存储器$2000和$2001写一些值,这两个地址对应两个PPU控制寄存器。为了解释$2000和$2001,下面从YOSHi的文档里面摘抄的寄存器描述:

            2000h - PPU 控制寄存器 1 (只写)
  Bit7  发生VBlank时执行NMI               (0=Disabled, 1=Enabled)
  Bit6  PPU 主从模式选择                  (0=主模式, 1=从模式) (NES中没用)
  Bit5  主角尺寸                          (0=8x8, 1=8x16)
  Bit4  背景Pattern Table 首地址          (0=VRAM 0000h, 1=VRAM 1000h)
  Bit3  主角Pattern Table 首地址          (0=VRAM 0000h, 1=VRAM 1000h)
  Bit2  端口0x2007 VRAM 地址增量          (0=自动增1, 1=自动增32)
  Bit1-0 Name Table卷轴首地址             (0-3=VRAM 2000h,2400h,2800h,2C00h)
  (也就是说,Bit0=水平卷轴滚动256, Bit1=垂直卷轴滚动240)

2001h - PPU 控制寄存器 2 (只写)

  Bit7-5 颜色增强                         (0=正常, 1-7=增强)
  Bit4  主角可见                          (0=不显示, 1=显示)
  Bit3  背景可见                          (0=不显示, 1=显示)
  Bit2  主角切除                          (0=切除左边8个像素列, 1=不切除)
  Bit1  背景切除                          (0=切除左边8个像素列, 1=不切除)
  Bit0  灰度模式                          (0=彩色模式, 1=灰度模式)

为了设置PPU,我们进行两次写内存操作,代码为:

	lda #%00001000
	sta $2000
	lda #%00011110
	sta $2001

我们写入$2000的值表示告诉PPU以下内容:

NMI禁止了;

主角尺寸8x8;

背景Pattern Table起始地址$0000;

主角Pattern Table起始地址$1000;

地址自动增1;

NameTable起始地址$2000;

写入$2001的值告诉PPU:

不要影响调色板;

显示主角;

显示背景;

显示所有位置的主角;

显示最左边8像素;

彩色模式;

你自己应该能从二进制码读懂上述具体含义。

【为了获得输出我们还需要做什么?】

如果你说的是背景,我们还要做:

制作一个背景;

a. 绘制一些tile(用Tile Layer Pro);

b. 在段2首先包含上面的tile文件;

c. 创建并载入一个调色板;

d. 在Name Table中设置显示的tile号码

这样就显示了背景!

如果是主角,那么顺序应该是这样:

制作一个主角:

a. 在Tile Layer Pro中绘制主角;

b. 段2中包含该文件作为第二个;

c. 创建并载入调色板;

d. 在主角数据区(类似GBA中的OAM)设置主角属性;

主角出场!

我们明天学习怎样载入调色板。调色板很重要,一半是背景调色,一半是主角调色。

时间: 2024-09-17 04:22:54

NESASM教程——第三天——NES编程相关的相关文章

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

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

NESASM教程总述

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

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

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

Android LibGDX游戏引擎开发教程(三) 示例代码详细讲解

承接了上一篇文章中关于环境搭建的简单示例,这一篇我会详细讲解FirstGame和HelloGameActivity类中 的代码. 一.ApplicationListener接口详解 1.简单代码示例,FirstGame.java: package com.example.hellolibgdx; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.gra

SQLite编程相关

  SQLite开源,代码简单,功能足够强大,使用非常广泛,在这 整理下C/C++对SQLite数据库编程相关的一些知识. 一. SQLite建库建表 二. VS环境下,32位程序使用SQLite的方法 三. 64位环境下SQLite的使用方法 VS版本为: VS2012 SQLite版本: 3080401 一. SQLite建库建表 ? 1 2 3 4 5 6 7 8 9 10 11 cd C:sqlite sqlite3.exe mydict.db create table userpwd(

简明 TensorFlow 教程 —  第三部分: 所有的模型

本文讲的是简明 TensorFlow 教程 -  第三部分: 所有的模型, 快速上手世界上最流行的深度学习框架 概述 在本文中,我们将讨论 TensorFlow 中当前可用的所有抽象模型,并描述该特定模型的用例以及简单的示例代码. 完整的工作示例源码. 一个循环神经网络. 递归神经网络 简称 RNN 用例:语言建模,机器翻译,词嵌入,文本处理. 自从长短期记忆神经网络(LSTM)和门限循环单元(GRU)的出现,循环神经网络在自然语言处理中的发展迅速,远远超越了其他的模型.他们可以被用于传入向量以

竞赛-现在有哪些软件编程相关的含金量比较高的证书或者水平还可以的比赛

问题描述 现在有哪些软件编程相关的含金量比较高的证书或者水平还可以的比赛 现在有哪些软件编程相关的含金量比较高的证书或者水平还可以的比赛 解决方案 我认为这个软件是死的,关键你是不是学的很精通.如果精通随便那个编程软件都可以赚钱 解决方案二: 刘总说的很赞.商业证书和比赛的含金量不可避免的降低,或者说贬值,这是它们的商业性质决定的.考商业证书的人的目的无非就是想通过证书拔高自己,让自己看上去水平更高.这意味着证书考试永远只对水平达不到证书预期水平的人来说有兴趣.好比你是小学生,对你来说,一个花钱

Linux命名空间学习教程(三) PID

本文讲的是Linux命名空间学习教程(三) PID,[编者的话]Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源.而 LXC所实现的隔离性主要是来自内核的命名空间, 其中pid.net.ipc.mnt.uts 等命名空间将容器的进程.网络.消息.文件系统和hostname 隔离开.本文是Linux命名空间系列教程的第三篇,重点介绍PID命名空间.DockerOne在撸代码的基础上进行了校对和整理. 继上一篇关于IPC namespac

Docker入门教程(三)Dockerfile

本文讲的是Docker入门教程(三)Dockerfile,[编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOne目前在代码高亮部分还有些Bug,我们会尽快修复,目前在代码部分有会些字符会被转义. 在Docker系列教程的上一篇文章中,我们介绍了15个Docker命令,你应该对Docker有个大致的了解了.那15个命令在手动创建镜像时会用到,它们涵盖了镜像的创建.提交.搜索.pull和push的功能