2023年8月20日日曜日

MC09でASSIST09など用のPL/0の実行ファイルを作成する(補足)

 MC09でASSIST09など用のPL/0の実行ファイルを作成していて気付いたこと

前回のブログで、MC09でコンパイルした実行ファイルをASSIST09などで走らせる方法を紹介しました。

その中で、wnoy さんのサイト「小さな言語」中でPL/0をMC09でコンパイルしてMPB6809のモニター上で走らせておられたので、それを私も走らせてみたと書きましたが、実際には、それはMPB6809のモニターを実装してサイト中のバイナリリストを入力したものを、そのまま走らせたということでした。


前回も掲載した画像ですが


上記サイトにはMC09でコンパイルした結果のアセンブルリストが掲載されていたので、その中のI/O関係を自分の環境に合わせて書き換えてアセンブルすれば実行ファイルが生成されるはずです。

しかし、実はこのようにして生成された実行ファイルは、最初は正常に動作しませんでした。

私が通常使用している6809用のアセンブラはFLEX09上のASMBと自作のWindows上で動作するクロスアセンブラです。加えて、リファレンス用としてアークピットさんのX6809を使用しています。

残念ながらPL/0のアセンブルリストはラベルの長さが6文字を超えているためにASMBではアセンブルできないので、自作のクロスアセンブラでアセンブルしていましたが、結果がwnoyさんのものと異なってしまうのです。これは自作のソフトのバグかと疑って、X6809でアセンブルしてみても結果は自作のものと全く同じでした。


LEAX 2,PC という命令の変換結果がおかしい!

誤変換されてしまう命令を示します。MC09によるコンパイル結果のアセンブルソースでは、文字列の表示に下記のパターンが多用されています。(十数か所あります!)

LEAX 2,PC

BRA ZZZZ <- 表示ルーチンへ

FCB $xx1,$xx2,$xx3,...,$xxn

ZZZZ (表示ルーチン)

これは、LEAX 2,PCで表示すべき文字列の先頭のアドレスをXに入れておいて、BRA命令で表示ルーチンへ飛んでいるわけですが、問題は先頭行の LEAX 2,PC で、これが正しく変換されていないのが正常に動作しない原因でした。

wnoyさんのサイトでは、変換結果は 30 8C 02 であるのに対して、自作のアセンブラやアークピットさんのX6809ではいずれも 30 8D XXXX となりますし、LEAX <2,PC と書き換えてみても X6809では 30 8C XX となるのですが、XXは02にはなりませんでした。

参考までに、X6809でのアセンブル結果を示します。 

 


このLEAX命令の意味としては、LEAX命令の位置のPC値に2を加えた値をXの値とするということですから、EFFEやF2という値は明らかにおかしくて0002や02にならなければなりません。

結局、自作のクロスアセンブラを修正することになった

めったに使うことのない命令でしたので気づくのが遅れましたが、自作のクロスアセンブラを正しく変換できるように修正し、改めてPL/0のアセンブルリストをアセンブルし直した結果、正しく動作する実行ファイルが得られました。ということで、ようやくPL/0をASSIST09や自作モニター上で走らせることができました。(長かった、、、)

ちなみに、この変換結果はアークピットさんのX6809だけでなく、FLEX09上のASMBでも同様で上記と全く同じ結果となります。ということは、これは誤変換ということではなく、このLEAX命令の解釈としては上記の変換結果の方が正しいということを意味するのでしょうか。しかし、実際に実行してみると、30 8C 02 でないと正しく動作しないのですが,,,

(wnoyさんがどのアセンブラを使用されたのかは分かりませんが、アセンブルリストの行末記号が$0Aですので、おそらくLinux上のクロスアセンブラas09を使用されたのだと推測しています。)


2023年8月16日水曜日

FLEX09上のMC09でASSIST09などのモニター下で動作する実行ファイルを作成する

 FLEX09上のMC09を用いてFLEX09がない環境で動作する実行ファイルを作成する

FLEX09には高機能で使いやすいアセンブラASMBがあって便利に使っています。さらに有名な整数型CコンパイラMC09もあります。

ASMBで作成した実行ファイルはもちろんFLEX09のない環境に移行して動作させることができるので、しばしばそのような使い方をしているのですが、MC09については、生成された実行ファイルがFLEX09と密接に関連していて、他の環境で動作させることはできないと思い込んでいました。

しかし以前、「小さな言語」というwnoy さんのサイトがありまして、そこではMPB6809というボードマイコンとそれ用のモニタープログラムが公開されていました。

(現在このサイトは存在しませんが、その内容を保存された方が紹介されています。「MPB6809」で検索するとヒットします。)

このサイトでは他にもForthの移植やTinyBasicの解析などもされているのですが、何とPL/0をMC09でコンパイルして移植しておられるのです。

私もこのモニタープログラムを入力してROMに焼き、自作の6809マイコンでPL/0を走らせてみました。PL/0は実用を目指したコンパイラではないので、特に使い続けるつもりはありませんでしたが、MC09でコンパイルした実行ファイルをMPB6809というマイコンに移植したという点に興味を持ちました。

