2021年7月8日木曜日

FM-7/77用の改良版I/O拡張基板用のF-BASICドライバを作成

FM-7/77用のI/O拡張基板用にF-BASIC用のドライブソフトを作成しました

6月10日に報告した「FM-7/77用のI/O拡張基板を改良しました」ではF-BASIC用としては使用しないようなことを書きましたが、Flex9やOS-9では使えるのにF-BASICでは使えないというのはつまらないので、F-BASIC用のドライブソフトも作成することにしました。


F-BASIC用のソケットも実装しました

元にしたのは、2019年6月12日の「FM77用の拡張IOボード、ROM/RAMディスクボード」でのFLEX9版の拡張ROM/RAMドライブソフトと、2019年9月25日の「FM-7/77のF-BASIC用の仮想ドライブ構築ソフトが完成」での裏RAMを使用したWindows上の仮想ディスクのドライブソフトの2つで、この2つのソフトを合体させて裏RAMに置けば良いだろうと考えました。

両方とも動作実績がありますので、それ程苦労することはないだろうと思って始めたのですが、いつものようにドジをしたせいで見込み以上に時間もかかりながらも、何とか動くものができました。未だ動作に納得がいかない点があるのですが、とりあえずここまでをまとめておきます。


制作したソフト

作成したのは、FM-7/77で動作させるもので

(1)RDSKWIN : ROM/RAMディスク&Windows仮想ディスクのドライブソフト

(2)RRWCHG : ROM/RAMディスクとWindows仮想ディスクを切り替えるソフト

(3)RAMFMTFB : ドライブ3のRAMディスクを初期化するソフト

の3本です。Windows側の仮想ディスク構築ソフトは以前のものをそのまま使用しています。


使用手順

使い方は次のようです。

1.FM-7を起動して、ドライブ数に4を指定する。

2.LOADM "RDSKWIN",,R でFM-7側のドライブソフトを起動する。

3.Windows側で FbasDrvWin.exe を起動し、ドライブ2と3にF-BASICのイメージファイル(.77, .88, .DSK)をセットしておく。


手順1.2.3.ではI/Oエラーとなる

【注】この状態で、ドライブ2はROMディスク、3はRAMディスクに設定されているが、なぜか FILES "2:やFILES "3: を実行しても Device I/O Error が出るので、次の操作を行う。

4.LOADM "RRWCHG",,R を起動するとドライブ2がROM、3がRAMと表示されるが、2または3を入力すると該当のドライブがWindows DRVに切り替わるので、その後 0を入力して終了する。



Windows仮想ディスクに切り替え

5.FILES "2:またはFILES "3:を実行する。Windows仮想ディスクを使用する場合はこの状態で使用する。

Files "3: でWindows仮想ディスクが読めています

Windows仮想ディスクを読んだ


Windows側でのセクタを読んでいる様子です

Windows画面の表示

6.ROM/RAMディスクを使用する場合は、再度 LOADM "RRWCHG",,R を実行してドライブ2または3をROMやRAMに切り替えて使用する。

今度はちゃんとRAMディスクが読めています。


RAMディスクが読めている


追加:最初にRAMディスクを使用するときには、LOADM "RAMFMTFM",,R を実行して初期化をしておく。バッテリバックアップされているので、電源を切ってもデータは保持されている。

具体的な使い方ですが、ROMディスクにはF-BASICのシステム等を入れておき、必要ならRAMディスクに転送してRAMディスク上でアセンブルやコンパイルを実行するという形でROM/RAMディスクを使用し、処理結果はWindows仮想ディスクに転送してWindowsで保存するというのが便利かなと思います。


未解決の点

以上ですが、手順1,2,3のみで良いはずなのに、最初のみ手順4で一度はWindows仮想ディスクをReadする必要があるのですが、その理由はまだ分かっていません。

RDSKWIN のソースを見ていただければ分かりますが、ROM/RAM用のRead1, Write1とWindows仮想ディスク用のRead2, Write2とは全く別ルーチンとなっているのにと思いますが、ワークエリアの設定に問題があるのかもしれません。

作成した3つのソフトのソースと以前から使用しているFbasDrvWin.exe(バイナリ)をOneDriveに上げておきますので、アドバイス等ありましたらよろしくお願いします。


2021年6月15日火曜日

アップスキャンコンバータの製作

 FM-7用にRGBI対応のアップスキャンコンバータを製作してみました

と言っても、先人の労作をそのまま後追いしてコピーしてみただけなので、何の工夫も改良もないというものですが、そのまま作ってちゃんと動作したという例としてみていただければ...

