KITAQ 开发系统
用户手册 2026.09

KITAQ SERIES • 参考版

验证记录

已确认的运行画面

从第一行代码,到运行、观察和复测。
源码快照:2026 年 9 月 14 日 · 简体中文版:2026 年 9 月 14 日

原生编译器验证

Windows、Linux、macOS ARM 和 macOS Intel 的原生构建及运行验证均成功。KITAQGB 在每个环境通过 48 项测试和 395 项辅助工具检查;KITAQFC 通过 55 项测试和 401 项检查,也验证了 Rust 1.85。PUBLIC_DISTRIBUTION.json 记录已放置程序的哈希及验证来源。公开 GitHub Actions 会独立构建和验证这些源码。

保存的参考输出用于检查 ROM 字节、诊断和辅助工具格式。以前的 C# 模拟器验证保留为对应原始源码指纹的历史记录,并不自动证明全部 Rust API、真实硬件或完整的 FDS BIOS 游戏启动。原始 PNG 转换脚本无法取得,因此依据规格重新实现,不能声称与原脚本字节一致。

KITAQGB · SHA-256 · KITAQFC · SHA-256

2026-10-03 本地库差异与验证

已将 C:/kitaqgb_project/lib 的源码与公开版 2de7f4b 比较。仅凭时间戳无法确定哪个版本更新。本地版有新增功能,公开版也有其他新增功能和修正。以下说明针对保存的本地源码,与原有公开 API 的验证记录分开。

physics2d.c 保留接触 API,并通过 KQ2D_CACHE_SURFACE 提供缓存接触与速度限制实现。启用时须预留 ROM bank 13。定义 KQ2D_EXTERNAL_SCALE_Q8、KQ2D_EXTERNAL_REST_COMPONENT 或 KQ2D_EXTERNAL_SURFACE 时,调用方须提供对应实现。下列 8,872 项测试使用未定义这些选项的默认路径。

KQ3D_BODY_SPHERE=0x04 选择球与盒的接触处理。球半径为 half_x。kq3d_overlap_sphere_aabb(sphere, box) 包括相切边界;指针为 NULL 或半径不大于 0 时返回 0。没有专用的球与球求解器。坐标差、乘积与平方和须保持在各自的 16 位范围内。

带有 KQ3D_BODY_KINEMATIC=0x02 的活动 body,即使逆质量为 0,也会在 kq3d_step 中更新 X/Y 速度和位置。Z 位置和速度不变。逆质量为 0 的 body 不会被接触推移。kq3d_integrate_body 仍跳过静态 body。break_speed 和 KQ3D_BODY_BROKEN 不会自动触发破坏。

本地 bank_switch 写入 kq_bank_current 与地址 0x2000。它与公开版的 __bankswitch 路径不同,不更新编译器的 bank 跟踪状态。应从固定 bank 切换;需要维护编译器恢复状态时使用 __bankswitch。

本地 cgb_bg_color/cgb_obj_color 及单色 RGB 包装函数未启用调色板索引自动递增。CGB 执行确认 0x1234 的低字节被 0x12 覆盖。请使用公开版修正或 colors 数组 API。DMG 不执行写入。

本地 metasprite_draw 仅在全部完成时将使用数增加到 first_id+count。到达 40 个上限而提前返回时不会更新。first_id=39、count=2 时返回 1,槽位 39 活动,使用数为 0。公开版在处理每个槽位时更新使用数。

本地版提供 vram_get_queue_used 和 vram_get_queue_free,但没有公开版的 vram_get_queue_capacity。容量可使用 VRAM_QUEUE_MAX,默认 32。登记一个命令后,已用 1,空闲 31。

wire3d_dmg.h 仅在 96 行配置声明 DrawRect2D。DrawBoxEdges2D 在两种配置均有声明,DrawIndexedEdges 仅在 120 行配置声明。请选择一个与配置对应的源文件。本次未重新验证这些函数的绘制结果。 保存的 lib 源码中未找到 DrawRect2D 或 DrawBoxEdges2D 的实现。这些仅为声明,调用需要另外提供实现。

本地 audio_vblank 不含公开版的 AudioVBlank_QueueReset/QueueRefill/QueuePlay 和 audio_vblank_queue.inc。ZX0 也仅存在于公开版。这些属于公开版新增功能,不计入已验证的本地功能。

kq3d_overlap_sphere_aabb
u8 kq3d_overlap_sphere_aabb(const KQBody3D* sphere, const KQBody3D* box);

