我正在学习PDP-11的汇编程序,作为我的任务的一部分,我必须写一个将使用中断的printf
。 r0指向当前char,字符串0终止。
printf:
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
虽然工作得很好但是,感觉不对。我认为分支需要一些时间,打印机可能已准备就绪,而且感觉代码太多了。
我希望有一种方法可以取消打印机的准备工作。这可能吗?或者,有没有一种标准的方法呢?
答案 0 :(得分:1)
首先,永远不要使用通用寄存器在非ISR
和ISR
上下文之间传递信息(这里我假设硬件中断处理例程),这是一种不好的做法。改为使用内存。如果需要在ISR
内使用寄存器,则将其值保存在堆栈中,然后在从中断返回之前恢复。
现在,问你的问题。根据我的记忆,PDP中的IRQ
逻辑是边缘触发的,所以我相信你错过了获得中断的机会,因为你已经花了很多时间。可能性。在下一个要发送的字节为IE
时,将当前字节写入数据寄存器后,尝试在LPT
内的ISR
状态寄存器中禁用NUL
位,即:
printfOut: movb (r0)+, @#tpb
tstb (r0)
bne done
clr @#tps
done: rti