【问题标题】:How to run Klaus Dormann's 6502 test suite on real hardware with separate ROM and RAM如何在具有独立 ROM 和 RAM 的真实硬件上运行 Klaus Dormann 的 6502 测试套件
【发布时间】:2015-09-24 11:02:04
【问题描述】:
我想运行 full 6502 test suite by Klaus Dormann 来测试我的 Kansas Lava 6502 实现。然而,代码使用了自我修改(参见range_adr 的所有用法),虽然在模拟器中实现起来很简单,但对于硬件实现来说并不是一个好兆头:程序映像需要存储在 ROM 上,因此写回将被基于寻址 ROM 或 RAM 支持部分的任何路由写入黑洞。
当然,同样的问题既适用于将它合成到真正的 FPGA 中,也适用于在模拟器中运行它(低级 VHDL 或高级 Kansas Lava )。
有没有一种方法可以运行测试套件,而不需要长时间(就周期而言)暂停 CPU,将程序从某个不可寻址的 ROM 逐字节复制到全 RAM 内存中,然后初始化CPU并让它运行?我不想这样做,因为在启动时模拟这些额外的循环会大大减慢运行测试的速度。
【问题讨论】:
标签:
self-modifying
6502
commodore
【解决方案1】:
下意识观察:
尽管是 64kb 的图像,但测试实际上只有 14,093 字节的实际内容,从 $0000 到 $370d,然后填充 $ffs 到 $fffa–$ffff 中的三个向量。因此,您最多需要复制 14,099 个字节,而不是初步的 65,536 个字节。
在我昨天(不,真的)编写的模拟器中设置了那个非常测试套件后,触摸地址的全部范围 - 使用 [x, y] 表示封闭范围,即同时包含 x 和 y,是:
- [000a, 0012], [0100, 0101], [01f9, 01ff](即栈和零页);
- 0200;
- [0203, 0207];
- 04a8;
- 2cbb;
- 2cdc;
- 2eb1;
- 2ed2;
- 30a7;
- 30c8;
- 33f2;
- 3409;
- 353b;和
- 3552.
从程序的 .lst 版本开始,这意味着您只需要移动带有标签的变量:
- test_case;
- ada2;
- sba2;
- range_adr;
...并移动或删除以下例程:
- 测试 AND 立即从 2cac 下降到 2cec;
- 立即从 2ea2 测试 EOR 到 2ee2;
- 从 3098 到 30d8 立即测试 ORA;
- 立即测试从 33e7 到 3414 的十进制 ADC/SBC(具体包括
chkdadi 和 chksbi);
- 立即从 3531 到 355d 测试二进制 ADC/SBC。
所有直接测试都会自行修改操作数。如果您乐于不测试该一种寻址模式,那么它应该不会太麻烦。
所以,我想,从原始文件中编辑这些测试,如果我的模拟准确,您可以安全地将 range_adr 重新定位到堆栈页面的中间。