読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

端末からの文字入力

Unix

概要

P403

  1. 1文字入力したら割り込みが発生
  2. 変換した値を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);
    }
}

割り込みが終わったらスケジューラ