2015年11月15日

ディスクエミュレーションバージョン

最終的にはFDD,HDD(SASI),SRAMをイメージファイルとして処理する想定ですが、
まだHDDのみエミュレーションができたばかりですが一応動作するようになりました
ので公開します。
release-F68k_DE0CVDEMU.151115.qar

使用方法ですが、まだドキュメントは作っていないのでここで説明します。
使用するメディアはSDまたはSDHCカードです。FatFsがexFATには対応していないため
SDXCには対応していないと思いますが、パーティションを切ってFat32でフォーマット
し直せば使えるかもしれません。
ASモードで.pofファイルをEPCSデバイスに書き込んだ後、データが壊れても構わない
SDカード(MicroSD)をMicroSDコネクタに挿入し、電源を投入してください。
一度電源を投入すると、FDDが接続されていない、またはFDDにディスクが入っていなければ
BIOS内のターミナルソフトが起動すると思いますが、この状態で一度電源を落とし
(プッシュスイッチのKEY0でもOK)SDカードを取り出し、PCに挿入します。
SDカードのルートディレクトリに「.config.x68」というファイルが作られていると
思います。このファイルが各ドライブに割り当てられたイメージファイル等を
指定する設定ファイルですので、このファイルを修正します。
単純なテキストファイルですのでメモ帳等で開きます。
最初4行がFDDに関する設定なので、5行目からがSASI HDDの設定です。5行目から、
ID0-UNIT0,ID0-UNIT1,ID1-UNIT0,ID1-UNIT1...とID7-UNIT1まで並びます。
5行目が最初は「0,」だけになっていると思いますので、ここを「1,HDD0.hdf」等に書き換えます。
基本的にはこれだけでいいと思いますが、既存の(エミュレータで使用している)
イメージファイルがある場合はそのファイルをSDカードのルートディレクトリに
コピーし、ファイル名を上で指定したファイル名に書き換えてください。
SRAMの標準設定がHDD=1台になっているため、5行目しか認識しないと思いますが
switch.x等でHDD台数を変更すれば2台目以降も使えます。
但し、SRAMはバッテリバックアップされないので電源を切ると忘れます。

イメージファイルがなければ読み書きをしたときに自動で作成されますので
イメージファイル自体は無くても構いません。

ファイルの準備が終わったら、SDカードをDE0-CVに戻し、電源を投入してください。
標準はFDDからのbootになりますのでHuman68kが入ったフロッピーをFDDに挿入して
OSを起動し、format.xからハードディスクの初期化→領域確保と進んでください。
NiosIIは遅いので領域確保には相当な時間がかかります。
一通りの処理が完了したら電源を切り、HDイメージファイルが出来、ファイルサイズが
確保したディスク容量と同じ位のサイズになっていることを確認してください。
以降はシステム転送していればSDカード上のイメージからbootできると思います。
posted by プー at 19:10| Comment(0) | リリース/X68k | 更新情報をチェックする

2015年11月14日

ディスクイメージエミュレーション準備版

