【发布时间】:2016-02-06 16:33:51
【问题描述】:
我是一名本科生,也是一名 iOS 应用开发人员。 在我的大学里,我们正在学习有关 8085 微处理器的知识,我认为为它开发一个 iOS 模拟器对我来说会很酷且很有用
我想知道如何从头开始启动应用程序以及我需要了解的所有信息。我是一个快速学习者,我可以同时学习和发展。 真诚感谢任何伟大的建议。谢谢。
【问题讨论】:
标签: ios iphone microprocessors 8085
我是一名本科生,也是一名 iOS 应用开发人员。 在我的大学里,我们正在学习有关 8085 微处理器的知识,我认为为它开发一个 iOS 模拟器对我来说会很酷且很有用
我想知道如何从头开始启动应用程序以及我需要了解的所有信息。我是一个快速学习者,我可以同时学习和发展。 真诚感谢任何伟大的建议。谢谢。
【问题讨论】:
标签: ios iphone microprocessors 8085
你可以在你的 iOS 程序中构建一个interpreter,编程the 8085 ISA,如果你想用高级语言编码,你还有一个额外的工作来“编译”到处理器的程序集,然后解释它.
我应该强烈警告您,您将有 IMENSE 的工作量,我认为这不是一个实际的项目。
【讨论】:
这取决于您要模拟 8085 的抽象级别。迂腐地说,真正的芯片是一个 40 引脚 IC,因此有 40 条信号线根据其历史状态通过一组定义的转换进行排列。
更有用的是,您可能想要在数字总线级别进行模拟,这通常意味着只知道芯片在每个总线周期内尝试做什么(从这里读取,向那里写入等),或者只是解释一个 8085 指令流,以便像实际芯片中的执行单元一样对每个指令做出反应。
如果是后者,那么整个代码体就不会那么有问题了——程序的字节数组,获取程序计数器说要获取的下一个字节,使用switch 语句来决定要做什么处理它,执行操作。我有一个嵌入在 CP/M 仿真器中的 Z80(与 8085 密切相关)仿真器(因此,只要让指令流正确就足够了),这有几百行,主要是围绕不重复可能,该死的速度。
即使是前者,也不应该那么糟糕。在过去,我编写了一个 Z80 仿真器,它的输入和输出只有一个 64 位整数,表示当前总线状态的数字版本。它具有与之前类似的广泛结构,但必然涉及对未来的转换进行排队并做出额外的中间指令决策。如果您现在只关心正确性和简单性,则可能只保留 GCD 块的NSArray,表示 CPU 在每个时钟转换或每个周期内应该做什么。
可能最聪明的中间立场是让 CPU 的输出流以机器周期为单位。如果您愿意,它们会完全分解为总线状态,但也允许更高级别的解释。
编辑: this 是 Objective-C 形式的 Z80 仿真器,它是指令精确形式的 Z80 仿真器。
它更新并改编了一个更简单的C-format version that was merely a disassembler(事后看来:首先编写反汇编程序可能是一个很好的步骤)。然而,该项目确实包含完整的half-cycle accurate Z80 simulation。然而,我最终决定我不喜欢这种设计 - 进行 C 函数调用,尤其是通过函数指针,每半个周期都过于昂贵,并且将这种低级别的通信直接焊接到模拟的执行单元可能是矫枉过正;任何能准确描述相同过程但以更隐含的形式描述的东西都是可以接受的。
它是一个 6502 模拟器,但 this 是我 (C++) 尝试消化这些经验教训的尝试;它是逐个机器周期的(尽管机器周期在 6502 上恰好是一个时钟周期长,碰巧 - 除非您断言就绪线,它会加载或存储每个周期,无论它是否需要)和根据内部微操作列表安排其工作。这一切都在标题中结束,因为我认为将模拟执行单元与任意总线集成的最佳方法是将其作为模板提供。如果我想要精确的四分之一周期总线报告,例如之前链接的 Z80 代码,那么我只需使用模板创建一个将每个机器周期序列化为适当总线状态的人。
(...尽管如果您只是在谈论仿真,那么即使在任何周期可中断的周期精度也不一定意味着将序列化为我现在喜欢的更小的步骤 — this 6502 emulation 我写道大约 15 年前,只是跳转到一个单独的线程并在任何允许的中断点通过信号量阻塞,这些中断点放置在每个周期结束时)
【讨论】: