#1お魚さんはMAMEのベースに最適?。(2006-01-31)
今日始めて「お魚さん」の奴コンパイル、実行してみた。
$ make
ld -O0 obj/startup.o obj/error.o obj/io.o obj/cpu/m68kcpu.o obj/cpu/m68kops.o ob
j/cpu/m68kopac.o obj/cpu/m68kopdm.o obj/cpu/m68kopnz.o obj/cpu/z80.o obj/sound/f
m.o obj/sound/sn76496.o obj/sound/sound.o obj/render.o obj/system.o obj/vdp.o ob
j/loadrom.o obj/genesis.o obj/mem68k.o obj/membnk.o obj/memvdp.o obj/memz80.o ob
j/_clib.o obj/pg.o obj/main.o obj/main_sub.o obj/main_text.o obj/main_sound.o ob
j/menu.o unziplib.a -M -Ttext 8900000 -q -o mdpsp.out > main.map
ld: warning: cannot find entry symbol _start; defaulting to 0000000008900000
./outpatch.exe mdpsp.out mdpsp.outp "USERPROG"
successed filesize:00182B3D modulename:000E9CE4 scemoduleinfo:00116A1B
./elf2pbp.exe mdpsp.outp "MEGADRIVE 0.22(for Education)" ICON0.PNG
Elf2Pbp v0.3 - loser 2005 +PNG
successfully generated pbp file
makefileは、こんな感じ
TITLE = "MEGADRIVE 0.22(for Education)"
# makefile
# please at the first time only type to 'make maketree' on bash console.
#add tools
RANLIB = psp-ranlib
MD = -mkdir.exe
#BINARY = out
BINARY = mdpsp.out
BINARY_P = mdpsp.outp
OUTPATCH = ./outpatch.exe
ELF2PBP = ./elf2pbp.exe
ICON0 = ICON0.PNG
OBJ = obj
OBJDIRS = \
$(OBJ) \
$(OBJ)/cpu \
$(OBJ)/sound
OBJS = \
$(OBJ)/startup.o\
$(OBJ)/error.o \
$(OBJ)/io.o\
$(OBJ)/cpu/m68kcpu.o \
$(OBJ)/cpu/m68kops.o \
$(OBJ)/cpu/m68kopac.o \
$(OBJ)/cpu/m68kopdm.o \
$(OBJ)/cpu/m68kopnz.o\
$(OBJ)/cpu/z80.o \
$(OBJ)/sound/fm.o \
$(OBJ)/sound/sn76496.o \
$(OBJ)/sound/sound.o \
$(OBJ)/render.o \
$(OBJ)/system.o \
$(OBJ)/vdp.o \
$(OBJ)/loadrom.o \
$(OBJ)/genesis.o \
$(OBJ)/mem68k.o \
$(OBJ)/membnk.o \
$(OBJ)/memvdp.o \
$(OBJ)/memz80.o \
$(OBJ)/_clib.o \
$(OBJ)/pg.o \
$(OBJ)/main.o \
$(OBJ)/main_sub.o \
$(OBJ)/main_text.o \
$(OBJ)/main_sound.o \
$(OBJ)/menu.o
LIBRARY = unziplib.a
all: $(BINARY)
$(BINARY): $(OBJS)
ld -O0 $(OBJS) $(LIBRARY) -M -Ttext 8900000 -q -o $@ > main.map
$(OUTPATCH) $(BINARY) $(BINARY_P) "USERPROG"
$(ELF2PBP) $(BINARY_P) $(TITLE) $(ICON0)
# outpatch
## strip outp
# elf2pbp outp "MEGADRIVE for PSP 0.22"
$(OBJ)/%.o : src/%.c
psp-gcc-4.0.0 -O2 -mgp32 -mlong32 -msingle-float -mabi=eabi -c $< -o $@
$(OBJ)/%.o : src/%.S
psp-gcc-4.0.0 -mgp32 -c -xassembler -O -o $@ $<
$(sort $(OBJDIRS)):
$(MD) $@
maketree: $(sort $(OBJDIRS))
#clean:
# del /s /f *.o *.map
お魚さんの奴はDGENに比べて実行速度のレベルがずーーーと低い。
(訂正19:01。改造してみたらDGEN1.00と比べて、それ程極端に遅い訳ではありませんでした。
むしろ、あのAUTO_FLAME_SKIP機能で損をしています。
ただし無改造ではFPSのコントロールが、できないのでゲームになりません。
思考ゲームなど、速度がいらないゲームは除く)
DGENの1.00なら1コマ落としで、VSYNC、OFFなら、
殆どのゲームが60fps近くで、動作する。
が、
お魚さんの奴は、何コマも、落としている。
ひらたく言えば、がたがたで、ゲームの画面はでる、がゲームにならないものもある。
ちなみに、SN76496(477だっけ?)しか、音が出ない。
(一般的にはPSGと言われますが違うチップです。いわゆるSN系です。
SN系は特にノイズに特徴(こだわり)がある。
ノイズを殺してしまうと、矩形波っぽい音しか出ません。
PSGは普通AY-3-なんたらとほぼ互換のチップを指す。
EMU界では常識ですが、一般人はどれでも一緒なのかもしれませんね。
GBやファミコンやナムコ音源やSCCまで、PSGなんて呼んじゃってるし。)
しかしながら、画面の再現性は良い。
それに、C言語なので、管理人の好みであるし、
MAMEに改造するのも簡単そうである。
しばらく、お魚さんを弄ってみよう。
初心者がベースにするのなら、DGENよりこちらのほうが良い。
初心者が参考にすべき順番は
HelloWorldPSP > RIN > お魚 > DGEN > NESTERJ
かも知れない。
(但し、全部落としてソースも読む事。
NESTERJのUNZIPLIB.Aもソース落としてコンパイルする事)
そうそう、お魚さんの奴は無圧縮のROMは読めないみたい。(謎?)
ZIPファイルに圧縮しておこう。これで、RUKA版の「UNZIPLIB.A」は
どこも悪くない事が、判明した。(怪しいなんて言って、ごめんなさい)
これから、これを使おう。
つまり、PSP-GCC400ベースで、何処もソースを直すことなく、あっさりコンパイル成功した。
(STARTUP.Sは「USERPROG」にしたけど)
別館に現在の管理人が(ソースを)一切いじってないVerをUPしておきました。
(まだ見てもない。でも、STARTUP.Sは少し変えた)
「俺は急いでんだよ!うらぁー」って人はDLしてもいいです。
もう少し(2~3日)待ってくれれば、今から手を入れる(予定)なので、
もう少し進化した(非公式)Verになると、思いますが...
デバッグ用に「AUTO_FLAME_SKIP機能」を殺してみた所。
(35~40)fps程度、出るようです。DGEN1.00の8割程度(但しYMとPCMなし)の性能は、
あるようです。あくまで、管理人の気分です。きちんと比較したわけではない。
画面の再現度は、高く、パノラマコットンのタイトルやデモ画面のラスタ割もきちんと出ますし。
(げーむはちとまだまだ)
あの辺は、たとえばDGEN1.00は処理の都合上Z80のミラーリングなど、殺してありますが、
その辺の基本機能がしっかりしているのでしょう。(ソース見てないから予想)
別にゲームに遊びたくてチェックしてるんではなく。エミュでバグりそうな(しかし簡単な)所から
チェックを入れてます。
「ローリングサンダー2」はOK(ラスター+画面切り替え優先順位のチェックOK)(大昔のDGENはバグった)
「パーニングフォース」はだいたいOK(ラスターパレットのチェックOK)(少し前はGensでもバグった)(でもVDPディレイがないから1ラスタパレットが上にズレル)
「OutRun2019」はOK(ラスター+画面優先順位のチェックOK)(これはある程度ラスター関係がきちんといってればOKの筈)
「パノラマコットン」のデモ画面の1ラスターずれはOK。ゲームはNG。(まだ実装してない割り込みがあるという事)
「ターボアウトラン」の割り込みは、夕焼け面(INDIANA PORIS)まで行ってチェックして見ましたが、
1ラスタもずれていないし、Genecystみたいにタイマーが進まない事もない。(この件は完全実装。これは割り込み。忘れたけどIRQ関係だっけ)
まだまだ、色々チェックポイントがありますが、いい加減チェック飽きてきたんで、
つまりベースにしたエンジンが比較的最近の物であるという事です。
Gens程の完成度があるかどうかは、もっと沢山の(特にGenecystでは起動すらしない)ゲームで
チェックする必要があります。(たとえばパノラマコットンはGenecystでは起動しない)
つまり、DGENエンジンよりは次世代のエンジンです。
準Gensぐらいのポテンシャルはありそうです。
■「ラスターパレットディレイ」について。
現在のエンジンでは「ラスターパレットディレイ」は実装されていない為。
「バーニングフォース」では1ラスタパレットが、早くなります。(1ラスタ上にずれます)
「ラスターパレットディレイ」とは何かというとVDPの動作を考えれば判ります。
「VDP」は一体何をしているのでしょうか。
「VDP」の動作は現在の「エミュレーター」いわゆるMAMEの動作と技術的に似た仕組みです。
エミュレーターは画面を描画するために端から1点ずつ地道に計算し、表示します。
1ドット表示するために、
現在のすべての画面(メガドラなら8+2ぐらい)の優先順位や
全てのOBJ(スプライト)の優先順位を決め、
OBJなら128枚中32枚を選び出し、
画面なら10枚中1枚を選びだし、
さらにOBJと画面のどちらが優先か決め、
これらはもろもろの特殊設定も考慮しつつ、
やっと1ドットを決定します。
あれ?パレットは?パレットはどおしたの。
もちろん、パレットは意図的に説明で省略しましたが、パレットも考慮してやります。
しかし、68000がハードウェアーパレットだと思って設定するのは、当時業界唯一と言われた。
高速RAM。=VRAM=デュアルポートRAM=どんなタイミングでも読み書きできる。
ですが、所詮DRAMなので、バスウェイトの呪縛から逃れる事はできません。
つまりは、68000がパレットレジスタだと思っている。VRAMの一エリアは、
VDPの速度にとっては、データーを取ってくるのがとろい。(万が一サイクルが引き伸ばされたらどおする)
という事になります。
この辺はアーケード基盤で鳴らしたセガの事。とっくに対策済みです。っていうか
アーケードゲーム業界なら常識。パレットなんてそんなに沢山ないんですから、
VDP内にパレット用のキャッシュメモリ
(わかる人には、要はレジスタです。CPUのレジスタの様にVDPのレジスタという物が存在します。
これは本物の「VDPレジスタ」です。エミュでの用語や実装と混乱しないように。似て異なる物ですから)
を配置して、しまえば済む話です。
(技術的にはCPU==VDP==DMAです。ついでに==DSPです。(これはメガドラには関係ないが)
みーんな似たような構造です。用途が違うだけです。VDPは比較と加算しかしない(できない)です。
DMAはコピー(転送)と加算しかしない(できない)です。)
VDP内部の計算は、(所詮アダーとコンパレーターしかないが)キャッシュから持ってきて、
時々68000用のパレットレジスタ(つまりはVRAM)からキャッシュにフラッシュバックすれば良い話です。
さてどんなタイミングで動いてるのでしょうか。68000とVDPは基本的には非同期で動いてます。
同じ家に住んでいて、心臓の速度は殆ど同じ人物で(バスの都合)でも夕食の食事の時に顔を合わせ。
後は居るんだか居ないんだか、合ったこともない。68000とVDPはそんな関係です。
(Z80という隠し子がいるが、似たようなもんです)
VDPは一応三度のご飯の時に「飯にきたかな?」とチェックはするんですが、人影がなさそうなら、
自分も食べないで、食堂に行きません。
68000やZ80はルーズなので、食事をしない時もあり、いつ食べるのかVDPには良くわからない存在です。
「あいつら、なに考えてんのか解らんし、いつ来るかもわからへん、へんな奴らや。でも、年長者の責任。
メガが人気なんわ、わいのお陰、若いもんの動向は、口出しはせえへんけど、一応チェックしとか、
あかんねん。事前にトラブル回避するんが、上手く付き合うコツや。メガの屋台骨しょって立つんわ。
わいしかおらへんやからな」と思っていて、なかなかまじめな性格の様です。(ほんとか?)
なーんか話がどんどん脇にずれてって来たような気がするし、そろそろ書くの飽きてきたんで、
えーと、つまり、人影のチェックてえのが、パレットや割り込みのチェック。
他のVDPレジスタもこのタイミングでチェックします。(そおいえば隠し住居人のDMA君もいるんだよな)
処で「割り込みのタイミングは何時?」
いい質問です。
VSYNC割り込みは一画面書き終わったら(フレーム毎)。
HSYNC割り込みは一行(線です)書き終わったら(ラスタ毎)。
です。
では、もしVDPが人影をチェックし終わった直後に68000君が現れたら
(正確には68000は全然関係なくて、バス(の調停)が動作したら)
VDPはきた事気が付きません。しかしながら、VDPは鼻が鋭く、一度68000が現れたら、
残り香で察知できます。(本当に調べたんだな!聞いたんだな!)
そおいう訳で、人影(VDPレジスタ、パレットを含む)が反映されるのは、次の食事時(次のラスタ)に、
なってしまうのです。
一方エミュ界。VDPレジスタにパレットが設定されると、(つまり68000が書き込むと)瞬時に反映され、
次のドットの計算時には、もう反映されてしまいます。これはまずい。VDPレジスタは、キャッシュにして
とっておいて次のラスタまで待ちましょう。
そおしないと「バーニングフォース」でパレットが、約1ラスタ早く更新されて、管理人が遊ぶ時に困るから
です!。早急ーぅ、に改善しましょう、今すぐっ!
と言う訳で、VDPレジスタはキャッシュが必要なんだよって話。
以下無駄口。
もちろん日本版のThorも吸い出して、どっかにあるんですが、(古いEMUでは)動かなかったので、
どこにしまったやら。管理人てっきり、プロテクトかなんかと思ってました。最近のGensでは動くらしいから、
(動作チェック用に)探してこないと。っていうか実機でまだ解いてなかったりして。(雲の面あたりまで行った)
(サターン版は何度か解いたけどさ)
管理人MDのROMに関しては殆ど全部(日本版で実機で少なくとも300本以上は)持ってます。
(但しスポーツ類を除く、あまり興味がないので。でも結構あるな)
MDのソフトは違うの売ってるの見たらすべて買ってたもので。(一体バイト代何万つぎ込んだのやら)
だから、MDに関しては怪しげな海外サイトに行く必要がないんです。
MDのチェックにはROMという足かせがないので、簡単です。
老舗花札会社と違って、MDはマッパーがありませんしね。
ただし、「テトリス」はありませんよ。当時底値が¥5000~8000位だった。(純正取説付き、パッケージ版)
(海賊版ではなくてです、まあ海賊版も底値は似たような値段でしたが)
鋼鉄帝国とか当時のアキバの例の3軒家で、
1年以上は¥1980で売ってたのに、なんであんなプレミアが付くの?
スーパーファンタジーゾーンだって底値は¥980ぐらいだったのに。まあいいや、あるから。
あーーー気がついたら、また無駄口モードになってるぅ。