最近在学习GBC(or CGB),闲着没事,翻译了一下一个英文的文档。暂时是初稿,也还没有翻译完。不一定会修改,也不一定会翻译完。英文原文可以在这里找到 http://verhoeven272.nl/fruttenboel/Gameboy/GBmain.html
前言
下面所述的是关于一种被叫做gameboy的手持游戏机的内部工作机制的介绍,该游戏机是由任天堂公司设计和制造的。这些介绍帮助用户了解他们的gameboy是如何“滴答”运行的。Gameboy属任天堂公司版权所有。所有对具有版权的材料的引用只为教育和学习之用,不以赢利为目的。
Game Boy 技术参数
CPU - 8位(与Z80处理器相似)
主频 - 4.194304MHz (
工作内存 8 KB ( CGB是32KB)
视频内存 8 KB ( CGB是16KB)
屏幕尺寸 2.6寸
分辨率 160×144 (20×18块图案)
最大精灵数 每屏最多16个,每行最多10个
精灵尺寸 8×8或8×16
调色板
颜色 4个灰度层(CGB是32768种颜色)
水平同步 9198 KHz (9420 KHz for SGB)
垂直同步 59.73 Hz (61.17 Hz for SGB)
声音 4声道立体音
电源 直流6V 0.7W
内存分配图
Gameboy有16位的地址总线,用于寻址ROM, RAM和I/O寄存器。
基本分配图
0000-3FFF 16KB ROM Bank 00 (in cartridge, fixed at bank 00)
4000-7FFF 16KB ROM Bank 01..NN (in cartridge, switchable bank number)
8000-9FFF 8KB Video RAM (VRAM) (switchable bank 0-1 in CGB Mode)
A000-BFFF 8KB External RAM (in cartridge, switchable bank, if any)
C000-CFFF 4KB Work RAM Bank 0 (WRAM)
D000-DFFF 4KB Work RAM Bank 1 (WRAM) (switchable bank 1-7 in CGB Mode)
E000-FDFF Same as C000-DDFF (ECHO) (typically not used)
FE00-FE9F Sprite Attribute Table (OAM)
FEA0-FEFF Not Usable
FF00-FF7F I/O Ports
FF80-FFFE High RAM (HRAM)
FFFF Interrupt Enable Register
位于ROM Bank 0的跳转向量
下面的地址是用作跳转向量的:
0000,0008,0010,0018,0020,0028,0030,0038 用于RST控制
0040,0048,0050,0058,0060 用于中断
但是,假如你的程序没有使用RST控制或中断,这些地址的内存可能用于其它用途。RST命令是一个字节长的操作码,除了目的地址是固定的外,它类似于CALL指令。
ROM Bank 0中的卡带头
0100-014F的内存是卡带的头信息。这个区域包含了程序代码,入口点,校验和,关于内存控制器(MBC)芯片使用状况的信息,ROM和RAM的尺寸等等。其中的大多数字节都必需正确的设置。请参阅卡带头这一节以了解更详细的信息。
外部的内存和硬件
0000-7FFF和A000-BFFF范围的内存空间可以用于连接外部的硬件。第一个区域一般是作为ROM的地址空间,带有内存控制器的卡带也可以使用这个区域来产生数据(只写)到内存控制器芯片。第二个区域经常作为外部RAM或者其它硬件(如实时时钟等)的地址空间。外部的内存一般连接到浮冲电池,即使在游戏机关闭或者卡带被移除的情况下也能保存游戏进度和分数纪录等。请参阅内存控制器这一节以了解更详细的信息。
视频显示
LCD控制寄存器
FF40 – LCDC – LCD 控制 (R/W)
Bit 7 - LCD Display Enable (0=Off, 1=On)
Bit 6 - Window Tile Map Display Select (0=9800-9BFF, 1=9C00-9FFF)
Bit 5 - Window Display Enable (0=Off, 1=On)
Bit 4 - BG & Window Tile Data Select (0=8800-97FF, 1=8000-8FFF)
Bit 3 - BG Tile Map Display Select (0=9800-9BFF, 1=9C00-9FFF)
Bit 2 - OBJ (Sprite) Size (0=8x8, 1=8x16)
Bit 1 - OBJ (Sprite) Display Enable (0=Off, 1=On)
Bit 0 - BG Display (for CGB see below) (0=Off, 1=On)
LCDC.7 – LCD 显示使能
注意:停止LCD的操作(Bit7从1到0)只能在垂直消隐(V-Blank)期间进行,如果在这之外操作,有可能对硬件造成破坏。这个问题似乎比较严重,据说任天堂拒绝任何不遵守此条规则的游戏。
当LY的值大于或等于144时意味着垂直消隐期间。当LCD显示被禁止的时候,屏幕是空白的(白色),VRAM和OAM在这时都可以自由的存取。
--对于不同的gameboy类型,LCDC.0有不同的含义--
LCDC.0 – 1) 单色的gameboy和SGB:背景显示
当Bit0被清除时,背景变成空白(白色)。窗口和精灵仍然可以显示(如果Bit1和/或Bit5允许的话)。
LCDC.0 – 2) CGB 在CGB状态:背景和窗口优先级控制
当Bit0被清除时,背景和窗口丢失了它们的优先级,精灵将总是显示在背景和窗口之上,而不受OAM和背景属性图的优先标志位的影响。
LCDC.0 – 3) CGB 在非CGB状态:背景和窗口显示控制
当Bit0被清除时,背景和窗口都变成空白(白色)。在该情况下,窗口显示控制位(bit 5)被忽略。只有精灵可以在这种情况下显示(如果Bit1置1)。
这可能造成一个兼容性问题-任何禁止背景显示,但又希望显示窗口的单色游戏(如果有的话),在CGB上将不会正常运行。
(未完,待续)