■「picodrive」までジャンプ!
■「ぷよぷよ1の謎Ⅱ」(2006-04/19)までジャンプ!
■「ぷよぷよ1の謎Ⅲ」(2006-04/26)までジャンプ!
■「ぷよぷよ1の謎Ⅳ」(2006-04/30)までジャンプ!
■「ぷよぷよ1の謎Ⅴ」(2006-05/01)までジャンプ!
■「ぷよぷよ1の謎Ⅵ」(2006-05/16)までジャンプ!
■「ぷよぷよ1&2の謎Ⅶ」(2006-05/24)までジャンプ!
■
■■ぷよぷよの謎(2006-04/13)「SEGA DRIVE」
「こっそり DGEN for PSP 開発日記」は役に立つ。「SEGADRIVE」は「DGENpsp1.00」出身のエミュなので、
今初めから読み直している。同じ問題はチェックするべきだろ。
で、DGENの初期の頃って「ThunderForceⅣ」動いてたらしいな。いいな。今は動かんじぇー。
(追記:A24から動きます)
それはともかく、「ぷよぷよ」で音が出ない。って書いてある。元祖?2?SUN?と思ったが、
取り敢えず。今メモカにあるソフトを全部消して、チェックソフトを総入れ替えする事にした。
これで、PSPを落として無くしても言い訳がたつ。「不思議ちゃん1」は精神衛生上よろしくない。
で、全部消す。あ、未だに32MBのメモカでチェックしてる。っていうかメモカ入れ替えなんてやりたくないし。
当然予備の32MBのメモカは腐らせてある。秘境→電気屋さんまで、行く気力があるなら、在庫処分の安いの
適当に買っても32MBなんて事はあるまい。しかしめんどい。(注:この32MBはずーーーと前に(約1年前)在庫処分セールで
買った奴。1枚¥700-ぐらいでDuo変換アダプタ付)
えーと、とにかくソフトいれて8MBぐらい余ってるな現状。「TF4」と「super忍」は必要だからまた入れた。
で、元祖「ぷよぷよ」起動!本当だ。音が出ない。こりゃZ80の仕業かな?
見えます三重ナス、Z80霊のしわざです。イタコが逝ってるから、間違いねー(本当か?)
ちゅー事で、原因不明です。ハイ。が、面白くなってきたじぇー。
(2006-04/13、16:00)
■うお゛ーーー「スタークルーザー」起動しないどころかエミュが落ちる!!!!
本当か?それ。
とにかく、うちのブログは、アクセスがあっても、「誰も読んでない」事が判明したな。
それはそれでええよ。やばい事書けるかもしれん。いややっぱ理性が自主規制。
ま、「スタークルーザー」。動くとは思ってなかったけど。でも、Genesystで完璧に動くんだぜ、
だって最後まで解いたもんね。(ちょっと自慢)
(2006-04/13、16:05)
(2006-04/27、追記。DGEN140なら「スタークルーザー」動きます!!。マニアはぜひ。ステートもあるしね)
■「シャイダク」かさかさ音しねえ。こりゃ「super忍びよよん問題」と同じだろ。タブン。おし、「シャイダクかさかさ問題」
参考書見ても良いから、明日までにやって提出する事。(ぜってー無理)
(2006-04/13、16:20)
■「ソダン」起動前に変な画面出る。が、これは正常動作じゃろ。(もちろん実機では出ない)
実機とパレットの動作が違うからな。これは対した問題ではないな。色々直せば自然に治る些細な問題だと思う。
が、こういうのが不思議ちゃんみたいなとんでもない糸口を連れて来るから、侮れないちゃあ侮れないんだが。
いずれにせよ「ソダン」は、海外版の直輸入でラベル張り替えたダケ「バイナリレベルで海外版と一致」するが、
それでも「メガドラ」のソフトである事に変わりはない。わたしも当時、「あまりの評判」に怖いものみたさで、
ついうっかり金をどぶに捨てた。ちゅーか「ネタ」なら安いもんだよ。今でもそう思う。仮に時給¥500のバイトとして、
¥1980-(前期)のソダン。四時間バイトすりゃ買えるんだじぇー。それでも¥2000で旨いもんでも喰った方がまし、
のよーな気もするが、うーんやっぱ旨いもんの方がええなあ。じゅる。
もちろん当時のソダンは真っ先に捨てた(注:友達に押し付ける)から、「ソダン」都合四回くらい買ってる気がする。
だってbeep MEGA DRIVEが悪いよ。変な特集組むからまた「ネタ」で買っちゃうジャン。で、また捨てると。引越しの度に
ソフトは捨てる(注:あげる)から、こういう事になってる。実質いくらソダンが¥980(後期)として、約¥6000は、
何時のまにやらつぎ込んでるな。べつにええけど。それくらい。なんちゅーかメガドライバーの基本的な金の使い方の気がする。
常にダブりに気おつけてるのに、幽霊のように何時の間にかソフトがダブる。不思議だ。
「スーパーファミコン」より単価が安い筈なのに、何故か知らんが結局たくさん費用がかさむ。
だから、「メガCD」とか出ても高いとか判断する余裕がなく、当日予約はないが、なんとなく買い。
で「ウッドストック」徹夜で解き。あまりの「音楽ネタ」の豊富さに笑う。ゲームがクソなど初めっから気にしない。
だって、良いゲーム見慣れて、目が肥えてるもんな。それが当時の標準的メガドライバー。
あ、ちなみに今は神に誓って一っ本しか所持しておりませぬ。ええ。絶対です。万が一でも、2本もあるのは
生理的に厭ですから。万が一見つけたら、それこそ「ゴキブリ」に出会ったよーな気分になる。
■「PS2」(ファンタシースターⅡ)起動すら、しねえ。これでエミュって呼べるのか?ってグライ基本的なゲーム
が動かねえ。少なくともコイツで遊ぶかどおかは別問題として、起動せん事には話しにならんじゃろ。
だんだん「全然駄目」って事が判って来たじぇー。やっぱソフト総入れ替えして良かったな。
(2006-04/13、16:35)
(2006-04/27、追記:A24から動きます)
■「ソニック」(元祖)動く。ちゃんと動く。が、ゲームは無理だ。
FSKIP1、サウンドOFFで、やっと60fpsに到達する。ただでさえFSKIP1で別ゲームなのに音もだせない。
悲しいかな、一般人と違って、メガドライバーは動態視力が発達しすぎている。FSKIP1では、ぜんぜん
別ゲームにしか見えない。悲しい。どおせスピードが出せる所なんて、ほんのちょっと、殆どは走れなくて、
ストレスの溜まるゲームだ。でも一面のあれは、「掴みが重要」やっぱメガドライバーのアイデンティティーに、
深く関与する非常に重要な問題なんだよ。
ふつーに遊ぶ分にはFSKIP入れまくってガタガタにして遊べばいいんだが、なにか割りきれんな。
ちなみにFSKIP0、サウンドOFFは50~54fps。大体51fpsぐらい。でも50fps程度だと、のろくさい別ゲーム。
こんなの「ソニック」じゃねえ。ガッカリ。
(2006-04/27、追記:ソニック1は現在結構動く。A27開発中版にて。ただしAUTOFPS)
■「ソニック2」音がしない。すわっ。Z80霊の仕業かつ。Z80霊大活躍だな。ちゅーか、それは関係なくて、
m68のメモリ周りかもな。怪しいもんな現状。
■「ソニック3」重い。とてつもなく。でもちょっと実機気分も、少し。とんでもなくガタガタだが、思い出す程度だが。
■「ナックルズ」は昔買ったけど、いま手元にないから保留だ。残念。そんな嘘臭い事言わんでもと思うかも
しれんが、倫理上ちゅーか法律上仕方ないじゃろ。現状、まあ売ってりゃどおせ二束三文だろから買いなおすが、
それまで保留。
■「ソーシャルキングダム」こいつも外せない。このゲームはGenesystだと「魔法使いの沼のイベント」で、
割り算命令(単なるウエイトで使ってるだけ)で落ちるから、パッチ当てて該当部分をNOPに変えて、で、解いた。
確か「符号付除算命令」だったな。
うおお、「SEGADRIVE」は実機っぽい画面でいい感じだな。22050だからちとサウンドがキンキンするが、許容
範囲かな。いちおうあの「丸い音」もするしな。このゲームはさすがにPCのエミュで遊ぶ気がせんよ。だって、
あの眠い画面が再現されない限り、見るも無残なグラフィックで、画面が汚すぎるもん。SEGADRIVEの眠い
画面はダテじゃないんよ。考え抜いてそれでも「ゲーム性」が落ちるから、結局実装したし、やっぱ外せない
ようになってる。実は関数のポインタにして、選択式にするだけだから、切り替えの実装は簡単なんだが。
切り替える必要性を感じないんだよ。いづれおまけで付けとくが。
void kannsuu1(){内容}
void kannsuu2(){内容}
void (void * henyo)();
で、
henyo=kannsuu1;
とか
henyo=kannsuu2;
とかで、
henyo();
って使うんだっけ。なんかその程度のコードで実装出来る。C言語の基本機能なんだが、やる気しねえ。
もう一度発色チェック。こりゃ結構キレイだがそれでも、実機とマダだいぶ違う。少し上の方を歪ませないと、
駄目だな。メガドラは20台以上買ったし、そのうち5台以上はRGB化したし、テラドラもワンダーメガも
持ってるし、だから偏見ではないぞ。新品でも品質がいろいろあって、ばらつきは確かにある。ゲーム機の
中では「元祖ファミコン」に次いで、個体差があるマシンだ。だがどの程度のばらつきか知ってる。あんまり
異常に歪むのは真似しなくてもいいだろが、それでもな。もちっとなんとかせんと。
発色チェックなら「スーパーハングオン」も欠かせないんだけど、今日はメモカに入れなかった。チェック時には
必ず入れる。あれも絶対に外せない。
(追記:いれてチェック。実機ではこの「スーパーハングオン」が画質を見極める足切りソフトになってる。
アフリカコース(一面)スタートさせて、センターラインが、見えるかどおか。見えなければ、そのメガドラ実機は
何らかの調整が必要。本来の画質ではない。が、新品でも見えない奴が存在する。奥が深いだろ。エミュ
(SEGADRIVE)ではちと、見えすぎかな?だからもちっと歪ませて良い。メガドラRGB改造して、一番感動する
のがここだからな。ポイント。試験に出すからその積もりで)
(2006、04/13、19:05)
■「ソーサリアン」オープニングの画質がエミュで再現出来ないのは「デンジャラスシード」の星問題と同じく、
根本的な問題だから、これは仕方がない。が、やはり「SEGADRIVE」ではOBJ(スプライト)がテキトーなのが、
ばれてるな。OBJが消えちゃうからゲームになんない。っていうか無理。これは隠れた名作で、実はとても
良いゲームなんだ。一部非人間的な謎があるが、でもセガからの挑戦状だと思えば、...少なくともタケシよりは、
挑戦されがいがあるよ。本当に名作なんだけどな。これ解かないで死ぬなんてなんてもったいない人生なの。
と余計な老婆心を駆り立てるくらい。どうぶつの森に嵌れるくらいコンジョーがあるんなら、これに嵌まってみなよ。
別に不老不死で何の問題もない。謎がキツイ以外、ゲーム的には低難度。だって解いたもん。「ysⅢ」みたいに、
せっかく低難度で盛り上げといて、最後の最後で、メガドラ版だけ、めちゃくちゃキツイのとは訳が違うよ。(ありゃサギだ。)
とにかくこいつも遊べるようにせんと駄目だな。ステートがつく頃に。とにかくアラユル「ソーサリアン」の中でも、
やっぱ名作。シナリオとマップ多少手直しして、ケータイあたりでたいとーあたりが出してくれりゃ人気コンテンツ
になるのも実は夢ではない。眠らせとくなんて、なんて勿体無い。
(注:このゲームは根本的にPRGでシナリオ命。アクション性はチョビット。)
(2006-04/27追記:ソーサリアン解からんが、A26の33から動くっぽい。だが現状ステート作ってないから、
結局遊べない。(限定的に動作する)遊ぶならDGEN140で、だが凄い残像...結局微妙。)
■「太平記&TELTELスタジアム」両方ともGenesystでは画面がバグる。だから何度も吸出しチェックした記憶が
ある。当時はGensなど存在しなかったからな。PC用のメガドラエミュはGenecystのみ、あとはDGENの初期版とか
存在したがまともにゲームが起動しないカス揃いだった。いまのDGENとは全く全然レベルが違う。megasisもなかった。
で、「SEGADRIVE」。ちゃんと動くじゃん。がっかり。じゃあ今度は「クライング」かな?
ちぇ「クライング」の吸い出した奴、隣のPCにある。(1mグライ)持ってくるのめんどいからまた今度。(1mは遠い)
今日は過去CD漁って、たまたま出てきた奴の「S」の辺の一部やっただけ。だからファイル名称(ゲーム名称)が偏ってる。
100%ごーほーだよ。全部ちゃんと吸い出した奴。ちうか、当時焼いたCD。インターネット無いんだから、
そうに決まってるが。(当時持ってきたのは、Genecyst本体のみ)
なんつーか、単なる個人のブログなのに。いちいちそんな事まで書かにゃならんのは、世知辛い世の中だよな。
ちうかコンピューター技術の進歩の為には、コピーは絶対に必要なんだよな。本当は。そこを見逃して(あるいは、
知ってる癖に目をつぶって)権利ばかり主張するから、著作権法とか。現状の「著作者」を全く保護してくれない。
著作権法とか。ワケワカラン状態になってるんだよな。「企業の権利」は保護して「著作者の権利」は無視。酷い法律だよな。
「著作権法」なんて嘘臭い名称は今すぐ止めて、「コピー禁止法」にするなら、いっそすっきりする。「進歩禁止法」とかな
「新規技術開拓禁止法」とかさ。だいたいあれ決めた役人。「著作」なんてした事ないだろ。「音楽著作権協会」も
同じだな。作詞、作曲した事ないよ。あそこまで酷い野放しで、結局長期の裁判で負けるってのは、どこか狂ってる。
おひまひ(2006-04/13、19:29)
■■さてと、ここまでの話はすっかり忘れて、「picodrive」
なんだ、大抵動くじゃん。やっぱ、SEGADRIVEは一時あきらめて、こっちに注力するのが、正しいあり方かも、
しれん。いづれにせよFSKIP0どころかFSKIP1でさえ夢のまた夢。
この前弄って多少速くなった分は、実はm68000コアしか基本的に弄ってない。あとは、なんでもかんでも
グローバルちう、スピード考えてないプログラムだから、スタティックにしてやっただけ。基本的にSEGADRIVE
と違ってなーーーーんもコア弄っとりゃせん。以外じゃろ。わたしもあんなに軽くなるとは思わなかったからな。
単に「ヘッディー」がやりたいから、ちと軽くしてみたちゅーのが真相。疑うならMAGOのたらたら日記で、
日付確認してくれ。つまりそおいう事だ。始めっからエミュなんてまじめに作る気はありゃせん。ちゅーか、
誰か作ってよ。まともな奴。PSPでメガドラエミュ、はっきり言って、もちろんわたしが作ったのも含めて、
まともなのが一本もありゃせん。っていうのが真相だぜ。だーれも作ってくれないから、仕方なく自分用のを、
作ってるの。で、シロートだから、ちっとも出来ない。これが真相だな。シロートだから遠慮もへったくれもないの。
なんであれで満足なんかい。あれは画面がみれるだけ。ゲーム出来ないの。残念だけど。まだ。ううううう。
先は長いし、急いでも仕方ないし、おまけに愚痴たれても仕方ない。のんびりやるか。気が進まないが...
どおせ俺が気に入るエミュなんて、指くわえて待ってたって誰も作ってくれやせん。だってみんなあのレベル
で満足なんだもん。知らないって恐ろしいな。なんかやる気せんな。
(2006-04/13、22:22)
ううう全然関係ないケド管理人、花粉症でつらいす。ぐすんぐすんぐすん。
■■追記2006-04/19。ぷよぷよ1の謎Ⅱ。
今日さ、SEGADRIVEA25弄ってんだけど。ぷよぷよ。しゃべるじぇー??何で?(SEGADRIVEA24は喋らない)
凄く変。とても重い。
ええと、今日はZ80に手を入れた。要らんルーチン、とっぱらったら。
AERO BLASTERSのFSKIP0+5512で、50fps前後→48fpsグライへと、重くなった。
まあ、いつもの事かいなと思ってたんだが、こいつはやっぱ重くなってるかもしれん。まあ戻しゃあ済む話。
それは本題ではなくて、
とにかく、おかしい。(SEGADRIVEA25)
「シャイダグ」は音がとてつもなく遅くなった。
「グラナダ」はとてつもなく重くなった。(FSKIP2でゲームにならん程重い。丁度昔の「不思議ちゃん2」みたい)
「不思議ちゃん2」の動作も変だ。
とにかくおなか空いたからあとでね。(17:43)
で、とにかくZ80が黒なごーーー。
DGENこっそり開発日記の前編。ついに読破したつ。実にカンドーの物語なのでつ。今年の秋の読書感想文は、
これに決定!
エート。何の話しだつけ。そおそお。ぷよぷにね。
なんつーか。まず、エミュの仕組みから。
MAME:汎用エミュ。ドンナ方式でも何でも恋。(ちと誤植)最近(←注:前世紀)のはZ80burnとか。
ええよもう。ってくらい。オタクな処理漫才。もとい満載。128ビットバスとかさ。TIしか使わん領域とか。
ってここまで書いて、ちやんと説明できる自信がなくなってきた。
で、<中略>(ご自由に記事を妄想下さい)
と、いう訳だ。SEGADRIVEの元になった。つまり、PSPDGENはDGEN系で、詰まるところ長い目で
見ればGENSと似た系統。
時分割でm68000やZ80を処理する。Z80を最大長くコールする部分は最大でも、一ラスタ分。
Z80のクロックは3.57MHzだと思うが4MHzって説もある。(未だによくワカラン部分が残る)
多分Z80burn等、とてもオタッキーな命令があるから、そういうのまでちゃんと処理すれば、
クロックは結局3.57MHzに落ち着くって落ちだと思うが。「Z80burn」はもろ、「クロック」に直結する
フューチャーだもん。
とにかく仮に最悪値4MHzだとしてだな。4MHzってのは4,000,000Hzの事だい。つまり、
Z80の1クロックは400万分の1秒だな。
メガドラは一秒間に60フレーム描く。つまり60Hz。で、1フレームは262ラスタ。つまり1ラスタは、
(60x262)Hz。
さて問題。(仮に4MHzの)Z80は一ラスタに最大何クロック実行出来る?
簡単な割り算だな。
こーゆーの、難しく考える事無い。直感でいいんだよ。つまり単位はHz両方逆数だ。
はい、電卓。
60x262は、15720。
4000000割る15720で、254.452926208651399491094147582697...だそーな。(コピペ)
つまり最大処理クロックが256超えない。charで足りる。
ぼけーと。Z80のソース眺めてて、直感で気が付いた。(人間ってつくづく不思議な動物だと思う。
テストでもこれくらいの能力発揮できれば苦労せん。)
SEGADRIVEに乗ってる。「MZ80.C」(注:シャープの昔の機体名ではない事に注意。MultiZ80emulator@c)は、
命令ごとに消費クロック計算してる。たとえばNOPなら、
switch (bOpcode) //どんなめーれーかにゃ?
{
case 0x00: // nopたん
{
cCycles -= 4; //働いたから疲れてジュース四つ飲んだ
/* Intentionally not doing anything - NOP! */
break;
}
ちう感じ。
そう、その「cCycles」だよ。
UINT32 mz80exec(UINT32 dwCycles) //死ぬまで働け!びしばしっ!ひえー
{
<関係ないので略>
while (cCycles > 0) // とめてくれるなおっかさん。
{
bOpcode = <宇宙の神秘>
switch (bOpcode) //どんなめーれーかにゃ?
{
case 0x00: // nopたん
{
cCycles -= 4; //働いたから疲れてジュース四つ飲んだ
/* Intentionally not doing anything - NOP! */
/* 意訳:国際的にnopちゅーのは何もしねーのがじょーしきなんだよ - タコ! */
break;
}
で、cCycles って型は何でしょう?
ちょっとセコイけど、「signed char」でいいよね。
(追記:ああ、「signed char」じゃダメじゃん。「unsigned char」はないとダメだし、「unsigned char」は、
while (cCycles > 0) // とめてくれるなおっかさん。
なんて出来ないし、なーーんか疲れてなんだな。きっと。ちゅーわけで「signed short」は、いるにゃ。)
(追記:しかも「後記」の「LDIR」や「CPIR」等「ループ系命令」は「BC」レジスタの数値によっては、
(エミュにとって)「凶悪」な命令と化す。実機でもBC=0xffffとかスゴイ凶悪かも)
ちっと前の元は、
static signed long cCycles ; /* Used as a countdown */
だった。32ビットも要らん。PCなら、INT==32ビット、要らなくても速いから使うけど、PSPはCHARが速い。
で、CHARってのは、ちと不安だから、
static signed short cCycles ; /* Used as a countdown */
の16ビットにして、コンパイルPSPで実行してみた。
そーすると「ぷよぷよ」が上の状態に!(A24で確認出来る筈でっす)
つまり絶対におかしい。おしまい。
(2006-04/19、22:11)
■■追記2006-04/26。ぷよぷよ1の謎Ⅲ。
今日さ、SEGADRIVEA27弄ってんだけど。ぷよぷよ。しゃべるじぇー??何で?(SEGADRIVEA24は喋らない)
凄く変。とても重い。
って、キターーーーー。萌えヴォイス再現。(C)synz。
とにかくZ80ちゅー。Z80Z80Z80Z80Z80Z80Z80Z80.だんだん280に見える。
原因は、ブロック転送めーれー。
例えば、オペコード0xed, 0xb0の「LDIR」他にもいくつか。
10個ぐらい、「}while ((cCycles > 0) &&」とか「else{ cCycles += 5 ; }」とか書いてある命令全部だよ。
とにかくこのZ80はバグダラケじゃあ。でも、Z80入れ替える技術もないし、ひたすらバグ抜いて、
だいぶよさげになってきつつある。ぷよぷよ2も音でだしたし。EDプレフィックス以外も沢山バグ抜いたし。
「*pbPC」以外に「cpu.z80pc」のバグもある。(注:本来どっちか一方で良い筈)
それから、無駄なキャスト(UINT32)もバグの原因。DDCB、FDCBプレフィックスは全部抜いたと思う。
CBプレフィックスもかなり酷かった。まだDD系とかみるとこたくさんあるよなあ。
(2006-04/26、23:20)
うひー。picodriveでは、「ぷよぷよ」ちゃんと音鳴る。で、「LDIR」って判ってるし、picodriveのZ80調べてみたら、
なんとループしない。
#define LDI { ¥
WM( _DE, RM(_HL) ); ¥HLレジスタでメモリ読む。DEレジスタで書き込む。(つまり転送)
_F &= SF | ZF | YF | XF | CF; ¥フラグ調整
_HL++; _DE++; _BC--; ¥1回分
if( _BC ) _F |= VF; ¥フラグ調整
}
#define LDIR ¥LDIRの仕様上、「LDI」を「BCレジスタ回数」転送する筈なんじゃなかったの??
LDI; ¥←これは「LDI」つまり一回分転送。
if( _BC ) ¥
{ ¥
_PC -= 2; ¥プログラムカウンタ調整(これも特殊)
CC(ex,0xb0);¥クロック加算。(この命令は特殊で、特殊クロック加算)
}
...って、これじゃあ。「LDIR」じゃなくて、「LDI」じゃん。Z80のバグ??
とにかく「Z80」は良くワカラン。もっと資料を漁る必要がある。
(2006-04/27、02:03)
ううーん。ワカンナイけど、そんな訳ないし、「メガドライブ」発売時にはZ80は10年選手で、既に数百円。(多分2000-700グライ)
LDIRって、たったの2バイト転送で「21クロック」もかかるから、普通の神経じゃ「使わなかった」可能性が高い。
(多バイト命令だし。)でも、きっと「ぷよぷよ」は「基本に忠実」なプログラムで、使ってるに違いない。が、ヨクワカラン
多分本物はBCレジスタのカウンタで、「ループ」(つまりブロック転送)するんだろけど。「詳細」ヨクワカラン。
しかも、「ブロック転送」しない方が、何故かどのゲームも安定動作する。
「ブロック転送する必要ない領域」をブロック転送してて、エミュでは(あるだろうと思って作ってあるのに)実機には、
「そんなものはない」という可能性がある。(メモリとか)Z80以外にイロイロ「複合要因」(m68も)が絡むから、
イマイチ詳細が掴めない(バス調停とか)うーんワカラン。
(が、ぷよぷよとグラナダは少し良くなった気がする。)
Z80止めて、いろいろ実験したら、ガンヒーとかヘッディーとかPS2とかソニック1とか、super忍1とか、
みーんなm68にサウンドドライバいれて、FMのみ鳴らし、Z80は「PCM」だけ同期させてるみたい。それが、
合理的だよな。作るのも楽そう。(Z80は素人には速度出すのが、めんどい)76は調べなかったケド、多分m68が鳴らす。
でも、ソニック2とかは、それじゃあ間に合わなかったらしく、Z80に音楽を担当させてる。
(註:ソニック2には「対戦」がある。ラスタで切って「同じもの」を動作させる必要があるから「m68」のプログラムは
2倍速にしなきゃ間に合わない)
(註:普通のゲームはZ80に音楽担当させる。が、その分「PCM」の速度を叩き出すのが辛くなる。
だから、Z80を「PCM再生専用」にすれば「音楽」にPCMのドラムを使える。PS2やヘッディーが良い例)
そおいやフェリオスは、効果音のみm68だし、ローリングサンダー2も手分けして鳴らしてたし。これは「伝統」?
ついでに「バーニングフォース」と「マーベルランド」も似てる、同じ人?
ちうか、「マーベルランド」と「デンジャラスシード」のプログラムの組み方って特にそっくり。ナムコ方式?
(2006-04/27、03:47)
■■追記2006-04/27。珠には単なる開発日記。
ううう、SEGADRIVEA27。開発中だけど、また重くなった。受難。ちょっと前まで、22050なら、
「InsectorX」を、FSKIP0で、ほぼフルフレーム近い速度が出てたのに...。A26なら試してみて。
(ここに無いから解らん)巧くいけば、「凄く遊べる」。
Z80バグ抜きつつ、対応するCPPやmainの不要なルーチン取り外したら、何故か重く...。そのうち軽くなると、
信じて続行しよう。PSPのALIGNの問題は本当に厄介。
(2006-04/27、16:13)
■■追記2006-04/30。ぷよぷよ1の謎Ⅳ。
やっと、Z80の「LDIR」(ブロック転送命令)の謎解けたよ。
すごーーーーく基本的な恥づかしいような謎だ。
まず。「picodrive」のZ80。いやゆるMAMEの「CMZ」な。ありゃ、間違いだ。でもなんで、
「ぷよぷよ」ちゃんと動くんだろ??
LDIRの問題は要するに、「1命令」の実行時間がとてつもなく長い事。
BCレジスタは16ビット長。つまり0x0000から0xFFFFまで、で。
BCに0X0000を入れて実行すれば、65536回(0x10000)転送するじゃろ?
一回転送あたり、21クロックも消費するから、消費時間は21x65536クロック。
メガドラのZ80は3.579545MHzで駆動してるから、
1クロックは、(1/3579545)秒。つまり、(21x65536/3579545)秒は、
0.38447791...秒。
たったの「1命令」でこんなにかかるの許されるのか???
メガドラ(1/60)秒単位が基本で動いてる。(1/60)秒で画面を一枚書き換える。
これが一フレーム。
つまり、「一命令」で23フレーム。
うまくいくわきゃねえ...orz
(2006-05/01、00:15)
■■追記2006-04/30。ぷよぷよ1の謎Ⅴ。
今日、Z80の「LDIR」系(ブロック転送命令)と、DDXX系。(つまりHandleDD()。)を手を入れた。
したら、「Sonic2」で音楽が鳴る!!
最近のA26とかA27とか開発中A28とかは、Z80のせいで音がおかしい。つまり萌えヴォイスモード(C)Synz。
で、「Sonic2」は益々おかしくなった。
なんと「セーガー」サウンド。始めから高い音だが、後半から「パワーアップして高くなる」
つまり、「セ→ガ⇒」から「セ→ガ♂」
(2006-05/01、04:19)
えーと、具体的に、
sdwAddr = (INT8) *pbPC++; // Get the offset←まだ直してないが、ここはsigned char っぽい。(現状unsigned char)
sdwAddr += ((INT32) m_regIX ); //←無駄なキャスト。&無駄な変数
sdwAddr &= 0x00ffff; /* my_masked */
bTemp = nz80_read(sdwAddr );
(sdwAddrは何故か無駄な変数)
みたいな奴を、
bTemp = nz80_read(IndirectIX());
にした。IndirectIX()は関数でなくて、実はマクロ。現状、
#define IndirectIX() (unsigned short)(m_regIX + ((INT8) *pbPC++) )
まだ(unsigned char)で直してない。*pbPC++は現状怪しいので、このマクロを使ったら必ず、
cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
で、PCの再調整。無駄だが安定動作の為には仕方がない。ここもあとで外れる筈の所。全部コピーで、
ペーストしたから、「要らなくなった」らエディターの「置換」で一括削除が可能。何だが、今のうちにマクロ化
しとくかな。名前はエート「ADJ_FUZZY_PC」これでいいや。取り敢えず。そしたら、「pbPC」や「cpu.z80pc」の
デバッグも楽になるしな。
(2006-05/01、04:46)
■ううう、「Sonic2」また音が変わった。「Sonic3」の動作も変わった。そおいや、書き忘れたが、「Gens」のZ80参考にしたら、
「Gens」のZ80の場合。プリフィックスDDxxとFDxxは「プリフェチ」の段階で「4クロック消費」する様になってる。
なってないZ80エミュは真似するよーに。(もちろん4+で良い)で、問題の未使用命令な。こいつは、
クロック不明でも数クロック消費する筈だから、さしあたりA27では無難な9クロックにした。だか、これはてきとー。
てきとーでも「0クロック」とか明らかに間違ってるよかずーーーとまし。で、「Gens」の場合、未使用命令
(実は仕様が公開されてないだけで実装されてる。一般的には「未使用命令」と言われいわゆる「隠し命令」だな
こいつらは動作するし、「NOPと動作が同じものでも」「クロックを消費」する。この場合の「クロック消費」はNOPと
違う可能性がある)
はすべてNOPに飛ばしてる(アセンブラだからジャンプしてる)。NOPは当然4クロック「消費」するから、
例えばDDxx系の「未使用命令」(実は隠し命令でクロック消費や「動作」が違うかもしれない)の場合。
プリフェチ分の4クロック+NOPの4クロックで、計8クロック「時間を消費」する訳。
てきとーに9クロックにしてたけど、これを8クロックに変えた。
結果。動作が少し良くなった。実機でも、本物の未使用命令以外の命令は、DDxx系2バイトなら、
多分8クロック動作だと思うよ。合理的だな。
いずれにせよエミュレーターにとって正確な時間管理は生命線。いずれLDIR系命令の「命令途中実行」も、
サポートせねばなるまい。(それをしないと理屈に合わない)
(2006-05/01、06:12)
■■DDxx系とFDxx系は実はインデックスレジスタが違うだけ(つまりIXまたはIYの違いのみ)なので、
共通化した方が良いかも知れない。(Z80内部では当然同じもの)速度的なメリット次第。
PSPの場合は、共通化した方がキャッシュに乗って速くなるかも知れないし、既に両方キャッシュに乗ってて、
オーバーヘッド分だけ重くなるかも知れない。が、私は前者だと思うな。現状FMが重過ぎるから、少しでも
変なものをキャッシュから追い出した方が、今はもちろんパフォーマンスに効かないが、あとで効く可能性がある。
SEGADRIVEは、目先のパフォーマンスよりも「後で」を考えてコーディングしてる部分がある。現状全体のコードが、
あまりに未完成なので、ちぐはぐなんではあるが。
えっと、HandlerIXIYって所は既に共通化してある部分。現在のPCならばこういうコードは書かない風潮だな。
それと同じ事をDDxx系とFDxx系でやろうって事。で、やってみてパフォーマンスが出なけりゃ。戻せば良い。
(展開形式にする)「戻すの?意味ないジャン」って思うかも知れないが。それは「プログラミング」を知らなすぎる。
「同じもの」が「違って書いてある」のが現状。一緒にして、また分割すれば、「バグ」が抜けるだろ。
ちなみに普通の「プログラミング」ではこんな変な「手間」はかけない。大体Z80が怪しければ、
「Z80を入れ替える」のが常識で、それ以上考えない。だが、「SEGADRIVE」も「picodrive」も屁理屈に感じるかも
知れないが、「物を作る事」が目的ではない。っていうかそれは確かに「第一目的」何だが。それだと「仕事」だろ。
はっきり言って「仕事」にする気はさらさら無いんだ。この「違い」多分全然ワカンナイだろな。私には「明確に違う」
んだが。「明確に違う」から、怪しげでも何でも「常に最新のソース」を公開してる。「古い奴」じゃ駄目なんだよ。
「意味が違う」もん。基本思想が「MAME」と同じ。多分全然ワカンナイだろな。「パブリックソース」の考え方にも
「種類がある」って事。「仕事」なら「ソース公開」しないし、する場合は。「安定版のみ公開」する。
「安定版のみ公開」と「不安定でも総て公開」では「意味が全く違う」。当然「プログラムの組み方」まで変わる。
この違いは「明確」なんだ。そして、「やった事ない奴」には「絶対解からない」。
「ソースリスト」には現在のノウハウが100%コーディングされている。(勿論「消す」から実は100%ではない)
だが、それは「ソースリスト」の一面にしか過ぎない。別の一面もある。
「ソースリスト」は「プログラマーの影」。「プログラマー」が動けば「影の形も変わる」。元が動いていなければ、
「影の形もたいして変わらない」。元が動くと「影の形が大きく変わる」そういう関連がある。
「作曲者」と「曲」。どちらも重要で、優先順位など付けられないが、(付ける事自体、無意味)。
「曲」は「作曲者の影」。「作曲者」が動けば「曲の形も変わる」。元が動いていなければ、
「曲の形もたいして変わらない」。元が動くと「曲の形が大きく変わる」そういう関連がある。
つまり、そおいう事。大事な事は、「目に見えない」。「ソースリスト」にも「書いてない」。
だが、「大事な事」が「存在しない」訳じゃない。「明確に存在する」。そしてそれが「存在する」から、別館に、
「picodrive」と「SEGADRIVE」がある。「それ」が存在しなければ、現時点で「絶対に存在しない」。あれらは、
動いてる影の一部だから、現状。残念ながら完成度が低い。それを解かっていて、あえて、総て別館にある。
屁理屈に感じるかも知れないが、「あれらは明確な影」で「本体ではない」から、「全然価値を感じない」んだよ。
不思議な事に「ソースリスト」は最後の砦ではない。もし「最後の砦」なら、絶対に公開しない。もし、「最後の砦」
という考え方なら、「公開する」のは「プライバシーのない気違い」。そんな事にはならんのだよ。そういう風に
しか考えられないのは「幻想」に取り憑かれている。「説明」しても「ワカンナイ」だろな。「説明」でワカル問題では無いからな。
■とにかくZ80。今日はジャンプ関連。
参考:#define ADJ_FUZZY_PC cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base
//ここのキャストも(現時点では)ちと変(cpu.z80pcは実はUINT16)。(が、無くす訳にはいかない。)
//本来、#define ADJ_FUZZY_PC cpu.z80pc =(UINT16)( (UINT32) pbPC - (UINT32) cpu.z80Base)
//これなら辻褄があう。(が、書かなくても自動変換される)
case 0x10: // djnz
sdwAddr = (INT8) *pbPC++; /* Get LSB first */ // この変なキャストは(現時点で
// 「符号拡張されない」意味がある。本来INT8でなくて、当然INT16)
ADJ_FUZZY_PC;
if(--m_regB)
{
sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff; //この変なキャストは実は意味無い。
pbPC = cpu.z80Base + sdwAddr; /* Normalize the address */
ADJ_FUZZY_PC;/*?*/
cCycles -= 5; //dwElapsedTicks += 5; /* 5 More for jump taken */
}
cCycles -= 8;
break;
こんなんを、
case 0x10: // djnz
sdwAddr = (INT8) *pbPC; /* Get LSB first */
pbPC++;
if(--m_regB)
{
pbPC +=sdwAddr;
cCycles -= 5; //dwElapsedTicks += 5; /* 5 More for jump taken */
}
cCycles -= 8;
ADJ_FUZZY_PC;/*?*/
break;
こういう風にする。(まだどっちのPCを使うか決まってない為、意味を変えない様にする)
で、まだ作業中。(2006-05/01、18:04.だけどおなか減ったからゴバン゛ー)
■■追記2006-05/16。ぷよぷよ1の謎Ⅵ。
ああ、A28の怪しげな「ぷよ1」の音。聞いてくれた?あとは「割り込み関連」ちゃんと作らなきゃダメ。
現状のSZ80は「IRQ」は多少処理してるが、「NMI」は無視してる。そら、動く訳ないでんがな、あんさん。
謎でも何でも無くなってきたちうか。大体判ったケド。対策は「どおしよ」。ちうか。そんなんやな。
■■追記2006-05/24。ぷよぷよ1&2の謎Ⅶ。
キターー。ぷよぷよ1の音楽が「かなり改善する」。
「A28」のCRTCつまり、frame.cppのINT4のあたりを見てくれ。
if((VDP_Reg.Set1 & 0x10) && (--HInt_Counter < 0))
{
// Trigger hint
MY68K_INT4
HInt_Counter = VDP_Reg.H_Int;
}
こうなってるよな。これは解りにくいし、効率も悪い(毎回VDP_Reg.Set1を見るのが無駄)から少し整理して書き直すと、
HInt_Counter--;
if((HInt_Counter < 0)){
if( (VDP_Reg.Set1 & 0x10) )
{
// Trigger hint
MY68K_INT4
HInt_Counter = VDP_Reg.H_Int;
}
}
これで、まったく同じ。だな。で、「ぷよぷよ1」の音楽がおかしい原因は実はここ。
現状、INT4割り込みをかけた「後に」HINTカウンタをセットしてるだろ。
これは間違い。この順序は逆。
INT4割り込みをかける「前に」HINTカウンタをセットしなけりゃ駄目。
つまり、
HInt_Counter--;
if((HInt_Counter < 0)){
if( (VDP_Reg.Set1 & 0x10) )
{
// Trigger hint
HInt_Counter = VDP_Reg.H_Int;
MY68K_INT4
}
}
これで劇的に「ぷよぷよ1」の音楽はかなり改善するぞ!!
「ぷよぷよ2」もビミョ~に良くなる。
(2006-05/24、20:10)