//www.旧型、PSP開発幼稚園.game.jp/(本館) -10ページ目

FM音源の秋

■FM音源の秋

sp_FM00HERE
ついにFM音源がつ!って写真じゃワカランわな。


ポイントはZ80を止める事。つまりZ80を止める→レジスタにセット→Z80を動かすと、音が鳴る。
#define FMA_STAT 0x00a04000 #define FMA_DATA 0x00a04001 #define FMB_STAT 0x00a04002 #define FMB_DATA 0x00a04003
/* OPN-A のみセット register set to OPN-A only. */ static void poke_fma(char poke_address,char poke_data){ char *sound_data; char *sound_stat; sound_stat=(void *)FMA_STAT; sound_data=(void *)FMA_DATA; *sound_stat=poke_address; *sound_data=poke_data; }
□レジスタの使い方はこんな感じで設定。 (註:レジスタ設定方法は76と同じ。ちとまとめ。 76(496?メガドラのVDP)==YM2612(メガドラのOPN)==直結式。(接続ハードウェアーが簡単) PSG(AY-3-8910)=YM2203(OPN)==間接アクセス式。 YM2203はPSGからハードウェアーを置換する(需要があった)ため、レジスタのアクセス方法が特殊。(PSGと同じに合わせた) そのため「OPN(YM2203)」の資料あさると、レジスタ設定出来なくてハマルのだった。ちなみにきちんとレジスタ設定出来たか 確認を取るのは「Genecyst」の「dump→YM2612」が便利。(市販ゲームの音色を盗んでくる事も可能)) □音色設定は、(註:FM3声を使ってナムコ音源(音素はサンプリング)1声を真似する音色の一例。 うち一声はオクターブ違いにセットする事。ターゲットはナムコ音源2声で足りるから、メガドラ(FM6声)には都合が良い)
(註:「poke_fm()」は上と殆ど同じだが、OPNA/OPNB同時にセットする奴) static void init_fm(void) { register ushort *pzw; pzw = (ushort *) Z80_HALT; *pzw = 0x100; /* Halt the Z80Z80止める */ { unsigned char ch; for(ch=0;ch<3;ch++){ // DT1/ML [1](3)(4) poke_fm(0x30+ch,0x08); //OP#1 poke_fm(0x34+ch,0x04); //OP#3 poke_fm(0x38+ch,0x04); //OP#2 poke_fm(0x3c+ch,0x04); //OP#4 // TL [1](7) poke_fm(0x40+ch,0x1a); //OP#1 poke_fm(0x44+ch,0x7f); //OP#3 poke_fm(0x48+ch,0x7f); //OP#2 poke_fm(0x4c+ch,0x02); //OP#4 // KS/AR (2)[1](5) poke_fm(0x50+ch,0x1f); //OP#1 poke_fm(0x54+ch,0x00); //OP#3 poke_fm(0x58+ch,0x00); //OP#2 poke_fm(0x5c+ch,0x1f); //OP#4 // DR [3](5) poke_fm(0x60+ch,0x00); //OP#1 poke_fm(0x64+ch,0x1f); //OP#3 poke_fm(0x68+ch,0x1f); //OP#2 poke_fm(0x6c+ch,0x00); //OP#4 // SR [3](5) poke_fm(0x70+ch,0x00); //OP#1 poke_fm(0x74+ch,0x1f); //OP#3 poke_fm(0x78+ch,0x1f); //OP#2 poke_fm(0x7c+ch,0x1f); //OP#4 // SL/RR (4)(4) poke_fm(0x80+ch,0xff); //OP#1 poke_fm(0x84+ch,0xff); //OP#3 poke_fm(0x88+ch,0xff); //OP#2 poke_fm(0x8c+ch,0xff); //OP#4 // FB/AR [2](3)(3) poke_fm(0xb0+ch,0x32); //poke_fm(0xb1,0x32); poke_fm(0xb2,0x32); //??? poke_fm(0xb4+ch,0xc0); //poke_fm(0xb5,0xc0); poke_fm(0xb6,0xc0); } } // *pzw = 0; /* Enable Z80 and begin playingZ80動かす */ }
んで、実際に鳴らす時は、(註:もちろんZ80は一時止める)
//(マズkey_on 音鳴らす) poke_fma(0x28,0xf0);/* key on#0 */ poke_fma(0x28,0xf1);/* key on#1 */ poke_fma(0x28,0xf2);/* key on#2 */
//FNUMBER(つまり、音程)セット set_fm_fnumber((data1));
それから、休符の時には、音止めよう。(FM音源の場合、全然別のやりかたもある)
//(key_off 音止める) poke_fma(0x28,0x00);/* key off#0 */ poke_fma(0x28,0x01);/* key off#1 */ poke_fma(0x28,0x02);/* key off#2 */
んで、問題の「set_fm_fnumber()」なんだけど... なんと現状(2006-09/12)「バグってたまたま鳴る」事が判明。ってゆーかバグ取ると、変な音になる~。エーン。 一応レジスタの仕様はOPNと同じで、 //fnumber下位レジスタ(0xa0+ch)(chはチャンネル0~2。3は無効、メガドラはOPNAの3chとOPNBの3chで、計6ch(OPNを)使える) (註:「バーニングフォース」では「3」がセットされてるが、「圧縮の為に必要」でなければ「単なるバグ」でしょ?(タブン、バグ)) 7 6 5 4 3 2 1 0:bit f f f f f f f f (f:fnumberの下位8bit) //fnumber上位レジスタ(0xa4+ch) 7 6 5 4 3 2 1 0:bit - - b b b f f f (b:block、これは要するに「オクターブ」) (f:fnumberの上位3bit)
fnumber(11bit)は音程。fnumberが半分になると1オクターブ分音程が下がる。
OPNは仕様上「block」なんて変なもんが無いと仮定すると、20bit分の「周波数」が出せる。つまり「音程の解像度は20bit分ある」。 (註:これはCDとかの「量子化周波数ビット数」たとえば16ビットとかとは、「何の関係もない」ので早合点しないようにオネガイ。) んで、アクセスは8ビットなんで、20ビットあれば、3バイト要るよな。(3 x 8=24) だけど「節約」。 音域は8オクターブあれば足りるよな。んで3ビット(0~7)。これが「block」。それでオクターブ違いは同じ値を使うと決めて、 20ビットの解像度に相当する、「1オクターブちょっと」の解像度は「11bitで足りる」。んだからこれが「fnumber」。
...めんどくさ。 逆算式は、 AAA==「発音したい周波数」==たとえば440Hz「ラ」の場合440。 BBB==「オクターブ」==0~7. CCC==たぶんメガドラは3579545だと思う。単位はHz。 n==標準の設定の場合、多分1. とかとすると、 fnumber(11bit)=((AAA * (2^20))/((CCC)/(12*n)))/(2^(BBB-1)) らしい。(マダやってないからシラネ) (「*」は掛け算。「/」は割り算。「^」はべき乗。) げんじょーfnumber(11bit)はイイカゲンな値をセットして鳴らしてる。 (2006-09/12、09:12)
上記式は、試してないケド、間違ってるっぽいにゃー。ここで音(音程)についてレクチャー。 えっと、とりあえず、ピアノの真中のオクターブ。これが「O4」。 んで「O4」の「A」(エーゴ/ドイツゴ、好きなほーでヨム)つまり「ラ」。えっと日本語では「い」だっけ?(ワスレタ) とにかくこいつの基音が、440Hz。うるさい。442じゃなくて440。説明がめんどいだろ。 (註:クラシックとかでは442の音叉使ったりする) ぢゃあ、1オクターブ上の「ラ」つまり「O5A」は、ってーと880Hz。「O6A」は1760Hz。 1オクターブあがると2倍すればいいし、下がれば半分な。
さて問題。「O4、A#」「ラ#」「嬰い」の周波数はいくつにゃ? 答え。(440*ZZZ)、ZZZは(2の12乗根)。 (2の12乗根)ってのは、12回かけると丁度2になる数字。つまりZZZ^12==2。 どうしてかてえと、1オクターブは丁度12分割されてる。これが「平均律」。うるさいな「純正律」なんて知らないってば、説明がめんどいだろ。 (2の12乗根)は「電卓」で簡単に計算デキルゾ。やり方は「電卓の説明書」に書いてある(と思う)んだが、「電卓の説明書」持ってる 人手を上げて...みんな捨てちまったか。しょーがない、レクチャー。「スタートメニュー」→「アクセサリ」→「電卓」。準備はいいな? エート電卓の種類→関数電卓にしよー。 んで、ちとやってみたケド「Exp」の使い方よく解からん。(本当は(e底の)log2→/12→Expにしよーと思った。) 方針を変更して、「x^y」を使う。 まず、1/12は「0.083333<略>」。「M+」に入れとく。んで「2」「x^y」「MR」つまり、「2^(1/12)」。 で、「1.05946309435929526456182529494634」(コピペ)合ってるっぽいケド、あってるのかな? エエト、「MC」そんで「M+」これで、(2の12乗根)が電卓のメモリに入った筈。んじゃあ確認。 「MR」「*」「=」「=」「=」「=」「=」「=」「=」「=」「=」「=」「=」(註:「=」は11回押す) で、「2」に戻るハズだ。ふう戻ったヨカッター♪ちう訳で、「O4、A#」は、 440*「1.05946<略>」=466.16376151808991640720312977639(コピペ)=466Hzな訳。
さてと、長い前フリだったが、とにかく「音楽」を鳴らす為には、この(2の12乗根)がイルにゃー。 別の資料では「fnumber」2倍すると1オクターブずれるって記述がある。これは心情的に(?)あってるっぽいなー。 これは信用しよ。そーゆー訳で、「何でもいいから1音」fnumberが判れば、(2の12乗根)を利用して、 全部のオクターブの音程が解かるのです。ここまでOK?
さてと、それじゃあ「何でもいいから1音」のfnumberは何処から持ってきやしょう。てきとーに市販ゲーム立ち上げて、 その音楽ドライバが(音楽的に)合ってりゃ、「Genecyst」→「dump」→「YM2612」から持ってくるって案は? その値を信用するかどうかは別として、「検証」は可能だよなー?「半音単位の平均律」なら、 処の音か「聞いてワカル」気がするしさー。
とにかくそんなメンドクサイ事考えなくても、fnumberの11ビット、かったっぱしからダンプすりゃあ、酷く12種類の数値に偏ってる ハズだよな~。ポルタメントとか使ってそうもないショボイ音のゲームがいいな~。そこから「仕様」が読めそうな気がする。 (註:本当に3579545なのかどうか確認したい。そこまでの精度は無いが...) (註:「12種類」:11種類ぢゃなくて多分12種類?。しかも「ラ」「A」は関係なくて、多分「C」~「C」。ドライバ作者の趣味にも拠るが。) (2006-09/12、17:00)
■ええと、ちょっと調べたら、宇宙船氏のZ80ドライバと、MMLコンパイラと、KANEDA氏のサンプルでやるのが、 この件は楽そうでは、ありんすね。(やってないからシラナイ) ただKANEDA氏のサンプル。(GCCの奴、'(C)2005 KANEDA OLD_SKILL_PDARC3')。曲のループ部分でバグがありんす。 MMDのループコマンド。「0xFE、0x00」なのに、 KANEDA氏のサンプルは、(そのコマンドで)受けてないし。それ以前にソースよく読んだら「一見作ってある風だけど、 実はループ部分作ってないんですね」にゃー。それでループしないんだなあ。ナットク。 あ、やってないからシラナイんだけど、「宇宙船氏のZ80ドライバ」使えば解決する話ではありんす。 ただそれをするかどうかは別問題ってゆーか、やってないからマダわからん。 (2006-09/17、01:00、ねむい)
■最終的には、宇宙船氏のZ80ドライバ使うかもしんないケド。さしあたり、まだワタシにはレベルが高そうなんで、 KANEDA氏のサンプルを相変らずイジル。FNUMBERに関しては、何が正しいのかヨクワカラン。んだけど1つ判った事。 それはGenecystはダメという事だ。Genecystは市販のゲームを遊んでいても、何か音程が変なんだが、 (44100でも22050でも11025でも調が露骨に、狂うゲームも存在する。)別館のsega_pacA01式のFNUMBERにすると、 「露骨にオカシイ」。Gensや他のえみゅでは、OKだし、Genecystは考えなくて、良いミタイだな。Genecystは除外する事に決めた。 (2006-09/17、19:36)
■露骨に問題発生!。 現在作成中(?)の(新?)メガドラテストROMなんだけど、 「Gens2.14Souvenir」「Gens32v2.35secret」では、ちゃんと鳴る。 うんうん、あやしー事はしてない。OPNだったらちゃんと鳴る筈のルーチンだから、鳴って当たり前の筈。 が、 「GenecystX.XX」「KegaFusion3.51」 「pspDGEN1.70」「psp_picodriveA14」「psp_SEGADRIVEA33」 全部ダメ。もしかしてMAMEのさとうたつゆきドライバがエンバグしてんのか?ワカラン。 いや、さとう様のドライバは、白だった。このPC(0.566GHz)では重くて良くワカランが、「Hazemd005マイスペシャルかすたむ版」 では、ちゃんと鳴ってるっぽい。 (2006-09/18、01:00)


■Gensコンパイル出来そうな気がスル。いやー気のせいなんだけど、出来そうな気がスル。 GensってPC用の、PCで動くプログラム。勘違いしたらゴメンネ。ってゆーか現状「それすら出来てない」 んだが、問題点がダイタイ判ってきた。「俺もGensコンパイル、とらいしたけど、途中でわけわかんなくなって投げ出した」ってゆー人は、 もう一度チャレンジ。 (註:このGensは、「gens-win32-src-2.14.zip」2990kBの奴です。現在公式サイトからDL出来る奴です。VC++は6で、 「win32-hq2x」とかいう「本家ではなくて改造版のGens」の「DSWファイル」だけ少し設定し直して使ったのです。 本家は.NETなんでね。そちらの「DSWファイル」は.NET用じゃなくて「VC++6用」です。少し設定直せば、タブン「VC++5」でも、 使えると思うよ。あと、「リンカに与えるオブジェクト名」例えば「\vc\gensCD~1\release\vdp_rend.obj」みたいな奴は直した方が良い。 んが、最小限の手間でやるには、ソースリスト(DSW含む)を「C:\VC\gensCD_214\」以下にいれちまえ、「パス」で悩むのは面倒だ、 「相対パス」も使ってるから、「実行ファイル生成に成功」してから、後で直せば十分だ。それからZLIBは付属のを使って、 「コンパイルしてない」) (註:「DSWファイル」:本当は「DSWファイル」と「DSPファイル」んで「DSPファイル」の方が重要。「MAKEファイルを吐かせる (エクスポート)」事も可能。) えっと、Gensってさあ。コンパイルしてさあ。んで、コンパイル全部とうったみたいなんだけど、リンカが素人には意味不明の事言ってきてさ、 んで「あーきた、ポイ」ええ、標準パターンだと思います。大体それ以上の事が判ったらタブンここ読んでないやい。
ええとですね。Gensは「コンパイルするだけでは不足」なのです。まずCPU作らなきゃ。 えーと、ポイントは3つ。 1.アセンブル。 2.CPU。 3.DirectXSDK。 順番に説明するです。
★1.アセンブル。 「*.asm」のファイルは、アセンブラのソース。これは「NASM」でアセンブルするのです。「NASMは0.97以降」っていっても、 「そんなレトロなNASMは手に入らないから大丈夫」GENSのソースの「TOOLS」にもくっついてきますしね。確か「NASMW0.98」 GensはMingWでGCCに移植したいなあ。と、思うケド。(註:MingWは過去日記) まだそんなレベルでないから、まず「Win32」つまり、「VisualC++」ね。(今ならNETだけど、そんなん持ってないし) (註:coff:coff形式:GCCの実行ファイルは普通「coff形式」。PSPの自作プログラムもタブン「coff形式」。) (註:Win32:PE形式の俗称:Winの32ビットのプログラムの実行形式は普通「PE形式」。それでは普通の人には、通じないので「Win32」と呼ぶ) (註:MingWは「HazeMD」を調べたら、案の定「PE形式」。やはり、「coff形式」ではWinの(DirectXの)プログラムは動かないでしょうね) (註:MAMEのDOS版は「coff形式」。MAMEのWin版は「PE形式」。つまりそーゆー事だ。このブログのずーーーーと前にGCC入れて どうこうってのは当然「coff形式」の話。んでこの前のMingWは「PE形式」だから、「DirectXが使えるじぇー」って話。 もちろんMingWはすべてタダだから、「DirectX8のプログラム」は全てタダで開発可能です。)
とにかくNASMWの使い方。 「coff形式」の場合は、nasm -f coff z80.asmだが、それは既に関係ない。
nasm -f win32 mem_M68k.asm nasm -f win32 mem_S68k.asm nasm -f win32 mem_Z80.asm nasm -f win32 blit.asm nasm -f win32 vdp_io.asm nasm -f win32 vdp_rend.asm nasm -f win32 io.asm nasm -f win32 misc.asm nasm -f win32 z80.asm (註:「nasm」と「nasmw」はあなたのシステムで動くならどっちでも同じ。 ワカランなら「nasmw.exe」を使え。ってゆーか(現代では)それしか要らない。 ちなみにGens付属の「nasm.exe」はタブン「nasmw.exe」を「単にリネーム」したもの。 ちなみに本物の「nasm.exe」はタブン「現在のマシンじゃあ動かん」もしくは「小さいプログラムしかアセンブル出来ない」のです。)
こーゆー感じだな。おしまい。
★2.CPU。(ってゆーかMPU) GensのCPUは「STAR-SCREAM」の「スペシャルカスタム版」これの作り方ね。 まず、「STAR-SCREAM」は(m68えみゅコアの)(80x86)アセンブラソースを吐かせる「ツール」なんで、 「main68kgen.c」(メインm68MPU用)と、「sub68kgen.c」(メガCDのm68MPU用)の2種類は、「どんなC言語でも構わない」 ワタシは手持ちの「coff吐くGCC」を使った。VC++でもできる筈。(ツールだから、BCC5.5でもカマワン) まず「ツール」をコンパイルしよう。「VC++」なら、それぞれ「別の新規プロジェクト」だな。 「VC++」なら、「ファイル→新規作成→プロジェクトたぶ→Win32ConsoleApplication」でも出来る筈だ。 但しワタシは、手持ちの「coff吐くGCC」で、 gcc main68kgen.c -o main68kgen gcc sub68kgen.c -o sub68kgen こうやった。 コマンドラインのツール。「ツール:main68kgen.exe」と「ツール:sub68kgen.exe」を作成しよう。
次、これらのツールを使って「80x86のアセンブラソースリストを生成」する訳だが、やり方を間違うと、 「生成したソースがリンク出来ない」。ここが嵌り所だから、注意しよー。 これらのツールを単に実行すると、「アセンブラソースが生成」されるが、これは「Gensでは使えない」。 単に実行するだけではダメだ。バッチファイルを作る事を勧める。中身はこう。 main68kgen.exe main68k.asm -name main68k_ sub68kgen.exe sub68k.asm -name sub68k_ この「-name main68k_」(最後はアンダースコア)がポイントで、これを付けないと「Gensでリンク出来ない」
あとは、「main68k.asm」と「sub68k.asm」が出来るから、アセンブルすればおしまい。つまり、 nasm -f win32 main68k.asm nasm -f win32 sub68k.asm これで、「Gensでリンク可能な」「main68k.obj」「sub68k.obj」が出来る。
★3.DirectXSDK。 現在はX9ってゆーか、もう「X9」とは呼ばないで「日付」になってるんだよな。(でもX9)X9やたらでかいしさ、入れるの めんどいなー。ちゅう訳で、まだこの辺までしかヤッテナイです。 ちなみにDirectXのVERめちゃくちゃ下げて、コンパイルして現在GensがEXEにはなったです。 現在、画面が表示されないケド。音だけなるのです。(つまりコアはちゃんとコンパイル成功したです) (但し、インターネット対戦とメガCDと32Xは「都合により排除」したのです。) (註:アセンブラリストかなり書き換える必要があるので、常人には勧めない) おしまい。 そのうちMingWに移植したいなー。 (だって妄想上。MingW+DirectX化(又はcoffGCC+Allegro+SEAL化)→全てCに移植→PSPでしょ?...妄想ですが) (2006-09/18、23:10)
■「マイGens214スペシャル画面が出ない版」でも、「現在開発中の秘密メガドラ自作ROM」の音楽はちゃんと鳴るじぇー。(あたりまえ) 当たり前なんだケド。確認しないと気が済まないからなー。 (2006-09/19、00:00)
■ちょっと、(マイGens)DirectDraw関連弄ってみたけど、どおも画面が出ないのは、 「DirectX(つまりDirectDraw)」は関係なくて、リソースが巧くいって無い為、 (ほら最新版は.イチオウNET用だからさ)単に色(パレット)が出てないダケの気がしてきた。 今日はもう遅いから寝よう。リソースやダイアログなんて作るの簡単だから何とでもナルケド。 (基本的にGensは(スタティックな)RCでなくてプログラムで生成(つまり動的に登録)してる。が、ダイアログは別。 色調整は、(スタティックな)RCの「ダイアログ」なんだよな~。) (2006-09/19、03:00、ねるです)
■、(マイGens)やっぱ原因が、DirectDrawらしい。 「Render」が「Normal」と「Double」では、何も表示されないが、「Interporated」(以降)にすると、ちゃんと画面が出る。 つまり、「2DのVRAM描き」は出来なくて、「(2Dの?)ハードウェアー転送」は巧くいく。 なんかヨクワカランが、まあ画面が出りゃ、移植や改造は可能だから、ヨシとしよう。 でも、オカシイナ~。、「Interporated」(以降)は全部画面モードが出る。うーんエンバグしたかな~? (アセンプラソースも結構いじったしさ。)ワカランにゃ~。 (追記、註:原因は、「G_ddraw.cpp」で。(現状のDirectXのVERが低い為)「SetSurfaceDesc」を殺してたからという事が判った。 本物は「LPDIRECTDRAWSURFACE4」だが「LPDIRECTDRAWSURFACE」でやってた。これでは、出来ないので、 「LPDIRECTDRAWSURFACE3」にしてやってみた。んがうまくいかねー。(えみゅが死ぬ)これ以上は、ワカランなー。 DirectXのVER上げて、「LPDIRECTDRAWSURFACE4」でやるしかないかな-?MingWに持ってきゃ解決するんだがな。) (註:元といえばWinのDirectXSDKの古いVER(つまりDirectX8SDK)が手に入らないのが問題。 それに、新しいVERがやたらデカイのが問題。DirectX8SDKならチイサイ。) (註:MingW用の「DirectX8SDK」なら簡単に手に入る。「過去日記、参照」。MingW用の「DirectX8SDK」から、 インクルード、ヘッダファイル(つまり*.h)とライブラリ(つまり*.lib)抜いてくりゃ、動作しないかなー?) (註:「SetSurfaceDesc」は、DirectX5になって新設された(らしい)その為最低でも、「LPDIRECTDRAWSURFACE3」以降で なければ、(そんな関数存在しないので)使えない。) (註:「LPDIRECTDRAWSURFACE4」がいつから新設されたのか?そんな古い話。知るもんか。) (2006-09/19、11:30)
■マイGens。もう一回、「新規プロジェクト」で作り直した。んで、リソースファイル「gens.rc」見つけたんで、 これを(メガCDと32Xを排除して)使う。(註:「resource.h」「resrc1.h」「アイコン」「BMP」もインクルードしてる) 現在Debug版で、「最適化すべてなし」なんだが、「使ってないリソース(BMPとか)」も入ってるのに、EXEが1028kBしかない。 (註:本家2.14souvenir(メガCD、32X含む)は、1832kBある。) 本家もマイ版も「実行ファイル」は「無圧縮」だよ。要らないリソースとプログラム排除して、さらに「実行圧縮」かければ300kBytes。 ぐらいになりそうな気がする。まあ、やってないから妄想デスガ...。 (註:実行圧縮:MAMEは(UPXで)実行圧縮かけてるよね。実行圧縮ツールは「UPX」が優秀でフリーだにょ。 あらゆる形式(coffとかNEとかPEとか)に対応してるにょ。モチロンWin32(PE形式)のプログラムにも使えるにょ) さてと、マイGensも動くよーになったし、MPUのクロックGensはdiv7.0なんだケド。Z80の2倍説にも拘っているので、 Z80の2倍のdiv7.5にしてみた。(註:Z80はdiv15.0、これは世界的に一致した意見) うーん、少し音程が低くなる。こっちと、どっちが本物なんだろう?FMえみゅ内部に(div7.0の)定数が隠れてる可能性もあるしなー。 (2006-09/19、15:40) MYGENS00 別館のsega_pacA01をマイGENS(名前がSEGADRIVE)で表示してみた。ええと、これはエミュレーターなんだケド、 エミュレーターではないのです。ええと本体が(メガドラ)エミュレーターで中身がシミュレーター(?)。タブン。ROM?ナニソレ? そんなものは何処にも、存在しないですね。ええ。「ソースリスト」なら全て取り揃えておりますが、だってココ「PSP開発幼稚園」だよ。 あ、限りなく「PSP」に関係がナイような気がシテキタ。いやいや関係あるのです。タブン。 (2006-09/19、14:00) ■「現在開発中の秘密メガドラ自作ROM(仮称)」の音楽も、マイGensで試す。(!)これだよ。この音だよ。やっぱメガドラは、 この音だ。きっと世界中が間違ってるんだ。Gensは、div7.0で、その分「音程が高い」。本物のメガドラは、div7.5で微妙に低い。 耳が良い人なら、絶対違いが判る筈。pspDGEN170とSEGADRIVEA33の音に違いが判るなら、いやソレがわかんなくても、 これなら違いがワカルじゃろ?44100だしな~。もちっとガンガッテ(仮称君の)開発すすめよー。 (註:「div7.0」と「div7.5」の実際の音程差は「数%(確か2%ぐらい)」です。たしか5%以下です。音程が半音もズレません。 しかし、半音以下の領域が区別が付く人なら、聞きゃあ一発だな。意味ワカンナイ奴は「もう一度このページ始めから読め!」 (2の12乗根)は約6%。6%ずれると、丁度半音ズレルんだよ。ワカッタじゃろ?) (2006-09/19、17:00) ところが、市販ゲームを試す。と、明らかに「音がオカシイ」つまり、「低い」。ってゆーことは、やっぱ、「div7.0」なのかなー。 別館の「segapac_A01」式のFNUMBERの計算ではダメって事かなー。 と、思ったら、サウンド設定が「22050」になってた。 「44100」で聞きなおしたケド。だんだん(何が正しいのか訳が)ヨクわからなくなってきた。 ってゆーか「Gens」少なくともオカシイゾ。 だって、「22050」では明らかに「低い」まるで「Genecyst」じゃねーか。 まじめにちゃんと作れば「44100」と「22050」は「殆ど違わない音」が作れる筈。 「高調波(ハット系とか)抜けないな」って程度の、音になる筈。 だいだい「YM2610High-quority」って何だよ?調査の必要があるな。 (現状「YM2612High-quority」はOFFになってる。) (2006-09/20、12:00) ■マイHazemd005aを「LPDIRECTDRAWSURFACE」で検索してみる。案の定、そんなものは無い。っじゃあ(大文字小文字区別なく) 「SURFACE」で、検索。ヨクワカランが、「C:\MAMEDEV\hazemd005a\src\windows\drawd3d.c」のあたりでは、 「LPDIRECTDRAWSURFACE」にあたるものは、「d3d_surface」だろーな?コメントに、 // Useful info: // Windows XP/2003 shipped with DirectX 8.1 // Windows 2000 shipped with DirectX 7a // Windows 98SE shipped with DirectX 6.1a // Windows 98 shipped with DirectX 5 // Windows NT shipped with DirectX 3.0a // Windows 95 shipped with DirectX 2 って書いてある。つまり、Win95+DirectX2でも動くじぇ-。って書いてある。Gensの「SetSurfaceDesc方式」みたいに、 完全にDirectXのVERに依存する(註:DirectX5以降でないとこのメソッドは存在しない)方法ではなくて、 常識的に「lockして直アクセス」してる。やっぱこの方がいいなー。Gens(のx1モードとx2モード)は、「lockしない方式」なんよ。 ここで概要を書いとこう。(Gensの「G_ddraw.cpp」の方式)
<前略> <苦労してサーフェイス取得> if(Rend < 2) { memset(&ddsd, 0, sizeof(ddsd)); //まず(設定を)消す。 ddsd.dwSize = sizeof(ddsd); //そんで(設定の)大きさだけセット。 if(lpDDS_Back->GetSurfaceDesc(&ddsd) != DD_OK) //(もちろんバックバッファ用の)サーフェイス取得。 return Init_Fail(hWnd, "Error with lpDD_Back->GetSurfaceDesc !"); ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_LPSURFACE | DDSD_PIXELFORMAT; //つかう機能のフラグをセット。 ddsd.dwWidth = 336; //メガドラ仮想画面、横は336ドット固定(320+16)。 ddsd.dwHeight = 240; //メガドラ仮想画面、縦は無駄なく240ドット。 ddsd.lPitch = 336 * 2; //メガドラ仮想画面は16ビット色固定。 ddsd.lpSurface = &MD_Screen[0]; //メガドラ仮想画面の先頭アドレス。 if(lpDDS_Back->SetSurfaceDesc(&ddsd, 0) != DD_OK)//こうやって反映出来る(ただしDX5以降) return Init_Fail(hWnd, "Error with lpDD_Back->SetSurfaceDesc !"); }
えっとな、MD_Screen[]ってのは、Gensがメガドラの画面レンダーするバッファ。大きさは1ラスターが336ドット固定で、 (アセンブラレベルで)画面外にはみ出して描画出来るようになってる。 それから「if(Rend < 2)」ってのは要するに「x1モードとx2モードの場合のみ」の特殊処理。 あとは、見りゃワカルと思うが、「ddsd.lpSurface」に、描画バッファ設定してる場所と「SetSurfaceDesc」以外は、特に変わったところは無い。 これは、なにやってるのかってーと、要するに「孫がイヤガルから孫の手を背中に配置した」って所だな。 待ってりゃ勝手に描画してくれるので、ありがたい。 とゆー変態的な技は、やっぱ変態だからやめよー。ってゆーか「SetSurfaceDesc」ってやっぱ、変態的。 あー、めんどいなー。
Gensのアセンブラ以外のソースを見ると、ああ、この人は「メガデモ」な人だなー。とメガデモのかほりがするよなー。 変数名「Intro」だけでもかほる。べ、別に興信所じゃあありませんが。「メガデモ」な人ってさあ。直角ー。はイインダケドさ、 最低限度しか手間かけたくないってゆう性癖もあるよなー。いや別に偏見かもしんないけど、KANEDA氏のソースとかも、 「5日でつくったにゃりよ」とか書いてあるケド。「5日かけたんなら10日かけてよ、キボンヌ」とか思うにゃりよ。 費用対効果(コストパフォーマンス)の追求。はスゴイものがあるよなー。「5日かけたもの」と「10日かけたもの」が「殆ど同じ」ってのには、 「ガマンができない」んじゃろなー。現実的には「殆ど同じであたりまえ」なんだが。リソースに関しての切実度は、「開発期間」も、 リソースの一部な訳です。そーゆー事ではないんだがな。「4倍手間をかけても」ムーアの法則により完成度は1.?倍な訳です。 (註:ウソ度99.8%、「ムーアの法則」そんな所で適用すんなよ) コンペ以外は、興味がないのかなー。瞬発力は凄いケド持続力がさー。別に人には向き不向きの問題があるからイイケドさー。 Gensは持続力があるから、エライですね。今回の2.14は、Z80コアからR,R2が取り除かれてます。 この前見た奴(別館の奴)では明らかに(R,R2関係が)入ってたから、それ以降に「ソース見直したにゃりよ」ちう事ですな。 R,R2って「リフレッシュレジスタ」にゃりよ。「リフレッシュレジスタ」は、本当は、「バスアクセスのタイミング」ではなく、 「DRAMのリフレッシュのタイミングで動作」するにゃりよ。エミュでは、「バスアクセスのタイミング」しか判からない関係上、 無駄で無意味にゃりよ。そんなん適当に、乱数でも与えときゃいいにゃりよ。 しかも、(世間に存在した奴)まともにえみゅれーと出来てない(ってゆーかエミュでは必要なし)にゃりよ。とゆーのが真相にゃり。 あなたが一生懸命あそんだ(過去の)Gensたんは、実はそーゆールーチンも入ってたにゃりー。とゆー話。(別に実害はない)おちまい。 (2006-09/20、16:00) ■この実験版マイGens。別館にUPしといたです。 GENS214MD_A00HERE こんなんだにゃー。32XとかメガCDとかNET対戦、は排除してあります。 Gensコンパイル出来なくても、あたりまえなのです。もう一度Let’sチャレンジ。 (2006-09/20、21:47) ■Gensは、DirectInputを使用してるので、一応DirectX5以上なんだな。なんかそおいう匂いがスルなー。 全画面で死ぬ原因は、「C:\VC\SEGADRIVE\src\G_ddraw.cpp」の「SetDisplayMode」だった。これを外せば、「死ななく」なる。 したがって、「lpDD」を「LPDIRECTDRAW」から最低でも「LPDIRECTDRAW2」に変更する必要がある。(註:元は「LPDIRECTDRAW4」) そーすると「SetDisplayMode」の仕様が変わるから、「SetDisplayMode(640,480,16);」とかを「SetDisplayMode(640,480,16,0,0);」に出来る。 これをコールしても死ななくなるし、「全画面モード」に切り替わる。んが、「全画面モード」にはなるんだけど。何も表示されない。 おかしいなー。Gens方式はX5で動く筈だけど、とりあえず動かんから、極当たり前の「lockして直描き」ルーチン追加して、 実験してるんだケドなー。 (註:「マイHazeMD005a」(MINGW+DirectX8)見たら、「lockして直描きルーチン」しかなかった。だから、「lockして直描きルーチン」を追記した。 んで、「ウインドウモード」は、さしあたり「lockして直描きルーチン」で表示される。) こんな所、本質的にどおでもいいんだケド、DirectX5は(古すぎて)ワカランなー。 差し当たり、Gensは「DirectX5SDK」以上なら何とかなりそう(別にそれ以前でも構わんが、余計な苦労がさらに増えるよ) な事が、判ったんで、そろそろ「DirectXSDK」入れるかな仕方がない。 でも、理屈上(VC++6.0内蔵の)DirectX5でもイケル筈なんだよなー。 DirectXはどーでも、イイカラ、地道にASM→C言語。の作業をスルかなー。 (2006-09/22、13:10)
■別館にGENS214MD_A01あっぷしたケド。
使い方:ROMはドラッグ&ドロップで起動が簡単。 □File ROM読み込み/開放。ステート、セーブ/ロード。 □Graphic 画面の設定。 □Sound 音の設定。 □Option えみゅの設定/GYM,WAVダンプ機能 □Reagion メガドラ、リージョン設定。 □Help HP紹介/改造機能/過去に使ったROM/リセット機能 細かい事は、やってみりゃワカルでしょ。タブン。 デフォルトのキー操作: カーソルキー=方向 x y z mode 「A」「S」「D」「F」 「Z」「X」「C」「V」 A B C start
XPや2kで動くんだろうか?べ、別にXPや2kで動かなくたって、PSPには関係ないから、 イインだけどさ。でも、もし試したなら「動いた/動かない」ってこのページにコメント入れてくれると嬉しいなあ。 もし、XPで動くなら、「DirectXは今の方法で固定」って事で悩まなくて済む。「DirectXSDK」が手に入んないし、 DirectXの過去の情報もヨクワカランのだわ。ワタシには。 (2006-09/23、22:00)
■もうこのブログは、完全に急がば回れ。回ってるダケのよーな。気もするが、差し当たりPSPに関係のない事ばっかやってる、一応表面的には。 まあ、深層的にも関係あるんだか無いんだか判りませんが、ってゆーか(PSPと)アンマリ関係ないんで、書かないでおこうと思ったんだが、 実は「MPT117RC2(註:OPEN_MPT)」のコンパイルを始めた。これはタブンPSPと純粋に関係がないと思う。 (註:さすがにコレをPSPに移植スル気はナイ、最低でもキーボード無いと絶対不便だしさ。) (註:しかし、いつもワタシは、思ったとおりには物事が進まない)んで、「OPEN_MPT」は(「dmoreg.h」がねえと文句たれるので) 「DirectMusic」を使ってるらしい。「DirectMusic」ってX7からだっけ?ヨクシラン。 (註:コンパイル成功したら、「DirectMusic」は排除するかも) 日本MSでVC++6用のSP6(サービスパック6)を見つけたんで、UPしてみたが、DirectXSDKに関しては変わらないっぽい。 ソンはして無いが、(手間が)そんした~。 しょーがない「DirectX9SDK」入れる事にした。でかいな~、と思ってたけど。それは、最近の奴の話。 たまたまHDDにあった奴はチッチャイ。「dx9sdk.exe」は、227MBしかなく、展開しても327MBytesしかない。(FAT32で約400MB占領) これならDX8SDKと大して変わらんなー。良かった。タダシこいつは「日本のMSオフィシャルからはDL出来ない」。 米MSの「.COM」からDLした。(註:オフィシャル)DLした日付は2006/08-19。正確にはえっと、[227,732KB]。 場所(アドレス)は忘れたが、多分まだあると思う。なるべく古いのを探そう。 (2006-09/24、19:30)
■ところで、「DirectXSDKのインストール」なんて「もうずーーーと前にやったキリから忘れちゃったよー」って人もイルかもしんないので、 (註:ここに一人イル)自分の為に、書いておこう。えっとマズVC++にはある程度なら「標準でDirectXSDKが入ってる」よな。確か、 VC++5がDirectX3SDK相当で、VC++6がDirectX5SDK相当?(X6?)らしい(あくまで雰囲気。正確なVERはワカンネ) んだから、DirectXSDKを解凍しても「パスが設定されてなければ無意味」な訳。んで、当然VC++でパスが設定されてる部分を 弄る必要がある。ワタシはOK、OKでVC++いんすとーるシタケド「パスの設定」なんて「DOS臭い」もんは、無かったよ? そうです。標準では自動でやってくれる。しかし、DirectXSDKイレルのならそこは弄らなければあかんのです。 さて、ゴタクはアキタんで、パスの設定。「ツール(T)」→「オプション(O)」→「ディレクトリたぶ」 えっと、マズ「インクルードファイル」の設定だな。ワタシは「dx9sdk.exe」を「C:\dx9sdk\」に展開したから、「C:\dx9sdk\Include」って 書いて、そいつを「一番上に」持ってく。出ないと内臓のVER不明な「DirectXSDK」が使われちゃう。そいつより何が何でも 「パスを先に」設定する必要がある。VC++だって上から順番に探すだけだよ。DOSと同じ。 set_path 別にC言語講座じゃないんだから、こーゆーネタを延々書くつもりは無いんで、安心を。ってゆーか、そんなん書けんがな。 「C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE」ってのに、「VER不明な怪しげなDirectXSDK」が入ってるのです。 せっかくINCLUDE設定しても、「古いLIB」をリンクされちゃうので(できないケド)意味なし、 同様の方法で、「表示するディレクトリ(S):ライブラリファイル」に合わせて、ライブラリーパスも設定しよう。こいつはワタシの 場合は「C:\dx9sdk\Lib」勿論、一番上にしよー。ここで、もし「SEGADRIVE(pc)A01」を、ビルトし直せば、それだけで実行ファイルが、 全然変わるじぇー。(当たり前だが)んで、実験してみた。案の定「876KBytes→888kBytes」になった。べ、別にいいケドさー。 「DirectX9」どころか「DirectX7」あたりの機能も前々使ってないケド。きっと「ddraw.lib」の「実質部分」が増えたんだろうなー。 (註:ddraw.lib自体は5KBytesしかない。これはX8までは「ddrawからd3dを呼ぶ仕掛け」。X9以降は「d3dからddrawを呼ぶ仕掛け」に、 変わったんだと思う、丁度IEと同じ手口だな~。) そろそろアメブロ限界でこのページには記事が書けない。 (2006-09/24、20:30)
GY3 ちょっと、実機画面を調査してみた。ひじょーにいいかげん(精度悪し)の調査なんで、信頼性0%。くれぐれも信用せんようにな。 さてと、昨今は著作権も色々あるので、コレグライもざいく?かけりゃいいじゃろ。っていっても、このページは非常にアレなので、 画面の真中部分は殆ど関係がない。 さて、実機は眠い画面なので、真中の画像はGensから切り出したイメージを多少てきとーに色修正した。(註:色は厳密ではない) ドットだけが欲しい。ちなみに画像の縦は262ラインにした。(つまり「時間」ダケが知りたいからな) 今回の実機は、初代ワンダーメガ。他のは出すのめんどいんで勘弁。んで、調査もドット単位で合ってる訳ではない。が、2ドットとか はずれてないじゃろって感じ。(まーヨクワカラン)なんせ「ここ」と「調査地点」が物理的に離れてるんで「記憶だけで描いた」からなー。 まず、このゲームは何だか説明せんでもワカルじゃろ。「ういんぐまん」が戦う、あのゲームだよ(ウソ度56%) さてメガドラRGB化すると、画面の外に変な線がチラチラ表示されるよな。 そのお話。タイトル画面上方の像の背景の非常に暗い青。これは実機では結構明るい青。これがこの画面での「ボーダーカラー」。 「ボーダーカラー」はいわゆるパレット0の色。旧MSXやSMSと仕組みは同じじゃろ。 上の画像で画面の外側の「明るい青と暗い青」は、実機で表示される。ここの色は、実機では「ボーダーカラー」。 左右の「赤色」は「メガドラ黒」。下部の暗い黒(ダークグレー)も「メガドラ黒」。 「メガドラ黒」は結構明るいからRGB(15,15,15)が白として、RGB(5,5,5)ぐらいかな?とにかくこれが「メガドラ黒」結構明るい。 (註:メガドラはVDP→CXAの外付け回路の都合上、一定以下の暗い色は出ない。メガドラ黒以下の色。は回路の都合上出せない。) (註:メガドラ黒はVDP内部では、もちろんRGB=0,0,0のつもり) (註:VDPは+0V~+5Vで、出力。CXAは約-0.2V~約+0.2Vで入力。外付け回路は抵抗とコンデンサで安価に分圧してる) (註:VDP:セガはACメーカーだから、メガドラVDPはACに耐える出力レベルを確保してる。) (註:CXA:「SONY-CXA1145」又はその互換、後継チップ。(後継はVシリーズ)「ビデオエンコーダー」つまり、「RGB→NTSC変換チップ」 当時はメジャーで、一部「SFC」や「プレステ1の一部ロット」にも採用されてる。) さてそれ以外の「白い部分」。ここは「本当の黒」そりゃ、RGB(0,0,0)に決まっとるじゃろ。ここには「走査線が来ない」だから、 黒くて当たり前。黒くないならモニターの調整やりなおせ。感電死してもおk。 下の右隅。ボーダーカラーはこの辺で消失。ここから下は、どんなパレットが設定されようが強制的に「メガドラ黒」。 さらに下のガタガタしてる部分は、書き間違えた訳ではない。まず真中のへこみ。これは、VSYNCじゃろ。ご丁寧に2ラスタ分、へこむ。 それから、右下。この辺で走査終了する。 (追記、註:どうも。このへこみは「メガドラのVSYNC」ではなくて、「コンバーターのVSYNC」らしい。つまりメガドラとは関係がない。 「コンバーター」でVSYNC排除して、「新しく作ったVSYNC」を追加するんじゃろ。タブン) (ちなみに「ソニック2」の「インターレースモード」似たようなタイミングだが当然「終わりが2ヶ所」出来る。 一ヶ所は「上のボーダーカラー」消失点と同じ。もう一ヶ所は「半ラスター下」つまり一ラスター下の左下前の方。ここが「もうひとつの ボーダーカラーの消失点」) 実は、使った機材(イマドキ200ラインモニターは困難(出すのめんどい)なので、間にコンバーターが入ってる)が悪くて、 (この機材では表示されないので)走査開始点は上には描いてない。んが、確か古い記憶だと画面の真中辺から描き始めた気がする。 つまり上の画にもう1ラスタあるんじゃあないかな?そこで記憶を元に追記。走査開始点はワカランからてきとー。 コンバーターが入ってるから、正確なドットじゃあ無いがな。 上下のラスタもラスタ数はいいかげん。右の「メガドラ黒」は「2ドット」。左はたぶん9ドット。その内側のボーダーのドット数は結構アバウト。
「紫の部分」ここには(このゲームのこの場面では)「白い点」がチラチラ表示される。位置はワカランからてきとー。大体この辺。 但し、ラスタ(縦位置)は正確。
「緑の部分」ここには「いろんな色」が表示される。もちろん「メガドラパレットの範囲内の色」。 2ヶ所、切れてる部分がある。ここには「絶対に表示されない」間隔はアバウトだが、各1ドット。 それから、「緑」の右端。ここは1ドットはみ出す。この辺の「緑」の右端部分の色はほぼRGB(15,15,15)の白なので、判り易い。
さてと、「タイトル画面」はアキタから、「オプション画面」に行ってみよう。上の画は、単なるコピペだが、(オプション画面での ボーダー色は実機では「メガドラ黒」)実機では、上の画での「紫と緑の部分」、チラチラ部分。これが全く無くなる。消えてしまう。 何でだろ?
イッタイあのチラチラは、何が表示されてるんだろう?。「オプション画面」に入ると無くなるのは何でだろ? 「オプション画面」に入ったときに、「VSYNC割」とか「HSYNC割」とか「その他のINT」が無くなるのかな?それともOBJ? 調査の必要があるなー。
もう一回画面、見に行ったケド。左右の青い部分のボーダーは、もう少し(左右とも+2ドットぐらい)あるかも?オプション画面で、 左の「青と赤」を足した長さが、ダイタイ柱2本の長さと同じくらい。 (2006-09/17、00:33、ねむい)
さてと、メガドラえみゅを作るなら、CRTCの時間管理に、こーゆー情報は必要なんだよな。んで、仮に上記画像が100%合ってるとしても、(註:そんな訳ない) まだ少し情報が足りない。「水平帰線期間」がないからな。んでも正確なドットクロックが判れば、1フレーム割る262が1ラスタだから、 そこから上記画像の総横ドット数(赤+青+画面+青+赤)を引けば、残りが「水平帰線期間」だな。 (2006-09/17、13:00)