2024年4月20日土曜日

コンパイラ作成の試み その4 言語の拡張(FOR文の完成そして6809用へ)

 マイクロCコンパイラmccにようやくFOR文を拡張することができました。

2023年7月4日のブログ「コンパイラ作成の試み その2 言語の拡張(コメントとFOR文など)」(https://flexonsbd.blogspot.com/2023/07/for.html)の続きです。


ブログ用画像の表示のために置いてあります


その際には、繰り返し変数が初期値の次の値から始まってしまうという不具合があり、スタックを使用している言語のため、初期値、終了条件、増分を順に読んでいくしかないので、それが解消できないようだと書きました。

そのため、このマイクロCコンパイラを6809用に改造しようという意欲が失せてしまい、そのまま放置してあったのですが、GAMEインタプリタ・コンパイラの移植、TL/1コンパイラの移植が完了しましたので、これについても何とかしたいと考えていました。そんな時に手持ちの書籍(末尾の参考文献)を読んでいましたら、FORステートメントの実装の説明として、下図のFOR生成2のようなコード生成方式の方が実装が簡潔化できるとありました。


2つのFOR生成方式

なるほどと思い、この形で実装できないかと試みてみました。具体的には、必要な個所にラベルを設定し、そのラベルへのジャンプ命令を追加することで、処理の順序を変えることができました。

そのプログラムを示します。

    

このようなサンプルプログラムも正常に動作しました。

    


6809用コンパイラへ...とりあえずデータ幅8ビットで...

これで必要な(と思われる)拡張が済みましたので、次はいよいよ6809用コンパイラへの移植ですが、このコンパイラはデータ幅が16ビット、レジスタも16ビットを想定していますので、そのままでは6809への適用はかなり難しそうです。

しかし、TL/1コンパイラのようなデータ幅が8ビットのコンパイラもありますので、まず第一段階としてデータ幅やレジスタが8ビットでも動作しないだろうかと考えました。

それを確認するために、コンパイラが生成した仮想CPU用のアセンブルリストを手作業で6809のアセンブルリストに書き換えて走らせてみました。いくつかの注意点がありましたが、ほぼ機械的に書き換えることができました。使用したのは上記のサンプルプログラムからfor文を取り除いて短くしたものです。コンパイラが生成したアセンブルリスト(.CS)と手動で書き換えた6809用のリスト(.TXT)を示します。

仮想CPU用のアセンブルリストです。

    

手作業で書き換えた6809用アセンブルリストです。仮想レジスタR0、R1には2バイトずつ割り当ててありますが、当然1バイトずつしか使用されていません。
(機械的に置き換えただけで最適化を行っていないために、冗長な部分がかなり多いです。)

    

プログラム中に i * 2 という乗算がありますが、その結果が2バイトを超えていないので正常に動作しました。

このことから、もちろん制約はありますがデータ幅、レジスタ長が8ビットでも動作するようだという見込みが立ちましたので、まず第一段階の目標として、8ビット長の6809用コンパイラを目指すことにします。
時間がかかるとは思いますが、じっくりと取り組んでみたいと思います。


参考文献
・作りながら学ぶコンパイラ/インタプリタ 滝口政光著(CQ出版社)

2024年4月14日日曜日

6800用TL/1コンパイラの6809マイコンへの移植がようやく完了

 

 6800用のTL/1コンパイラの自作6809ボードへの移植がようやく完了しました


時代錯誤ではありますが、折を見ながら昔のマイコン時代に使用していた6800用TL/1言語を6809に移植する試みを続けていまして、今までに1回報告しています。

・2021年5月9日のブログ「6809ボードマイコンにTL/1コンパイラを移植する」
https://flexonsbd.blogspot.com/2021/05/6809tl1.html

その報告ではバグの原因であるインデックス命令をアキュムレータオフセット命令で置き替えることでバグを解消できたと書きました。

その記述がこれです。
===== ここから =====

バグの原因は、STA n,Xというインデックス命令でした。6800ではnは8ビット範囲であるのに対して、6809ではnが0~7Fの範囲では5ビット命令となるのです。TL/1ではSTA n,Xのnを動作中に書き換えるというコードを多用していますが、例えばnを0から1ずつ増やしていくと15までは正値ですが、その次は負値の-16になってしまうのです。

6809ではアキュムレータオフセット命令がありますので、

  6800での命令        →  6809での命令

  (2命令で計5バイト)       (1命令で2バイト)

  STB xxxx  (xxxxはnのアドレス)   STA B,X

  STA n,X

という計5バイトの命令を2バイト命令に置き換えることができ、これでバグを解消できました。

===== ここまで =====

しかしもちろん、上記のようなAccBの値を使うインデックス命令の他にも通常のインデックス命令も多用されており、それらを単純にSTA n,X (A7 n) やLDA n,X (A6 n)などで置き換えてもnの値が15を超えると異常動作をすることになってしまいます。
ということで、これらの命令をA7 88 nやA6 88 nという8ビットオフセット命令に置き換えなければなりません。
ソースを検索すると$A7は直値で書かれている箇所が見つかりますが、$A6は見つかりません。にもかかわらず生成コード中にはA6 nという命令が作られているのです。
この原因を掴むのに数週間を要しましたが(他の方の作られたアセンブラソースはなかなか理解できない...)ようやく、AccAに直値で$86を入れておいてそれに$20を加えて$A6にしている箇所を見つけ、それをA6 88 nに書き換えることでバグを解消することができました。
他にもCMP, ADD, SUBなどのインデックスモード命令も直値として記述されていないので該当箇所を見つけるためにソースプログラムを何度も読むことになりましたが、最後まで見つけにくかったのがインデックスモード命令ではないABA($1B)命令でこれもPSHS B($34 $04); ADDA ,S+($AB $E0)の4バイト命令に書き換える必要がありました。
前回の報告ではASSIST09のステップ動作を利用して不具合の原因を掴むことができましたが、上記のようなバグの原因はこれでは掴めず、コンパイル結果を書き出して逆アセンブルし、そのリストを正常に動作することが分かっている6800用TL/1の結果と比較するという手間のかかる手順を何度も何度も繰り返すことで、何とかバグを解消することができました。

これらによるバグは雑誌に掲載されていたサンプルプログラムの8QUEENやMIYAMAでは現れることはなく、移植が完了したと思い込んで、試しに作成しようとしたメモリダンププログラム(MDUMP)で現れました。MDUMPでは通常の変数の他に複数の配列を使用しましたが、その配列の要素を一つ目の変数の先頭に置かれたポインタ(グローバルポインタGBやローカルポインタLB)からのオフセットで指示しますので、変数や配列の数が多くなって15までのオフセットで収まらなくなってバグが現れたというわけです。


使用した6802/6809デュアルボード
(ブログの画像表示のために入れてあります)


MDUMPも正常に動作しましたし、現在のところ不具合は見つかっていませんので移植は完了したものと考えています。
そもそも移植の目的が6800用TL/1のソースの最小限の変更で6809用のソースを得ることでしたが、単なる6800命令の6809命令への置き換えだけでは済まなかったために、結構変更箇所が多くなってしまいました。最小限の変更ということで高速化や機能拡張などとは全く無縁ですし、また、メモリ配置もほとんど変更していません。
(オリジナルの6800用TL/1のソースも同梱しておきますので、比較していただけると変更箇所が分かります。)

メモリ配置を示します。

メモリ配置図


左図のように、オリジナルの6800用TL/1ではコンパイラ本体を$1000からに置き、ソースプログラムを$3000からに入れてコンパイルし、その結果を$216Bからに生成するようになっていますので、公開する6809TL/1でもほとんど同じ配置にしてありますが、これらはもちろん変更可能で、その場合はソースの先頭のアドレス設定(RUNBEG、SRCB、START)で変更します。変更した例が右図です。なお、いずれの場合もGAMEインタプリタはTL/1の動作には無関係ですので、ソースをGAMEで作成する場合以外は不要です。

私の場合のプログラム作成・コンパイル・実行手順を次に示します。


プログラム作成・コンパイル・実行手順


慣れてしまえばGAMEインタプリタの行編集機能で修正するよりも楽ですし、Windows上にソースが必ず保存されることになるので、TL/1を使用する場合にはGAMEを使うことはありません。

参考までに、私が作成しましたメモリダンププログラム(MDUMP.TL1)を示します。


見ていただくとお分かりのように、複数の配列に加えて手続き(PROCEDURE)や関数(FUNCTION)も使用しており、当然ですが正常に使用できています。

この2か月ほどの間、GAMEインタプリタ・コンパイラの移植とTL/1コンパイラの移植にほとんどかかりきりになってしまいました。他の方から見ると、今時何を無意味なことに時間をかけているのかと不思議に思われることでしょうが、目的は6809用のコンパイラを自作することで、そのための実装に関する知識を得ることでした。今回の経験をぜひコンパイラ作成に生かしたいと考えているのですが。。。

作成したTL/1コンパイラのソースやサンプルプログラム(8QUEEN、MIYAMA、MDUMP)、使用したツール類(CvtTxtTl1Src.exe、CvtMotHexBin.exe)などをOneDriveに上げておきます。なお、私は自作モニタで使用していますが、ASSIST09上で動作させる場合の変更点も記してあります。

2024年3月25日月曜日

FM-7/77用の自作基板(RS232Cカード、FT245通信カード、1024KB拡張RAMカード)のプチ改良

 FM-7/77用の自作基板3枚を少しですが改良しました

改良版を製作したのは次の3カードです。

1.RS232Cカード

 D-Sub9ピンコネクタに加えてTTL-USB変換ケーブル用コネクタを増設

2.768KB拡張RAMカード(1024KB拡張RAMカード改め)

 512KBのSRAMを2個搭載で1024KBですが、最上位の256KBを切り離して768KBにするジャンパスイッチを増設

3.FT245高速通信カード

 制御・データアドレスとして使用しているアドレス$FDFD,FEを$FD06,07に変更


1.RS232Cカード

2019年10月26日のブログ「FM-7/77用RS-232Cカードの改良版」https://flexonsbd.blogspot.com/2019/10/fm-777rs-232c.html

などで紹介したものです。D-Sub9ピンコネクタが使用されているのですが、現在では、Windows機と接続するケーブルとしてはシリアル-USB変換ケーブルではなくTTL-USB変換ケーブルを使用する方が便利ですので、それ用の6ピンコネクタを増設しました。これに伴ってシリアル変換ICも実装不要になりました。

右上の6ピンソケットが増設したコネクタです。


RS232C_R1.2



右上が増設したコネクタ


回路的にはただ単に8251からコネクタへ信号線を引き出しただけです。


RS232C回路図


使用したケーブルは以下のようなものです。ピン配置は1番ピンから順にGND, RTS, VCC, RXD, TXD, CTSになっていますが、VCCは接続しないのでピンを抜いてあります。


使用したTTL-USB変換ケーブル



2.768KB拡張RAMカード

2023年7月16日のブログ「FM77AV40用1024KB増設RAMカードの製作」https://flexonsbd.blogspot.com/2023/07/fm77av401024kbram.html

で紹介したものです。対象のFM77AV40では増設できるメモリの最大値は768KBなので最上位の256KBは使用されません。無視されるだけで問題は無いとは思いますが、何となく気持ち的にすっきりしないので、回路的に最上位の256KBを無効にできるように切り替えスイッチを増設しました。


512KB拡張RAM

ちなみにこの48ピンコネクタは、知人が32ピンのコネクタ2個からニコイチで作成されたものをいただいて使用していますが、全く不都合はなく使用できています。


768KB拡張RAM回路図


3.FT245高速通信カード

2023年10月23日のブログ「FT245通信カードの新基板の製作」https://flexonsbd.blogspot.com/2023/10/ft245.html

などで紹介したものです。オリジナルでは制御・データアドレスとして$FDFD,FEを使用しているのですが、このアドレスを他のカードが使用している可能性があるので$FD06,07に変更したものを作成しました。このアドレスはRS232Cカードが使用しているものなので、他のカードとバッティングすることはないと考えました。また、FT245カードとRS232Cカードは使用目的が同じなので同時使用することはないだろうと判断しました。


FT245_R3

74LS04を1個増設しただけでアドレスを変更できました。


FT245_R3回路図

以上、自作のカードを少しでも使い易くするためにちょっとした改良を行ったという紹介でした。


2024年3月24日日曜日

6800用GAMEインタプリタとコンパイラの6809への移植がようやく完成

 6800用のGAMEインタプリタとコンパイラの6809への移植がようやく完成しました

時代錯誤ではありますが、折を見ながら昔のマイコン時代に使用していたGAME言語を6809に移植する試みを続けていまして、今までに2回報告しています。

・2021年5月19日のブログ「6800用のGAMEインタプリタとコンパイラを6809に移植」https://www.blogger.com/blog/post/edit/1662007451717538019/285975797531168690

・2019年5月8日のブログ「6802基板でGAME68コンパイラを走らせる」https://www.blogger.com/blog/post/edit/1662007451717538019/2314144451913456377

できる限りオリジナルから改変せずに自作の6802/6809両用カードにインタプリタとコンパイラを移植することを目指したので、既に他の方々が実践されているような高速化・高機能化とは無縁ですが、移植過程の経験とソースを得られることが目標でした。

上記2回の報告では、とりあえず動作したというレベルでしたので、何とか完成させたいと折を見ながら取り組んできましたが、ようやく完成と言ってもよいものができあがりましたので紹介するとともに作成したファイルを公開します。


作成に使用した自作マイコンですが、以前のブログで紹介したものと同じ6802/6809両用カードを使用しています。(見出しに画像を表示させるために以前と同じ画像を張り付けてあります。)


6802/6809両用カード


1.GAME3インタプリタ

まずインタプリタですが、ASCII誌に連載されたオリジナルのGAME3に作者の大西氏が行編集機能を追加されたものを使用しています。

オリジナルのソースに追加する必要があるのはI/O関係の1文字入力、1文字出力、ブレーク判定ルーチンのみで、変更点はRUB,DELコード、RAM末アドレスなどですが、これらについてはソースプログラムを添付しますのでそれを見ていただければ分かると思います。


2.GAME3コンパイラ

前回のブログで紹介しましたが、ASCII誌に掲載された松島義明さんのH68/TR・TV用の「GAME68コンパイラ」を移植しました。(松島さんには申し訳ないのですが、名称をGAME3コンパイラに変更させていただきました。)

これはGAME3自身で記述されており、6809に移植しやすいということで使用しました。

基本的にはオリジナルのままで動作しますが、インタプリタ中のルーチンを使用していますので、上記のインタプリタとセットで使用します。

変更点は220行のモニタへのアドレス$F0B1と、オリジナルのままではコンパイル結果のバイナリを実行後に暴走しますので、80行の末尾にA:0)=$39を追加した2点のみです。


