注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

是直到最后都无法放手的一种气息,是我们生命中最后的思念……

 
 
 

日志

 
 

用NBasic来写一个ROM,只显示一个字母A  

2009-10-09 00:01:14|  分类: FC教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

代码是这样的

下载http://www.uushare.com/user/fogota/files/2090123

文件名"NB教程01_只显示一个A字母.zip" 这个代码,经过测试,确定能够生成NES

使用方法就是执行test批处理文件就行.具体的令命可以打开这个批文件查看。

下载的文件里,后缀名是bas的,就是代码文件了。可以用记事本打开。

/////////////////////////

;//文件头

asm

 .inesprg 1 ;//one PRG bank is16K

 .ineschr 1 ;//one CHR bank is 8K

 .inesmir 0 ;//mirroring type 0

 .inesmap 0 ;//memory mapper 0

 .org $c000 ;//address at $C000

 .bank 0 ;//bank No. is 0

endasm

;//程序开始,这个标签必须要有,因为后面要用到

start:

;//定义两个重要的端口

set $2000 %00000000

set $2001 %00011100

;//调用配色子程序

gosub load_palette

;// 显示1个字母A,在地址$2103

set $2006 $21

set $2006 $03

set $2007 65

set $2005 0

set $2005 0

;//结束了,进入死循环.因为FC没有end

mainloop:

goto mainloop

;// 配色

load_palette:

;// set the PPU start address (background color 0)

set $2006 $3f

set $2006 0

set $2007 $0e //只写入2个配色,意思意思

set $2007 $30

return

;//文件尾

asm

;//定义3个重要地址指针 NMI, Reset, IRQ

 .bank 1

 .org $fffa

 .dw start, start, start

;//定义字模共8K,这里每个CHR只有4K

 .bank 2

 .org $0000

 .incbin "ascii_2.chr"

 .incbin "ascii_2.chr"

endasm

;//这个CHR的内容就是英文大小字母,并按ASCII码排布..

////////////////////////////

效果

用NBasic来写一个ROM,只显示一个字母A - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

 

解说:

文件头的意思,大家看资料就行了,就是指明程序限定了多长,字模文件限定多长,mapper号什么

基本的步骤是:

1设定$2000和$2001,

2配色

3在背景上显示字母

4结束

十分的简单,因为是最最简单,所以省去了好多步骤.例如清除内存和跳过回扫线.

没有跳过回扫线,这会让我们看见它闪了一下.

这个只供初学者学习.

(1)标签,就是像这些 start: load_palette: mainloop: 后面总带个冒号的

它的作用是指明程序所在的位置,明确的地址却不用写出来.编译器自然能处理.

(2)ORG是指明下面部分的开始地址.这里必须是$C000,因为是不切页,程序最好从$C000开始

(3)set 语句就是赋值语句.

例如 set $2000 %00000000

就是向 $2000这个地址写入%00000000 ,其中%表示2进制数 (因为$2000是一个端口,是位操作,所以用2进制,方便查看代码)

例如 set $2006 $21

就是向 $2006 这个地址写入$21,其中$表示16进制数

例如 set $2007 65

就是向 $2006 这个地址写入65,这是10进制数

(4)gosub 调用子程序,

gosub load_palette 调用子程序load_palette, 子程序执行完了返回,执行下一句

(5)goto 跳转,跳到某个标签上继续运行.

goto mainloop 就是跳到mainloop运行..

////////////////////

程序是一句接一句的运行的,goto和gosub就是用来改变运行的次序的.

 

下面来一句句的分析  (下面说的“地址”都是指程序加载到FC(或模拟器)里,在机器里的地址。)

';// '后面的文字是注释,不讲了。

第1句是asm,这个代表下面的句子都是汇编里用的句子,一直到asmend才结束这个状态。

(这种在NBasic里放了汇编码的,叫内嵌汇编,凡是这种,NBasic是不编译,直接保留到转换后的汇编码里面。)

<1>

.inesprg 1

.ineschr 1

.inesmir 0

.inesmap 0

这四句是文件头,文件头是位于NES文件的前16字节,作用是让模拟器知道“程序机器码段”(PRGROM)的长度和“字模段”(CHRROM)的长度。还有镜像和MAPPER的值。

PRGROM的长度单位是16K;CHRROM的长度单位是8K。

上述两者的长度要视MAPPER的限制而定,不能乱改。

镜像,我也不能确定是什么。

MAPPER是好重要的,以后的文章里再说。现在就用这个0号。

 <2>

.org $c000

.bank 0

asmend

表示程序从地址$C000开始,现在代码位于0号bank,这个bank可能是“段”的意思。

 asmend 表示内嵌码结束。

<3> 

start:

set $2000 %00000000

set $2001 %00011100

 

start是一个标签。它在.org $c000后面说明可运行的代码从这开始。程序从哪里开始运行主要是看地址$FFFA开始的3个重要的地址指针。这个在后面说明~~

关于$2000和$2001的使用看这里

这两个是基本的设置呀.

注%表示二进制.

用二进制是为了看清楚各位的设置。

 

<4>

gosub load_palette

gosub:调用子程序

load_palette:这是一个标签,表示一个地址,这个地址就是子程序的入口。

子程序遇到return就会返回。后面会说到这个标签,程序就调用了那个子程序。

我先说下面的。

 

<5>

set $2006 $21
       set $2006 $03
       set $2007 65

set $2005 0
       set $2005 0

这个终于要在背景上显示一个图形了。这个图形的编号是65,被画在地址$2103上。

完了还得复零。

问:为什么$2103要分开写?为什么复零要两次?

因为FC的CPU是6502是8位的,数据线只有8位,地址线是16位的。

这$2103是16位数,唯一的方案是将16位分两半传递。

先写$2006是写入高位,再写入$2006是写入低位。

同时写入$2005也是同样道理,$2005要求写入一个16位的数。

这里跟单片机里用的办法是相通的。(说的是将16位分两半传递的事。)

这里的顺序要求已经非常明显了。。

$2005,$2006,$2007的使用说明

 

续..

 

基本上,我认为好祥细的了,有不明白请留言.

  评论这张
 
阅读(1302)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017