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