Pan Docs |
关于 Pan Docs |
================================================================= 你能在这里知道有关 GAMEBOY 的一切 * ================================================================= |
* 这种事情开心就好 |
Pan of -ATX- Document Updated by contributions from: Marat Fayzullin, Pascal Felber, Paul Robson, Martin Korth CPU, SGB, CGB, AUX specs by Martin Korth |
Last updated 10/2001 by nocash Previously updated 4-Mar-98 by kOOPa |
http://www.work.de/nocash/pandocs.txt http://www.work.de/nocash/pandocs.htm |
Game Boy 技术数据 |
CPU - 8位 (与 Z80 处理器相似) 时钟主频 - 4.194304 MHz (SGB 是 4.295454 MHz, CGB 最高可达 8.4 MHz) 工作 RAM - 8K 字节 (CGB 为 32K 字节) 显示 RAM - 8K 字节 (CGB 为 16K 字节) 屏幕大小 - 2.6 寸 分辨率 - 160x144 (20x18 图块) 最大活动块 - 屏幕最多40个, 每行最多10个 活动块大小 - 8x8 或者 8x16 调色板 - BG 1x4, OBJ 2x3 (CGB 为 BG 8x4, OBJ 8x3) 颜色 - 4级灰度 (CGB 为32768色) 横向同步 - 9198 KHz (SGB 为 9420 KHz) 纵向同步 - 59.73 Hz (SGB 为 61.17 Hz) 声音 - 4通道立体声 电源 - DC6V 0.7W (GB Pocket 为 DC3V 0.7W, CGB 为 DC3V 0.6W) |
内存映射 |
0000-3FFF 16KB ROM Bank 00 (于卡带内, 固定为 Bank 00) 4000-7FFF 16KB ROM Bank 01 到 NN (于卡带内, 可切 Bank) 8000-9FFF 8KB 显示 RAM (VRAM) (在 CGB 模式中可以切 Bank 0 或 1) A000-BFFF 8KB 外部 RAM (ERAM/SRAM) (于卡带内, 如果条件允许可切 Bank) C000-CFFF 4KB 工作 RAM Bank 0 (WRAM) D000-DFFF 4KB 工作 RAM Bank 1 (WRAM) (在 CGB 模式中可以切 Bank 1 到 7) E000-FDFF 与 C000-DDFF 一致 (ECHO) (一般不用) FE00-FE9F 活动块属性表 (OAM) FEA0-FEFF 不可用 FF00-FF7F I/O 端口 FF80-FFFE 高位 RAM (HRAM) FFFF 中断启用寄存器 |
0000,0008,0010,0018,0020,0028,0030,0038 通过使用 RST 指令 0040,0048,0050,0058,0060 通过中断 |
视频显示 |
LCD 控制寄存器 |
Bit 7 - 开启 LCD 显示 (0=关, 1=开) Bit 6 - 窗口图块 Map 显示选择 (0=9800-9BFF, 1=9C00-9FFF) Bit 5 - 开启窗口显示 (0=关, 1=开) Bit 4 - BG & 窗口图块数据源选择 (0=8800-97FF, 1=8000-8FFF) Bit 3 - BG 图块 Map 显示选择 (0=9800-9BFF, 1=9C00-9FFF) Bit 2 - OBJ (活动块) 大小 (0=8x8, 1=8x16) Bit 1 - 开启 OBJ (活动块) 显示 (0=关, 1=开) Bit 0 - BG 显示 (对于 CGB, 见下) (0=关, 1=开) |
LCD 状态寄存器 |
Bit 6 - LYC=LY 一致中断 (1=启用) (读写) Bit 5 - 模式 2 OAM 中断 (1=启用) (读写) Bit 4 - 模式 1 V-Blank 中断 (1=启用) (读写) Bit 3 - 模式 0 H-Blank 中断 (1=启用) (读写) Bit 2 - 一致标志位 (0:LYC<>LY, 1:LYC=LY) (只读) Bit 1-0 - 模式标志位 (模式 0-3, 见下) (只读) 0: 处于 H-Blank 1: 处于 V-Blank 2: 处于检索 OAM-RAM 的状态 3: 处于传送数据至 LCD 驱动的状态 |
模式 0: LCD 控制器处于 H-Blank 时段, CPU 可以访问显示 RAM (8000h-9FFFh) 和 OAM (FE00h-FE9Fh). |
模式 1: LCD 控制器处于 V-Blank 时段 (或者屏幕处于关闭状态), CPU 可以访问显示 RAM (8000h-9FFFh) 和 OAM (FE00h-FE9Fh). |
模式 2: LCD 控制器正在从 OAM 存储中读取数据. CPU <不可以>在这个时段访问 OAM 存储 (FE00h-FE9Fh). |
模式 3: LCD 控制器正在从 OAM 和 VRAM 中读取数据, CPU <不可以>在这个时段访问 OAM 和 VRAM. CGB 模式: 也不可以放访问调色板数据 (FF69,FF6B). |
模式 2 2_____2_____2_____2_____2_____2___________________2____ 模式 3 _33____33____33____33____33____33__________________3___ 模式 0 ___000___000___000___000___000___000________________000 模式 1 ____________________________________11111111111111_____ |
LCD 中断 |
LCD 位置与卷轴 |
LCD 单色调色板 |
比特位 7-6 - 颜色编号3的灰度等级 比特位 5-4 - 颜色编号2的灰度等级 比特位 3-2 - 颜色编号1的灰度等级 比特位 1-0 - 颜色编号0的灰度等级 |
0 白色 1 浅灰 2 深灰 3 黑色 |
LCD 彩色调色板 (仅 CGB) |
比特位 0-5 索引 (00-3F) 比特位 7 自动递增 (0=禁用, 1=写操作后递增) |
比特位 0-4 红色的强度 (00-1F) 比特位 5-9 绿色的强度 (00-1F) 比特位 10-14 蓝色的强度 (00-1F) |
LCD VRAM Bank (仅 CGB) |
Bit 0 - VRAM Bank (0-1) |
LCD OAM DMA 传输 |
Source: XX00-XX9F ;XX in range from 00-F1h Destination: FE00-FE9F |
ld (0FF46h),a ;start DMA transfer, a=start address/100h ld a,28h ;delay... wait: ;total 5x40 cycles, approx 200ms dec a ;1 cycle jr nz,wait ;4 cycles |
LCD VRAM DMA 传输 (仅 CGB) |
VRAM 图块数据 |
Byte 0-1 第一行 (最上方的 8 个像素) Byte 2-3 下一行 以此类推. |
VRAM BG Map |
Bit 0-2 背景调色板编号 (BGP0-7) Bit 3 图块 VRAM Bank 号 (0=Bank 0, 1=Bank 1) Bit 4 不使用 Bit 5 水平翻转 (0=普通, 1=水平翻转) Bit 6 垂直翻转 (0=普通, 1=垂直翻转) Bit 7 BG 与 OAM 优先级 (0=根据 OAM 优先位, 1=BG 优先) |
显存精灵属性表 (OAM) |
比特位7 物体到背景(OBJ to BG)优先级 (0=物体在背景之上, 1=物体在背景颜色1-3下面) (适用于背景和窗口。背景颜色0一直在物体之下) 比特位6 Y 翻转 (0=正常, 1=纵向镜像) 比特位5 X 翻转 (0=Normal, 1=横向镜像) 比特位4 调色板编号 **仅限非CGB模式** (0=OBP0, 1=OBP1) 比特位3 图砖的显存容组 **仅限CGB模式** (0=容组 0, 1=容组 1) 比特位2-0 调色板编号 **仅限CGB模式** (OBP0-7) |
访问 VRAM 和 OAM |
Mode 0 - H-Blank 时期 Mode 1 - V-Blank 时期 Mode 2 - 检索 OAM 时期 |
ld hl,0FF41h ;-STAT 寄存器 @@wait: ;\ bit 1,(hl) ; 等待直到模式为 0 或 1 jr nz,@@wait ;/ |
Mode 0 - H-Blank 时期 Mode 1 - V-Blank 时期 |
ld hl,0FF41h ;-STAT 寄存器 @@wait1: ;\ bit 1,(hl) ; 等待直到模式 -不为- 0 或 1 jr z,@@wait1 ;/ @@wait2: ;\ bit 1,(hl) ; 等待直到模式 0 或 1 -开始- jr nz,@@wait2 ;/ |
声音控制器 |
声音总览 |
具有扫频和包络线功能的方波图形。 具有包络线功能的方波图形。 从波形存储器产生的自主波形图案。 具有包络线功能的白噪音。 |
声音通道 1 - 乐音和扫频 |
比特位 6-4 - 扫频时间 比特位 3 - 递增/递减扫频 0: 相加 (频率增加) 1: 相减 (频率减少) 比特位 2-0 - 扫频偏移数 (n: 0-7) |
000: 扫频关闭 - 无频率变化 001: 7.8 ms (1/128Hz) 010: 15.6 ms (2/128Hz) 011: 23.4 ms (3/128Hz) 100: 31.3 ms (4/128Hz) 101: 39.1 ms (5/128Hz) 110: 46.9 ms (6/128Hz) 111: 54.7 ms (7/128Hz) |
X(t) = X(t-1) +/- X(t-1)/2^n |
比特位 7-6 - 波形图案工作周期 (读/写) Bit 5-0 - 声音长度数值 (只可写) (t1: 0-63) |
00: 12.5% ( _-------_-------_------- ) 01: 25% ( __------__------__------ ) 10: 50% ( ____----____----____---- ) (普通) 11: 75% ( ______--______--______-- ) |
比特位 7-4 - 包络线起始音量 (0-0Fh) (0=无声音) 比特位 3 - 包络线方向 (0=减少, 1=增加) 比特位 2-0 - 包络线扫频数 (n: 0-7) (若为零,停止包络线操作。) |
比特位 7 - 启动 (1=重启声音) (只写) Bit 6 - 计数器/连续性选择 (读/写) (1=达到NR11中指定的长度时,停止输出) Bit 2-0 - 频率的高3位 (x) (只写) |
声音通道 2 - 乐音 |
比特位 7-6 - 波形图案工作周期 (读/写) 比特位 5-0 - 声音长度数据 (只写) (t1: 0-63) |
00: 12.5% ( _-------_-------_------- ) 01: 25% ( __------__------__------ ) 10: 50% ( ____----____----____---- ) (普通) 11: 75% ( ______--______--______-- ) |
比特位 7-4 - 包络线起始音量 (0-0Fh) (0=无声音) 比特位 3 - 包络线方向 (0=减少, 1=增加) 比特位 2-0 - 包络线扫频数 (n: 0-7) (若为零,停止包络线操作。) |
比特位 7 - 启动 (1=重启声音) (只写) 比特位 6 - 计数器/连续性选择 (读/写) (1=达到NR21中指定的长度时,停止输出) 比特位 2-0 - 频率的高3位 (x) (只写) |
声音 3 - 波形输出 |
比特位 7 - 声音通道 3 关闭 (0=停止, 1=回放) (读/写) |
比特位 7-0 - 声音长度 (t1: 0 - 255) |
比特位 6-5 - 选择输出水平 (读/写) |
0: 静音 (无声音) 1: 100% 音量 (原样产生波形图案内存数据) 2: 50% 音量 (产生右移一位的波形图案内存数据) 3: 25% 音量 (产生右移两位的波形图案内存数据) |
比特位 7 - 启动 (1=重启声音) (只写) 比特位 6 - 计数器/连续性选择 (读/写) (1=达到NR31中指定的长度时,停止输出) 比特位 2-0 - 频率的高3位 (x) (只写) |
声音通道 4 - 噪音 |
比特位 5-0 - 声音长度数据 (t1: 0-63) |
比特位 7-4 - 包络线起始音量 (0-0Fh) (0=无声音) 比特位 3 - 包络线方向 (0=减少, 1=增加) 比特位 2-0 - 包络线扫频数 (n: 0-7) (若为零,停止包络线操作。) |
比特位 7-4 - 移位时钟频率(s) 比特位 3 - 计数器 步长/宽度 (0=15 位, 1=7 位) 比特位 2-0 - 频率相除系数 (r) |
比特位 7 - 启动 (1=重启声音) (只写) 比特位 6 - 计数器/连续性选择 (读/写) (1=达到NR41中指定的长度时,停止输出) |
声音控制寄存器 |
比特位 7 - 输出 Vin 到 SO2 端口 (1=启用) 比特位 6-4 - SO2 输出水平 (音量) (0-7) 比特位 3 - 输出 Vin 到 SO1 端口 (1=启用) 比特位 2-0 - SO1 输出水平 (音量) (0-7) |
比特位 7 - 输出声音 4 到 SO2 端口 比特位 6 - 输出声音 3 到 SO2 端口 比特位 5 - 输出声音 2 到 SO2 端口 比特位 4 - 输出声音 1 到 SO2 端口 比特位 3 - 输出声音 4 到 SO1 端口 比特位 2 - 输出声音 3 到 SO1 端口 比特位 1 - 输出声音 2 到 SO1 端口 比特位 0 - 输出声音 1 到 SO1 端口 |
比特位 7 - 全部声音 开启/关闭 (0: 停止所有声音电路) (读/写) 比特位 3 - 声音 4 开启标志位 (只读) 比特位 2 - 声音 3 开启标志位 (只读) 比特位 1 - 声音 2 开启标志位 (只读) 比特位 0 - 声音 1 开启标志位 (只读) |
手柄输入 |
Bit 7 - 未使用 Bit 6 - 未使用 Bit 5 - P15 选择按钮键 (0=选择) Bit 4 - P14 选择方向键 (0=选择) Bit 3 - P13 输入下或开始 (0=已按下) (只读) Bit 2 - P12 输入上或选择 (0=已按下) (只读) Bit 1 - P11 输入左或按钮B (0=已按下) (只读) Bit 0 - P10 输入右或按钮A (0=已按下) (只读) |
Serial Data Transfer (Link Cable) |
Bit 7 - Transfer Start Flag (0=No Transfer, 1=Start) Bit 1 - Clock Speed (0=Normal, 1=Fast) ** CGB Mode Only ** Bit 0 - Shift Clock (0=External Clock, 1=Internal Clock) |
8192Hz - 1KB/s - Bit 1 cleared, Normal 16384Hz - 2KB/s - Bit 1 cleared, Double Speed Mode 262144Hz - 32KB/s - Bit 1 set, Normal 524288Hz - 64KB/s - Bit 1 set, Double Speed Mode |
ld a,$75 ld ($FF01),a ld a,$81 ld ($FF02),a |
定时与分频寄存器 |
比特位 2 - 定时器停止 (0=停止, 1=开始) 比特位 1-0 - 输入时钟选择 00: 4096 Hz (~4194 Hz SGB) 01: 262144 Hz (~268400 Hz SGB) 10: 65536 Hz (~67110 Hz SGB) 11: 16384 Hz (~16780 Hz SGB) |
中断 |
0 - Disable all Interrupts 1 - Enable all Interrupts that are enabled in IE Register (FFFF) |
EI ;Enable Interrupts (ie. IME=1) DI ;Disable Interrupts (ie. IME=0) RETI ;Enable Ints & Return (same as the opcode combination EI, RET) <INT> ;Disable Ints & Call to Interrupt Vector |
Bit 0: V-Blank Interrupt Enable (INT 40h) (1=Enable) Bit 1: LCD STAT Interrupt Enable (INT 48h) (1=Enable) Bit 2: Timer Interrupt Enable (INT 50h) (1=Enable) Bit 3: Serial Interrupt Enable (INT 58h) (1=Enable) Bit 4: Joypad Interrupt Enable (INT 60h) (1=Enable) |
Bit 0: V-Blank Interrupt Request (INT 40h) (1=Request) Bit 1: LCD STAT Interrupt Request (INT 48h) (1=Request) Bit 2: Timer Interrupt Request (INT 50h) (1=Request) Bit 3: Serial Interrupt Request (INT 58h) (1=Request) Bit 4: Joypad Interrupt Request (INT 60h) (1=Request) |
1) More than one interrupt signal changed from Low to High at the same time. 2) Several interrupts have been requested during a time in which IME/IE didn't allow these interrupts to be executed directly. 3) The user has written a value with several "1" bits (for example 1Fh) to the IF register. |
CGB Registers |
Bit 7: Current Speed (0=Normal, 1=Double) (Read Only) Bit 0: Prepare Speed Switch (0=No, 1=Prepare) (Read/Write) |
IF KEY1_BIT7 <> DESIRED_SPEED THEN IE=00H ;(FFFF)=00h JOYP=30H ;(FF00)=30h KEY1=01H ;(FF4D)=01h STOP ;STOP ENDIF |
The CPU (2.10 MHz, 1 Cycle = approx. 0.5us) Timer and Divider Registers Serial Port (Link Cable) DMA Transfer to OAM |
LCD Video Controller HDMA Transfer to VRAM All Sound Timings and Frequencies |
Bit 0: Write Data (0=LED Off, 1=LED On) (Read/Write) Bit 1: Read Data (0=Receiving IR Signal, 1=Normal) (Read Only) Bit 6-7: Data Read Enable (0=Disable, 3=Enable) (Read/Write) |
Bit 0-2 Select WRAM Bank (Read/Write) |
SGB Functions |
SGB Description |
SGB Unlocking and Detecting SGB Functions |
146h - SGB Flag - Must be set to 03h for SGB games 14Bh - Old Licensee Code - Must be set 33h for SGB games |
01h SGB or Normal Gameboy (DMG) FFh SGB2 or Pocket Gameboy 11h CGB or GBA |
SGB Command Packet Transfers |
RESET 0 0 1 1 0 1 0 P14 --_---_---_-----------_-------_--... P15 --_-----------_---_-------_------... |
1 PULSE Reset 1 BYTE Command Code*8+Length 15 BYTES Parameter Data 1 BIT Stop Bit (0) |
1 PULSE Reset 16 BYTES Parameter Data 1 BIT Stop Bit (0) |
SGB VRAM Transfers |
SGB Command Summary |
Code Name Expl. 00 PAL01 Set SGB Palette 0,1 Data 01 PAL23 Set SGB Palette 2,3 Data 02 PAL03 Set SGB Palette 0,3 Data 03 PAL12 Set SGB Palette 1,2 Data 04 ATTR_BLK "Block" Area Designation Mode 05 ATTR_LIN "Line" Area Designation Mode 06 ATTR_DIV "Divide" Area Designation Mode 07 ATTR_CHR "1CHR" Area Designation Mode 08 SOUND Sound On/Off 09 SOU_TRN Transfer Sound PRG/DATA 0A PAL_SET Set SGB Palette Indirect 0B PAL_TRN Set System Color Palette Data 0C ATRC_EN Enable/disable Attraction Mode 0D TEST_EN Speed Function 0E ICON_EN SGB Function 0F DATA_SND SUPER NES WRAM Transfer 1 10 DATA_TRN SUPER NES WRAM Transfer 2 11 MLT_REG Controller 2 Request 12 JUMP Set SNES Program Counter 13 CHR_TRN Transfer Character Font Data 14 PCT_TRN Set Screen Data Color Data 15 ATTR_TRN Set Attribute from ATF 16 ATTR_SET Set Data to ATF 17 MASK_EN Game Boy Window Mask 18 OBJ_TRN Super NES OBJ Mode |
SGB Color Palettes Overview |
White --> Color 0 Light Gray --> Color 1 Dark Gray --> Color 2 Black --> Color 3 |
SGB Palette Commands |
Byte Content 0 Command*8+Length (fixed length=01h) 1-E Color Data for 7 colors of 2 bytes (16bit) each: Bit 0-4 - Red Intensity (0-31) Bit 5-9 - Green Intensity (0-31) Bit 10-14 - Blue Intensity (0-31) Bit 15 - Not used (zero) F Not used (00h) |
Byte Content 0 Command*8+Length (fixed length=1) 1-2 System Palette number for SGB Color Palette 0 (0-511) 3-4 System Palette number for SGB Color Palette 1 (0-511) 5-6 System Palette number for SGB Color Palette 2 (0-511) 7-8 System Palette number for SGB Color Palette 3 (0-511) 9 Attribute File Bit 0-5 - Attribute File Number (00h-2Ch) (Used only if Bit7=1) Bit 6 - Cancel Mask (0=No change, 1=Yes) Bit 7 - Use Attribute File (0=No, 1=Apply above ATF Number) A-F Not used (zero) |
Byte Content 0 Command*8+Length (fixed length=1) 1-F Not used (zero) |
000-FFF Data for System Color Palette 0-511 |
SGB Color Attribute Commands |
Byte Content 0 Command*8+Length (length=1..7) 1 Number of Data Sets (01h..12h) 2-7 Data Set #1 Byte 0 - Control Code (0-7) Bit 0 - Change Colors inside of surrounded area (1=Yes) Bit 1 - Change Colors of surrounding character line (1=Yes) Bit 2 - Change Colors outside of surrounded area (1=Yes) Bit 3-7 - Not used (zero) Exception: When changing only the Inside or Outside, then the Surrounding line becomes automatically changed to same color. Byte 1 - Color Palette Designation Bit 0-1 - Palette Number for inside of surrounded area Bit 2-3 - Palette Number for surrounding character line Bit 4-5 - Palette Number for outside of surrounded area Bit 6-7 - Not used (zero) Data Set Byte 2 - Coordinate X1 (left) Data Set Byte 3 - Coordinate Y1 (upper) Data Set Byte 4 - Coordinate X2 (right) Data Set Byte 5 - Coordinate Y2 (lower) Specifies the coordinates of the surrounding rectangle. 8-D Data Set #2 (if any) E-F Data Set #3 (continued at 0-3 in next packet) (if any) |
Byte Content 0 Command*8+Length (length=1..7) 1 Number of Data Sets (01h..6Eh) (one byte each) 2 Data Set #1 Bit 0-4 - Line Number (X- or Y-coordinate, depending on bit 7) Bit 5-6 - Palette Number (0-3) Bit 7 - H/V Mode Bit (0=Vertical line, 1=Horizontal Line) 3 Data Set #2 (if any) 4 Data Set #3 (if any) etc. |
Byte Content 0 Command*8+Length (fixed length=1) 1 Color Palette Numbers and H/V Mode Bit Bit 0-1 Palette Number below/right of division line Bit 2-3 Palette Number above/left of division line Bit 4-5 Palette Number for division line Bit 6 H/V Mode Bit (0=split left/right, 1=split above/below) 2 X- or Y-Coordinate (depending on H/V bit) 3-F Not used (zero) |
Byte Content 0 Command*8+Length (length=1..6) 1 Beginning X-Coordinate 2 Beginning Y-Coordinate 3-4 Number of Data Sets (1-360) 5 Writing Style (0=Left to Right, 1=Top to Bottom) 6 Data Sets 1-4 (Set 1 in MSBs, Set 4 in LSBs) 7 Data Sets 5-8 (if any) 8 Data Sets 9-12 (if any) etc. |
Byte Content 0 Command*8+Length (fixed length=1) 1-F Not used (zero) |
000-FD1 Data for ATF0 through ATF44 (4050 bytes) FD2-FFF Not used |
Byte Content 0 Command*8+Length (fixed length=1) 1 Attribute File Number (00-2Ch), Bit 6=Cancel Mask 2-F Not used (zero) |
SGB Sound Functions |
Byte Content 0 Command*8+Length (fixed length=1) 1 Sound Effect A (Port 1) Decrescendo 8bit Sound Code 2 Sound Effect B (Port 2) Sustain 8bit Sound Code 3 Sound Effect Attributes Bit 0-1 - Sound Effect A Pitch (0..3=Low..High) Bit 2-3 - Sound Effect A Volume (0..2=High..Low, 3=Mute on) Bit 4-5 - Sound Effect B Pitch (0..3=Low..High) Bit 6-7 - Sound Effect B Volume (0..2=High..Low, 3=Not used) 4 Music Score Code (must be zero if not used) 5-F Not used (zero) |
Byte Content 0 Command*8+Length (fixed length=1) 1-F Not used (zero) |
000 One (or two ???) 16bit expression(s ???) indicating the transfer destination address and transfer length. ...-... Transfer Data ...-FFF Remaining bytes not used |
0400h-2AFFh APU-RAM Program Area (9.75KBytes) 2B00h-4AFFh APU-RAM Sound Score Area (8Kbytes) 4DB0h-EEFFh APU-RAM Sampling Data Area (40.25 Kbytes) |
Code Description P V Code Description P V 00 Dummy flag, re-trigger - 2 18 Fast Jump 3 1 80 Effect A, stop/silent - 2 19 Jet (rocket) takeoff 0 1 01 Nintendo 3 1 1A Jet (rocket) landing 0 1 02 Game Over 3 2 1B Cup breaking 2 2 03 Drop 3 1 1C Glass breaking 1 2 04 OK ... A 3 2 1D Level UP 2 2 05 OK ... B 3 2 1E Insert air 1 1 06 Select...A 3 2 1F Sword swing 1 1 07 Select...B 3 1 20 Water falling 2 1 08 Select...C 2 2 21 Fire 1 1 09 Mistake...Buzzer 2 1 22 Wall collapsing 1 2 0A Catch Item 2 2 23 Cancel 1 2 0B Gate squeaks 1 time 2 2 24 Walking 1 2 0C Explosion...small 1 2 25 Blocking strike 1 2 0D Explosion...medium 1 2 26 Picture floats on & off 3 2 0E Explosion...large 1 2 27 Fade in 0 2 0F Attacked...A 3 1 28 Fade out 0 2 10 Attacked...B 3 2 29 Window being opened 1 2 11 Hit (punch)...A 0 2 2A Window being closed 0 2 12 Hit (punch)...B 0 2 2B Big Laser 3 2 13 Breath in air 3 2 2C Stone gate closes/opens 0 2 14 Rocket Projectile...A 3 2 2D Teleportation 3 1 15 Rocket Projectile...B 3 2 2E Lightning 0 2 16 Escaping Bubble 2 1 2F Earthquake 0 2 17 Jump 3 1 30 Small Laser 2 2 |
Code Description P V Code Description P V 00 Dummy flag, re-trigger - 4 0D Waterfall 2 2 80 Effect B, stop/silent - 4 0E Small character running 3 1 01 Applause...small group 2 1 0F Horse running 3 1 02 Applause...medium group 2 2 10 Warning sound 1 1 03 Applause...large group 2 4 11 Approaching car 0 1 04 Wind 1 2 12 Jet flying 1 1 05 Rain 1 1 13 UFO flying 2 1 06 Storm 1 3 14 Electromagnetic waves 0 1 07 Storm with wind/thunder 2 4 15 Score UP 3 1 08 Lightning 0 2 16 Fire 2 1 09 Earthquake 0 2 17 Camera shutter, formanto 3 4 0A Avalanche 0 2 18 Write, formanto 0 1 0B Wave 0 1 19 Show up title, formanto 0 1 0C River 3 2 |
SGB System Control Commands |
Byte Content 0 Command*8+Length (fixed length=1) 1 Gameboy Screen Mask (0-3) 0 Cancel Mask (Display activated) 1 Freeze Screen (Keep displaying current picture) 2 Blank Screen (Black) 3 Blank Screen (Color 0) 2-F Not used (zero) |
Byte Content 0 Command*8+Length (fixed length=1) 1 Attraction Disable (0=Enable, 1=Disable) 2-F Not used (zero) |
Byte Content 0 Command*8+Length (fixed length=1) 1 Test Mode Enable (0=Disable, 1=Enable) 2-F Not used (zero) |
Byte Content 0 Command*8+Length (fixed length=1) 1 Disable Bits Bit 0 - Use of SGB-Built-in Color Palettes (1=Disable) Bit 1 - Controller Set-up Screen (0=Enable, 1=Disable) Bit 2 - SGB Register File Transfer (0=Receive, 1=Disable) Bit 3-6 - Not used (zero) 2-F Not used (zero) |
Byte Content 0 Command*8+Length (fixed length=1) 1 SNES Destination Address, low 2 SNES Destination Address, high 3 SNES Destination Address, bank number 4 Number of bytes to write (01h-0Bh) 5 Data Byte #1 6 Data Byte #2 (if any) 7 Data Byte #3 (if any) etc. |
Byte Content 0 Command*8+Length (fixed length=1) 1 SNES Destination Address, low 2 SNES Destination Address, high 3 SNES Destination Address, bank number 4-F Not used (zero) |
000-FFF Data |
Byte Content 0 Command*8+Length (fixed length=1) 1 SNES Program Counter, low 2 SNES Program Counter, high 3 SNES Program Counter, bank number 4 SNES NMI Handler, low 5 SNES NMI Handler, high 6 SNES NMI Handler, bank number 7-F Not used, zero |
SGB Multiplayer Command |
Byte Content 0 Command*8+Length (fixed length=1) 1 Multiplayer Control (0-3) (Bit0=Enable, Bit1=Two/Four Players) 0 = One player 1 = Two players 3 = Four players 2-F Not used (zero) |
0Fh Joypad 1 0Eh Joypad 2 0Dh Joypad 3 0Ch Joypad 4 |
SGB Border and OBJ Commands |
Byte Content 0 Command*8+Length (fixed length=1) 1 Tile Transfer Destination Bit 0 - Tile Numbers (0=Tiles 00h-7Fh, 1=Tiles 80h-FFh) Bit 1 - Tile Type (0=BG Tiles, 1=OBJ Tiles) Bit 2-7 - Not used (zero) 2-F Not used (zero) |
000-FFF Bitmap data for 128 Tiles |
Byte Content 0 Command*8+Length (fixed length=1) 1-F Not used (zero) |
000-7FF BG Map 32x32 Entries of 16bit each (2048 bytes) 800-87F BG Palette Data (Palettes 4-7, each 16 colors of 16bits each) 880-FFF Not used, don't care |
Bit 0-9 - Character Number (use only 00h-FFh, upper 2 bits zero) Bit 10-12 - Palette Number (use only 4-7, officially use only 4-6) Bit 13 - BG Priority (use only 0) Bit 14 - X-Flip (0=Normal, 1=Mirror horizontally) Bit 15 - Y-Flip (0=Normal, 1=Mirror vertically) |
Byte Content 0 Command*8+Length (fixed length=1) 1 Control Bits Bit 0 - SNES OBJ Mode enable (0=Cancel, 1=Enable) Bit 1 - Change OBJ Color (0=No, 1=Use definitions below) Bit 2-7 - Not used (zero) 2-3 System Color Palette Number for OBJ Palette 4 (0-511) 4-5 System Color Palette Number for OBJ Palette 5 (0-511) 6-7 System Color Palette Number for OBJ Palette 6 (0-511) 8-9 System Color Palette Number for OBJ Palette 7 (0-511) These color entries are ignored if above Control Bit 1 is zero. Because each OBJ palette consists of 16 colors, four system palette entries (of 4 colors each) are transferred into each OBJ palette. The system palette numbers are not required to be aligned to a multiple of four, and will wrap to palette number 0 when exceeding 511. For example, a value of 511 would copy system palettes 511, 0, 1, 2 to the SNES OBJ palette. A-F Not used (zero) |
8F90-8FEF SNES OAM, 24 Entries of 4 bytes each (96 bytes) 8FF0-8FF5 SNES OAM MSBs, 24 Entries of 2 bits each (6 bytes) 8FF6-8FFF Not used, don't care (10 bytes) |
Byte 0 OBJ X-Position (0-511, MSB is separately stored, see below) Byte 1 OBJ Y-Position (0-255) Byte 2-3 Attributes (16bit) Bit 0-8 Tile Number (use only 00h-FFh, upper bit zero) Bit 9-11 Palette Number (use only 4-7) Bit 12-13 OBJ Priority (use only 3) Bit 14 X-Flip (0=Normal, 1=Mirror horizontally) Bit 15 Y-Flip (0=Normal, 1=Mirror vertically) |
Actually, the format is unknown ??? However, 2 bits are used per entry: One bit is the most significant bit of the OBJ X-Position. The other bit specifies the OBJ size (8x8 or 16x16 pixels). |
CPU 寄存器与标志位 |
16位 高 低 名字/功能 AF A - 累加器 & 标志位 BC B C BC DE D E DE HL H L HL SP - - 堆栈指针 PC - - 程序计数器/指针 |
位 名字 设置 清除 说明 7 zf Z NZ 零标志位 6 n - - 加减标志位 (BCD) 5 h - - 半溢出标志位 (BCD) 4 cy C NC 溢出标志位 3-0 - - - 不使用 (总是为0) |
CPU 指令集 |
ld r,r xx 4 ---- r=r ld r,n xx nn 8 ---- r=n ld r,(HL) xx 8 ---- r=(HL) ld (HL),r 7x 8 ---- (HL)=r ld (HL),n 36 nn 12 ---- (HL)=n ld A,(BC) 0A 8 ---- A=(BC) ld A,(DE) 1A 8 ---- A=(DE) ld A,(nn) FA 16 ---- A=(nn) ld (BC),A 02 8 ---- (BC)=A ld (DE),A 12 8 ---- (DE)=A ld (nn),A EA 16 ---- (nn)=A ld A,(FF00+n) F0 nn 12 ---- 从 I/O 端口 n 读取 (内存 FF00+n) ld (FF00+n),A E0 nn 12 ---- 向 I/O 端口 n 写入 (内存 FF00+n) ld A,(FF00+C) F2 8 ---- 从 I/O 端口 C 读取 (内存 FF00+C) ld (FF00+C),A E2 8 ---- 向 I/O 端口 C 写入 (内存 FF00+C) ldi (HL),A 22 8 ---- (HL)=A, HL=HL+1 ldi A,(HL) 2A 8 ---- A=(HL), HL=HL+1 ldd (HL),A 32 8 ---- (HL)=A, HL=HL-1 ldd A,(HL) 3A 8 ---- A=(HL), HL=HL-1 |
ld rr,nn x1 nn nn 12 ---- rr=nn ;rr 可以是 BC,DE,HL,SP ld SP,HL F9 8 ---- SP=HL ld (nn),SP 08 nn nn 20 ---- (nn)=SP push rr x5 16 ---- SP=SP-2 (SP)=rr ;rr 可以是 BC,DE,HL,AF pop rr x1 12 (AF) rr=(SP) SP=SP+2 ;rr 可以是 BC,DE,HL,AF |
add A,r 8x 4 z0hc A=A+r add A,n C6 nn 8 z0hc A=A+n add A,(HL) 86 8 z0hc A=A+(HL) adc A,r 8x 4 z0hc A=A+r+cy adc A,n CE nn 8 z0hc A=A+n+cy adc A,(HL) 8E 8 z0hc A=A+(HL)+cy sub r 9x 4 z1hc A=A-r sub n D6 nn 8 z1hc A=A-n sub (HL) 96 8 z1hc A=A-(HL) sbc A,r 9x 4 z1hc A=A-r-cy sbc A,n DE nn 8 z1hc A=A-n-cy sbc A,(HL) 9E 8 z1hc A=A-(HL)-cy and r Ax 4 z010 A=A & r and n E6 nn 8 z010 A=A & n and (HL) A6 8 z010 A=A & (HL) xor r Ax 4 z000 A=A xor r xor n EE nn 8 z000 A=A xor n xor (HL) AE 8 z000 A=A xor (HL) or r Bx 4 z000 A=A | r or n F6 nn 8 z000 A=A | n or (HL) B6 8 z000 A=A | (HL) cp r Bx 4 z1hc 比较 A-r cp n FE nn 8 z1hc 比较 A-n cp (HL) BE 8 z1hc 比较 A-(HL) inc r xx 4 z0h- r=r+1 inc (HL) 34 12 z0h- (HL)=(HL)+1 dec r xx 4 z1h- r=r-1 dec (HL) 35 12 z1h- (HL)=(HL)-1 daa 27 4 z-0x 十进制调整 A cpl 2F 4 -11- A = A xor FF ;A取反 |
add HL,rr x9 8 -0hc HL=HL+rr ;rr 可以是 BC,DE,HL,SP inc rr x3 8 ---- rr=rr+1 ;rr 可以是 BC,DE,HL,SP dec rr xB 8 ---- rr=rr-1 ;rr 可以是 BC,DE,HL,SP add SP,dd E8 16 00hc SP=SP +/- dd ;dd 是8位符号数 ld HL,SP+dd F8 12 00hc HL=SP +/- dd ;dd 是8位符号数 |
rlca 07 4 000c 循环左移 A rla 17 4 000c 带进位循环左移 A rrca 0F 4 000c 循环右移 A rra 1F 4 000c 带进位循环右移 A rlc r CB 0x 8 z00c 循环左移 r rlc (HL) CB 06 16 z00c 循环左移 (HL) rl r CB 1x 8 z00c 带进位循环左移 r rl (HL) CB 16 16 z00c 带进位循环左移 (HL) rrc r CB 0x 8 z00c 循环右移 r rrc (HL) CB 0E 16 z00c 循环右移 (HL) rr r CB 1x 8 z00c 带进位循环右移 r rr (HL) CB 1E 16 z00c 带进位循环右移 (HL) sla r CB 2x 8 z00c 算术左移 r ;Bit 0=0 sla (HL) CB 26 16 z00c 算术左移 (HL) ;Bit 0=0 swap r CB 3x 8 z000 交换 r 高低半字节 swap (HL) CB 36 16 z000 交换 (HL) 高低半字节 sra r CB 2x 8 z00c 算术右移 r ;Bit 7=Bit 7 sra (HL) CB 2E 16 z00c 算术右移 (HL) ;Bit 7=Bit 7 srl r CB 3x 8 z00c 逻辑右移 r ;Bit 7=0 srl (HL) CB 3E 16 z00c 逻辑右移 (HL) ;Bit 7=0 |
bit n,r CB xx 8 z01- 测试 Bit n bit n,(HL) CB xx 12 z01- 测试 Bit n set n,r CB xx 8 ---- 设置 Bit n set n,(HL) CB xx 16 ---- 设置 Bit n res n,r CB xx 8 ---- 清除 Bit n res n,(HL) CB xx 16 ---- 清除 Bit n |
ccf 3F 4 -00c cy=cy xor 1 ;cy取反 scf 37 4 -001 cy=1 nop 00 4 ---- 无操作 halt 76 N*4 ---- 停机直到产生中断 (低功耗) stop 10 00 ? ---- 低功耗待机模式 (极低功耗) di F3 4 ---- 关闭中断, IME=0 ei FB 4 ---- 开启中断, IME=1 |
jp nn C3 nn nn 16 ---- 跳转到 nn, PC=nn jp HL E9 4 ---- 跳转到 HL, PC=HL jp f,nn xx nn nn 16;12 ---- 条件跳转, 如果 nz,z,nc,c jr PC+dd 18 dd 12 ---- 相对跳转到 nn (PC=PC+/-7 位) jr f,PC+dd xx dd 12;8 ---- 相对条件跳转, 如果 nz,z,nc,c call nn CD nn nn 24 ---- 调用 nn, SP=SP-2, (SP)=PC, PC=nn call f,nn xx nn nn 24;12 ---- 条件调用, 如果 nz,z,nc,c ret C9 16 ---- 返回, PC=(SP), SP=SP+2 ret f xx 20;8 ---- 条件返回, 如果 nz,z,nc,c reti D9 16 ---- 返回并开启中断 (IME=1) rst n xx 16 ---- 调用 00,08,10,18,20,28,30,38 |
CPU Comparision with Z80 |
Opcode Z80 GMB --------------------------------------- 08 EX AF,AF LD (nn),SP 10 DJNZ PC+dd STOP 22 LD (nn),HL LDI (HL),A 2A LD HL,(nn) LDI A,(HL) 32 LD (nn),A LDD (HL),A 3A LD A,(nn) LDD A,(HL) D3 OUT (n),A - D9 EXX RETI DB IN A,(n) - DD <IX> - E0 RET PO LD (FF00+n),A E2 JP PO,nn LD (FF00+C),A E3 EX (SP),HL - E4 CALL P0,nn - E8 RET PE ADD SP,dd EA JP PE,nn LD (nn),A EB EX DE,HL - EC CALL PE,nn - ED <pref> - F0 RET P LD A,(FF00+n) F2 JP P,nn LD A,(FF00+C) F4 CALL P,nn - F8 RET M LD HL,SP+dd FA JP M,nn LD A,(nn) FC CALL M,nn - FD <IY> - CB3X SLL r/(HL) SWAP r/(HL) |
卡带头部 |
CE ED 66 66 CC 0D 00 0B 03 73 00 83 00 0C 00 0D 00 08 11 1F 88 89 00 0E DC CC 6E E6 DD DD D9 99 BB BB 67 63 6E 0E EC CC DD DC 99 9F BB B9 33 3E |
80h - 游戏支持 CGB 功能, 但是也能在旧 Gameboy 上运行. C0h - 游戏只在 CGB 上运行. (硬件上与 80h 相同). |
00h = 无 SGB 功能 (普通 Gameboy 或者 CGB 专用游戏) 03h = 游戏支持 SGB 功能 |
00h 只有 ROM 19h MBC5 01h MBC1 1Ah MBC5+RAM 02h MBC1+RAM 1Bh MBC5+RAM+电池 03h MBC1+RAM+电池 1Ch MBC5+震动 1Dh MBC5+震动+RAM 05h MBC2 1Eh MBC5+震动+RAM+电池 06h MBC2+电池 20h MBC6+FLASH+RAM+电池 08h ROM+RAM 09h ROM+RAM+电池 22h MBC7+加速度传感器+震动+RAM+电池 0Bh MMM01 FCh 口袋照相机 0Ch MMM01+RAM FDh 万代拓麻歌子5 0Dh MMM01+RAM+电池 FEh HuC3 FFh HuC1+RAM+电池 0Fh MBC3+实时时钟+电池 10h MBC3+实时时钟+RAM+电池 11h MBC3 12h MBC3+RAM 13h MBC3+RAM+电池 |
00h - 32K 字节 (ROM 没有分 Bank) 01h - 64K 字节 ( 4 个 Bank) 02h - 128K 字节 ( 8 个 Bank) 03h - 256K 字节 ( 16 个 Bank) 04h - 512K 字节 ( 32 个 Bank) 05h - 1M 字节 ( 64 个 Bank) - MBC1 仅使用其中 63 个 Bank 06h - 2M 字节 (128 个 Bank) - MBC1 仅使用其中 125 个 Bank 07h - 4M 字节 (256 个 Bank) 52h - 1.1M 字节 ( 72 个 Bank) 53h - 1.2M 字节 ( 80 个 Bank) 54h - 1.5M 字节 ( 96 个 Bank) |
00h - 0K 无 01h - 2K 字节 02h - 8K 字节 03h - 32K 字节 ( 4 个 Bank, 每个 Bank 8K 字节) 04h - 128K 字节 (16 个 Bank, 每个 Bank 8K 字节) 05h - 64K 字节 ( 8 个 Bank, 每个 Bank 8K 字节) |
00h - 日版 01h - 非日版 |
x=0:FOR i=0134h TO 014Ch:x=x-MEM[i]-1:NEXT |
MBC (存储页面控制器) |
无 (仅 32K 字节 ROM) |
MBC1 (最大 2M 字节 ROM, 可选最大 32K 字节 RAM) |
00h 关闭 RAM (默认) 0Ah 开启 RAM |
00h = ROM 切页模式 (最多 8K 字节 RAM, 2M 字节 ROM) (默认) 01h = RAM 切页模式 (最多 32K 字节 RAM, 512K 字节 ROM) |
MBC2 (最大 256K 字节 ROM, 512x4 位 RAM) |
MBC3 (最大 2M 字节 ROM, 可选最大 64K 字节 RAM, 实时时钟) |
08h RTC S 秒 0-59 (0-3Bh) 09h RTC M 分 0-59 (0-3Bh) 0Ah RTC H 时 0-23 (0-17h) 0Bh RTC DL 天数计数器的低 8 位 (0-FFh) 0Ch RTC DH 天数计数器的高 1 位, 溢出位, 停机位 Bit 0 天数计数器的最高位 (Bit 8) Bit 6 停机 (0 = 时钟活动, 1 = 时钟停止) Bit 7 天数计数器溢出位 (1 = 计数器溢出) |
MBC5 (最大 8M 字节 ROM, 可选最大 128K 字节 RAM, 可选震动) |
HuC1 (带有红外控制器的 MBC) |
MBC 时间问题 |
Gamegenie/Shark Cheats |
AB New data FCDE Memory address, XORed by 0F000h GI Old data, XORed by 0BAh and rotated left by two H Don't know, maybe checksum and/or else |
AB External RAM bank number CD New Data GHEF Memory Address (internal or external RAM, A000-DFFF) |
Power Up Sequence |
AF=$01B0 BC=$0013 DE=$00D8 HL=$014D Stack Pointer=$FFFE [$FF05] = $00 ; TIMA [$FF06] = $00 ; TMA [$FF07] = $00 ; TAC [$FF10] = $80 ; NR10 [$FF11] = $BF ; NR11 [$FF12] = $F3 ; NR12 [$FF14] = $BF ; NR14 [$FF16] = $3F ; NR21 [$FF17] = $00 ; NR22 [$FF19] = $BF ; NR24 [$FF1A] = $7F ; NR30 [$FF1B] = $FF ; NR31 [$FF1C] = $9F ; NR32 [$FF1E] = $BF ; NR33 [$FF20] = $FF ; NR41 [$FF21] = $00 ; NR42 [$FF22] = $00 ; NR43 [$FF23] = $BF ; NR30 [$FF24] = $77 ; NR50 [$FF25] = $F3 ; NR51 [$FF26] = $F1-GB, $F0-SGB ; NR52 [$FF40] = $91 ; LCDC [$FF42] = $00 ; SCY [$FF43] = $00 ; SCX [$FF45] = $00 ; LYC [$FF47] = $FC ; BGP [$FF48] = $FF ; OBP0 [$FF49] = $FF ; OBP1 [$FF4A] = $00 ; WY [$FF4B] = $00 ; WX [$FFFF] = $00 ; IE |
Reducing Power Consumption |
PWR Using the HALT Instruction |
@@wait: ld a,(0FF44h) ;LY cp a,144 jr nz,@@wait |
ld hl,vblank_flag ;hl=pointer to vblank_flag xor a ;a=0 @@wait: ;wait... halt ;suspend CPU - wait for ANY interrupt cp a,(hl) ;vblank flag still zero? jr z,@@wait ;wait more if zero ld (hl),a ;set vblank_flag back to zero |
PWR Using the STOP Instruction |
PWR Disabeling the Sound Controller |
PWR Not using CGB Double Speed Mode |
PWR Using the Skills |
Sprite RAM Bug |
inc rr dec rr ;rr = bc,de, or hl ldi a,(hl) ldd a,(hl) ldi (hl),a ldd (hl),a |
External Connectors |
Pin Name Expl. 1 VDD Power Supply +5V DC 2 PHI System Clock 3 /WR Write 4 /RD Read 5 /CS Chip Select 6-21 A0-A15 Address Lines 22-29 D0-D7 Data Lines 30 /RES Reset signal 31 VIN External Sound Input 32 GND Ground |
Pin Name Color Expl. 1 VCC - +5V DC 2 SOUT red Data Out 3 SIN orange Data In 4 P14 - Not used 5 SCK green Shift Clock 6 GND blue Ground |
Pin Expl. Tip Sound Left Middle Sound Right Base Ground |
END |