下から上へ 並んでいます。
注意 初めての方は、このページの下のほうから読んでください。
ついに、Rel.4.7 をリリースしてしまいました。(汗) 今回は、鬼のように変更が多いのですが、どうでしょうか?
これは、YM-2203のステータスを読めるようにしたときに、BUSYも返すようにしました。 BUSYを何回か返してから、最終的に、READYを返します。
しかし、このBUSYを返す回数がいじり倒しているうちに、100回にしてしまっていました。(汗) その結果、FM音源が遅くなってしまっていました。(汗) うーん。なさけない話です。 というわけで、この回数を減らしたら、通常の速度になってくれました。
Windows版で、音の長さが長くなったり、短くなったりしてしまう不具合がありました。(汗) これは、ステータスバーの更新回数が 多すぎたのが原因だったようです。(汗)
というか、Windows版の描画処理は、激重いです。なんとかしなければ・・。(汗)
ちなみに、SDL版ですが、残念ながらまだまだ公開できるようにはなってないです。(汗) まず、キーボードですが、まだ正しく入力できないキーがあります。
SDLは、英語キーボード向けになっているらしく、日本語キーボードだと問題があるようですが、よく分かっていません。(汗)
それから、メニューも設定ダイアログも無いので、実行中に 設定をいじれません・・。これが一番の問題です。(汗)
メニューと設定ダイアログ、これからどうするかだけど・・。 出来れば、SDLの周辺ライブラリでなんとかならないかな?とか考えています。(^^;;
SDL版の音楽がおかしかった件がだいぶよくなりました。 めっちゃうれしいです。 まだ、プチノイズが載っているようですが、とりあえずは、こんなものでしょう。(^^;
これ、何が悪かったかというと、CALLBACKで音をミキシングするんだけど、何故か、前半しかデータが格納されてなくて、残りは0が続くといういつものパターンでした。(^^;; だから、そのまま再生すると、酷い雑音が鳴っていたのです。
もしかすると、fm.cpp でステレオからモノラルにしているから、データが半分になっているからかも知れませんが・・。
あと、波形を作るスレッドと、音をミキシングするCALLBACK関数と、セマフォで同期を取るようにしたことです。 今までは、これがなかったので、次の音の充填時間はわかるんだけど、いつ波形を作るのかがまったく不明だったので、適当にウエイトを入れたり、リングバッファでごまかそうとしたりしていました。<おいおい
セマフォって、もっと難しいかと思っていましたが、意外とすんなりいきました。 それにしても、SDL版の音ですが、Windowsと、FreeBSDでちゃんと鳴るようになったのはうれしいです。環境依存コードはないはずなので、もしかすると、他の環境でも、動くかも? というのは、淡い期待ですが・・。
次は、キークリック音を出せるようにしたいところですが・・。 今は、波形を作っていない瞬間が有りますので、どうしても鳴ったり、ノイズったりしてしまいます。(汗)
ステータスバーを表示するようにしたのですが、画面の更新回数は、エミュレータの画面の更新回数と同じでした。(汗)だから、重かったようです。(汗)
ステータスバーの画面を作るところで、画面を更新するようにしたので、幾分軽くなったと思いますが・・。
これ以上軽くするためには、やはり256色カラーにしないといけないのでしょうか?
設定ダイアログが、オール英語だったので、日本語に置き換えていました。 まぁ私自身、必要性を感じてなかったのですが、 やはり、日本語のほうが直感的に伝わりますね。(^^;
あと、メニューもかえていました。Viewメニューは、設定ダイアログでも出来るので、 一旦廃止しました。(汗) ちょっと不便になってしまいましたが・・。ごてごてと、メニューばかりあってもねぇ・・。 というわけでして・。 ただ、問題なのは、Full Screenをどこに入れるかだけど・・。(汗)
それから、設定ダイアログのプログラム部分もかえていました。 AUTORADIOBUTTON は、設定したいところだけにSETすればいいみたいです。(^^; まぁ、考えてみれば、あたりまえのようだけど・・。 これで、関連個所のプログラムが、ちょっと短くなります。
ただし、メニューの文言は英語のままです(__) よろしくおねがいします。
あけましておめでとうございます。 今年もよろしくお願いします。
ところで、N60 BASICのフォントを使って、自由に画面上に書きたくなってきました。(^^; これを使うと何がいいかというと、プラットフォームに依存しない文字表示が出来るんです。
たとえば、画面上で、設定画面を表示させて、設定できるようにするとか。 デバッガの表示をするとか・・。 画面上で、ROMが読めないよ、エラーを表示するとか・・。
あ、そういえば、N60 のCGROMが無い状態で、どうやって、ROMが読めないエラーを出すんだろう?(謎)
ただし、あくまで N60 BASIC の文字なので、半角英数字と、ひらがな、カタカナ、一部の記号に限られてしまいますけどねぇ〜。(^^;; ちなみに、なぜN60 BASICかというと、N60 BASICのCGROMはどの機種にも含まれるからです。
ちなみに、今のところRefresh.c は、エミュレータのメインの画面にしか描画できないことになっています。 うーん。やっぱり、それ以外の画面にも表示させたいよねぇ・・。 とか考えているんですが・・。(^^;;
さて問題です。 Z80 CPUのLDIR命令(メモリのブロック転送命令)でメモリ転送中に、 もしも、DEレジスタ(転送先アドレス)が、PCレジスタ(つまり、LDIR命令 自体)に達してしまい、 まだまだ転送すべきデータが残っていた場合、どうなるでしょうか?
ちなみに、そのまま上書きしていくと、LDIR命令以降のメモリが 大きく書き換えられしまうので、暴走する確率が非常に高くなります。(汗)
答えは2番の様です。これ発見したときは、正直 すごい!と思ってしまいました。(^^;; へぇ〜。Z80って、こういう動作するんだぁ・・。って、 でも、まだ、実際のZ80 CPUでは試してませんが・・。(汗)
ちなみに、iP6 Plus では、1番の動作をしてしまっていました。(汗)
それにしても、こういうプログラムは普通書いてはいけません。 プログラム上のミス。つまりバグですからねぇ〜〜。
ちなみに、最近のCPUでは、命令の自己書き換えというのは 物理的に起こらないので、こういうことはないんですが・。(^^;;
あと、上記の問題は、チョップリフターというゲームに存在しました。
一時期、不可思議な現象に陥っていました。(汗) 何かというと、一見普通に動いているんだけど、Tape->Open や Disk->Open を選ぶと、固まってしまいます。(汗) 他の人は、ウインドウが出た時点で、固まったり、Tape->Open で固まったり、全然問題が無かったりしていました。(汗)
これも、雲をつかむような話ですが、前のバージョンとのdiffをとってみて、 変更点を一戸筒検証していくと、そんなに問題になりそうな変更点はないんですよねぇ〜。 これも、結構時間が掛かりましたが、やっとわかりました。
つまり、assertマクロの中で、関数を呼んでいたのがもともとの発端です。#define NDEBUG でassertを無効にしたら、その関数も呼ばれなくなってしまいました。(汗) そのために、こういうに陥っていたようです。(汗)
assert って、無効にしたらその中のコードは、評価されなくなるんですね。それに、副作用のあるコードは書いてはいけないようです。うーん。知りませんでした。 久しぶりにドジってしまいましたが、非常に勉強になりました。(^^;;
音源にスレッドを追加した過程で、 Win9x 環境で音が鳴らないバグが生まれていましたが、修正しました。Win9x では、スレッドを生成する、CreateThread の最後のパラメータは、NULL はだめみたいですねぇ〜。(汗) なんか変なの。という感じですが。(^^;
設定を変更したとに、自分で再起動するようにしました。
ディスクアクセスランプを追加しました。 といっても、まだWindowsだけですし、赤い四角が点滅するだけですが・・。 ちなみに、白い枠をつけようとして、うまくいかずに挫折しました。(汗)
これも、プラットホームフリーにしなければ・・。(汗)
2ms Timerのカウントアップ値を変えているときに、 Configure を開いて、OKを押すと、その値が元に戻ってしまうバグを修正しました。
たとえば、ドアドアmk2などで、上記のことをすると、音楽がめちゃくちゃ速くなってしまいます。(汗)
理由は、CPUクロックによって、ベースクロックは計算しなおされるんだけど、2ms Timerの値は、ベースクロックの値がそのまま代入されていたからでした。(汗)
まず、Configure パネルで、CPUクロックが変わってなければ何もしないようにして、 変わっていたら、2ms Timer のカウントアップ値を計算するようにしました。
初回起動時に、DISKのOPENは 普通選べないのですが、選べてしまうバグが有りました。
これで、DISK OPEN すると、ip6kai.iniの初回書き込み時では、ディスクが接続されていない設定で書き込まれます。なので、再起動してもDISK OPEN は選べませんし、ディスクも読みにいきません。
これは混乱のもとなので、治しました。 これは、 disk_num 変数の初期値が間違っていたからでした。(汗) まぁ、先に 何らかの設定をいじるなどして、ip6kai.ini を作成しておけば、大丈夫なんですが・・。(汗) もし、はまった方がいらっしゃいましたら、申し訳ございません。(_)