问题标签 [6502]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
639 浏览

assembly - 6502 中的 .byte 指令:存储位置

这个问题可能会重复,但与我的概念相同的特定问题并没有以一种方式得到回答。

.byte指令将字节存储到指令未使用的 ROM 中。(与我的主题相似的几个问题的答案都说明了这一点)我不确定如何从.byte代码中访问数据,所以让我给你一个 6502 代码的例子。

这行得通吗?无论如何,我的问题不是 .byte 去哪里(ROM),而是如何访问它。例如,在 NES 中,磁带被加载到$8000,所以如果我.byte在程序开始时有数据,我会通过从 加载来访问它$8000吗?当加载接下来的 16 个字节时,我会从$8010?

谢谢,请不要将此标记为重复,因为没有其他问题可以回答我的问题。

如果 tl;dr,那么,你如何.byte从 ROM 访问数据(在 NES 中)

0 投票
2 回答
390 浏览

assembly - 如何在 MOS 6502 上使用 12 位地址?

所以我遇到了如何在 6502 中处理某些地址的问题。基本上,我有 3 个值,我想在 6502 的监视器上表示一个像素的 12 位地址空间。我已经用一些构建了地址元素简单的改装。但是,我不太确定从这里去哪里。假设我的目标地址为 05ff,即右下角的像素。我目前拥有的是第一位,它将添加到 0200、第二位和第三位,但不知道如何从这些中建立一个 12 位的数量。任何人都可以提供帮助吗?除了讲课和方尖碑网站,我的老师有点让我们干了,就用它来弄清楚该怎么做而言,这仍然让我有点头晕目眩。有人知道我该怎么做吗?

目前,对于地址 05ff,我拥有的是一个 3、一个 f 和一个 f。我知道我可以移位以使第二个 f 移动,但我不确定如何将 0200 添加到 0300 以产生数量 0500,然后将其添加到 00ff。

0 投票
3 回答
6674 浏览

javascript - 6502 仿真实现 ADC 和 SBC 的正确方法

我一直在为 MOS 6502 开发仿真器,但我似乎无法让 ADC 和 SBC 正常工作。我正在使用在模拟内存中加载到 0x4000 的AllSuiteA 程序测试我的模拟器,对于 test09,我当前的 ADC 和 SBC 实现没有得到正确的标志。我无数次尝试改变他们的算法,但每次,进位标志和溢出标志都足够重要,并导致测试分支/不分支。

我的两个功能都基于此。

memory[0x10000] 是累加器。它存储在内存范围之外,所以我可以有一个单独的寻址开关语句。

这是我对这些功能的实现之一:

在这一点上我完全没有想法,但我也遇到了与这里提供的数据相同的问题。 因此,我在这里失败的不仅仅是一个实施计划。

0 投票
1 回答
275 浏览

javascript - 6502 仿真增强型基本无限循环 $C000 至 $E0ED

我终于达到了我的 6502 仿真器通过了 AllSuiteA.asm 中的所有测试的地步,但我的仿真器无法模拟增强型基本版,我以 C000 美元的价格加载了它。发生的情况是 PC 缓慢攀升至 $C03E,然后 JSR 攀升至 $C892。之后,它稳步上升到 $C908,在那里它再次 JSR 到 $E0ED,然后 JMP 间接到 $0。

尽管 AllSuiteA 说我的模拟器很好,为什么增强型基本无限循环?

以下是相关功能:

操作码:

JSR:

JMP:

寻址模式:

IND:

ABS:

注意:opcode[2] 是正在执行的操作码的字节数

这是正在运行的程序的 JSFiddle。 此小提琴中包含 ehbasic.bin 的十六进制表示。

0 投票
1 回答
225 浏览

javascript - MOS 6502 仿真器导致增强型基本以科学计数法输出

我一直在为 MOS 6502 开发一个仿真器,此时我几乎已经完全完成了。不过它有一个小问题。它似乎通过了我通过的所有测试,但由于某种原因,它导致增强型基本以科学计数法输出所有内容,包括字符。

仅当数字 > 999999.4375 时,Enhanced Basic 才应该将数字放入科学记数法中。

我应该从哪里开始看?哪些仿真问题会导致 EhBasic 做出这样的响应?我什至不知道从哪里开始使用这么大的程序,并且考虑到我的模拟器通过了我提供的所有测试,我无法完全找到测试的问题。

这是增强型基础的示例输出。

4.8383 实际上应该是 48383。

我冒昧地重新编写代码并注释掉任何不需要查看此问题的内容。它现在应该对任何人都更具可读性。

要重现这一点,请按 C 运行 EhBASIC Cold,对于内存大小,输入 $C000。

编辑:澄清

累加器是内存[memory_size]

一些变量后面有 [0],因为我利用 javaScript Uint8 数组具有无符号 8 位整数和无符号 16 位整数。

0 投票
1 回答
1815 浏览

emulation - 6502 和小端转换

为了好玩,我正在实现一个 NES 模拟器。我目前正在阅读 6502 CPU 的文档,我有点困惑。

我看过文档说明因为 6502 是 little-endian,所以在使用绝对寻址模式时,您需要交换字节。我是在 x86 机器上编写的,它也是 little-endian,所以我不明白为什么我不能简单地转换为 uint16_t*,取消引用它,然后让编译器计算出细节。

我在谷歌测试中写了一些简单的测试,他们似乎同意我的看法。

这通过了,所以看来我的假设是正确的,但我想我会问比我更有经验的人。

这对于在 6502 绝对寻址模式下提取操作数是否正确?我可能错过了什么吗?

0 投票
2 回答
285 浏览

function - 如何在 C++ 中模拟 6502 JMP、分支和子例程?

