6502仿真器上的EhBASIC输入

时间:2017-12-02 08:27:30

标签: c emulation basic 6502

我已经在这个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?

我几乎是这个领域的新手......

1 个答案:

答案 0 :(得分: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.

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

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

UPDATE 阅读你链接的问题/答案,我看到它是一个修改过的ehbasic。 您的键盘轮询线程应将键盘读入$ F004(稍后再清除F004 - 如果我理解说明)。

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