【问题标题】:Does the 6502 use signed or unsigned 8 bit registers (JAVA)?6502 使用有符号或无符号 8 位寄存器 (JAVA) 吗?
【发布时间】:2013-06-02 07:37:50
【问题描述】:

我正在为 6502 编写一个模拟器,基本上,有一些指令在其中一个寄存器(主要是 X 和 Y)中保存了一个偏移量,我想知道,因为分支指令使用有符号的 8 位整数,寄存器是否将它们的值保持为 8 位有符号?意思是:

switch(opcode) { 
    //Bunch of opcodes
    case 0xD5: 
    //Read the memory area with final address being address + x offset
    int rempResult = a - readMemory(address + x); 
    //Comparing some things, setting/disabling flags
    //Incrementing program counter and cycles/ticks
    break; 
    //More opcodes
}

假设在这种情况下 x = 0xEE。在常规二进制中,这意味着 x = 238。然而,在 6502 中,分支指令使用带符号的偏移量来跳转到内存地址,所以我想知道,在这种情况下,238 是解释为 -18,还是只是常规无符号 8 位值?

【问题讨论】:

  • 寄存器保存8位数据。它既没有签名也没有未签名。由每条指令决定它如何解释它。相对跳转将其解释为有符号。
  • 这并不是真正的“相对跳跃”。这是一个零页,X“比较累加器”指令。它将累加器与一些值进行比较并相应地设置标志。问题是,对于零页,X(或任何...,X 指令),它们被解释为有符号还是无符号? “他们”是指寄存器。

标签: cpu-registers 6502 signedness


【解决方案1】:

各不相同。

对于算术、逻辑、移位或加载和存储操作,它们没有显式签名或无符号。

条件分支(以及后来的 6502 个后代的无条件分支)都将参数视为有符号;否则循环会非常尴尬。

zero, x 寻址是通过在零页地址上执行 8 位加法、忽略进位并从零页读取来实现的。所以例如

LDX #-126    ; which is +130 if unsigned
LDA 23, x

将从地址 23+130 = 153 读取。但如果它是 223+130,那么最终读取将来自 (223 + 130) MOD 256 = 97。

absolute, x/y 未签名并且进位可以正常工作(但需要一个额外的周期)

(zero, x) 与直接版本非常相似,因为偏移量已签名,但结果始终在零页内。然后从那里读取真实地址。

(zero), y 未签名,带有进位工作和成本核算。

【讨论】:

  • 好的,我脑子里已经很清楚了。要使用零,x,我根本无法使用负值,因为它们应该始终为正(即所有有符号值都被隐式转换为它们的二进制补码无符号值对应物)。这同样适用于绝对值 x/y。零,但是 x 可以使用负值,因此如果偏移量 > 127,将从地址中减去偏移量?还是我误会了?
  • 不,如果你在 C 中,你可能会表达它有点像uint8_t zeroAddress = byteJustRead + x; result = memory[zeroAddress];。我猜想在 Java 中可以等效地表示为 char zeroAddress = (byteJustRead + x) & 0x00ff; result = memory[zeroAddress];,也就是说,你只保留结果的低 8 位(假设我记得 char 在 Java 中是一个无符号的 16 位类型是准确的)。所以它是无符号加法,但你可以得到一个较低的值。
  • 老实说,在我的 6502 模拟器上工作了一点之后(我现在大部分时间都在工作)我终于完全理解了这个答案。谢谢。
【解决方案2】:

“符号”只是 8 位字节中最高有效位(也称为位 7)的值。

6502 支持以下方式的带符号值:

  • .P 中的 N 位 - 但它实际上只是告诉您最后一条指令是打开还是关闭内存位置或寄存器的第 7 位。通常使用 BPL/BMI 来根据内存位置中的第 7 位做一些事情,以供标志或“布尔”之类的使用。
  • .PV位,即flipped“当两个正数相加的结果溢出并以负数结尾时,以及当两个负数相加的结果溢出并以正数结尾时”
  • 当然也只服从相对分支指令的符号位,例如BEQ 设置了第 7 位的值将移动到较低的内存位置,而不是较高的位置。

除此之外,该位是否意味着什么完全取决于您和您的程序。真正使数字有符号或无符号的是您如何显示数字。

上面的链接文章介绍了一个补码和二进制补码是什么,以及它如何在 6502 不必过多关心符号的情况下使数学工作。

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 2023-03-14
    • 2016-10-12
    • 2023-03-12
    • 2017-04-14
    • 2021-07-21
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多