2018年7月6日金曜日

FLEXシステムの作成方法(その3)・・・6800FLEXの場合

FLEXシステムの作成方法(その3)・・・6800FLEXの場合


6月27日に6809FLEXシステムの作成方法を説明しましたので、今回は6800用FLEXシステムの作成方法を説明します。

今更、誰が6800FLEXなんか使うんだという声もあるとは思いますが、マイコン初期の頃にVTL, TinyBasic, GAMEⅢ, TL1などのアマチュア的な言語に夢中になった思い出がある方もおられると思います。私もそうでした。
それらの言語を動かすためには、やはり、OSがあると何かと便利です。
(ディスクに保存しておいて起動して走らせるだけなら、WindowsパソコンにMOT形式で保存しておいて、MonitorのLoad, Saveコマンドで済むわけですが...)

それはそれとして、6800でもFLEXを動かしてみたいという、技術的な興味もあって6800FLEXを作成してみました。

6809の場合と同様に、SWTPCemu中の6800フォルダにあるDSKファイルからFLEX2.SYSを取り出して、それを元にFLEX2.CORを作ります。FLEX2.SYSは色々なDSKファイル中にありますが、Flex2-01.DSK中のものを使用することにします。このDSK中にはFLEX.CORやFLEX.SYSもありますが、これらは古いもののようですので使用せずにFLEX2.SYSから作ることにします。

具体的な手順

(以下のすべての数値は16進数表記です。)
 (1)FLEX.CORを得る
画像1 ディレクトリ

FLEX2-01.DSKをバイナリエディタで開き、アドレス410からのディレクトリを見ると、FLEX2.SYSはセクタのトラック、セクタ番号が01,0A~04,04の18セクタであることが分かります。

アドレスでは1300~2BFFですので、これをコピーして取り出してFLEX2.SYS名で保存します。



画像2 FLEX2.SYSの先頭部







画像3 FLEX2.SYSの最後尾




このFLEX2.SYSの最後尾を見ると、最後の3セクタが独立しているように見えます。
アドレス2900からの2セクタがDriver.bin、2B00からのセクタがI/Oのベクターです。

この3セクタを除いて282FFまでを取り出して保存したものがFLEX2.CORとなります。













(2)driver.bin, io.binを用意する
MicrosoftのOneDriveに必要なdriver.txtとio.txtを上げておきますので、それをダウンロードして、同梱の6800AsmWin.exeでアセンブルするとdriver.binとio.binが得られます。
6809FLEXとは異なり、このdriver.bin中にI/O関係のアドレスを書きます。
driver.txtを見ていただくと分かるように、BE80から始まるDriverのベクターの後ろ、アドレスBEA3に相当する個所からF000(INCH), F002(OUTCH), BEAFの位置にF838(MONITOR)を書き込んでおきます。
(実は、これだけではだめで、上書き用の io.txtも必要です。)


(3)BINファイルをパケット形式に変換する
得られたBINファイルをパケット形式に変換します。その方法は前回述べた通りで、空のDSKファイル(BLANK.DSK)を用意して、それをFlexDrvWin.exeのドライブにセットし、そこにbinファイルをドラッグ&ドロップするだけです。これで自動的にパケット形式に変換され、セクタ先頭にもセクタ情報が付加されます。

(3-1)driver.binを変換する
画像4 driver.bin と io.bin
FlexDrvWin.exeのStart Adrのボックス中の値を0xBE80にセットしてからdriver.binをドラッグ&ドロップします。実行アドレスは0x0000のままで良いので「はい」と答えるとdriver.binが指定したアドレスからのパケット形式で保存されます。
保存したBlank.binをバイナリエディタで開くと、アドレス2000からの2セクタに保存されていますので、これをコピーして取り出し、driver_dsk.bin名で保存します。

(3-2)io.binを変換する
6809の場合のconsole.binとは異なり、6800ではI/O関係のベクターはここではなく、driver.binの中に書いてありますので、これで十分なはずですが、このio.binは起動時の最後に読み込まれてdriver.bin中の値にセットされたメモリ上の該当箇所を更に上書きするためのもののようです。
(これが分からなくて、ずいぶん手間取りました。)
FlexDrvWin.exeに入れるときに、Start Adrを0xAD09に、Exec Adrを0xAD00にセットします。
この1セクタ分をコピーして取り出し、io_dsk.bin名で保存します。


(4)FLEX.CORにdriver_dsk.binとio_dsk.binをつなげる
新しいBLANK.DSKを用意し、FLEX2.CORを2000~35FFにコピーします。
その後ろの2セクタにdriver_dsk.binを、さらにその後ろの1セクタにio_dsk.binをコピーします。

(5)セクタ情報を書き換える

画像5 FLEX2.SYSの先頭部(左)と最後尾(右)
これで全セクタが揃ったので、各セクタ先頭のセクタ情報4バイトを整理します。
アドレス2000からの各セクタの先頭4バイトを、
01,02,00,01
01,03,00,02
      ...
01,19,00,18
00,00,00,19
に書き換えます。



(6)セクタ00,03のSIR(システムインフォメーションレコード)情報を書き換える
セクタ00,03(アドレス200)のオフセット1Dからの未使用領域開始セクタを01,1Aに、オフセット21からの残りセクタ数09,E0を09,C7に書き換えます


