接上
LCD状态寄存器
FF41 – STAT – LCDC 状态 (R/W)
Bit 6 - LYC=LY Coincidence Interrupt (1=Enable) (Read/Write)
Bit 5 - Mode 2 OAM Interrupt (1=Enable) (Read/Write)
Bit 4 - Mode 1 V-Blank Interrupt (1=Enable) (Read/Write)
Bit 3 - Mode 0 H-Blank Interrupt (1=Enable) (Read/Write)
Bit 2 - Coincidence Flag (0:LYC<>LY, 1:LYC=LY) (Read Only)
Bit 1-0 - Mode Flag (Mode 0-3, see below) (Read Only)
0: During H-Blank
1: During V-Blank
2: During Searching OAM-RAM
3: During Transfering Data to LCD Driver
STAT寄存器的低两位表示LCD控制器当前的状态。
状态0:LCD控制器位于水平消隐阶段, CPU此时可以存取显示内存VRAM(8000h-9FFFh)和OAM(FE00h-FE9Fh)
状态1:LCD控制器位于垂直消隐阶段(或者LCD显示被禁止),CPU此时可以访问VRAM和OAM。
状态2:LCD控制器正在读OAM,CPU此时不能访问OAM。
状态3:LCD控制器正在读OAM和VRAM,CPU此时不能访问OAM和VRAM。对于CGB:CPU此时也不能访问调色板数据(FF69,FF68)。
下面是LCD可以显示时的典型状态:
Mode 2 2_____2_____2_____2_____2_____2___________________2____
Mode 3 _33____33____33____33____33____33__________________3___
Mode 0 ___000___000___000___000___000___000________________000
Mode 1 ____________________________________11111111111111_____
状态位的值在0, 2, 3之间遍历的时间约为109uS。为0的时间约为48.6uS,为2的时间约为19uS,为3的时间约为41uS。
状态0持续约201-207个时钟周期,状态2持续约77-83个时钟周期,状态3持续约169-175个时钟周期。经历上述3个状态的循环将持续456个时钟周期。垂直消隐持续4560个周期。整个屏幕每隔70224个时钟周期刷新一次。
LCD中断
INT 40 – 垂直消隐中断
垂直消隐中断在GB中平均每秒产生59.7次,在SGB中平均每秒产生61.1次。该中断产生在垂直消隐阶段刚开始的时候产生(LY=144)。
INT 48 – LCDC状态中断
本中断的产生存在多种起因,具体的起因由STAT寄存器的值说明。一种常见的情况是:告诉用户“视频硬件将要重绘新的一条扫描线”了。这可能在对SCX/SCY寄存器($FF43/$FF42)的值进行动态的控制以产生某些视频特效时有用。
LCD 位置和滚动
FF42 – SCY – Scroll Y (R/W)
FF43 – SCX – Scroll X (R/W)
表示256×256象素的背景图显示在LCD左上角的坐标。X/Y取值的范围是0-255,当绘图超出范围时,视频控制器将自动地把超过底部(右端)的背景图部分回卷显示到顶部(左端)。
FF44 – LY – LCDC Y-Coordinate (R)
LY表示将要传输到LCD驱动的一条扫描线数据的垂直位置。LY只可以取0-153之间的值,144-153表示垂直消隐期间的到来。任何对LY写的操作将会重置LY的值。
FF45 – LYC – LY Compare (R/W)
游戏机持续的比较LYC与LY寄存器的值,当它们相等时,STAT寄存器的同步位将被置1,同时将会请求一个STAT中断(如果允许的话)。
FF4A – WY – Window Y Position (R/W)
FF4B – WX – Window X Position minus 7 (R/W)
表示窗口区域在左上角的坐标。(窗口是一个后备的背景区,显示在正常背景的上面。精灵可以显示在窗口区域的上面或者下面,跟在正常的背景图上一样。)当位置设置在WX=0-166,WY=0-144的范围时,窗口才是可见的(如果允许的话)。WX=7, WY=0表示窗口区域位于屏幕的左上角。这时,它把背景区域完全覆盖了。
(未完,待续)