我正在学习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
效果很好,但是,感觉不对。我想分支需要一些时间,打印机可能已经准备好了,感觉代码太多了。
我希望有一种方法可以取消打印机的准备。这可能吗?或者,有没有标准的方法?
首先,切勿使用通用寄存器在非ISR
和ISR
上下文之间传递信息(这里我假设硬件中断处理例程),这是一种不好的做法。请改用内存。 如果需要在ISR
内部使用寄存器,请将其值保存在堆栈上,然后在从中断返回之前恢复。
现在,回答你的问题。根据我的记忆,PDP 中的IRQ
逻辑是边缘触发的,所以我相信你只是错过了被打断的机会,因为你已经"花费"了这种可能性。当您刚刚将当前字节写入数据寄存器后LPT
IE
尝试禁用ISR
内状态寄存器上的位,当要发送的下一个字节NUL
,即:
printfOut: movb (r0)+, @#tpb
tstb (r0)
bne done
clr @#tps
done: rti