画像6 SIR情報




(7)セクタ00,05のディレクトリ情報を書き換える
セクタ00,05(アドレス400)のオフセット10からの24バイトをファイル名(8バイト)、拡張子(3バイト)、アトリビュート(1バイト,通常00)、未使用(1バイト,00)、スタートTrk,Sct(2バイト,01,01)、エンドTrk,Sct(2バイト,01,19)、サイズ(2バイト,00,19)、2バイト(00,00)、日付(3バイト,月,日,年を2進数で) のように書き込みます。

画像7 ディレクトリ


(8)最後に
以上でシステムディスクのベースが完成しました。あとは、SWTPCemuから必要なCMDファイルが入っているDSKファイルを探してFlexDrvWin.exeのドライブにセットして、システムディスクにコピーします。
例えば、COPY.CMDが入っているDSKがドライブ2に、コピーしたいCMDファイルが入っているDSKがドライブ1にセットされているとして、
  2.COPY (sp) 1 (sp) 0 (sp) .CMD (spはスペース)
でCMDファイルが全てドライブ0にコピーできます。
詳しくは、Documentationフォルダ中のTSCフォルダにあるドキュメントを参照してください。

(9)その他
・システムディスクの先頭2セクタ00,01と00,02にはBootLoaderを入れておく必要があります。6800用のモニター中のFLEXコマンド「X」は、この2セクタを読んでA100からにセットして実行を移す機能を持っています。(このBootLoaderのオフセット05,06にFLEX2.SYSの先頭セクタのTrk,Sct番号が書かれています。FLEXのLINKコマンドはSYSファイルを探して、その位置をここに書き込んでいます。これによって、SYSファイルがDSK上のどこにあっても正しくBootできるわけです。)

・AC07の値00を08に書き換えておくとBSキー時に削除文字が消えてくれますので、使い勝手が良くなります。このためにFLEX2.CORの先頭からのオフセット0F(アドレス200F)を08に変更します。

以上の作業に必要な、BootLoaderの入ったBLANK.DSK、driver.txt, io.txt, 6800AsmWin.exeをMicrosoftのOneDriveにMakeFLEX2というファイル名でアップしておきます。





2018年6月27日水曜日

ASSIST09に追加したLoad, Saveコマンドを改良しました

ASSIST09に追加したLoad, Saveコマンドは使いにくかった


5月26日に公開したブログでASSIST09の追加コマンドLoad, Saveですが、使用していると使い勝手が悪いところが目に付いてきましたので、改良しました。

使いにくい点は
(1)毎回、Windows側のslwin.exeを起動しなければならない。
(2)末尾が0でないアドレスからSaveし始めると、その値から16バイトずつ保存していくので、メモリのダンプ値と比較しにくい。

ということで、コマンドプロンプト画面でWindows側のソフトを起動すれば、その画面を閉じない限り、繰り返しLoad, Saveコマンドが使えるように改良しました。
また、アドレスが切りの良い値でSaveされるように一行目の保存バイト数を調整しました。


コマンド発行の様子



コマンドの使い方は全く同じです。











Windows側の様子





一度起動するだけで、連続してLoad, Saveコマンドが使えます。終了するにはQを入力して少し待ちます。








作成されたMOTファイル




Saveコマンドで保存されたMOTファイルの中身です。
2行目からは切りの良いアドレス値で保存されています。















残念な点...
ASSIST09側のプログラムもそれに合わせて若干の手直しをしましたので、モニタROMの焼き直しが必要となってしまいました。

ASSIST09側のプログラムとWindows側のプログラム(slwinr.exeと改名)をMicrosoftのOneDriveに上げておきます。

FLEXシステムの作成方法(その2)・・・より具体的に

FLEXシステムの作成方法 ・・・ より具体的に

以前の「FLEXシステムの作成方法」(2018/05/04公開)をより具体的に説明します。
フォルダFLEX6809中の100近いファイルのほとんどはFLEXの9.0や2.9等の以前のバージョンで、3.01とは若干構造が異なり、前回説明した手順がそのままでは適用できません。(9.0や2.9の構造は6800用のFLEX2と似ています。)
必要なバージョンV3.01はFLEXSSB.DSKの中だけにあります。
このDSK中にはFLEX.CORはありませんが、FLEX.SYSがFLEX.CORの後ろにDRIVER.BINとCONSOLE.BINをつなげた形になっているので、これらを取り除けばFLEX.CORが得られるわけです。得られたFLEX.CORにこのシステム用のDRIVER.BINとCONSOLE.BINをつなげればFLEX.SYSとなります。

具体的な手順

(以下のすべての数値は16進数表記です。)
 (1)FLEX.CORを得る 
ディレクトリ
画像1 ディレクトリ

FLEXSSB.DSKをバイナリエディタで開き、アドレス410からのディレクトリを見ると、FLEX.SYSはセクタのトラック、セクタ番号が01,0A~01,21の18セクタであることが分かります。
アドレスでは2D00~44FFですので、これをコピーして取り出してFLEX.SYS名で保存します。






画像2 FLEX.SYSの先頭部


