TangConsoleDCJ11MEMに2.11BSDをインストールする方法を簡単に説明します。要点だけ書きますので、きちんとした手順書にはなっていません。ご承知おきください。
前提条件
Windows 11とLinux(WSL上で動作するUbuntu) での操作を前提に説明します。読者はそれぞれの環境でのコマンド実行などについては特に説明を要しないものとします。
環境構築
LinuxでSIMHとretro-fuseをインストールします。retro-fuseはソースからビルドします。
参照する情報
- 2.11BSDの文書 211bsd-setup.pdf
- SIMHに2.11BSDをインストールする手順 Installation of 2.11BSD on SIMH
- retro-fuseの使い方 retro-fuse/wiki
用意するもの
- 2.11BSDの配布ファイル 2.11BSD
- Pmod0に接続するmicroSDカードインタフェース Pmod MicroSD
- 2.11BSDのソースコードに適用するパッチ 「全部入り」のパッチ
(4月17日追記:カーネルのバグ修正のための追加パッチがあります
追加パッチ)
概略手順
- ハードウェアの改造とFPGAの更新
- SIMHをインストール
- SIMHに2.11BSDをインストール
- retro-fuseをインストール
- TangConsoleDCJ11MEMに2.11BSDをインストール
- インストールしたdiskイメージを書き換える
詳細手順
上記概略手順の1.、5.と6.についてはもう少し詳しく説明します。
TangConsoleDCJ11MEMの改造とFPGAの更新
FPGAについてはこちらのリポジトリの内容で更新してください。 更新すると下記の改造を施さない限り起動しなくなります。
メモリサイズを256KBから640KBに拡張するため、アドレス線の追加配線が必要です。
アドレス腺(DALH[18], [19])の接続方法ですが、パターンカットを行ってバススイッチを経由してレベル変換するやり方を紹介します。
パターンカットの場所
CPUソケットの表面内側でBS0, 1からのパターンをカットします。 配線の間隔が広いので難しくはないと思います。
ジャンパ配線
CPUのDAL18, 19をそれぞれU5(SN74CB3T3245DWR)の6,7ピンに接続します。また、J5のBS0,1をそれぞれPmod1のW19とF19にそれぞれ接続してください。
U5の足は細いですが、そもそもこの基板を実装できる方なら問題ないでしょう。
テープイメージの作成
2.11BSDの配布ファイルがある場所で以下のコマンドでテープイメージを作成します。
#!/bin/sh
# file 0
dd if=mtboot of=211bsd.img conv=notrunc
dd if=mtboot of=211bsd.img conv=notrunc seek=1
dd if=boot of=211bsd.img conv=notrunc seek=2
# file 1
dd if=disklabel of=211bsd.img conv=notrunc seek=65536
# file 2
dd if=mkfs of=211bsd.img conv=notrunc seek=131072
# file 3
dd if=restor of=211bsd.img conv=notrunc seek=196608
# file 4
dd if=icheck of=211bsd.img conv=notrunc seek=262144
# file 5
dd if=root.dump of=211bsd.img conv=notrunc seek=327680
# file 6
dd if=file6.tar of=211bsd.img conv=notrunc seek=393216
# file 7
# (this file is intentionally unused)
# file 8
dd if=file7.tar of=211bsd.img conv=notrunc seek=524288
# file 9
dd if=file8.tar of=211bsd.img conv=notrunc seek=589824
# file 10
# (this file is intentionally unused)
ルートファイルシステムのインストール
テープから起動してルートファイルシステムをmkfs, restor, icheckします。
@100000g
100026
@0g
73Boot from tm(0,0,0) at 0172522
: tm(0,2)
Boot: bootdev=0402 bootcsr=0172522
Mkfs
file system: rk(0,0)
rk(0,0,0) disklabel missing/corrupt
file sys size [0]: 3072
bytes per inode [4096]:
interleaving factor (m; 2 default):
interleaving modulus (n; 100 default):
isize = 768
m/n = 2 100
Exit called
73Boot from tm(0,0,2) at 0172522
: tm(0,3)
Boot: bootdev=0403 bootcsr=0172522
Restor
Tape? tm(0,5)
Disk? rk(0,0)
Last chance before scribbling on disk. End of tape ### RETを入力
73Boot from tm(0,0,3) at 0172522
: tm(0,4)
Boot: bootdev=0404 bootcsr=0172522
Icheck
File: rk(0,0)
rk(0,0):
files 609 (r=208,d=22,b=144,c=230,l=5,s=0)
used 2738 (i=106,ii=0,iii=0,d=2632)
free 284
missing 0
73Boot from tm(0,0,4) at 0172522
: rk(0,0)unix
Boot: bootdev=03000 bootcsr=0177404
2.11 BSD UNIX #115: Sat Apr 22 19:07:25 PDT 2000
sms1@curly.2bsd.com:/usr/src/sys/GENERIC
panic: iinit
no fs on dev 6/0
syncing disks... done
006102
@
オリジナルのカーネルではルートファイルシステムがマウントできないのでブートするとpanicします。
置き換えるファイルの作成
カスタマイズされたカーネルとRK05用のブートブロックを作成します。
- SIMHのディスクイメージをretro-fuseでマウント
- ソースコードにパッチを適用
- ディスクイメージをアンマウント
- SIMHを起動
- カーネルとブートブロックをビルド(SIMHで作業、手順は後述)
- SIMHを終了
- SIMHのディスクイメージをretro-fuseでマウント
- ビルドしたカーネルとブートブロックをホストにコピー
- ディスクイメージをアンマウント
カーネルとブートブロックのビルド手順
カーネルとブートブロックのビルド手順は以下の通りです。
# cd /usr/src/sys/conf
# ./config SMALL
# cd ../SMALL
# make all
# cd ../mdec
# make
最初のmakeでカーネル(unix)が、次のmakeでブートブロック(rkuboot)が生成されます。
次に、カスタマイズされたカーネルとブートブロックをmicroSDカードイメージに書き込みます。
- 2.11BSDがインストールされたmicroSDカードイメージを取得
microSDカード全体のイメージを取得します(rk05.img)
- カードイメージ上のRK11のディスクイメージをretro-fuseでマウント
$ bsd211fs -o fsoffset=512 -o mapuid=1000:0 -o mapgid=1000:20 rk05.img /tmp/bsd
$ dd if=rkuboot of=rk05.img seek=1024 conv=notrunc
ディスクイメージをmicroSDカードに書き戻せば準備完了です。
/usrとソースコードのインストール手順
以後の作業はシングルユーザモードで行います。デバイスファイルを作成するだけでも分のオーダーの時間がかかるので、気長に待ちましょう。
なお、引数"br[012]"でデバイスを作成していますが、生成されるデバイスファイル名は"rp*"となります。MAKEDEVはこういう実装になっていますので混乱しないようにしてください。
@3773010g
73Boot from rk(0,0,0) at 0177404
: rk(0,0)unix
Boot: bootdev=03000 bootcsr=0177404
2.11 BSD UNIX #32: Fri Mar 13 00:15:09 PST 2026
root@:/usr/src/sys/SMALL
phys mem = 655360
avail mem = 414912
user mem = 307200
March 13 00:17:03 init: configure system
hk ? csr 177440 vector 210 skipped: No autoconfig routines.
ht ? csr 172440 vector 224 skipped: No autoconfig routines.
ra ? csr 172150 vector 154 skipped: No autoconfig routines.
rl ? csr 174400 vector 160 skipped: No autoconfig routines.
tm 0 csr 172520 vector 224 attached
tms ? csr 174500 vector 260 skipped: No autoconfig routines.
ts ? csr 172520 vector 224 skipped: No autoconfig routines.
xp ? csr 176700 vector 254 skipped: No autoconfig routines.
erase, kill ^U, intr ^C
# cd /dev
# rm -f *rk* *mt* *rp*
# ./MAKEDEV rk0 tm0 br0 br1 br2 br3
# stty erase \^h
# stty crt
# rm -f swap drum
# mknod swap b 6 1
# mknod drum b 6 1
# ls -l rk0* *mt0 rp* swap drum
brw-r----- 1 root 6, 1 Mar 13 00:19 drum
brw-rw-rw- 1 root 1, 0 Mar 13 00:18 mt0
brw-rw-rw- 1 root 1, 4 Mar 13 00:18 nmt0
crw-rw-rw- 1 root 7, 4 Mar 13 00:18 nrmt0
brw-r----- 1 root 6, 0 Mar 13 00:18 rk0h
crw-rw-rw- 1 root 7, 0 Mar 13 00:18 rmt0
brw-r----- 1 root 11, 0 Mar 13 00:18 rp0a
brw-r----- 1 root 11, 1 Mar 13 00:18 rp0b
brw-r----- 1 root 11, 2 Mar 13 00:18 rp0c
brw-r----- 1 root 11, 3 Mar 13 00:18 rp0d
brw-r----- 1 root 11, 4 Mar 13 00:18 rp0e
brw-r----- 1 root 11, 5 Mar 13 00:18 rp0f
brw-r----- 1 root 11, 6 Mar 13 00:18 rp0g
brw-r----- 1 root 11, 7 Mar 13 00:18 rp0h
brw-r----- 1 root 11, 8 Mar 13 00:18 rp1a
brw-r----- 1 root 11, 9 Mar 13 00:18 rp1b
brw-r----- 1 root 11, 10 Mar 13 00:18 rp1c
brw-r----- 1 root 11, 11 Mar 13 00:18 rp1d
brw-r----- 1 root 11, 12 Mar 13 00:18 rp1e
brw-r----- 1 root 11, 13 Mar 13 00:18 rp1f
brw-r----- 1 root 11, 14 Mar 13 00:18 rp1g
brw-r----- 1 root 11, 15 Mar 13 00:18 rp1h
brw-r----- 1 root 11, 16 Mar 13 00:18 rp2a
brw-r----- 1 root 11, 17 Mar 13 00:18 rp2b
brw-r----- 1 root 11, 18 Mar 13 00:18 rp2c
brw-r----- 1 root 11, 19 Mar 13 00:18 rp2d
brw-r----- 1 root 11, 20 Mar 13 00:18 rp2e
brw-r----- 1 root 11, 21 Mar 13 00:18 rp2f
brw-r----- 1 root 11, 22 Mar 13 00:18 rp2g
brw-r----- 1 root 11, 23 Mar 13 00:18 rp2h
brw-r----- 1 root 11, 24 Mar 13 00:18 rp3a
brw-r----- 1 root 11, 25 Mar 13 00:18 rp3b
brw-r----- 1 root 11, 26 Mar 13 00:18 rp3c
brw-r----- 1 root 11, 27 Mar 13 00:18 rp3d
brw-r----- 1 root 11, 28 Mar 13 00:18 rp3e
brw-r----- 1 root 11, 29 Mar 13 00:18 rp3f
brw-r----- 1 root 11, 30 Mar 13 00:18 rp3g
brw-r----- 1 root 11, 31 Mar 13 00:18 rp3h
brw-r----- 1 root 6, 1 Mar 13 00:19 swap
# cd /
# mkfs -s 80000 /dev/rp0h40000 /dev/rp0h
isize = 10000
m/n = 2 100
# mkfs -s 40000 /dev/rp0h1h
isize = 10000
m/n = 2 100
# mkfs -s 10400 /dev/rp2a5200 /dev/rp2a
isize = 1296
m/n = 2 100
# mkfs -s 32200 /dev/rp2c
isize = 8048
m/n = 2 100
# mount /dev/rp0h /usr
# mkdir /usr/src
# mount /dev/rp1h /usr/src
# mkdir /usr/src/ucb
# mount /dev/rp2a /usr/src/ucb
# mkdir /usr/src/sys
# mount /dev/rp2c /usr/src/sys
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
root 3022 2706 316 90% /
/dev/rp0h 39373 3 39370 0% /usr
/dev/rp1h 39373 4 39369 0% /usr/src
/dev/rp2a 5117 2 5115 0% /usr/src/ucb
/dev/rp2c 31695 2 31693 0% /usr/src/sys
# TAPE=/dev/nrmt0; export TAPE
# mt rew
# mt fsf 6
# cd /usr
# tar time tar xvb 20
x adm/README, 107 bytes, 1 tape blocks
x adm/daily, 1609 bytes, 4 tape blocks
x adm/lpd-errs, 0 bytes, 0 tape blocks
(snip)
ucb/page linked to ucb/more
ucb/uptime linked to ucb/w
ucb/u linked to ucb/users
ucb/reset linked to ucb/tset
1015.1 real 34.8 user 980.2 sys
# mt rew
# mt fsf 8
# cd /usr/src
# time tar xvb 20
x sys/pdpuba/tmscp.c, 55882 bytes, 110 tape blocks
x sys/pdpuba/rl.c, 18839 bytes, 37 tape blocks
x sys/pdpuba/tags symbolic link to ../sys/tags
(snip)
x include/utmp.h, 1125 bytes, 3 tape blocks
x include/varargs.h, 219 bytes, 1 tape blocks
x include/vfont.h, 546 bytes, 2 tape blocks
x include/Makefile, 2959 bytes, 6 tape blocks
178.2 real 7.7 user 170.5 sys
# mt rew
# mt fsf 9
# time tar xvb 20
x Makefile, 3536 bytes, 7 tape blocks
x asm.sed, 53 bytes, 1 tape blocks
x asm.sed.pdp, 53 bytes, 1 tape blocks
(snip)
x usr.sbin/ntp/patchl, 5658 bytes, 12 tape blocks
x usr.sbin/ntp/read_local.c, 655 bytes, 2 tape blocks
x usr.sbin/Makefile, 777 bytes, 2 tape blocks
1373.0 real 56.8 user 1316.1 sys
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
root 3022 2706 316 90% /
/dev/rp0h 39373 33417 5956 85% /usr
/dev/rp1h 39373 37281 2092 95% /usr/src
/dev/rp2a 5117 4126 991 81% /usr/src/ucb
/dev/rp2c 31695 5180 26515 16% /usr/src/sys
# TERM=vt100
# stty rows 56 cols 80 9600 crt
# mount /dev/rp0h /usr
# vi /etc/fstab
fstabを編集する(下記参照)
# umount /usr
# mount -a
# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/rk0h 3022 2706 316 90% /
/dev/rp0h 39373 33417 5956 85% /usr
/dev/rp1h 39373 37281 2092 95% /usr/src
/dev/rp2a 5117 4126 991 81% /usr/src/ucb
/dev/rp2c 31695 5180 26515 16% /usr/src/sys
# cat /etc/fstab
/dev/rk0h / ufs rw 1 1
/dev/rk1h none swap sw 0 0
/dev/rp0h /usr ufs rw 2 1
/dev/rp1h /usr/src ufs rw 3 1
/dev/rp2a /usr/src/ucb ufs rw 4 1
/dev/rp2c /usr/src/sys ufs rw 4 1
# umount -a
# time fsck -y
** /dev/rk0h
File System: /
** Last Mounted on /
** Root file system
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Free List
590 files, 2706 used, 316 free
** /dev/rrp0h
File System: /usr
** Last Mounted on /usr
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Free List
4145 files, 33417 used, 5956 free
** /dev/rrp1h
File System: /usr/src
** Last Mounted on /usr/src
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Free List
6787 files, 37281 used, 2092 free
** /dev/rrp2a
File System: /usr/src/uc
** Last Mounted on /usr/src/uc
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Free List
584 files, 4126 used, 991 free
** /dev/rrp2c
File System: /usr/src/sy
** Last Mounted on /usr/src/sy
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
** Phase 5 - Check Free List
931 files, 5180 used, 26515 free
156.2 real 53.1 user 103.0 sys
# halt
syncing disks... done
halting
000014
@3773010g
73Boot from rk(0,0,0) at 0177404
:
: rk(0,0,0)unix ### ここはRETでもOK
Boot: bootdev=03000 bootcsr=0177404
2.11 BSD UNIX #32: Fri Mar 13 00:15:09 PST 2026
root@:/usr/src/sys/SMALL
phys mem = 655360
avail mem = 414912
user mem = 307200
March 13 01:46:38 init: configure system
hk ? csr 177440 vector 210 skipped: No autoconfig routines.
ht ? csr 172440 vector 224 skipped: No autoconfig routines.
ra ? csr 172150 vector 154 skipped: No autoconfig routines.
rl ? csr 174400 vector 160 skipped: No autoconfig routines.
tm 0 csr 172520 vector 224 attached
tms ? csr 174500 vector 260 skipped: No autoconfig routines.
ts ? csr 172520 vector 224 skipped: No autoconfig routines.
xp ? csr 176700 vector 254 skipped: No autoconfig routines.
erase, kill ^U, intr ^C
# ^DFast boot ... skipping disk checks
checking quotas: done.
Assuming non-networking system ...
checking for core dump...
preserving editor files
clearing /tmp
standard daemons: update cron accounting.
starting lpd
starting local daemons: sendmail.
Fri Mar 13 01:47:26 PST 2026
2.11 BSD UNIX (curly.2bsd.com) (console)
login: root
erase, kill ^U, intr ^C
# cd /usr/games
# ls
adventure btlgammon hack number snake worm
arithmetic canfield hangman phantasia snscore worms
backgammon cfscores hunt ppt teachgammon wump
banner chess lib primes trek zork
battlestar cribbage mille quiz ttt
bcd factor monop rain wargames
bj fish moo robots warp
boggle fortune morse sail words
# ./zork
> Saves game on file dsave.dat
< Restores game from file dsave.dat
!command Execute shell command from Dungeon
Welcome to Dungeon. This version created 10-SEP-78.
You are in an open field west of a big white house with a boarded
front door.
There is a small mailbox here.
>look
You are in an open field west of a big white house with a boarded
front door.
There is a small mailbox here.
>open mailbox
Opening the mailbox reveals:
A leaflet.
>get leaflet
Taken.
>read it
Welcome to Dungeon!
Dungeon is a game of adventure, danger, and low cunning. In it
you will explore some of the most amazing territory ever seen by mortal
man. Hardened adventurers have run screaming from the terrors contained
within.
In Dungeon, the intrepid explorer delves into the forgotten secrets
of a lost labyrinth deep in the bowels of the earth, searching for
vast treasures long hidden from prying eyes, treasures guarded by
fearsome monsters and diabolical traps!
No DECsystem should be without one!
Dungeon was created at the Programming Technology Division of the MIT
Laboratory for Computer Science by Tim Anderson, Marc Blank, Bruce
Daniels, and Dave Lebling. It was inspired by the Adventure game of
Crowther and Woods, and the Dungeons and Dragons game of Gygax
and Arneson. The original version was written in MDL (alias MUDDLE).
The current version was translated from MDL into FORTRAN IV by
a somewhat paranoid DEC engineer who prefers to remain anonymous.
On-line information may be obtained with the commands HELP and INFO.
>quit
Your score would be 0 [total of 560 points], in 7 moves.
This gives you the rank of beginner.
Do you wish to leave the game?
y
# halt
syncing disks... done
halting
000014
@
以上でフルインストールとマルチユーザモードの起動確認の完了です。
設定変更
/etc/rcや/etc/rc.local、/etc/netstartは動作しないデーモンなどをコメントアウトするとよいでしょう。現時点で判明しているのは、lpd, hostid, sendmailです。
諸注意
RAMの拡張に伴い、ディスクのブートローダのアドレスが0773xxxから3773xxxに変更されています。
動作が不安定で再現性のない挙動をします。例えば、カーネルをビルドするためにmakeを実行すると、makeが"Memory
fault - core dumped"になったり、/lib/cppが"Fatal error in
/lib/cpp"になったりします。
こんな状態なので、これはあくまでも「実験」です。
(4月17日追記) FPGAの実装の修正(CPUが駆動するABORT信号の対応)とカーネルのバグ修正(追加パッチ)により不安定な動作は解消されました。カーネルのビルドを10時間以上繰り返しても問題ない程度に安定して動作しています。