KQ3D_BODY_SPHERE=0x04 选择球与盒的接触处理。球半径为 half_x。kq3d_overlap_sphere_aabb(sphere, box) 包括相切边界;指针为 NULL 或半径不大于 0 时返回 0。没有专用的球与球求解器。坐标差、乘积与平方和须保持在各自的 16 位范围内。

physics3d.c / physics3d.h

本次执行的验证

2D 默认路径:通过 KOKURA C API 自动选择硬件,8,872 项全部通过。检查了速度限制、接触、有符号 Q8 乘法与接触时刻。这不是分别指定 DMG/CGB 的测试。

19 项物理边界测试在 DMG 与 CGB 各运行一次,共 38 次全部通过。独立的 3D 扩展与精灵/VRAM/调色板复现测试也在两种模式符合预期。调色板和精灵结果是成功复现缺陷,不是确认正确运行。

这些结果是 C# 编译器生成 ROM 的模拟器验证,不证明 Rust 等价性、实机、音频、绘制或所有 API 的正确性。原有图片与测试仍是绑定到各记录源码指纹的历史结果。

源码指纹、输入、预期值、实测值与复现步骤 · evidence.tar.gz · verify_rom_cases.py · verify_surface.py

画面截图

模拟器截图位于示例说明旁。请将输出与所述预期结果比较;仅凭画面不能验证声音、控制器输入、外设或实体硬件。

显示所提供的字符集 gb_font

用途: 查看所提供原创字体包含哪些字母、数字和标点,以及如何绘制。

工作原理: m_init 准备显示和字体。m_text 绘制每一行;m_put 通过字符码 34 绘制双引号。

操作与预期结果: 应看到 26 个大写字母、26 个小写字母、10 个数字及 30 个标点符号。检查每个字形是否清晰,无需输入。

显示所提供的字符集:应看到 26 个大写字母、26 个小写字母、10 个数字及 30 个标点符号。检查每个字形是否清晰,无需输入。
显示示例:应看到 26 个大写字母、26 个小写字母、10 个数字及 30 个标点符号。检查每个字形是否清晰,无需输入。

返回编译器手册示例 / 返回库手册示例

第一次显示文字 gb_hello

用途: 学习启动 ROM、在背景绘制文字和数值的基本步骤。

工作原理: m_init 后,m_text 绘制问候语,m_number 格式化 42。最后的循环等待各帧,同时保持画面可见。

操作与预期结果: 画面显示 HELLO WORLD 和 042。前导零来自三位十进制格式。

第一次显示文字:画面显示 HELLO WORLD 和 042。前导零来自三位十进制格式。
显示示例:画面显示 HELLO WORLD 和 042。前导零来自三位十进制格式。

返回编译器手册示例 / 返回库手册示例

使用更宽中间值的算术 gb_arithmetic

用途: 学习保留超出八位范围的中间结果。

工作原理: (u16)200 + 100 得到 300。程序将其除以 10,再转为 u8 显示。注意:扩大类型的强制转换发生在加法之前。

操作与预期结果: 030 表示计算结果 30。

使用更宽中间值的算术:030 表示计算结果 30。
显示示例:030 表示计算结果 30。

返回编译器手册示例 / 返回库手册示例

分支与循环 gb_control

用途: 在小型计算中尝试 for、continue、while、do/while 和 switch。

工作原理: 将 0 至 7 相加但跳过 3,得到 25。while 循环推进到 30,do/while 推进到 32,switch 选择 case 32 并赋值 42。

操作与预期结果: 042 是这些循环和分支的最终结果。

分支与循环:042 是这些循环和分支的最终结果。
显示示例:042 是这些循环和分支的最终结果。

返回编译器手册示例 / 返回库手册示例

函数、数组、结构体与指针 gb_aggregate

用途: 学习组织数值,并通过函数和指针访问。

工作原理: 程序复制含 (10,20) 的 Point,再通过指针将 1 至 4 写入数组。将函数结果 30、数组值 1、2、4 和常量 5 相加。

操作与预期结果: 总和显示为 042。请跟踪结构体复制、ptr[i] 写入和函数返回值。

函数、数组、结构体与指针:总和显示为 042。请跟踪结构体复制、ptr[i] 写入和函数返回值。
显示示例:总和显示为 042。请跟踪结构体复制、ptr[i] 写入和函数返回值。

返回编译器手册示例 / 返回库手册示例

位标志与缓冲区复制 gb_bits_memory

用途: 将标志打包到字节中,并将缓冲区复制到独立存储空间。

工作原理: __memset 清除四个字节。程序设置第 3 位、翻转第 1 位,再用 __memcpy 复制全部四字节。

