TRON-GCCによるBTRON (3B)プログラムのクロス開発

MCUBEで動作するBTRON (3B)の開発環境として頒布されていた以下のフロッピーの内容を使うことで、ユーザプログラムのコンパイルができ、実際に3Bで動く実行ファイルを作ることができた。

  1. 3B開発用 TRON-GCC DOS/V版 PM090-121-01 (1994年10月) MS-DOS形式 2HD-1.44MB [LHA圧縮]
  2. 3B周辺核 開発環境 PM090-122-01 (1994年10月) MS-DOS形式 2DD-720KB [LHA圧縮]
  3. 3Bアプリケーション 開発環境 PM090-126-01 (1995年3月) MS-DOS形式 2DD-720KB [LHA圧縮]

これらは当時のMS-DOS環境を想定して作られたものだが、最近のPC環境でMS-DOSのプログラムを実行することができるDosboxというプログラムを利用することで開発環境として問題なく動作した。

動作を確認した環境

ソフトウェア

ハードウェア

セットアップ

フロッピーから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のプログラムを書くには以下の注意が必要:

この辺の工夫を、有名な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 1emov #0, r14.w
2a f7 00 00 0f 3ebsr 0x0f3e
c6 10mov #0, r8.w
3f d5trapa 0xf

この直後には定数の文字列がバラっと置かれていた。 このへんのは.data(新しい環境なら.rodata)とかに置かれそうなものだが、実際GCCの出すアセンブリで見ても.textに置いてあるみたいだ。

トロンチップの命令セットについては旧坂村研のサイトのアーカイブ [archive.org]が、図表の欠けが少なく一番参考になりそう。

むすび

3Bでのプログラム開発は、libcの機能やFPUの面など概ね組み込み系で一般的な留意点はあるものの、当時の開発ツールをそのまま用いれば困ることなく実施できそうであることが確認できた。