3.GAME9インタプリタ

6800用GAME3インタプリタを元にして、6809用GAME9インタプリタを作成するわけですが、以前のブログで報告しましたように、基本的にはソースプログラムが公開されていますのでその6800の命令を6809の命令に置き換えるだけです。

置き換えに当たってはスタックポインタをインデックスポインタとして使用している箇所や比較命令CPXを1バイトスキップに利用している箇所に注意するだけで良いはずなのですが、何と終了判定にプログラムコード中の$00を利用している箇所があり、6800と6809では命令の長さが異なるために判定位置がずれてしまうことに気づかず、最後まで悩まされました。

以上に注意しながらインタプリタのソースを書き換えた結果、正常に動作させることができました。出来上がったものは基本的にただ6800の命令を6809の命令に置き換えただけですので、他の方々が移植されたものとは速度や機能の面で劣りますが、とにかく正常に動作するソースが作成できたということで良しとします。


4.GAME9コンパイラ

続いて「GAME68コンパイラ」の移植に取り組みましたが、これも以前のブログで報告しましたが、まずランタイムルーチンのバイナリを逆アセンブルしてソースを起こし、それを6809の命令に書き換えました。

続いてコンパイラの移植ですが、まず、GAME自身で記述されているコンパイラのリスト中の、インタプリタ中のルーチンを呼んでいるアドレスを書き換え、次に、6800の命令コードを発行している箇所を見つけて6809の命令に置き換えました。 同じバイト数で置き換えられるものは単純に置き換えられるのですが、バイト数が変わる場合はそれに応じて、その周辺を書き換える必要がありました。