我有一个应该完全模拟 MOS Technologies 6502 处理器的程序。我几乎已将整个指令集完全实现为 c++ 函数,包括数学、位函数。我什至可以模拟时钟速度。我没有成功实现的唯一指令是 JMP 和所有分支指令,以及子程序指令。这是因为我不知道如何为 C++ 创建一个类似于 goto 的循环。由于我的标头太大而无法放入代码块中,因此我将其链接为文件“6502.h”。任何分步帮助将不胜感激。

https://drive.google.com/file/d/0B1j1lbKWU98iQ1dyVGNCVzRzdDA/view?usp=sharing 6502.h

0 投票
3 回答
419 浏览

c++ - 在多个类上定义的面向对象的跳转表

我正在将 NMOS6502 仿真器重构为多个类。我想知道是否有一种“面向对象”的方式来定义函数跳转表。基本上,我已经定义了单独的指令类来对相关的 cpu 操作组进行分类——比如“CStackInstHandler”或“CArithmeticInstHandler”,它们将引用一个 cpu 对象。每个指令类都派生自一个抽象指令类。每个派生指令类都有一组函数,它们将使用 cpu 对象的公共接口来改变 cpu 状态,例如:

问题是在运行时指令处理程序以及为该处理程序定义的适当成员函数需要使用操作码来确定。

所以我们有 - 从内存中读取操作码,cpu 使用一个表将操作码映射到指令处理程序类型,然后指令处理程序使用相同的操作码来选择正确的函数。每条指令都会覆盖一个“执行”功能,例如:

}

我最终得到了两个查找,其中一个是多余的。一个选择处理程序,另一个选择处理程序函数。我觉得这是完成这项任务的错误方法,但我不确定是否有一种替代方法不仅会演变为非成员函数组。

我想知道是否有人对这个问题有深入的了解。它基本上归结为想要将一个类重构为更小的部分(具有指令成员函数的 cpu 类重构为 cpu 类和指令类),但是所有组件都如此相互关联,以至于我最终不得不重复自己。引入了冗余。

一个非面向对象的解决方案是让这些指令成为接受 cpu 引用的非成员函数。然后,将定义一个函数跳转表,指令将被操作码查找和索引并执行。

对于对象,这似乎并不实际。我可以将所有指令设为静态或其他东西,但这似乎没有抓住重点。

任何有关甚至切向相关问题的见解或信息都会非常有帮助。

谢谢。

0 投票
1 回答
367 浏览

emulation - 6502 在独立测试与 Commodore PET 中的中断行为

我正在 FPGA 上构建 Commodore PET。我在 Kansas Lava 中实现了我自己的 6502 核心(代码可在https://github.com/gergoerdi/mos6502-kansas-lava获得),并在其周围放置足够的 IO(https://github.com/gergoerdi /eightbit-kansas-lava ) 我能够在上面启动原始 Commodore PET ROM,得到一个闪烁的光标并开始输入。

但是,在输入经典的 BASIC 程序后

它会在一段时间后(几秒钟后)崩溃

因为我的代码具有相当合理的每个操作码测试覆盖率,并且它通过了AllSuiteA,所以我想我会研究更复杂行为的测试,这就是我到达Klaus Dormann 的中断测试套件的方式。在堪萨斯熔岩模拟器中运行它指出了我最初的中断实现中的大量错误:

  • I进入中断处理程序时未设置标志
  • B到处都是旗帜
  • IRQ 中断被完全忽略,除非I它们到达时未设置(正确的行为似乎是在设置时将中断排队I,当它未设置时,仍应处理它们)

修复这些之后,我现在可以成功运行 Klaus Dormann 测试,所以我希望通过将我的机器重新加载到真正的 FPGA 上,如果运气好的话,BASIC 崩溃可能会消失。

然而,新版本修复了所有这些中断错误,并在模拟器中通过了中断测试,现在无法响应键盘输入,甚至只是在真实 FPGA 上闪烁光标。请注意,键盘输入和光标闪烁都是响应外部 IRQ(从屏幕 VBlank 信号连接)完成的,因此这意味着固定版本以某种方式破坏了所有中断处理......

我正在寻找任何可能出现问题或如何开始调试的模糊建议。

完整代码可在https://github.com/gergoerdi/mos6502-kansas-lava/tree/interrupt-rewrite获得,有问题的提交(修复测试并破坏 PET 的提交)是7a09b794af。我意识到这与最小可行复制完全相反,但改变本身很小,因为我不知道哪里出了问题,而且因为复制问题需要一台功能足以启动库存 Commodore PET ROM 的机器,我不不知道怎么缩小...

添加:

我设法用一个非常简单(我敢说是最小的)ROM而不是库存的PET ROM在相同的硬件上重现了同样的问题:

0 投票
1 回答
499 浏览

self-modifying - 如何在具有独立 ROM 和 RAM 的真实硬件上运行 Klaus Dormann 的 6502 测试套件

我想运行Klaus Dormann 的完整 6502 测试套件来测试我的 Kansas Lava 6502 实现。然而,代码使用了自我修改(参见 的所有用法range_adr),虽然在仿真器中实现微不足道,但对于硬件实现来说并不是一个好兆头:程序映像需要存储在 ROM 上,因此回写将被基于寻址 ROM 或 RAM 支持的部分写入的任何路由写入黑洞。

当然,同样的问题既适用于将它合成到真正的 FPGA 中,也适用于在模拟器中运行它(低级 VHDL 或高级堪萨斯熔岩)。

有没有一种方法可以运行测试套件,而不需要长时间(就周期而言)暂停 CPU,将程序从一些不可寻址的 ROM 逐字节复制到全 RAM 内存中,然后初始化 CPU 和让它运行?我不想这样做,因为在启动时模拟这些额外的周期会大大减慢运行测试的速度。