2021年5月19日水曜日

6800用のGAMEインタプリタとコンパイラを6809に移植

 6800用のGAMEインタプリタだけでなく、コンパイラも移植してみました


動機

発注してあるプリント基板が未だに届かないので最近はソフトばかりいじっていますが、前回は6800用のTL1コンパイラを6809に移植することができましたので、その勢いで、今度はGAMEインタプリタとコンパイラの移植に挑戦してみました。

GAMEインタプリタの6809への移植は、既に1981年に藤原誠さんによる「GAME09インタプリタ」や、1984年の萩平哲さんによる「GAME-FMインタプリタ・コンパイラ」があり、いずれも実行速度や機能面で非常に優れたもので、私もインストールして使わせてもらっていました。しかし、いずれもソースは公開されておらずバイナリコードだけです。

移植するコンパイラは

今回移植しようと考えたものは、2019年5月8日のブログ「6802基板でGAME68コンパイラを走らせる」で紹介した「GAME68コンパイラ」で、松島義明さんがGAME自身で記述されたものです。

GAME自身で記述されているということは、コンパイラとしての論理構造は6800でも6809でも変わらず、コード生成の部分だけが異なっているということになります。

そして、生成されるコードは6800のバイナリであるわけですが、前回のTL1でも述べましたように、6809と6800のバイナリにはそれほど大きな違いはないので、異なっているものだけを書き換えるだけで済むのではないかと考えました。(安直ですね。)


コンパイラのランタイムルーチンを見ると


まず最初にランタイムルーチンを調べてみました。

GAMEインタプリタ内のルーチンを利用していることもあって、わずか300バイト足らずの小さなものですが、逆アセンブルしてみたところ、6809と異なっている命令はNOPとLDXのみでしたので、簡単に書き換えることができました。

しかし、インタプリタ内のルーチンを使用しているということは、実行時には6809版のインタプリタが必要ということになりますので、コンパイラより先にインタプリタの移植が必要だということになります...


インタプリタの移植が必要だった

ということで、まずインタプリタの移植に取り組むことになりました。

6800用インタプリタもTL1と同様にアセンブラソースが公開されていますので、TL1の時と同じようにスタック命令に注意しながら書き換えることで、それ程苦労せずに動作させることができました。(私の場合はハードもソフトも速さにはそれ程こだわらず、正常に動作すれば良しというスタンスですので、最適化などはほとんど行っていません。)


インタプリタの移植が済んだので

インタプリタの移植が済んで、コンパイラのランタイムルーチンが呼んでいるルーチンのアドレスが確定しましたので、GAME68自身で記述されているコンパイラの関係するアドレスを書き換えたものを作り、簡単なプログラムで生成されたコードを調べてみました。

すると、Xレジスタ関連の命令とPSH,PUL命令を書き換えただけで動くプログラムもあるではありませんか。

この結果に気を良くして、コンパイラのソースを読んでみた限りでは、コンパイラで生成される命令の中で、6800と6809とでコードが異なるものとしてはLDX, STX, INX, TAB, TBA, PSHA, PSHB, PULA, PULBの9種がありましたが、これらはバイト数が異なるものの、置き換えにはそれ程困難はなさそうです。しかし、それらに加えて一部にLDS, STSというスタック関係の命令も使われているようですので、これらについては注意が必要です。

[5月23日追記]訂正:LDS, STS命令は使われていませんでした。


GAME09コンパイラ(らしきもの)を作ってみた

とりあえず、スタック関係の命令はそのままにしておいて(GAMEのどの命令で使われるのかまだ分からないので...)その他の命令だけを置き換えたものを作成してみました。


動作環境の詳細

使用した6809ボードは前回と同じ6809/6802DualCPUボードです。


6809/6802 Dual CPUボード

メモリマップです。


メモリマップ

ソースプログラムの格納領域は、TL1コンパイラの場合と合わせて $3000 からにしています。

オリジナルのランタイムルーチンは $2100~$22BA ですが、その先頭に生成オブジェクトへのジャンプ命令(3バイト)を追加し、JMP $2100で実行できるようにしています。

それぞれのプログラムの読み込みですが、あらかじめMOT形式に変換しておいて、自作モニタの LコマンドやASSIST09の LOADコマンドでロードしています。

そのMOT形式への変換プログラムですが、前回のTL1コンパイラのソースの場合はエディタで行番号を付けずに作成したものを変換しましたが、GAMEのソースの場合は行番号が付いていますので、それをバイナリに変換して新たに格納アドレスを付加するように機能拡張しました。また、付加する行番号や格納するアドレスを指定できるようにもしました。


CvtTxtTl1Src.exe


コンパイルの実行手順

次のような手順でコンパイルを実行します。

1.モニタでGAME9インタプリタをロードする

       L GAME9EX

        拡張機能付きのGAME9が$0100からにロードされる

2.インタプリタを起動する(コールドスタートで)

        G 100

3.モニタに移動する

        >=$F800

4.ソースプログラムをロードする

        L (source file)

        ソースプログラムが $3000 からにロードされる

5.GAME9コンパイラとランタイムルーチンをロードする

        L GAME9CS

        ランタイムルーチンが$2100からに、コンパイラが $4000 からにロードされる

6.GAME9インタプリタに戻る(ホットスタートで)

        G 103

7.コンパイラをアクティブにする

        =$4000 (先頭アドレスのセット)

        ==          (末尾アドレスをサーチ)

8.コンパイルを実行する

        #=1


実行例

実行した例を示します。オリジナルではワークエリアなどいくつかの問い合わせに答えてからコンパイルが始まりますが、ソースプログラムの格納エリアなどを決め打ちしましたので、#=1ですぐにコンパイルが始まります。

実行例

コンパイルの終了後、GAME上で >=$2100 とすると生成されたオブジェクトが実行されます。


終わりに

まだ全ての6800命令を6809命令に書き換えてはいないのですが、いくつかのプログラムをコンパイルして正常に動作することを確認しました。

以前「GAME68コンパイラ」のブログを書いた際に、コンパイラの作者の松島義明さんから掲載の許可をいただいていますので、今回の6809へ書き換えたものも公開しても良いと思います。

今の時代にGAMEやTL1を使おうという奇特な方がおられるとは思えませんが、もしご希望があるようでしたら、書き換えられずにそのままになっているスタック関係の命令の書き換えが終了しましたら公開する予定です。変換プログラム CvtTxtTl1Src.exe についても同様です。

以上、私の単なる思い付きでやってみたことで、実用性はほとんどありませんが、巷間、6800と6809とはバイナリレベルの互換性が無いので云々という評価がありますが、全く異なっているわけではないので、違っている部分にだけ注意を払えばこんなこともできるというサンプルになれば幸いです。(と言っても、今どき、6800はおろか6809のプログラムですら化石時代の遺物みたいなものでしょうが...)


2021年5月9日日曜日

6809ボードマイコンにTL/1コンパイラを移植する


 今更ですが自作の6809SBCに、いにしえの6800用TL/1コンパイラを移植しました

