code:putchar - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 该函数用于输出字符
- 传入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)
- 参考 SW->integ 的解释
- 猜测含义:若控制台输出端不可用,则返回,不输出 (遗留问题)
2394 ;
2395 if(rc == 0)
2396 return;
2397 s = KL->xsr;
- 与2405句合作,实现了 附加说明 中的 输出后状态检查机制
2398 KL->xsr = 0;
- 对 原先发送器状态寄存器 进行保护
- 与2406句合作,构成对 原先发送器状态寄存器 的保护和还原
- 关于发送器状态寄存器,参看附加说明
2399 KL->xbr = rc;
2400 if(rc == ’ \n’) {
2401 putchar(’\r’);
2402 putchar(0177);
2403 putchar(0177);
2404 }
\n",则输出回车"\r"
- 2398 2399句对相关寄存器(具体含义见附加说明)进行赋值,进行写操作
- 若输出换行"
- 2402 2403输出两个DEL字符,按LIONS代码解释(参考文献),作用是提供在终端上完成回车操作所需的延迟
2405 putchar(0);
2406 KL->xsr = s;
- 与2395 2396句合作,实现了 附加说明 中的 输出后状态检查机制
2407 }
- 对 原先发送器状态寄存器 进行还原
- 与2397句合作,构成对 原先发送器状态寄存器 的保护和还原
2408 /* ------------------------- */
- 整个过程复用了2391 - 2394 用于状态检查的代码
- 调用函数时,程序完成输出操作,一直运行到2405句,调用自身
- putchar再次进行状态检查(2393),等到输出设备就绪后,执行到2396返回
- KL指向系统控制台,其定义在param.h的第165行
- KL->xsr指向发送器状态寄存器,参看字符设备管理#设备寄存器
- KL->xbr指向发送器数据缓存寄存器,参看字符设备管理#设备寄存器
- 此处使用了无名结构,定义在prf.c的2313行