gpt4 book ai didi

c++ - C/C++ : how to separate addressing mode code from actual instruction code 中的 6502 仿真器

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:58 25 4
gpt4 key购买 nike

在业余时间,我开始为 6502 CPU 编写一个非常简单的 C++ 仿真器。我过去常常为这个 CPU 写下很多汇编代码,所以所有的操作码、寻址模式和其他东西都不是什么大问题。

6502 有 56 条不同的指令加上 13 种寻址模式,总共提供 151 种不同的操作码。对我来说,速度不是问题,所以我不想写一个巨大的 switch-case 语句并一次又一次地重复相同的代码(不同的操作码可以使用不同的寻址模式引用相同的指令)我想将实际的指令代码与寻址模式代码:我发现这个解决方案非常简洁,因为它只需要编写 13 个寻址模式函数和 56 个指令函数,无需重复。

这里寻址模式的作用是:

// Addressing modes
uint16_t Addr_ACC(); // ACCUMULATOR
uint16_t Addr_IMM(); // IMMEDIATE
uint16_t Addr_ABS(); // ABSOLUTE
uint16_t Addr_ZER(); // ZERO PAGE
uint16_t Addr_ZEX(); // INDEXED-X ZERO PAGE
uint16_t Addr_ZEY(); // INDEXED-Y ZERO PAGE
uint16_t Addr_ABX(); // INDEXED-X ABSOLUTE
uint16_t Addr_ABY(); // INDEXED-Y ABSOLUTE
uint16_t Addr_IMP(); // IMPLIED
uint16_t Addr_REL(); // RELATIVE
uint16_t Addr_INX(); // INDEXED-X INDIRECT
uint16_t Addr_INY(); // INDEXED-Y INDIRECT
uint16_t Addr_ABI(); // ABSOLUTE INDIRECT

它们都返回指令读取/写入操作数/结果所使用的实际内存地址(16位)

指令函数原型(prototype)为:

void Op_ADC(uint16_t addr);
void Op_AND(uint16_t addr);
void Op_ASL(uint16_t addr);
...

它获取 16 位地址,执行自己的操作,更新状态标志和/或寄存器,并在同一内存地址上提交结果(如果有)。

鉴于该代码框架,我发现很难使用 ACCUMULATOR 寻址模式,这是唯一返回 A 内部寄存器实际值而不是内存地址的模式。我可以使用 uin16_t 返回类型返回 A 的值并为这种寻址模式添加一个 bool 标志,但我发现这是一个非常丑陋的解决方案。

指令函数应该完全与寻址模式无关。

最佳答案

在 Sharp6502(我用 C# 编写的 6502 仿真引擎)中,我将内部寄存器和外部存储器都视为一级对象 - MemoryManager 类实例化一个对象用于外部存储器,另一个实例化内部寄存器,映射到不同的数值范围.因此,内存访问和寄存器访问在功能级别上是相同的,因为它们都是根据基本索引通过 MemoryManager 引用的。

地址模式区分只是过滤仿真下指令的位模式并执行非常简单的计算以确定要传递给 MemoryManager 的索引的问题 - 这可能是暗示的,或者需要一两个进一步的字节,但每条指令的底层机制都是相同的。

关于c++ - C/C++ : how to separate addressing mode code from actual instruction code 中的 6502 仿真器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20164235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com