開発メモ(思索ログ): へっぽこプログラマは日々こんなこと考えながらエミュ開発してます(笑) 2002/12/24 お仕事が一杯火を噴いていてしまって長らく放置プレイになってましたが、冬コミ 前日のMZオフで何かしらデモをしたいので作業再開。 この間に、retropc.netの宴会でEmuZ-2000さんやまるくんさんにお会いするなど色々 刺激的なことがあったりしまして。 ・・・あー、まだまともに動作するものを公開できていないのに、MZ関係者のふりを かましてしまって申し訳ないです。 最近〜今日までやった作業としては、 ・EmuZ-2000さんからお借りした辞書ボードからROMを吸出す ・たごさんのDIM2DDを実験 ・CPUコアの作り直し たごさんのDIM2DDで吸出し&書き戻しして、以下のディスクが実機で動作。 ・M25-BASIC (V1, V2) ・ムーンチャイルド ・RoboWres2001 ムーンチャイルドは2トラック目が読み込み失敗したけど、書き戻せば動作した。 RoboWres2001はかなり読み込めないトラックがあったけど、動作。でもディスク アクセス音がおかしい(実ディスクでもだけど) 九玉伝も読み込めないトラックあり、ブートできないけど、実ディスクでブート してから書き戻したディスクに交換することで、以後動作可能。 エキサイトバイクやReBirthは、殆ど全てのセクタが読み込み失敗。んー。 #吸出しにはPC-9821Rv20 + Celeron500MHzを使用。 #丁度ファイルサーバを退役したところだったので。 CPUコアは、boyaさんのJAVAクラスの構造を生かしつつ、各命令のコードはMAMEの Z80コアのものに置き換え。 取り敢えず従来同様にIPLが動作してSys Loaderが1段階読み込めるところまでは 動作できるように。 但し、レジスタの8/16bitアクセスを簡単にできるように、レジスタの定義を多少 工夫している。 BYTE regs[12]; WORD* reg16; reg16 = (WORD*)regs; #define AF reg16[0] #define BC reg16[1] #define DE reg16[2] #define HL reg16[3] #define IX reg16[4] #define IY reg16[5] #define _F regs[0] #define _A regs[1] #define _C regs[2] #define _B regs[3] #define _E regs[4] #define _D regs[5] #define _L regs[6] #define _H regs[7] #define _XL regs[8] #define _XH regs[9] #define _YL regs[10] #define _YH regs[11] こんな感じで、BYTEの配列に8bitなレジスタの値を入れて、これに16bitのポインタで 無理やり16bitなレジスタとしてアクセスできるようにしている。 うわひでえ(爆 まあCPUコア自体はこれで動作するようになった筈。 隠しフラグなんかの挙動も、あれだけMAMEで実証されているんだから大丈夫の筈。 でもSys Loaderが途中で止まる。 やっぱFDCの実装が拙いんだろうなあ。ふくいさんの、EmuZ-2000のFDCのコードを 参考にして、一から実装しなおそうかなあ。D88サポートしていることだし。 M25-BASICがブートできるようになったら、CRTCも作り直しの予定。 今のままだとキャラクタ/グラフィックの優先順位の切り替えが出来ないし、 スクロール周りの実装も無駄が多い。 でもブートできない問題とは関係ないので後回し。 あと、今までデバッグでないと画面にごみが出るという問題があったけど、何時の 間にかリリースでも大丈夫になってた。 これからはリリースでコンパイルして動作確認することにしよう。 2002/12/28- 結局ブートしそうにもないので、MZオフ参加は断念して帰省。 ふくいさんのMB8876コアをそのままクラス化してみたものの、相変わらず1段階目 までブートしたところで止まってしまう。 結局、ふくいさんのコード構造をベースにして、個々のコマンドの処理やフラグの 挙動についてはPIさんのXM7のMB8877コアの処理を追加していくという形に。 相変わらず起動はしないけど、一通りデータをロードしてモータを止めるところ まではちゃんと動作している模様。 FDC自体はこれで問題ない・・・のかな、多分。 タイプ1コマンドや、タイプ2コマンドでセクタ不一致の場合も、一瞬はBUSYを 見せることが重要らしい。これはEXCITE BIKEのブートプロセスを辿っていて納得。 まだブートはしないけど、D88に対応できたのが嬉しい。 ・・・あー。今はまだ許可いただいてないんですが、公開前には必ず確認します。 書き忘れ。 ディスク吸出しは取り敢えずciscさんのdittを使ってます。 EXCITE BIKEは書き戻したものも起動できることを確認済みです。 九玉伝は相変わらずダメだけど。 2003/1/1 あけましておめでとうございます。 今年も上の続きで恒例の年越しコンパイルをしてました(笑) 現在のステータスとしては、ディスクを読み込むところまではいいけど、その後 別の個所で暴走またはフリーズしている模様。 ECXITE BIKEでは、ディスク読み込みしてるルーチンからRETした先で、JRによって 無限ループに陥っている。 プロテクトに引っかかってるのかな? どういう条件のときこの無限ループに 陥るのか調査して、FDCのステータス操作に問題があれば修正するべし。 M25-BASICでは、LDIRでディスクから読み込んだデータ?を別の領域に転送中に、 何故かタイマから割り込み要求。 まだ割り込み関係の設定していないからか、0000hにジャンプして以後暴走。 ・・・明日は割り込みまわりの実装を徹底的に見直そう。 という訳でおきた。 悪さしている割込み源はタイマの模様。 実装みる限りそうおかしくもないので、取り敢えずタイマからの割り込みを無視して 様子を見る。 今度は上のLDIR周辺で暴走している。 前後でBC,HLをPUSH/POPしているんだけど、LDIR自身によってスタック領域を破壊 してしまっているらしい。勿論DEは全然別のところを指しているんだけど、メモリの 配置の都合で転送先とスタック領域が重なってしまっている。 ログとって確認。 0xc000-0xdfffの領域にPCGを割り当ててldirをしたところで死亡。 メモリ割り当て部を確認すると、8kb中の最後の2kbが正しく割り当てるようになって いなかった。あー成る程、PCGのパターンは直接ディスクから読み込んでるのか。 修正したところ、"IPL is loading Sys Loader"が一瞬表示されて、消えるように。 一応一歩前進したらしい。うらー。 ついでなので他のソフトについても色々挙動確認。 ReBirthを食わせてみたところ、Loading画面が独自だったのでキャプチャしてみる。 M25-BASICに戻って、止まってしまっている個所を解析。 どうも0BDh, 0F4hを読みにいっているところで無限ループに陥っている模様。 コードを読む限りでは、VBlank中はHBlankも立つということなのかな? でHBlank, VBlankの挙動を変えて無限ループに嵌らないようにしてみたところ・・・ うらー、まんせー、じーくかいざー、びばでもくらしー 遂に、遂にM25-BASICが起動しました!(大歓喜) 起動した直後に暴走しちゃうんですけど、これは偉大な前進だ。 ちなみに上に書いた割り込みのコメントアウトを外してたので、これをもう一度 割り込み無視にしてみたところ、画面はちゃんと出るようになった。 ただ画面が出た直後で止まってしまう。8253の実装を見直さんと・・・ どうにもうまくいかないので、MLで質問。 ついでに割り込みがペンディングするのか、またブート状態からノーマル状態に 移行するときに発生するというリセットの実装についても質問しよう。 返事待ち中に、現状で各ソフトがどこまで動くか確認。 テレフォンソフトが一番起動している風に見えるなあ。 2003/1/2 リセットはE2hに割り振られていました。 というか、自分でも覚えてないけど何時の間にか実装されてました(爆 ただ、リセットするとC6hの割込み許可フラグがリセットされるという処理が実装 されてなかった。これを追加すると、M25-BASICが起動してautorunするところ までは動作するように。 Moon Childも、オープニングが起動するところまでいってフリーズ。 割り込みの挙動についてはOh!石さんからご回答いただいたので、今日はこれを 中心に実装を進める予定。 起床後作業再開。 Z80PIOはレベルでIRQを判定しているので、キーボードの状態を更新するたびに、 割込み条件が成立している場合はIRQ調停ルーチンに割込み条件成立を通知、 成立していない場合は通知を取り消すようにする。 I/Oコントローラ支配下のデバイスはエッジで判定するので、割込み条件が成立した 瞬間に条件成立の通知を出す。(出された通知はIRQ発行できるまでペンディング) IRQ調停ルーチンでは、RETIやEIがCPUから発行されたり、周辺デバイスから通知を 受けたときに、優先順位が高くてIRQ許可フラグが立っている通知について、CPUに IRQを発行するとともにその通知を削除する。 という風に割込み制御部を修正。ご回答有難うございます>Oh!石さん タイマ割込みはどうにも不安定なので、志は低いけど強制的に20msecおきに割込み 条件成立を通知するようにする。 これで、Moon Childがやや画面化けを起こしつつも"HIT SPACE KEY"まで進むように なりました。 キーを押しても全然反応しないのでログを取ってみたところ、E8hに6Dhを出力して EAhを読み込んでいる。rowアドレス無効になっているからデータが来る訳がない。 むー、何か解釈が違うのかなあ。 EmuZ-2000のソースを見ると、rowアドレス無効の場合は全キー入力のANDが返る、 らしい。成る程、これでFFhじゃない場合は何かキーが押されていると判定して 各rowアドレスのスキャンを開始する訳か。 これを実装したところ、無事キー入力が出来るようになりました。 うらー、まんせー、びばでもくらしー。 折角なので、Hello, World!を表示したところとアルゴ機能を呼び出したところを キャプチャする。 ただGetKeyASyncState()を使っているので、フォーカスを失っていてもキー入力を 受け付けてしまうのはおいしくない。 これは、nesterと同様にフォーカスを失ったらエミュレーションを停止するように するのがいいかな? まあ一応曲がりなりにもブートはできるようになったので、約束どおり仮公開。 めでたい。 2003/1/3-4 昨晩は高校1年の同窓会に出席して呑みすぎて、今日の昼過ぎまで倒れてました。 何とか復活したので、気になっていたCRTCの実装を見直し。 現状はDIBSectionに直接データを書き込んでいるが、これではWin32にべったりで 移植(自分がする訳ではないけど)が大変なのと、パレットのプライオリティや 4096色パレットの実装が困難。 そこでCG、テキスト毎にパレット番号であらわした仮想画面を用意して、それを 優先順位を考慮しながら画面を生成するように変更。 優先順位はpriority[cgのパレット番号][textのパレット番号]のような配列を用意。 返り値は上に来るパレット番号とする。 この配列はF5hにアクセスするときに更新するようにする。 最終的に表示される色は、palette16[priority[cg[x,y]][text[x,y]]] または palette4096[priority[cg[x,y]][text[x,y]]] となる。 多分画面生成速度が遅くなってしまうだろうけど、まあ仕方ないか。 で、仕組みだけ作るとやっぱりCG描画も実装したくなるのが人情というもの。 スクロールとか色々な機能は取り敢えず端折って、VRAMのイメージをそのまま 描画するルーチンを組んでみる。 これだけでも、320x200x16, 320x200x256, 640x200x16, 640x400x4, 640x400x16と モードがやたら沢山あるので面倒だったり。 また320x200x256だけパレットの扱いが変わってしまうのがどうにも実装の上で 気持ち悪い。このモードの場合パレットの優先順位もどうなるのだろう? 今はテキストが優先(黒の透明判定は入れる)といった感じで実装したんだけど。 4096色パレットの切り替えはFM音源チップのレジスタ内でやっている。 また面倒なことを(苦笑) CRTC側でもFM音源のレジスタの書き込みを受け入れるようにして実装する。 あとテキスト描画部において、描画開始アドレスのマスクがおかしかったのを 修正したら、スクロールが乱れる問題が解決した。 テキストの描画範囲(SC,EC,SL,EC)も仕組みだけは用意したけど、実際に実装 してみるとなんかおかしい。 実際にどのような値が入れられるかログを取って調査してみないと。 取り敢えず今は仕組みだけ残して処理部はコメントアウトしておこう。 以上の実装をしてMoon Childのオープニングを見てみる。。。 感涙、ああ素晴らしい。(T-T) ところでM25-BASIC V2.0Bのアルゴ機能にあるカレンダー。 あれ、2000年問題に思いっきり引っかかってるのね(笑) 2003/1/4 一昨日くらいからOSの起動に失敗したりしてたんだけど、いよいよHDDがへたれて きた模様。盛大にバッドセクタが出来始めている。 明日帰省先から会社の寮に戻る予定なので、そうしたらバックアップとってHDD 交換してOSインストール大会を催そう。頼むからそれまではもってくれ。 今日はエミュレーション側の実装はひとまず置いて、メニュー周りを作成。 いつまでもboot.d88から起動というのもアレですんで。 また、キーボードのステータス更新を、WM_KEYDOWN, WM_KEYUPが発行されたときに 行うようにしたのと、ウィンドウがフォーカスを失っている間はエミュレーションを 停止するように仕様変更。 M25-BASICはそろそろ大体は動作するようになっているけど、まだ時々変なところで フリーズしてしまう傾向がある。再現性が無いのが気色悪くて嫌やなあ。 明後日からまた会社でドツボにはまる予定なんで、せめて連休中だけでもガスガス 作業を進めておこう。 あー、昨晩更新したつもりでアーカイブが元のままだったみたいです。 とてもごめんなさい。 2003/1/5 会社の寮に帰還。 OSの再インストールは明日にまわして、バックアップを取りつつ開発再開。 まず画面が320x200, 640x200の場合に、スキャンラインを描画するようにする。 (正確には、仮想画面の奇数行に対して書き込まないようにしただけ。) これはコンパイルオプションでいつでも変更できるようにしておく。 好き嫌いはあるだろうから、将来はオプションで切り替えられるようにしよう。 更に、移動中に考えていた方法でスクロールを実装。 各画素(8dot単位)ごとに、それがVRAMの何番地のデータが描画されるかと、横方向の dot単位スクロール量の入った配列を用意しておき、それに従って描画する。 この配列は、スクロール関連のレジスタ(BDhの0Fh〜17h)を書き換えた後はじめての 画面生成時に更新する。 これによって、描画する毎にアドレスを算出するのを省いて高速化を図ると共に、 コードの簡素化を図る。 テキストの描画範囲指定のうち、垂直方向について実装を修正。 (どうもテクニカルマニュアルの記述は200/400ラインの値が逆っぽい。) あとRead/Write Modifyや画面消去の処理が間違っていたので修正。 画面消去については、画面クリア中フラグを一応立てるようにしてみた。 しかしまだ描画範囲にお構いなくVRAMの半分または全部を消してしまっているため (一応プレーンは判定しているが)、問題があれば直す必要がある。 256色モード時に、各色のLSBを選択するレジスタがBDhとF5hでごっちゃになって いたのを修正。この間抜けめが。 ついでにBDhの18h(プレーンの選択)処理についても実装しておく・・・640x400x16の 場合はプレーンのマスクはしないのかな? 記述はないんだけど。 これで結構MoonChildのオープニングが綺麗に出るようになったっぽい。 BASIC-M25の起動画面も、起動していますの画面の背景が表示されるようになったし。 あとOh!石さんから頂いたメールで気になっていたので、試しにスキップフレーム0で BASIC-M25のリストを表示してみたら、ちゃんとスムーズスクロールしてました。 実装自体は間違ってなかったみたいなんで一安心。 しかしどうにも動作が遅くていかんなあ。 X68kのように複雑怪奇なマシンでもあれだけの速度が出ているというのに、大して 再現性が高くもないこっちがこんなに遅くちゃあかん。 一通り実装が進んだら、適当なところで高速化を図らないと。今は無駄が多いし。 640x400x4モードでちと実装ミスがあったので修正して再アップ。 30分程だけど、前のを落としてたらごめんです。 2003/1/6-10 仕事が始まると、どうにも作業が進まなくっていけないですね。 (ぼけじゃないから、つっこみ不許可>読んでる同期某SNG先生) この間にやったのは、まずグラフィック周りの実装の続き。 プレーン毎のマスク機能を実装したり、パレット0の色指定を実装したり。 ムーンチャイルドのオープニングの画面の月が青っぽくなってしまったけど これでいいのかな。 モニタが吹っ飛んだときにディスプレイケーブルを作ったんだけど、このとき RGBの配線間違っちゃって、色が変なんですよ、私の実機(苦笑) あとはタイマで使ってる8253の実装。 これが不安定で時々フリーズする元凶なのは判ってるんですよ。 大抵E6hを読みにいったところで逝っている。 でもどう修正しても、あるソフトが動けば他のソフトが止まるといった按配で。 今乗せてるのは、再現性を落としてでも安定稼動するタイプ。 これだとCP-Mが動いたりLizardが動いたりするんで、取り敢えず今晩はこれで。 ただムーンチャイルドのオープニングも、星くずばこのHWチェックも動かない。 BASIC上でtimeの値が0のままなんですわ。 8253は明後日からの3連休に期待ということで。 徹底的に再現性を高くすれば、どんなソフトでも動く筈。 でも結構色々面倒な挙動が多いチップでもあるんですよねこれ。むーむー。 ついでに、設定関係も出来るようにしたいね。 UI作るの面倒くさいから、INIファイル読み書きするようにして、設定変更は INIファイルを直接編集してもらう形式で仮実装しようかと。 あと連休中にいい加減に公式なROM吸出しソフトを整備しないとな。 メーリングリストで大チョンボしちゃったし。 (ご迷惑かけてしまって、非常に申し訳ありません。>楯岡さん) なんか海外のMZサイトでもぼちぼち紹介されはじめてるんだけど、完全に怪しい 謎の日本人扱いされてるなあ。 どこぞのサイトでは、「作者:NAZO」になってるし(笑) それもあんまりなんで、今日は作業をお休みして英語ページと英語readmeを作成。 今日はアップする予定じゃなかったんだけど、折角だから更新します。 ・・・しかしまあ、まともに動かんくせに、スクリーンショットばっかり綺麗でもう。 2003/1/11-12 メインの課題は引き続き8253の実装。 1日掛けて、相当細かいところまで作りこんだクラスを作ったんだけど、これが どうしても安定稼動してくれない。 結局のところ、IPLが行う初期化にあわせて決めうち動作するような簡易実装が 一番安定して動作すると言う、どうにも納得のいかない結論に至る。 P-CP/MやWizardlyは、E6hに常に0を返すようにしないと動作しないため、これは パッチで例外処理するようにする。 パッチの有効無効の切り替えはiniファイルで指定するようにしよう。 まだ偶にフリーズするけど、これで割と安定して使えるようになってきたかと思う。 ついでにiniファイルによる設定関係を実装。 キーマップなんかもここで変更できるようにする。 あとは実装し忘れてた、起動時にコマンドラインから受け取ったファイル名の D88ファイルを、ドライブ0に入れて起動するようにする機能も実装。 また実ファイルへのデータの書き戻しも実装。これも有効無効をiniファイルで 指定できるように。 LizardやWizardlyなど動きそうなゲームもでてきたので、そろそろFM音源も実装 しなければならないんだけど、今でさえ重たいのにこれ以上重たくするのもなあ。 OPN自体はCISCさんのコードがあるし、win32側のインターフェースはnesterの ときのを流用すればいいんだけど。うーん。 あと重要課題がプロテクト関連。 Excite Bikeとか九玉伝とかLaydockとか、プロテクトが原因で動かないっぽい ソフトが幾つかある。 CRCエラーは返すようになっているんだけど。どうすれば動くんだろう。 カセットもどうしよう。 MoonChildのために何時かは音声再生に対応しなければならないんだろうけど。 取り敢えずはプログラムが止まらないように、フラグだけ適当に変化するように 実装しておかないといけないなあ。 現在は、BASIC-M25 V1.0に付いているデモプログラムが最初にカセットの有無を チェックしてるから、それにあわせて実装しているんだけど。 ROMの吸出しプログラムは、まあ明日かな。 2003/1/13 #ここ数日、1時間に2〜3通の頻度で同じアドレスから延々とKLEZがやってきて、 #もう鬱陶しいったらありゃしない(苦笑) プロテクト関係の問題を調べてみる。 どうもEXCITE BIKEや九玉伝は、各セクタのIDフィールドのC,H,Rに出鱈目な値が 書き込まれており、このためにセクタ検索に失敗してしまっている模様。 そこで、トラック全域を通常通りサーチして、それで指定されたトラック、面、 セクタ番号に対応するセクタが見つからない場合は、C,Hを無視してR(セクタ番号) だけで再サーチするように変更する。 これによって、EXCITE BIKEが起動するようになった。 九玉伝もブートまではいっているっぽいが、別のところで止まってしまうらしい。 実機ではここで音楽が流れ出すとなると、FM音源周りか? レイドックは、相変わらず別のプロテクトに引っかかっている模様。 IDフィールドを読みにいっているところをみると、CRCの値を読んでいるのかも。 だとすると、チェッカを外さない限り対応は厳しいかなあ・・・ で、EXCITE BIKE。 なんかグラフィックが縦に潰れたように表示されてしまう。見た感じ、1ライン ずつ飛ばして描画してるみたい。 画面モードは320x200x16なんだけど、同じ画面モードを使っているBASIC-M25では 全然問題ない。んー。 でこれのチェック中に、640x200モードで描画処理にバグを見つけたので修正。 MoonChildのメニュー画面とかWizardlyのタイトル画面が間延びするのはこれのせい。 口説き方教えますもこれでだいぶ良くなったけど、やっぱり最後に塗りつぶしで おかしくなる。 これは多分640x400x4モード時におけるリードモディファイがおかしいのだろう。 九玉伝。 基本に立ち返り、I/Oのログを取ってみたところ、C8hを延々と読み込み続けている。 要は、前回に選択したFM音源のレジスタ番号を参照してたらしい。 さくっと実装したところ、無事起動するようになった。 しかしゲーム自体は操作不能状態、キーボードを読みにすら来ていない。 Z80PIOの割込みがうまくいっていないのかな? 要調査。 WIBARMはFDC周りが問題の模様。 一通りアクセスして、データレジスタとステータスレジスタを交互に参照して、 最後にモータを止めてフリーズ。 何が気に入らないのかはもう少し詳細に調べる必要があるけど後回し。 FM音源、どうすっかなあ。 どう考えても、等倍速で動かないのにM88のコアのせてもまともに鳴らないしなあ。 キーだけ見てMIDIで鳴らしちゃおうか。 2003/1/13-14 という訳で、晩飯後に試しにMIDIによる擬似音源を実装してみる。 幸い、MIDI音源の直叩きはsystem3をWin32に移植したときに経験があるので。 基本的には、SSGの分周比やFM音源のF-Numberに対して、前もってノート(音階)を 算出して配列に入れておく。 あとは、1フレーム毎に現在の分周比, F-Number, 音量, キーON/OFFの値を見て、 それが前回の値と変わっていれば、それに応じてMIDIメッセージを送るだけ。 試しにEXCITE BIKEで鳴らしてみる・・・何と言うか、確かに鳴ってるんだけど。 これは殆どギャグにしかなっていないなあ。 FM音源の方は適当なチェックソフトがない(何故か九玉伝も該当するレジスタを 叩きにこない、割り込み絡みの問題か?)ため、ちゃんと鳴るのかは不明。 まあこれでも、ALSMIDIのように音色の指定を出来るようにすればそれっぽく 聞こえるのかもしれない。 後はINIファイルで、FM/SSG毎に機能の有効無効の設定を行うようにして終り。 一発ギャグとして今晩中にアップしておこう。 MLにて、綾波(仮)のアドレス指定に関してご回答頂く。 実装には問題ないみたいだけど、やっぱ素ではBASIC-M25から認識されないのね。 ・・・あ、ROM生成ツール忘れてた(爆) すんません、また次の機会に。 PC-98x1を使用されている方は、たごさんのサイトでROM生成ツールを配布されて ますので、そちらをお試しください。 2003/1/14-15 今日はお仕事で一日中英語漬けでした。 日付が変わるちょっと前に帰宅したので、仕事中に思いついたところだけ実験。 まず問題の8253。 割込みをペンディングしないようにしたらどうなるのか? 結果。だめ。 あと、今はキーの状態の取得にGetASyncKeyState()を使っているが、これを GetKayboardState()で一括して取得するようにしたらどうなるのか。 結果。・・・めたくそ高速化しました。 30フレーム全部出てそうな感じ。 これならM88の音源コア載せても大丈夫だったね。(苦笑) まあMIDIで鳴らすのも味はあるから、一応残しておくか。 FM音源の実装は週末にでも実験してみます。 2003/1/16-17 という訳で、FM音源を実装してみる。 コア部分はCISCさんのfmgenのコードをそのまま使用。 DirectSoundとのインターフェース周りはPIさんのXM7のコードを参考にさせて頂く。 多少調整に手間取るものの、明け方に目出度く音が出るように。 イマイチ音が濁ってるのと、相変わらずFM音源を使用するソフトがまともに動作して いないためFM音源側が大丈夫なのか判らないのが気になるけど。 で次に、excite bikeの画面が潰れる問題。 高速化のため、各画素に相当するVRAMのアドレスを持たせた配列を用意しているが、 これの更新判定に問題があり、320x200モードに切り替わったのにもかかわらず、 別の画面モードのままになっていた。 なるほど、描画部分ばかり見てても気付かない訳だ(苦笑) でここで重大問題発生。 実機がディスクを読んでくれなくなりました(爆) というかアクセスすらしない。IPLは起動して画面は出るんですが。 ファンも回らなくなったところを見ると、電源の問題かな。 +5Vは問題ないけど、±12Vが出てないんだろう。 一応SHARPに修理可能か(代替電源でもいいので)確認してみる。 ダメだったら・・・どうしよ。 AT電源買ってきて自分で置き換えることもまあ可能だとは思うんだけど。 誰か実機を余らせてる方が居られましたら、暫く貸して頂けないでしょうか? #そういう事情につき、ROM吸出し方は更にペンディング。 #すみませんです。 2003/1/18-19 東京にてretropc.netの新年会。 まるくんさん、EmuZ-2000さん、EM-Zさん、私と、現在Win32環境でMZシリーズの エミュレータを開発している主要メンバーが一同に揃う。 (そう言えば、私がMZ-2500エミュレータを公開したことによって、8bitなMZは MZ-3500を除いてこれで揃ったんですよね) で4人でお話ししてみると、他のみなさんのMZシリーズへの愛情の大きさに圧倒 されてしまう訳でして。 私とMZというと、86年頃にPOPCOM読んでていつもMZ-2500の広告が載ってまして、 応用アプリのラインナップ見ても、当時(ナイコン族だけど)FM党だった私は 「なんか凄いマイコンがあるんだなー、でもいらないよなー、さてFM、FM。」 だったりしまして。 で最近になって、丁度nesterがネタ切れで一段落ついていた私は、MZ-2500の エミュレータを作りたい、ではなく、エミュレータを開発したいから、目の前に 転がってきたネタのMZ-2500でもやってみるか、と開発を開始した訳なんですが。 開発に取り掛かってみて、「あの当時にこんな凄いアーキテクチャがあったのか」 と実装するたびに感動してしまってる訳でして。 (同時にその複雑怪奇さにどう実装しようと頭かかえてしまったりもするんですが) でまあかなり歪な形ではありますが、今ではそのアーキテクチャに惚れ込んで しまった私は、今更ながら重度のMZ党な人になってしまってる訳で。 で要するに何が言いたいかといいますと。 MZ700WINのまるくんさん、 EmuZ-2000のEmuZ-2000さん、 MZ-80K/C/E/1200エミュレータのEM-Zさん、 EmuZ-2500の不肖この私、 謎の4人ユニット、チームMZ、結成。 ということで。 今年はこの4人で色々やらかします。どうかよろしく。 今日は日記だけ更新。 疲れてるので寝ます。ぐーごー。 2003/1/20-22 風邪で寝込んでます。 このままだと今週は全休になってしまいそうな気配。 頭痛が酷くて長時間難しいことを考えていられない状態です。 せめて頭が動けば開発できるものを。 あと寝込んでる間にSHARPから電話がありました。 当然保守パーツはなし、また取り敢えず動くレベルまで修理できないかという お願いについても、やはり完全な形で直せない限りは修理を受け付けられない由。 当然と言えば当然の話ですね。 無理言ってしまってすみません、検討してくださっただけでも感謝です。 #そう言えば、ここを見ている中で当時MZ事業部におられた方っていらっしゃい #ますでしょうか? よろしければメール頂けると非常に嬉しいです。 えと、本テキストは単なる開発メモなんですが、何か一部筋では日記として やや受けしてたり、また別の筋では痛いとか寒いとか言われてるみたいでして。 好評不評は置いといて、当面は最初の方針通りこのまま続けます。 2003/1/23 頭痛はやや残れど体調概ね回復。明日から仕事に戻れることになりました。 今日から戻って駄目かと聞いたら健康管理センターの先生に怒られた(苦笑) という訳で、自室で安静にしつつ作業再開。 まずタイマ周り。 以前簡略化したところを、安定性を損なわない程度に再実装。 また従来1ライン分CPUを駆動する毎にカウンタを更新していたのを、8ドット分 駆動する毎に更新するように変更。 どうもタイマ割り込みはペンディングさせない方が安定動作するらしい。 ただし九玉伝はペンディングさせないと動作しないため、オプションで指定。 カウンタ値に0を返すオプションはもう廃止してもいいかな。 これでほぼタイマ周りの問題は解決できたっぽい。 突然死の発生も大幅に抑えられたかと。 10進モードは省略してるけど、まあ使ってないみたいだしね。 次にディスクのアクセスランプの実装。 これは面倒くさいので、アクセス中は画面右下隅に赤いBOXを表示するように。 BOXのサイズはオプションで指定。 あと簡易デバッグ機能を実装。 FDCのコマンド実行ログをテキストファイルに吐き出すようにした。 またブレークポイントを指定すると、そのアドレスを実行する直前に、CPUの内部 状態のログを出力するのと、その時点の64KB分のメモリイメージを出力するように した。(動作自体はその後も続行する) EmuZ-2000さんやPIさんからソースコード送っていただいたので、それの反映も しなければならないんですが、それはちょっと保留中。 2003/1/24 レイドックのブート時にトラックリードやフォースインタラプトを使っているので、 XM7のソースを参考に実装。 と言ってもMB8876のIRQはNCなので、フォースインタラプトは単なる強制コマンド 停止機能しか付けてないんですが。 で試してみるも、やはり起動せず。IPLぐるぐる。 リードトラック時に1トラック分のデータを生成するんですが、このときCRCは 算出した値を使ってるんで、ここに不正な値を書き込んでそれを参照するタイプの プロテクトが掛かっていると対応不可です。 デバッグ機能駆使して、ユーザ側でプロテクト外して貰うしかないかなあ。 それかD88拡張して、CRCの生データも取得できるようにするか。 せっかくDITTのソースコードが公開されてることだし。・・・まあ本件は保留。 プロテクト関係は置いておいて、Back to the Futureや口説き方教えますの画面が おかしいのと、九玉伝が操作不能なのを先に対処しなければ。 #アイコンの使用許可サンクスです>まるくんさん 2003/1/25 CPU,FDCのデバッグログの内容見直し。 FDCのリードトラックにおいて、セクタのデータのCRCを入れ忘れていたのを修正。 リードアドレスにおいて、直前にヘッドがどのセクタに居たかを考慮するように。 この辺りを弄っていたところ、突然九玉伝やMoonChildの音楽が流れるように なったり、九玉伝が(画面は化けるけど)操作できるようになったり、星くず箱の タイトル画面が表示されるようになったり・・・ 何が効いたのか、もう何が何やら(苦笑) 九玉伝も、タイマIRQのペンディングは不要になったらしい。 これでソフト個別の設定は今のところ要らなくなった。 余り変わってないけど、色々動作するようになったということで公開しようか。 前回の安定性向上もあわせて、今回は非常に重要なバージョンアップになる。 そろそろソースコードの公開準備もしないといけないなあ。 ところでそろそろプリンタにも対応したいところ。 単にパラレルポートにデータ吐き出すだけならCreateFile()すればいいんだけど、 折角だからまっとうにプリンタで印刷できるようにしたい。 VC++からだとどうすればいいのかな? stdprnは使えないっぽいんだけど。 VBだったらPrinterオブジェクトで一発なんだけどなあ。 VBでDLL作ってそっちに任せてしまうのもひとつの手段ではあるな。 テキストだけだったら、PR-201系プリンタの制御コードは http://plaza17.mbn.or.jp/~chi/myprog/other/pr201.html このあたりが参考になりそう。 取り敢えず、検証用に今日にでもプリンタを買ってこよう。 安くて設置面積の小さいのがあるといいけど。 2003/1/25-26 地元の電気屋にてPIXUS 320i購入。 最安値かつ設置面積最小だったのが決め手。 どーせテキストの印刷くらいしかしないんだしね。 プリンタクラスを新造して、プリンタポート関連のI/Oを追加。 取り敢えずどんなデータが書き込まれるのか見てみる。 当たり前だけど、プリンタ選択ユーティリティで選んだタイプによって、制御 コードがちゃんと変わるようになってるのね。 今回はテキストの印刷のみサポートという前提で、PC-PR201を対象とする。 でデータを見てみると、基本的にはEUCっぽい。(但し改行コードはCR LF) 漢字については、0x80以上だとESC Kで漢字イン、ESC Hで漢字アウトして、 7bitに抑えている。これによって半角カナと共存してるのね。 また、0x80がアンダーバーにアサインされているらしい。 という訳で、制御コードの監視をしながら、漢字の場合は2バイト取得して EUC->SJISに変換して、一旦テキストファイルに印刷内容を落とすようにする。 また最後にデータを書き込んでから一定期間(今回は30フレーム)が経過したら 印刷終了と判定する。 ビジーは一瞬でも見せないとフリーズしてしまうことがあるので、データ出力後 初めてステータスを見たときはビジーとするように実装する。 例えば、BASIC-M25 V2.0BでLFILESした印刷結果がこんな感じ。 Directory of FD1:* 2 KB free. OBJ* "BASIC-M25(6Z002)"'86/06/10 14:59 OBJ* "BASIC-S25(6Z003)"'86/06/10 14:59 OBJ* "algo editor" '86/06/16 14:30 OBJ* "algo manager" '86/06/10 14:59 OBJ* "auto dialer" '86/06/10 14:59 BTX "auto-run.m25" '86/06/16 14:39 BTX "auto-run.s25" '86/06/16 14:39 OBJ* "calender" '86/06/10 14:59 OBJ* "color simulation"'86/06/10 14:59 BSD "dial" '86/06/16 14:41 OBJ* "directory" '86/06/10 14:59 BTX* "pcg エディタ.m25" '86/06/16 14:41 BTX* "pcg エディタ.s25" '86/06/16 14:42 OBJ* "CRT制御.m" '86/06/16 14:40 OBJ* "CRT制御.s" '86/06/16 14:40 BSD "RS−232C" '86/06/16 15:32 BTX* "WD変換.m25" '86/06/23 09:25 OBJ* "WD変換.obj" '86/06/16 14:52 BSD "その他の命令" '86/06/16 16:17 BSD "エラーメッセージ"'86/06/16 16:18 BSD "グラフィック命令"'86/06/17 11:55 BSD "ファイル命令" '86/06/23 14:44 BSD "モニタコマンド" '86/06/17 09:37 BSD "ユーティリティ" '86/06/17 09:40 BSD "漢字・関数" '86/06/17 09:59 BSD "基本命令" '86/06/17 10:55 OBJ "辞書ファイル.DIC"'86/06/16 15:14 OBJ* "電卓(calculator)"'86/06/10 14:59 BSD "例外処理命令" '86/06/17 11:08 BSD "礼状 Vol.1" '88/05/24 00:04 BSD "ターミネイティグ" '88/08/19 22:53 OBJ* "ファイル・コンバータ.obj" '86/06/16 14:43 BTX* "ファイル・コンバータ.s25" '86/06/16 14:43 BTX* "フォーマット&コピー.m25" '86/06/16 14:44 BTX* "フォーマット&コピー.msub"'86/06/16 14:44 OBJ* "フォーマット&コピー.obj" '86/06/16 14:45 BTX* "フォーマット&コピー.s25" '86/06/16 14:45 BTX* "フォーマット&コピー.ssub"'86/06/16 14:45 BTX* "プリンタ 選択.m25" '86/06/16 14:46 BTX* "プリンタ 選択.msub" '86/06/16 14:46 BTX* "プリンタ 選択.s25" '86/06/16 14:46 BTX* "プリンタ 選択.ssub" '86/06/16 14:47 BRD "プリンタ・データ" '86/06/16 14:48 BTX* "ユーザ辞書変更.m25"'86/06/16 14:49 OBJ* "ユーザ辞書変更.obj"'86/06/16 14:50 BTX* "ユーザ辞書コピー.m25"'86/06/16 14:50 OBJ* "ユーザ辞書コピー.obj"'86/06/16 14:51 後はこれを印刷するだけなんだけど・・・VC++でテキストファイルを印刷する というのが何気に難しいらしい。 何か面倒くさいので、VBで外部プログラムとしてテキストファイルを印刷する プログラムを組んで、そいつをCreateProcess()で呼び出すことにする。 ファイル名はコマンドラインで渡せばいいか。 将来的には、プリンタの機種依存部分は全部DLL化して、ユーザが自分で特定の プリンタ用DLLを書けるようにしたいね。 仕様を公開したら、誰かぱわふりゃーな人がイメージを扱えるようなDLLを作って くれるかもしれんし。 電波新聞のドルアーガが(多分)PCGを読み込んだ後止まってしまう件。 どうも何かしらの原因でメモリ上のプログラムが破壊されて暴走してしまっている。 メモリ管理の辺りかCPUに虫がいるのかもしれんけど・・・本件保留。 ただ電波新聞モノがみんな動かないのが気になるなあ。 この分だとゼビウスも動かないんじゃないかしら。 BASIC-M25 V1.0のデモのうち、ラスベガスのPlay Gameで画面がずれる件。 40x20(25)モード時のNo.2スクリーンの開始アドレスがずれていたので修正。 なんでこんな大ボケなミスをしていたんだ(汗) 九玉伝が折角動くようになったので、画面が乱れるのを修正するために、CG画面の 表示範囲マスクを実装する。 これで九玉伝については多分問題なく動作するようになったかと。 2003/1/27-28 私はノートマシンで開発しているため、九玉伝などテンキーを使用するゲームは 操作するのが非常にかったるい。 という訳で、ジョイスティックでキー操作をエミュレートする機能を追加。 カーソルまたはテンキー(4方向・8方向)をジョイスティックに割り当てる ことができるようにする。 またトリガ1〜4についても任意のキーに割り当てられるようにする。 後、最近使ったファイルを選択できるようにメニューを拡張。 但し必ずドライブ1にマウントされるものとする。 ついでに、最後に開いたディレクトリも保存できるようにしておこう。 これで、操作性の観点では非常に使い勝手が良くなっているかと思います。 ふと思いついたので、サウンドの更新部の処理を修正。 従来1フレーム辺り20回更新して、その都度DirectSoundのバッファの空き具合を 判定していましたが、これを1ライン毎にfmgenの方を更新して、バッファの空き 具合を判定して転送する処理は1フレームに1回だけ行うようにしました。 DirectSoundのバッファ判定の回数が減って処理も軽くなるし、CPU側からみた FM音源のステータスの更新頻度が大幅に上がっているため、音質が非常に向上して います。 これがfmgenの本当の実力なんだなあ、と。 今まで私の実装がおかしいばかりに実力を発揮させてやれなくて申し訳ない。 個人的には九玉伝や星くず箱vol.14のオープニングの曲がお気に入り。 CPUパワーに余裕がありましたら(私の場合Pentium3, 1GHzです)、Rate=44100, BufferSize=200くらいの設定で是非聴いてみてください。 IRQ関係。 Timer IRQがペンディングしないらしいのは概ね確定なんですが、I/Oコントローラ 支配下の他のIRQも同様なのではないか? ということでVBlankについてもペンディングしないようにしてみたところ、CP/Mで グラフィック画面にごみが出る問題とか星くず箱vol.14で最初に起動したときに 途中で止まる問題とかが解決したっぽい。 ただまだ検証が不十分なんで、iniファイルの方で有効無効を切り替えられるように しておく。取り敢えず暫くは様子見。 これに伴いtimerについてもirqペンディングの関係はvmクラスの方に移管。 あとは640x400x4モード時のRead/WriteModifyの挙動を修正。 ただこのモードを使っているソフトが無さげなので、余り意味はないかも。 口説き方教えますはこれかと思ったんだけど、ログとって見ると640x200x16モード 使ってたから全然関係なし。 ドルアーガがフリーズするのが気になってメモリ周りの実装をあらためて見直して みたけど、やっぱり実装ミスはない。原因は別のとこかー。 Back to the futureの画面がおかしい件も、描画部側には問題なさそう。 VRAMに書き込まれる値自体がおかしいとしか思えない。 メモリ周りの実装がおかしくないのであればRead/WriteModifyかと思ったけど、 そっちも間違いなさそう。 うむー。結構まだ問題があるなあ。 そろそろ星くず箱が動き出している。 一部収録されているソフトも多分動くものが幾つかはありそうな気配。 ただマウスをサポートしていないため操作性に難あり。 という訳で、次の目標はマウスサポート。 最初の方針ではIOCSをフックしてサポートする予定だったが、CPUに余り変な細工を 仕掛けたくないので、できればハードウェアレベルでエミュレートしたいところ。 問題はマウスの仕様が分からないこと。 シリアルマウスらしいことしか分からない。 ただマウス自体はX68kのものと同一仕様らしいんですが・・・X68kのものでも いいので通信内容の仕様をご存知の方、よろしければご教授ください。 2003/1/28-2/3 ここ数日はマウスとの格闘の日々でした。 まあ結局は動きませんでしたが(苦笑) まず最初はIOCSをフックしての実装から。 これは割とうまくいって、マウスの座標とかトリガの状況なんかもちゃんと取得 できていたんですが、あくまでIOCS内のデータの出口で細工をしているだけで、 IOCSの中までは干渉できてません。 よってそっちで管理しているマウス割り込みは全く動作しない訳で・・・没。 結局ハードウェアレベルでエミュレートするしかない訳で、Win68kやX-milleniumの ソースを参考にしてZ80SIOを実装したんですが、結局動作しませんでした。 ログをとって見ると、DTRをH, L, H, L, Hと切り替えて何かを待っていて結局 あきらめてるっぽい挙動をしてるんですが。 RTSを切り替えてくれればマウスの情報を3バイト送ってやれるんですけどねえ。 DTR→DCD直結と仮定してもみたんですが、ステータス割り込みを掛けようにも、 割り込みが許可されていない始末。 だからと言ってステータスを直に読みに来てくれる訳でもなし。 YM2203内のデータも読みに来てくれないし。 うーん、いったいどんな反応を期待しているんだろう、こいつ(苦笑) 取り敢えずこれにかまけ過ぎると他が進まないので保留。 動作もしないのにそのままにしておくと悪さしそうなので、IOのエントリーは コメントアウトして殺しておくべし。 あとはSASIの実装を途中まで。 MZ用のSASIの資料は全くないんですが、替わりにX1用の資料を発見。 それによるとI/OのアドレスはDOh-D3hとある。 MZ-2500の方もその辺のアドレスが空いており、どうも怪しい。 そういう訳で、D0h-D3hと仮定して実装開始。 SASIインターフェースの実装自体はWin68kのものを参照に。 ・・・と途中まで実装したところで、SASIインターフェース上のROMイメージが 手元にないことに気付き、動作確認のしようがないので中止(苦笑) あとはテキスト描画部を微修正。 64色モードを実装したのと、黒色の文字を不透明扱いに変更。 これで星くずばこのタイトル画面のメッセージが表示されるようになりました。 但し、黒色の文字をスキャンラインありモードで見ると、文字の一部がスキャン ラインに重なって欠けて見えてしまうため、スキャンライン無しに設定する 必要があります。 作業時間大量に投入した割に、今回改善したのはこんだけ(苦笑) ところで星くずばこですが、結構色々なゲームが動き出してます。 無茶なゲームなんかですと、 ・スタープレートは完全動作っぽい。 ・婆っちゃれーしんぐは、コースアウトするとフリーズしてしまうことがあるけど  一応動作可能。 ・Cマスターが贈るK&Rは残念ながら動作不可。 とこんな感じです。 他にも幾つかのゲームの動作を確認しています。 あとROM吸出しツールですが。 たごさんが作成された「MZ-2500 シリーズ ROM 作成テスト版」を公認ツールと させて頂きます。 DITTでも確認されたようですので、AT機な方でも安心です。 (いうまでも無いですが、要実機ですのでご注意) 動作確認、幾つか追加。 夢幻の心臓、動作可。 ホバーアタック、動作可。 Orrbit3、動作可。 殺人倶楽部、動作可。 信長の野望全国版、起動不可。 メルヘンヴェール、オープニングは聴けるけど、ゲーム開始するとフリーズ。 ゼビウス、画面モード選択後フリーズ。 マッピー、起動不可。 電波新聞ものはいまのところ全滅。 ディスクアクセスのログとる限りだと特に問題は起きてないんだけど、一体何が 気に入らないのんだろう。 まあ電波の移植モノ、たしかに移植度は高いんだろうけど、今となっては敢えて SuperMZでやる意味はないですし。 もうちょっと、MZならではのソフトを優先させたいところです。 MZならではのソフトと言われても、ムーンチャイルドと星くずばこの2つしか 思いつかないんですけどね(苦笑) そう言えば、昨日は山梨県知事選挙でした。 投票場所がちと遠かったので、雪の積もる暗い道を自転車で走ったんですが、 案の定2,3回ほどこけました。まだ脛が痛いよう(苦笑) 2003/2/3 WriteModifyのreplaceモードの動作を修正。 Back to the futureや、BASIC-M25の画面が化けていたのが直りました。 ・・・ずっと描画部分ばっか見直してたんですが、ふと思いついて見てみたら あっさり直ってしまった(苦笑) 小修正ですが、せっかくだから一応更新しておきます。 あと昨日の日記修正。 >・Cマスターが贈るK&Rは残念ながら動作不可。 メニューから実行したら、何気に動きました。 2003/02/4-7 実装できる機能は一通り実装できてしまったため、何を作業したものか・・・ 動かないソフトの大半はプロテクト絡みだし。 まだまだ不安定という問題はあるけど、それこそ一筋縄で直せるでもなし。 という訳で、ホームページの拡充を図ってみる。 動作確認リスト兼スクリーンショット集。 星くずばこのページが一部筋でやや受けしている模様(笑) 2003/2/8-9 資料を入手できたため、MZ-1E30の再実装を試みてみる。 ボード上のROMは、ROMファイルとして機能するらしい。 これは既に実装済みなのでよし。 I/Oポートは、a4h(データレジスタ)とa5h(コマンドレジスタ)の2つ。 SASI自体のコードはWinX68kのものがあったので、これをベースにI/O周りを MZにあわせて修正するとともに、フォーマットコマンドの実装や、ステータスの 変換の仕方を修正してやる。 フォーマットユーティリティがBASICからI/O直叩きで実行しているため、これの ソースコードを読めば大抵のフラグの挙動が判るため、非常に参考になった。 で、多少梃子摺ったが意外とあっさり動作してしまったらしい。 物理&理論フォーマット、システムの転送、HD1からのブート、全部OK。 多分実装としては半端なんだと思うけど、IOCSが納得してるならまあいいや。 容量は、1ドライブ10MB固定でHD1〜HD4まで。 iniファイルの方で有効にしておけば、起動時に勝手に空のHDDイメージを 作成します。 但しROMファイルとしてMZ-1E30上のROMを読み込ませる必要があり。 フォーマットやシステム転送にはユーティリティが必要です。 ・・・しかし、エミュレータだとFDDからでも十分起動は速いし。 HDDにインストールすると幸せなソフトがある訳でもないし。 サポートできても大して嬉しくないかも(苦笑) しっかしマウスより先にこっちが動くとは思わなかった。 ReBirthで手動リセットが必要な問題の小修正。 out 0e3h,03hでe2hのb1を立ててるんだけど、これでは本来ノーマル状態で リセットが掛かる訳が無い。 でも実機ではリセットが何故か掛かっている訳で。 取り敢えず、e3hに03hが出力されたら強制的にリセットを掛けるように。 ただ副作用が怖いので、iniファイルで有効無効は切り替えられるように。 #また活用研究の間違いという可能性もあり。 あとは内部的な修正が多数。 iniファイルの読み込みを各クラスで別々にやっていたのを、vmクラス内で 一括してやるようにして、config構造体にアクセスすることで各種設定を 確認するようにする。 ついでにROMイメージのパスも切り替えられるようにしておく。 この辺は、将来ソースを公開するときの準備です。 2003/2/10 降臨するのもアレですので、ここで。 日記読んでる方がどれだけいらっしゃるかは不明ですが。 私信>664氏 私が無能なのは全面的に肯定します、そりゃもう、ええ(笑) ただ私叩いても何も出ないですよ。 某A社の信者からとか、nester関連でとか、叩かれるのは慣れてますし。 叩かれたから開発中止〜なんて繊細な人でもないですし(苦笑) ただ今更MZ関連のエミュレータに興味示す方というと、失礼ながらある程度 年配の方が多いかと思ってましたので、正直意外な反応ではあります。 どちらかっていうと、偶に見かける「NESエミュレータはどれでも完璧に動くから 適当なのを選んでください」という記述の方が、元開発者としてちょっとだけ 不快だったりします。開発者の苦労、全然判ってないなーって。 えーと、ちょっとだけですよ(苦笑) 今店頭に並んでる本の中にもそういうのがありますけど。 私信2>671氏 はい、頑張ります。 私信3>672氏 本当にリードモディファイライトはこのマシン有数の鬼門ですね。 最大の鬼門は不安定の根源のIRQ関係で。 こいつがなければ、メモリマッピングもただのポインタ配列ですませられるのに、 1バイト読み書きするたびに、リードモディファイライトでないか判定する処理が 発生して速度低下に貢献してくれてます。 書き込み動作はBack to the futureの修正で、PSET, REPLACE共にこれで完全に 動作してると思いますので、後は読み込み動作ですね。 FM音源は、まあcisc師のfmgenにおんぶに抱っこですから。 私じゃ修正つらいです。 まあそれを言ったら、 エミュレータとしての骨格設計はdarren師@nesterにおんぶに抱っこだし、 sasiはけんじょ師@WinX68kにおんぶに抱っこだし、 fdcもPI.師@XM7やふくい師@EmuZ-2000におんぶに抱っこだし、 I/Oの細かいところはEmuZ-2000師におんぶに抱っこだし、 なんですが。 確かにベースは自作だけど、コンポーネントレベルでは他の方のソースを参考に させて頂いている部分が結構多いです。多謝多謝。 あー・・・ソース公開も、ぼちぼち、そろそろ。 まあ需要皆無だとは思いますけど(苦笑) 2003/2/12 休日があった割には作業進まず。 スクロール禁止領域で横方向のドットスクロールが有効になってたのを修正。 あとはダイアログの整備を多少。 更新は設定ダイアログの整備が済んでからにします。 またはエミュレーションコアの修正がある程度の規模だけ進んだら。 取り敢えず現時点のTODOを。 上に行くほどハイプライオリティ。 設定ダイアログの充実(&内部の設定関連の整理) Lizardでセーブが出来ない不具合の修正 描画周りの修正(デモのダンスが化ける問題など) ムーンチャイルドがFDDにアクセスしっぱなしの問題の修正 メルヘンヴェールがフリーズする問題の修正 マウス対応 テープレコーダ対応 起動しない類のものは大抵プロテクト関連だと思うので、FDCの再現性向上で プロテクトごと再現できるものは対応。 それ以外は、エミュレータ側でファイラー機能を実装する訳にもいかないので、 プロテクトに引っかかっているという確認だけで終わりかな。 Lizardでセーブしにいってフリーズするのは、ディスクステータスを読みにいって not readyになるのを待っていて無限ループに陥っている。 以前EmuZ-2000師から、ステータスを連続読み込みするとnot readyになるらしい、 と教えていただいていたのでそれかとも思ったけど、どうもエラーと認識した後で 無限ループに陥る処理を実行しているらしい。 セーブ周辺のコードをもうちょっとしっかり読んでみないと何とも言えない。 メルヘンヴェールは、キーのステータスを延々読んでるのは確かなんだけど、 でもキーを押しても先に進むでもなし。んー。 マウス対応はどうしたものか。 星くずばこのメニューくらいでしか使ってないんだけど、それもテンキーや ジョイスティックで代替できてる訳で。 テープレコーダはもうムーンチャイルドとデモ専用なんだけど、実テープが 入手できてないので(苦笑) 2003/2/16 一部設定をダイアログから設定できるようにしてみる。 普段GUIはVBばかり、プライベートではコンソールアプリばかりだから、 別に難しい訳ではないけど面倒くさいったらありゃしない(苦笑) まだ全部の設定を弄れる訳ではないし、サウンドやストレージ関係の設定は 一旦ソフトを立ち上げ直さないと変更が効かないのでご注意。 ・・・ユーザ層を考えると、iniファイル直書き換えでも問題なかったかも。 先日のTODOリストに追加。 PI.師から頂いたタイマのソースを反映させる。 現在のところ大きな問題にはなっていないけど、今の実装だとタイマ部分だけ 実時間に依存しているため、エミュレータ内部の時間と同期できていない。 考え方次第かもしれないけど、この現状は余りおいしくないです。 2003/2/17 ソースコード配布開始。 GPLです。 個人的にはGPL大嫌いなんですが(苦笑)、MAMEのZ80コア使ってますので。 Romeo対応とかEmuZ-2800化とか、色々弄ってみてください。 ここはこう直したほうがよいというご意見がありましたら大歓迎です。 特にエミュレーションコアに関する修正はフィードバックお願いします。 そろそろ私ではどう直せばよいか判らないことだらけでして。 2003/2/18 テグザーのスクリーンショットを下さった方より、実機と比べて画面が 暗いとのご指摘を頂きました。 確かに、はーりぃふぉっくす辺りは特に暗く感じます。 という訳で、輝度を変更できるようにしてみました。 16色パレットのうち前半が暗い色なんですが、従来は明るい色の半分の輝度に なっていましたが、これを3/4に変更できるようにしました。 具体的には、R,G,B各々5bitずつなんですが、明るいときは最大の11111なのに 対して、01111または11000を当てるようにしています。 はーりぃふぉっくす、英雄伝説サーガ、テグザーなど、妙に画面が暗いソフトが ありましたらお試しください。 (当たり前ですが、スキャンラインの有効無効でも画面の明るさは変わります) ただ明るいままだと、これはこれで他のソフトで違和感が出そうでして。 実機だとどれ位の明るさなんでしょう? 2003/2/19-25 たご氏や682氏のアドバイスに従って、モニタのモード切替に対応しました。 デジタル・アナログ、200ライン/400ラインが切り替え可能です。 デジタルモードの場合は、16色パレットの前半を後半と同じにします。 これはすぐに反映されます。 200ライン/400ラインの切り替えは一旦立ち上げなおす必要があります。 FDCの実装の見直し。 Lizardでセーブすると止まってしまうのは、何故かREAD DATAを実行したまま データも読まずにひたすらLOST DATAが発生するのを待っていたからでした。 という訳で、一定時間経過したらLOST DATAイベントが発生するようにしました。 またマルチセクタについても、従来即座に次のセクタに移動していたのを、 60sec経過してから次のセクタに移動するように修正しています。 これで、Lizardでセーブできるようになった他、メルヘンヴェールが動作する ようになっています。 その他動くようになったソフトがあるかもしれませんし、逆に動かなくなった ソフトもあるかもしれません。何かありましたらレポートお願いします。 最初はXM7のソースをそのままクラス化することで再実装を図っていまして、 リバイバーも動作するところまでいっていたのですが、エキサイトバイクが 動かなくなってしまって、それを修正しているうちにメルヘンヴェールも 動かなくなってしまい・・・と収拾が付かなくなってしまったため、結局は 元のコードに戻って仕切りなおしてました。 お陰で随分と久しぶりの更新になってしまいました。 メール処理も滞ってしまい申し訳ありません。>該当各位 忘れてたけど、テキスト画面のマスクも修正しています。 多分これで400ラインモードにしても画面下が切れることは無い筈です。>>682氏 2003/3/3 金曜に独身寮のガサ入れ(別名、火災報知器の定期検査)があった関係で、 部屋の大掃除をしました。 そうしたら思いの他スペースが出来たので、買ったまま組み立てずに放置していた PCデスクを設置したり、衣類の収納スペースを確保するため箪笥を増設したりと、 部屋の環境再構築に勤しむ週末でした。 という訳で、開発マシンはノートなのに、何故かPCデスクに置いてナチュラル キーボードとマウス繋いで作業しています。 ナチュラルキーボード、元が我流の変態タッチタイピングだったのでまだ違和感が 残りますけど、手首をひねられる感じがなくていいです。 会社でも使いたいんだけど、基本的には持ち込み禁止だからなあ・・・ そんなこんなで作業時間が余り取れなかったので、今回は小修正のみです。 まずFDCのステータスの挙動の調整。 マルチセクタアクセス時、最後のセクタまで読み込んだあと、従来はステータスに BUSYとRECNFNDを返していたのですが、これに0を返すようにしたところ、一応 Reviverが起動するようになりました。 ただ副作用もありそうなので、とりあえず設定メニューのパッチから有効無効を 切り替えられるようにしています。 あとはメニュー項目の整理。 最近使ったファイルで選んだディスクイメージは必ずドライブ1に挿入されて いましたが、これを任意のドライブに対して挿入できるようになりました。 ReBirthみたいに複数枚組のソフトを起動するにあたって割と便利になったかと。 2003/3/7-9 ちょっと体調崩してました。 社内展で疲れてたところにきて、最近の不眠症で2時間以上の連続した睡眠が 取れなかったため、1日空けて一気に来た模様。 あーうー仕事がどんどん溜まっていくー(T-T) 気を取り直して、今回はキー周りを修正。 AltキーやF10キーを押すと、メニューが有効になってしまってエミュレータ側で 入力として扱えなかった件。 これはWM_SYSKEYDOWNをWndProc()内で食い止めてやればOK。 ただ、これはやってはいけないとする資料もあるのでちょっと心配だったり。 またメニューの操作がマウス必須となってしまったのも、人によっては不満かも。 この辺はいずれ設定で切り替えられるようにする予定。 変換、無変換、半角/全角を押すとIMEが立ち上がってしまってやはり使えない件。 これはImmAssociateContext(hwnd, 0);で立ち上がらないようにする。 ImmDisableIME()というAPIを使ってもいいんだけど、これだとWin95やNT40で サポートしていないので不可。 CapsLockとカタカナ/ひらがな、半角/全角が挙動不審な件。 どうもCapsLockとカタカナ/ひらがなは、一方を押すと、他方を押すまで押しっぱなし (WM_KEYDOWNが来ない)になってしまう模様。 GetKeyboardState()で現在の状態を見ても、やはり押しっぱなし。 またキーコードも、WM_CAPITAL,WM_KANA,WM_KANJIではなく、何故か0FOh-0F3hが やってきたりと、どうにも怪しげ。 結局、キーボードの駆動は、従来のWM_KEYDOWN, WM_KEYUP駆動から、1フレーム毎に 取得するように仕様を変更。 また、WM_KEYDOWNに0F0h-0F3hが来たら、そこから3フレームだけ該当するキーが 押されているものとして扱うようにする。 これだと該当3キーを押しっぱなしに出来ないのが難点なんですが・・・ で、今まで使えなかったキーが一気に使えるようになったので、デフォルトのキー 割り当てを変更しています。 日本語キーボード前提なので、問題があったら割り当てを変更してください。 ついでに、なんちゃってフルスクリーンを実装。 最大化ボタンではなく、メニューから選択してください。 実装自体は、ChangeDisplaySettings(), SetWindowLong(), SetWindowPos()を 使った、非常にお約束なやつです。WM_ACTIVATEAPPもちゃんと監視しています。 ただ本来は画面モード列挙して、該当するモードがあればそれに変更するという 実装にすべきなんですが、640x480くらいどんなグラフィックカードでも持って いるだろうと期待して決めうちでChangeDisplaySettings()を実行しています。 グラフィックカードによっては問題があるかもしれません。 明日は、ときどき突然死してしまう問題の調査を行う予定。 IRQが不適切なタイミングで起きてしまっているのが原因のような気がするので、 その辺りのログを取って見てみます。 2003/4/7 生きてます。 病気で寝込んでいる訳でもないです。 開発も中止はしていません。 ただもうちょっと気力が回復するまで待ってください。 #お仕事の方で短納期の仕事が幾つも重なってしまってて、プライベートな #開発に回せる気力がちと不足ぎみなんです。 2003/4/14-15 別の開発案件が入ったのでそちらをやっていたら、急にこちらも弄りたくなって しまったので(苦笑) まずfmgen。 CISCさんが先日中間報告を出されていたので、これを実装。 何かfmgen.h, fmtimer.h, psg.hに #include "types.h" を追加しないとコンパイル 出来なかったんだけど、これでよかったのかしら。 Feedbackがまともになったかな、との事なんですが・・・ 私の耳では聞き比べても違いがよく判らないです。 次にfdc。 リードトラック時、作成したトラックイメージのデータフィールドの前にsync, am2が 抜けていたのを修正。 HLTがプルアップされているため、TYPE1のステータスは常にHEADENG=1となるように 修正。但し試験に出るX1によると、RESTORE時はHEADENG=0となるらしい・・・? セクターライト時、DM,DDMの書き込みを行うようにする。 多少実機の挙動に近づいたとは思うのですが、特にこれで動くようになったソフトが ある訳でもないのが何とも。もしかしたら副作用が出ているかも。 ちなみに試験に出るX1は大学時代の相方からの借り物。 結構MZ-2500でも共通する部分があるので重宝しています。 SIO周りも大体同じなんで、マウスの実装も今度見直してみます。 とてもありがとです>華和梨な方