下から上へ 並んでいます。
注意 初めての方は、このページの下のほうから読んでください。
SRの時の動作が遅いです。そういえば、SRは 表示期間中でもある程度動いている・・・らしい?ですね。それならばと、drawwaitを減らしてみました。 192から、110ぐらいにしたら、なんとなく実機に近い速さになったかも?
ちなみに、切り替え方法で悩み中だったりします。 SRのときだけ、drawwaitから80ぐらい減らすべきか、それとも新しい設定項目を作って、それで設定できるようにするべきか・・。
というわけで、204 ラインを実機で試してみました。 すごいですねぇ・・。これって、てっきり下に4ライン 継ぎ足されるとばかり思っていましたが、実際は 表示開始ラインが4ライン 上に移動するようです。(^^; だから、下の位置は変わりません。
無地の画面を表示させおいて、204ラインにすると、上に4ライン増えたようなかんじになります。(汗) うーん。ということは、上にマージンを用意しておかないといけないということですか・・。(汗) うーん・・。(^^;
という、聞きなれない新しい機種を発見・・。というのも、私のiP6 Plus のREADMEファイルに、誤植があるようです・・。(汗) すみません、もちろん、PC-6601SRのことですね・・。 とはいえ、こういう機種が有ってもいいかも?とかおもってしまいました。
ハードウエアスクロールをやりたくて、ビットマップを切り貼りしていました。本当は、DirectDrawを使って、ビデオメモリ上でやったほうが速いそうですが、まだ ソフトウエアでやっています・・。
一応、テストコードを作って・・。おお!ちゃんとスクロールしている!(^^; しかし、よくかんがえると、座標の考え方が違っていたので、それを修正して、iP6 Plusに組み込んでみました。(だから今のところ、引き算を2回やっている不細工なコードになっています。(汗))
ちなみに、スクロールで切り貼りする必要があります。もう一枚 裏画面があったほうがいいと思いますが、この時は、スクリーン上で切り貼りしていました。(汗) あまりよくないとおもいますが、なんとか動いているようです・・。(汗)
これに伴い、ビットマップの大きさも、320x200を、320x204の 204ラインに改めました。 なぜかというと、スクロール範囲は、204ラインまであるからです・・。
204ラインというのは、あまり聞きなれない数字ですが、おそらく、メモリーがちょっとだけ余っているので、それを残り4ラインにして割り当てちゃいましょう。というものだと思われます。 しかし、BASIC命令の座標系はあくまで200ラインしかないので、書き込むためには、直接VRAMを操作する必要があります。 あまり便利というわけではないと思いますが、当時は、少しでも解像度を上げたくて、その憧れがありましたらねえ・・。(^^;
確かに、ちょっとだけ得した気分がします。しかし、エミュレータ的には、かなり厄介ものであることは確かでしょう・・。(汗) というのは、下4ラインは 表示するときは表示して、消すときは、完全に消さないといけません・・。 それを怠ると、たとえば、テキスト画面の下に、グラフィックの下4ラインが顔出してしまうという、不細工な画面になってしまいます・・。(^^;;; 今は、この辺をどうするかが、焦点になっています。
ちなみに、他にもバグがあります。スクロールの切り貼りを裏画面でやってないのでスナップショットの出力は、スクロールしていない状態で出力されます・・。(汗) あと、リペイトも 一瞬、スクロールしていない状態で表示されます・・。(汗) やっぱり、裏画面をもう一枚使ったほうがいいかしら・・。(^^;;
ちなみに、204ラインになったので、他のモードでも、下4ラインが広がりました。 こうなったら、PC6001V のように、もうちょっと広げて、情報を表示する領域にしようかな?
ソースリストを大幅にいじっていたら、突然、SDL版が起動しなくなり、あせりました。(汗)
起動直後に、例外をはいて、終了してしまいます。(汗) これは、長い間 悩んでいましたが、C++Builderでデバッグする方法が分かったので、地道にシングルステップ実行すると、なんとか分かりました。(^^; なんと、色深度の変数の初期化もれだったようです・・。(汗)
うーん。いじっているうちに、SDL版も書き換えるのを忘れていたようです。(汗) Windows版と、Unix版と、SDL版なんて、3つも作っているから、だめなんですけどねぇ・ まぁ、SDL版がうまくいけば、Unix版はいじらなくてもよくなるような気もしますが・・。
ダイアログの文字を小さくする方法がわかったので、 おもいきって、設定ダイアログを変えて見ました。 今までより使いやすくなっているでしょうか? Rel.4とはかなり違っていますので、慣れるまで戸惑うかもしれません。あと、当然のことながら、増えた項目があります。
なんとなく、某エミュレータの影響を受けている・・。ような気がしますが、気のせいかも・・。(^^;
SDL (Simple Directmedia Layer)というのは、パソコン上で、グラフィックや音楽や、CDドライブや、マルチスレッドなど、ゲームに関係したものを使いたいときに、統一的に扱えるようにしてくれるレイヤーのことです。(ライブラリではないそうです) これに 完全に対応していれば、違うOSに持っていってもコンパイルしなおすだけで、そのOS上で動かすことができるという、優れものです。
もっとも、これを使っていても、システム依存の関数とかが使われていると、そのシステム依存になっちゃいますけどね。(^^;;
iP6 Plus も、SDLに対応させたくて、色々いじっていましたが、なんとか対応したようです。といっても、キー入力も出来ないし、音楽も実装していませんが・・。(汗)
そういえば、依存部分が、きれいに分離していないような・・。 うーん。もっときれいに依存部分を分離する方法って、ないでしょうか? 本来なら、依存部分のみ書き換えるだけで、すんなりコンパイルが通ってくれるのがいいんですけどねぇ・・。(^^;;
ちなみに、Makefileを統合しようとして画策していましたが、マニュアルによると、ifdef のsyntaxが違うことが発覚・・。うーん。 やっぱり、素直に Windows系と、Unix系で分けるしかないようです・・。(汗)
かなり前から要望のある、スナップショットを取れるようにしたい・・。というわけで、色々考えていましたが、結局、Webページを漁って、それを参考にしながら、取り付けてみました。最近、Windowsのプログラムは、Web上の情報源が欠かせません。(^^;
あれ?これって、約1MBも食っているじゃないですかっ! そうなんです。640x400ドットの画面で出力されたビットマップって、1MBぐらいあるんですねぇ・・。(汗) これは、ちょっと大変かも・・。
かなり無駄だし、そんなビットマップを使用していると、遅い原因にもなります。(汗)できれば、256色モードに移行したいところだけど、256色モードは私の苦手なパレットが必要になるので、どうしたものかと・・。 ゆくゆくは、考えたいと思っています。(^^;;
Unixで 音源を鳴らしたいのですが、全然鳴りませんね・・。(^^; とおもっていたんですが、なんと、/dev/dsp のオープンが失敗しているようです。(汗)
何故なら、gnomeとかだと、サウンドサーバが起動していて、それが /dev/dsp を管理しているみたいです。ということは、iP6 を起動するときは、サウンドサーバを無効にしておかないといけません・・。
それにしても、Unixでは正しく鳴りませんね・・。(汗) play"c"とすると、しばらくしてから、震えた音で、「ド」となります。(汗) 何故なんでしょう?(^^;;;
それから、fmgen って、実は WIN32 環境依存だったんですね。(汗) うーん。今まで知りませんでした・・。(汗) まぁ、ちょっとした変更ですみましたが、改変したfmgen のソースリストを公開する場合は、改変した部分を明記しないといけないようです・・。
そうなんです。もともとUnixで動作しているiP6を Win32環境に対応させるときに、Unix.cなどをコピーして作ったので、ダブっている個所があります。特に、はずかしいのが、Win32.h と Unix.hですね・・。(汗)
これは、ちゃんと解消しておきました。Win32.hの中で、Unix.hをインクルードするようになっています。 あと、EXTRN マクロをもうちょっと使ってみました。
まぁ、普通に使う分には、関係ないことでは有りますが、やっぱりちゃんとしておかなければ、いけませんね。(^^;
テープの読み込みをもっと速くする方法を見つけました。(汗)
今までは、作成された画面を、ウインドウに転送する回数を減らしただけだったんだけど、その前に行われている、画面の作成ルーチンの回数を減らした結果、劇的に速くなってくれました。
考えてみれば、あたりまえなんですけどね。おもいっきり忘れていましたね。(汗) あとは、Unixでもオプション指定できるようにしなければ・・。(^^;;
キークリック音を出したくて、サウンド関係をいじっていました。 おおまかにいうと、下記のような感じです。
あと、レジスタに変更といっても、レジスタ7しかみていません・・。 というのも、全てのレジスタにしてあると、音楽がおかしくなるからです。(汗)
しかし、ひとたびエラーをだしたりして、「ピッ」といってしまうと、それ以降、その音階で、クリック音がなってしまいます・。(^^;; うーん。なんとか鳴らないでしょうか・・。(汗)
というわけで、後日に なんとかしました。(汗) すごい!キークリック音だぁ・・。(^-^) でも、かなりトリックを使っているので、駄目ですね。通常の音楽再生のときにも、若干影響が出そうです。(汗)
割り込みアドレスの指定って、普通は、I レジスタに 例のやつを指定するんですが、SRでは、もうひとつ方法があって、割り込みベクタアドレスを、I/O PORTに 直接OUTすることで 直接指定可能なようです。(汗) あと、この機能自体の有効・無効と、DI・EIの切り替えが出来るみたいです。
う゛ーん。これって、普通の割り込みとどう違うんでしょうか?(汗) まぁ、一つ考えられるとしたら、メモリーにジャンプテーブルをおかなくても、大丈夫になる。というぐらいかなぁ・・。(^^;
一応、BASIC BIOSでは、Iレジスタと、I/O portの両方にちゃんと指定してありますので、別に実装しなくても、大丈夫な気もするけど、、 SR専用ゲームで、これを使われていると、動かない原因になりそうです。(汗)
動作原理としては、これを有効にしてあると、Iレジスタのほうは無視するんでしょうかねぇ・・。(汗)よく分からないです。(汗) しかし、DIとEIの切り替えが、面倒くさそうです・・。
SRって、本当にエミュレータ泣かせだなぁ・・。とつくづく思ったりします。(汗)
エミュレータはまだ、書き換え不可属性のディスクイメージに対応していません。 実機での動作を確かめないといけないと思い、試してみました。 ちなみに、ためしたのは、PC-6601SR の内臓FDDです。
3.5インチのノブを書き換え不可にスライドして、ディスクを挿入して、save"hoge"してみました。 「プルプルプルプル・・・・・」というFD音がして、 ??AT Error となりました。(汗)
うーん。??AT Error (Bad Allocation Table Error) といえば、FATが潰れているというエラーですが、書けないときもそうなるんですね・・。(汗) というか、読み書きに失敗したら、なんでもかんでもこのエラーが出るような気がします・。(汗)
ちなみに、ライトプロテクトのときに出るそのものずばり、??FW Error (File Write Protect Error)というのがありますが、BIOSを見てみると、どうもこれは、ディスクのIDセクタを見ているだけのようですので、今回の趣旨とはちょっと違いそう・・。
まぁ、なにわともあれ、書き換え不可属性のディスクイメージに対して、なんとなく見えてきました。 ちなみに、mk2などの外付けドライブでは、どうなるんでしょうか?
SRのゲームで、色が違うという報告を受けたので、久しぶりに実機を起こして、テストしていました。 実機では、CSS3を1にしたら、色の配列が変わるので、背景が緑になりましたが、 エミュレータでは、なんと、1にしてもそのままです。(汗)
そうです。SCREEN 2の画面描画ルーチンで、おもいっきり、CSS3を orするのを忘れていました。(汗)はずかしい限りです・・。(汗)
ただ、これより、パレットの方が問題だったりして・・。 というのも、SCREEEN 2で CSS3=1のときのパレットの動作ですが、ちょっと変わっています。 たとえば、palet 16,10 とすると、16番の橙色が変わるのを期待するんですけど、実際には13番と5番の白が、青に変わります。(汗)
なんか、パレットをかえるときは、あくまで、CSS3=0のときの色が変わるみたい。ややこしいですね。(汗) 一応、まとめてみると、下記のようになります。
ただ、エミュレータでは、32色分の色配列を確保してあって、CSS3が1のときは、後半の16色を出しているだけですから、パレットの対応するときは、ちょっと if文なんかで、上記のことをプログラムしてやる必要がありそうです・・。(汗)
あと、出来れば、SRで、モード6以外のパレット対応も やりたいですね・・。
結局、下記のようにプログラムしてやると、ドアドアmk2は ちゃんと読み込めるようには、なりました。(汗) ただ、かなり強引なんですよねぇ・・。(汗) うーん。こんなことばっかりやっているのって、本当は駄目なんですけどね。
if (((R.IFF&0x01)&& CasMode) || !CasMode)
ただし、SR未対応のドアドアmk2を、SRで動作させた場合は、この限りではありませんが・・。(汗)
ドアドアmk2のロードですが、うまくいく方法が分かりました。どうやら、2ms Timer を割り込みマスクしてなかったのが原因のようです。(汗)
/* タイマー割り込みの発生? */ if (TintClockRemain <= 0) { /*TintClockRemain += TimerInt_Clock;*/ if (R.IFF&0x01) // 割り込み許可状態か? <<この行を追加 { TintClockRemain = TimerInt_Clock; if(TimerSW && TimerSWFlag & TimerSW_F3) { TimerIntFlag = INTFLAG_REQ; IFlag=1; } } }
しかし、何故これでうまくいくのか、不明なんですが・・・。(汗) 一応、ここでマスクしなくても、割り込みは発生しないと思うんですけどねぇ・・。(汗)それとも、他のところで、影響を与えているんでしょうか? それとも、私の勘違い??
あと、2ms Timerのカウンタをどうするか?という問題があります。それをしないと、play文の音楽がまともに鳴ってくれないです。
まぁ、とにかく、今まで途中でロードに失敗していたのに、うまくいくようになったみたいです。
ただ、困ったことに、これをすると副作用があります。押したはずのキーが反応してくれないときがあるんです。かなりゆっくり打てば、大丈夫なんですが・・。うーん。どうすればいいんでしょう?
ちなみに、テープの速度は、どちらも試しました。
iP6Win Rel6のようにテープの読み込みを速くしたいので、いじっていました。 とりあえず、テープ入出力中は、CPUのウエイトを無効にして、画面描画も1秒につき1回(1fps)にしぼったところ、速くなってくれました。(^^;;
ちゃんと、取りこぼさないで読み込んでくれています。 とはいっても、iP6Win ほどじゃないんですけどねぇ・・。 テープの容量が、60KBぐらいあれば、かなり待たされます。 それでも、今までとは雲泥の差なので、結構良いかも。(汗) 今までは、実機で20分かかれば、エミュレータでも、20分ほど待たされましたから・・。(汗)
でも、高速モードだと動かない可能性も有るし、ロード中の音楽がまともに鳴らないので、メニューに組み込みました。選択可能です。 それにしても、ドアドアmk2は 高速モードでもロードに失敗しやすいです。(汗)
ちなみに、テープの読み込みは、どうやっているのかというと、テープからのデータを読み取るのは、SUB CPUが担当しています。(μPD8049)
結構複雑ですね。(汗)まぁ、今でいうところのマルチスレッドみたいなものですが、 ところで、SUB CPUが、CPUに割り込みを掛けるタイミングを速くすれば、もっと速くなるんですが、それをすると、CPUがデータを受け取る前に、割り込みを発生するので、データ落ちする可能性があります。(汗)
iP6Win Rel.6では、この辺の問題や、ドアドアmk2の問題も、克服しているみたいですね。(^^; すごいです。
音源も悩みの種でして・・。(汗) Windows 2000では、何通りかのコーディングを試したところ、どれでも大概、鳴ってくれるのですが、Windows 98では、まったく鳴らなかったり、めちゃくちゃ速かったり、速くなったり遅くなったり、おかしかったりします。(汗) うーん。やっぱり、OSごとに、動作をかえないといけないのかなぁ・・。(汗)
ちなみに、キークリック音ですが、全くならない代わりに、たまに プスっていうノイズとなってしまうのが何とも・・・。(;_; なんとかしたいですけどねぇ・・。(汗)
あと、SR以外の機械では、FM音源は無効になっていますが、SRでは、全てのモードで、FM音源を有効にしました。
ちょっと思いついたことがあります。 ソフトが動かないときに、デバッグ情報を書き出すようにしておけば、なんで止まっているのか、分かるかも知れないなぁ・・とか、あるんですが、 たとえば、CPUのレジスターの内容と、現在実行中の前後の10行ぐらいの逆アセンブルリストとか・・。 ただ、これで分かるのって、なんらの条件ループにはまりこんでいるときぐらいかな?本当に暴走していたら、あまり意味が無いかも・・。(^^;;
実はRel.4は、デバッガがついています。近々、FAQとしてまとめる予定なので、もし、我こそは!と思われる方は、よろしくお願いします。(_)
ディスク周りで、ちょっと勘違いがあったようです。(汗) MOTOJさんの解析によると、I/OのDAHは、データ転送量の指定なんですね。(^^; セクター数の指定だとおもっていました。(汗)
確かに、標準ディスクの場合は、セクター数の指定としてあっても、問題は無いのですが、特殊なフォーマットの場合は、セクターの長さが違ってくるので、 データ転送量の指定と考えないと、おかしくなってしまいます。(汗)
前から、謎だったことが、ちょっと解消しました。(^^; ありがとうございます。(_) ちなみに実装のほうは、トラックの先頭のセクターを読んでみて、データ転送量/(セクター長/100h)を、セクター数とするかな。(^^;
CPUと、SUB CPUは、通信を行いながら、並列動作しています。CPUとSUB CPUは、それぞれ、8255 の PORT Cの各ビットをオン・オフすることで、通信を行うんですが、iP6 では制御されていないので、CPUとSUB CPUの通信が不十分なようです。(汗)
普通のプログラムなら、正常に動作するんですが、ハドソンのソフトで問題があるようです。 というわけで、PC6001Vのソースを見ながら、PORT Cを制御するようにしました。
しかし、これだけでは まだダメなようですね・・。(汗) いままでなら、I/O port からの返値を こうしておけば動く・・。というだけの話でしたが、SUB CPUの状態によって、値を変化させる必要があるようです・(汗)
つまり、8255 のPORT Cを、読み出すたびに、違う値を返すということです。
うーん。これは、かなり難しそうですねぇ・・。(汗) 正しいSUB CPUの動きが分かればいいんですが・・。(^^;;
というわけで、FM音源に対応させていました。CISCさん作のfmgenという音源エミュレータに切り替えていました。
何故かと言うと、FM音源エミュレータとして、評判がよさそうだったのと、ようやく使い方が分かってきたのと、某SRエミュレータでも、fmgenを採用している・・。らしいので、対抗意識も若干あったりします。(^^;;
ざっくりと、ファイルを分割して、C言語から、C++のクラスを使えるようにします。それから、extern "C" というので、関数宣言をくくります。
それにしても、かなり変わってしまうので、前のPSG音源部分が使えなくなってしまうのが、寂しいですが・・。モノラルからステレオになったのと、サンプリング周波数が、可変になったこと・・。でもなんと言っても、サンプリングビットが、8ビットから16ビットに変わったのがでかいですね・・。
でも、音がなかなか正常に鳴らないです。(^^; おもったとおり、見事に はまりました。( I got stuck! です。)
・・・悩むこと数時間、やっとこさ正常に鳴ってくれました。(^^; 今回も本当に、疲れました。
でも、PSG音源の音色は、かなり軽くて硬い印象ですね・・。(汗) 全然、独特な甘い音がしないです。何故だろう? ・・・・と思っていたら、なんと、一オクターブ高かったです。(^^;; 音源の動作周波数を、2倍したのが間違っていたようでした・・。
ちなみに、FM音源は、実機に似ています。かっこいいです。 ただ、FM音源の方はすぐに試せる曲が少ないのが、残念です。 ベーマガのリストを打ち込めばいいんですが・・。
あと、レジスタを変更する場所を変えていました。 メインスレッドから変更するようにしました。 音源スレッドはあくまで波形を作っては出力するだけです。 これで、音がちょっとクリアーになった感じです。 しかし、キークリック音は 全然ですが・・。(^^;
あと最低限やるべきことは、メニューから、サンプリング周波数を変えれるようにすることかな?
オプションを変更したときに、「この変更は、次回起動時から有効になります。」という文章のつもりで、「This change is enabled since next boot time! 」と表示させていたんですが、かなり直訳過ぎるので、 Please REBOOT this application to enable the change of options.という表記に変えました。
直訳すると、「このアプリケーションをリブートしてください。オプションの変更を有効にするためには。」となります。
英語って、重要なことが最初にきますし、リブートさせないといけないことが伝わるので、分かりやすいと思うんですが、どうでしょうか?(^^; って、日本語表記にするのが一番いいんですけどね・・。(汗)
大変遅くなりましたが、特殊フォーマットの読み込みに対応しました。
今までは、セクタの場所を決めうちでアクセスしていたんですが、それをやめて、実際に、セクタを探すようにしました。 これで、1トラック5セクタしかないようなフォーマットや、セクタ番号がランダムに並んでいるフォーマットにも対応出来るはずです。
ちなみに、私は 1DDittは使ったことが無いので分からないのですが、片面しか読まないため、おそらくヘッダにあるトラックの先頭アドレスは、詰まって書き出されていると思います・・。 しかし、Dittで取り込んだ場合は、裏面が Unformatted なために、一足飛ばしで書き出されるので、その違いを吸収するようにしました。
あと、某所にて間違ったデータで作られていた某ディスクにも対応しました。(汗) 実はもともと、私が要望したものなので、ちゃんとサポートしないと・・。(^^;;
これで、完璧か?といわれると まだまだです。ディスク関係では、あと 書き込み許可じゃないイメージをマウントしたときの挙動と、 現在マウント中のファイルを、GUIで分かるようにする。という作業が残っています・・。(^^;;
初め、ハードウエアスクロールは、なんだかよく分からない難しいものと思っていました。(汗) しかし、実際にグラフィックをかいておき、スクロールさせると、なーんだ。という感じで氷解しました。
ハードウエアスクロールさせたときの模式図が下記のとおりです。右に160ドット、下に100ドットスクロールしています。 これを見ると分かりますが、ハードウエアスクロールは、画面の端に消えてしまった画面が反対側から出てきています。
スクロール前
スクロール後
ただし、スクロールするたびに、見かけ上の座標系が変わってしまっていることに気をつける必要があります。 つまり、上記の状態では、(0,0)の位置が、真中に移動してしまっています。(^^; でも、VRAMから絵を作るときは、スクロールしない状態の絵を作ってから、スクロール用に切り貼りする必要があるので、オフスクリーンをもう一枚用意したほうが良いかな?とか考えています・・。(汗)
ちなみに、グラフィック画面で、全くスクロールしていない場合は、そのままBITBLTするだけで大丈夫ですが、1ドットでもスクロールすると、4つに分割して、切り貼りする必要があるので、ただでさえ遅い動作がさらに遅くなりそうです・・。(;_;
それから、真中に黒い部分があります。 これは、画面上は200ラインだけど、実際には204ラインまであるので、4ライン分だけ何もかかれていないからです。
スクロールさせるときは、これも気をつける必要があります。200ラインモードでスクロールさせると、下のほうの4ラインは 常に隠れた状態になっています。 (204ラインモードのときは、全て見えるのですが・・。)
ちなみに、前から要望の多い、スナップショット機能ですが、このハードウエアスクロールが出来てから、考えたいと思っています。(_)
Release 4 をリリースして、しばらくたったのですが、沢山の反響をいただき、本当にありがとうございました。 だんだん、落ち着きを取り戻しているという感じがします。 それにしても、出すことで、初めて気づくこともあり、ありがたく思っています。
でも、だんだん 粗が見えてきました(^^;; うーん。やっぱり、FM音源をサポートしておけばよかったなぁ・・・。とか、全てのオプションを、GUIで設定出来れば良かったのに・・。とか色々考えてしまうんですが、仕方ないですね。(汗)
今回は、Windowsに対応させるのが一番の目標ということもあり、TO DOリストは、まだまだ山のように、残ったままです。(汗) これは、地道につぶしていく予定では有ります。
ただ、普通なら、リリースできるようなレベルじゃないのかも知れません。(汗) でも、思い切って公開してみて、良かった面があります。 それは、これをきっかけとして、SRのROMを取り込まれる方が、続出したことです。(^^;
ちなみに、Release 4をリリースする前に、saver3は公開してありましたが、 まぁ、取り込みソフトだけをおいておいても、取り込みだけをする気にはならなかったと思います。でも、これからは違います・・。 SRを持っているのに、ROMを取り込んでないのは、非常にもったいない話ですので、みなさん、どんどん取り込んで、バックアップしましょう。(^^;
ちなみに、SR専用ソフトでは、スパルタンXとかが動かなかったそうです。(汗) うーん。検証したくても持ってないので、どうすればいいのやら・・。 この辺が、私の弱い点ですね・・。 もし、デバッグして下さる方がいらっしゃいましたら、よろしくお願いします。(_)
昨日リリースしたばかりであれなんですが、アップロードしなおしました。(汗) 変更点は、「名前」だけです。 名前だけなので、機能的な違いはないのですが、出来れば再度ダウンロードしてください。(_)
というのも、今まで、ちゃんとした名前がなかったんですが、某Hashi さんがおっしゃってくださった名前に決めました。(^^; これで、SR対応パッチ・・。という分かりにくい名前を使わなくてもよくなります。 本当に、感謝感謝ですね。(^^;
ついに、リリースしてしまいました。(汗) 何故かと言うと、Windows 98の問題が、一応落ち着いたのと、 これからソースコードをいじり倒す予定なので、丁度区切りをつけるためという意味もあります。(これから、忙しくなるというのも有りますが。)
今回から、Windows版の実行ファイルも置いてあるので、多くの人に使っていただけると嬉しいです。 でも、パッチファイルのほうは、もうすでにパッチファイルと呼ぶのはおこがましいほど、膨れて、変容していますね。(^^;; まぁ、これも当分このままで行きたいと思いますが・・。
今回、主眼に置いていたのは、Windows環境への対応です。 一応、前のバージョンでも、Windowsには対応していましたが、音がまだでしたし、メニューもまだでしたから・・。
ただ、今回の判明している問題は、やはり Windows版の音が悪いのが痛いかも。(汗) 何でこんなに悪いんでしょうか? やはり、音源周りのプログラムが妖しいですね・・。(汗)
あと、SR特有の機能で、サポートしていない機能が山のようにあります。(汗) ハードウエアスクロールなんて、その最たる例ですね。(^^; しかし、これを実装するためには、204ラインも考えないと・・。(汗) あと、パレット機能の隠し機能も・・。
まぁ、やる気になれば出来ると思うんですが、UnixとWindowsの両方ともサポートした上で、上記の改造をするためには、かなーり ソースコードをいじり倒さないと、いけなくなるのが、今から憂鬱で・・。(^^;; まぁ、使う分には全然関係のない話なんですけどねぇ・・(汗)
次のリリースは、こういうSR特有の機能のサポートと、ソースコードをもっと綺麗にしたい!というのが有ります。(^^;;
NHKの朝の連どらのまんてんが面白くなってきましたね。でも、毎日終わりのほうが見れないのがつらかったりします。(汗)
ところで、Windows 98で、音源を有効にしていると 起動しない問題ですが、ちょっとだけ進展がありました。一応、起動できるようになりました。
パイプのハンドルを継承するために、SetStdHandle( STD_OUTPUT_HANDLE , hRead)としていたんですが、Windows 98 では、SetStdHandle( STD_INPUT_HANDLE , hRead)としなければ、鳴らないようです。(^^;; つまり、入力系は入力系にしか割り当てられないということですね・・。(汗) なるほど・・。いわれてみれば、確かにそうですね・・。 (というのも、Windows 2000では問題がなかったので、全く気づきませんでした。(汗))
しかし、まだまだ問題が有ります。肝心の音がぶつぶつになるんです。 それに、あきらかにメインスレッドが遅くなります。(汗) 逆に、音源を無効にすると、メインスレッドが 速くなりますが・・。
まぁ、NT系なら、パイプの全機能が使えるけど、98系は、不思議なことに半分しか使えませんからね。やっぱり、パイプを使うのは、無理があるんでしょうかねぇ・・(汗)
ちなみに、テスト用に、ノートパソコンがほしいです・・。Windows 98が起動して、フロッピィなどで、コピーできるだけでいいんですが・・。(^^;
サウンド関係のソースを機能ごとに分けていました。(WinSound.c です。) といっても、音が良くなったというわけではなく、 ゆくゆくはFM音源もサポートしないといけないので、それを入れやすいようにするためです。(^^;
これで、fmgenを入れようかなぁ・・。とは思っているんですが、 ここでさらにいじりだすと、次のリリースが 年を越してしまいそうなので、今は指をくわえている状態です。(^^;
ただ、おそらく、Windows環境が先になって、Unix環境が後になると思います。 というのも、今はPC-Unixで音を鳴らせる環境ではないんですよねぇ・・。(汗) まぁ、前のサウンドカードを入れれば、鳴るようになるんだけど、音が悪くなるし・・。(汗) それに、もともとUnix環境って、音がへろへろだったような気がするので、そっちを直すのが先決かな?
そういえば、Sound.cと WinSound.c から、AY-8910 のエミュレート部分を抜き出したら、だぶっているコードがかなり解消して、OS依存部分だけになるんですけどねぇ・・(^^;; そこまでするのは、だいぶかかりそうな上、それをしても音がよくなるわけではないので、あれなんですが・・。(汗)
音が長くなったり、短くなったりする問題ですが、突然解消しました。(^^;
ちょっとややこしいんですが、具体的には、Z80 CPUで CMT非動作時に、CMT割り込みのタイミングを、タイマー割り込みのタイミングと同じ数字にしただけです。 それがどうも邪魔をしていたのかな? という感じがします。
/* CMT割り込みの発生許可? */ if (CmtClockRemain <= 0) { /* 割り込み許可状態? */ if (R.IFF&0x01) { IFlag = 1; if( CasMode) // CMT 動作中か? // 追記部分 CmtClockRemain = CmtInt_Clock; else // 追記部分 CmtClockRemain = TimerInt_Clock; // 追記部分 enableCmtInt(); } }
でも、実際には 違うことをやっていて、偶然発見しただけで、何故これで上手くいくのか、全然分かって無かったりしますが。(汗)
ちなみに、その上でタイマー割り込みを、割り込み禁止命令(DI)で、マスクできるようにすると、やっぱり音の長さが おかしくなりますね。うーん。謎が増えるばかりです。(汗)
昨日はじめて、ナイトホスピタル見ました。でも、毎回これだと 本当に疲れますね・・。やっぱり、ERの方が良いかも。(^^; でも、今までの病院を舞台にした日本のトレンディドラマなんか 病院ドラマじゃない!といえるほど、患者のほうがクローズアップされています。
ところで、今日はなんか体が不調だったので、ちょっと寝ていました。(;_; 急激に寒くなったからでしょうか?
色々、試してみたいことが出来てきたので、試したいのですが・・・。 ヒントは、リングバッファです。 って、もちろん、Windows 98のこともちょっとずつ対策していますが、本当に動くのか、まだテストできていません・・。(汗)
ところで、BASICのPLAY命令で、演奏させると、異様に音が長くなります。(汗) そして、速くなったり遅くなったりします。(汗) うーん。何故なんでしょうか? でも、ドアドアmk2のロード中の音楽は、まともなんですよねぇ・・。(といっても、最後までロードできませんが。) あと、sound 命令で、演奏させても、大丈夫です。
つまり、マシン語かなんかで独自にテンポをとっているのは、大丈夫だけど、BASICのPLAY命令で演奏させると、おかしいというわけです。
ということは、もしかすると、タイマー割り込みの周期が長すぎるか、CPUの速度が遅いということになるでしょうか。(汗) どこか間違えたのかな? それとも、調整が必要なのでしょうか。(^^; ちなみに、速くなったり遅くなったりするのは、速度が一定してないのでしょうね。(汗)
調整といえば、SRは本来の速度が出ていません。(汗) 本当は、もっと速いはずなんですが・・・。 でも、むやみに速くすると、テープが読めなくなるし・・。うーん。この辺が限界ですね・・。
今は、Windows 2000で動作確認していますが、Windows 98まではサポートする必要性があるとおもったため、前のパソコンを引っ張り出してきて、色々やっていました。 それにしても、Windows 98のインストールが途中中断したためか、ちょっとおかしかったりして・・・。(涙) 手作業で、DLLファイルとかコピーしていました。(汗)
というのは、おいといて、衝撃の事実が判明・・。というのも、音源を有効にしていると、立ち上がらなくなります。(汗) うーん。これはちょっと 痛いを通り越して、致命的ですね。(汗)
音源を無効にすれば起動するんですけど・・。失敗するところは分かっているので、これはもう一度検証してみる必要がありそうです。
あと、Windows 98では、ファイルのオープンダイアログが開きません。(汗) これは、おそらく、コンパイラのせいだと思いますが・・・。 うーん。なんだかなぁ・・。(汗)
やっと、メモリー使用量の問題がクリアになったので、いよいよ、RC1か?と思っていたんですが、まだまだみたいです・・。(;_; もっとも、Windows 2000なら、普通に動いてくれるんですが・・。
ふとした思い付きから、実機を引っ張り出して、ある実験を行いました。 それは、 モード6で採用されたパレットを、モード5のテキストモードでいじってみるということです。
本来なら色は変わらないはずが、変わってしまいました。(汗)
たとえば、白色の場合は、OUT&H40,5 で 赤色に変わります。 すごいですねぇ・・。もしかして・・。とは思ってましたが、やっぱりという感じでした。(^^;
それならばと思い、本来、黒と白と緑しか表示できないはずの、モード1−4で調べてみると、あら不思議。 なんとカラフルな色が 表示できるじゃ有りませんか。(^^; すごいですねぇ・・。これが出来るとなると、ゲーム作りはもっと楽しくなるのでは? (といっても、15色中4色ですが。)
とはいえ、エミュレータ的には、全然嬉しく無かったりして・・。 うーん。この機能(というか副産物)は、サポートすべきか、しないべきか・・。 まだ、ちゃんと見てませんが、 いろんな所をいじらないといけないのなら、出来れば避けたいところですね。(汗)
あとは、これを使っているソフトが有るかどうかですが。 それから、BASICのコマンドはないので、サポートしても、使ってくれなければ、意味が無かったりします。(^^; でも、普通はここまでサポートしないので、サポートしていれば、目玉(?)になるかもね?(^^;