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

时间:2016-01-23 20:47:16

标签: assembly

我正在学习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

虽然工作得很好但是,感觉不对。我认为分支需要一些时间,打印机可能已准备就绪,而且感觉代码太多了。

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

1 个答案:

答案 0 :(得分:1)

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

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

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