【发布时间】:2023-02-25 04:59:30
【问题描述】:
所以我正处于完成我的 Intel 8080 模拟器的阶段,遇到了 LHLD 助记符的问题。所以,每当我运行 Altair Clone CPU Test Files 时,我都会遇到一个错误。所以我一次执行了一系列 4 个文件,它们是:
TST8080.COM
电脑测试网
8080PRE.COM
8080EXM.COM
它们都相应地运行和执行,直到最后一个文件出错。 (LHLD 在TST8080.COM 中运行,似乎没有问题)。我只在最后一个文件中遇到过这个问题,nextWord 和 readWord 功能在以前的文件中大多很好。我试过测试和调试。这是代码和输出:
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)。
提前谢谢你,我希望这是足够的信息。
【问题讨论】:
标签: c emulation 8-bit intel-8080