最後に、多少なりとも6809らしいコードを出力して欲しいということで、AccAとAccBの両方を使用している箇所をAccDに置き換える等を試みましたが、全てを置き換えることはできませんでした。

結果として作成したコンパイラですが、いくつかのサンプルプログラムを実行して正常にコンパイルできていることを確認し、最後にコンパイラ自身をコンパイルしてみました。

その結果、得られたバイナリが正常に動作しましたし、さらにそのバイナリでもう一度コンパイルしてみたところ、そのバイナリも正常に動作しました。

ただし、GAME9コンパイラ自身をコンパイルする過程では、最終行までコンパイルした後にハングアップしてしまいましたが、調べてみるとインタプリタに戻るアドレスが書き込まれていませんでしたので、手作業で該当の2個所に$0103を書き込むことで正常に動作するオブジェクトが得られました。

(この現象はGAME3でも同様でしたので、元のGAME68コンパイラに原因があるのではないかと思っていますが、コンパイルせずにそのまま使用した場合には正常に動作するので、原因については良く分かりません。)


以上により得られたファイルは次のようです。

[1]GAME3

・GAME3EX インタプリタ

・GAME3C  コンパイラ(GAME言語で書かれたもの)

・GAME3CC コンパイラオブジェクト(GAME3Cを自身でコンパイルしたもの)