SDカードをソフトウェアから見るとSASIドライブに見えるように
実装していましたが、ハード的にはSASIと同じアドレスに乗った
別のインターフェイスとして実装していました。
CPUバスに直接繋がっていると考えればIDEと考えればよいでしょうか。
ですが、FATファイルシステム上に保存されたディスクイメージを
SASIドライブとして使用するためにエミュレーションを書いていますが、
X68kだけでなくZet/98にもSASIデバイスとして認識させるためには
CPUバスから見た互換性ではなくSASIデバイスとして実装したほうが
共通化できると思われるため、ディスクイメージでのSASIエミュレーションは
SASIデバイスとしてエミュレーションしています。
(FDDもエミュレーションする予定ですがどのようにエミュレーションするかは
まだ未定)
SASI HDDエミュレーションはほぼ完成しましたが、SASIデバイスとして
ちゃんと動作するかの検証の為、現状のSDカードの(イメージではなく
SDカード自体をHDDとしての)コントローラをSASI I/F化し、SASI I/Fも
フル実装し、やり取りはSASIバスと同じ信号でやり取りするように実装を
変更しました。
release-F68k_DE0CV.151114.qar
一部、バスとしてやり取りが追加となるため多少のオーバーヘッドが有るかもしれませんが
SDカードはSPI通信の為もともとそんなに早くないため差は殆どないと思います。
内部でSASIと同じ信号(但し負論理のTTL双方向にする必要はないので一方向の
正論理のまま)が有るため、必要であれば(負論理にするなどして)外に出し、
SASI接続の本物のHDDや、もしかしたらSxSIを使えばSCSIデバイスも接続できるかもしれません。
ただ、今回の実装はSDカードはハードウェアのみでコントロールしていますが、
ディスクイメージでのエミュレーションはNios IIによるソフトウェア制御であり、
予想以上にNiosII/eは遅いようなので、結構遅くなるかもしれません。
SPI通信はどちらも10Mbpsで通信していますが、ハードで組むとバイト-バイト間は
数クロックで処理できるため、ほとんどSPIのクロックは連続して出続けるような
動作をしますが、イメージエミュレーションはずっとクロックが止まっていて
たまにクロックが出力される、といった感じになっています。
(SignalTapIIで確認)
とはいってもディスクイメージのほうが使いやすいと思いますし
実機よりは(触ったことがありませんが)アクセス速度は速いのではないかと
思います。

おまけの機能として、従来のものはSASI IDに対しすべてのIDに反応し、
1ドライブ当たりソフト側からは64Mbyte、ハード的にはブロックサイズが
256に変更できないメディアの場合は512byteを1セクタ(256byte)として
扱うため128Mbyte×16ドライブとしてソフト的には1Gbyte、ハード的には
2Gbyte有るものとして扱っていましたが、CSDレジスタから容量を読み取り、
128Mbyteで割った容量台数のみのドライブとしてそれ以上のIDには
反応しないようにしました。ですので容量の少ないSDカードでも正常に
使用できると思います。ただし、SDHCやXCには非対応です。これを
ハードでやろうとすると結構手間です。ソフトなら簡単なので
イメージエミュレーション時にはSDHCでも使用できます。
posted by プー at 00:58| Comment(0) | リリース/X68k | 更新情報をチェックする

2015年10月27日

やっとファイル読み書きできました

NiosII + FatFsを使ってFDD/HDDエミュレーション部を作ろうとしているのですが、
FatFsからSDカードに読み書きがなぜかうまくいきませんでした。
FatFsは他人の物だから信じられるとして、ディレクトリ読み出し、ファイル読み出しは
うまくいっているようですがファイルへの書き込みができません。
ただ、ファイル自体は作成されています。(サイズ=0)
FatFsの下位として、物理デバイスへのアクセス部分は自分で書かなくてはなりません。
初期化、セクタ読み出し、セクタ書き込み等の各ルーチンを書くのですが、
ディレクトリ表示がちゃんと出来ているという事は初期化とセクタ読み出しは
正常に動いている(筈)です。また、ファイルも一応、作成されていますので
書込みも出来ている。。。と思っていましたが、そこに間違いが有りました。
デバグでトレースするとちゃんと書き込みも出来ています。ただ、
実行するといつからかディスクステータスがメディア無しになっています。
ステータスをメディア無しに切り替えているところに片っ端からブレークポイントを
設定して実行したところ、発見しました。
SDカードに書き込み(CMD24)を発行後、データを書き込み、その後書き込みBUSY中は
SDカードは0x00を返してくるのですが、そこに読み出し1000回でタイムアウト、
メディア異常でメディア無しと判断するプログラムを書いていました。
まぁ1000回というのは100回ではちょっと少ないかな?と思って深く考えずに
1000回にしたのですが、これが短すぎたようで10,000回でも駄目でした。
結果、無限ループにして0xffが帰ったらループを抜けるようにして
ファイルへの書き込みも成功するようになりました。
posted by プー at 12:42| Comment(0) | NiosII | 更新情報をチェックする