オリジナルは、Oh!石さんのNibbles lab. HomePageの「研究成果」の中にある「RGBI対応アップスキャンコンバータ」ですが、使われている基板(DesignWave magazine 2007年7月号付録のFPGA基板で、Xilinx社のXC3S250E搭載)を持っていることもあり、数年前にこの報告を見て以来いつかは作ってみたいと思っていたのですが、使われているFUJISOKUの1回路12接点のロータリースイッチがいかにも高価でしかも入手できそうもないということで諦めていました。ところがつい最近全く同じものがヤフオクに安価で出品されており、さらにXilinxのコンフィグROMもヤフオクで入手できたので、これで実際に作れる見込みが立ちました。(実際には、3.3V表面実装の32MHzクロック発振器が最も入手難で注文してから入手まで20日ほどかかりましたが。)

結局、新たに購入したものは、ロータリースイッチ、そのつまみ、クロック発振器、コンフィグROMのみで、他は特殊なものはないので手持ち部品で間に合い、回路も上記の報告を見ていただければ分かりますが、それ程複雑ではないので2日ほどで製作できました。


製作したアップスキャンコンバータ


下の基板は手ハンダです


問題はFPGA(正確にはコンフィグROM)への書き込みで、以前、68Katy-aeという基板を製作した際にダウンロードケーブルは入手してありましたし、ソフトも無料のWeb版のライセンスを取得してありましたが、2年半も前の事でもあり、すっかり手順を忘れていましたし、コンフィグROMに書き込むのは初めてのことでしたが、何とか書き込むことができました。


書き込み中の様子

FM-7との接続ですが、とりあえず手持ちの8ピンDINコネクタにフラットケーブルを接続したものを用いて、まずCENTURYのLCD-10000Vで表示させてみました。

FM-7ではI(輝度)信号はありませんので、RGBIではなくてRGBですが正常にカラーモードで表示できました。


40桁表示


80桁表示も全く問題ありません

80桁表示


ところが、EIZOのL365では下のように、右寄りに表示されてしまいました。

EIZO L365での表示

このL365は普段FM77AV40SXの400ラインモードで使用しているもので、24KHz表示が可能なのですが、15.7KHzでSignal Errorと表示されます。

Oh!石さんはSharp系で使用されているので、富士通系で使用するには何か調整が必要なのかもしれませんが、もうコンフィグROMに書き込んでしまったので、これはこのままLCD-10000Vで使用するつもりです。

さらに作ってみたいアップスキャンコンバータがありまして、それはSasajiさんの「FPGAで8ビットパソコンを拡張する」の中の「アップスキャンコンバータを作る」です。これに使われている基板(AlteraのMAX10使用のMAX10-FB/JB基板)も所有しているので、ぜひ製作してみたいのですが、この報告ではCPLDのプログラムが公開されていないため、自分でプログラムしなければなりませんのでかなり苦労すると思います。でも、XilinxのFPGAよりもAlteraのCPLDの方が使い慣れているので、中日電工さんのCPLDの記事を参考にしながら作ってみたいと思っています。(中日電工さんのCPLDトレーニングボードやCPLD使用のVGAボードも既に入手してありますが、知識がついてこない...)

しかし、これもHITACHIのS1やL3用のもので、どうもFM系でアップスキャンコンバータを製作したという報告はあまり見当たらないようですね...


2021年6月10日木曜日

FM-7/77用のI/O拡張基板を改良しました

FM77用の拡張I/Oボードを改良してFM-7でも使えるようにしました

 

2019年6月19日のブログ「FM77用の拡張IOボード、ROM/RAMディスクボード」で紹介した拡張I/Oボードですが、2019年8月26日「FM77用の拡張I/Oボード、ROM/RAMディスクボードのプリント基板化が完了」で紹介しましたように、プリント基板化してFM77AV40SXに接続して使用していました。

その後、使用していなかったFM-7を再び使用する機会が増え、FM-7でもROM/RAMディスクを使いたくなりましたが、残念ながらFM-7背面の50P拡張コネクタには2.45MHzのクロックが出ておりませんので、最初は32Pスロットを使用して変換基板を経由して使用していました。しかし32Pスロットは2個しかないので、やはり50P拡張コネクタを使うということにして、間に挟んでいる変換基板(FM77とFM-7の拡張コネクタはピン配置が異なるので変換が必要)上にクロック生成回路を追加して使用していました。

今回、回路を見直して、ほとんど使用していなかったFT-232モジュール部を取り外せば拡張I/Oボード上にクロック発生回路を追加できると考えて、基板を製作することにしました。


製作したI/O拡張ボード


回路図

