【问题标题】:EhBASIC input on 6502 emulator6502 仿真器上的 EhBASIC 输入
【发布时间】:2018-05-16 07:16:27
【问题描述】:

我已经在这个 6502 仿真器上工作了一段时间,我正在努力获得一个简单的增强型 BASIC ROM 来工作。虽然它缺乏精确的时钟计时,但仿真器确实通过了 AllSuiteA.asm。 使用 EhBASIC,当对该地址进行读取时,我设法通过打印 $F001 的值来获得一些输出。

if(lastwrite == 0xF001)
    {
    printf("%c",CPUMEM[0xF001]);
    }

但是,我不知道如何模拟输入过程。 This post 指出,每当 EhBASIC 需要输入时,它将轮询 $F004。但是我目前的代码似乎有两个问题:

while(1)
    {
    decodeandexecute();
    if(lastread == 0xF004)
        {
        inputchar = getchar();
        CPUMEM[0xF004] = inputchar;
        }
    if(lastwrite == 0xF001)
        {
        printf("%c",CPUMEM[0xF001]);
        }
    }
  • 只能通过单个字母输入(预期)
  • 在程序询问内存大小后,提供任何输入只会导致从 $F004 (LDA $F004) 读取循环 - 即我无法让 EhBASIC 知道何时停止接收输入

我想知道一种输入字符串的有效方法,并通过“内存大小?”。

另外,如果我想让EhBASIC自动计算内存大小,我应该在$F004中输入什么?

我在这方面几乎是新手......

【问题讨论】:

    标签: c emulation basic 6502


    【解决方案1】:

    我看到你在代码中使用了getchar,如果我没记错的话,那是一个阻塞调用(它会等到有人按下某个键)。

    在 ehbasic 的手册中说:

    How to.
    The interpreter calls the system routines via RAM based vectors and, 
    as long as the requirements for each routine are met, these can be changed 
    on the fly if needs be.
    
    All the routines exit via an RTS.
    
    The routines are ... 
    
    Input 
    This is a non halting scan of the input device. If a character is ready it 
    should be placed in A and the carry flag set, if there is no character then A,
    and the carry flag, should be cleared.
    

    解决这个问题的一种方法是使用两个线程。运行 ehbasic 的 6502 仿真的一个线程和轮询键盘的另一个线程。 然后让轮询线程将任何输入键击推送到 ehbasic 输入例程可以使用的小缓冲区中。

    手册:http://www.sunrise-ev.com/photos/6502/EhBASIC-manual.pdf

    更新 阅读您链接到的问题/答案,我发现它是经过修改的 ehbasic。 您的键盘轮询线程应将读取的击键放入 $F004 中(一段时间后再次清除 F004 - 如果我理解说明)。

    更新 2 作为调试提示:在您的第一个版本中,只需使用带有固定输入的字符串,例如 10 print "hello" 20 goto 10,然后从那里输入 $f004。这样您就不必担心使用实际键盘时出现任何问题。

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多