- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在业余时间,我开始为 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/
很长一段时间以来,我一直对蓝牙低功耗 (BLE) 协议(protocol) 4.0 版及其工作原理非常感兴趣。我开发了一个 android 应用程序,可以作为 BLE 外围设备的中央设备。问题是 BL
我正在寻找在游戏中构建一个虚拟机,并且想知道是否有人知道任何非常简单的虚拟机(我认为 RISC/PIC 接近我想要的),通常用于嵌入式项目,例如控制机器人、电机、传感器等。我主要关心的是如果我自己编写
我一直在写一个 chip8 模拟器 -- http://en.wikipedia.org/wiki/CHIP-8 我已经测试了所有的操作码和图形计算,现在我正在努力处理用户输入。我有以下方法监视用户输
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我在哪里可以找到支持 "V" Vector Extension 的 RISC-V 模拟器? 我知道当前规范版本 0.8 是草案: This is a draft of a stable proposa
我想为以下微 Controller 板创建/启动模拟器:http://www.sparkfun.com/commerce/product_info.php?products_id=707# 固件是用汇
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我正在尝试编写一个 C 程序来模拟 ARM 二进制文件的执行。所以它现在所做的是,我们从二进制文件中获取指令到一个 uint32_t 数组中,然后我对其进行解码和执行。 问题是我只使用程序计数器访问数
我正在寻找一个现代系统来进行一些简单的汇编程序设计(用于娱乐/学习),而这些程序编程不具有x86平台的遗留负担(在该平台上您仍然必须处理BIOS,切换到保护模式,VESA恐怖才能以现代分辨率/色彩深度
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在构建一个网站的移动版本,我想要一种测试它的方法。许多免费模拟器的问题在于它们是针对 Windows 的。我知道我可以在 wine 中运行它们,只是想知道是否有本地 GNU/Linux 应用程序。
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
我想在我的 Arduino mega 上安装 2 个 TCS34725 颜色传感器。传感器使用 I2c 通信,因此我不能将它们放在相同的 I2C 引脚上,因为它们具有相同的地址。我提出的解决方案是使用
在业余时间,我开始为 6502 CPU 编写一个非常简单的 C++ 仿真器。我过去常常为这个 CPU 写下很多汇编代码,所以所有的操作码、寻址模式和其他东西都不是什么大问题。 6502 有 56 条不
我是一名优秀的程序员,十分优秀!