在基于中断的打印中打印第一个 Ascii 字符



我正在学习PDP-11的汇编程序,作为作业的一部分,我不得不编写一个使用中断的printf。 r0 指向当前字符,字符串以 0 结尾。

打印件:

printSend: cmpb     #0, (r0) 
           beq  printfEnd
           mov  #100,   @#tps 
           wait
           br   printfSend 

中断:

printfOut:  movb (r0)+,     @#tpb
            rti

经过一些测试,很明显我需要以不同的方式处理第一个字符。因为如果我开始等待时打印机已经准备好,那么我将永远等待。所以我在 printf 的开头添加了以下代码:

        cmpb    #0,     (r0)
        beq     printfEnd
        tstb    @#tps
        bpl     printfSend
        movb (r0)+,     @#tpb

效果很好,但是,感觉不对。我想分支需要一些时间,打印机可能已经准备好了,感觉代码太多了。

我希望有一种方法可以取消打印机的准备。这可能吗?或者,有没有标准的方法?

首先,切勿使用通用寄存器在非ISRISR上下文之间传递信息(这里我假设硬件中断处理例程),这是一种不好的做法。请改用内存。 如果需要在ISR内部使用寄存器,请将其值保存在堆栈上,然后在从中断返回之前恢复。

现在,回答你的问题。根据我的记忆,PDP 中的IRQ逻辑是边缘触发的,所以我相信你只是错过了被打断的机会,因为你已经"花费"了这种可能性。当您刚刚将当前字节写入数据寄存器后LPT IE尝试禁用ISR内状态寄存器上的位,当要发送的下一个字节NUL,即:

printfOut:  movb (r0)+,     @#tpb
        tstb (r0)
        bne done
        clr @#tps
done:   rti

最新更新