C/C++中的6502仿真器:如何将寻址模式代码与实际指令代码分离
6502 emulator in C/C++: how to separate addressing mode code from actual instruction code
在业余时间,我开始为6502 CPU编写一个非常简单的C++模拟器。我曾经为这个CPU写过很多汇编代码,所以所有的操作码、寻址模式和其他东西都不是什么大事。
6502有56条不同的指令加上13种寻址模式,总共提供151个不同的操作码。对我来说,速度不是问题,所以我不想写一个巨大的switchcase语句,一遍又一遍地重复相同的代码(不同的操作码可以使用不同的寻址模式引用同一条指令),而是想将实际的指令代码与寻址模式代码分开:我发现这个解决方案非常简洁,因为它只需要写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位)
指令函数原型是:
void Op_ADC(uint16_t addr);
void Op_AND(uint16_t addr);
void Op_ASL(uint16_t addr);
...
它获取16位地址,执行自己的操作,更新状态标志和/或寄存器,并在同一内存地址上提交结果(如果有的话)。
考虑到这个代码框架,我发现很难使用ACCUMULATOR寻址模式,它是唯一一个返回A内部寄存器实际值而不是内存地址的模式。我可以使用uin16_t返回类型返回A的值,并为这种寻址模式添加布尔标志,但我发现这是一个非常糟糕的解决方案。
指令函数应该是完全寻址模式无关的。
在Sharp6502(我用C#编写的6502仿真引擎)中,我将内部寄存器和外部内存都视为一级对象-MemoryManager类实例化一个用于外部内存的对象,另一个用于内部寄存器的对象,映射到不同的数字范围。因此,内存访问和寄存器访问在功能级别上是相同的,因为它们都是根据基本上是索引的内容通过MemoryManager引用的。
地址模式区分只是过滤模拟下指令的位模式,并执行一个非常简单的计算来确定要传递给MemoryManager的索引——这可能是隐含的,或者需要一个或两个额外的字节,但每个指令的底层机制都是相同的。
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- С++ wxWidgets:代码架构,设计原则和模式
- Visual Studio 发布模式阻止在调试模式下执行的代码.使用 WinHTTP 和多线程
- 使用Qt Creator在调试模式下编译一段代码
- 使用哪种模式来执行新代码,只需添加基类的新子类?
- 在 directx11 代码中更改全屏模式下的刷新率不起作用
- C++单例模式代码无法运行,不知道为什么?
- 我的代码在发布模式下不起作用,而在Qt的调试模式下工作
- 我如何调用在调试模式下具有主要的程序或代码
- 该代码在调试模式下工作,但在发布模式C 中不起作用
- OPENCV解码灰色代码模式相机校准错误.如何格式化固有和外在结果
- 原型模式导致"actual object"和"prototype"之间的代码重复
- 此代码是否代表设计模式
- 在非调试模式下运行代码时出现问题
- C++ 装饰设计模式 - 代码有效但不知道为什么
- 抽象工厂模式客户端代码
- C/C++中的6502仿真器:如何将寻址模式代码与实际指令代码分离
- 代码设计:观察者模式
- 如何将基本代码截图/模式转换为使用 c+11 可变参数模板
- 重构常规c++代码模式