TL/1コンパイラは1980年に大西博さんが制作された6800用のコンパイラで、その特徴は変数のサイズが1バイト(8ビット!)であることで、サイズも4kB余りとコンパクトなワンパスコンパイラです。大西さんがその前に制作されたGAME言語と同様、ソースが公開されていたので様々なパソコンに移植されました。私もFM-7に移植されたTL1-FM版を入力して使用していましたが、FM77に移行してからは使用することが少なくなりました。

いつかは自分なりの言語を作りたいと思っていて、あれこれ考えているのですが(考えているだけで全然進んでいない...)、1バイト変数なら比較的簡単に作れるのではないかと思い、まず6800用のTL/1を6809に移植することでコンパイラ作成に関する具体的な知識を得ようと思って始めましたが、何と一ヶ月近くもかかってしまいました。

多少なりともどなたかの参考になればと思い、ここに顛末を記しておきます。


移植の手順ですが次のように行いました。

(1)ソースプログラムの6800の命令コードを6809の命令コードに置き換える。

多くの命令は単純に置き換えることができますが、スタックの使い方が6800と6809とでは異なるので注意が必要です。特に、スタックを演算等に使用している部分は新たに書き換える必要があります。また、CPX命令($8C, $9C)を演算ではなく次命令のスキップに使用しているケースもあります。

(2)コンパイラの生成コードを6800用から6809用に置き換える。

6800と6809とではバイナリレベルでの互換性はないと言われているのですが、同じ命令コードのものが結構多くあります。異なっているものでも、LDX($DE→$9E)のようにすぐわかるものは良いのですが、同じような機能であるにもかかわらず、一部異なっているという命令があるので厄介です。(下に記述)


移植した6809ボードです。これは2018年10月15日のブログ「6809/6802両用基板が完成しました」で紹介したボードで、6809と6802をスイッチで切り替えることができます。切り替えた際、メモリはクリアされないので一方のCPUで作成したデータを他方のCPUで利用することができます。また、ACIAを2個搭載しており、一方はコンソール用で他方はデータ入出力用で、どちらも38400Baudで動作しています。



移植した6809/6802 DualBoard


具体的には、次のような手順で進めました。

準備として、オリジナルのTL/1ではGAMEで作成したソースファイルが$3000からにストアされているものとしてコンパイルしますが、毎回GAMEを起動するのは面倒ですし、行番号を付けるのも煩わしいので、Windows上のエディタでソースを作り、それをGAME形式に変換したうえでmot形式に変換するソフトCvtTxtTl1Src.exeを作成しました。機能としては、行番号の付加、その行番号のバイナリ変換、行末コードの$00への変換、ファイル末への$FFの付加、そしてmot形式への変換です。

下図のように、ファイルをドラッグ&ドロップするだけで変換結果が得られます。



CvtTxtTl1Src




作業手順


(1)自作6809SBCに搭載しているモニタのLコマンドでmot形式のソースを$3000からに読み込む。

(2)mot形式に変換した試作コンパイラを$1000からに読み込む。

(3)モニタのGコマンドで$1000から実行し、オブジェクトを生成する。

(4)生成途中でエラーが出たら、コンパイラのソースをチェックして関係ありそうな箇所を修正する。修正後(2)から繰り返す。

(5)無事にオブジェクトが生成されたら、Gコマンドで$2000から実行してみる。エラーが出たり、結果がおかしかったりしたらソースを修正して(2)から繰り返す。

(6)意図した通りの実行結果が得られたら完成。


このような手順で、変数への代入、制御構造の確認、関数や手続きのデータの受け渡しなどを順に確認していきましたが、最後まで手間取ったのは関数や手続きで2個以上のローカル変数があると動作がおかしくなるというバグでした。

使用した6809SBCは6802と6809のDualボードですので、正常に動作することが分かっている6800TL/1でオブジェクトを作成し、それと6809TL/1で作成したものとを比較しながらチェックを繰り返しましたが、例えばオリジナルのTL/1の記事中の8-QUEENのオブジェクトなどは6802と6809とで全く同等のものが作成されるようになったにもかかわらず、6802では正常に動作するのに対して6809ではハングアップしてしまいます。もちろん、ランタイムルーチンが正常に動作していることは確認してあります。

こんな状態が1~2週間ほど続き、いい加減倦んできて諦めようかと思ったりもしましたが、私のSBCには自作のモニタの他に6802にはMIKBUG2、6809にはASSIST09を搭載してありますので、TL/1の入出力をASSIST09に合うように書き換えてASSIST09に移行し、そのトレース命令を用いて、1命令実行するごとにワークエリアとオブジェクトのエリアをダンプしてチェックするという面倒な作業を繰り返すことで、ようやくバグの原因をつかむことができました。

バグの原因は、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バイト命令に置き換えることができ、これでバグを解消できました。

まだ全ての組み込み関数などのチェックを終えているわけではありませんが、現在の所は動作におかしな点は見つかっていません。

それにしても、オブジェクトコードを動作中に書き換えることでコンパクトなコードを生成できているわけですが、一方、この点でROM化できないという批判的評価があったことを思い返すと、6809特有の命令に置き換えることで図らずもこの点が解消されたのは嬉しいことでもあります。さらに、$2000からのランタイムルーチンを含めて、生成コードをポジション独立にすることができればOS-9上で動作させることも夢ではなくなるかもしれません。


この移植作業を通して、制御構造などに対するオブジェクトの生成法の理解が進みました。

しかし、ASSIST09のトレース命令はとても強力なツールですね。できれば私のモニタにも実装したいものです。

最終目標は、6809SBCにOS-9Level1をインプリメントして、その上でTL/1などの言語を走らせることですが、ほんの少しですが先に進めたような気がします。

確か、大西博さんは大学の先生で文系の方だったと思いますが、GAMEやTL/1の発想というか独創性には本当に感心します。


いつも参照している下記の2冊

・MC6809-MC6809E マイクロプロセッサ プログラミング マニュアル(Motorola)

・6809アセンブリプログラミング(末永朝雄著、サイエンス社)

に加えて、この本が大変参考になりました。特にオブジェクトの生成法の解説がTL/1の理解に役立ちました。

・Z80CPU対応 新言語オリジナルコンパイラ作成の技法(大貫広幸著、MIA社)



2021年4月17日土曜日

FT-245カード用の転送ソフトの使い方

 FT-245カード用の転送ソフトの使い方を解説し、最新版を公開します


1月22日のブログで紹介しましたFT-245カード用の転送ソフトですが、その後、開発者の「思い付きハードでソフトに七転八倒」さんがメニューソフトを用意されたり、ドライバーソフトを改良したりされましたので、改めて使い方について解説し、最新のソフトも公開します。

事前準備

まずFM-7/77にFT-245カードをセットしてWindows機とUSBケーブルで接続します。

そして、FM-7/77ではメニューソフトFM7FD-UIを起動します。起動時にドライバーFDIMGFM2も読み込まれます。(ドライバーFDIMGFM2はディスク0から読み込みますので必要ならメニューソフト中の15行 LOADM”FDIMGFM2”を書き換えてください。)

Windows機ではFDDIMG_RW77.exeを起動し、最初に「COMポート」メニューから使用するCOMポート番号を設定します。

これで準備完了です。


構成図


処理開始


FM-7/77でメニューソフトFM7FD-UIを実行すると図のようなメニューが表示されます。


処理内容は次の通りです。

1:FM7のディスクの全セクタをPCに転送してイメージファイルとして保存する。
2:PCに保存されているディスクイメージをFM7のディスクの全セクタに書き込む。
3:FM7上の指定したメモリ範囲をPCに転送してイメージファイルとして保存する。
4:PCに保存されているメモリイメージをFM7に転送してメモリに展開する。
5:FM7のディスクをトラック0にシークする。
6:FM7のディスクの指定したセクタ内容をPCに転送して保存する。
7:メニュープログラムを終了する。

処理1:FM-7のドライブ1にイメージ化するディスクをセットする。
    Windows側でメニュー「FDDデータ」->「データ受信」を選択
    FM-7側で1を実行
 トラック番号がカウントアップせず、(応答なし)と表示される場合がありますが、転送は正常に実行され、1分ほどでFDDIMG_RW77.exeがあるフォルダにDIMG_20201130.datというファイルが作成されます。
これは各セクタの先頭にセクタデータ16バイトがついた形で先頭セクタから最終セクタまで並んだ形のファイルです。(.datファイル)
これを通常の.D88(.D77)形式に変換するには、メニュー「ファイル」->「開く」でこのファイルを選択しておいて、メニュー「D88形式ファイル」->「作成開始」を実行します。
保存ファイル名を設定すればその名称の.D88ファイルが作成されます。同時に.DSKファイルも作成されますが、これは各セクタ先頭のセクタデータが削除されたセクタデータのみが並んだものです。

処理2:FM-7のドライブ1に書き込むディスクをセットする。
    Windows側でメニュー「ファイル」->「開く」で送信する.datファイルを選択する。
    FM-7側で2を実行
    Windows側でメニュー「FDDデータ」->「データ送信」を選択
 トラック番号がカウントアップせず、(応答なし)と表示される場合がありますが、転送は正常に実行され、1分ほどで選択した.datファイルがディスクに書き込まれます。

処理3:Windows側でメニュー「データ転送」->「受信」を選択
    FM-7側で3を実行し、転送するメモリの開始アドレス、終了アドレスを16進数で入力する。
Sirial_FM2PC20210103.datというファイルが作成されます。

処理4:Windows側でメニュー「データ転送」->「送信」を選択
    FM-7側で4を実行し、保存するメモリの開始アドレス、終了アドレスを16進数で入力する。終了アドレスは実際に転送する範囲より大きくても構いません。
    
処理5:FM-7のドライブ1にディスクをセットする。
    FM-7側で5を実行
 通常使用することはありませんが、何かの原因で処理が中断された場合などにドライブのヘッドをトラック0に戻します。

処理6:FM-7のドライブ1にセクタを読み出すディスクをセットする。
    Windows側でメニュー「セクタデータ」->「セクタ受信」を選択
    FM-7側で6を実行し、読み込むセクタのトラック番号、セクタ番号、サイド番号を16進数で入力する。
SIMG_20201206.datというファイルが作成されます。先頭に16バイトのセクタデータがついています。

【注意】・アドレス値などの入力した値の正当性のチェックはしていません。
・何らかの原因で処理途中で中断してしまった場合には、Windows側のDMIMG_RW77.exeを強制終了し、Windowsも一旦サインアウトしたうえで再度サインインしなければならない場合もあります。
・Windows側のコントロールソフトFDIMG_RW77.exeには、メニューを見ると分かりますように他の機能もありますが、ディスクへの書き込みなどの注意が必要な機能もありますので、メニューソフトには入っていません。
必要に応じて、FDIMG_RW77の使い方.txtを参照しながらご使用ください。

紹介したFDIMG_RW77.exe、FDIMGFM2、メニューソフトFM7FDUI2、FDIMG_RW77の使い方.txtをOneDriveに上げておきます。

【追記】
なお、FM-7/77側の機械語プログラムFDIMGFM2を手入力する手間を多少なりとも省くために、開発者の下記のブログでは53バイトのローダープログラムを入力し、それを用いてWindows上のFDIMGFM2をFM-7/77にロードする方法が紹介されています。

2021年3月10日水曜日

ドータボード上の6502でAppleⅡのBASIC Subsetが動作

 ようやくAppleⅡのBASIC Subset を走らせることができました


他の方が努力して実現されたものを後追いしているだけなので、何の意味もないと思いますが、それなりに苦労しましたので、これからやってみようと思う方に多少なりとも参考になればと思いまして、その経過をここに残しておきます。


6502を装着した6802ボード


ハードですが、下のメモリーマップにありますように64KB(32KBx2)のRAMを実装していますが、$F000~の4KBにROMが、さらに$F080からの128byteがI/O領域となっています。


SBC6802のメモリマップ


これは6809ボードを製作した時にRAM領域をできる限り広くしたかったのと、モニタとしてASSIST09を使用するために$F000~をROMにする必要があったためで、その配置をそのまま踏襲しています。


6502については何も知識がありませんので、夢七さんのブログを見ながら、そのまま移植してみることにしました。


(1)Woz MonitorとApple1 BASIC の移植

まず最初に「SBC6800に6502を載せてApple1を体験する」を元にして、Woz MonitorとApple1のBASICを移植してみました。

幸い、Woz Monitorはメイン部が$FF00~に、$F000~$F036にI/Oルーチンが配置されていたので、ACIAのアドレスを変更するだけで済みました。

また、Apple1 BASICについては上位の32KBのRAMをROMに置き換えて、その$E000~に配置しました。


A1BASICとWoz Monitor


ソースのアセンブルですが、オリジナルのソースを夢七さんがArcpitのX6502でアセンブルできるように改変してくださっているので、

>MSDOS X6502 /H A1BASIC-WOZV1.ASM,A1BASIC-WOZV1.HEX,A1BASIC-WOZV1.LST

でアセンブルできました。

動作している様子を示します。


Apple1 BASICの動作画面


(2)AppleⅡ BASIC Subset の移植

続いて「SBC6800に6502を載せてAppleⅡBASIC Subsetを走らせる」を元にして、AppleⅡ BASICの移植に取り掛かりました。

BASICのサイズが大きいので、ブログのように$E000からアセンブルすると$F080からのI/O領域まで入ってきます。そこで、$F080~$F0FFをスキップするようにORG命令を挿入してみたのですが、そうすると$E000~$FFFFにBASICとWoz Monitorが収まりませんでした。

次に、BASICを$D000からに配置するようにアセンブルしてみました。結果、BASICは$D000~$EE46に収まりました。Woz Montitorは先のA1BASICの場合と同じように$F000~にI/O、$FF00~にWoz Monitorを配置しました。