操作与预期结果: 目标首字节显示为 010:第 3 位贡献 8,第 1 位贡献 2。

位标志与缓冲区复制:目标首字节显示为 010,第 3 位贡献 8,第 1 位贡献 2。
显示示例:目标首字节显示为 010:第 3 位贡献 8,第 1 位贡献 2。

返回编译器手册示例 / 返回库手册示例

统计新按下的按键 gb_input

用途: 区分新按下的按键与持续按住的按键。

工作原理: 每帧调用 input_update。只有 input_pressed(BTN_A) 为真时,计数器才递增。

操作与预期结果: 初始计数为 000。按 A 得到 001;持续按住不会增加。松开再按得到 002。字节计数器从 255 回绕到 000。

统计新按下的按键:初始计数为 000。按 A 得到 001;持续按住不会增加。松开再按得到 002。字节计数器从 255 回绕到 000。
显示示例:初始计数为 000。按 A 得到 001;持续按住不会增加。松开再按得到 002。字节计数器从 255 回绕到 000。

返回编译器手册示例 / 返回库手册示例

Q8.8 定点乘法 gb_fixed

用途: 学习整数转 Q8.8、乘法以及转回整数。

工作原理: fix_from_int 将 3 和 4 转为 Q8.8,fix_mul 将它们相乘,fix_to_int 再将乘积转回整数。

操作与预期结果: 012 表示 3 × 4 = 12。这是转换后的整数,不是按 256 缩放的内部值。

Q8.8 定点乘法:012 表示 3 × 4 = 12。这是转换后的整数,不是按 256 缩放的内部值。
显示示例:012 表示 3 × 4 = 12。这是转换后的整数,不是按 256 缩放的内部值。

返回编译器手册示例 / 返回库手册示例

从固定对象池分配 gb_entity

用途: 从固定槽位集合创建对象,无需动态分配。

工作原理: entity_init 重置对象池。entity_create 在 (20,30) 创建类型 1;程序检查失败 ID 0xFF 后,才将 vx 设为 2。

操作与预期结果: 001 是活动对象数,不是 ID 或坐标。本示例不更新或绘制对象,因此不会出现移动角色。

从固定对象池分配:001 是活动对象数,不是 ID 或坐标。本示例不更新或绘制对象,因此不会出现移动角色。
显示示例:001 是活动对象数,不是 ID 或坐标。本示例不更新或绘制对象,因此不会出现移动角色。

返回编译器手册示例 / 返回库手册示例

在 RAM 中记录诊断值 gb_debug

用途: 将有名称的游戏数值存入诊断缓冲区,与画面显示分开。

工作原理: 程序初始化调试,设置帧标签 1,并以 HP 为名记录值 42。

操作与预期结果: 001 是跟踪条目数。HP=42 保存在诊断缓冲区中;仅凭画面不能查看或验证该有效载荷。

在 RAM 中记录诊断值:001 是跟踪条目数。HP=42 保存在诊断缓冲区中;仅凭画面不能查看或验证该有效载荷。
显示示例:001 是跟踪条目数。HP=42 保存在诊断缓冲区中;仅凭画面不能查看或验证该有效载荷。

返回编译器手册示例 / 返回库手册示例

保存位置历史 gb_chain

用途: 学习用环形缓冲区保存位置轨迹。

工作原理: chain_init 关联可容纳四个点的数组,随后 chain_push_head 记录 (20,30)。

操作与预期结果: 042 是固定完成标记,不是坐标或计数。检查 trail 和 points 可确认保存的历史。本程序不绘制跟随身体。

保存位置历史:042 是固定完成标记,不是坐标或计数。检查 trail 和 points 可确认保存的历史。本程序不绘制跟随身体。
显示示例:042 是固定完成标记,不是坐标或计数。检查 trail 和 points 可确认保存的历史。本程序不绘制跟随身体。

返回编译器手册示例 / 返回库手册示例

读取库的帧计数器 gb_system

用途: 观察计数式帧等待如何影响库帧计数器。

工作原理: system_init 后,程序调用 system_wait_vblank 两次,再显示 system_get_frame8。

操作与预期结果: 结果为 002。空闲循环使用手册辅助函数 m_wait,因此显示值不会持续增加。

读取库的帧计数器:结果为 002。空闲循环使用手册辅助函数 m_wait,因此显示值不会持续增加。
显示示例:结果为 002。空闲循环使用手册辅助函数 m_wait,因此显示值不会持续增加。

返回编译器手册示例 / 返回库手册示例