このFLEX.SYSの最後尾を見ると、最後の2セクタが独立しているように見えます。
アドレス4300のセクタがDRIVER.BIN、4400のセクタがCONSOLE.BINです。
(DRIVER.BINが簡単なのは他の部分に実体があるからです。)
この2セクタを除いて42FFまでを取り出して保存したものがFLEX.CORとなります。


画像3 FLEX.SYSの最後尾




























(2)Driver.bin, Console.binを用意する
まず前回のページで紹介しているGitHubへ行き、Cloneordownloadボタンを押し、DownloadZIPを選択すると、6809_6800_FLEX-master.zipがダウンロードできますので、これを展開します。
この中のDRIVER.TXTとCONSOLE.TXTを同梱の6809AsmWin.exeでアセンブルするとDRIVER.BINとCONSOLE.BINが得られます。

(3)binファイルをパケット形式に変換する
得られたBINファイルはそのままではDSKファイルに入れることはできません。
「シングルボードコンピュータとFLEXシステムの詳細」(2018年5月4日公開)で述べたように、FLEXシステムではベタのBINファイルは存在できませんので、パケット形式に変換します。その方法ですが、空のDSKファイル(BLANK.DSK)を用意して、それをFlexDrvWin.exeのドライブにセットし、そこにBINファイルをドラッグ&ドロップするだけです。これで自動的にパケット形式に変換され、セクタ先頭にもセクタ情報が付加されます。

(3-1)DRIVER.BINを変換する
画像4 DRIVER.BINとCONSOLE.BIN

FlexDrvWin.exeのファイル内容表示ボックスにDRIVER.BINをドラッグ&ドロップすると
先頭アドレスを聞いてきますので、「いいえ」で抜けて、バイナリファイルのStart Adrのボックス中の値を0xDE00にセットし、もう一度ドロップします。実行アドレスは0x0000のままで良いので「はい」と答えるとDRIBER.BINが指定したアドレスからのパケット形式で保存されます。
保存したBLANK.DSKをバイナリエディタで開くと、アドレス2000からの2セクタに保存されていますので、これをコピーして取り出し、DRIVER_DSK.BIN名で保存します。









(3-2)CONSOLE.BINを変換する

画像5 CONSOLE.BINを編集

方法は上と同様なのですが、注意すべき点があります。CONSOLE.TXTを見ると分かるように、前半はD3E5からのI/Oのベクタ値の並び、後半がD370からのI/Oプログラムの実体と分かれています。これをそのままFlexDrvWin.exeに放り込むと全体がD3E5からということになってしまいます。
(画像5の上部)





別々に処理して最後に合体させる手もありますが、そうサイズも大きくないので、手作業で修正することにして、そのまま、先頭アドレスを0xD3E5に、実行アドレスを0xCD00にセットしてCONSOLE.BINを放り込みます。
(実行アドレスを指定するのは、最後尾に16,CD,00を追加させるためです。)

そして次の2箇所を変更します。(画像5下部の2箇所の赤枠部)
・ベクター部分は18バイトなので、02,D3,E5の次の57を18に変更する。
・D3,70からの24バイトの後ろに、02,D3,70,3Fを挿入する。
この1セクタ分をコピーして取り出し、CONSOLE_DSK.BIN名で保存します。

(4)FLEX.CORにDRIVER_DSK.BINとCONSOLE_DSK.BINをつなげる
新しいBLANK.DSKを用意し、FLEX.CORを2000~35FFにコピーします。
その後ろの2セクタにDRIVER_DSK.BINを、さらにその後ろの1セクタにCONSOLE_DSK.BINをコピーします。

画像6 FLEX.SYSの先頭部(左)と最後尾(右)
(5)セクタ情報を書き換える
これで全セクタが揃ったので、各セクタ先頭のセクタ情報4バイトを整理します。
アドレス2000からの各セクタの先頭4バイトを、
01,02,00,01
01,03,00,02
      ...
01,19,00,18
00,00,00,19
に書き換えます。



(6)セクタ00,03のSIR(システムインフォメーションレコード)情報を書き換える
セクタ00,03(アドレス200)のオフセット1Dからの未使用領域開始セクタを01,1Aに、オフセット21からの残りセクタ数09,E0を09,C7に書き換えます

画像7 SIR情報


(7)セクタ00,05のディレクトリ情報を書き換える
セクタ00,05(アドレス$400)のオフセット$10からの24バイトを
ファイル名(8バイト)、拡張子(3バイト)、アトリビュート(1バイト,通常00)、未使用(1バイト,00)、スタートTrk,Sct(2バイト,01,01)、エンドTrk,Sct(2バイト,01,19)、サイズ(2バイト,00,19)、2バイト(00,00)、日付(3バイト,月,日,年を2進数で) のように書き込む。

画像8 ディレクトリ


(8)最後に
以上でシステムディスクのベースが完成しました。あとは、SWTPCemuから必要なCMDファイルが入っているDSKファイルを探してFlexDrvWin.exeのドライブにセットして、システムディスクにコピーします。
例えば、COPY.CMDが入っているDSKがドライブ2に、コピーしたいCMDファイルが入っているDSKがドライブ1にセットされているとして、
  2.COPY (sp) 1 (sp) 0 (sp) .CMD (spはスペース)
