2018年7月24日火曜日

MicroCを使う(その2)・・・MC09を作成して使う

MC09の作成方法をより具体的に

「MicroCを使う(5月4日公開)」ではMC09の作成方法を説明しましたが、それは2014年に当時のUbuntuで作成した記録を元にして書いたものでした。
書いた時には、現在使用しているUbuntu16では作成できないようだとは思っていましたが、本当にできないのかどうかを確認していませんでした。
その後、Ubuntu16や最新の18で試みてみましたが、どうしてもうまくいきませんでした。
ということで、以前のバージョンのUbuntuをインストールして、改めてMC09を作成しました。
インストールしたのは、Ubuntu10で、使用したisoファイルはUbuntu-10.04.4-desktop-i386.isoです。(ドジってしまって、Windows7とUbuntu16のデュアルブートで動作していた環境を壊してしまった...(泣))

Ubuntu10上で、前回の説明のように竹岡さんのサイトからmc09.tgzとas09.tgzをダウンロードし、それぞれを展開します。私は、デスクトップにmc09_as09というフォルダを作り、その中にmc09, as09というフォルダを作ってその中に展開しました。

ファイルを収めたフォルダ




(1)6809用アセンブラas09を作成する

フォルダas09中に展開されたファイルの中にmakefileがありますので、基本的にはその通りにビルドしていけばよいのですが、BSD用のファイルですのでLinuxでは以下の修正が必要です。

as09用makefile(修正後)

・makefileのCFLAGS=の次行にcc=gccを追加する。
・関数名のバッティングを避けるために次の2関数の名称を変更する。
  as68.c中のgetline()を全てgetline2()に変更
  as68.c中のindex()を全てindex2()に変更
修正した後、makeを実行すると実行ファイルas09が作成されます。
(makefile中のlint:...行以降は実行されませんが、結果には影響ありません。)

as09作成後
このas09をフォルダmc09にコピーしておきます。


(2)mc09を作成する

フォルダmc09に移動します。以降はこのフォルダで作業します。
makefileを修正します。
・DESTDIR=の次行に cc=gccを追加する
・mc mc2.cの先頭に ./を追加する ./mc mc2.c
・as09 c.txt -o mc2.o -v -Oの先頭に ./を追加する ./as09 c.txt -o mc2.o -v -O
・関数名のバッティングを避けるために次の2関数の名称を変更する。
  mc.c中の getline()を全て getline2()に変更
  mc.c中の index()を全て index2()に変更


mc09用makefile (修正後)


ここまでの変更で、makefile中のgcc mc.c -o mcでmcが作られる。
このmcはLinux上でのクロスコンパイラとして使用できるものですが、
このままでは、コンパイルはできても出力(C.OUT)が得られません。
さらに次の変更をします。
・mc.c中の printf( を全て fprintf(obuf, に変更する。

以上の変更によって、makefile中の
gcc mc.c -o mc でクロスコンパイラ mcが作られ、そのmcを用いた ./mc mc2.c でmc2.cをコンパイルした結果の c.out(6809のアセンブラ言語)が得られるので、これを./as09 c.txt -o mc2.o -v -O で6809の機械語にアセンブルすることでFlex上での実行ファイルmc2.o(モトローラS形式)が得られる。(c.outは c.txtのアセンブル中に読み込まれて一緒にアセンブルされる。)
(各行ごとの実行でなく、makeを実行した場合は lint:...行以降は実行されませんが、結果には影響ありません。)


4通りのmc2.o作成後


最後に、mc2.oをS形式からバイナリに変換して、Flexに読み込ませて名称をMC09.CMDに変更すれば出来上がりです。私は、以前公開した CvtMotHexBin.exeでバイナリに変更し(StartAdr, ExeAdr共に0x0100に設定)、FlexDrvWin.exeに放り込みました。

蛇足
アセンブラ as09のオプション -vと -Oの効果が良く分からなかったので、オプションなしの場合(mc2.o)、-vのみ付けた場合(mc2v.o)、-Oのみ付けた場合(mc2o.o)、-vと-Oの両方を付けた場合(mc2vo.o)の4通りを作成してみました。
結果:mc2.oとmc2v.oは同じでバイナリで31KB、mc2o.oとmc2vo.oは同じで29KBでした。-Oはサイズの最適化と思われますが、-vは分かりませんでした。

あとは、前回説明しましたように、
C.TXT、そしてライブラリc.txt, stdio.txt, stdio2.txt, alloc.txt, fileio.txt, fileio2.txt. scanf.txt, string.txt、そしてユーティリティuf.cをFlexのドライブにコピーすれば完成です。(ライブラリはドライブ0のシステムディスクに、C.TXTはドライブ1のワークディスクにコピーします。)コンパイルするファイルはC.TXTのあるワークドライブに作成します。この配置で、例えば
MC09 (sp) -O1.C.OUT (sp) file.c (sp)はスペース
で、file.cがコンパイルされてC.OUT(6809のアセンブル言語)が作られるので、Flex上のアセンブラASMB.CMDで
ASMB (sp) C (sp) file.CMD +YLS (CはC.TXTのこと)
でアセンブルされた実行ファイルfile.CMDができあがります。
これは$100からに配置されて$100から実行開始されるファイルです。

MC09を使う際の注意

前回も書きましたが、追加も含めてもう一度書いておきます。
(1)ソースファイル作成では
・必ず stdio.txt, alloc.txt をインクルードする。ファイル名は大文字で。
 #include "STDIO.TXT"
 #include "ALLOC.TXT" (入れないとアセンブル時に initheapエラーが出る)
・TABコード($09)はFlexでは意味が異なるので、スペースに変換しておく。
・行末コードは$0Dのみなので、Windows上でファイルを作成した場合は$0D,$0Aの$0Aを削除してからFlexに転送する。

(2)関数の引数の書き方では
古いコンパイラですので、引数のタイプを次行に書くというKRスタイルです。
 例 main (argc, argv)
       int argc;
       char *argv[];
   {

   }

古いスタイルで書かなければならないことやエラーメッセージが不親切など、使いにくい面も多々ありますが、特にファイルI/Oのあるユーティリティなどを短時間で書きたい時などには便利ではないかと思います。

以上ですが、Linuxのどのディストリビューションのどのバージョンで作成できるかは、私にはとても確認できませんので、私の作成したサイズ31KBのMC09.CMDと29KBのMC09O.CMDの両方と、古いスタイルのCファイルの例として自作コマンドLISTN.CとMOT2CMD.CをMicrosoftのOneDriveに上げておきます。




0 件のコメント:

コメントを投稿