选择当前场景 ID gb_scene

用途: 学习选择 ID 以区分标题画面、游戏过程等场景。

工作原理: 程序注册两个零初始化的 SceneDef 条目,通过 scene_change 选择 ID 1。

操作与预期结果: 001 是 scene_get_current 返回的当前 ID。本示例未注册场景回调或过渡绘制。

选择当前场景 ID:001 是 scene_get_current 返回的当前 ID。本示例未注册场景回调或过渡绘制。
显示示例:001 是 scene_get_current 返回的当前 ID。本示例未注册场景回调或过渡绘制。

返回编译器手册示例 / 返回库手册示例

显示所提供的字符集 fc_font

用途: 查看所提供原创字体包含哪些字母、数字和标点,以及如何绘制。

工作原理: m_init 准备显示和字体。m_text 绘制每一行;m_put 通过字符码 34 绘制双引号。

操作与预期结果: 应看到 26 个大写字母、26 个小写字母、10 个数字及 30 个标点符号。检查每个字形是否清晰,无需输入。

显示所提供的字符集:应看到 26 个大写字母、26 个小写字母、10 个数字及 30 个标点符号。检查每个字形是否清晰,无需输入。
显示示例:应看到 26 个大写字母、26 个小写字母、10 个数字及 30 个标点符号。检查每个字形是否清晰,无需输入。

返回编译器手册示例 / 返回库手册示例

第一次显示文字 fc_hello

用途: 学习启动 ROM、在背景绘制文字和数值的基本步骤。

工作原理: m_init 后,m_text 绘制问候语,m_number 格式化 42。最后的循环等待各帧,同时保持画面可见。

操作与预期结果: 画面显示 HELLO WORLD 和 042。前导零来自三位十进制格式。

第一次显示文字:画面显示 HELLO WORLD 和 042。前导零来自三位十进制格式。
显示示例:画面显示 HELLO WORLD 和 042。前导零来自三位十进制格式。

返回编译器手册示例 / 返回库手册示例

使用更宽中间值的算术 fc_arithmetic

用途: 学习保留超出八位范围的中间结果。

工作原理: (u16)200 + 100 得到 300。程序将其除以 10,再转为 u8 显示。注意:扩大类型的强制转换发生在加法之前。

操作与预期结果: 030 表示计算结果 30。

使用更宽中间值的算术:030 表示计算结果 30。
显示示例:030 表示计算结果 30。

返回编译器手册示例 / 返回库手册示例

分支与循环 fc_control

用途: 在小型计算中尝试 for、continue、while 和 if/else。

工作原理: for 循环将 0 至 7 相加但跳过 3,得到 25。while 循环推进到 32;随后 if 在匹配该值时赋值 42。

操作与预期结果: 042 是最终结果。本程序使用 if/else 分支。

分支与循环:042 是最终结果。本程序使用 if/else 分支。
显示示例:042 是最终结果。本程序使用 if/else 分支。

返回编译器手册示例 / 返回库手册示例

函数、数组、结构体与指针 fc_aggregate

用途: 学习组织数值,并通过函数和指针访问。

工作原理: 程序复制含 (10,20) 的 Point,再通过指针将 1 至 4 写入数组。将函数结果 30、数组值 1、2、4 和常量 5 相加。

操作与预期结果: 总和显示为 042。请跟踪结构体复制、ptr[i] 写入和函数返回值。

函数、数组、结构体与指针:总和显示为 042。请跟踪结构体复制、ptr[i] 写入和函数返回值。
显示示例:总和显示为 042。请跟踪结构体复制、ptr[i] 写入和函数返回值。

返回编译器手册示例 / 返回库手册示例

位标志与缓冲区复制 fc_bits_memory

用途: 将标志打包到字节中,并将缓冲区复制到独立存储空间。

工作原理: __memset 清除四个字节。程序设置第 3 位、翻转第 1 位,再用 __memcpy 复制全部四字节。

操作与预期结果: 目标首字节显示为 010:第 3 位贡献 8,第 1 位贡献 2。

位标志与缓冲区复制:目标首字节显示为 010,第 3 位贡献 8,第 1 位贡献 2。
显示示例:目标首字节显示为 010:第 3 位贡献 8,第 1 位贡献 2。

返回编译器手册示例 / 返回库手册示例

统计新按下的按键 fc_input

用途: 区分新按下的按键与持续按住的按键。

工作原理: 每帧调用 input_update。只有 input_pressed(BTN_A) 为真时,计数器才递增。

操作与预期结果: 初始计数为 000。按 A 得到 001;持续按住不会增加。松开再按得到 002。字节计数器从 255 回绕到 000。

统计新按下的按键:初始计数为 000。按 A 得到 001;持续按住不会增加。松开再按得到 002。字节计数器从 255 回绕到 000。
显示示例:初始计数为 000。按 A 得到 001;持续按住不会增加。松开再按得到 002。字节计数器从 255 回绕到 000。

返回编译器手册示例 / 返回库手册示例

Q8.8 定点乘法 fc_fixed

用途: 学习整数转 Q8.8、乘法以及转回整数。

工作原理: fix_from_int 将 3 和 4 转为 Q8.8,fix_mul 将它们相乘,fix_to_int 再将乘积转回整数。

操作与预期结果: 012 表示 3 × 4 = 12。这是转换后的整数,不是按 256 缩放的内部值。

Q8.8 定点乘法:012 表示 3 × 4 = 12。这是转换后的整数,不是按 256 缩放的内部值。
显示示例:012 表示 3 × 4 = 12。这是转换后的整数,不是按 256 缩放的内部值。

返回编译器手册示例 / 返回库手册示例

从固定对象池分配 fc_entity

用途: 从固定槽位集合创建对象,无需动态分配。

工作原理: entity_init 重置对象池。entity_create 在 (20,30) 创建类型 1;程序检查失败 ID 0xFF 后,才将 vx 设为 2。

操作与预期结果: 001 是活动对象数,不是 ID 或坐标。本示例不更新或绘制对象,因此不会出现移动角色。

从固定对象池分配:001 是活动对象数,不是 ID 或坐标。本示例不更新或绘制对象,因此不会出现移动角色。
显示示例:001 是活动对象数,不是 ID 或坐标。本示例不更新或绘制对象,因此不会出现移动角色。

返回编译器手册示例 / 返回库手册示例

在 RAM 中记录诊断值 fc_debug

用途: 将有名称的游戏数值存入诊断缓冲区,与画面显示分开。

工作原理: 程序初始化调试,设置帧标签 1,并以 HP 为名记录值 42。

操作与预期结果: 001 是跟踪条目数。HP=42 保存在诊断缓冲区中;仅凭画面不能查看或验证该有效载荷。

在 RAM 中记录诊断值:001 是跟踪条目数。HP=42 保存在诊断缓冲区中;仅凭画面不能查看或验证该有效载荷。
显示示例:001 是跟踪条目数。HP=42 保存在诊断缓冲区中;仅凭画面不能查看或验证该有效载荷。

返回编译器手册示例 / 返回库手册示例

保存位置历史 fc_chain

用途: 学习用环形缓冲区保存位置轨迹。

工作原理: chain_init 关联可容纳四个点的数组,随后 chain_push_head 记录 (20,30)。

操作与预期结果: 042 是固定完成标记,不是坐标或计数。检查 trail 和 points 可确认保存的历史。本程序不绘制跟随身体。

保存位置历史:042 是固定完成标记,不是坐标或计数。检查 trail 和 points 可确认保存的历史。本程序不绘制跟随身体。
显示示例:042 是固定完成标记,不是坐标或计数。检查 trail 和 points 可确认保存的历史。本程序不绘制跟随身体。

返回编译器手册示例 / 返回库手册示例

读取库的帧计数器 fc_system

用途: 观察计数式帧等待如何影响库帧计数器。

工作原理: system_init 后,程序调用 system_wait_vblank 两次,再显示 system_get_frame8。

操作与预期结果: 结果为 002。空闲循环使用手册辅助函数 m_wait,因此显示值不会持续增加。

读取库的帧计数器:结果为 002。空闲循环使用手册辅助函数 m_wait,因此显示值不会持续增加。
显示示例:结果为 002。空闲循环使用手册辅助函数 m_wait,因此显示值不会持续增加。

返回编译器手册示例 / 返回库手册示例

选择当前场景 ID fc_scene

用途: 学习选择 ID 以区分标题画面、游戏过程等场景。

工作原理: 程序注册两个零初始化的 SceneDef 条目,通过 scene_change 选择 ID 1。

操作与预期结果: 001 是 scene_get_current 返回的当前 ID。本示例未注册场景回调或过渡绘制。

选择当前场景 ID:001 是 scene_get_current 返回的当前 ID。本示例未注册场景回调或过渡绘制。
显示示例:001 是 scene_get_current 返回的当前 ID。本示例未注册场景回调或过渡绘制。

返回编译器手册示例 / 返回库手册示例