・RELSUB3  コンパイラ用ランタイムルーチン($2000-212Aだが移動可能)

コンパイル結果のオブジェクトの実行開始アドレスはランタイムルーチンの先頭アドレス+$012Bです。


[2]GAME9

・GAME9EX インタプリタ

・GAME9C  コンパイラ(GAME言語で書かれたもの)

・GAME9CC コンパイラオブジェクト(GAME9Cを自身でコンパイルしたもの)

・RELSUB9 コンパイラ用ランタイムルーチン($2000-2106だが移動可能)

ランタイムルーチンがGAME3用よりも小さいのですが、操作を統一するためにコンパイル結果の実行開始アドレスをGAME3と同じランタイムルーチンの先頭アドレス+$012Bに揃えてあります。


メモリマップです。
もちろんソースプログラムの位置は変更可能です。
コンパイラの方は、ランタイムやコンパイル結果の配置も変更可能です。



メモリマップ

コンパイラの動作速度を知るために、参考までに、インタプリタで300行弱のコンパイラプログラムを実行(コンパイル)した場合と、コンパイル済みのオブジェクトでコンパイルした時の時間を測ってみました。

(1)GAME3

 ・インタプリタでは、パス1終了までに4分30秒、パス2終了までに10分30秒

 ・コンパイラでは、パス1終了までに約11秒、パス2終了までに約29秒

(2)GAME9

 ・インタプリタでは、パス1終了までに4分11秒、パス2終了までに9分27秒

 ・コンパイラでは、パス1終了までに約11秒、パス2終了までに約25秒

という結果でしたので、インタプリタとコンパイラの実行速度比はGAME3でおよそ22倍、GAME9でおよそ23倍となりました。

作成したGAME9インタプリタとコンパイラをGAME3のそれと一緒にOneDriveに上げておきます。(GAME3のコンパイラについては、以前のブログで公開する際に作者の了解を得てあります。)


2024年1月27日土曜日

FT245高速通信カードを用いるファイル転送ソフトのCP/M版とOS-9版をアセンブラで書き直しました

 Cで書いたCP/M版とOS-9版が満足できなかったのでアセンブラで書き直しました

先に作成したC版はサイズが12KB程度と大きく、そのために起動時や動作にやや時間がかかっていました。

その点が不満でしたのでアセンブラで書き直すことにしました。プログラム全体の構造はC版と同じで良いので、Cの命令をひとつひとつアセンブラの命令に置き換えていきました。CP/Mでのアセンブラ開発も初めてでしたので、命令表と首っ引きでしたが勘違いも多く、変なところで手間を食ったりしました。

結果、CP/M版もOS-9版もC版では12KBほどだったサイズが2KB程度と小さくなり、起動はもちろんですが動作も多少ですが速くなりました。


OS-9メニュー画面


CP/Mメニュー画面


メニュー3,4のディレクトリ表示のために、CP/M版ではディレクトリ表示ルーチンを作成してサブルーチンとして組み込みましたが、残念ながらOS-9版では今のところ、コンパクトなディレクトリ表示ルーチンをアセンブラで作成できていませんので、メニュー3,4は動作しません。メニュー3,4が必要な場合はC版を使用することになります。(以前、仮想ドライブ構築ソフトOs9DrvWin.exeをCで作成したときに、ディレクトリ表示部にはかなり複雑な処理が必要でしたので、これをアセンブラで作成できるかどうかは分かりません。)

これでF-BASIC版、FLEX9版、CP/M版、OS-9版の全てがアセンブラで作成できましたので、ファイル転送ソフトslwinftの制作はこれで一区切りをつけようと思います。あとはこれらをツールとしてプログラム開発に生かしていくつもりです。

参考までに、私のプログラム開発の手順を図で示します。


プログラム開発の手順

これで一区切りとしますので、今までに制作したFM側のF-BASIC版、FLEX9版、CP/M版、OS-9版のslwinftとWindows側のslwinft245.exeをOneDriveに上げておきます。ディスクイメージ転送ソフトft245も同梱してあり、簡単な使い方の説明も付けてあります。


2024年1月13日土曜日

FT245高速通信カードを用いるファイル転送ソフトのCP/M版ができました

 これでようやく、F-BASIC版、FLEX9版、OS-9版、CP/M版の4種が揃いました。

最後のCP/M版ができたので、FM-7で動作する全てのDOS(?)用の版(F-BASIC版、FLEX9版、OS-9版、CP/M版)が揃ったことになります。


CP/M版の動作画面です。FM-7上の富士通版CP/M-80上で動作しています。


CP/M版slwinft

しかし残念ながら、メニュー3,4のディレクトリ表示は未実装です。BDS-Cで書いたのですが、標準関数のexec()などではビルトインコマンドのdirは動作しないのです。ということで、dirコマンドに相当するものを作成する必要がありますが、それには時間がかかりそうです。

また、現在のところ、FM77AV2に装着してあるZ80Hカード(IDATEN)上のCP/Mでは何故か正常に動作していません。(ソフトは正常に動作しているように見えるのですが、実際にはファイルが転送されないのです...)AV2でもF-BASIC版など他の版では正常に転送できていますので、ハードには問題はないと思うのですが、原因はまだ分かっていません。


蛇足ですが、純正のCP/M-80カードは大切に保管してあるので、普段は自作のカードを使用しています。


自作CP/M-80カード


完成度については、F-BASIC版>FLEX9版>OS-9版>CP/M版という感じで、特にCP/M版についてはBDS-Cを使うのは初めてということもあり、試行錯誤の連続でした。現在のところ、メニューの3,4は実行できませんし、動作速度もアセンブラで書いたF-BASIC版やFLEX9版より遅いようです。

