【问题标题】:Branch-on-condition instruction of the 6502 with signed bytes?带符号字节的 6502 的条件分支指令?
【发布时间】:2013-06-01 17:36:55
【问题描述】:

我正在制作一个 6502 模拟器(之后我将模拟它周围的其他 NES 组件以拥有一个功能齐全的 NES 模拟器),我遇到了条件分支指令(相对)。现在,我想知道的是,该字节被认为是保存为二进制补码还是常规的负字节?这就是我的意思:

在 6502 个文档之一(当然是非官方的)中给出了这个例子:

BEQ $A7 ;Branch-on-equal with value 0xA7
$F0 $A7 ;Translation into hex

文档中说0xA7应该取-39,表示如下:

1 0 1 0 0 1 1 1 ;-39 dec

如果第 7 位(从 0 开始)为 0,则为 39:

0 0 1 0 0 1 1 1 ;39 dec

我想知道,这个文档是否正确,或者我应该使用二进制补码,意思是:

1 0 1 0 0 1 1 1 

实际上会是 -89?

我问这个是因为我正在用 Java 编写模拟器,字节被解释为二进制补码,我在很多指令中都看到过这种情况,现在我感到困惑.

【问题讨论】:

  • 这里有一些讨论:forums.nesdev.com/viewtopic.php?t=102。结论似乎是错误的;它应该是 2 的补码。
  • 我对处理器了解不多,但我之前读到过,CPU 可以通过使用二进制补码轻松跟踪二进制数,这就是我问这个问题的原因。有一秒钟我正要删除它,认为该文档是由非常有经验的人制作的,即不太可能是不正确的,但幸运的是我没有删除它,否则我的整个 CPU 将一文不值。谢谢。具有讽刺意味的是,我还注意到重复的 0x60 操作码错误,这就是为什么我(幸运地)使用多个资源作为参考。似乎即使是最好的也很容易出错。
  • 伟大的项目承接。祝你好运。 :)

标签: java binary emulation twos-complement 6502


【解决方案1】:

哇,在这台机器上设置回程机器!早在 70 年代和 80 年代,我就曾在 '02 家族的 Atari VCS、计算机家族和投币街机游戏上进行汇编编程。好的,我记得所有 BEQ(相等分支)指令所做的就是检查“零标志”的状态,如果设置了则分支。零标志根据比较和数学函数设置/清除。

由于您要询问 '02 上的 +/- 数字,您可能想要 BPL(如果为正则为分支)或 BMI(如果为负则为分支),它们基于符号“N”标志,基本上只是第 7 位蓄能器。所以递减 0 会让你得到 $ff 并设置减号'N'标志。您会将此 $ff 解释为 -1,表示 2 的补码。

更新: 是的,我的回答可能有点迂回。所以,是的,它是 2 的补码,偏移量是将要获取的下一个操作码的地址,这意味着 -2 或 $fe 会让你回来到你的“BEQ”。所以 $F0 $A7 实际上会从 BEQ 地址前 2 个字节的地址向后分支 89 个字节

【讨论】:

  • 但是根据 OP 的任务,在操作码字段的上下文中呢?
  • 如果我理解正确,他的最后一行给出了答案:“你会将此 $ff 解释为 -1,表示 2 的补码。”他说的是 BPL 与“N”标志的结合,所以我认为它确实是在操作码字段的上下文中。
  • 是的,我的回答可能有点绕圈子。所以,是的,它是 2 的补码,偏移量与将要获取的下一个操作码的地址相同,这意味着 - 2 或 $fe 会让你回到你的'BEQ'。所以 $F0 $A7 实际上会从 BEQ 地址前 2 个字节的地址向后分支 89 个字节...
  • 是的!这是一个完美的答案。我什至会说我对 pc + 2 部分以及我应该在 pc 中添加 2 的位置有点困惑,但现在我 100% 清楚了。非常感谢:)
  • 这篇文章 (6502.org/tutorials/compare_beyond.html) 声称 N 位实际上不是签名比较的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2020-09-18
相关资源
最近更新 更多