将世界坐标转换为屏幕坐标 gb_camera

用途: 减去摄像机位置,求世界坐标对应的屏幕位置。

工作原理: Camera_Set 接收 Q8.8 值 2560,即 X=10 像素。随后 Camera_WorldToScreenX 转换世界 X=52。

操作与预期结果: 052 减去 010 得到显示的 042。这是坐标计算,不会滚动背景。

将世界坐标转换为屏幕坐标:052 减去 010 得到显示的 042。这是坐标计算,不会滚动背景。
显示示例:052 减去 010 得到显示的 042。这是坐标计算,不会滚动背景。

返回编译器手册示例 / 返回库手册示例

将 RLE 解码到 RAM gb_rle

用途: 尝试用紧凑的计数/数值形式表示重复字节。

工作原理: 打包字节 {3,42,0} 表示三个 42,后接计数为零的结束标记。rle_decode 写入三字节目标空间。

操作与预期结果: 最后一个字节 out[2] 显示为 042。三个解码字节预期都为 42。

将 RLE 解码到 RAM:最后一个字节 out[2] 显示为 042。三个解码字节预期都为 42。
显示示例:最后一个字节 out[2] 显示为 042。三个解码字节预期都为 42。

返回编译器手册示例 / 返回库手册示例

读写棋盘格子 gb_board

用途: 学习棋盘游戏中网格坐标与存储位置的对应关系。

工作原理: 16 字节数组保存 4 × 4 棋盘。程序先清空,在格子 (2,1) 写入 42,再读取同一格。

操作与预期结果: 042 是读回值。程序不绘制 4 × 4 棋盘本身。

读写棋盘格子:042 是读回值。程序不绘制 4 × 4 棋盘本身。
显示示例:042 是读回值。程序不绘制 4 × 4 棋盘本身。

返回编译器手册示例 / 返回库手册示例

将方框推进一个物理步长 gb_physics

用途: 初始化世界和方框物体,再根据速度更新位置。

工作原理: 物体起始于 (40,40),速度 (2,0),重力为零。程序调用 kq2d_step 一次。

操作与预期结果: 042 是得到的 X 坐标,本示例以整数像素为单位。不绘制方框形状或连续动画。

将方框推进一个物理步长:042 是得到的 X 坐标,本示例以整数像素为单位。不绘制方框形状或连续动画。
显示示例:042 是得到的 X 坐标,本示例以整数像素为单位。不绘制方框形状或连续动画。

返回编译器手册示例 / 返回库手册示例

带存储体参数读取 ROM 数据 gb_bank

用途: 学习将 ROM 数据复制到 RAM 的参数。

工作原理: far_data_read 使用存储体参数 0、长度 2,将两个字节 7 和 42 复制到 copied。

操作与预期结果: 目标第二字节显示为 042。本示例读取固定 ROM,不演示不同可切换存储体之间的传送。

带存储体参数读取 ROM 数据:目标第二字节显示为 042。本示例读取固定 ROM,不演示不同可切换存储体之间的传送。
显示示例:目标第二字节显示为 042。本示例读取固定 ROM,不演示不同可切换存储体之间的传送。

返回编译器手册示例 / 返回库手册示例

按资源 ID 加载数据 gb_asset

用途: 注册资源位置和长度,再按 ID 取回字节。

工作原理: 资源 0 的类型为 RAW,存储体为 0,指向 {7,42},长度为 2。asset_load_raw 将其复制到两字节 RAM 缓冲区。

操作与预期结果: 第二个字节显示为 042。这演示资源查找和复制,不是图像渲染。

按资源 ID 加载数据:第二个字节显示为 042。这演示资源查找和复制,不是图像渲染。
显示示例:第二个字节显示为 042。这演示资源查找和复制,不是图像渲染。

返回编译器手册示例 / 返回库手册示例

分配一颗子弹 gb_danmaku

用途: 初始化子弹池,并查看生成后的占用数量。

工作原理: danmaku_reset 后,程序调用 danmaku_spawn(40,40,16,0),并显示 dm_count。

操作与预期结果: 001 是已分配子弹数。这里没有子弹更新循环或背景合成器,因此不绘制移动子弹。

分配一颗子弹:001 是已分配子弹数。这里没有子弹更新循环或背景合成器,因此不绘制移动子弹。
显示示例:001 是已分配子弹数。这里没有子弹更新循环或背景合成器,因此不绘制移动子弹。

返回编译器手册示例 / 返回库手册示例

累积 Q5.3 小数位移 fc_subpixel

