■FM音源の秋
HERE
ついに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)
別館の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しといたです。
HERE
こんなんだにゃー。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と同じ。
別に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)
■
ちょっと、実機画面を調査してみた。ひじょーにいいかげん(精度悪し)の調査なんで、信頼性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)