如何 运行 Klaus Dormann 的 6502 测试套件在具有独立 ROM 和 RAM 的真实硬件上
How to run Klaus Dormann's 6502 test suite on real hardware with separate ROM and RAM
我想 运行 full 6502 test suite by Klaus Dormann to test my Kansas Lava 6502 implementation. However, the code uses self-modification (see all uses of range_adr
),虽然在模拟器中实现起来很简单,但对于硬件实现来说并不是一个好兆头:程序图像需要存储在ROM,因此回写将被基于寻址 ROM 或 RAM 支持部件的任何路由写入黑洞。
当然,同样的问题既适用于将其合成到真正的 FPGA 中,也适用于 运行在模拟器中将其合成(低级 VHDL 或高级堪萨斯熔岩) .
有没有办法 运行 测试套件而不用长时间(按周期)暂停 CPU,将程序从一些无法寻址的 ROM 复制到全 RAM逐字节内存,然后初始化CPU并让它运行?我不想这样做,因为在启动时模拟这些额外的周期会大大减慢测试速度。运行
下意识观察:
尽管以 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;
... 并移动或删除以下例程:
- 测试并立即从 2cac 下降到 2cec;
- 立即测试从 2ea2 到 2ee2 的 EOR;
- 测试ORA立即数从3098到30d8;
- 测试十进制ADC/SBC立即数从33e7到3414(具体包括
chkdadi
和chksbi
);
- 测试二进制文件 ADC/SBC 从 3531 直接到 355d。
所有即时测试自修改操作数。如果您很乐意让该寻址模式未经测试,那么它应该不会太麻烦。
所以,我想,从原始文件中编辑那些测试,如果我的模拟是准确的,您可以安全地将 range_adr
重新定位到堆栈页面的中间。
我想 运行 full 6502 test suite by Klaus Dormann to test my Kansas Lava 6502 implementation. However, the code uses self-modification (see all uses of range_adr
),虽然在模拟器中实现起来很简单,但对于硬件实现来说并不是一个好兆头:程序图像需要存储在ROM,因此回写将被基于寻址 ROM 或 RAM 支持部件的任何路由写入黑洞。
当然,同样的问题既适用于将其合成到真正的 FPGA 中,也适用于 运行在模拟器中将其合成(低级 VHDL 或高级堪萨斯熔岩) .
有没有办法 运行 测试套件而不用长时间(按周期)暂停 CPU,将程序从一些无法寻址的 ROM 复制到全 RAM逐字节内存,然后初始化CPU并让它运行?我不想这样做,因为在启动时模拟这些额外的周期会大大减慢测试速度。运行
下意识观察:
尽管以 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;
... 并移动或删除以下例程:
- 测试并立即从 2cac 下降到 2cec;
- 立即测试从 2ea2 到 2ee2 的 EOR;
- 测试ORA立即数从3098到30d8;
- 测试十进制ADC/SBC立即数从33e7到3414(具体包括
chkdadi
和chksbi
); - 测试二进制文件 ADC/SBC 从 3531 直接到 355d。
所有即时测试自修改操作数。如果您很乐意让该寻址模式未经测试,那么它应该不会太麻烦。
所以,我想,从原始文件中编辑那些测试,如果我的模拟是准确的,您可以安全地将 range_adr
重新定位到堆栈页面的中间。