2006年04月30日

XDISK2 6

サブルーチンの中に、引数をスタックにつんで呼び出すものがあって、
その引数としてpush afしていたところを
push ax
pushf
に置き換えていたものだから、余計にスタックにつみ過ぎで
暴走していた。

とりあえず最後のトラックまでwindows側に転送できているみたい。
転送終了のコマンドを未実装なのでディスクイメージができるまで
にはまだ至らないのだが。


今日からしばらくお休み。
posted by Shinra at 10:00| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月29日

XDISK2 5

ハングの原因は8255への連続アクセスでoutがうまくいっていなかった?
nopを適当にはさんで、サブシステムのアクティブ化/スリープはBIOSに
任せるようにしてみて、とりあえずハングは解決。

次はFDD読み込み処理を移植。
なかなか一発では動かない。やっぱりハングアップ・・・

posted by Shinra at 23:12| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月27日

自作ソフト募集(重ねて)

以前にも以下のようなお願いをしましたが、
まるっきり反応がないようなので再び書きます。
GWで実家に帰ったりする方もあるかと思いますので、
ぜひぜひご一考を。

---------------------------------------------------------------

VA-EGがだいぶ動くようになってきたので、動作確認の意味も込めて、みなさんが
当時作成された自作ソフトを公開していただけないでしょうか。
そうしていただけると、エミュレータを開発する側としても楽しみが増えて、はげ
みになります
詳細は、フォーラムの http://www.pc88.gr.jp/forum/viewtopic.php?t=37
参照してください。
---------------------------------------------------------------

posted by Shinra at 23:51| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

XDISK2 4

push af を push ax に置き換えていたが、

push ax
pushf

にしないとだめ。それでフラグがおかしくなっていた。

88側のシステム情報は送れるようになったっぽい。

次はディスクアクセス。
XDISK2はサブシステム側に独自のコードを置いている。
なので、Z80のアセンブラが必要。VectorからZASMを入手。
そのままではアセンブルが通らない箇所があったので、ソースにちょっと手を入れた。

サブシステムでFDDを制御できるようにするためには、制御権をサブシステム側に切り替えなくちゃいけないはずで、そのためのサブシステムのコマンド26h(VAのみに存在するコマンド)を実行するんだと思ってたんだけど・・・ハングしてしまった。なぜー?
posted by Shinra at 23:38| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月26日

XDISK2 3

昨日の続き。
RSの割り込みがなぜかかからなくて苦労したが、
バイトレベルの受信はできるようになった。
Broken Packet とかでるから、CRCの計算とかが間違っているぽい?
posted by Shinra at 23:52| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月25日

XDISK2 2

ちまちま移植中。
ほとんど単純作業だけど、量が多い。
めげそう。
posted by Shinra at 23:35| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月24日

XDISK2

唐突だが、

ciscさんのxdisk2.bas をV3モードに移植できないかと画策してみる。
マシン語部分のソースはあるから、Z80の命令をちまちま8086に置き換えていけば、可能は可能。なはず。
あるいは、V3モード上でZ80エミュレーション機能を使って動かすか。

posted by Shinra at 23:58| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月23日

r060423公開

現状で公開しました。
vaegtool のほうも更新しました。

M88のソースを流用させていただいたおかげで、1ヶ月弱でサブシステムの
実装をすることができました。M88の作者ciscさんに感謝です。


★r060423の注意事項★

本リリースより、新規にFDDサブシステムのROMデータが必須となります。
vaegtool r060407 以降を使用し、実機からROMデータを取得してください。

また、FDDサブシステムのZ80エミュレーションを実装したために、より大きい
CPUパワーを必要とします。これが問題となる場合は、r060325 以前と同様の
FDDサブシステムの実装(モックアップ版)を利用することが可能です。詳細は、
ヘルプの「非公開機能」を参照してください。ただし、モックアップ版の場合
は、FDDサブシステムで独自のプログラムを実行するソフト(ソーサリアン、
ファミスタ)は動作しません。

posted by Shinra at 20:03| Comment(4) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

FDサブシステム 22