ところが、アセンブルした結果をROMに焼いて走らせてみましたが、正常に動作しません。

何回見直してもソースやアセンブル手順に間違いはありません。6502の知識が全くないのでほとんどお手上げ状態でしたが、ソースをじっくり眺めているうちに、FDB命令がコメントアウトされて、その後ろにbyte命令でバイト列が並んでいるという形があちこちにあるのに気づきました。

試しに、FDB命令を元に戻し、byte命令をコメントアウトしてアセンブルしてみるとbyte命令のバイト列と同じようなコードが生成されましたが、よく見ると2バイトコードの上位下位が入れ替わっています。

つまり、夢七さんが改変されたソースはX6502でアセンブルするために、元のソースで使われている.addrのようなX6502では対応していない命令をFDBに置き換えるという対処をしているのですが、FDBではアドレスの上位下位が自動では入れ替わらないために、アセンブルしたコードのうちのアドレスの上位下位を入れ替える必要がある部分をbyte命令で直接記述していることが分かりました。ということで、このソースは$E000からアセンブルすることを決め打ちしているので、$D000からに変更してアセンブルしても正常に動作しないわけでした。

そこで、まずソースのFDB命令を元に戻して$D000からアセンブルし、得られたコードのアドレス部の上位下位を入れ替えてbyte命令に並べ、FDB命令を再度コメントアウトするという操作を加えることで、X6502でアセンブルできるソースができあがりました。

そのソースを改めてアセンブルし、得られたバイナリをROMに焼いて走らせてみたところ、今度は正常に動作しました。

メモリマップを示します。


AppleⅡBASICとWoz Monitor

動作している様子です。

AppleⅡの動作画面


(3)ASCIIART を走らせてみる

BASICが無事に走ったということで次はASCIIART.BASを走らせてみました。


ASCIIART結果

描画時間は手動計測ですが4分21秒程度でした。なお、システムクロックは2MHzです。

今回は元のソースに見慣れない疑似命令が使われていたために移植に手間取りましたが、それでも夢七さんがX6502でアセンブルできるように改変してくださったために、何とか移植ができました。夢七さんに感謝いたします。

移植に手間取っている間にMouserからW65C02S6とW65C816S6が届きました。このW65C02はもちろん正常に動作しました。W65C816を購入したのは、アキュムレータが1個しかない6502では6800よりもアセンブラでプログラミングしにくいと思うのですが、W65C816なら6800と同じような感じでプログラミングできるかもと思ったからです。

いつかはW65C816のシングルボードを作ろうと思っていますが、いつになりますやら。



2021年2月28日日曜日

6802ボードでドータボードを用いて6502を走らせる

 自作6802ボードでドータボード(ほうめいさんのPLDR6502)を用いて6502を走らせる


先日まごころせいじつ堂のほうめいさんから、電脳伝説さんのSBC6800ボードで6502を走らせるためのドータボードPLDR6502をいただきましたので、私の自作品で今は使用していない6802ボードでも走らせることができないものかと試みてみました。

私の6802ボードは水晶発振回路からの8MHzを6802のEXTAL端子に入力して、出力される2MHzのE信号で周辺回路を制御しているので、8MHzをそのまま入力するわけにはいきませんが、幸い、ACIA63B50に加える614KHzのクロック生成のために8MHzをLS161で13分周していますので、その途中から2MHzを取り出して、それを37ピンのPHI2Iに加えることで2MHzで動作させることができそうです。

ドータボードの修正としては、39ピンPHI2Oと37ピンPHI2Iを入れ替えることと7ピンSYNCをカットしてGNDに落とす(BAを常にLowに)だけで良さそうです。6502にはBA信号がないのでちょっと悩みましたが、常にLowにしておいても特に不都合はないようです。(本当は周辺ICのアクセスに不都合が生じる場合があるそうですが...)

問題はCPUで、eBayで調達したW65C02(5個)とR65C02(2個)のいずれも動作しませんでしたので、仕方なくオレンジピコさんからW65C02S6PTG-14を購入してようやく動作させることができました。動作しなかったW65C02はいずれもほうめいさんのブログで動作しなかったと報告されているものと同じ刻印でした...


ということで、動作している様子です。

残念ながらボード上のLS161から2MHzを引き出している線とBAをGNDに落とす線が見えていて見苦しいです...


自作6802ボード上に装着した


オレンジピコさんから購入したW65C02です。


ドータボードとW65C02



動作確認にはほうめいさんと同じように、ElectreilicさんのUniversal Monitorを使わせていただきました。モニターの開始アドレスとACIAのアドレスを変更するだけで、アセンブルしてROMライターで焼いて動作させることができました。


Universal Monitorが動作



動作しなかったW65C02とR65C02群です...



eBayでは時々こんなことが...


W65C02は全く無反応でしたが、R65C02の方は全くの無反応ではなくて画像のように意味のないデータが定期的に表示されており、一見何かの動作をしているように見えます。



もっと追求すれば何か分かるかも


ここまでくると、次はBASICを走らせてASCIIARTの描画速度を測定してみたいところですが、私の6802ボードはROMが$F000~$FFFFのみ(I/Oは$F080~$F0FF)ですのでBASICをROMに焼き込むことができません。
ですので、起動後にBASICをRAM中にLoadして走らせる必要がありますが、6502の機械語は全くいじったことがないので、Loaderを制作できるのはもう少し後になりそうです。

初めて触れた6502ですが、折角の機会なのでもう少しいじってみようと思いますので、W65C02と使いこなせるかどうかわかりませんがW65C816を追加注文したところです。

私は、今は6809と6802の両用ボードを使用していますので、6802ボードは眠っていたのですが、それを活用することができてありがたいです。
ドータボードPLDR6502を下さったほうめいさんとUniversal Monitorを制作して公開されているElectreilicさんに感謝いたします。ありがとうございました。


2021年2月23日火曜日

FM-7用 60K CP/M-80 の仮想ドライブ版が完成


 FM-7用 CP/M-80 60K版の仮想ドライブ版(FT-245カード使用)です


先日、FM77用のZ80Hカード(韋駄天)を作った際に、それ用の60K版CP/Mを公開されているCP/Mのソースから構築しましたので、その経験を忘れないうちにと、半完成の状態で止まっていたFM-7用のCP/Mを60K版に変更し、さらにWindows上の仮想ドライブもアクセスできる形で仕上げました。

そしてFM-7とWindowsPCとの通信にも、以前使用していたRS-232Cカードではなく「思い付きハードでソフトに七転八倒」さんが製作されたFT-245モジュールを使用した高速通信カードに変更しました。


CP/Mの起動画面です。起動メッセージにあるように、A:とB:が通常のFD、C:とD:がWindows上の仮想ドライブに設定してあります。

起動ドライブA:のディレクトリを表示後、ドライブD:にチェンジし、そこからドライブC:のディレクトリを表示しています。


CP/M起動画面


