code:putchar - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Table of Contents

Source

  • 该函数用于输出字符
  • 传入1个参数c
  • c:想要输出的字符

2378

2379 /*

2380 * Print a character on console.

2381 * Attempts to save and restore device

2382 * status.

2383 * If the switches are 0, all

2384 * printing is inhibited.

2385 */

2386 putchar(c)

2387 {

2388     register rc, s;

2389

2390     rc = c;

2391     if(SW->integ == 0)

2392          return;

2393     while((KL->xsr&0200) ==0)

2394          ;

2395     if(rc == 0)

2396          return;

  • 与2405句合作,实现了 附加说明 中的 输出后状态检查机制
2397     s = KL->xsr;
  • 对 原先发送器状态寄存器 进行保护
  • 与2406句合作,构成对 原先发送器状态寄存器 的保护和还原
  • 关于发送器状态寄存器,参看附加说明
2398     KL->xsr = 0;

2399     KL->xbr = rc;

2400     if(rc == ’ \n’) {

2401          putchar(’\r’);

2402          putchar(0177);

2403          putchar(0177);

2404     }

  • 2398 2399句对相关寄存器(具体含义见附加说明)进行赋值,进行写操作
  • 若输出换行"
\n",则输出回车"\r"
  • 2402 2403输出两个DEL字符,按LIONS代码解释(参考文献),作用是提供在终端上完成回车操作所需的延迟

2405     putchar(0);

  • 与2395 2396句合作,实现了 附加说明 中的 输出后状态检查机制
2406     KL->xsr = s;
  • 对 原先发送器状态寄存器 进行还原
  • 与2397句合作,构成对 原先发送器状态寄存器 的保护和还原
2407 }

2408 /* ------------------------- */

Extend

附加说明

输出后状态检查机制

  • 整个过程复用了2391 - 2394 用于状态检查的代码
  1. 调用函数时,程序完成输出操作,一直运行到2405句,调用自身
  2. putchar再次进行状态检查(2393),等到输出设备就绪后,执行到2396返回

关于KL

Caller

⚠️ **GitHub.com Fallback** ⚠️