【问题标题】:How to best get a character from the keyboard on the DCPU16如何最好地从 DCPU16 上的键盘获取字符
【发布时间】:2012-05-26 18:33:02
【问题描述】:

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

我的问题在于如何最好地从键盘中获取单个字符。在我看来,有 3 种方式:

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

  2. 只要继续拉动键盘按键即可。

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

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

【问题讨论】:

    标签: dcpu-16


    【解决方案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,这可以放入中断处理程序本身,但您需要在繁忙循环中重新激活中断

    【讨论】:

    • 非常感谢您的回答,但恐怕我还不太明白。我已经写下了一些在阅读时突然出现在我脑海中的问题,但是时间太长了,不能在这里。我已经发到这里了:pastebin.com/Nwq5qRSU如果你喜欢的话,欢迎你详细说明里面的一些观点。
    • @andvin 如果这个答案有效,您应该真正接受答案并研究它为什么有效。我很清楚它的作用,也许你应该开始一个更基础的 dcpu-16 汇编 0x10c 论坛和 0x010c wiki 有汇编教程。
    • @booyaa 我确实了解组装的基础知识以及说明的作用。我还能够编写一个有效的 getline 函数。我遇到的问题是如何最好地做到这一点。从棘轮怪胎的实现工作的非平凡方式来看,我想在设计它时需要考虑一些因素。我真的很感激对这些考虑的一些解释。我的问题是我不知道如何最好地利用中断。中断处理程序应该做什么,为什么?像这样的事情是典型的 DCPU 教程中没有解释的 AFAIK。
    猜你喜欢
    • 2022-12-11
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    相关资源
    最近更新 更多