FDサブシステムじゃなくて、FDDサブシステムが正しい気がしてきた(^^;

・Debug Utility の Z80レジスタ表示、メモリ表示のlock機能を実装。



posted by Shinra at 20:01| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月22日

FDサブシステム 21

・ソースの整理。特にZ80まわりで使っていない処理はばっさり。
・どこでもセーブへの対応
・Debug UtilityでZ80のレジスタ表示にあらっぽく対応済みだったのだけれど、それに裏レジスタとフラグの表示を追加

どこでもセーブへの対応の過程で、今までFDCの一部(NEVENT_xxx)が対応できていなかったことが発覚。FDDアクセス中にどこでもセーブしなければ影響ないと思うけれど・・・。

[メモ]
STATSAVE.TBLは、
・NEVENT_XXX を増やしたら、evtnumに追加
・NEVENT_XXXで呼び出されるプロシージャを追加したら、evtprocに追加
posted by Shinra at 22:29| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月19日

FDサブシステム 20 (というよりはFDC)

ソースの整理
posted by Shinra at 22:41| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月18日

FDサブシステム 19 (というよりはFDC)

今までの改造にあわせて
WRITE IDコマンドの実装を修正。
posted by Shinra at 22:31| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月16日

FDサブシステム 18 / ソーサリアン 2

WRITE DATAの処理の構造にあわせて
READ DATAの処理もリファクタリング。

・・・なぜかソーサリアンのOPが鳴るようになった!!
(つまり、リファクタリングになってないんじゃ・・・(汗))

OPの後にメニュー画面のBGMが鳴るはずだが、鳴らない。
ログを取ってみると、トラックの最終セクタまで読み出すようなREAD DATAに
ついて、読み出した後にFDCから帰るステータスがエラーになっている。
TC入力より先に、FDCの動作が(C/H/R/Nの)Rをインクリメントしてしまって、(最終セクタを越えるので)ステータスがエラーになってしまっている。「FDサブシステム 14」以降でやった改造が生きていない。

FDCからZ80にINT信号を送るときに512クロックの遅延をかけているのだが
(np2がそうなってたから)それがまずそう。遅延が大きすぎて、サブシステム側のプログラムがINTを受けて、最後のバイトを書き込んで、TCを送ったときには、FDC側はRをインクリメントしてしまっていると。

この遅延を削除してみる。
→メニュー画面のBGMも鳴るようになった!!

それでもログを見てみると、うまくいっている場合といっていない場合があるようで、エラー→リトライしている形跡がある。

最終セクタの書き込みをした後、Rをインクリメントするまでの時間を空けるようにした。最終セクタの書き込みから、Rのインクリメントまで、プリアンブル読み込み時間分の間隔があるものと仮定して。
→リトライもなくなった


これでマルチプレーンモードも実装すれば画面が表示されるはず。

そのまえに、READ DATA/WRITE DATAコマンドでやった改造を、他のコマンドにも適用する必要が・・・FDCの改造はまだまだつづく。
posted by Shinra at 20:37| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月15日

FDサブシステム 17

WRITE DATAもなんとか動くようになった。
posted by Shinra at 23:18| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月14日

FDサブシステム 16

WRITE DATAのほうも着手。
苦戦。
posted by Shinra at 23:57| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月13日

FDサブシステム 15

READ DATA の処理ななんとか動くようになった。
でも、なんかプログラムがスパゲティ化しかけている。
posted by Shinra at 22:50| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月12日

FDサブシステム 14

FDサブシステム 12 で、
TCに絡んだ修正をした。
一見動いているように見えるが、本当は不十分なはずで。

サブシステム側のプログラムは、こう。
1. FDCからセクタサイズ分読み取り
2. TC信号出力
3. FDCからリザルトステータス読み取り

今の作り(np2)だと、1がシリンダの最後のセクタだった場合に、
1完了時点でRをインクリメントして、シリンダをまたぐので、
エラーとなる。つまり、3で読み取られるステータスはエラーに
なるはず。本来は、TCが入力されているので、正常終了になるべき。


FDサブシステム 12 に書いたとおり、np2はDMAしか相手にしてなくて、
セクタの最後のバイトの読み取り時に、その直後にTCが入力されること
が「予言」されていることを前提に、最後のバイトの処理と一緒に
TCを処理している。
しかし、サブシステム側のプログラムについて、TCの入力を「予言」
することはできない。「予言」しなくても動く作りに変えないとダメ。

で、いじり始めたがうまくいかず。
起動すらしなくなってしまった(汗)
posted by Shinra at 23:21| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月11日

FDサブシステム 13

昨日までは、起動に必要最低限のところしか修正しなかったため、
今日は全体的にNon-DMAの処理を追加。
posted by Shinra at 23:54| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月10日

FDサブシステム 12 / ファミスタ, ソーサリアン

サブシステム側のプログラムは、こう。
1. FDCからセクタサイズ分読み取り
2. TC信号出力
3. FDCからリザルトステータス読み取り

np2の実装は、FDCからの読み取りのタイミングで
ディスクのデータを返却しつつ、TC信号がアクティブなら、
さらに次の読み込みに備えてリザルトステータスを用意する、
という作りになっている。(*)
なので、3でリザルトステータスを読んでいるつもりが、
3の読み込みの最初のバイトは、次のセクタの先頭バイトで、
Z80側が7バイトのリザルトステータスを読み込んだつもりになっていても、
FDC側は6バイトのリザルトステータスしか読み込まれていなくて、
もう一バイト残っているつもりでいる。
このため、FDCステータスのDIO, RQMがZ80側の期待する値とならずに
無限ループとなっていた。

(*)np2のDMAの処理では、DMAに設定したカウント分のデータの
最後のデータを読み取る直前にTCを出す(※)ようになっているため、
DMA転送モードのときはこの処理でうまくいく。
ただ、※の処理が実際とあっているのか?最後のデータを読んでから
TCを出すほうが自然だと思うんだけど・・・

FDCでTC信号受け取ったら即座にリザルトステータスを用意するように修正した。
→無事 FDDからPC-Engine起動!

ファミスタも動作するようになった。

famisuta.PNG

ソーサリアンは・・・

割り込みがかかったときにZ80がフェッチする命令というのは、VAのサブシステムの場合、可変となっている。(M88の実装だと00h(NOP)固定となっているので、VAとは違うのだろう。)
ソーサリアンはこの命令をデフォルトの7Fh(LD A,A)(テクマニによればそういうことになっている)から37h(SCF)に変更して使っている(JR NC,$ で割り込みがかかるのを待っている。)
ここを実装したところ、
ディスク読み込みはうまく言っているように見える。

ただ、画面が出ないのは当然として(マルチプレーンモード未実装だし)
音楽もならない。真っ黒でしーんとしたまま。
ソーサリアンのプログラムのつくりとして、メインプログラムは初期化を済ませたらjmp $ の無限ループで停止し、あとは全て割り込みで駆動しているように見える。jmp $の無限ループに入ったまま、なにも起きない。
サブシステム以外の問題がありそうだ。なにか期待される割り込みがかからないのか、それとも別か、・・・ほとんど見当が付かない。
音楽くらいは鳴ると期待したんだけどなぁ。

posted by Shinra at 22:43| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

2006年04月09日

FDサブシステム 11

サブシステムはNon-DMAモードでFDCを使っているのだが、
Non-DMAモードの実装が中途半端だったのが原因のひとつ。
(98はDMAモードでFDCを使うから仕方ないが。)

FDCへのTC信号が接続されていなかったのが原因の二つめ。

Non-DMAの実装に絡んでよくわからないのが、FDCからZ80に接続する割り込み信号(INT)の挙動。
INTの立ち上がりまたは立下りでZ80に割り込みがかかるのかと思っていたけれど、INTがアクティブになっていれば常にZ80に割り込みがかかる、のが正しい挙動なのかもしれない。
Z80側のプログラムは、割り込みモード0(*)で動作し、FDCに命令を出しHALT命令で割り込みを待つ、というのを繰り返す構造になっている。しかし、ここで新規に割り込みは発生しないだろうというタイミングでHALT命令を使っている箇所があり、そこでハングしていた。ということは、「INTがアクティブなら割り込みがかかる」が正しいそうに思える。M88の実装は読みきれていないけれど、そうなっているような気がする。

np2のFDC実装は、INTの立ち上がり(か立ち下り)で割り込みコントローラの処理を呼ぶ構造になっていて、INT信号線自体がアクティブが非アクティブかの管理はしていない。そこで、M88の実装を参考にし、リザルトフェーズにファイルときにINTをアクティブに、その後データの読み出しがあったら非アクティブにするように実装してみた。

これでちょっと前進。(ハングする場所がかわっただけという話も。)

(*)割り込みモード0: 割り込みが発生すると、CPUがデバイスから命令1バイトを読み込んで、その命令を実行するモード。8086の割り込みのスタイル(割り込み番号を読み取って、ジャンプテーブルにしたがってジャンプ)しか知らなかったから、こんな発想もあるんだー、へー、って感じ。




posted by Shinra at 23:10| Comment(0) | TrackBack(0) | EMU | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。