前提
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も同時にやってくれる
誤字の場合は#に書き換える 行ごと間違えた場合は@をつける