用途: 将亚像素位移保留为余数,整像素部分进位到位置。

工作原理: 从 X=40 开始,循环八次,每次加 2/8 像素。右移提取整数像素,掩码保留余数。

操作与预期结果: 总位移为两像素,因此画面将 X=42 显示为 042。此手工积分示例处理正向位移;负向位移需要对应的借位处理。

累积 Q5.3 小数位移:总位移为两像素,因此画面将 X=42 显示为 042。此手工积分示例处理正向位移;负向位移需要对应的借位处理。
显示示例:总位移为两像素,因此画面将 X=42 显示为 042。此手工积分示例处理正向位移;负向位移需要对应的借位处理。

返回编译器手册示例 / 返回库手册示例

设置 CGB 背景调色板 gb_cgb_palette

用途: 使用 Game Boy Color 的 RGB 分量选择背景和文字颜色。

工作原理: 程序在 VBlank 期间关闭 LCD,将调色板 0 的颜色 0 设为白色 (31,31,31),颜色 3 设为紫色 (12,0,22),然后开启显示。

操作与预期结果: 在 CGB 模式运行,可看到白底紫色文字和 042。DMG 单色输出无法展示这些颜色。

设置 CGB 背景调色板:在 CGB 模式运行,可看到白底紫色文字和 042。DMG 单色输出无法展示这些颜色。
显示示例:在 CGB 模式运行,可看到白底紫色文字和 042。DMG 单色输出无法展示这些颜色。

返回编译器手册示例 / 返回库手册示例

水平滚动背景 gb_scroll

用途: 改变视点位置,无需重绘背景内容。

工作原理: 每帧递增 phase,并传给 Scroll_SetBg。八位位置在 255 之后回绕。

操作与预期结果: SCROLL 一词向左移动。请观察随时间变化的位置;单张截图不能展示移动。

水平滚动背景:SCROLL 一词向左移动。请观察随时间变化的位置;单张截图不能展示移动。
显示示例:SCROLL 一词向左移动。请观察随时间变化的位置;单张截图不能展示移动。

返回编译器手册示例 / 返回库手册示例

将图块更新加入队列 gb_vram_queue

用途: 将绘图请求与实际应用它的 VRAM 传送分离。

工作原理: vram_queue_bg_tile 将图块坐标 (3,8) 处的图块 52 加入队列,vram_flush 执行传送。所提供字体中,图块 52 是数字 4。

操作与预期结果: 应在背景图块坐标 (3,8) 看到一个 4。这是图块更新,不是数值计数器。

将图块更新加入队列:应在背景图块坐标 (3,8) 看到一个 4。这是图块更新,不是数值计数器。
显示示例:应在背景图块坐标 (3,8) 看到一个 4。这是图块更新,不是数值计数器。

返回编译器手册示例 / 返回库手册示例

通过 OAM DMA 显示精灵 gb_sprite

用途: 分配并显示一个独立于背景的精灵。

工作原理: 新初始化的对象池提供槽位 0。程序选择图块 65,设置位置 (70,80),启用 OBJ 显示,并每帧传送影子 OAM。

操作与预期结果: 指定精灵位置出现静止字母 A。游戏中应在使用返回 ID 前检查分配失败。

通过 OAM DMA 显示精灵:指定精灵位置出现静止字母 A。游戏中应在使用返回 ID 前检查分配失败。
显示示例:指定精灵位置出现静止字母 A。游戏中应在使用返回 ID 前检查分配失败。

返回编译器手册示例 / 返回库手册示例

生成可复现的随机值 gb_rng

用途: 通过种子复现伪随机序列。

工作原理: rng_seed(1234) 初始化生成器,再调用一次 rng_range(10)。结果不包含上限 10。

操作与预期结果: 画面显示 000 至 009 中的一个值。以相同种子重新启动同一程序会复现该值;它不会每帧变化。

生成可复现的随机值:画面显示 000 至 009 中的一个值。以相同种子重新启动同一程序会复现该值;它不会每帧变化。
显示示例:画面显示 000 至 009 中的一个值。以相同种子重新启动同一程序会复现该值;它不会每帧变化。

返回编译器手册示例 / 返回库手册示例

保存游戏状态标志 gb_flags

用途: 用标志编号表示事件是否完成等布尔状态。

工作原理: 程序清除标志 12,再设置并通过 flag_get 读回。

操作与预期结果: 001 表示标志 12 为真。本示例操作 RAM 标志,不会在断电后保留。

