所以我正处于完成我的 Intel 8080 模拟器的阶段,遇到了 LHLD 助记符的问题。因此,每当我运行 Altair 克隆 CPU 测试文件 时,我都会遇到一个错误。所以我一次执行了一系列 4 个文件,它们是:
TST8080.COM 电脑测试网 8080PRE.COM 8080EXM.COM 它们都相应地运行和执行,直到最后一个文件出错。 (LHLD 在TST8080.COM 中运行,似乎没有问题)。我试过测试和调试。这是代码和输出:
LHLD函数中使用的函数:
void set_pair(i8080* const s, uint8_t pair, uint16_t value)
{
uint8_t high = (value >> 8) & 0xFF;
uint8_t low = value & 0xFF;
switch(pair)
{
case 0:
s->b = high;
s->c = low;
break;
case 1:
s->d = high;
s->e = low;
break;
case 2:
s->h = high;
s->l = low;
break;
case 3:
s->sp = (high << 8) | (low & 0xFF);
break;
default:
printf("\nCouldn't set pair.\n");
break;
}
uint16_t readWord(i8080* const s, uint16_t addr)
{
return (readByte(s, addr + 1) << 8 | readByte(s, addr));
}
uint16_t nextWord(i8080* const s)
{
uint16_t word = readWord(s, s->pc);
s->pc += 2;
return word;
}
LHLD功能:
void lhld(i8080* const s, uint8_t opcode)
{
set_pair(s, opcode & 0x7, readWord(s, nextWord(s)));
}
我在测试时注意到的问题是没有读取 nextWord 函数,使其成为 0.
我阅读并检查了 PC 值,在 LHLD 之前它是 = 0x0006 当调用 nextWord 时,它应该被读入内存,但是当它被读入内存时它变成了 0?
BEFORE LHLD: 0x0006 // Before LHLD operations
BEFORE VALUE: 0x0000 // Value inputted to set_pair
AFTER VALUE: 0x0000, 0x0000, 0x0000 // After low, high and value are set in set_pair
AFTER LHLD: 0x11F9 // PC value read into memory (In hex)
AFTER LHLD: 4601 // PC value read into memory (In decimal)
H: 0x0000, L: 0x0000 // Value of H and L registers after LHLD
相应地调用所有指令,其他一切正常。我还尝试使用调试器(尤其是 LLDB)解决问题,我检查了变量值及其对程序的影响;这是我在 LHLD 操作期间调用的变量得到的(JMP a16 也包含在这里,因为我认为它与错误有关,JMP 是文件执行期间调用的第一条指令,然后是 LHLD):
AF = 0002 BC = 0000 DE = 0000 HL = 0000 PC = 0100 SP = 0000 CYC = 0 (C3 13 01 00)
F = 2 SF = 0 ZF = 0 HF = 0 PF = 0 CF = 0
- JMP, $
opcode='\xc3'
nextWord函数:
addr=257
opcode='\xc3'
跳跃功能:
addr=275
opcode='\xc3'
opcode='\xc3'
opcode='\xc3'
AF = 0002 BC = 0000 DE = 0000 HL = 0000 PC = 0113 SP = 0000 CYC = 10 (2A 06 00 F9)
F = 2 SF = 0 ZF = 0 HF = 0 PF = 0 CF = 0
- LHLD, $
opcode='*'
opcode='*'
opcode='*'
在读取期间的 nextWord 函数之后:
addr=276
opcode='*'
readWord 再次被调用 =
addr=6
opcode='*'
opcode='*'
opcode='*'
opcode='*'
注意:我连续多次提到一个变量的原因是因为这是直到到达下一条指令(MVI C,d8)之前显示的变量值的序列。
提前谢谢你,我希望这是足够的信息。
根据您提供的信息,问题似乎出在readWord函数的实现上。具体来说,该函数似乎没有正确检索构成存储在给定地址的 16 位值的两个字节。
以下是您可以尝试帮助识别和解决问题的一些方法:
我希望这可以帮助您识别和修复错误