使用中の様子です。

右端のカードがCP/M-80カード、中央がWindowsとの通信用のFT-245カード、左端がFDCカードで、いずれも以前本ブログで報告した製作品です。

後方に見えているWindows上に仮想ドライブが構築されています。


動作中の様子


FT-245カードのアップです。以前使用していたRS-232Cカードよりも高速になったのが体感できました。

このカードの仕様上、FM-7 -> WindoowsPC は1バイトを1回で転送しますが、WindowsPC -> FM-7 は1バイトを2回に分けて転送しますので、以前紹介しましたCP/M用仮想ドライブ構築ソフト CpmDrvWin.exe にそれに対応するための変更を加えました。


高速FT-245カード


Windows上の仮想ドライブ画面です。

ドライブ2と3上にFDイメージファイル(D88, D77, DSKファイル)をドラッグ&ドロップすると、それぞれCP/MのC:,D:として読み書きできます。同じドライブ中にいくつでもイメージファイルを置いて、切り替えてアクティブなイメージファイルを選択できます。

アクティブなドライブのディレクトリが表示されているボックスにWindows上のファイルをドラッグ&ドロップすることでイメージファイルにファイルを書き込むことができますので、Windows上でソースを作成してイメージファイルに放り込んで、CP/M上でアセンブルやビルドをするという形でプログラム開発ができます。


仮想ドライブの画面



また、その他の機能として、ファイルの読み出し、ファイル名の変更、ファイルの削除、全ファイルの一括読み出しなどの機能もあります。


2020年5月16日の「FM-7用 58K CP/M-80が一応出来上がりました」で紹介した際には、ブロッキング・デブロッキングが実装されていなかったので同一セクタを2度ずつ読んでいました。相変わらずブロッキング・デブロッキングは実装できていませんが、上記画面の右端のボックスを見ていただくと分かりますように、直前に読んだセクタと同じセクタの場合にはディスクを再度読まないように処理を変更しましたので、その分高速になっています。


最後に


自分で作ったハードとソフトでTurboPascalなどの大昔のソフトを走らせてみたいという願いから始めたものですが、それなりに使える形が出来上がったように思いますので、これを区切りにして、あとはCP/M-80上でのソフトを走らせて楽しもうと思います。
(プログラム作りの楽しさを知ったのは、N88-BASICでの6千行近いプログラムの変数管理でどうにもならなくなってしまった挙句、MS-DOS上のTurboPascalを使い始めてその使い易さに感動してからで、その後Cに移行しましたが、今でも気持ちとしてはPascalが好みですので楽しめそうです。)

制作したBIOS09, BIOS80, FM-7用CP/MシステムイメージCPM60KwVFD.D77と元のCPM60KwVFD.DSK, Windows側のCpmDrvWin.exeをOneDriveに上げておきます。
なお、FT-245カード使用のものとRS-232Cカード使用のものとの両方入っていますが、ファイル名の末尾にFTがついているものがFT-245カード用で、RSがついているものがRS-232Cカード用です。
また、formatコマンドがありませんので、フォーマット済みの空のイメージファイルも入れてあります。newdiskがついているものがそれです。
このような報告の場合、ソースがなければあまり役には立たないと思いますので、BIOS09, BIOS80についてはソースも入れておきましたが、CpmDrvWin.exeについては見苦しい個所も多くまだまだ改良の余地もありますので、とりあえず今はソースは公開しないことにします。

BIOS09は私なりに試行錯誤しながら制作しましたが、80系の知識が全くないので、CP/M本体とBIOS80については以前紹介しました中日電工さんのブログがなければ仕上げることはできませんでした。改めて中日電工の菱田さんに感謝いたします。
また、標準のRS-232Cカードよりもはるかに高速なFT-245カードを開発された「思い付きハードでソフトに七転八倒」さんにも改めて感謝いたします。



2021年2月2日火曜日

ドライブナンバー切替用ケーブルの製作

 ケーブルを加工してフロッピィドライブの0と1の切替をスイッチで行えるようにしました


私が使用している3台の8ビットパソコンはドライブ0を全てGOTEKに変更してあり、便利に使用できているのですが、時にはフロッピィから起動したい場合もあります。

常用しているFM77AV40SXはどのドライブからでも起動できるので良いのですが、残りの2台(FM77AV1,FM-7)にはそういう機能はありません。

FM-7用のFDDはPC-98用のケースに収めており、前面パネルにあったスイッチをドライブNo切替用に利用できましたが、そのためにGOTEKやPC用FDDからケーブルを引き出す必要がありました。(GOTEKには直接ハンダ付けをしました)


FM-7用FDD

しかし、FM77AV1の2Dドライブは基板上のスライドスイッチでドライブNoを切り替えるようになっており、ケーブルを引き出すのは容易ではありません。

そこで、ドライブ本体はそのままで、接続しているフラットケーブルを加工し、切替スイッチを追加することでドライブNoを変更できるようにしました。


下図がフラットケーブルの結線図です。

前提として、GOTEKがDRV0に、PC用FDDがDRV1に設定してありますので、GOTEKにはピン10にFDCからの10番か12番が、PC用FDDにはピン12に10番か12番が接続されることになります。(PC用FDDのピン10はN.C.ですので、結線されていてもいなくても無関係です。)


ケーブル結線図

実際のフラットケーブルとスイッチです。

有り合わせのものを利用したので、実際に装着してみたら長すぎました。。。

画像左側にFDCへのコネクタがあります。スイッチの下のコネクタがDRV0 用、右端のコネクタがDRV1 用です。


加工したフラットケーブル


その加工部のアップ

FM77AV1に装着した様子です。プッシュボタンはGOTEKの上に接着剤で固定しました。

プッシュボタンを押し込むとDRV0:GOTEK,DRV1:PC用FDDに設定され、ボタンを戻すとその逆になります。


FM77AV1に装着した様子

これで、ごくまれにあるフロッピィから起動させたい場合でも、77AVを分解しなくてもよくなりました。


2021年1月23日土曜日

赤外線ワイヤレスキーボードエミュレータ(ysflight.comさんによる)の製作

 ysflight.comさんによる

Windows+ArduinoによるFM77AV/AV40実機用赤外線ワイヤレスキーボードエミュレータ」製作してみました



最近はFM77AV用のZ80Hカード(韋駄天)を製作したりしてFM77AVを使用する機会が増えてきているのですが、私の77AVは本体のみを入手したもので、キーボードは常用しているFM77AV40SXに変換器を介して接続しているPS/2キーボードを兼用しているので、使用するごとにそれを外してAV用の変換器を介して接続しています。

キーボードをいくつも並べるスペースがないので仕方がないのですが、流石に面倒ですし、ごくまれにはSXとAVを同時に使用したい時もあります。


そこで、ysflight.comさんによるWindowsPCのキーボードをAVのワイヤレスキーボードにしてしまうアダプタを製作してみました。ysflight.comさんは最初はIRToyを使用されており、これには入手性のこともあって手を出さなかったのですが、第2作はArduino UNOを使うものでしたので、これならということで製作してみました。


