6502 仿真器上的 EhBASIC 输入
EhBASIC input on 6502 emulator
我已经在这个 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 知道何时停止接收输入
我想知道输入一串字符并通过的有效方法"memory size?"。
另外,如果我想让EhBASIC自动计算内存大小,$F004应该输入什么?
我在这方面几乎是个新手....
我看到你在代码中使用了 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
更新
阅读您链接到的 question/answer,我看到它是一个修改过的 ehbasic。
您的键盘轮询线程应将读取的击键放入 $F004(并在一段时间后再次清除 F004 - 如果我理解说明)。
更新 2
作为调试提示:在您的第一个版本中,只需一个带有固定输入的字符串,例如 10 print "hello" 20 goto 10
并从那里输入 $f004 。这样您就不必担心使用实际键盘的任何问题。
我已经在这个 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 知道何时停止接收输入
我想知道输入一串字符并通过的有效方法"memory size?"。
另外,如果我想让EhBASIC自动计算内存大小,$F004应该输入什么?
我在这方面几乎是个新手....
我看到你在代码中使用了 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
更新 阅读您链接到的 question/answer,我看到它是一个修改过的 ehbasic。 您的键盘轮询线程应将读取的击键放入 $F004(并在一段时间后再次清除 F004 - 如果我理解说明)。
更新 2
作为调试提示:在您的第一个版本中,只需一个带有固定输入的字符串,例如 10 print "hello" 20 goto 10
并从那里输入 $f004 。这样您就不必担心使用实际键盘的任何问题。