我正在为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位值?
答案 0 :(得分:4)
它有所不同。
对于算术,逻辑,移位或加载和存储操作,它们没有显式签名或无符号。
条件分支(以及后来的6502后代上的无条件分支)都将参数视为已签名;否则循环会非常尴尬。
通过对零页面地址执行8位x加,忽略进位和从零页读取来实现 zero, 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
未签名,随身携带工作和费用计算。
答案 1 :(得分:0)
"签署"它只是8位字节中最重要的值(也称为第7位)。
6502以这些方式支持签名值:
N
中的.P
位 - 但它实际上只是告诉您最后一条指令是打开还是关闭内存位置或寄存器的第7位。通常使用BPL
/ BMI
基于位7的内存位置来执行标记或" boolean"喜欢用。V
的{{1}}位flipped"当添加两个正数的结果溢出并结束为负数时,以及添加两个负数的结果时溢出并结束积极" .P
将移动到较低的内存位置,而不是更高的内存位置。除此之外,这一点是否意味着什么完全取决于你和你的程序。真正使数字签名或未签名的是你如何显示数字。
上面的链接文章介绍了补充和补充的内容,以及如何在数据没有6502过分关注符号的情况下使数学运作。