IR LED等の部品ですが、部品の選定で苦労したくなかったのでysflight.comさんが使用されたものと同じIR LED,TR,DをMouserで購入しましたが、他は手持ちの部品です。Arduino UNOとしては「作って遊べるArduino互換機(鈴木哲哉さん)」で製作した2台のうちの5V版の方を使用しました。


簡単な回路ですので、手配線でもそれほど時間もかからずにすんなりと完成しました。



製作したアダプタです


製作した基板(表面)




その裏面



Arduino UNO(もどき)に装着した様子です


Arduino UNO(もどき)に装着



使用中の様子です。真正面に向けなくても十分に通信できました。
これで、私の77AVはドライブがGOTEKでフロッピィの出し入れなどはないので、例えば本体を机の下に押し込んでおいてもそれほど支障なく使えそうです。


使用中の様子


Windows側のプログラム FM77AVKeyboard の画面です。
キーボード入力を77AVに送るだけでなく、他にも色々な機能があります。
試しに、Windows上でF-BASICのプログラムを作成して「AUTO-TYPE(BASIC)」機能を用いてAVに送ってみましたが、これはとても便利です。

また、このエミュレータのウインドウ上にカーソルがあると77AVにキー入力が送られ、それ以外にカーソルが移動するとWindowsにキー入力が送られるので、Windowsと同時使用の際も特別な切り替え操作は不要であり、この点も慣れると使い易いと思います。


エミュレータの画面

下画像の送信データの表示画面は非表示にしておいても支障はありません。

送信データの表示画面


ysflight.comさんにはFM-7用のRS-232Cカードの製作時やその他でも大変お世話になりましたが、今回もこんな便利なツールのアイディアと製作例を公開していただきまして、大変感謝しております。ありがとうございました。

なお、このアダプタに関するysfilght.comさんのサイトは2つあります。(全体の説明このアダプタに関する説明)Windows側のプログラムやArduino UNO用のプログラムもサイト内で公開されています。


2021年1月22日金曜日

FT-245カード用の高機能な転送ソフト

FT-245カード用の高機能な転送ソフトを紹介します 


[2021年1月31日追加] FM-7側のソフトの改善版FMIMG_FM2をアップしました。
2020年12月11日のブログ「Ndittを使用しないでGOTEK用のHFEファイルを作成する(その3)」で、FT-245カードを用いることでFDDイメージをFM-7からWindowsPCへ高速に転送できることを紹介しました。
その際に、用いたFM-7側のプログラムには送信ルーチンだけでなく、受信ルーチンもあるので更なる用途も考えられると書きましたが、その後、そのプログラムを制作された「思い付きハードでソフトに七転八倒」さんが実際に機能を拡張したプログラムを制作されましたので紹介します。(私も一部分ですが協力させてもらいました。)

FT-245カードをFM-7に装着している様子

FT-245カード

Windows側のソフト FDDIMG_RW77.exeの起動画面

起動画面

まずCOMポートを設定します

COMポート設定画面



メニュー「FDDデータ」→「データ受信」を選択し、FM-7側で FDIMG_FM をEXEC &H6850 として実行します。

FDの状態によっては画像のように、タイトル部に(応答なし)が表示されてトラック番号がカウントアップしなくなることがありますが、データは正常に受信されますので、そのまま受信終了まで待ちます。

データ受信中の画面

受信終了後に、メニュー「ファイル」→「開く」で受信したデータファイル DIMG_20201130.dat を選択した後、メニュー「D88形式ファイル」→「作成開始」を選択するとファイル名入力画面でファイル名を入力するとベタなデータのみのDSKファイルとD88ファイルが作成されます。

ファイル名設定画面


この基本機能の他に、
・datファイルをFM-7上のFDに書き戻す機能
・datファイルの特定のセクタデータを書き換える機能
・FM-7のメモリ中のデータをWindowsPCに転送してファイル化する機能
・WindowsPC上のデータファイルをFM-7のメモリに転送する機能
があります。

単機能のソフトもあります

なお、FDDIMG_RW77.exeは上記のように多機能ですが、FM-7上のFDの内容をWindowsPCに読み込んでイメージファイル化したいというだけで良ければ、下記の rcvfdimg.exe が使用できます。(FM-7側のプログラムは上と同じ FDIMG_FM を使います。)
このソフトはFM-7上のFDを読み込んでD88ファイルに変換するだけの単機能ですので、その分使い方が簡単で、COMポートと保存ファイル名を設定した後、データ受信開始ボタンやD88ファイル変換ボタンを押すだけです。
ただし、FDDIMG_RW77.exeでのセクタ情報を持った中間ファイル(datファイル)は作成せずに、直接ベタなファイル(DSKファイル)とD88ファイルのみを作成します。



このソフトでも、FDによっては(応答なし)が表示されてトラック番号がカウントアップしなくなることがありますが、データは正常に受信できます。






紹介した FDDIMG_RW77.exe、FDIMG_FM、使い方の説明とrcvfdimg.exe をOneDriveに上げておきます。

[2021年1月31日追加]
FM-7側のソフトFMIMG_FMのPC→FM転送機能を改善したFMIMG_FM2をOneDriveに上げました。




2020年12月26日土曜日

Z80H 韋駄天用のCP/Mをソースから構成する

 Z80H韋駄天用のCP/Mを公開されているソースから構成しました


Z80Hの作者はX1-CP/Mから韋駄天用のCP/Mを構成されていますが、前回のブログでは、私は手持ちのFM-CP/Mを利用しました。しかし、X1-CP/MやFM-CP/Mから構成する方法では試してみることができる方は限られます。

そもそもCP/Mの本体部分は共通(だと思っています)ですので、公開されているソースからでも構成できるはずです。ということで、以前中日電工の菱田さんのブログを参考にしてCP/Mを構成した時と同じように構成してみましたので、菱田さんのブログの記事を参照しながら私の行ったその手順を解説します。

[1]ソースからバイナリを作成する

(1-1)ソースとアセンブラを入手する

公開されているページからソース cpm2-asm.zip をダウンロードします。(中日電工のブログ第17,18回 以下同様)

使用するのはこれを展開してできるファイルのうちの cpm22.z80 です。

アセンブラはVectorで入手できるZASM1.64を使用します。

(1-2)ソースのエラーを修正する(第19,35,36回)

このままアセンブルするとエラーが生じますので数箇所を修正します。

・END文の追加

・ラベルHALTをHLTに変更

・NFUNCTSの定義文を前方に移動

・CKSUMTBL: DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 を次の2行に分割する

  CKSUMTBL: DEFW 0

      DEFB: 0,0,0,0,0,0,0,0,0,0,0,0,0,0

・ADD A,M をADD A,(HL) に変更(3箇所)

ブログ中のその他の変更はND80Zのためのものなので不要です。

(1-3)60K-CP/M用に設定する

先頭の MEM EQU 62 を60に変更する。