実は、基板を製作した際に肝心の2.45MHzのクリスタルを入れ忘れており、裏面につけようかとか思いましたが、幸いにして並んでいるR2,R3の端子に直接接続すれば良いことが分かって、それ程見苦しくならずに済みました。(画像でも不自然さは感じないと思います...)




構成図



そもそも拡張I/Oボードの50P入力のピン配置をFM-7に合わせてしまえば変換基板も不要となるのですが、そうしなかったのは、この変換基板上に32Pスロットを増設してそこにFDCボードを装着して、全体を拡張BOXという形でケースに収めればすっきりすると考えたからです。ということで、以前製作した増設32Pスロット基板を34Pフラットケーブルを介して接続してみました。



左:変換基板、右:増設32Pスロット基板

左の変換基板の中央のコネクタにFM-7からの50Pケーブルを接続し、左のピンヘッダに拡張I/Oボードを接続します。右の34Pコネクタには増設32Pスロット基板を接続し、その上にFDC基板を装着します。

しかし、実際にFDCボードを装着して起動してみると、時々ですが起動に失敗します。恐らく接続に使用しているフラットケーブルが長すぎる(2本の50Pが計84㎝、34Pが30㎝程度と長い...)のだと思いますが、FDCボードまで装着するにはもう少し工夫が必要なようです。

とりあえず、当面は拡張I/Oボードとその上に重ねるROM/RAMボードのみで使用することになりそうです。

ということで、別途製作したROM/RAMボードと二段重ねにして使用している様子です。


ROM/RAMボードを上に重ねました


ROM/RAMは一組だけ実装


FM77AV40SXではFLEX9とOS-9を切り替えて使用できるようにROM/RAMを2組セットして使用していますが、FM-7ではFLEX9とF-BASICがメインになりそうで、しかもF-BASICはシステムドライブやワークドライブの指定はできないためROM/RAMはあまり利用価値がなく、Windows上の仮想ドライブの方を使うことになるということで、とりあえずROM/RAMはFLEX9用として一組だけ実装してあります。

以上、FM-7用の拡張I/Oボードの改良とROM/RAMボードの紹介でした。ドライブソフトはFLEX9用、F-BASIC用のどちらも以前紹介したものをほぼそのまま使用しています。


2021年5月26日水曜日

FM-7/77にGOTEKを接続する(その2 新基板の場合)

 またGOTEKを入手してみたのですが... 基板が新しくなっていた

今までにFM-7, FM77AV, FM77AV40SXにGOTEKを装着してきました。そのうちのFM-7用はPC用の外付けFDDのケースと電源を利用して、GOTEKと2DDのFDDを装着して使用していました。ところが、その電源が不調で5Vのはずが8Vも出力されることがあり、そのためにUSBメモリが破損してしまい、さらにGOTEKも不調になったような気配を感じたので、新たにGOTEKを2台追加購入してみました。

今まではFM77に合うようにと黒色を購入していたのですが、今回はグレーにしてみました。購入時にチェックした点は、7セグが3桁であることと背部のピンヘッダの穴が9ピンであることの2点です。今回で8台目の購入となり、最初はAmazonで購入していましたが、今は選択の幅の広いebayで購入しています。(どちらにしろ中国から送られてきますので...)


基板がかなり変更されていた!

以前よりも短い期間で送られてきたのは良いのですが、7セグをOLED液晶ディスプレイに交換し、ロータリーエンコーダを追加するためにケースを開けて基板を見てびっくりしました。何と、ロータリーエンコーダの接続ピンがないのです。さらにCPUが変更されており、パターンも細かいところで異なっています。(下図画像参照)


左:旧基板、右:新基板



左のものは既にOLED、ロータリーエンコーダや圧電ブザーが取り付けてあります。基板を比較すると結構異なっているのが分かるかと思います。CPUは従来のものがSTM32F105であるのに対して今回のものはAT32F415で、ピン数も異なっています。


ロータリーエンコーダの接続先は分かりにくかった


OLED液晶ディスプレイの接続先は旧基板とそれ程異なっていなかったので、テスターで調べながら接続することができました。また、エンコーダのプッシュボタンも同様でした。
しかし、エンコーダのCLKとDTピンは基板に該当のピンがありませんので、新旧基板を見比べながらあちこちに接続してみましたがうまく行きませんでした。困った挙句、ウエブで「GOTEK Rotary encoder」という語で検索をかけてみました。その結果、「Gotek Floppy Emulator:New 2021 Flash Floppy and Mods Procedure!」というユーチューブの動画を見つけました。
この画像によると、新しいGOTEKはCPUがAT32F415になり、それに伴って基板も変更されているそうです。おかげでCLKとDTの結線先も分かりました。


