gpt4 book ai didi

javascript - 6502 仿真增强型基本无限循环 $C000 至 $E0ED

转载 作者:行者123 更新时间:2023-11-29 10:41:05 25 4
gpt4 key购买 nike

我的 6502 仿真器终于通过了 AllSuiteA.asm 中的所有测试,但我的仿真器无法仿真增强型基本版,我以 $C000 的价格加载了它。 PC 慢慢攀升至 $C03E,然后 JSR 攀升至 $C892。之后它稳步上升直到 $C908,然后 JSR 再次升至 $E0ED,然后 JMP 间接升至 $0。

为什么 Enhanced Basic 会无限循环,尽管 AllSuiteA 说我的模拟器没问题?

相关函数如下:

操作码:

JSR:

case "JSR": 
var t = pc + 1;
memory[0x0100 + sp] = (t & 0xFF00) >> 8;
sp--;
memory[0x0100 + sp] = t & 0x00FF;
sp--;
pc = address - opcode[2];
break;

JMP:

case "JMP":
pc = address - opcode[2];
break;

寻址模式:

IND:

case "IND":
var b1 = memory[pc + 1];
var b2 = memory[pc + 2];

var mem = (b2 << 8) | b1;

var bb1 = memory[mem];
var bb2 = memory[mem + 1];

address = (bb2 << 8) | bb1;
break;

ABS:

case "ABS":
var b1 = memory[pc + 1];
var b2 = memory[pc + 2];

address = (b2 << 8) | b1;
break;

注意:opcode[2]是正在执行的opcode的字节数

And here is a JSFiddle of the running program.包含在这个 fiddle 中的是 ehbasic.bin 的十六进制表示。

最佳答案

简短版本:当您配置汇编时,您的 CPU 需要模拟重置,而不仅仅是跳入 C000。如果您只想在一行中修复问题,请跳入 FF80


从源代码开始:

C892LAB_CRLF,应该“打印 CR/LF”。

例程做的第一件事是用 0D 加载 A,然后 JSR LAB_PRNA 输出它。这会将您带到 C8ED

那里的代码将要打印的字符与 ' ' 进行比较,并在发现它正在打印控制字符时分支到 LAB_18F9/C90A

C90A 是到E0ED 的长跳转,即V_OUTP。这只是通过 VEC_OUT 的间接 JSR,位于 0207。您的代码似乎只在 02070208 处找到 00,因此向量不正确。

看起来您正在使用 min_mon.asm。这会将相关的输入/输出向量设置为 FF80(从 FFFC 处的 6502 重置向量到达)重置例程的一部分。但是,您的模拟器不会模拟重置,它只是以 PC = C000 开头。

因此向量永远不会被初始化,并且跳跃虽然被正确模拟,但没有到达它应该去的地方。

关于javascript - 6502 仿真增强型基本无限循环 $C000 至 $E0ED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29201175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com