FLEX09に依存しているファイルI/Oを使わないプログラムならFLEX09がなくても動作するのは当然ではありますが、初めて見る実例でした。このサイトを知ったのは十年以上前なのですが、それ以来、時々ですがMC09でコンパイルした結果のソースリストをいじって自作のマイコンで走らないかと試していました。

PL/0のソースは大幅に書き換えないとそのままではMC09でコンパイルできないので、まだPL/0をコンパイルすることはできていないのですが、他のプログラムについては、最近ようやく何とか動くようになりました。

動作試験に用いたマイコンは下画像のもので、2MHz動作の63B09と68B02を切り替えて使用しています。モニターは6809では自作のものとASSIST09を、6802では自作のものとMIKBUG2をROMに入れてあり、FlexDrvWin.exeという仮想ドライブ構築ソフトを用いることで6809のFLEX09と6800のFLEX2が走っています。


使用したボードマイコン


MC09での実行ファイル作成手順

MC09でコンパイルした結果はC.OUTというアセンブルリストとして出力され、それをMC09に標準で添付されているC.TXTというアセンブルリスト中に読み込んで、全体をアセンブルすることで実行ファイルが生成されます。

MC09 oooo.C --> アセンブルリスト C.OUTが作られる。

ASMB C.TXT oooo.CMD --> C.TXT中にC.OUTが読み込まれ、実行ファイル oooo.CMDが生成される。


C.TXTを書き換えれば良いはず

このC.TXT中にコンソールI/OやファイルI/Oなどが書き込まれているので、コンソールI/Oを自分の環境に合うように書き換え、ファイルI/Oは不要ということで削除すれば良いはずなのですが、エラーの連発でなかなかうまくいかず、試行錯誤の連続でしたが、wnoyさんのPL/0のアセンブルリストを参考にしながら何とか動作するものを作ることができました。

もちろん、FLEX09のファイルI/Oを必要とするプログラムはダメですが、ファイルI/OがないプログラムならMC09で作成して、マイコン等で走らせることができます。サンプルとしてメモリダンププログラム mdump.c を作成してみました。


ASSIST09用と自作モニター用の2種を作成した

作成したのは、私の自作マイコンにインストールしてある自作モニター用のC_SBC.TXTとモトローラ社のモニターASSIST09用のC_ASSIST.TXTの2種です。

これらを標準のC.TXTの代わりに用いることで、自作モニタ―上やASSIST09上で動作する実行ファイルが得られます。

MC09 -O1.C.OUT oooo.C --> アセンブルリスト C.OUTがドライブ1に作成される

ASMB C_SBC oooo.BIN +YLS または ASMB C_ASSIST oooo.BIN +YLS --> 実行ファイル oooo.BIN がドライブ1に作成される

この実行ファイルをFLEX09のディスクから取り出してマイコン側にインストールして、$100から実行します。

(C.TXTにORG $100と書いてあるので、MC09で作成した実行ファイルは$100から実行することになっていますが、実は、アドレス依存のコードではないのでどのアドレスに置いても実行できます。)

作成したC.SBC.TXTとC.ASSIST.TXTを下記に示します。基本的にI/O関係のアドレスが異なるだけですが、ASSIST09のI/OルーチンはSWI命令を使っているのに対して、私の自作モニターは普通にJSR命令を使っているので、コールの仕方もそれぞれに合わせています。


以下にC.ASSIST.TXTとC.SBC.TXTのリストを示します

C_SBC.TXT 

  
 


C_ASSIST.TXT 

  
 


(以下省略)の部分は標準のC.TXTの192行目以降と同じです。


参考までに、サンプルとして作成した mdump.c を示しておきます。このような、ファイルI/OがないプログラムはFLEX09がなくても動作するわけです。

mdump.c 

  
 

出来あがった mdump.bin のサイズは4.2KBほどでした。サイズは大きくなりますが、アセンブラで書くよりも作成時間が短くなるので、サイズがそれほど問題にならない場合にはMC09を使用するメリットはあると思います。


参考までに、私の場合の具体的な実行ファイル作成・実行手順を示します。

1.WindowsPC上のエディタでソースプログラムを作成する。

2.FlexDrvWin.exe中のイメージファイル(.DSKまたは.D77)にソースをドラッグ&ドロップする。

3.MC09でコンパイル、ASMBでアセンブルする。

4.出来あがった実行ファイル(.BIN)をイメージファイルからWindowsPCへ読み出す。

5.バイナリ形式の実行ファイルを自作の変換ソフトCvtMotHexBin.exeを用いてモトローラ形式(.MOT)に変換する。

6.モニターのLoadコマンドでモトローラ形式の実行ファイルを読み込む。

7.モニターのGoコマンドで実行する。


以上ですが、作成・使用したファイル(C_ASSIST.TXT, C_SBC.TXT, 最新版のFlexDrvWin.exe, CvtMotHexBin.exe, サンプルのmdump.c)をOneDriveに上げておきます。なお、FLEX09やMC09の作成手順は以前のブログで紹介しております。