【什么? ! 】
当然。 调色板将于明天创建并加载。 为了创建调色板,我们将使用程序 PAL.exe,该程序位于我在第三天给您的那种 zip 文件中。 运行它,您将看到一个窗口,其中包含 32 个白色袋子,您可以用从顶部彩色袋子中选择的草图颜色填充这些袋子。 当你制作调色板时,确保每行的第一个颜色是蓝色,否则当你稍后制作背景和主角时,你会看到很多意想不到的东西。
将调色板另存为 our.pal。
*新段落:哪些是调色板,简单明了*
*如果我在本文前面所说的内容与本段相矛盾css调色板,请忽略它*
调色板基本上是一组可供选择的颜色。 我们的调色板有 32 种颜色,占用 32 个字节(每种颜色 1 个字节)。 16 种颜色用于主角,16 种颜色用于背景。 虽然您可以从 16 种类型中进行选择,但每个主角只能选择 4 种类型,并且背景的每个 16x16 像素块只能选择 4 种类型。 现在说起来太复杂了,所以我们来详细介绍一下。
*新段落结束*
【如何加载调色板】
我们通过写入两个内存映射寄存器来加载 PPU 的调色板。 首先写入$2006,作为调色板加载的完整首地址($3F00)的两倍,然后将32字节调色板数据写入$2007。
然而,在加载调色板之前,我们应该了解更多信息。
[索引投票]
你应该记得,在第三天和第二天,我说过X和Y寄存器可以用于索引轮询。 在这里您将了解如何操作。
;假设X等于6
lda$2002,x; 从显存地址($2002+6)加载数据,即从$2008开始
;假设Y等于9
lda$2000,y;从内存地址$2009加载数据
请注意,您可以加载到任何寄存器,而不仅仅是 A
【其他】
您需要知道的是,加载和存储指令可以将标签作为基地址。 代码如下所示:
somelabel:.incbin "our.pal"; 包含一个pal文件,标签是它的首地址
ldasome标签,x; 从标签指示的地址+X处加载一个值到A
示例程序只写了如何将值加载到A中,其他X、Y类似。 如果您读过我的英特尔汇编教程(http://www.intel.com/articles/intel-汇编)或其他基础汇编书籍/文章,您应该已经知道标签的作用。 这是基础知识css调色板,不需要我多说。
【加载调色板】
为了不让我的鼠标一直敲击,就让代码自己说话吧。
lda #$3F ;
sta $2006 ;
lda #$00 ;
sta $2006 ;
; 上面这4行告诉$2006:我们后面准备向$3F00地址处写一些东西,由于一次只能写一个字节,所以上面需要store两次
ldx #$00 ; X <- 0
loadpal: ; 注意标签不用缩进,后面跟着一个冒号
lda ourpal, x ; 从地址ourpal+x处载入调色板数据到A.
sta $2007 ; 写到$2007里面,PPU会自己放到上面我们设置的首地址$3F00
;
inx ; 没见过这个指令?就是Increment X的意思,X++
;
cpx #32 ; 比较X和32,也就是数一下已经写入多少调色板数据了.
bne loadpal ; BNE表示如果不相等就跳转,所以X不等于32时会跳到loadpal位置,而X==32时则循环结束,调色板载入结束。
假设 ourpal 是之前在汇编源文件中定义的标签
ourpal:.incbin "our.pal"; 标记我们的调色板以加载代码;
今天我们将完整的代码文件放在一起并展示我们的主角。
【新命令】
里面的代码看到三个新指令:
INX——X减1; 另外,INY表示Y减1; 但是没有INA,听说6502的设计者忘记了这一点。 减少了SNES中的INA指令,使用下一代6502(65C02)
CPX - 将 X 与另一个值进行比较。 还有CPY和CPA。 这里的值只能是立即数,不允许显存轮询。
BNE - 如果最后一个 CPk (k=A,X,Y) 指令的结果“不相等”,则跳转到标签。 还有BEQ,只有结果相等时才会跳转。 前面我会详细介绍一下。
【今日回顾】
加载调色板非常重要,因为没有它,前面的背景显示和主角显示都是废话。
加载调色板非常简单,因为它就是这样,一旦写入,你就不需要碰它,也不需要为它做任何事情。
明天我们就来说说主角的展示。
让 NES 见鬼去吧。 睡着了。