问题标签 [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 - 为什么NES初始化代码是这样的(6502汇编)?
基本上它似乎做的是用 0 初始化所有上述地址,递增 x,跳回到标签的开头,用 1 填充所有地址,再次递增 x,它一遍又一遍地发生,直到 BNE 为假(所以如果零标志为 1)。所以基本上当 X 为 0xFF 时发生 INX 时,X 将为 0(对吗?),并且 BNE 将为假,它将停止分支并继续执行程序。我理解其余的大部分内容,但为什么它会用看似随机的内存地址来做这件事呢?为什么是 0x000、0x100、0x200 等?为什么这个循环会发生 256 次?之后的代码显示程序等待第二个 VBLANK(NES PPU 相关),我有点明白,但是 256 时间循环是什么?它声明它需要燃烧大约 30k 个周期,但为什么要这样呢?
注意:原来我在阅读代码时没有注意,当我问这个问题时,我忘记了 STA 指令做了什么。上面的一些信息是不正确的。
assembly - 6502轻量级压缩算法
我正在为我正在编写的 Forth 在 Commodore PET(为了好玩)上的双盒式磁带机上实现虚拟内存。如果你有兴趣的话,我到目前为止在http://github.com/chitselb/pettil 。
我打算使用 PET 的原生 192 字节磁带数据文件格式。哦,是的,所有东西都只有 32K 的 RAM 。我在语言中嵌入了 Woz 出色且非常节省内存的 Sweet-16 解释器。
Forth 块(通常)是 1024 字节。为块 ID 添加两个字节将可用虚拟地址空间限制为 64 兆,远远超过磁带上的容量。将有一个“播放”卡座(设备 1)和一个“记录”卡座(设备 2),并且 FLUSH 将涉及将整个虚拟内存从一个驱动器复制到另一个驱动器。为什么要向风车倾斜?因为在过去,盒式磁带是大多数 PET 所有者拥有的,包括在内。
大多数数据将是 Forth 代码的屏幕,在这个实现中它将是 1000 字节的文本和一个 24 字节的换行表,因为我也使用了 PET ROM 屏幕编辑器。我正在寻找的任何东西(可能)会为此目的击败简单的运行长度编码,但没有像 Lempel-Ziv 这样复杂的东西的 CPU 和内存开销。除了“忘记它”之外的所有建议都值得赞赏。
assembly - 等待 $D012 上的更改(C64 汇编器)
我在模拟 C64 机器上玩 asm 时遇到了一些问题。
我要做的是检查是否按下了键盘上的键“N”,然后程序应该等待地址 $D012 上出现更改。现在我不明白的是我如何“等待”改变出现?谁能告诉我这是怎么一回事?
检查键盘上的 N 按钮是否被按下很简单 - 只需使用子程序 FFE4(输入)和 FFD2(输出)。
我真的不要求为我做任何事情,但如果我能快速了解 D012 的工作原理以及如何“等待”更改,我将非常感激。
提前致谢!
assembly - 仿真器编程:仿真器如何理解地址中的操作码?
我很难理解 SNES 如何理解什么是操作码以及什么是地址/参数。我知道每个操作码都由一个唯一的十六进制字节编码。它们是紧随其后的字节吗?如果是这样,它如何知道接收一个字节或两个字节(对于绝对地址或直接地址)。
如果是这种情况,这是否意味着文件的第一个字节(在标头之后)是一个操作码?
assembly - 在 X 寄存器上间接索引 - 汇编器 6502
所以我试图弄清楚如何绕过LDX没有间接索引选项的事实,但我很不走运。(非常新的汇编程序)我正在使用 LDA (arrPoint), Y 从 int 数组中加载一个获取 MSB,我想使用 LDX (arrPoint), Y 来获取 LSB。
关于如何编写此代码以便可以使用 X 寄存器间接索引的任何提示?
这是我的一些代码,其中 arrPoint 位于内存 $1000 处,而 slask 是 2 个数据字节。
谢谢
c++ - C/C++ 中的 6502 仿真器:如何将寻址模式代码与实际指令代码分开
在业余时间,我开始为 6502 CPU 编写一个非常简单的 C++ 模拟器。我曾经为这个 CPU 写了很多汇编代码,所以所有的操作码、寻址模式和其他东西都没什么大不了的。
6502 有 56 条不同的指令加上 13 种寻址模式,总共提供 151 种不同的操作码。对我来说速度不是问题,所以我不想编写一个巨大的 switch-case 语句并一次又一次地重复相同的代码(不同的操作码可以使用不同的寻址模式引用相同的指令)我想将实际的指令代码与寻址模式代码:我发现这个解决方案非常简洁,因为它只需要编写 13 个寻址模式函数和 56 个指令函数而无需重复自己。
这里的寻址模式功能:
它们都返回指令用于读取/写入操作数/结果的实际内存地址(16 位)
指令函数原型为:
它采用 16 位地址,执行自己的操作,更新状态标志和/或寄存器,并将结果(如果有)提交到相同的内存地址。
鉴于该代码框架,我发现难以使用累加器寻址模式,这是唯一一种返回 A 内部寄存器的实际值而不是内存地址的模式。我可以使用 uin16_t 返回类型返回 A 的值,并为这种寻址模式添加一个布尔标志,但我发现它是一个非常丑陋的解决方案。
指令功能应该完全与寻址模式无关。
c - 8 位 NES 程序内存限制
我正在学习 C 编译器中的 8 位 6502 编程 (www.cc65.org)
NES FC 有一个 8 位 6502 处理器和一个 2K RAM。但是,以下 C 编译(到 nes 文件)并在 VirtualNES 模拟器中成功加载。
为什么这样可以?显然,我在上面的 C 代码中分配了超过 2K 的内存。
assembly - 6502 汇编器 - RTS 命令和堆栈
我必须回答以下关于 6502 汇编语言的问题:
“在堆栈上,有以下值(顶部元素在前):0x01, 0x02, 0x03, 0x04, 0x05, 0x06
地址0xc000
是指令jsr 0xABCD
。在获取/执行周期之后,哪个值将存储在程序计数器中,堆栈的顶部元素是什么?”
我知道程序计数器将是0xABCD
,但我对堆栈元素感到困惑。我知道在 6502 架构中,堆栈从顶部到底部(从0x01FF
到0x0100
)增长。所以,我假设,堆栈指针指向元素0x01
,对吧?
现在,返回地址应该是program counter + 3
,因为有next
命令,所以我会说,0xc003
将被压入堆栈,但以小端顺序排列,因此c0
将是顶部元素。那是对的吗?
assembly - 在 6502 中添加两个 16 位整数以产生 16 位答案?
我需要添加两个 16 位整数以使用绝对模式寻址生成 16 位答案。但是,我弄乱了内存地址,无法弄清楚原因。请建议我更正我的代码:
loops - 在 6502 中添加两个 n 字节整数以产生 n 字节答案?
我在 6502 中遇到了另一个问题....
我正在尝试添加两个 n 字节整数以产生 n 字节结果。我不完全确定我是否对这个项目的 6502 芯片有足够的了解,因此对我当前代码的任何反馈都会非常有帮助。
我知道我应该使用 INX(增加 x 寄存器)和 DEY(减少 y 寄存器),但我不确定操作码的位置。
说明:使用绝对索引寻址添加两个 n 字节整数
LDA、ADC 和 STA 在循环之外(第一次在汇编中使用循环)
编辑: