iP6 改造日記 9 [Windy's room]


TOP > PC-6001のお部屋 > iP6 改造日記 9

下から上へ 並んでいます。
注意 初めての方は、このページの下のほうから読んでください。

Rel.4.7 をリリース

2004年 2月12日

ついに、Rel.4.7 をリリースしてしまいました。(汗) 今回は、鬼のように変更が多いのですが、どうでしょうか?

FM音源が遅い・・。

2004年 2月

これは、YM-2203のステータスを読めるようにしたときに、BUSYも返すようにしました。 BUSYを何回か返してから、最終的に、READYを返します。

しかし、このBUSYを返す回数がいじり倒しているうちに、100回にしてしまっていました。(汗) その結果、FM音源が遅くなってしまっていました。(汗) うーん。なさけない話です。 というわけで、この回数を減らしたら、通常の速度になってくれました。

音の長さが長くなったり、短くなったり

2004年 2月

Windows版で、音の長さが長くなったり、短くなったりしてしまう不具合がありました。(汗) これは、ステータスバーの更新回数が 多すぎたのが原因だったようです。(汗)

というか、Windows版の描画処理は、激重いです。なんとかしなければ・・。(汗)

SDL版

2004年 1月11日

ちなみに、SDL版ですが、残念ながらまだまだ公開できるようにはなってないです。(汗) まず、キーボードですが、まだ正しく入力できないキーがあります。

SDLは、英語キーボード向けになっているらしく、日本語キーボードだと問題があるようですが、よく分かっていません。(汗)

それから、メニューも設定ダイアログも無いので、実行中に 設定をいじれません・・。これが一番の問題です。(汗)

メニューと設定ダイアログ、これからどうするかだけど・・。 出来れば、SDLの周辺ライブラリでなんとかならないかな?とか考えています。(^^;;

SDL版の音楽

2004年 1月11日

SDL版の音楽がおかしかった件がだいぶよくなりました。 めっちゃうれしいです。 まだ、プチノイズが載っているようですが、とりあえずは、こんなものでしょう。(^^;

これ、何が悪かったかというと、CALLBACKで音をミキシングするんだけど、何故か、前半しかデータが格納されてなくて、残りは0が続くといういつものパターンでした。(^^;; だから、そのまま再生すると、酷い雑音が鳴っていたのです。

もしかすると、fm.cpp でステレオからモノラルにしているから、データが半分になっているからかも知れませんが・・。

あと、波形を作るスレッドと、音をミキシングするCALLBACK関数と、セマフォで同期を取るようにしたことです。 今までは、これがなかったので、次の音の充填時間はわかるんだけど、いつ波形を作るのかがまったく不明だったので、適当にウエイトを入れたり、リングバッファでごまかそうとしたりしていました。<おいおい

セマフォって、もっと難しいかと思っていましたが、意外とすんなりいきました。 それにしても、SDL版の音ですが、Windowsと、FreeBSDでちゃんと鳴るようになったのはうれしいです。環境依存コードはないはずなので、もしかすると、他の環境でも、動くかも? というのは、淡い期待ですが・・。

次は、キークリック音を出せるようにしたいところですが・・。 今は、波形を作っていない瞬間が有りますので、どうしても鳴ったり、ノイズったりしてしまいます。(汗)

ステータスバー

2004年 1月

ステータスバーを表示するようにしたのですが、画面の更新回数は、エミュレータの画面の更新回数と同じでした。(汗)だから、重かったようです。(汗)

ステータスバーの画面を作るところで、画面を更新するようにしたので、幾分軽くなったと思いますが・・。

これ以上軽くするためには、やはり256色カラーにしないといけないのでしょうか?

UIを変更

2004年 1月3日

設定ダイアログが、オール英語だったので、日本語に置き換えていました。 まぁ私自身、必要性を感じてなかったのですが、 やはり、日本語のほうが直感的に伝わりますね。(^^;

あと、メニューもかえていました。Viewメニューは、設定ダイアログでも出来るので、 一旦廃止しました。(汗) ちょっと不便になってしまいましたが・・。ごてごてと、メニューばかりあってもねぇ・・。 というわけでして・。 ただ、問題なのは、Full Screenをどこに入れるかだけど・・。(汗)

それから、設定ダイアログのプログラム部分もかえていました。 AUTORADIOBUTTON は、設定したいところだけにSETすればいいみたいです。(^^; まぁ、考えてみれば、あたりまえのようだけど・・。 これで、関連個所のプログラムが、ちょっと短くなります。

ただし、メニューの文言は英語のままです(__) よろしくおねがいします。

文字の表示

2004年 1月3日

あけましておめでとうございます。 今年もよろしくお願いします。

ところで、N60 BASICのフォントを使って、自由に画面上に書きたくなってきました。(^^; これを使うと何がいいかというと、プラットフォームに依存しない文字表示が出来るんです。

たとえば、画面上で、設定画面を表示させて、設定できるようにするとか。 デバッガの表示をするとか・・。 画面上で、ROMが読めないよ、エラーを表示するとか・・。

あ、そういえば、N60 のCGROMが無い状態で、どうやって、ROMが読めないエラーを出すんだろう?(謎)

ただし、あくまで N60 BASIC の文字なので、半角英数字と、ひらがな、カタカナ、一部の記号に限られてしまいますけどねぇ〜。(^^;; ちなみに、なぜN60 BASICかというと、N60 BASICのCGROMはどの機種にも含まれるからです。

ちなみに、今のところRefresh.c は、エミュレータのメインの画面にしか描画できないことになっています。 うーん。やっぱり、それ以外の画面にも表示させたいよねぇ・・。 とか考えているんですが・・。(^^;;

LDIR/LDDR 命令の自己書き換え

2003年 12月 31日

さて問題です。 Z80 CPUのLDIR命令(メモリのブロック転送命令)でメモリ転送中に、 もしも、DEレジスタ(転送先アドレス)が、PCレジスタ(つまり、LDIR命令 自体)に達してしまい、 まだまだ転送すべきデータが残っていた場合、どうなるでしょうか?

ちなみに、そのまま上書きしていくと、LDIR命令以降のメモリが 大きく書き換えられしまうので、暴走する確率が非常に高くなります。(汗)

  1. 何事も無かったかのように、そのまま上書きしていく。
  2. その時点で、LDIR命令の実行を中断して、次の命令の実行に移る。

答えは2番の様です。これ発見したときは、正直 すごい!と思ってしまいました。(^^;; へぇ〜。Z80って、こういう動作するんだぁ・・。って、 でも、まだ、実際のZ80 CPUでは試してませんが・・。(汗)

ちなみに、iP6 Plus では、1番の動作をしてしまっていました。(汗)

それにしても、こういうプログラムは普通書いてはいけません。 プログラム上のミス。つまりバグですからねぇ〜〜。

ちなみに、最近のCPUでは、命令の自己書き換えというのは 物理的に起こらないので、こういうことはないんですが・。(^^;;

あと、上記の問題は、チョップリフターというゲームに存在しました。

表明はほどほどに

2003年 12月 某日

一時期、不可思議な現象に陥っていました。(汗) 何かというと、一見普通に動いているんだけど、Tape->Open や Disk->Open を選ぶと、固まってしまいます。(汗) 他の人は、ウインドウが出た時点で、固まったり、Tape->Open で固まったり、全然問題が無かったりしていました。(汗)

これも、雲をつかむような話ですが、前のバージョンとのdiffをとってみて、 変更点を一戸筒検証していくと、そんなに問題になりそうな変更点はないんですよねぇ〜。 これも、結構時間が掛かりましたが、やっとわかりました。

つまり、assertマクロの中で、関数を呼んでいたのがもともとの発端です。#define NDEBUG でassertを無効にしたら、その関数も呼ばれなくなってしまいました。(汗) そのために、こういうに陥っていたようです。(汗)

assert って、無効にしたらその中のコードは、評価されなくなるんですね。それに、副作用のあるコードは書いてはいけないようです。うーん。知りませんでした。 久しぶりにドジってしまいましたが、非常に勉強になりました。(^^;;

Win9x 環境で音が鳴らないバグ

2003年 12月 某日

音源にスレッドを追加した過程で、 Win9x 環境で音が鳴らないバグが生まれていましたが、修正しました。Win9x では、スレッドを生成する、CreateThread の最後のパラメータは、NULL はだめみたいですねぇ〜。(汗) なんか変なの。という感じですが。(^^;

再起動の必要性を減らす

2003年 12月 某日

設定を変更したとに、自分で再起動するようにしました。

ディスクのアクセスランプを追加しました。

2003年 12月 某日

ディスクアクセスランプを追加しました。 といっても、まだWindowsだけですし、赤い四角が点滅するだけですが・・。 ちなみに、白い枠をつけようとして、うまくいかずに挫折しました。(汗)

これも、プラットホームフリーにしなければ・・。(汗)

2ms Timerのカウントアップ値

2003年 12月 某日

2ms Timerのカウントアップ値を変えているときに、 Configure を開いて、OKを押すと、その値が元に戻ってしまうバグを修正しました。

たとえば、ドアドアmk2などで、上記のことをすると、音楽がめちゃくちゃ速くなってしまいます。(汗)

理由は、CPUクロックによって、ベースクロックは計算しなおされるんだけど、2ms Timerの値は、ベースクロックの値がそのまま代入されていたからでした。(汗)

まず、Configure パネルで、CPUクロックが変わってなければ何もしないようにして、 変わっていたら、2ms Timer のカウントアップ値を計算するようにしました。

初回起動時に、DISKのOPENが選べてしまうバグ

2003年 12月 某日

初回起動時に、DISKのOPENは 普通選べないのですが、選べてしまうバグが有りました。

これで、DISK OPEN すると、ip6kai.iniの初回書き込み時では、ディスクが接続されていない設定で書き込まれます。なので、再起動してもDISK OPEN は選べませんし、ディスクも読みにいきません。

これは混乱のもとなので、治しました。 これは、 disk_num 変数の初期値が間違っていたからでした。(汗) まぁ、先に 何らかの設定をいじるなどして、ip6kai.ini を作成しておけば、大丈夫なんですが・・。(汗) もし、はまった方がいらっしゃいましたら、申し訳ございません。(_)

インデックスに戻る

日記8に戻る