でCMDファイルが全てドライブ0にコピーできます。
詳しくは、Documentationフォルダ中のTSCフォルダにあるドキュメントを参照してください。

(9)その他
・システムディスクの先頭2セクタ00,01と00,02にはBootLoaderを入れておく必要があります。ASSIST09中のFLEXコマンドは、この2セクタを読んでC100からにセットして実行を移す機能を持っています。(このBootLoaderのオフセット05,06にFLEX.SYSの先頭セクタのTrk,Sct番号が書かれています。FLEXのLINKコマンドはSYSファイルを探して、その位置をここに書き込んでいます。これによって、SYSファイルがDSK上のどこにあっても正しくBootできるわけです。)

・CC07の値00を08に書き換えておくとBSキー時に削除文字が消えてくれますので、使い勝手が良くなります。このためにFLEX.CORの先頭からのオフセット0F(アドレス200F)を08に変更します。

以上の作業に必要なBootLoaderの入ったBLANK.DSK、DRIVER_DSK.BINとCONSOLE_DSK.BINをMicrosoftのOneDriveにMakeFLEXというファイル名でアップしておきます。




2018年5月26日土曜日

ASSIST09にLoad, Saveコマンドを追加

WindowsへのLoad,Saveコマンドを追加しました


ASSIST09のLoad,Punchコマンドはテープが対象なので、実用にはなりません。
私はFLEXを常用しているので、モニターはメモリ内容を変更、確認する場合ぐらいにしか利用していなかったのですが、よく考えてみると、ファイルの単純なLoad,SaveぐらいならわざわざOSを起動しなくてもモニターのみで良いのではないかと思えてきました。


ASSIST09はコマンドの追加が簡単にできますので、Windows上にファイルをモトローラのS-formatでSave,Loadできる拡張コマンドを作ってみました。

動作のイメージ

ASSIST09側:LOAD, SAVE(拡張コマンドとして内蔵)
Windows側 :slwin.exe(あらかじめ起動しておく)

コマンド入力の様子

書式


Windows側で動作するプログラム
Saveコマンド:SAVE(ret)
その後、ファイル名、先頭アドレス、終了アドレス、実行アドレスの順に入力すると確認を求めてきますのでYを入力するとメモリの指定範囲の内容がモトローラのS-formatで保存されます。

Loadコマンド:LOAD(ret)
その後、ファイル名を入力すると保存されているファイルがもとの位置に読み込まれ、実行開始アドレスを表示して終了します。




Windows側ではコマンドプロンプト画面を開いておき、ファイルを保存したいフォルダに移動して、slwin.exeを起動します。起動オプションとしてポート番号、ボーレートと保存フォルダが指定できますので、

slwin p=4 b=38400 path

のように指定します。省略時は、ポート番号は1、ボーレートは38400boud、保存フォルダはカレントディレクトリとなります。
(slwin.exeをGitHubに上げておきます。) GitHubへのファイルの追加の仕方が分からない。。。分かりましたらアップしておきます。
(5月29日追記)追加方法が結局分からなかったので、とりあえずMicrosoftのOneDriveに上げておきます。


ファイルの書式変換

モトローラのS-formatは実行アドレスが保存できるので便利なのですが、他の書式に変換したい場合もあると思います。私も、例えばROMライターにデータを送る際にはインテルのhex-formatを用いています。
私は自作のS-format, Hex-format, Binary相互間の書式変換ができるソフトCvtMotHexBin.exeを使っています。
CvtMotHexBin.exeもGitHubに上げておきます。) GitHubへのファイルの追加の仕方が分からない。。。分かりましたらアップしておきます。
(5月29日追記)追加方法が結局分からなかったので、とりあえずMicrosoftのOneDriveに上げておきます。
(5月31日追記)不具合のあるバージョンを上げてしまっていましたので、修正版に差し替えました。
































接続ケーブルを変えました

接続ケーブルを変換基板から変換ケーブルに変えました


今まで使用していたケーブルは有り合わせのもので、

使用していた変換基板
使用していた変換基板

MAX232使用のTTL-シリアル変換基板プラスUSB-シリアル変換ケーブルと、秋月電子のAE-UM232Rに自作基板を付けたものの2本でした。






使えた変換ケーブル
使えた変換ケーブル






どうも使いにくいので、ヤフオクに出ていたTTL-USB変換ケーブルを使ってみました。(送料込み2本でたった千円ほど...)












このシングルボードコンピュータで使用しているプログラムでは、RTS信号によるハードウェア制御をしているので、巷で良く見る、RTS信号ではなくDTR信号がでているケーブルは使えないはずですが、このケーブルはすんなりと使えました。
(使えたので、RTS信号が出ているのかどうかは確かめていません。。。手抜きですね)
これで、基板周りがすっきりしました。



2018年5月4日金曜日

MicroCを使う

MicroCのソース

FLEX9にはその昔、太田昌孝さんが作られた有名なMicroCという整数型のCコンパイラがありました。商品としても売られていた記憶があります。
数年前に「C言語と周辺制御」(新津靖、池上晧三 工学社)という、MicroCを使用して制御をするという本を入手してから、ぜひ使ってみたいと思っていました。