しかし、今まではディスクイメージ全体を転送するソフトしかなく、2Dディスク一枚の転送に1分ほどの時間がかかっていたので、Windows上のエディタでプログラムソースを作成し、それを各DOSに転送してアセンブルやコンパイルするという手順の繰り返しが面倒でしたが、これらのファイル転送ソフトのおかげで大幅に時間が短縮できるようになりました。これらのソフトの開発中も、Windowsー>FM-7方向の転送部分をまず作成し、それを繰り返し使いながらソフト全体を仕上げていくことができました。(CP/Mに標準添付のエディタEDを流石に使う気にはなれないので、制作途中の手直しは全てWindows上のエディタで行うという開発スタイルです。)

完成度の低いOS-9版とCP/M版についてはこれからも改善していくことになると思いますが、とりあえず一段落したということにして作成した4種の版をまとめてOneDriveに上げておきます。CP/M版以外の版も細かい修正を重ねていますので、ここに上げたものが最新版となります。また、ディスクイメージ転送ソフトも含まれています。


2023年12月15日金曜日

FT245高速通信カードを用いるファイル転送ソフト(FLEX9版とOS-9版改)

 

F-BASIC版、OS-9版に続いてFLEX9版を作成すると共にOS-9版を微修正しました


【2024年1月13日追記】F-BASIC版、OS-9版、FLEX9版、CP/M版の最新版を1月13日のブログ「FT245高速通信カードを用いるファイル転送ソフトのCP/M版ができました」にアップしましたので、このブログのOneDriveを削除しました。

【12月17日追記】OneDriveに上げたファイルの中のOS-9版が古いものでしたので、最新版に差し替えました。

ようやくFLEX9版ができあがり、これでCP/Mを除いて3つの環境でファイルをFMとWindowsPC間でファイルを自由に転送することができるようになりましたので、Windows上の慣れたエディタで作成したプログラムをFMに転送して最後の仕上げ作業をするという一連の流れがよりスムーズに進められるようになりました。(以前はRS232を使用したものを使っていたのですが、転送時間が格段に短くなりました。)

CP/M版の作成は80系の知識がない自分にとっては敷居が高く、時間がかかりそうですので、とりあえず、これまでのまとめとして3種の版をまとめて紹介しておきます。

まずはWindows側のslwinft245.exeです。



slwinft245.exe


F-BASIC版、OS-9版、FLEX9版に共通して使用できます。
COMポートはbaud:115200以上, 8bit, non-parity, 1stop bit に設定します。
また、FT245通信カードのTXE機能はOFFのままで構いません。

FM側のドライブソフトです。


(1)F-BASIC版です


F-BASIC版のSLWINFT


(2)OS-9版です


OS-9版のslwinft


前回のブログのものではディレクトリを表示するメニュー項目がありませんでしたが、追加することができました。また、FM-7用のOS-9LevelIで動作することも確認しました。

(3)FLEX9版です


FLEX9版のSLWINFT


見てわかりますようにメニューはほとんど同じにしてあり、操作性もほとんど同じですが、処理対象のドライブ指定だけは、OS-9やFLEX9ではOSであらかじめ指定できるのに対して、F-BASICではできないのでメニューでドライブ変更できるようにしてあります。ただし、メニューからディレクトリ表示できるのはドライブ0と1だけです。(メニューソフトはF-BASICで書いてありますので、簡単に書き換えることができますが。)

以上の3つのOS(F-BASIC版、OS-9版、FLEX9版)に対応したソフトをOneDriveに上げておきますので、FT245高速通信カード(RAMディスク付きも)をお持ちの方は自由にご使用ください。

12月17日追記】差し替えたのはOS-9版のみで、他は変更していません。

【2024年1月4日追記】最新版をOneDriveに上げました。


2023年12月7日木曜日

FT245高速通信カードを用いるファイル転送ソフト(F-BASIC版とOS-9版)

 FT245高速通信カードを用いるファイル転送ソフトのF-BASIC版とOS-9版を作成しました


【追記】Windows側のslwinft245.exeの機能拡張やOS-9版の修正をしましたので、次のブログ「FT245高速通信カードを用いるファイル転送ソフト(FLEX9版とOS-9版改)」の方にソフトの公開を移動しました。

今までFT245高速通信カードを用いる場合には、2D(2DD)ディスクを丸ごと転送するディスク転送ソフト(FDDIMG_RW77.exeやFT245DRV.exe)を使用していました。

しかし、いくら高速とはいえ2Dディスクで約1分、2DDディスクで約2分かかりますので、ファイルを一つだけコピーしたい場合には時間がかかりすぎです。
特に、Windows上の慣れたエディタで作成したプログラム等をF-BASICやOS-9等に転送して使用するという、私のプログラム開発の手順の中では転送時間が長いのは致命的です。
ということで、ディスク転送ソフトではなくファイル転送ソフトが必要と感じていました。

ディスク転送ソフトの場合にはOSの種類によらず、40(80)トラック、16x2セクタ/トラック
のディスクであればF-BASIC上のドライブソフトで転送できましたが(ただし、FLEX9だけは32セクタ/トラックなので転送できない)、ファイル転送の場合にはOSの機能を用いてファイルを読み書きしますので、当然OSに依存することになります。

ということで、まずは使用頻度の高いF-BASIC版を作成し、続いてOS-9版も作成しました。

Windows側のslwinft245.exeはもちろん、全OS共通です。
起動後にCOMポートとOSの選択をしたのちに使用可能状態になります。



Windows側のslwinft245




FM-7/77側のドライブソフトはOSに依存しますので、それぞれのOS用に作成しました。


【1】F-BASIC用のSLWINFT


まずF-BASIC用のSLWINFTを紹介します。
対象ドライブはデフォルトで1ですが、もちろん変更できます。
TXE機能のON,OFFはFT245通信カードの設定と一致させます。
(TXE機能がないカードの場合はOFFに設定します。)


FM-7/77側のSLWINFTメニュー



