探索游戏编程的新领域:TEGA - 基于TypeScript的GameBoy宏汇编器

探索游戏编程的新领域:TEGA - 基于TypeScript的GameBoy宏汇编器

tega🕹 TypeScript Embedded GameBoy Macro Assembler项目地址:https://gitcode.com/gh_mirrors/te/tega

TEGA 是一款专为创建GameBoy ROM图像而设计的TypeScript库,同样适用于JavaScript环境。它提供了一个类型安全的API,用于处理SM83汇编指令,内联字节(以TypedArrays的形式),在ROM空间中移动,以及符号定义和内存映射布局,硬件寄存器及其重要位字段位置。更棒的是,它允许你利用TypeScript的所有常规语言特性来创建类型安全的抽象(如宏),这意味着你可以轻松地使用你喜欢的库,如lodashramda

项目示例:砖块跳跃游戏

Block-Jump-Screenshot-1 Block-Jump-Screenshot-2

./src/block-jump目录下,你可以找到一个完整的演示游戏——“砖块跳跃”。这款游戏基于谷歌浏览器的离线恐龙跳跃游戏,其中包含了:

  • 多个模块
  • 标准库的使用
  • 随机数生成策略
  • 图块地图压缩
  • 物理与碰撞检测
  • 虚拟地址偏移

有关TEGA和"砖块跳跃"的深入视频教程,你可以在Low Byte Productions的YouTube频道上查看。

技术细节

TEGA的所有操作函数定义都是自动生成的,基础是izik1的gbops仓库中的dmgops.json文件。这个文件也被用来创建了详尽的gbops网站,提供了GameBoy的详细操作码表和大量有用信息,例如每个操作所需的周期数,每周期的内存操作等。在TEGA中,仅需操作名称和操作码,就可以生成256种操作的256种重载、类型安全的函数定义。如果你对JSON到TypeScript的具体转换感兴趣,可以查看本项目的scripts/ops-generator.ts文件。

SM83 CPU(一种结合了z80和8080特性但又有自定义元素的CPU)有256个操作码,其中11个被认为是未定义的,会锁定CPU。操作码0xCB是一个前缀,扩展出另外256个操作码,主要用于8位寄存器的单比特操作,以及一些扩展的旋转、移位和交换操作。

每个操作返回该操作的描述以及动态(立即)参数。在汇编时,汇编器维护一个带有偏移量(从头区后的0x150开始)的缓冲区,并遍历这些操作,填充操作码和立即值。标签、引用和大小计算则采用符号值。使用label函数创建标签,当遇到标签定义时,如果尚未定义,则将其与当前偏移量关联。遇到包含符号引用的指令时,记录下来,并将偏移量向前移动以适应指令的大小。

moveToinlineBytes 分别用于改变内部偏移并直接插入字节到ROM中。

所有操作处理完毕后,汇编器会回溯并解决符号引用。如果无法解析,那么表示从未定义过,会抛出错误。否则,正确填充8或16位值到ROM缓冲区中。

最后插入头部数据并计算校验和。虽然可配置头部信息传递给TEGA,但大多数字段与制造商代码和卡带类型相关。目前只支持"32kb ROM Only",但这是一个很容易去除的限制。头部包括两个独立的校验和计算:一个是头部校验和,如果不正确,硬件不会启动;另一个是全局校验和,但不进行检查。

有趣的一点是,任天堂早期通过在ROM头部包含其公司标识来限制未经授权的第三方开发者。如果标识匹配不正确,GameBoy将在启动时挂起,游戏无法运行。尽管GameBoy已有30多年历史,但在emuDev(模拟器开发)和homebrew(自制游戏)社区中,仍有一些开发者对包含这种法律模糊的字节序列持谨慎态度。在汇编器中,这是必要的要求,但我个人选择了一种折衷的方法,即使用另一已知值异或原始序列来生成这些字节,这多少有些迷信,但也颇具趣味性。

当前支持的功能

  • 仅限32kb ROM
  • 所有(文档化)汇编指令
  • 符号值
    • 标签和指令中的标签引用
    • 在汇编时确定的大小计算
    • 当前地址/当前指令地址
  • 定义block的接口——一组指令和/或数据,生成并插入符号,计算和暴露大小。可用于宏、子程序、中断处理程序等
  • 生成带有有效校验和的头部

未来计划

  • 更高级别的宏抽象
  • 支持更大的ROM大小和MBC功能
  • 自动转换加载图片为图块数据/图块地图的工具

如果你热爱游戏编程,怀念经典游戏的乐趣,或者想要学习如何创建自己的GameBoy游戏,TEGA是你不容错过的工具。它带来的不仅仅是类型安全性和强大的抽象能力,还有无限的创造力与想象空间。现在就加入我们,一起开启GameBoy编程的新旅程吧!

tega🕹 TypeScript Embedded GameBoy Macro Assembler项目地址:https://gitcode.com/gh_mirrors/te/tega

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

滑辰煦Marc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值