MCUBEで動作するBTRON (3B)の開発環境として頒布されていた以下のフロッピーの内容を使うことで、ユーザプログラムのコンパイルができ、実際に3Bで動く実行ファイルを作ることができた。
PM090-121-01
(1994年10月)
MS-DOS形式 2HD-1.44MB
[LHA圧縮]PM090-122-01
(1994年10月)
MS-DOS形式 2DD-720KB
[LHA圧縮]これらは当時のMS-DOS環境を想定して作られたものだが、最近のPC環境でMS-DOSのプログラムを実行することができるDosboxというプログラムを利用することで開発環境として問題なく動作した。
zypper
でインストールした]zypper
でインストールした]zypper
でインストールした]フロッピーからTGCCLZH.EXE
, 3BLZH.EXE
, APPL.EXE
を取り出す。
これらはLha自己解凍形式で、LHa for UNIXでlha e TGCCLZH.EXE
などとすることでファイルを取り出すことができる。
取り出したファイルは、dosboxで使うときの利便性を考えて${HOME}/trondev
に配置した。
配置後の構成は:
~/trondev/ ├── 3B │ ├── APPL │ ├── INCLUDE │ ├── LIB │ └── SAMPLE ├── APPL │ ├── DBOX │ ├── INCLUDE │ ├── LIB │ ├── SAMPLE │ ├── SAMPLE0 │ └── SCHED └── TBIN └── INCLUDE
GCCを実行するための環境変数を設定するスクリプトとして~/trondev/DIRENV.BAT
を以下内容で作成した:
set PATH=C:\tbin;%PATH% set GCC_EXEC_PREFIX=C:\TBIN\ set GO32=EMU C:\TBIN\EMU387
満を持してdosbox
を実行する。
開いたMS-DOS風のシェルで以下のように入力し、ディレクトリをマウントして、環境変数をセットして、tron-gccが動作することを確認する:
mount c ~/trondev c: direnv.bat tron-gcc -v
これでgcc version 2.5.7
の表示があればGCCは動作するようになったと確認できる。
このフロッピーに含まれているヘッダの中身とライブラリのシンボルから判断して、3Bのプログラムを書くには以下の注意が必要:
scanf
を使いたければ自分で書く必要がある。double
は使えない。試しに使ってみたらOSを巻き込んで落ちてしまっていた。#ifdef tron
で、トロンチップ固有の部分は#ifdef GMICRO
で区切れば良い。get_tim
のようなマクロを経由して呼ぶのが行儀が良さそう。この辺の工夫を、有名なDhrystoneベンチマークに対して行った際の差分がこちら [gitlab.com]。 プログラムを移植する際の雰囲気はおわかりいただけるのではないだろうか。
コンパイルの際は以下のようなバッチファイルを作るのが便利。
リンカに-lg
を複数回渡しているのは私がボケているからではなくて、実際この順序で書くのが必要そう。
tron-gcc -msoft-float -c -O3 -I\3b\include dhry21a.c tron-gcc -msoft-float -c -O3 -I\3b\include dhry21b.c tron-gcc -msoft-float -c -O3 -I\3b\include timers.c tron-gcc -msoft-float -L\3b\lib -z -o dhry dhry21a.o dhry21b.o timers.o -lmain -lknl -lg -lsys -lg -lm
-msoft-float
は必ず必要で、現状の3BではFPUを使うとシステムを巻き込んで落ちてしまう模様。
コンパイルしたバイナリをMCUBEに転送するために、MCUBEのディップスイッチ1番 (背面の4連DIPSWのなかで、AUIコネクタに一番近いほう)を下側に倒すことでシリアルコンソールを出した状態で起動するように設定する。 この状態で9600 bps/8n1に設定してminicomを接続して、MCUBEの電源を入れると、起動メッセージが流れたあとで「開発用コンソール」と同じプロンプトがシリアルポートで使える。
MCUBE側でrecv
コマンドを実行したあとでminicomでSend files (Ctrl-A S)からxmodemを選択し、上記コンパイルしたバイナリを選択することでMCUBEに実行ファイルが保存される。
転送したファイルはそのまま開発用コンソールから名前を入力することで実行できた。
上記方法でできた実行ファイルの先頭部分を見ると、以下のようになっていた。
00000000 00 00 01 0c 00 00 40 00 00 00 10 00 00 00 1b 50 |......@........P| 00000010 00 00 10 20 00 10 00 20 00 00 00 00 00 00 00 00 |... ... ........| 00000020 c6 1e 2a f7 00 00 0f 3e c6 10 3f d5 44 48 52 59 |..*....>..?.DHRY|
どうやらa.out形式に準ずるものが出てきている。
ヘッダーが0x20バイトあって、そのあとに.text
セクションがべた置きされていて、以下命令でプログラム先頭にジャンプして、帰ってきたらプロセスを終了している模様:
bytes | 手動disas(てきとう) |
---|---|
c6 1e | mov #0, r14.w |
2a f7 00 00 0f 3e | bsr 0x0f3e |
c6 10 | mov #0, r8.w |
3f d5 | trapa 0xf |
この直後には定数の文字列がバラっと置かれていた。
このへんのは.data
(新しい環境なら.rodata
)とかに置かれそうなものだが、実際GCCの出すアセンブリで見ても.text
に置いてあるみたいだ。
トロンチップの命令セットについては旧坂村研のサイトのアーカイブ [archive.org]が、図表の欠けが少なく一番参考になりそう。
3Bでのプログラム開発は、libcの機能やFPUの面など概ね組み込み系で一般的な留意点はあるものの、当時の開発ツールをそのまま用いれば困ることなく実施できそうであることが確認できた。