概要
P403
- 1文字入力したら割り込みが発生
- 変換した値をtty.t_rawqに追加
割り込みのハンドラ
マイナー番号に対応するtty構造体をkl11[]から取得し、kl11の入力レジスタから入力された値を取得する
受信可能状態にしたあとにttyinputを実行
dmr/kl.c
klrint(dev) { register int c, *addr; register struct tty *tp; tp = &kl11[dev.d_minor]; addr = tp->t_addr; c = addr->klrbuf; addr->klrcsr =| RDRENB; /* 受信したデータが空だったら、送信用データレジスタに受信結果を格納 */ if ((c&0177)==0) addr->kltbuf = c; /* hardware botch */ ttyinput(c, tp); }
ttyinput
tty.t_rawqにデータを追加する
データの変換が発生するので、生データは送り込まない
データの変換ルール
- CRの書き換え
- FS DELが入力されたらシグナルを送る
- 大文字を小文字に変換
などなど。
ttyinput実際の処理
/* * Place a character on raw TTY input queue, putting in delimiters * and waking up top half as needed. * Also echo if required. * The arguments are the character and the appropriate * tty structure. */ ttyinput(ac, atp) struct tty *atp; { register int t_flags, c; register struct tty *tp; tp = atp; c = ac; t_flags = tp->t_flags; if ((c =& 0177) == '\r' && t_flags&CRMOD) c = '\n'; /* シグナルの送信 */ if ((t_flags&RAW)==0 && (c==CQUIT || c==CINTR)) { signal(tp, c==CINTR? SIGINT:SIGQIT); flushtty(tp); return; } /* キューがたまりすぎてたらキューを空にして処理を終了 */ if (tp->t_rawq.c_cc>=TTYHOG) { flushtty(tp); return; } /* 大文字→小文字変換 */ if (t_flags&LCASE && c>='A' && c<='Z') c =+ 'a'-'A'; /* メイン処理 t_rawqへのデータ追加 */ /* なお、putcはアセンブラ */ /* putcのアセンブラは長いので省略 */ putc(c, &tp->t_rawq); /* デリミタ処理 */ if (t_flags&RAW || c=='\n' || c==004) { wakeup(&tp->t_rawq); if (putc(0377, &tp->t_rawq)==0) tp->t_delct++; } /* ECHOモードの場合の処理 */ if (t_flags&ECHO) { ttyoutput(c, tp); ttstart(tp); } }
割り込みが終わったらスケジューラ