(1-4)アセンブルする

以上の修正を加えたソース(cpm60k.txt)をWindows上でアセンブルします。

>msdos zasm -L -Ccpm60k.bin cpm60k.txt

(1-5)得られたBINファイルの末尾256バイトを削除する

末尾の BIOS JUMP TABLE の部分はIDATENシステムの方で用意されるので不要です。

できあがったファイルは$0000~$15FFの6KBとなります。


[2]CP/Mディスクを作成する

(2-1)ソースを入力してアセンブルする

「6809活用研究」のZ80Hの記事中にはIPL20, CONFIG, BIOS14, KER14 のソースが掲載されていますので、それを入力してアセンブルします。

(2-2)システムディスクのイメージの作成

バイナリエディタなどで320KBサイズのディスクイメージを作成して、次の順にファイルを書き込みます。

・$0000 - $00FF に IPL         (TRK:0, SCT:1)

・$0100 - $16FF に cpm60k  (TRK:0, SCT:2 - 23)

・$1700 - $1CFF に bios14    (TRK:0, SCT:24 - 29)

・$1D00 - $1EFF に config    (TRK:0, SCT:30 - 31)

・$2000 - $3BFF に ker14     (TRK:1, SCT:1 - 28)

・$4000 以降(TRK:2以降)はDirectoryとProgram&Dataなので、様々なブログで公開されているCP/Mシステムからコピーすることで、トランジェントコマンドやアプリケーションが設定できます。

韋駄天システムはX1-CP/Mを元にしているので、システムのセクタが他のCP/Mとは異なり1セクタ前にずれています。(はせりんさまに教えていただきました。ありがとうございました。)

 最後に、$1CFFの値を$3C(60)に変更します。これは起動時に60K CP/Mと表示される値です。

(2-3)システムディスク、あるいはシステムイメージファイルの作成

私は以前のブログに書きましたように、ドライブ0にGOTEKを使用していますので、できあがったイメージファイル(.DSK)を.88ファイルに変換して、さらに.hfeファイルに変換してUSBメモリーに書き込めば終了です。

フロッピーディスクをお使いの方はイメージファイルをそのままディスクにベタに書き込めば良いのですが、その方法としては、RS-232Cカードや以前のブログでも紹介していますFT-245カードを使ってFM77やFM-7に転送して書き込むことになりますが、転送時間がかかっても良ければF-BASICのプログラムを組めば良いので、詳細は省略させていただきます。




試作第1作は修正箇所が見えていて見苦しかったので、作り直すとともにCPUをZilog Z84C0020PECに交換しました。



韋駄天システムは最終的には64K-CP/Mとなるのですが、今のところまだ60K-CP/Mのままです。

これで、ハンダ付けを伴う製作と雑誌記事からのソフトの入力の手間をを厭わなければ、FM77で8MHz動作のCP/Mが走ることになります。





2020年12月19日土曜日

Z80カードの第4作は77AV用のZ80Hカード(韋駄天)

 懲りもせずに、さらにZ80カードを作ってみました!

[12月21日追記]CP/Mも走りました!(はせりんさんのアドバイスのおかげです)


今回のZ80カードは、ほうめいさんによる77AV用のZ80Hカード(韋駄天)です。

「6809活用研究(工学社)」掲載の記事を見て、いつかは作ってみたいと思って記事のコピーを保存してあったのですが、ほうめいさんのブログ「まごころせいじつ堂」に回路図の訂正が載ったのを見て、ついに作ってみることにしました。

(うまく行けば、私の常用機であるFM77AV40SXでもCP/Mが走るかもという甘い希望を持っていますがどうでしょうか。) ←コネクタが違っていました。残念!


ハードの製作

ブログの回路図を元にしてKiCadで回路図を描き、ICの配置もブログの写真通りにしてプリント基板を製作しましたが、メモリーICを128KBに変更することで何とか10x8cmのサイズに収めることができました。

Z80Hは手持ちがありませんでしたので、古いD780C-1を使用してみましたが不思議なことに8MHzクロックのままで動作しています。

しかし、いつものようにポカをしてしまい、128KBメモリーのプルアップすべきCS端子をプルダウンしてしまったので、パターンカットや追加配線が必要となりました。




画像では、とりあえずメモリーのピン30を抜いて+5Vに接続していますが、こんなこともあろうかと作り直しを前提に、普段はTTL ICには使用しないことにしているソケットを使用しています。


FM77AVに装着した様子です。高さを8㎝に抑えたので、装着した状態でカバーを閉じることができます。

「6809活用研究」にはF-BasicのTiny Monitorも載っていましたので、入力して走らせてみました。



画像のように、コマンド M, D, S, R が機能していますのでハードは正常に動作しているようです。


CP/Mの移植

CP/Mの移植に必要なソフトも「6809活用研究」に載っているので、BIOS等はそれらを打ち込めばよいのですが、CP/M本体はX1用のものを使用することになっています。

もちろんX1用のCP/Mは所有していないので、最初に手持ちのFM-CP/Mのディスク中のFMCPM605.SYSが5インチ用の60K_CP/Mかと思って適用してみたり、動いている56K_CP/Mから60K_CP/Mを作成して適用してみたりしましたが、うまく行きません。さらに、CP/M2.2のソースをアセンブルしたものを適用したりしましたが、やはり動作しません。

ということで、CP/Mの移植については挑戦中ということで、先にそのまま入力していたBIOSなどのソースを改めて読んでいるところです。

[12月23日追記]FM-CP/Mの60K版を元にしたものが動作しましたので、次の課題は公開されているソースをアセンブルしたもので動作させることですね。


最後に

回路やソフトを公開して下さったほうめいさんに感謝いたします。

とりあえず製作した試作第一作の不完全なプリント基板(ミスがあるためパターンカットと追加配線が必要なのと、シルク印刷が不十分)ですが、余分が数枚ありますので、もしご希望の方がおられましたらメールで連絡を下さい。返信用封筒に切手を貼って送ってくださったら無料でお送りします。


2020年12月11日金曜日

Ndittを使用しないでGOTEK用のHFEファイルを作成する(その3)

 

ついに実用レベルの高速化を実現できました


前々回(その1)のブログでFDをイメージ化するのに「思い付きハードでソフトに七転八倒」さんが製作されたFT245RL使用の高速転送カードを使用できればもっと速くなるだろうと書きましたが、実際に2Dディスク(320KB)でわずか1分という、RS232Cカード使用の場合の10倍ほどの高速化を実現することができました。

使用したFT245カードは、FT245RLモジュールの他にはTTL-ICがわずか5個という簡素なものですが、その速さには目を見張るものがあります。




FM-7側のソフトはもちろん、「思い付きハードでソフトに七転八倒」さんがハードに合わせて作成されたものをそのまま使用させていただきました。
WindowsPC側のソフトは、とりあえずの間に合わせで私が作成したものを用いました。




使用法


