问题标签 [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.
assembly - 了解指令如何被翻译(计算机体系结构)
有点令人困惑的问题。但我真的想学习一些低级编程。事情是,像 Arduino/Etc 这样的开发板。真的隐藏了很多正在发生的事情。
我花了一些时间学习计算机体系结构、逻辑/门/顺序逻辑等。(我什至学习了与这一切相关的半导体和电子学物理,只是为了知道到底发生了什么,因为以及如何使用 CMOS 晶体管等制造门)。
但这就是它结束的地方......而且我希望能够理解指令(如十六进制/或汇编/等代码)是如何通过尽可能简单的计算机移动的(我用过的很多书都去了直接从像盖茨到计算机......没有真正的介于两者之间)。甚至一些简单的事情,比如......将值存储在寄存器或内存位置(可能打印到像素?或其他东西)。
我认为有趣的事情甚至可能是最终编写一个模拟器。我有高级语言的经验,但我听说像 6502 这样的东西可能是一个好的开始,因为你使用了很多汇编,而且指令集不是太大。
有谁知道任何可能有帮助的资源/想法/书籍?我已经阅读了“计算系统要素”,虽然......这是一本好书,但我并不觉得它经历了真正发生的事情并看到它发生。这可能更像是一个 Electronics.stackexchange 问题,如果是这样,我深表歉意。
javascript - 有没有办法将 6502 程序集添加到 Google Code Prettify?
我有使用 Google Code Prettify 的博客。我的博客有很多 6502 汇编语言代码,我想添加说明和指令。
我希望有人已经学会了如何添加自定义语言。或者更好的是,知道他们可以共享的 6502 CSS 文件吗?
assembly - CA65:来自 16 位计算地址的“范围错误”
给定以下 CA65 代码:
我收到此错误消息:
有趣的是,以下版本按预期工作:
那么我如何让这个在 a 中工作.scope
呢?
java - 在 Java 中确定 6502 仿真中的进位和溢出标志?
我正在制作一个 6502 仿真器,但一开始我就被卡住了(或者我认为我至少是卡住了)(实现 ADC 操作)。问题是我必须确定是否有进位或溢出。问题是,在我的实现中,我无法真正掌握它们之间的区别。我知道进位是在操作后存在第 9 位时,并且我知道当结果大于 255 时会发生溢出。这不是确定进位和溢出标志是一回事吗?
这不正确吗?如果不是,什么是正确的,为什么?
java - 带符号字节的 6502 的条件分支指令?
我正在制作一个 6502 模拟器(之后我将模拟它周围的其他 NES 组件以拥有一个功能齐全的 NES 模拟器)并且我遇到了条件分支指令(相对)。现在,我想知道的是,该字节被认为是保存为二进制补码还是常规的负字节?这就是我的意思:
在 6502 个文档之一(当然是非官方的)中给出了这个例子:
在文档中,它说0xA7应该被视为-39,并表示如下:
如果第 7 位(从 0 开始)为 0,则为 39:
我想知道,这个文件是否正确,或者我应该使用二进制补码,这意味着:
实际上是-89?
我问这个是因为我正在用 Java 编写模拟器,并且字节被解释为二进制补码,而且我在很多指令中都看到了这种方式,现在我感到困惑。
cpu-registers - 6502 使用有符号或无符号 8 位寄存器 (JAVA) 吗?
我正在为 6502 编写一个模拟器,基本上,有一些指令在其中一个寄存器(主要是 X 和 Y)中保存了一个偏移量,我想知道,因为分支指令使用有符号 8 位整数,所以寄存器将其值保持为 8 位有符号?这意味着:
假设在这种情况下 x = 0xEE。在常规二进制中,这意味着 x = 238。然而,在 6502 中,分支指令使用带符号的偏移量来跳转到内存地址,所以我想知道,在这种情况下,238 是解释为 -18,还是只是常规无符号 8 位值?
emulation - 为什么6502的中断标志初始状态为1?
我正在模拟 6502 处理器,我快完成了(现在处于测试阶段),我正在使用 nesdev 站点的一些 NES 测试,它告诉我中断标志和未使用的第 5 个标志都是最初应该设置为 1(即禁用中断),但为什么呢?我可以理解未使用的标志部分,因为它......嗯......未使用,但我不理解中断标志。我试过在谷歌上搜索,一些网站确认它应该设置为 1,但没有人解释这背后的原因。为什么中断应该从程序开始就被阻止?
emulation - SBC 后溢出标志在 6502 仿真中溢出?
我已经“完成”了对 6502 处理器的仿真,现在正处于测试阶段。作为我的初学者,我已经在这个问题上停留了几个小时。我正在关注一个 NES 测试,它基本上只是一个自制 ROM 和某人制作的日志,它说明了在内存中一步之后每个寄存器中应该有什么值。我被困在日志显示溢出标志在立即 SBC 指令之后被清除的部分,即使累加器的值是 0x40,并且第一个参数(内存 pc + 1)等于 0x41。这意味着0x40 - 0x41应该是0xFF,即-1,这意味着有溢出,对吧?我读了一些关于溢出标志的文章,它指出当一个值太大或太小而无法保存在有符号字节中时会产生溢出,因此溢出到另一侧(即 2 个 8 位正数变为 8 位负数,反之亦然)。那我是不是想错了?这是日志行:
之后的行表明 P 寄存器已变为 0xA4,这意味着进位和溢出标志都被清除。我得到了进位部分,但没有溢出部分。这是下一行,如果关心的话:
顺便一提; 第二行证明了我的观点:A 寄存器确实变成了 0xFF,而有符号字节中的 0xFF 将等于 256 - 255 = -1........
assembly - 机器如何确定屏幕上显示的内容(特别是 6502)?
我知道这是一个非常模糊的问题,对于程序员来说可能不是一个好问题,因为这确实是一个与硬件相关的事情,但我想一些适合这个站点的汇编/机器代码开始发挥作用。
所以我想知道的是;想象一下 6502 处理器。它有一些寄存器、一个指令集和对一定数量内存的访问。然后想象你有一些具有任意分辨率的 LCD 屏幕。如何确定此屏幕上显示的内容?它是如何确定哪个位置的哪个像素被赋予什么颜色的?例如,屏幕是否总是显示一个像素,其值在 6502 的累加器中,x 位置存储在寄存器 x 中,y 位置存储在 y 中?还是每台机器对它的解释不同?
有人编写了一个 JavaScript 6502 模拟器,该设备在某个内存位置显示一个像素,其值从 200 美元开始。例如:
将在位置 x:0, y:0 处显示粉红色像素。
将在位置 x:5, y:0 处显示一个白色像素。
但是,如果您查看 NES,它有一个专用的 PPU,可以在屏幕上的某个区域显示具有特定值的特定像素。
那么它是怎样工作的?每台机器(即Apple II、C64、NES)对它的解释是否不同,或者它的解释方式是否存在某种一致性?
事实上,如果为 Apple II 编译的程序以某种方式在 C64 上执行会发生什么?机器应该能看懂说明书吧?
x86 - 与 6502 相比,在模拟 x86 架构时会出现什么问题?
目前,我正在用 Java 制作 NES 模拟器。除了一些小问题外,我的 6502 核心可以工作 99%。问题是,我正在为 NES 模拟 6502,但我从未像对 PS1、N64 或 DOS 那样对它感兴趣。我一直想模拟一个控制台/系统,它能够做的不仅仅是在屏幕上绘制一些简单的 2D 精灵,比如前面提到的系统。
我想问的是:与 6502 相比,是什么让 x86 处理器难以模拟?我唯一能想到的是庞大的 x86 指令集,并且 x86 仿真器必须对效率进行更多编程,而不是代码的可读性。我问这个是因为我查看了 DosBox 源代码,并且与几乎所有的 6502 开源模拟器相比,DosBox 的 x86 核心的源代码对我来说甚至都无法理解。当一个处理器所做的只是查找操作码列表并系统地执行它们时,为什么会有如此大的复杂性差异?