使用するソフト
〇FM-7/77側   メニュープログラムSLWINFT(F-BASIC)を実行する。
         起動時に機械語サブプログラムSLWINFToが読み込まれる。
         (SLWINFToは&H6000~&H61E7に配置される)
〇WindowsPC側 SLWINFT245.exeを実行する。

動作環境
〇FM-7     F-BASIC V3.0
〇FM77AV2   F-BASIC V3.0、V3.3
〇FM77AV40SX F-BASIC V3.0、V3.4
以上の環境で動作することを確認してあります。

使い方
◎WindowsPC -> FM-7/77 への転送
  FM-7/77側でメニュー2を選択する。
  Windows側で転送するファイルを選択(ドラッグ&ドロップまたは直接書き込み)して「FMへの書き込み」ボタンを押す。

  FM-7/77側に既に同名のファイルが存在する場合には、重ね書きをするかどうかを選択できます。

  ファイル種別は自動的に判別しますが、通常のバイナリファイルの場合は先頭に5バイトのヘッダー、末尾に5バイトのフッターが必要ですので、そのための情報として保存アドレスと実行アドレスをセットします。(既にヘッダー、フッターがついているファイルの場合はそのまま転送されます。)

◎FM-7/77 -> WindowsPC への転送
  Windows側で読み込んだファイルを保存するファイル名をセットして、「FMから読み込み」ボタンを押す。
  FM-7/77側のファイル名と異なるファイル名でも構いません。
  FM-7/77側でメニュー1を選択し、転送するファイル名を入力してEnterキーを押す。
  存在しないファイル名を入力した場合にはエラーメッセージが出て、再入力を促されます。
  機械語ファイルの場合にはヘッダーとフッターが削除された通常のバイナリファイルとして保存されます。(読み取った保存アドレスと実行アドレスは画面上に表示されます。)

その他
  FM-7/77側ではドライブ番号をメニュー3で変更できます。
  また、メニュー4でTXE機能を使用するかしないかを選択できます。通常は機能OFFで問題はありません。


【2】OS-9用のslwinftos9



OS-9側のslwinftos9のメニュー


使用するソフト
〇FM側      ドライブプログラムslwinftos9を実行する。
〇WindowsPC側 SLWINFT245.exe(F-BASIC版と同じ)を実行する。

 (FM側のslwinftos9をどうやってOS-9に読み込むかですが、OS-9のディスクもF-BASIC
上のディスク転送ソフトft245drvで転送できますので、これを利用してOS-9のディスクに
読み込みます。)

動作環境
〇FM77AV40SX OS-9Level2
 Level1では動作確認をしていません
 【12月15日追記】動作することを確認しました。

使い方
◎WindowsPC -> FM への転送


メニュー2の実行例

  FM側でメニュー2を選択する。
  「Send file from Windows...」が出て受信モードに入る。
  Windows側で転送するファイルを選択(ドラッグ&ドロップまたは直接書き込み)して「FMへの書き込み」ボタンを押す。このファイル名でFMに保存される。

  FM側に既に同名のファイルが存在する場合には上書きされる。

  ファイル種別は自動的に判別するので、実行モジュールファイルとテキストファイルのどちらであっても構わない。

◎FM -> WindowsPC への転送


メニュー1の実行例

  FM側でメニュー1を選択する。  
  Windows側で読み込んだファイルを保存するファイル名をセットして、「FMから読み込み」ボタンを押す。
  FM側のファイル名と異なるファイル名でも構いません。
  FM側でメニュー1を選択し、表示「Input file name:」に続いて転送するファイル名を入力してEnterキーを押す。
  存在しないファイル名を入力した場合にはメニューに戻ってしまうので、最初からやり直す。

その他
  メニュー3でTXE機能を使用するかしないかを選択できます。通常は機能OFFで構いません。

現在のところはF-BASIC版とOS-9版のみですが、順次CP/M版、FLEX9版を作成する予定です。

現在のF-BASIC版とOS-9版をOneDriveに上げておきますので、FT245高速通信カード(RAMディスク付きも)をお持ちの方は自由にご使用ください。
【12月15日追記】ソフトの公開は12月15日のブログに移動しました。



2023年11月17日金曜日

PC-G850V用USB-シリアルケーブルの作成

 以前作成してあったPC-G850V用のUSB-シリアルケーブルを新たに作り直しました

いつも興味深い記事が連載されているskyriverさんのブログ「PICマイコンは面白い」で、以前、PC-G850Vを入手されたという記事を読み、そういえば昔、同僚が面白いと言っていたポケコンだなと思い出し、私も入手してみました。同時に、skyriverさんが作られたUSB-シリアルケーブルを見習って同様なケーブルを作って使用してきました。

それがこれです。


以前作成したケーブル


そのアダプタ部

74HC00をインバータとして使用して、TxD,RxD,RTS,CTSを反転してUSB-TTL変換ケーブルに接続しているだけです。

機能的にはこれで十分でしたので、skyriverさんの実践をそのまま後追いする形で楽しく遊んできましたが、流石にCP/Mを走らせるまではやってみるつもりはありませんでした。


ところが、skyriverさんが開発されたCP/Mも実行できる増設メモリボード(EborsyEEP)を見て、そのコンパクトさと実用性に感心してしまいBOOTHで購入させていただきました。
見つけたコネクタ
さらに純正の電源も入手したので、これで本格的に遊べると思っていたところに、偶然PC-G850のシリアル端子用のコネクタを入手することができました。(右画像)
これでしたら、ピンの両側にガイドが付いているので安定感があります。

ということで、これを使用してUSB-シリアルケーブルを作成しようと考えてネットで参考資料を探していたところ、「ポケコン用USB通信ケーブルを作ろう」というサイトに、変換ケーブルがFTDI社のチップを使用していればFT_PROGというユーティリティを用いてピンの極性を反転させることができると書かれてありました。