新基板の結線図


OLED液晶ディスプレイとロータリーエンコーダを装着した様子です。ハンダ付けは裏面で行っています。フロッピーのアクセス音がなくても不自由はなかったので圧電ブザーは装着していません。


新基板の完成した状態



なお、OLED液晶ディスプレイは相性があるようですが、私の場合は全て下記画像のものを使用しており、特に不具合はありません。ロータリーエンコーダはプッシュスイッチ付きであればどれでも良いようです。


使用したロータリーエンコーダとOLED液晶ディスプレイ


OLED液晶ディスプレイの画面は小さいのですが、サイズはちょうどですし文字は見やすいです。


動作チェックの様子



使用感ですが、もちろん今までのものと変わった点はありませんが、ロータリーエンコーダでディスクイメージを選べるのはとにかく便利で重宝しています。
(蛇足ですが、現在使用中のGOTEKが電源故障のために不調になったのではないかと疑っていましたが、どうも杞憂だったようで現在は普通に使えています。)

新基板の情報があまり多くないようですので、多少なりとも参考になればということでアップしました。

2021年5月20日木曜日

W65C816も動作する6502基板を製作してみました

 6502基板を新たに製作し、W65C816をネイティブモードで動作させてみました


首を長くして待っていた基板がようやく届きました。

今回製作したものはFM-7/77用拡張I/O基板、FM77AV用Z80カード韋駄天、6502/65816基板の3種です。
拡張I/O基板は過去2回作り直していますが、今回のものはMAX232CとFT-232モジュールを外し、空いたスペースに2.45MHzの発振回路を追加することでFM-7の50P拡張コネクタに対応したものです。また、Z80カード韋駄天は第1作が動作するかどうかを確認するためだけに手間をかけずに製作したため、電源ラインが細いことやシルク印刷を省略していることなどが不満で、ちゃんとしたものに作り替えたいというものです。

今回報告する6502/65816基板ですが、以前報告しましたように、ほうめいさんから頂いたドータボードPLDR6502を自作6802ボードに搭載してW65C02を動作させることができましたし、その後、CPUをW65C816に交換してエミュレーションモードで動作することを確認していました。
しかし、動作したとなると6802ボードに間借りしたものでは如何にもW65C816がかわいそうということで、専用の基板を作ることにしました。


6502/65816基板


6502を使用した他の(市販)機器との互換性などを考慮する必要は全くありませんので、今までに製作した6802ボードや6809ボードと基本部分を同様にしましたが、データアクセス用のACIA(63B50)を減らしてその代わりに拡張コネクタを追加しました。

回路図

上位の32KBは必要に応じてRAM/ROMのどちらも使用できるようにしてあります。
データシートを見ると、ピン3のABORTBとピン36のBEをプルアップしてやればよいようですので、ピン36は常にプルアップし、ピン3はジャンパ―ピンで切り替えられるようにしてあります。

製作してみました。
右端の未配線の部分は拡張用のコネクタの取り付け部ですが、まだ取り付けていません。

完成したボード

基板ですがいつものようにポカがあり、LEDのアノードマークのAがカソード側に表示されていましたが、その他には特に不具合もなくあっさりと動作しました。

画像では、前回のドータボードで動作していたCPU, モニタROM, BASICROMをそのまま装着していますが、これで動作しています。

このLEDはピン35のE出力に接続してありW65C816がネイティブモードに入った時に点灯するようにしてあるのですが、リセット後にWozモニタで下記のようなコードを実行することで、ネイティブモードとエミュレーションモードを切り替えることができるようです。


モード切り替えコード


モード切り替え実行の様子


1000番地から実行すると画像のようにLEDが点灯し、1008番地から実行すると消灯することからモードの切り替えはできているようですが、6502については使用経験が全くないので、これ以上のことは今のところ私には分かりません。



LEDが点灯しています

6800や6809を長く使い続けてきた私の感覚では、6800ですら使いにくいCPUですのに、さらにレジスタも少ない6502ではプログラムを制作しようという気には全くなれませんが、大昔とはいえ、6502でAppleIIを創り上げたウォズニアックさんやVisiCalcのような実用ソフトを制作した方々には本当に頭が下がります。今は開発環境としてはとても恵まれていると思いますが、それに見合った結果が出せているのかと思うと...

65816なら6502よりもプログラムを作りやすいのではないかと思いますので、しばらくはこのボードでW65C816のプログラミングの練習をしてみようかと思っています。


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さんに感謝いたします。ありがとうございました。