2013-06-02 47 views
1

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

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位值?

+0

寄存器保存8位数据。它既不签名也不签名。每个教学都要决定如何解释它。相对跳转将其解释为已签名。 –

+0

这不是真正的“相对跳跃”。这是一个零页面,X“比较累加器”指令。它将累加器与一些值进行比较并相应地设置标志。事情是,用Zero Page,X(或任何...,X指令),它们被解释为有符号还是无符号?而“他们”是指寄存器。 – ZimZim

回答

4

它有所不同。

他们没有明确的符号或无符号算术,逻辑,移位,或者加载和存储操作。

的条件分支(以及在后面6502个后代无条件一个)一切以参数作为签署;否则循环会非常尴尬。

zero, x寻址通过执行一个8位加法x与零页地址,而忽略进位,并从零页读取来实现。所以例如

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是无符号与携带的工作和成本。

+0

好的,我的脑海里清楚了。要使用Zero,x,我根本无法使用负值,因为它们在任何时候都应该是正值(即,所有有符号值都隐含地转换为它们的二进制补码无符号值对应值)。这同样适用于绝对值,x/y。但是,零点x可以使用负值,所以如果偏移量> 127,那么偏移量将从地址中减去。或者我误解了? – ZimZim

+0

不,这是如果你在C中,你可能会表达它有点像'uint8_t zeroAddress = byteJustRead + x;结果=内存[zeroAddress];'。我猜在Java中可以等效地表示为char charAddAddress =(byteJustRead + x)&0x00ff; result = memory [zeroAddress];',即所以你只保留结果的低8位(假设我记得'char'是Java中的无符号16位类型是准确的)。所以它是无符号的加法,但最终可能会得到较低的值。 – Tommy

+0

说实话,在我的6502仿真器上工作多一点(现在我大部分都在工作),我终于完全理解了这个答案。谢谢。 – ZimZim

0

的“符号”是一个简单的最显著(又名位7)在一个8位字节的值。

6502在这些方面有符号价值的支持:

  • N.P - 但它确实只是告诉你,如果最后的指令开启或关闭一个内存位置的第7位或注册。通常使用BPL/BMI在内存位置根据位7使用标志或“boolean”来使用。
  • V位的.Pflipped“时增加两个正数溢出的结果,并且结束了负的,并且当添加两个负数溢出的结果,并且结束正”
  • 当然,服从符号仅用于相对分支指令,例如BEQ带有位7的值将移动到较低的内存位置,而不是较高的位置。

除此之外,是否意味着任何事情完全取决于您和您的计划。真正使数字有符号或无符号的是你如何显示数字。

上面的链接文章进入了什么是补码和二进制补码,以及它如何使数学工作没有6502不必太多关于标志。

相关问题