如何最好地从DCPU16上的键盘获取角色

时间:2012-05-26 18:33:03

标签: dcpu-16

所以,我的目标是编写一个子程序,当被调用时,它会挂起,直到用户输入一个由<return>终止的字符串,然后它返回(可能通过将其写入用户指定的地址)。 / p>

我的问题在于如何最好地从键盘上获取单个角色。我认为有三种方式:

  1. 从键盘中侦听中断并获取角色以响应这些。这意味着getline执行的逻辑将在中断处理程序中,这似乎会导致一些问题。即如何回复getline以回复<return>键?在中断处理程序中,您没有方便的返回地址。在中断处理程序中放置太多特定逻辑的模式在我看来......错了......即使我在低级编码方面缺乏经验。

  2. 只需按住键盘即可按键。

  3. 使用中断处理程序实现旧的1.1行为,方法是将所有按下的字符加载到循环缓冲区(可能长度为1)。

  4. 对这些选项的更多看法会很好。

1 个答案:

答案 0 :(得分:1)

当你调用getline时,它应该设置中断处理程序,以便将类型化的键添加到缓冲区并更新索引

然后启动一个忙循环,直到缓冲区的末尾有一个新行并禁用键盘中断

getline: 
set push B
set push X
;--coming from interrupt dispatch
SET B, buffer ;--address from argument
SET C, bufferlength ;-- from argument
SET PUSH, 0
SET X, SP ;--address of counter
SET A, startKeyInput
INT softwareInterrupt

IAQ 1;--restart interrupts
startloop:
SET A,buffer
ADD A,SP
IFN [A],'\n'
    set PC, startloop ;--busy loop
IFL PEEK, X
    set PC, startloop ;-- stopping buffer overflow
IAQ 0;--stop interrupts
set A, stopKeyInput
INT softwareInterrupt

SET C,POP;-- C is return value
SET X,POP
SET B,POP
FRI ;-- from interrupt

并且中断处理程序将类型化的键添加到缓冲区,直到它满,并将1加到计数器中,这可以放在中断处理程序本身,但是你需要在忙循环中重新激活中断