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

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

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

 
 
 

日志

 
 

关于vblank  

2008-12-24 21:31:28|  分类: FC知识整理 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

1,  关于vblank

引用

《任天堂产品系统文件》3 中央处理器 http://nicotine.knight.blog.163.com/blog/static/2692611220089704349448/

 

NMI指不可屏蔽中断,它在VBlank即屏幕刷新时发生,持续时间根据系统(NTSC/PAL)不同而不同。

NTSC是每秒60次,而PAL是每秒50次。

6502的中断延时是7个时钟周期,也就是说,进入和离开中断都需要7个时钟周期。

它产生于PPU的每一帧结束,NMI中断可以由$2000的第7位的1/0控制允许/禁止。

以上中断在ROM内有以下对应的地址:

中断地址

中断

优先权

$FFFA

NMI

$FFFC

RESET

$FFFE

IRQ/BRK

 

引用

《FC的中断向量》http://nicotine.knight.blog.163.com/blog/static/2692611220081019102754445/

 

其中FFFA,FFFB为不可屏蔽中断向量,

FFFC-FFFD为复位向量,

FFFE-FFFF为可屏蔽中断向量。

 

不可屏蔽中断向量:程序运行到一定的时候,当我们在程序中置2000的D7位为1的时候($80,$88,$90,$98),CPU的时钟在每20毫秒都会发出中断请求。这时,程序会停下手边的工作,先处理中断程序。中断程序的地址头,就放在中断向量里。这个过程没有办法人为控制,所以叫不可屏蔽。

 

可屏蔽中断向量:在不可屏蔽中断中,可以加上启动开关(可以人为控制,可以不要它执行),即写一个数(随便什么)给E001,在开中断CLI,这时程序就从不可屏蔽中断中开始运行可屏蔽中断的程序。其地址就放在可屏蔽中断向量中。

 

因此你可以看到主程序----不可屏蔽中断----可屏蔽中断-----再回头。程序运行的顺序就是这样的。

 

 

引用

《6502汇编语言程序设计(之五)-- 任天堂之硬件架构》 http://nicotine.knight.blog.163.com/blog/static/2692611220089711233638/

 

中断

任天堂使用不可掩盖中断(non-maskable interrupts/NMIs),中断由PPU在每个frame结束后产生(称作VBlank interrupts)。VBlank interrupts可以藉由写入1/0到$2000之第七个bit 来enable/ disable。

 

当VBlank interrupt 产生时,CPU 将返回地址和状态站存器之值推入堆栈中,然后跳到储存在位置$FFFA(在任天堂内部之ROM上) 里之地址。

 

中断处理器应在遇到RTI指令时结束执行,并且将CPU归还给主程序,使其继续执行。更多关于中断处理的信息可以在介绍6502 CPU的书中找到。

 

可掩盖中断(Maskable interrupts/aka IRQs)可由卡匣上之外部电路产生,但大部分之卡匣并不产生可掩盖中断。

 

注:上面写的地址指的是CPU的内存映象,不是NES文件的地址。

 

 

 

引用

《任天堂产品系统文件》4、图形处理器  http://nicotine.knight.blog.163.com/blog/static/2692611220089704349448/

 

水平和垂直消隐:

所有的游戏机都有一个刷新动作,用来重新定位电子枪显示可见的数据。最通用的显示设备是电视机,它分为每秒刷新60次的NTSC制式和50次的PAL制式。电子枪从左到右画出象素,它每次只能画一条扫描线,画下一条之前要先回到左面并且做好准备,这之间有一段时间叫做水平消隐(HBlank)。在画完全部256条扫描线之后它又回到屏幕左上角准备下一次画屏幕(帧),这之间的一段时间就是垂直消隐(VBlank)。电子枪就是一个不断的走‘之’字形的过程。VBlank标志就是$2002的D7,它表明PPU是否在VBlank期间,当VBlank标志存在时,你就可以通过$2006和$2007访问PPU内存。一个程序可以通过读$2002来使D7复位。在屏幕刷新期间,我们不能访问PPU,而PPU会在CPU背后修改VRAM指针,这样我们很容易在写入VRAM时出错,为了让PPU停下来,可以对$2000和$2001写00。

 

PPU时序:

 

NTSC制式

PAL制式

基频(Base clock)

21477270.0Hz

21281364.0Hz

CPU主频(Cpu clock)

1789772.5Hz

1773447.0Hz

总扫描线数(Total scanlines)

262

312

扫描线总周期(Scanline total cycles)

1364(15.75KHz)

1362(15.625KHz)

水平扫描周期(H-Draw cycles)

1024

1024

水平空白周期(H-Blank cycles)

340

338

结束周期(End cycles)

4

2

帧周期(Frame cycles)

1364*262

1362*312

帧IRQ周期(FrameIRQ cycles)

29830

35469

帧率(Frame rate)

60(59.94Hz)

50Hz

帧时间(Frame period)

1000.0/60.0(ms)

1000.0/50.0(ms)

 

引用

《任天堂产品系统文件》8、I/O端口 http://nicotine.knight.blog.163.com/blog/static/2692611220089705052961/

 

端口是预分配好的可访问地址,程序通过端口和PPU或APU交换信息。每个端口都是16位的

端口

读写/位

功能描述

$2000

读写

PPU控制寄存器 1

 

0-1

命名表地址:

%10 ($2800)

%11 ($2C00)

%00 ($2000)

%01 ($2400)

请记住,因为镜像,只有2个真实的命名表,而不是4个;

当滚动超出当前命名表时PPU会自动切换到另一个命名表

2

垂直写, 1=VRAM地址以32递增:

命名表, VW=0

命名表, VW=1

——> 写 

| 写

|

V

3

精灵图案表地址, 1=$1000, 0=$0000

4

屏幕图案表地址, 1=$1000, 0=$0000

5

精灵尺寸, 1=8x16, 0=8x8

6

PPU 主/从模式, 没有在NES里使用

7

Vblank使能, 1=在Vblank时发生中断

$2001

读写

PPU控制寄存器2

 

0

显示模式,0=彩色,1=单色

1

背景掩码,0=不显示屏幕的左8列

2

精灵掩码,0=不在左8列显示精灵

3

屏幕使能,1=显示图像,0=黑屏

4

精灵使能,1=显示精灵,0=隐藏精灵

5-7

当D0=0:背景颜色,% 000=黑,%001=蓝,%010=绿,%100=红;不用混合使用,因为可能会损坏PPU硬件

当D0=1:颜色亮度,% 000没效果,%00 1强化蓝色,%010强化绿色,%100强化红色,不要混合使用

$2002 

PPU状态寄存器:读取后$2005和$2006被复位,下一个写到$2005的数据是水平的,写到$2006的数据是高位

 

0-3

未知(???)

4

VRAM写标志:0=写有效,1=写忽略

5

扫描线精灵计数:0=当前扫描线精灵个数小于等于8个,1=大于8个

6

命中标志:1=精灵刷新碰到了#0精灵。在屏幕刷新状态,这个标志被复位为0

7

Vblank标志:1= PPU在Vblank状态。当Vblank结束或CPU读$2002时,该标志被复位为0

  

  评论这张
 
阅读(1833)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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