#?? DGEN(SEGADRIVE) 不思議ちゃん4 | //www.旧型、PSP開発幼稚園.game.jp/(本館)

#?? DGEN(SEGADRIVE) 不思議ちゃん4

#?? DGEN(SEGADRIVE) 不思議ちゃん4

ええと、現在世界一まともなメガドラエミュはgensと管理人は信じてるので、(反論求む。このページ迄)
gens212のコードをdgenにサルベージ中なんだけど...

OUTRUN_BUGGY_VDP_STATUS
(↑よいこのみなちゃーん。PSPにカードリッジ、ガチョンって挿せば、動くんですよぉ。嘘じゃないよぉ。ほんと
だよ。信じてね。)

今日もvdp_status(dgenではcoo5)を追いかけて、えっと。今日は、画面に一フレーム描画するルーチンね。

幸いgensはここはC言語なんで、昨日みたいに外国語(アセンブラ)翻訳する手間がない。
(注:管理人の第一外国語はC言語、第二外国語は日本語。アセンブラ言語はずーーーーとどっか)

■フレーム頭の

vdp_status &= 0xFFF7; // Clear V Blank if( vdpreg12_2 ) vdp_status ^= 0x10; // Toggle odd/even for interlace #if 00 if( vdpreg[ 1] & 0x40 ) vdp_status &= ~0x88; // Clear vblank and vint if(!(vdpreg[ 1] & 0x20)) vdp_status |= 0x80; // If vint disabled, vint happened #endif
をコメントにしたら、 「不思議ちゃん2」 が動かなくなった。
それはこの際置いておくとして。 ちょくちょくgensは68000とZ80をコマメに走らせていて、至極理由がもっともだと思われるので、 ちょびちょびdgenにもサルベージさせてみた。(少し重くなるが気にすんな。そおいうもんは他で稼げ) で、チョビチョビ分のクロックは判らんから、取り敢えず、
odo += m68k_execute(48); // 少し走らす(48に意味なし) run_to_odo_z80(24); // 少し走らす(24に意味なし)
で統一。68000はクロック消費してるが、Z80は、ただ喰いだな。あとで皿洗って返せよ。 で、PSPに持ってって実行。 あり、「アウトラン」と「アウトラン2019」だけ画面がバグるぜ。特にラスターが切れてる辺りに注目。 ちなみに「ターボアウトラン」はバグらない。 まあな、「ターボアウトラン」は怪しげなどっかの外国メーカーの開発だからな。 「アウトラン」と「アウトラン2019」は両方ともシムス開発だ。画面モードは大きく違うけど、プログラムは 似てるのかも知れん。 (15:00)
■あれえ、上のコメント外したのに「不思議ちゃん2」が起動しないつ。 って事は、チョビチョビクロックが悪さして、起動しないって事だな。 (チョビチョビクロック分のパフォーマンス減は2fpsグライ。現在値。まあ、誤差の範囲だな。 しかも現在fpsメーターがあてになるのかどおか良く解からん領域だしな) とにかく「アウトラン」と「アウトラン2019」だけが動作が違う。 「アウトラン2019」で、ずうううっと、遊んで 動作チェック、してみた。 おや?パレットRAMまで書き込みミスしてる。VDPのDMAか?でもメガドラのDMA。 誰も使わないようなオタッキーな、大抵の転送モードはあるんだよね。 きっとパレットRAM(専用)の転送モード(VDPコマンド)もあるよなあ。 いづれにせよ。68000もZ80も厳密にクロック消費周りを精査せんと、駄目だな。 いい加減にソースリスト切り張りしても、駄目。統一した(考え方の)基準が必要って事だ。 (15:42)
■不思議な「不思議ちゃん2」起動。 で、おっかしいなー。と思って、上のチョビチョビクロック、少しずつ外して、一体何処が「不思議ちゃん2」 起動の阻害要因なのか調べてみたつ。 現在の一フレームレンダーの構造はこう。
//ふつーのやち int md::one_frame/*_musa*/(struct bmap *bm)//, unsigned char retpal[256], struct sndinfo *sndi) { 略。 //こちらは表示画面でございます。 // Render video display at per laster's! :D for(ras = 0; ras < vline; ras++)//ここのvlineは画面モードで変わるの。NTSCの場合は、240ラスタか224ラスタ、確かそんなような数字。 { <FMタイマーの割り込み処理> 略。 68000IRQ4発行 A.<68000、Z80実行> <一ラスター分、画面をレンダリング> B.<68000、Z80チョビ実行> } C.<68000、Z80チョビ実行> 68000IRQ6発行 D.<68000、Z80チョビ実行> //こちらは非表示画面でございます。 // Run the course of vblank for(; ras < LINES_PER_FRAME; ras++) // 現在ここのLINES_PER_FRAMEが262ラスタ固定 なの。横256画面モードのゲーム「OUTRUN2019」が重いのは多分そのせい。PALもうまく動かない筈。 { <FMタイマーの割り込み処理> (gensにはここに<DMAの追加クロック計算ルーチン>があるがdgenには無い)  ←えええ?原因はここ? 略。 E.<68000、Z80実行> } 略。 ういーっす。あー終わったおわった。呑みにでもいこ。 }
このうち(D.)のチョビ実行のみを外すと、「不思議ちゃん2」は起動する。 不思議だ。 (16:44) ■多分原因は、予想どおり、DMAじゃないのか? 上記<DMAの追加クロック計算ルーチン>を、調べよう。 クロック計算直後に、 「if (DMAT_Lenght) main68k_addCycles(Update_DMA());」 で補正してる。あーしかもDMA更新もしてるつ。 (でも、ちときゅーけー。おなかもへってきたつ。17:12)
■いづれにせよ。動作がまともなエミュレーターは「クロック解析」に多大な手間をかけている。 詳細な検討をした結果、出てくるコードは1行なんて事はざらだ。素人には、ちょっと見えないコストが、かかっている。 コストって、金じゃないよ。この場合は手間と時間とやる気だな。結果的に金もかかるが、そんなん息するだけで かかるんだから関係ないだろ。
Gensは動作がまともなエミュレーターだろ。たとえソースリストが全公開されていても、みんなの目が節穴なんだから、 結局ノウハウが解からんって事だ。もし、簡単にノウハウが判るようなら、ソース公開された次の日には、全部のメガドラ エミュのレベルが一気に上がってるよ(作成放棄した物を除く)現実にはそんな事にはならんだろ。つまり、管理人も もちろん含めて、全員目ん玉、節穴っちゅー事やね。 ■さて、dgenの68kのクロック計算は「もろ自前で」やってるからまあ判るけど、 (註:解かるけど、あれ「現在のA21」クロック計算間違ってない?特にZ80。もしかして倍クロックに間違えてない?) gensのは外でやってるみたい。っていうか dgenのは、「こんだけ作業してくれ」って渡すんだけど、 gensのは「今何時です。電車に乗り遅れたらだめでちゅよ」 って渡す方式みたい。で渡す先の、 main68k_exec();がソースリスト全検索では見つからない。 starscreamも全部含めて検索してるのに。 でもきっとある筈。#defineかなんかで置換してる為。簡単に見つからないんだろう。 いずれにせよ(見つからないから想像だが)この中にstaticでクロック(つまり現在電車の時刻が何時何分)を保存してる値。 があると思う。 main68k_tripOdometer();という名前の関数もあるらしいから、ここでそのstaticな時間はリセットしてるだろ。多分。 「オドメーター」って車とかバイクについてる「あれ」(積算走行距離メーター)だよ。解かるよな。念のため。 (19:34)
上の説明「マニア」じゃなけりゃ。意味わからんだろな。 例えば、gens_68k.cってOBJリンクするとして、中身は、
static int my_time; // ここで現在の「走行距離」を保持する。 void main68k_exec(int get_cycle){ // gensのクロックタイプを、... //「もし、同じなら、何もする必要ないだろ。」 if(my_time < get_cycle) { m68k_execute(get_cycle-my_time); // dgenのタイプに変換して、実行。 my_time=getcycle; // 最新の値に更新。 } } void main68k_tripOdometer(void){ // 押したらイカンあのボタン。 my_time=0; // えいっ。あーあ押しちゃった。 }
って事。これは、考え方であって、実行した訳じゃないから知らんよ。説明用だよ。 (19:44) ■ void md::run_to_odo_z80(int odo_to) { //#if 1 if(z80_online) { int odo_start; odo_to >>= 1; // ここで68000の半分にしてるつ。 odo_start = mz80GetElapsedTicks(0); mz80exec(odo_to - odo_start); } } なんだあ、やっぱdgenの奴は中で半分にしてるじゃん。 もし、Z80が68000の半分でなけりゃ、どおするつもりだったんだろう。 つー訳で、上で実験してるチョビットの値は全部倍にしないと、だめぽ。 (20:10)
■つー訳で、早速倍にして
odo += m68k_execute(48); // 少し走らす(48に意味なし) run_to_odo_z80(48); // 少し走らす(48に意味なし)
PSPで実験してみたつ。 「アウトラン」の両名はかわらんつ。(相変わらずバグる) 「不思議ちゃん2」は、何故か少し速くなった。 今までが「めちゃくちゃトロかった。」現在も「めちゃくちゃトロい」が、「今まで」の倍速グライ。 当然あきれる程「めちゃくちゃトロい。」 「不思議ちゃん2」は、異常な程不思議だな。デバッグには、これ一っ本で、いいかも知れん。 きっと中身はメガドラの仕様を無視した異常なプログラムになっていて、そもそも実機で動く事自体が、 不思議なんだろ。vsyncとvblancを取り違えてたけど、動いちゃってそのまま出荷した。とかそんな様な落ちだと、 思う。メガドラ速いから、片手間仕事でも、ゲームくらい動いちゃうんじゃないか? 「アウトラン」だけバグるのも、非常に怪しい。「DMA使ってます。だから立ち上がりません」って言ったって、 ゲーム中にまともにDMA転送使ってるソフト。実は「アウトラン」の二本だけ。なんじゃないか?非常にありうるな。 プログラマーにとってみれば、DMAなんて訳の判らない物。使いたくないだろ?メガドラ、物凄くタコな プログラムでも、ゲームがめちゃくちゃ速く動いちゃう。(当時の他のゲーム機に比べて)だから、なにもDMA なんて、せこせこ勉強して対応する必要なんて、何処にも無い。せいぜい使ってますって言い訳用に。 ステージクリア時のキャラ転送とか、まあ遅いよりは速い方がいいだろ。って処理にしか使われなかった 可能性だってあるもんな。 さっき「2chのPSP開発スレVer.5」の過去ログ読んでたんだけど、VFPU使った転送がどうのこうの、って妄想 に近い(なんて言ったら失礼だが)ねたが延々書いてあった。そりゃ管理人だってVFPU転送が速いなら、 とっととmemcpyそいつに置換して使いたいよ。でも、それは「道具」なんだよ。料理で言ったら包丁の話。それよか、 今晩のおかずの「材料」の話の方が重要だろ。「道具」は性能の低い「道具」より性能の高い道具の方が、 そりゃ良いに決まってる。でもさ。切れない包丁だって、ちっと工夫すりゃ切れるんだよ。切れ味悪くたって、 料理の見た目(プログラムの実行速度)が落ちるだけで、おかずの材料がなけりゃ今晩おかず抜きだぜ。 いいんだよ何でも、まず動くプログラムを組め。「包丁」の切れ味の心配はプログラムが動いた後で良いんだよ。 管理人は「A20」で一応プログラムが動いただろ。だから、もっと良い「包丁」ないかなって、「調べた」訳だ。 「前後関係」の「時間の辻褄」は合ってるだろ。「前後関係」は「論理」(プログラム、プログラマー的資質)にとって 非常に重要なんだよ。履き違えたら意味が全く変わる。 だから今頃、初めて読んでんだよ。「開発スレ」まあ残念だけど、時間を消費する割には有意義な情報は、 あんまなさそう。っていうか有意義な情報があっても、(スレ違いのネタとかで)薄められすぎて、読むの大変。 で、「メガドラのDMA転送」と「PSPのVFPU転送」どっちも、ネタとしては同じ事だろ。ハードは進歩しても、 人間は進歩しない。どちらの時代も、話題にはなったけど、結局誰も使いこなせない。それは、機能が進歩しても 人間が進歩しない。 人間が進歩しない。ってのは管理人の持論だな。そんで真理だと思うぜ。レオナルド・ダビンチが昔の人だからって 現代人と比較して、馬鹿だと思う奴はいないだろ。総ての文書は左手で完璧な鏡文字。鏡に写せば、見とれる ようなきれいな筆跡だ。飛行機の無い時代にヘリコプターを発明。道具も機械もろくに無い時代だ。人間の発明した 雑多な機械は殆ど動物の行動を見て真似しただけだ。コンピューターや原子爆弾等はたまたま運良く生まれ てきた。ヘリコプターはどおだ。オリジナリティーがあるだろ。鳥の動きを見て真似した訳でもない。思いついて 計算をして、計算上は可能であっても。当時貴重な絵に残すのは、余程自信があったから。今とは紙の価値が 違う。 あんまし書くとどおせ妄想だからこの辺にしとこうな。よいこのみんなは真似しちゃだめぽ。 そうそう、開発には「妄想力」(一般的にはイマジネーションというらすい)も必要です。それが全然ない方は、 本当の土方作業しか出来ません。しかも、その土方作業すら、根本的に間違ってたりするんだよな。プログラム 間違えるのはいいです。だって人間なんだから。人間は間違える動物です。間違えた事自体に気が付かないのは 厳しいですけど人間の特性だから、ある程度は仕方がない。(向上心が無いのは困りますが) でも目的が全然無いのは、やめてお願い。
あ、よいこのみんな、動くのはゲームじゃなくて、カートリッジがゲームすると、ずれて動くんだお。良く読んで くれなくちゃ。え?そんな言い訳ききたくない?大人はずるくて、だめぽ?嘘つき? (21:50)