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

by shigemk2

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

klopen

前提

KL-11が何枚か刺せる DL-11も何枚か刺せる

本体---KL-11---端末 (出力先は画面ではなく紙テープ)

この端末のことをテレタイプ(teletype)端末という。端末は複数刺さるが、物理スロットが少ないからつなげるのには限界がある

マルチプレクサで複数つなげることも可

原理的にはレジスタのベースアドレスをKLADDRにマッピング

klopen

KL11端末のオープン処理を行うデバイスドライバ

/dev/kl0 /dev/kl1 /dev/kl2

デバイスファイルとttyが一対かどうかは不明

デバイス→4つのレジスタ

メモリの特定の番地にKL-11が割り当てられていて、その中に4つのレジスタがある

メモリマップドIO メモリマップドI/O - Wikipedia

レジスタのアドレスは微妙に歯抜けである

値がハードコーディングされているのでKL-11の増設のたびにコンパイルしてリビルドしている

dmr/kl.c

klopen(dev, flag)
{
    register char *addr;
    register struct tty *tp;

    if(dev.d_minor >= NKL11+NDL11) {
        u.u_error = ENXIO;
        return;
    }
    tp = &kl11[dev.d_minor];
    if (u.u_procp->p_ttyp == 0) {
        u.u_procp->p_ttyp = tp;
        tp->t_dev = dev;
    }
    /*
    * set up minor 0 to address KLADDR
    * set up minor 1 thru NKL11-1 to address from KLBASE
    * set up minor NKL11 on to address from DLBASE
    */
    /* 割り当てアドレスの計算 */
    /* このあたりの計算は地味に複雑 */
    addr = KLADDR + 8*dev.d_minor;
    if(dev.d_minor)
        addr =+ KLBASE-KLADDR-8;
    if(dev.d_minor >= NKL11)
        addr =+ DLBASE-KLBASE-8*NKL11+8;
    tp->t_addr = addr;
    /* フラグ管理とモード変換 */
    if ((tp->t_state&ISOPEN) == 0) {
        tp->t_state = ISOPEN|CARR_ON;
        tp->t_flags = XTABS|LCASE|ECHO|CRMOD;
        tp->t_erase = CERASE;
        tp->t_kill = CKILL;
    }
    /* レジスタの初期設定(実際の処理はここだけ) */
    addr->klrcsr =| IENABLE|DSRDY|RDRENB;
    addr->kltcsr =| IENABLE;
}

CR ポインタを行頭に戻す LF 改行

unixだとLFはCRも同時にやってくれる

誤字の場合は#に書き換える 行ごと間違えた場合は@をつける