保存游戏状态标志:001 表示标志 12 为真。本示例操作 RAM 标志,不会在断电后保留。
显示示例:001 表示标志 12 为真。本示例操作 RAM 标志,不会在断电后保留。

返回编译器手册示例 / 返回库手册示例

将圆形推进一个物理步长 gb_circle

用途: 设置圆形物体,并根据速度更新位置。

工作原理: 活动圆形半径为 4,位置 (40,40),速度 (2,0)。重力为零,linear_damping_q8 为 255;kq2dc_step 执行一次。

操作与预期结果: 042 是得到的整数 X 坐标。本示例不绘制圆形轮廓或碰撞动画。

将圆形推进一个物理步长:042 是得到的整数 X 坐标。本示例不绘制圆形轮廓或碰撞动画。
显示示例:042 是得到的整数 X 坐标。本示例不绘制圆形轮廓或碰撞动画。

返回编译器手册示例 / 返回库手册示例

滚动 NES 背景 fc_scroll

用途: 通过更新 PPU 滚动位置移动背景。

工作原理: 从 __scroll_set(0,0) 开始,程序每帧递增 phase,并将其作为水平位置。

操作与预期结果: SCROLL 一词改变水平位置。phase 从 255 回绕到 0。这不是跨多个名称表的宽地图示例。

滚动 NES 背景:SCROLL 一词改变水平位置。phase 从 255 回绕到 0。这不是跨多个名称表的宽地图示例。
显示示例:SCROLL 一词改变水平位置。phase 从 255 回绕到 0。这不是跨多个名称表的宽地图示例。

返回编译器手册示例 / 返回库手册示例

通过 NMI 应用图块更新 fc_vram_queue

用途: 从主程序提交 PPU 更新,由 NMI 路径应用。

工作原理: __vramq_put 将图块 52 排入名称表地址 0x2103 的更新队列,__vramq_commit 提交更新。该地址对应图块坐标 (3,8)。

操作与预期结果: 背景坐标 (3,8) 出现一个 4。所提供字体的图块 52 是数字 4。

通过 NMI 应用图块更新:背景坐标 (3,8) 出现一个 4。所提供字体的图块 52 是数字 4。
显示示例:背景坐标 (3,8) 出现一个 4。所提供字体的图块 52 是数字 4。

返回编译器手册示例 / 返回库手册示例

显示 NES OAM 精灵 fc_sprite

用途: 准备精灵颜色和 OAM 数据,绘制独立于背景的图像。

工作原理: 程序加载精灵调色板,将槽位 0 设为位置 (70,80)、图块 65、属性 0,开启渲染并重复执行 OAM DMA。

操作与预期结果: 一个静止字母 A 以精灵显示。示例演示 OAM 设置和传送,不是动画。

显示 NES OAM 精灵:一个静止字母 A 以精灵显示。示例演示 OAM 设置和传送,不是动画。
显示示例:一个静止字母 A 以精灵显示。示例演示 OAM 设置和传送,不是动画。

返回编译器手册示例 / 返回库手册示例

播放 APU 脉冲音 fc_sound

用途: 设置 NES 内置脉冲通道的控制、定时器和长度值。

工作原理: nes_apu_init 后,程序调用 nes_sfx_square1(0xBF,400,20)。控制值 0xBF 选择恒定音量并停止长度计数器,因此声音会持续。20 是长度表索引,不是 20 帧。

操作与预期结果: 显示 042 时持续播放脉冲音。调用 nes_apu_silence_all 停止。仅凭显示标记不能验证声音输出。

播放 APU 脉冲音:显示 042 时持续播放脉冲音。调用 nes_apu_silence_all 停止。仅凭显示标记不能验证声音输出。
显示示例:显示 042 时持续播放脉冲音。调用 nes_apu_silence_all 停止。仅凭显示标记不能验证声音输出。

返回编译器手册示例 / 返回库手册示例

每帧更新音效 gb_sound

用途: 启动音效流,并通过定期帧更新推进播放。

工作原理: Audio_Init 后,Audio_PlaySFX 在通道 ID 1 上启动 tone。主循环每帧调用一次 Audio_Update。

操作与预期结果: 播放短脉冲音效,同时保持显示 042。该数值是固定标记,不是音量或播放位置。请通过音频输出或录音判断声音。

每帧更新音效:播放短脉冲音效,同时保持显示 042。该数值是固定标记,不是音量或播放位置。请通过音频输出或录音判断声音。
显示示例:播放短脉冲音效,同时保持显示 042。该数值是固定标记,不是音量或播放位置。请通过音频输出或录音判断声音。

返回编译器手册示例 / 返回库手册示例