(1)Windows側でmkd88img.exeを起動し、Port Noと保存ファイル名を指定して「データ受信開始」ボタンを押します。
ステータスバーに Data receive start ... が表示されて、データ受信待ち状態になります。




(2)FM-7側でLOADM”RDFDIMG",,RでRDFDIMGを起動します。
プログラムサイズは243バイトで$6800からに入り、実行開始アドレスは$6850です。デフォルトではドライブ0が指定されていますが、アドレス$6856の0を希望のドライブ番号に変えることで他のドライブも読めます。
Windows側では、track no = nn のように、読み終わったトラック番号が表示されます。




(3)40トラックの読み込みが終了すると(track no = 39はほとんど見えません...)、続いてDSKファイルとD88ファイルの作成に進みますが一瞬で終了します。



2つのファイルが作成されると DSK, D88 file created. が表示されて処理が終了します。
そのまま、別のFDの処理を続けることもできますが、同じファイル名のままだと重ね書きになります。

Windows上にD88形式のイメージファイルが作成できれば、後は、8月9日のブログ「FM-7/77にGOTEKを接続する」に書きましたように、HxCFloppyEmulator.exeを用いてD88ファイルをHFEファイルに変換してUSBメモリに書き込むだけです。

使用感など


ディスク一枚が1分で処理できるのは結構実用的ではないでしょうか。
私はこれを用いて手持ちのF-BASICの2Dディスクを全部読み込んでイメージファイル化してみましたが、それ程の手間ではありませんでした。

最後に


NDittを使わずにFM-7自身でFDを読んでそのままWindowsPCに転送することでイメージ化できないかという着想から始まった試みでしたが、WindowsPCへのデータ転送にRS-232Cを用いた場合はFD1枚に10分もかかり、出来ないことはないが普段使うツールとしては非実用的といえる結果となりました。
そんな時に、FT245基板を製作された「思い付きハードでソフトに七転八倒」の秋田さんが趣旨に賛同してFM-7側のFD読み込み・転送ソフト RDFDIMG を作成してくださいました。
これによってFD1枚のイメージ化が1分でできるようになり、実用的なツールになりました。

ということで、「FM-7側ソフト担当:秋田さん(企画の賛同者)、Windows側ソフト担当:私(企画・仕様設計)」という合同作品となりました。

使用したRDFDIMG(「思い付きハードでソフトに七転八倒」の秋田さん制作)とmkd88img.exe(拙作)をOneDriveに上げておきます。
なお、RDFDIMG にはFM-7からWindowsへの送信ルーチンだけでなく、Windowsからの受信ルーチンも含まれていますので、更なる用途も考えられると思います。

2020年12月3日木曜日

Ndittを使用しないでGOTEK用のHFEファイルを作成する(その2)

 

前回紹介したプログラムを改良し、多少の高速化を図りました


前回紹介したプログラムは、FM-7側はF-BASICで作成し、WindowsPC側は2つのプログラムに分かれていましたが、FM-7側のプログラムをアセンブラで、WindowsPC側のプログラムを一つにまとめることで、より使い易くするとともに多少の高速化を図ることができました。

(1)FM-7側(RDIMG)
アセンブラで書き直すにあたって、最初はFDCを直接コントロールしてトラックリードコマンドで、1トラックを一気に読み込んでメモリに展開し、そこからセクタデータを取り出すと高速になるのではないか(ディスクの読み込みが40x2の80回で済むので)と考えて作成してみました。
結果、セクタデータは得られたのですが、標準のフォーマットとは異なる個所もあり、また、読み込むたびに値が変わる部分もあり、全てに対応するのは結構面倒そうです。
ちなみに、読み込んだトラックデータは以下のようでした。

                            標準の値                     実際の値
----------------------------------------------------------------------------------------------
GAP1                      4E                             4E,その他の値
----------------------------------------------------------------------------------------------
SYNC                      00 (12バイト)            00,その他の値
IDアドレスマーク    A1,A1,A1,FE             14,A1,A1,FE or C2,A1,A1,FE
IDとCRC(4+2バイト)             同じ
----------------------------------------------------------------------------------------------
GAP2                      4E                              4E,その他の値
SYNC                      00 (12バイト)            00,その他の値
IDアドレスマーク    A1,A1,A1,FB             14,A1,A1,FB or C2,A1,A1,FB
                                                                 (FBはF8の場合もあり)
DATAとCRC(256+2バイト)    同じ
----------------------------------------------------------------------------------------------
GAP3                       4E                             4E,その他の値
----------------------------------------------------------------------------------------------

これを見る限り12バイトの00に続いた後、 14(orC2),A1,A1,FEの後にID(TRK,SIDE,SCT,セクタ長)+CRCが、14(orC2),A1,A1,FBの後にDATA(256バイト)+CRCがあると決め打ちして良いようにも思いますが、ちょっと不安です。

ということで結局、BIOSを用いてセクタリードを40x2x16の1280回繰り返すことにしました。1セクタ読むごとに256バイトのデータとチェックサム値を転送しています。ファイル名をRDIMGとしました。


(2)WindowsPC側(mkd88img.exe)
前回のプログラムはFM-7から送られたデータをそのままセクタ順に保存してできたDSKファイルをまず作り、次に別のプログラムを用いてD88ファイルを作成するものでしたが、それを一体化してmkd88img.exeとしました。処理結果としてDSKファイルとD88ファイルの2つが生成されます。

FDイメージファイル作成の手順


(1)FM-7とWindowsPCをRS232Cボードで接続して適切なボーレートに設定します。RTS/CTS制御可能なボードであれば19200Baudが可能です。
(2)WindowsPC側のmkd88img.exeを起動します。オプションを付けずに起動するとCOM4,19200Baud,生成ソフト名FDIMG.DSK, FDIMG.D88となりますので、変更する場合は下記のようにオプションを付けて起動します。
 mkd88img [p=n] [b=nn] fname (fnameはディレクトリを含んでも良い)
(3)FM-7側のRDIMGを起動します。デフォルトではドライブ0のディスクを読むようになっているので、他のドライブの場合は一旦Loadして(&H6000からに入ります)から&H6002の値0を希望のドライブ番号に変えた後、Exec &H6000で実行します。
(4)指定したディレクトリにDSKファイルとD88ファイルが作成されます。


結果など


速度ですが、2Dディスクを処理するのにおよそ10分(19200Baud)、15分(9600Baud)、20分(4800Baud)、35分(2400Baud)程度となりました。
8251Aを直接コントロールしているのでRTS/CTS制御をしてボーレートを上げることができていますが、2400Baudでは前回の結果と同じ程度なので、処理時間はディスクの読み込み方法とはあまり関係がなく、ほぼ転送速度で決まってしまっているようです。

作成したRDIMGとmkd88img.exeをOneDriveにMakeD88ImageFile2.zipとして上げておきます。FM-7にRDIMGを直接入力する場合はRDIMG.bin(236バイトもありますが...)を打ち込みます。(RDIMGはF-BASICの機械語形式に合わせたもので仮想ドライブにドラッグ&ドロップする場合に用います。)