私のケーブルは以前紹介しましたように、格安で入手したものですので、FTDI社の純正チップではないだろうと思ったのですが、試してみたところFT_PROGで認識できて、無事に書き換えることができました。

書き換えたケーブルを用いることで、アダプタの機能としては単なるケーブルの6ピンとPC-G850Vの11ピンとの間を接続するだけで良いことになります。

作成したアダプタです。
裏面画像で分かりますように、単なるピン間を接続しているだけです。


アダプタ表面・裏面


FT_PROGで書き換えたケーブルと組み合わせます。


新USB-シリアルケーブル


最後に動作画面を載せておきます。
右端のシステムバスに装着してあるのが増設メモリボード(EborsyEEP)です。
CP/Mをセット済みですので、増設メモリを装着して電源を入れれば、モニタに移ってG100でCP/Mが起動します。

動作画面

最後に
貴重な情報や資料を公開してくださったskyriverさん他の方々に感謝いたします。



2023年10月23日月曜日

FT245通信カードの新基板の製作

 FT245通信カードの新基板を製作しました

【2024年1月24日】末尾にOneDriveを追加して、RAMディスクのない従来のFT245カード用のドライバ一式を上げました。

ブログ「思いつきハードでソフトに七転八倒(https://vehwk3yxv7hw.blog.fc2.com/blog-date-202206.html)」のshujiakitaさんの発案・製作によるFM-7/77用の「FT245使用の高速通信カード」と「RAMディスクカード」について、プリント基板を作成したり、両カードの合体カードを製作したりしながら、その都度それらをブログで紹介してきました。

FT245通信カード用のディスクイメージ転送専用ソフトhttps://flexonsbd.blogspot.com/2023/01/ft245.html

FT245通信カードとRAMディスクカードの合体カードの製作https://flexonsbd.blogspot.com/2022/06/ft245ram.html

FT245高速通信カードの改造の試み
https://flexonsbd.blogspot.com/2022/04/ft245.html

FM-7用の512KB RAMディスクカードの紹介
https://flexonsbd.blogspot.com/2022/02/fm-7512kb-ram.html

高速通信カードFT245の使い方の紹介
https://flexonsbd.blogspot.com/2022/02/ft245.html

FT-245カード用の転送ソフトの使い方
https://flexonsbd.blogspot.com/2021/04/ft-245.html

FT-245カード用の高機能な転送ソフト
https://flexonsbd.blogspot.com/2021/01/ft-245.html

Ndittを使用しないでGOTEK用のHFEファイルを作成する(その3)https://flexonsbd.blogspot.com/2020/12/ndittgotekhfe_11.html


振り返ってみますと、2020年12月11日のブログから始まって、上記のように8回も紹介していますが、それだけ私にとっても非常に有用なツールであり手放せないものになっています。


今回製作したカードの改善点

今回新たに基板を作成することにしました。回路には見直すところはありませんでしたが、念のために電源ラインを強化すること、FT245カードにはコネクタの取り付け穴の追加と、合体基板で採用したTXE#をソフトで読めるようにする切り替えスイッチの追加を行いました。

製作した3種のカードです。


製作したカード3種


(1)上左のカード:オリジナルのカードで秋月電子製のFT245モジュールを使用しています。

(2)上右のカード:オリジナルのFT245モジュールをFT245RLチップに置き換えたものです。マイクロUSBケーブルも使用できるようにマイクロコネクタも装備しています。

(3)下のカード:(2)にRAMディスクカードを合体させたものです。(2)と同様にマイクロコネクタも装備しています。


使用するドライブソフト

使用するドライブソフトは従来のものと変わりませんが、メニューを多少変更しました。

(1)shujiakitaさん作成の高機能ソフト(転送機能のみでなく様々な機能があります)

FM-7側:メニューソフト:FM7FDRAM(従来のFM7FDUIXのメニューを多少変えましたのでFM7FDRAMと改名)、機械語サブプログラム:FDIMGFMX, XRAMDK77

Windows側:FDDIMG_RW77.exe

(2)私作成の単機能ソフト(使いやすさを求めて転送機能に特化)

FM-7側:メニューソフト:FT245DRV、機械語サブプログラムFTDRV11o

Windows側:ft245drv.exe


以上、FT245通信カードを多少手直しして製作したという紹介でした。

ドライブソフト一式をOneDriveに上げておきます。


【2024年1月24日追加】RAMディスクのない従来のFT245カード用のソフト(Windows側:FDDIMG_RW77.exe、FM-7側:FM7FDUI5, FDIMGFM2)をOneDriveに上げました。なお、FM7FDUI5, FDDIMGFM2はFB_TRANS.DATの中にも入れてあります。



2023年10月22日日曜日

FM77AV20/40用のFM77-732互換カードの製作

FM77AV20/40用の拡張ドライブ用のアダプターFM77-732の互換カードを製作しました 

FM77AV20/40には2台の2DDドライブが装備されていますが、時には2Dドライブ(5インチや3.5インチ)を増設したい時があります。

普通のドライブ増設の手段としては現在のドライブが接続されているケーブルにさらにドライブを接続する方法があります。FDC(フロッピィディスクコントローラ)として通常使用されているMB8877AやMB8866はドライブが4台まで接続できるので、この方法で増設できそうなのですが、実際に試みてみるとうまくいきません。2D、2DDドライブのどちらも正常に動作しないのです。

正規の方法としては、拡張ドライブ接続用の専用のアダプターFM77-732を使用することになっていますが、現在入手するのは困難です。

ということで手持ちのFM77AV40SXにドライブを増設することはあきらめていたのですが、最近、知人がSXを入手されたところ、それにFM77-732が取り付けられていました。

これが純正のFM77-732カードです。


オリジナルのFM77-732カード


早速そのFM77-732をお借りして調べてみました。

使用されているICは74HC04(2個), 74HC05, 74LS14, MB463(3個)の計7個のコンパクトなカードでしたが、ネット検索してもMB463の規格が分かりません。

基板のパターンは単純な二層基板なので、目視と導通テスターで調べて回路図を起こしてみました。ここに回路図を載せるのは差し障りがあるかもしれませんので掲載しませんが、基本的には単なるバッファ回路でした。

ただし、HeadLoadとStepPulseという2信号のみはフラットケーブル(つまり内蔵のドライブへの信号)からではなく、別途メインボードの5ピンソケットから取っています。内蔵ドライブへの信号は2DD用ですので、それとは別にメインボード上で2D用の信号を生成しているのだと思われます。

回路図の検討からMB463は通常のバッファICの7438で代用できそうだという見込みが立ちましたので、プリント基板を起こすことにしました。相変わらずドジをしてしまって作り直すことになりましたが、2枚目で無事に動作しました。

使用する部品のほとんどは何とか入手できましたが、5ピンコネクタだけはメインボードのソケットに合致するものが見つかりませんでした。。。

作成したプリント基板です。


作成した基板


製作したFM77-732互換カード


製作した互換カード


このカードをFM77AV20/40の背面の拡張FDDのコネクタ取り付け部に固定し、メインボードのFDDへのケーブルを抜き、そこにフラットケーブルの先端のコネクタを装着し、抜いたケーブルは画像の白の中継コネクタに嵌め込みます。

5芯のケーブルはメインボードのコネクタに装着したいのですが、画像のコネクタでは合いませんので、両端がオス・メスのブレッドボード用のケーブル5本を用いて繋ぎます。

なお、37ピンD-Subコネクタと増設ドライブとの接続ケーブルは信号のピン配列が一致していますので画像のようにフラットケーブルの両端にコネクタを付けたものでOKでした。


FDD接続ケーブル

全体の接続図

FM77-732カードの接続図

接続テストとしては、2Dの3.5インチドライブYD-625を使用しましたが、DISK-BASICの起動時にドライブ数として3以上を設定することで、特に問題もなくドライブ2として読み書きができました。

間に合わせに使用したケーブル
以上、現在では入手が困難なFM77-732カードと同等の機能を持つカードを製作してみたという報告でした。

唯一の問題は5ピンのコネクタが入手できないということですが、画像のようなオス・メスケーブルでとりあえず間に合わせることができました。

回路図を公開できれば自作してみたいという方がおられる(?)かもとは思いますが、このような数十年前のメーカー製品の回路図の公開は許されるのでしょうか。



2023年10月1日日曜日

アップスキャンコンバータの製作(その2)

 以前製作したアップスキャンコンバータのプリント基板を作成して作り直した結果、なんと3台も作ることになってしまいました

以前、2021年6月15日のブログ「アップスキャンコンバータの製作」で紹介しましたアップスキャンコンバータですが、FM-7に接続して2年ほど使用していました。機能面では特に問題はなかったのですが、ベース基板が手配線であることと切り替えボックスへの収め方にとりあえず感があるのが気にかかっていました。

そんな時に、入手しにくい12接点のロータリースイッチがヤフオクに出品されているのを見つけて、もう一台製作して今度はプリント基板を作成し、ちゃんとしたケースに収めようと考えました。

製作したプリント基板が下画像です。(ミスを重ねて3枚目でようやく完成しました。)


作成した基板


以前のものはこのようにとりあえずの手配線でした。


第一作の手配線基板

オリジナルの作者であるNibbles lab. HomePageのOh!石さんが「RGBI対応スキャンコンバータ」で使われたケースはタカチのMX型モバイルケースMX2-8-10というアルミケースのしっかりしたもので、私も真似をして同じMX2-8-10SGを使いました。

なお、元の製作記事は上記サイト中の「研究成果->完了プロジェクト->RGBI対応アップスキャンコンバータ」です。貴重な製作記事を公開していただきありがとうございます。また、FPGAカードはデザインウェーブマガジン2007年7月号の付録基板です。

ケースに収めた状態です。


上蓋と背面パネルを取り外した状態


分解した様子です。


組み立てた状態とケースから取り出した状態


前面・背面パネルです。

前面パネルと背面パネル

前面パネルには8ピンDINの入力端子と切り替えスイッチを、背面パネルにはD-Sub 15ピンのVGAコネクタと5V電源入力を配置しました。


以上の画像からお分かりのように、1台製作するだけのつもりだったのに結果的に2台作ってしまいました。
プリント基板も2回作り直して3作目でようやく完成したのですが、1作目はFPGAカードのコネクタ一位置の実測間違いでカードが取り付けられず、2作目は電源入力の番号付けのミスで5VがそのままFPGAカードにかかってしまうという致命的なミスを犯してしまいました。
3作目でようやく完成した基板ですが、組み立てても動作しませんでした。

その理由ですが、FPGAカードのコンフィグROMに書き込もうとしてもROMやFPGAを認識しないのです。てっきり5V印加のせいでFPGAが破損したものと思い込んで、新たにFPGAカードを入手しました。しかし、やはりこれも認識しないので、困り果ててネット検索したところXilinxの書き込みソフトがそのままではWindows10に対応しておらず、ドライバを前のバージョンのものに差し替える必要があることが分かりました。2年前はWindows7を使用していたので正常に使えていたのでした。

なお、第一作ですがFPGAカードの上に取り付けてあった部品を裏側に回すことで、下画像のように、切り替えスイッチの中に収めることができました。
(とはいっても、タカチのケースに合わせた基板のサイズが長すぎたので、数mmほど削ることになりましたが。)


切り替え機に収めた


以上で、気にかかっていたアップスキャンコンバータの製作ですが、これでようやくけりをつけることができました。(しかし、XRGB-2plusが常時使用と予備機で2台、今回製作した切り替え機中の1台、タカチのケース入りの2台と計5台にも増えてしまいました。どうしよう...)

作成した基板が少しですが余っていますので、ご希望の方がおられましたらメールで連絡を下さい。郵便代のみでお送りいたします。



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の作成手順は以前のブログで紹介しております。