2015年10月22日

NiosIIと格闘中

SDカードに保存されたHDDやFDDイメージを処理する為NiosIIの勉強をしています。
HDLと比べると、さすがにCPUは複雑なことがいとも簡単にできます。
画面表示の為にテキストVRAMに文字列を保存するのも、VHDLで書こうとすると
長~いステートマシーンでアドレスを変えながらデータを変えながら。。。
となりますが、CPUで動かすためにCで書けばわずか数行です。
さすがにアセンブラで書けばVHDL並みに長いプログラムになるのかもしれませんが。

それよりも、ペースが上がったように感じるのはコンパイル速度です。
FPGA版X68kソースのコンパイルには7分位ですが、Cのコンパイルは
まだまだ小さいプログラムだからかもしれませんが1分位で完了します。

ただ、もうすぐ2歳になる娘が僕の部屋に来てキーボードを
ポチポチ押しに来るのです。それでなかなか思ったように進みません。。。
posted by プー at 17:49| Comment(0) | 雑記 | 更新情報をチェックする

2015年10月06日

ファイルシステム化

X68000版ではSDカードをSASI HDDに見えるようにコーディングしています。
PC-88版ではSDカードは一切使いません。
どちらもFDDは実FDD(AT用3.5"を想定)を使用します。
ですが、FDDをそのままDE0やDE0-CVに接続することは出来ないので
40pinコネクタからFDDケーブルに変換する作業が必要になります。
(正確にはFDD信号はオープンコレクタなのでプルアップ抵抗も必要)
変換自体は至極簡単な結線なので蛇の目のユニバーサル基板でも出来ます
(僕もユニバーサル基板です)が、それも面倒くさい人もいるでしょうし、
今更FDDも持ってない、FDメディアですら入手困難、USB-FDDではDITTが使えない
等、FDDを使わなくても良い方法も考えなくてはなりません。

えすび さんの所のP6つくろうブログ
ではSDカード上にファイルで保存されたディスクイメージをドライブ等にエミュレーションする
ようで、それをFPGA内の別のZ80で処理しているようですが、同じように
やってみたいと前から考えていました。
ですが、ファイルシステムを扱おうとするとアセンブラでファイルシステムを
書ける自信が無いのでCで書かれたFatFs 汎用FATファイルシステム モジュールとかを使おうとすると
少しZ80では荷が重そう。というよりコンパイラ自体が無いし、有ったとしても
どうやってリロケータブルにしたら良いかも良く分からないので、別のコアで何とか、
と考えていました。が、良く考えたらAlteraにはNios IIが有ります。メインCPUが
Z80で表に見えない縁の下の力持ちを32bit RISCコアにやらせるというのも少し
ちぐはぐな気もしますが、使用するリソースも少ないようなので少し勉強したいと
思います。
DE0版PC-88ではもう殆ど空きリソースが無いのでDE0-CV版PC-88と、
DE0-CV版X68000なら空きリソース的には入りそうな気がします。
SDカードスロットは1個しかないのでX68000のSASI HDDもディスクイメージ化する
事になるでしょうか。
問題は画面とキーボードで、ディスクイメージ選択に必要になると思いますが
PC-88版は以前に書いた通りテキスト画面周りは別に設計した物に
コンバータで変換してフォーマットを合わせるエミュレーション方式をとっており、
8801側から制御されるVRAMとNiosII側から制御されるVRAMの2組のVRAMを切り替えれば
簡単に選択画面は対応できると思います。
問題はX68000版で、まずキャラクタベースのテキスト画面を持っていないので
キャラクタベースのテキスト画面を用意しなくてはなりません。フォントも
boot用Flash/SDRAMにしかありませんので専用に準備が必要です。
同期信号等のタイミング生成回路だけ共有して全く別のキャラクタテキスト画面を
別に作って切り替えるのが手っ取り早いでしょうか。
キーボードはPC-88版はIOポートに見えるように変換回路内にキーボードI/Fが
組み込まれており、X68000版は受信した信号をテーブルで置き換えて
MFPのUARTアドレスの所で読み書きできるようにしていますがどちらもキーボード関連
回路の一部としてPS/2インターフェイスが組み込まれてしまっており、それを
本体CPU側とNios側で切り替えて使うというのは一筋縄にはいかないと思います。
手っ取り早い方法はキーボードを使わず、ボード上のプッシュスイッチで
ポチポチ選択する方法ですが操作性は悪そうです。
posted by プー at 20:31| Comment(4) | SDカード | 更新情報をチェックする

2015年09月30日

X68k修正版

X68kの修正です。
release-F68k_DE0CV.150930.qar
今回の修正は:
・メモリのリードキャッシュを4ブロックから8ブロックに増加
・テキスト画面のアクセスマスク・グラフィック画面の16色モードのバグフィックス
です。
リードキャッシュに関しては、DE0-CVの内蔵SRAMにはかなり余裕があり、キャッシュミスヒット
によるペナルティを低減させるために容量を増やしてみました。
また、内部信号を配列化し、ブロック数の増減が簡単にできるようにしています。
使用するブロックも、使用履歴が古いものから更新するようにしました。

アクセスマスクや4bitカラーに関しては、これらはReadModifyWriteを行っており、
この処理のバグフィックスです。ただ、1ワード(1byteでも)の書き換えに
キャッシュヒットしても4CPUクロック、同時アクセスが有効の場合は×プレーン数
だけのクロック数が必要です。キャッシュ回路はもっと高速に動作可能なのですが
デュアルポートRAMのCPU側回路で処理しているためCPUクロック単位での
動作になっています。
ko-windowの画面にゴミが出ていたのが綺麗になっています。
表示されるEPS値もキャッシュの増強で4割程度増えています。続きを読む
posted by プー at 19:02| Comment(0) | リリース/X68k | 更新情報をチェックする

2015年09月27日

FDC修正版

X68kもPC-88もFDCのソースは共通ですのでPC-88版の最新版も公開します。
DE0版:release-de0-150927.qar
DE0-CV版:release-de0cv.150927.qar
残念ながら、1chip版はエリア優先でコンパイルすれば収まるのですが、バランス・スピード優先では
FPGAに収まらなくなってしまいました。
もともと1chipで使用しているCycloneデバイスでは速度的にギリギリで動いていたところもあり、
エリア優先では起動できないことを確認しましたのでリリースは見送ることとします。
posted by プー at 10:56| Comment(0) | リリース | 更新情報をチェックする

FDC・キャッシュ周りを修正しました

BIOSコードの中で一部、FDCにScanEqualコマンドを発行している部分が
有りました。今まで、PC-88含みScan系コマンドは使用していないようだったので
実装していませんでしたが正常に動作させるために実装してみました。
ただ、実際にはScan系もC-phaseとR-phaseは書かれており、E-phaseが
無かっただけだったのですが、実はScanEqualのcommandを間違えており、
正しくは"10001"なのですが、"10010"とコーディングされていました。そのため
"10001"コマンドに対してIgnoreCommandとしてST0に0x80を返していました。
もしかしたらこの部分を正しいcommand番号に修正するだけで(比較自体はしませんが)
プログラムは動くようになったかもしれません。
また、従来は512B×2ブロックをSDRAMのリードキャッシュに割り当てていましたが、
キャッシュの効きを改善するために4ブロックに増やしました。現時点では4ブロックを
順番に切り替えるだけなのですが、追々使用頻度の低いものから切り替えていくように
変えようと思っています。ライトキャッシュは大きくする必要はなさそうなので
2ブロックのままです。
release-F68k_DE0CV.150927.qar
posted by プー at 10:50| Comment(0) | リリース/X68k | 更新情報をチェックする