そのソースとそれ用のアセンブラが竹岡さんのサイトからダウンロードできます。
しかし、これはBSD用ですので、私が常用しているLinuxではそのままではビルドできません。

MicroCのソースをLinuxでビルドする

全体の流れ
(1)gccでmc.cをコンパイルー>mc(Linux上で動作するクロスコンパイラ)
(2)mcでmc2.cをコンパイル->c.out(クロスコンパイラで作成したアセンブルリスト)
(3)as09でc.txtをアセンブルー>mc2.o(モトローラS形式のオブジェクト)
(4)mot2binでバイナリ形式にー>mc09に名称変更し、先頭の$00~$FFは不要なので削除する(バイナリ形式の実行ファイル)

(1) mcの作成
stdio.hの宣言とバッティングする2つのファイル名を変更する。
  getline() -> getline2()
  index() -> index2()
この変更によって、make中の gcc mc.c -O mc で mcが作られるが、保存されない。
続いて、mc.c 中の printf( を全て fprintf(obuf, に変更すると、ファイル c.out に保存される。

最後に、作成したmc09とC.TXT、そしてライブラリc.txt, stdio.txt, stdio2.txt, alloc.txt, fileio.txt, fileio2.txt. scanf.txt, string.txt、そしてユーティリティuf.cをFLEXへ転送する。
(2014年当時のメモ書きを元に書いていますが、最近のUbuntu 16ではindex()はバッティングしないなど、違いがあるかもしれません...)

mc09を使う

(1)ソース作成上の注意
標準で、stdio.txt, alloc.txtをインクルードしなければならない。(ファイル名は大文字で)
また、アセンブラASMBではTABコードは別のものとみなされてしまうので、Spaceに変換しておく。さらに、行末の$0D,$0Aも$0Dのみに変換しておく。
(2)ビルド
mc09 -O1.C.OUT file.c でドライブ1にC.OUTが作られる。(C.OUT名は変更できない)
(3)アセンブル
あらかじめドライブ1にC.TXTを入れておく。
ASMB C.TXT +YLS でC.TXTのアセンブル中にC.OUTが読み込まれてアセンブルされC.binが作られる。
(4)実行
得られるC.binは$100からにロードされ、$100から実行されるファイルなので、そのまま実行できる。




基板は完成したと思ったのに

最初の基板は十分検討していなかった部分もあり、特に6802SBD基板は修正箇所が多かったのですが、今度はしっかりとテストしてから発注したので大丈夫と思っていたのですが、やってしまいました。。。

6802SBD V2基板を完成させてFLEX68を動かしながらあれこれ試していたところ、
GAMEIIIで変数がA~Mの時のみ結果がおかしいことに気づきました。
GAMEIIIのソースリストと何度も見比べてみましたが間違いはありません。

ソフトではなくハードに問題がありそうだということで、モニタに戻ってメモリーの書き込みテストをしてみると、$00~$1Fのみ正常に書き込みできません。
自作モニタでもMIKBUG2.0でも同様でした。

このエリアは内蔵RAMのうちのバッテリバックアップ可能なRAMです。
6802のREはGNDに落としてあるので、内蔵RAMでなく外部RAMがアクティブになっているはずです。でも明らかに内蔵RAMが悪さをしているような。うーん、理解できない。

試しに、未接続だったVccStanbyをVCCに接続すると正常に読み書きできるではありませんか。(datasheetにはそんなことは書いてないぞ!)


ということで、痛恨のジャンパー配線が1本必要となってしまいました。


FLEXシステムの作成方法

(1)FLEX.CORを入手する
「SWTPC emulator」でネット検索して「Evenson Consulting ServicesのSWTPC 6800/6809 Emulator」を探し、その中のDownloads/UpgradesタブからComplete Setup current versionをクリックするとSWTPCemuSetup.exeがダウンロードできます。
適当なコンピュータで実行するとSWTPCemulatorがインストールされ、その中のDisksフォルダ中にFLEX6800,FLEX6809の2つが作られ、それぞれ100近いDSKファイルが入っています。
それらのDSKファイルをバイナリエディタで開いてDirectoryを見ると、FLEXx.SYSやFLEXx.CORが見つかります。(6809の場合はFLEX9.SYS,6800ではFLEX2.SYS)

 (6月21日訂正)ご指摘を受けましたので、上記の説明文を次のように訂正します。
Downloads/UpgradesタブからFULL KitをクリックするとSWTPCFULL.zipがダウンロードできます。
このzipファイルを解凍するとSWTPCFULLフォルダ中にSWTPCemuInstallX.exeがありますので、これを実行するとProgram Filesフォルダ中にEvenson Consulting Services\SWTPCemuフォルダが作られます。この中のDisksフォルダ中にDSKファイルがあります。

(2)Driver、Console I/Oルーチンを作る
この2つのルーチンは各自のシステムに合わせて作成しなければなりません。
DriverルーチンはFLEX用Virtual Driverの作り方(4月21日)で説明しましたコマンド応答に合わせて作る必要があります。
私が使用している、この6809シングルボード用のDriverルーチンとConsole I/OルーチンをGitHubに上げておきます。

(3)FLEX.SYSを作る
最後に、CORファイルとDriver、Console I/OルーチンをFLEXのAppendコマンドでつなげば良いのですが、そもそもFLEXが動いていなければAppendコマンドは使えません。

バイナリファイルの模式図

どうすれば良いかですが、そもそもAppendコマンドは、COR, Driver, Consoleの3つのファイルのセクターを連続させているだけなので、直接、バイナリエディタでくっつけてしまえば良いのです。
エディタ上でFLEX.COR,Driver.bin,Console.binを並べて各セクターの先頭4バイトのレコード番号値を直接書き換えます。
そして、FLEX.CORの先頭セクター、最終セクター、セクター数をDirectoryに書き、SIRの情報もそれに合わせて書き換えます。




私が使用しているDriver,ConsoleルーチンをGitHubに上げておきます。














シングルボードコンピュータとFLEXシステムの詳細

[1]シングルボードコンピュータの仕様

(1)メモリーマップ
 RAMを64KB実装し、その上にMonitorとして4KBのROM,I/Oエリアとして128bytesを重ねています。
FLEXシステムは6809用ではC700からDFFFに、6800用ではA700からBFFFに位置しています。
メモリマップ
メモリマップ

(2)I/O
 I/OとしてはACIA(6850)のみですので、シリアルインターフェースが2組ということになります。それぞれのアドレスは$F0BC,BDと$F0CC,CDですが、アドレスA1をデコードしていないので、$F0BE,BFと$F0CE,CFにゴーストが現れています。
6850-1はコンソールI/Oに、6850-2はWindows上の仮想ディスクとの通信に使うことを想定しています。
通信速度は、システムクロックが1MHz(原発振は4MHz)では19200baud、2MHz(同8MHz)では38400baudです。システムクロックの4倍の原発振を13分周して6850へ供給しています。

(3)拡張ROM-1,-2
 拡張ROMはI/Oがあるために連続していませんが、6809ではASSIST09の拡張コマンドFillとTransferコマンド(インターフェース誌1982年4月号より)、そしてFLEX起動コマンドを入れています。6802ではVTL等のアプリケーション用のコンソールI/OプログラムとFLEX起動コマンドを入れています。

[2]FLEXシステムの詳細

(1)FLEXシステムの構成
FLEXシステムはFLEX.CORとDISK DRIVERとCONSOLE I/Oからなり、ユーザが作成する必要があるのはDISK DRIVERとCONSOLE I/Oの2つです。
(6800用ではCONSOLE I/OがDISK DRIVERの中に含まれる形になっています。)

(2)DISK DRIVER
DISK DRIVERは基本的にFDC(フロッピーディスクコントローラ)FD1791を使用したFDDシステムを使用する前提になっていますが、この仕様に合わせて仮想ドライブをアクセスするルーチンが必要です。

(3)CONSOLE I/O
CONSOLE I/Oは基本的にACIAによるシリアルインターフェースを使用する前提になっていますので、そのままACIAによるI/Oルーチンを作成すれば良いことになります。

(4)DISKの特徴
FLEXシステムにはFAT(ファイルアロケーションテーブル)のようなDISK全体を管理する部分はなく、全てのセクターが繋がったチェーン構造をしています。
各セクターの最初の4バイトが、次のレコードのトラック番号(1byte)、セクター番号(1byte)、レコード番号(2byte)を表しており、セクターを読むと、次に読むべきセクターが分かるようになっています。レコードの最終セクターはトラック番号とセクター番号が00になっています。
レコードの最初のトラック番号、セクター番号はディレクトリに書かれているので、ディレクトリからファイル名を検索し、見つけたらそのトラック番号とセクター番号のセクターから読み始めれば良いわけです。
このような構造から、複数のセクターをまとめて読むことができず、FLEXのDISKアクセスは遅いという評判につながったわけですが、仮想ドライブという面からみると、DISKの容量やトラック数、セクター数の制限がなく、かえって柔軟なシステムと言えるように思います。(ただ一つの制限はセクター容量が256bytesでなければならないということです。)

(5)DISKの構成
 トラック00
  セクター01, 02 Boot Loader
  セクター03   SIR(System Information Record)
                               ディスク名、最大トラック、セクターや残りセクター数など記録
  セクター05   Directory(最終セクターまで)
 トラック01    Data(最終トラックまで)

SIR
SIR(セクター03)


Directory
Directory(セクター05~)

(6)データファイルの保存形式
テキストファイルは基本的にそのままの形でディスクに保存されますが、複数のスペースが続く場合、$09+スペース数という形で圧縮されて保存されます。読み出し時には、それが展開されます。
バイナリファイルの場合はちょっと面倒です。べたのバイナリファイルは存在せず、パケット形式に変換されて保存されます。FLEXシステムデータ自身も同様です。
パケット形式 データ:$02+スタートアドレス(2bytes)+データ数(1byte )+データ列
           の繰り返し(データ数の標準値は$C4)
       実行アドレス:$16+実行アドレス(2bytes)
従って、Windowsで作成したバイナリファイルをFLEXのDSKファイルに保存するためには、あらかじめパケット形式に変換するか、あるいはHexファイルにしてFLEXに送り、FLEX上でHex->Binary変換をしなければなりません。





2018年5月2日水曜日

63C09Pを購入したつもりが...

eBayでHD63C09PとHD63B50Pを購入しました。
HD63B50Pは比較的早く届き、ほとんど発熱もせず2MHzで動作しましたので、間違いない品だと思いますが、HD63C09Pは1ヶ月過ぎても届かず、催促した挙句、40日を過ぎてようやく届いたと思ったら、表面がザラザラでいかにも怪しげで、案の定、シングルボードコンピュータに装着しても動作しません。6809EP用のアダプターに装着してセットすると動作するではありませんか。

表面の質感も悪く、刻印も薄い

偽造品が出回っているという話は以前から聞いていましたので、ショップの商品見本の写真を見て、これならと思って注文したのに、写真とは大違い。
ショップに交換を要求しましたが、今のところ返事なし。。。

以前、全くの不動品をつかまされたこともあったので、今回はEPとして動作するだけ増しかも。。。

('18.5.7追記)
ショップにクレームを入れたところ、届いたICを破壊してその写真を送れば返金するがという返事が来たので、応じることにしました。

EPとしては動作するので、破壊するのにはためらいもありましたが、表面の質感も悪いし、何よりも偽造品を承知で使用し続けるのは気持ちが良くないですよね。





2018年4月26日木曜日

修正済みの基板が届きました


最初の基板のミス等を修正した新しい基板が届きました。
前回と同じ6802用と6809用2種に加えて、6809EP用変換基板も作ってみました。
新基板(6802用と6809用RAM32KB版)
新基板(6809用RAM128KB版とEPアダプター)

EPアダプターは小さいので複数並べてV-CUTを指定してみましたが(これも初めての経験)、その通りに作ってくれて満足です。

組み立て済み
組み立て済み

回路のミスがないことを確認した後、組み立ててみましたが、無事に動作しました。











EPアダプターとUSB-シリアル変換基板を装着

EPアダプターで6809EP(私の手持ちのものはHD63C09RPとHD63C09EPですが)を動作させてみました。
回路基板は何も変更せず、アダプターを装着するだけで動作します。

EPアダプターの下部の余白部を用いてUSB-シリアル変換基板用のソケットを作って装着してみました。(画像の右端)






ということで、最初の基板のうち動作確認に使用したもの以外は不要になりましたので、もし使ってみたいという方がおられましたら、郵送料のみ負担していただければお分けしたいと思います。各基板とも2,3枚ずつあります。
(パターンカットは済んでいますが、下画像のような追加配線が必要です。)

基板修正の様子(左から6802用、6809用RAM32KB版、同128KB版)

もしご希望の方がいらっしゃいましたら、お知らせください。

2018年4月21日土曜日

FLEX用Virtual Driveの作り方

FLEX用のVirtual Driveを作るためには以下が必要です。
(1)FLEX側:FLEXシステムのDisk DriverルーチンをVirtual Driver用に修正。
(2)Windows側:FLEXからのコマンドを受信して、それに応じてセクターデータをRead,Writeするプログラム。

(1)FLEXシステムのDriverルーチンは6809用FLEX9の場合、READ,WRITE,VERIFY,RESTORE,DRIVE,CHKRDY,QUICK,INIT,WARM,SEEK
の9つからなりますが、重要なのはREAD,WRITEの2つです。その概念図を示します。
READルーチン
READルーチン


つまり、FLEXからREAD,WRITEのためのコマンド文字列を送ることで、それに応じてWindows側ではVirtual DriveにセットされているDSKファイル中のセクターが読まれてデータが戻ってくる、あるいはデータがセクターに記録されるというように動作します。
その他のルーチンは、Windows側だけで処理できます。
WRITEルーチン
WRITEルーチン









(2)Windows側のプログラムは、基本的には受信したコマンド中のドライブ番号、トラック番号、セクター番号に応じて該当のセクターを読み書きするだけで良いのです。

しかし、これだけではWindowsとのデータやプログラムのやり取りができず、実用的ではないので、別にWindows上で仮想ディスクファイルに対してdrag&drop等でファイルのやり取りをする専用のプログラムを作成して使用していました。
これを作るためにはFLEXのFMS(ファイルマネージメントシステム)とほぼ同様のものを実装する必要があり、試行錯誤しながら作成したので、まだ完全な段階ではありませんが、一応、動作しています。(これを作成するにあたっては、「ひっそりX1」さんのX1用のプログラムCPMforX1DiskExplorerのアイディアを参考にさせていただきました。感謝いたします。)

今回、シングルボードコンピュータを作成するにあたって、これらを統合したWindowsアプリを作成しました。それが4月16日に公開したブログに画像を載せたFlexDrvWinです。
(ブログを始めたばかりで、プログラムの公開方法がまだ分かっていません。分かり次第公開する予定です。)('18.5.3追記:GitHubに公開しました。)

2018年4月20日金曜日

6800とFLEX

6800とFLEX

私のマイコン歴は、「私だけのマイコン設計&製作」(松本吉彦著)から始まっているにもかかわらず、6800を使ったことはなく、最初から6802をずっと使い続けています。
ですので、今回の6800ボードマイコンも6802使用です。
6802SBD-W
6802SBD(32KBのRAMを2個使用)
6802SBD_V2
6802SBD_V2(修正済みです)

モニターはそれまで使っていた自作のキーボードとVRAM使用のものをACIAに変更しただけのものを使用しました。ついでにMikbug2.0も入れて、ジャンパーピンで切り替えられるようにしましたが、実際のところ、Mikbugはそう使いやすいものではありません。

6800用のFLEXもネットから入手できます。
今となっては6800でプログラムするのは苦痛でしかありませんが、マイコン初期のころの言語VTL,GAME,TL1やMicroBasic,TinyBasic(電大版など)を動かすためには必要です。(モニターだけではファイルの保存がしにくいので。)



2018年4月16日月曜日

6809シングルボードコンピュータでFLEXを走らせる


ブログ始めました。
未だに6809をいじり続けているOld68funです。

6809シングルボード

最近ネットで6809と検索するとシングルボードコンピュータがヒットし、結構盛り上がっているようです。

それに刺激されて、私もシングルボードマイコンを製作してみました。
私の場合はFLEXが動くことが必須条件であり、Windows上に仮想ドライブを構築して、
ディスクレスのFLEXシステムとすることにしました。

ちょうどFusionPCBで10cmx10cmのプリント基板5枚で送料込みで7.9ドルというキャンペーンをやっていましたので、それに合わせて、初めて使うKiCadでこのサイズ中にCPU,ACIAを2個,ROM,RAMを1又は2個とTTLを10個も押し込んで作ってみました。
KiCadの初心者で使いこなせておらず、回路の間違いもありましたが、何ヶ所かの修正で無事に動きました。

CPUは6809と6802の2種、ROMは4KB、RAMは64KB、ACIA(6850)がコンソール用と仮想ドライブ用の2個で、クロックはACIAのボーレート用と兼用するためゲートICで発振させてCPUに供給しています。ですので、8MHzの時のシステムクロックは2MHzで通信のボーレートは38400baudで4MHzの時はその半分になります。アドレスバスもデータバスもバッファリングしているので、IC数が多くなりました。

6809SBDV11
6809SBDV11(128KBのRAM使用)
6809SBD_V22
6809SBD_V22

6809SBD-W
6809SBD(32KBのRAMを2個使用)
6809SBD_V2
6809SBD_V2(修正済みのものです。以下同様)
EP_adapter
6309EPで動作させるためのアダプター

手持ちに、以前63C09 のつもりで購入した63C09RP(全てEP相当でした...)や63C09EPがありますので、EP用のアダプターも作ってみました。「6809ハンドブック」(加瀬清著)中のFF2個でE,Q信号を作成する回路をそのまま使っています。画像中にはクリスタルとICが見えますが、クロックを2倍にしてみるための実験回路で、アダプターとしては不要です。




全体構成

全体構成図
全体構成図

FLEXの起動

2個のACIAの先にUSB変換ケーブルを接続してWindowsパソコンとつなぎ、ConsoleとしてのTeraTermと、仮想ドライブ用の自作プログラムFlexDrvWinを起動します。

ASSIST9
ASSIST9が動作

リセットすると6809用のモニタプログラムASSIST9が起動します。













仮想ドライブプログラムのドライブ0には起動するシステムディスクをDrag&Dropで設定します。いくつでも設定でき、切り替えてアクティブにできます。
また、システムディスクとしては標準のDSKファイルの他にD77ファイルも使えます。
ドライブ1~3には適当なワークディスクを入れておきます。

FLEXを起動
FLEXを起動

そして、ASSIST9の拡張コマンドとして設定してあるFLEX起動コマンドでFLEXを起動します。

画像は、起動後にCATコマンドを実行してドライブ1のファイルを表示しています。









FlexDrvWin
FlexDrvWin

FlexDrvWin中右のListはFLEXがRead/Writeしているセクターを表示しています。
左のListはアクティブなディスク中のファイルを一覧表示しています。
ここでDrag&Dropによるファイルの追加や削除、名称変更ができます。
('18.5.4追記:FlexDrvWinのダウンロード先をリンクしました)









FLEXについて

私の使い方としては、Windows上の使い慣れたエディタでプログラムを作り、自作の6809用クロスアセンブラでアセンブルしてエラーが無くなったら、FlexDrvWinに放り込み、FLEX上のASMBでアセンブルして保存というスタイルです。

今まではFM77AV40SXに4MbitのROMとRAMを載せた拡張回路を接続してROM,RAMディスクとして使用しており、さらにドライブ3としてWindows上の仮想ディスクも使用していましたが、フロッピーで起動しなければならないことやWindowsとのファイル交換が不便だったりして、何とかしたいと思っていました。
このボードを作成したことで、ようやくフロッピィ―ディスクと縁が切れ、Windowsとの連携もし易くなり、とても使い勝手が良くなりました。

私のFLEXは大昔、TSC社から直接購入したもので8インチのGENERAL版でVer3.01ですが、今はネットから入手できます。また、ドキュメント、言語やユーティリティなども入手できますので、6809で遊ぶには向いていると思います。