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

时间:2015-03-22 23:34:18

标签: javascript emulation addressing-mode 6502

我终于达到了我的6502模拟器通过AllSuiteA.asm中的所有测试的程度,但是我的模拟器无法模拟我在$ C000加载的Enhanced Basic。接下来发生的事情是PC慢慢攀升至$ C03E,然后JSR升至$ C892。之后它稳步上升到$ C908,再次JSR再次达到$ E0ED,然后JMP间接到$ 0.

为什么增强型基本无限循环,尽管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;

注意:操作码[2]是正在执行的操作码的字节数

And here is a JSFiddle of the running program.这个小提琴中包含了ehbasic.bin的十六进制表示。

1 个答案:

答案 0 :(得分:3)

简短版本:在配置汇编时,您的CPU需要模拟复位,而不只是跳转到C000。如果您只想在一行中修复内容,请跳至FF80


使用源代码:

C892LAB_CRLF,应该&#34;打印CR / LF&#34;。

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

那里的代码将要打印的字符与&#39;进行比较。 &#39;并且在发现它正在打印控制角色时分支到LAB_18F9 / C90A

C90AE0ED的跳远,即V_OUTP。这只是间接的JSRVEC_OUT,位于0207。您的代码似乎只在000207找到了0208,因此向量不正确。

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

因此,向量永远不会被初始化,跳跃虽然被正确模拟,但并没有到达应有的位置。