fuzzix 网站 :: 使用 Perl 构建世界上第二差的 ZX Spectrum 模拟器

这是一篇关于用 Perl 构建世界上第二糟糕的 ZX Spectrum 模拟器的文章,主要内容如下:

  • 引言:作者一直对构建小型计算机模拟器感兴趣,但觉得它很复杂。最近为了给 ZX Spectrum Next 制作有趣的东西,决定用 Perl 脚本尝试,目标是构建能运行 ZX Spectrum 游戏的模拟器,先从最差的模拟器开始探索。
  • 最差的 ZX Spectrum 模拟器

    • CPU:CPUs 通过 fetch-decode-execute 循环 运行,可实现一个简单的循环来模拟,David Cantrell 的 CPU::Emulator::Z80 可用于此目的,加载 Spectrum ROM 和 48K RAM 后可启动到版权通知。
    • RAM 和 Registers:从命令行获取 SNA 快照文件名,解析出寄存器等信息,将其存储在内存中。
    • ROM:读取 ZX Spectrum 48K 的 ROM dump,将其与 RAM 连接形成完整的内存映射。
    • 创建 CPU:设置 Spectrum 的内存映射和 I/O 端口数量,创建 CPU::Emulator::Z80 的实例,并通过 RETN 指令设置 PC 值。
    • 运行程序:虽可运行 CPU 并获取屏幕截图,但存在性能问题,运行 The Great Escape) 游戏时,在笔记本上比在 Spectrum 上花费的时间长很多。
  • 更换 CPUManuel Sainz de Baranda y Goñi 的 Z80 是用 C 编写的快速且可移植的 Z80 CPU 实现,可用于 ZX Spectrum 相关项目,但它的内存访问由程序介导,不在 CPU 模拟中,且不在 CPAN 上,需要使用 FFI::Platypus 进行绑定。
  • 交互性 - ULA

    • 键盘:通过回调处理键盘读取请求,模拟 Spectrum 的键盘矩阵,设置菜单选项和按键按下状态,使游戏开始。
    • 视频帧:使用 raylib 游戏编程库解码屏幕数据并实时显示,优化了屏幕数据处理和纹理生成的代码,提高了帧率,但仍有优化空间。
  • 绑定 redcode 的 Z80:加载 redcode 的 Z80 库到 Platypus 实例中,将从快照文件读取的二进制 blob 转换为数组,更新 scr2tex 函数以处理数组数据,声明函数签名并创建 FFI 闭包作为回调函数,创建 Z80 结构体并设置相关参数。
  • 最终步骤:定义时钟周期和帧率相关的常量,在 Raylib 应用的主循环中调用 z80_execute 函数来驱动 redcode 的 Z80,实现键盘输入的调度和处理,最终得到一个能运行 ZX Spectrum 游戏的模拟器,但仍存在一些问题,如无声音、屏幕边框和闪烁未实现、中断处理缺失等。
  • 结论:通过使用 CPU::Emulator::Z80 实现了一个头less 和非交互式的 ZX Spectrum 模拟器,发现了性能问题,使用 FFI::Platypus 寻找替代 CPU,介绍了 Raylib::FFI 的使用,鼓励不要害怕幼稚的实现,最后列出了相关的参考和链接。
阅读 19
0 条评论