MAME たん(その4)→
(いちおMAMEのページってワカンナイからダミー画像。過去記事(MAMEその3)読んでね。)
■あ゜。syn-z氏のとこで、D-GEN1.70のソース公開されましたね。 そーゆー訳で、上は(自作)メガドラ吸い出し機の画像です。
![]()
![]()
![]()
やたっ!。(自作)メガドラ吸出し機(公開)ね。でも、ハードウェアーじゃあなあ...誰も嬉しくない... ちなみに200本以上吸い出して、インターネット上の怪しげなサイトの奴をbin変換すると結構「バイナリ一致する」ので、 ハードウェアー自体の問題は無いと思います。(見た目には同タイトルの同じゲームでもver(版)が違うとバイナリが違う) (ただしヘッダハック版(結構多い)は再修正する) (2007-10/20,20:20)
■んーと。最近忙しくてあんましpsp触ってないですケド。 えっと、おぼろげながら最近の記憶... ■MAME4ALL5.1改造版は今年2008の始め頃(1月頃)から、なんか色々(ペンゴとか)動かなくなっちゃったんで、 投げ出してあります。(つまり触ってない)src20080113.zipが最近のバックアップ??
MAME4ALL5.1改造版に関してはテストがめんどくさすぎるよなあ(ってゆーか時間が取れない) もし、MAME4ALL5.1改造してる方があれば、ちょっとアドバイス。 MAME4ALL5.1は、拡張子がcppになってますケド。完全にC言語ですので、拡張子をcに代えて、 C言語としてコンパイルした方が多少良いみたいです(たいして変わらんが)。 (註:拡張子がcのファイルをC++言語としてコンパイルする方法( -lstdc++)はあるが、 逆は出来ない為) その際、C++言語の場合、構造体の型名を省略出来るみたいですが、C言語では省略出来ないので、 数ヶ所補う必要があります。 MAME4ALL5.1の場合pspのvramに直接書いて(MAME4ALL4.7のような)パレットの変換は要らないです。 MAME4ALLは256色パレットなので、CLUTが使えると思うんだけど、CLUT自体調べても無いです。 (NJ氏のcps1pspはCLUT使ってます。) ■e氏の082fは、ちょっと変更するだけで、PSPSDKでコンパイルできます。 誰か役立つかなあと思って差分作ってたんだケド、ほっぽらかしてあるなあ。
■pspと関係ないですケド、MPT116(Mod Plug Tracker version1.16)は、 DebugビルトではダメでReleaseビルトにすれば、コンパイルできます。 その際、一部のMMXプログラム部分にバグがあるようで、 ウチ(Celeron(PentiumIII))では波形エディターが、表示できません。 波形エディターの表示部分のMMX部分を差し替えれば正常になりました。 (view_smp.cppのみMMX使わないように書き換えればOK) んで、ついでにソース(soundlib\snd_dsp.cpp)見てたら、 PCってsin(float)もsqrt(float)もアセンブラ、1命令で出来るんですね。(速度は知りませんが) (VC++のインラインアセンブラ使用) // returns sqrt(x) __inline float sqrt(FLOAT x) { float result; _asm { fld x fsqrt fstp result } return result; } // sin(x) - sine of x (radians) __inline float sin(float x) { __asm { fld x fsin fstp x } return x; } 知らなかったなあ。(きっとコプロ命令でしょう) あれ?何で'_asm'なんだ?'__asm'で無くてもいいのかあ 知らなかったなあ。 (2008-03-11,22:58)
■ CLUT についてちょいと調べてみた。(ググッタケドPSPSDK純正のサンプル以上の使い方(実用を考えて16bitとかsliceとか)の、 日本語でまともに解説してあるページが見つから無いので仕方泣く書く) (註:CLUT:ColorLookUpTable:つまり「pspのハードウェアーパレット」256色パレットらしい。 「PS1(元祖PS)」では16色パレットがあるので、16色パレットもあるらしいが、今回はよく判んなかった。) http://ps2dev.org/ に行ってエーゴ翻訳するのが本筋なんだろが、そこはそれ。 まず e氏のwiki。サンプルが無いから良く判んないな~。そこで取り敢えずPSPSDK純正のサンプルをコンパイルしてみる。 そんで判った事。PSPでCLUTを使う場合。(知らないとマズイ)チェックポイントが幾つかある。 ってゆーか(Guで)2Dの描画を行う場合には、幾つか(知らないと途轍もなく遅くなるという)チェックポイントがある。 今まで全然知らなかったんダケド。。。 順序立てて説明すると、まずCLUT「pspdev/psp/sdk/samples/gu/clut」より先に PSPSDK純正のサンプル「pspdev/psp/sdk/samples/gu/blit」をコンパイルして実行して欲しい。 slice==0, sizzle==0 34.283[fps] (8MB/s) slice==0, sizzle==1 120.387[fps] (29MB/s) slice==1, sizzle==0 224.013[fps] (55MB/s) slice==1, sizzle==1 520.973[fps] (129MB/s)
大体こんな様な結果になる筈だ。処でこれは何?今説明する。 これは、「PSPのGuでの2Dの転送速度を調べるテストプログラム」。PSPでGuを使うのならばこのサンプルはとっても重要。 □ 1.「slice」の秘密。 マズ1行目。これは256x256をGuで単純転送した場合。とてつもなく遅い。何と30[fps]程度の転送速度しかない。 つまりこれがゲームだとして、ゲームの処理時間が0でも最高で30[fps]しか表示出来ない。 (多分サンプル実行時のCPUは222MHzだが333MHzにしてもGu転送だから別に変わらない筈) 当然普通にGuを使わないでVRAM転送した場合より、遅い。(mame0.97ベースのドンキーとかだって266MHz程度で支障なく動くんだからさ)
★「slice」について説明しよう。 psp の構造はよく知らないんだけど、Guで 32bytes だか 64 bytes を超えると「とても遅くなる」なんか「ページブレイク(つまりキャッシュブレイク)」とか しちゃうみたい。詳しい構造は良くわかんないのダケド。。。 要するに、GuでVRAM使う場合は、イメージとしてVRAMの 64 bytes 毎に縦線が引いてあると思ってくれれば良い。この縦線を避けて転送しなければ、「とても遅くなる」。 PSPSDKサンプルのblit.cの「advancedBlit()」では 32bytes で縦切りしてある。このまま、この値を色々換えて実験してみると、確かに「32bytes の場合が一番速い」。 ( 64 bytes と殆ど変わらないが)
処が、この「int slice」を「変数」から「定数」に代えると、つまり「#define slice 32」とかにすると、何故か 64 bytes の方が速かったりする。 そこで別館のnamco86もnj氏の一連のえみゅも「#define SLICE_SIZE 64」にしてある。(nj86a06u3.zipの場合src/psp/psp_video.h) (nj氏の場合src/psp/video.h) ★ 次は「sizzle」について説明ね。 「sizzle」ってエーゴの辞書引いても、「意味がさっぱり解からない」おまけに「技術用語引いても載ってない」、、、 psp で Gu で転送する場合、VRAMそのままのデーター並びで転送すると「遅い」。つまり「通常時の転送は実は遅い」 「Guの内部形式」で転送すれば速い。この「Guの内部形式」つまりpspのGuにとって都合の良い形式の事を「sizzle」と呼ぶ。
んにゃ?解かったかにゃ?ワタシはイマイチ解かりませんが、まあそーゆー事だ。nj氏のソース読むのが少しは楽になっただろ-?(タブン) e氏のwikiにごちゃごちゃ画いてある絵は、ワタシは意味は理解してないが多分「sizzle」の事。 何かエミュを作るとして、例えばWSCエミュを作るとして、「VRAMイメージでレンダリング」しても「Gu転送で(速度が)台無し」になっちゃうから、 「始めからsizzleイメージでレンダリング」すれば「チョッパヤのエミュが出来てウヒョー」って訳。「妄想レベルでまだ作ってない」のですが、 これは「明らかに(レンダーは2~3倍程度)速くなるでしょうね」
★ ふう。この「slice」と「sizzle」ここ迄は判ったよね?判らん場合はもう一回読み直す事。 それでも判らん場合は「スライスチーズとスイスチョコどっちも好き」係まで。
□ 2.「解像度」の秘密。 psp のVRAMってのは 16bit のモード(RGBA5551やRGBA5650)と 32bit のモード(RGBA8888)がある事は知ってると思う。 16bit のモード は 32bit のモードに比べて「グラデーションが汚かったり」、「半透明が汚かったり」する欠点もあるものの、 16bit のモード の方が転送量が半分で済む(つまり描画が速い)から、大抵のエミュは 16bit のモード で動いてる。
ワタシの知る限り(えみゅが) 32bit のモードで動くのは「daedalus」ダケ。(多分公式PSえみゅも当然 32bit のモードだと思うケド)
んで、一方PSPSDK純正のサンプルは、「pspdev/psp/sdk/samples/gu/cube」にしろ「pspdev/psp/sdk/samples/gu/clut」にしろ 32bit のモードの サンプルなんだよな~。 16bit のモード での使い方が知りたいのに~。 そこで取り敢えずCLUTを 16bit のモード っぽく実験で(nj氏のソースを参考に)テキトーにカイゾーしてみた。
/* * PSP Software Development Kit - http://www.pspdev.org * ----------------------------------------------------------------------- * Licensed under the BSD license, see LICENSE in PSPSDK root for details. * * Copyright (c) 2005 Jesper Svennevid */ #include <pspkernel.h> #include <pspdisplay.h> #include <pspdebug.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <pspgu.h> #include <pspctrl.h> #define SCR_WIDTH (480) #define SCR_HEIGHT (272) #define BUF_WIDTH (512) #define PIXEL_SIZE (4) /* change this if you change to another screenmode */ #define FRAME_SIZE (BUF_WIDTH * SCR_HEIGHT * PIXEL_SIZE) #define ZBUF_SIZE (BUF_WIDTH SCR_HEIGHT * 2) /* zbuffer seems to be 16-bit? */ #define MAKECOL32A(r, g, b, a) (((a & 0xff) << 24) | ((b & 0xff) << 16) | ((g & 0xff) << 8) | (r & 0xff)) #define MAKECOL32(r, g, b) MAKECOL32A(r, g, b, 0xff) #define MAKECOL15(r, g, b) (((b & 0xf8) << 7) | ((g & 0xf8) << 2) | ((r & 0xf8) >> 3)) #define PSP_UNCACHE_PTR(p) (((unsigned int)(p)) | 0x40000000) //#define SLICE_SIZE 64 // change this to experiment with different page-cache sizes #define SLICE_SIZE 32 // change this to experiment with different page-cache sizes //#define NUM_SLICES 128 //#define NUM_ROWS 128 //#define RING_SIZE 2.0f //#define RING_RADIUS 1.0f //#define SPRITE_SIZE 0.025f ////////////// /* 0:頂点カラーとか使わない. */ #define USE_VCOLOR 0 #define USE_PSP_16BIT 1 #if (1==USE_PSP_16BIT) /* 0:RGBA8888, 1:RGBA5551 画面モード */ /*([psp VRAM の使い方]0:32bit で1ドット / 1:16bitで1ドット )*/ /* (描画色の演算精度) */ #define USE_SCR_16BIT 1 /* 0:RGBA8888, 1:RGBA5551 clutの画面転送モード*/ /*([pspパレットの内部フォーマット形式]0:32bit で1ドット / 1:16bitで1ドット)*/ /* (パレットの演算精度) */ #define USE_PAL_16BIT 1 /* 0:float32bit, 1:short16bit [頂点座標の形式]*/ /* [頂点座標の形式](0:浮動小数点32bit / 1:整数16bit)*/ /* (頂点の演算精度) */ #define USE_VER_16BIT 1 #else // (0==USE_PSP_16BIT) #define USE_SCR_16BIT 0 #define USE_PAL_16BIT 0 #define USE_VER_16BIT 0 #endif // (1==USE_PSP_16BIT) #if (1==USE_VER_16BIT) struct Vertex /* PSPSDKのサンプルでは「Vertex形」が「サンプルごとに違う」ので注意しよう! */ { unsigned short /*float*/ u, v; #if (1==USE_VCOLOR) // unsigned short color; /* このサンプルでは要らないし */ #endif signed short /*float*/ x, y, z; }; //struct Vertex //{ // unsigned short u, v; // unsigned short color; // signed short x, y, z; //}; #else // (0==USE_VER_16BIT) // GU_VERTEX_32BITF struct Vertex { float u, v; float x, y, z; }; #endif // (1==USE_VER_16BIT) //typedef struct Vertex16_t //{ // unsigned int color; // signed short x, y, z; //} Vertex16; ////////////// PSP_MODULE_INFO("Clut Sample2", 0, 1, 1); PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER); ////////////// static unsigned int __attribute__((aligned(16))) gulist[262144]; #if (1==USE_PAL_16BIT) static unsigned int __attribute__((aligned(16))) video_palette[256]; #else static unsigned short __attribute__((aligned(16))) video_palette[256]; #endif static unsigned char __attribute__((aligned(16))) tex_object[512*512]; //int SetupCallbacks(); #if (1==USE_VER_16BIT) /* 註:このサンプルでは「GU_COLOR_5551」があると上手くいかない。 */ // #define TEXTURE_FLAGS (GU_TEXTURE_16BIT | GU_COLOR_5551 | GU_VERTEX_16BIT | GU_TRANSFORM_2D) #define TEXTURE_FLAGS (GU_TEXTURE_16BIT | GU_VERTEX_16BIT | GU_TRANSFORM_2D) #else /* 高々2D転送で(頂点座標)浮動小数点型は要らんし... */ #define TEXTURE_FLAGS (GU_TEXTURE_32BITF | GU_VERTEX_32BITF | GU_TRANSFORM_2D) #endif #if (1==USE_PAL_16BIT) #else //static unsigned int colors[8] = //{ // 0xffff0000, // 0xffff00ff, // 0xff0000ff, // 0xff00ffff, // 0xff00ff00, // 0xffffff00, // 0xffffffff, // 0xff00ffff //}; #endif ////////////// /* [HOME]終了の定型処理 */ /* Exit callback */ static int exit_callback(int arg1, int arg2, void *common) { sceKernelExitGame(); return 0; } /* Callback thread */ static int CallbackThread(SceSize args, void *argp) { int cbid; cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL); sceKernelRegisterExitCallback(cbid); sceKernelSleepThreadCB(); return 0; } /* Sets up the callback thread and returns its thread id */ static int SetupCallbacks(void) { int thid = 0; thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0); if(thid >= 0) { sceKernelStartThread(thid, 0, 0); } return thid; } ////////////// /* こ-ゆーsliceしてないのは遅い */ static void blit_fit(int sx, int sy, int sw, int sh, int zx, int zy) { //sx=0; //sy=0; //sx=480; //sy=272; //dx=0;zx=256; //dy=0;zy=256; struct Vertex* vertices; vertices = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex)); vertices[0].u = sx; vertices[0].v = sy; #if (1==USE_VCOLOR) // vertices[0].color = 0; #endif // (1==USE_VCOLOR) vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0; vertices[1].u = zx/*256*/; vertices[1].v = zy/*256*/; #if (1==USE_VCOLOR) // vertices[1].color = 0; #endif // (1==USE_VCOLOR) vertices[1].x = sw/*480*/; vertices[1].y = sh/*272*/; vertices[1].z = 0; sceGuDrawArray(GU_SPRITES, TEXTURE_FLAGS, 2, NULL, vertices); } /* こ-ゆーsliceしてないのは遅い */ static void blit_linear(int sx, int sy, int sw, int sh, int dx, int dy) { // simple blit, this just copies A->B, with all the cache-misses that apply struct Vertex* vertices = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex)); vertices[0].u = sx; vertices[0].v = sy; #if (1==USE_VCOLOR) // vertices[0].color = 0; #endif //(1==USE_VCOLOR) vertices[0].x = dx; vertices[0].y = dy; vertices[0].z = 0; vertices[1].u = sx+sw; vertices[1].v = sy+sh; #if (1==USE_VCOLOR) // vertices[1].color = 0; #endif //(1==USE_VCOLOR) vertices[1].x = dx+sw; vertices[1].y = dy+sh; vertices[1].z = 0; sceGuDrawArray(GU_SPRITES, TEXTURE_FLAGS, 2, NULL, vertices); } /* 参考 /nj86a06u3/src/psp/psp_video.c::psp_copy_rect()この辺と似せつつ...: */ /* Gu を使うなら 最低でも、slice. */ static void blit_sliced(int sx, int sy, int sw, int sh, int dx, int dy/*, int SLICE_SIZE*/) { int start, end; // blit maximizing the use of the texture-cache for (start = sx, end = sx+sw; start < end; start += SLICE_SIZE, dx += SLICE_SIZE) { struct Vertex* vertices = (struct Vertex*)sceGuGetMemory(2 * sizeof(struct Vertex)); int width = (start + SLICE_SIZE) < end ? SLICE_SIZE : end-start; vertices[0].u = start; vertices[0].v = sy; #if (1==USE_VCOLOR) // vertices[0].color = 0; #endif //(1==USE_VCOLOR) vertices[0].x = dx; vertices[0].y = dy; vertices[0].z = 0; vertices[1].u = start + width; vertices[1].v = sy + sh; #if (1==USE_VCOLOR) // vertices[1].color = 0; #endif //(1==USE_VCOLOR) vertices[1].x = dx + width; vertices[1].y = dy + sh; vertices[1].z = 0; sceGuDrawArray(GU_SPRITES, TEXTURE_FLAGS, 2, NULL, vertices); } } ////////////// /* 参考 /nj86a06u3/src/psp/psp_video.c::psp_video_init()この辺と似せつつ...: */ static void my_video_init(void) { // setup GU sceGuInit(); sceGuStart(GU_DIRECT, gulist); /*画面モード*/ #if (1==USE_SCR_16BIT) sceGuDrawBuffer(GU_PSM_5551, (void*)0, BUF_WIDTH); #else sceGuDrawBuffer(GU_PSM_8888, (void*)0, BUF_WIDTH); #endif /* この辺はテキトー(コピペ) */ sceGuDispBuffer(SCR_WIDTH, SCR_HEIGHT, (void*)FRAME_SIZE, BUF_WIDTH); sceGuOffset(2048 - (SCR_WIDTH / 2), 2048 - (SCR_HEIGHT / 2)); sceGuViewport(2048, 2048, SCR_WIDTH, SCR_HEIGHT); sceGuEnable(GU_SCISSOR_TEST); /* 表示有効範囲 */ sceGuScissor(0, 0, SCR_WIDTH, SCR_HEIGHT); /*「アルファブレンディング(透明度付き、色重ね合わせ)」*/ // sceGuAlphaFunc(GU_LEQUAL, 0, 0x01); // sceGuDisable(GU_ALPHA_TEST); sceGuDisable(GU_BLEND); sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0); /* Zバッファ(デプスバッファ) (投影面のZ値のバッファ)」の設定。 */ sceGuDisable(GU_DEPTH_TEST); sceGuDepthRange(65535, 0); sceGuDepthFunc(GU_GEQUAL); sceGuDepthMask(GU_TRUE); // sceGuDepthBuffer((void*)(FRAME_SIZE*2), BUF_WIDTH); // sceGuDepthRange(0xc350, 0x2710); sceGuFrontFace(GU_CW); sceGuEnable(GU_TEXTURE_2D); sceGuClear(GU_COLOR_BUFFER_BIT|GU_DEPTH_BUFFER_BIT); #if (1==USE_PAL_16BIT) sceGuClutMode(GU_PSM_5551, 0, 0xff, 0); // 16-bit palette #else sceGuClutMode(GU_PSM_8888, 0, 0xff, 0); // 32-bit palette #endif sceGuFinish(); sceGuSync(0,0); sceDisplayWaitVblankStart(); sceGuDisplay(GU_TRUE); /* ここまで初期設定 */ } ////////////// int main(int argc, char* argv[]) { SetupCallbacks(); /* 定型処理([HOME]終了を登録) */ /* 512x512テクスチャーを用意して適当に絵を描く (ここから) */ // initialize texture unsigned int i,j; for (j = 0; j < 512; j++) { for (i = 0; i < 512; i++) { #if 1 // tex_object[i + j * 256] = (j ^ i) & 0xff; /* 適当な絵を描く(clut sampleと同じ) */ tex_object[i + j * 256] = (j * i) & 0xff; /* 適当な絵を描く(変な模様) */ #else tex_object[i + j * 256] = j & 0xff /*^ i*/; /* グラデーションを描く */ #endif } } /* 512x512テクスチャーを用意して適当に絵を描く (ここまで) */ sceKernelDcacheWritebackAll(); my_video_init(); // run sample int offset = 0; // SceCtrlData oldPad; oldPad.Buttons = 0; for(;;) { SceCtrlData pad; static int type_of_blitter = 0; // static int type_of_swizzle = 0; // switch methods if requested /* デバッグ用パッド入力 */ if(sceCtrlPeekBufferPositive(&pad, 1)) { if (pad.Buttons != oldPad.Buttons) { if(pad.Buttons & PSP_CTRL_CROSS) { type_of_blitter ^= 1;} // if(pad.Buttons & PSP_CTRL_CIRCLE) // { type_of_swizzle ^= 1;} } oldPad = pad; } // /* ここから Gu */ sceGuStart(GU_DIRECT, gulist); /* 256色分のパレット、テキトーに色を決める */ // animate palette #if (1==USE_PAL_16BIT) // unsigned short *clut = (unsigned short*)(((unsigned int)video_palette)|0x40000000); unsigned short *clut = (unsigned short*)PSP_UNCACHE_PTR(&video_palette); #else // unsigned int *clut = (unsigned int*)(((unsigned int)video_palette)|0x40000000); unsigned int *clut = (unsigned int*)PSP_UNCACHE_PTR(&video_palette); #endif for (i = 0; i < 256; ++i) { #if (1==USE_PAL_16BIT) unsigned int j = (i + offset)&0xff; clut[i] = MAKECOL15(j, j, j); // 16-bit palette #else unsigned int j = (i + offset)&0xff; clut[i] = MAKECOL32(j, j, j); // 32-bit palette #endif } /* (別に要らないが)単色で塗りつぶし */ // // clear screen sceGuClearColor(0/*0x00ff00ff*/); sceGuClear(GU_COLOR_BUFFER_BIT); /* パレットを実際にセット(Gu側) */ // setup CLUT texture sceGuClutLoad((256/8), &clut[0/*parette offset*/]); // upload 32*8 entries (256) /* この辺はコピペなんでテキトー。別に毎回設定する必要ないものもあるかも? */ sceGuTexMode(GU_PSM_T8, 0, 0, 0); // 8-bit image sceGuTexImage(0, 512, 512, BUF_WIDTH, tex_object); // sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGB); sceGuTexFilter(GU_LINEAR, GU_LINEAR); // sceGuTexScale(1.0f, 1.0f); // sceGuTexOffset(0.0f, 0.0f); sceGuAmbientColor(0xffffffff); // render sprite sceGuColor(0xffffffff); if (type_of_blitter) { blit_sliced(0, 0, SCR_WIDTH, SCR_HEIGHT, 0, 0/*,64*/ /*32*/);} else { blit_fit(0, 0, SCR_WIDTH, SCR_HEIGHT, 256, 256);} // { blit_linear(0, 0, SCR_WIDTH, SCR_HEIGHT, 0, 0);} /* Gu おしまい(コマンド発行) */ // wait for next frame sceGuFinish(); sceGuSync(0,0); /* ここまで Gu */ // sceDisplayWaitVblankStart(); sceGuSwapBuffers(); offset++; } /* end of for (;;) */ sceGuTerm(); sceKernelExitGame(); return 0; }
ハッキリ言って、単なる実験用なので、何か変だけど、 このまま実行すれば、「 16bit のモード 」になってる筈。 「xボタン」でblit_fit()(sliceしてないからとても遅い筈)と blit_sliced()(単にpspdev/psp/sdk/samples/gu/blitからコピペしてきたのでチョット辻褄が合わない)を 切り替えられる。
■遊び方:「適当な絵」の代わりに「グラデーション」を描く様、変更する。 「USE_PSP_16BIT」が1の場合は「 16bit のモード 」なので、(2008-03-29,02:15、中途半端ダケド眠いからお休みなさい)「グラデーション」が汚い。(ハレーションが見える) 初期化に問題があるのか、「 32bit のモード 」では1ラスタ目が変とか色々変な所はあるが気にしない/ (1==USE_PSP_16BIT)の場合に 「USE_SCR_16BIT」 「USE_PAL_16BIT」 「USE_VER_16BIT」 の3つは独立で1==ON、0==OFFが可能。このうち、 「USE_SCR_16BIT」 「USE_PAL_16BIT」 の2つを、独立でON、OFFさせて、(どの程度汚いか)実験して(見て)みよう。 ハレーションが消える(グラデーションが滑らかに見える)為には、 2つともONでないとダメ事が判る。 今回は実験しなかったが、同様に「半透明も精度が落ちると汚い」。
「MAME 0.124 リリース 取り消し」ってなんやねんそれ?<謎> (2008-03-29,20:30)
■ MAME 0.124u4でPSG/SSG(AY-3-8910系/YM2203-2610系)が更新されました. ヨクワカンナイけど、非常に面白そうではあるのですけど...但し、 3ストリームの場合の(1ストリームのモードもある)mix_3D()ってのは、止めた方が速いと思います。タブン。 INT32 vol3d_tab[8*32*32*32];のテーブルサイズなら、素直に掛け算と割り算でミキシングした方がタブン速い。 ■ 近況報告: 1)DARIUS(darius/ninjya_w+darius2(3screen)==4x8tilemap)/DARIUS2(darius2(2screen)==6x8tilemap)を (専用tilemapで)チョビット速くした。 あと、オマケでNA(tileNA)とナイストもチビット。 (ナイストは相変わらずメモリ足りないので、バグッタ画面。objとroadはプライオリティー使うが(FB方式ではビルが地面に潜るので却下) tilemapのみプライオリティー使わないのでdariusと同じ手法を使う) static UINT8 HandleTransparencyPen_raw(tilemap *tmap, UINT32 x0, UINT32 y0, UINT32 flags) <略> if( pen==0/*transparent_pen*/ ) { ((UINT8 *)transparency_bitmap->line[y])[x] = code_transparent; /* ←本当は無くしたい */ *(x+(UINT16 *)pixmap->line[y]) = 0/*PAL_GET(pen)*/; /* 透明は0なんで(pixmapに)描いちゃう */ bWhollyOpaque = 0; } else こーゆーふーにして、 static void pdo16np( UINT16 *dest, const UINT16 *source, int count/*, UINT8 *pri, UINT32 pcode*/ ) { memcpy( dest,source,count*sizeof(UINT16) ); /* opaqueは単純転送 */ } static void pdt16np( UINT16 *dest, const UINT16 *source, /*const UINT8 *pMask, int mask,*/ int value, int count/*, UINT8 *pri, UINT32 pcode*/ ) { int i; for( i=0; i<count; i++ ) { if( source[i]/*(pMask[i]&mask)==value*/ ) /* 0は透明なんで飛ばす */ { dest[i] = source[i]; } } } こーゆーふーにした。本当は transparency_bitmap 自体無くしたいケド、判断が良く判んないので効果は半減。(マスクは要らなくなったので) 2)NAのエメラルディア(4bppモード)はMAMEの方式ではPSPの場合メモリが足りなくて実装できない。(GFXをこれ以上増やせない) レンダー工夫すれば何とかなる可能性もあるものの。その為保留。(投げ出してあるともイウ) 3)m72は、pspMAME097src061208.zip からやり直してるが、ヨクワカンナイ。 4)(システムをチョビット簡素化して)チビット速くした。まあ、あまり変わってないともイウ。 5)そ~云えば(DARIUSとかの)画面がよってるのはバグ。src/psp/osd_video.c::static void update_visible_area(struct mame_display *display)の gfx_xoffset = (/*gfx_width*/480 - viswidth ) / 2; if (gfx_display_columns > 480/*gfx_width*/ ) gfx_display_columns = 480/*gfx_width*/ ; この辺を修正。バグってる奴は512になってるのでズレてる。このせいでチビット速くなったのかも? 6)風邪ひいた。今年の風邪は咽喉にくるから注意。 (2008-04-27,01:00)
■ NOIZ2SAv07 関係ないケド NOIZ2SAv07.zip をコンパイルしてみた。(NOIZ2SAv08.zip(ソースコード無し)とは関係がないので注意) 現在(2008/07/07) NOIZ2SAv07.zip(ソースコード同梱) の入手先は、 QJ には無いらしく DCEMU にある。 http://psp-news.dcemu.co.uk/psp30codingcomp.shtml なお、今回コンパイルした NOIZ2SAv07 は、4面を選択すると問答無用でpspが死ぬというバグがある。 オリジナルでも発生するバグなのか、(1.5->1.0変換して)調査してないので知らない。
補足: | |
http://ps2dev.org/ の リポジトリ。ウチは未だに svn を入れてないケド。svn が無くても例えば、 この辺 http://www.koders.com/info.aspx?c=ProjectInfo&pid=5LR8WPHN72K9CD8DA5L1MBY6EE とかから rRootage や noiz2sa(v08?)のソースコードは(一つずつちまちま)ダウンロード出来る。 (昔はもうちょっと便利なページがあったケド、無くなっちゃったみたい) |
NOIZ2SAv07.zip を解凍し Makefile を下記に置き換える。
一応(C言語の)基本的な事だけど補足。 SDLやGL(open GL)等のライブラリを多数使用するので、用意しておく。 (自分でコンパイルしても良いけど、ttyman氏の環境やtakka氏の環境から抜き出せばok) 例えば LIBS += -lvorbisidec と言うのは、C:/cygwin/pspdev/psp/lib/libvorbisidec.a が必要という意味。(先頭にlibを付ける) 同様に LIBS += -lz と言うのは、C:/cygwin/pspdev/psp/lib/libz.a が必要という意味。(先頭にlibを付ける) 別口で include ファイルも必要(*.hのヘッダ) 例えば C言語で #include <png.h> としたいなら、C:/cygwin/pspdev/psp/include/png.h が必要という意味。 同様に C言語で #include <SDL/SDL_mixer.h> としたいなら、C:/cygwin/pspdev/psp/include/SDL/SDL_mixer.h が必要という意味。 #include <ファイル名> は基本的に(設定パスからの)相対パスを受け付けるので、こういう事が可能。 #include <ファイル名> と #include "ファイル名" は(読み方が)違うから注意な。 C:/cygwin/pspdev/psp/include/png.h と C:/cygwin/home/xxxx/test01/src/png.h があった場合、(xxxxはログイン名) 例えば C:/cygwin/home/xxxx/test01/src/test01.cから #include "png.h" なら C:/cygwin/pspdev/psp/include/png.h は無視して C:/cygwin/home/xxxx/test01/src/png.h が優先で読まれる。 #include <png.h> なら C:/cygwin/home/xxxx/test01/src/png.h は無視して C:/cygwin/pspdev/psp/include/png.h が優先で読まれる。 って訳。
# NOIZ2SAv07 Makefile #psp-fixup-imports Noiz2sa.elf #Error, could not fixup imports, stubs out of order. #Ensure the SDK libraries are linked in last to correct this error #make: *** [Noiz2sa.elf] Error 1 TARGET = Noiz2sa PSP_EBOOT_TITLE = NOIZ2SA PSP_EBOOT_ICON = icon0.png EXTRA_TARGETS = maked_directry EBOOT.PBP # - your apprication object OSD = psp SRC = src OBJ = obj OBJS = \ $(OBJ)/noiz2sa.o \ $(OBJ)/soundmanager.o \ $(OBJ)/ship.o \ $(OBJ)/shot.o \ $(OBJ)/frag.o \ $(OBJ)/bonus.o \ $(OBJ)/imageio.o \ $(OBJ)/foe.o \ $(OBJ)/foecommand.o \ $(OBJ)/barragemanager.o \ $(OBJ)/attractmanager.o \ $(OBJ)/background.o \ $(OBJ)/letterrender.o \ $(OBJ)/screen.o \ $(OBJ)/clrtbl.o \ $(OBJ)/vector.o \ $(OBJ)/degutil.o \ $(OBJ)/rand.o \ $(OBJ)/psplib.o \ $(OBJ)/bulletml/bulletmlparser-tinyxml.o \ $(OBJ)/bulletml/bulletmlparser.o \ $(OBJ)/bulletml/bulletmltree.o \ $(OBJ)/bulletml/calc.o \ $(OBJ)/bulletml/formula-variables.o \ $(OBJ)/bulletml/bulletmlrunner.o \ $(OBJ)/bulletml/bulletmlrunnerimpl.o \ $(OBJ)/bulletml/tinyxml/tinyxml.o \ $(OBJ)/bulletml/tinyxml/tinyxmlerror.o \ $(OBJ)/bulletml/tinyxml/tinyxmlparser.o # - PSPSDK PSPDEV = $(shell psp-config --pspdev-path) PSPSDK = $(shell psp-config --pspsdk-path) #PSPPRE = $(shell psp-config --psp-prefix) #PSPTOOLCHAIN = $(PSPDEV)/bin #PSPCC = $(PSPTOOLCHAIN)/psp-gcc #PSPCXX = $(PSPTOOLCHAIN)/psp-gcc #PSPSTRIP = $(PSPTOOLCHAIN)/psp-strip #PSPMKSFO = $(PSPTOOLCHAIN)/mksfo #PSPPACKPBP = $(PSPTOOLCHAIN)/pack-pbp #PSPFIXUP = $(PSPTOOLCHAIN)/psp-fixup-imports PSPSDLCONFIG = $(PSPDEV)/psp/bin/sdl-config OBJDIRS += \ $(OBJ) \ $(OBJ)/bulletml \ $(OBJ)/bulletml/tinyxml INCDIR += $(SRC)/. INCDIR += $(SRC)/bulletml INCDIR += $(SRC)/bulletml/tinyxml # -O2 CFLAGS += -O3 CFLAGS += -G0 CFLAGS += -Wall CFLAGS += -D_MSC_VER=1 CFLAGS += -DFPM_MIPS #CFLAGS += -DINLINE="static inline" #CFLAGS += -DLOWERCASEFILES #CFLAGS += -DBOOST_MSVC=1 #CFLAGS += -DBOOST_SP_USE_STD_ALLOCATOR #CFLAGS += -D__GNUC_MINOR__=91 #CFLAGS += -D__GNUC__=2 #CFLAGS += -DYYDEBUG=0 #CFLAGS += -D__GNUC__=4 DL_CFLAGS += $(shell $(PSPSDLCONFIG) --cflags) SDL_LIBS += $(shell $(PSPSDLCONFIG) --libs) # -O2 CXXFLAGS += -g CXXFLAGS += -O CXXFLAGS += -Wall CXXFLAGS += -Wuninitialized CXXFLAGS += -Wno-unknown-pragmas CXXFLAGS += -Wshadow CXXFLAGS += -Wimplicit CXXFLAGS += -Wundef CXXFLAGS += -Wreorder CXXFLAGS += -Wwrite-strings CXXFLAGS += -Wnon-virtual-dtor CXXFLAGS += -Wno-multichar CXXFLAGS += $(SDL_CFLAGS) CXXFLAGS += -I/usr/local/pspdev/psp/include CXXFLAGS += -O3 CXXFLAGS += -G0 #CXXFLAGS += -O2 #CXXFLAGS += -G0 #CXXFLAGS += -fno-exceptions #CXXFLAGS += -fno-rtti CXXFLAGS += -I$(PSPDEV)/include CXXFLAGS += -I$(PSPDEV)/include/SDL CXXFLAGS += -I$(PSPDEV)/psp/include/SDL CXXFLAGS += -I$(PSPSDK)/include ASFLAGS = $(CFLAGS) LIBDIR = LDFLAGS = LIBS += -L$(PSPDEV)/lib LIBS += -L$(PSPSDK)/lib #LIBS += -lSDL_image LIBS += -lSDL_mixer LIBS += -lSDL LIBS += -lpspgu LIBS += -lpspaudio LIBS += -lpsphprm #LIBS += -lpsppower #LIBS += -lpspaudiolib #LIBS += -lpspaudio LIBS += -lGL LIBS += -lm LIBS += -lpspvfpu LIBS += -lvorbisidec LIBS += -lpsprtc LIBS += -lpsppower #png lib LIBS += -lpng #LIBS += -ljpeg LIBS += -lz #LIBS += -L$(PSPDEV)/psp/lib -lSDLmain -L$(PSPDEV)/psp/sdk/lib LIBS += -lc LIBS += -lg LIBS += -lstdc++ LIBS += $(SDL_LIBS) LIBS += -Wl,--rpath #LIBS += -Wl,LIBDIR USE_PSPSDK_LIBC=1 include $(PSPSDK)/lib/build.mak #rs: $(OBJS) # $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(SDL_LIBS) $(LIBS) -lz $(OBJ)/%.o: $(SRC)/%.c $(CXX) $(CXXFLAGS) -MMD -c $< -o $@ $(OBJ)/%.o: $(SRC)/%.cpp $(CXX) $(CXXFLAGS) -MMD -c $< -o $@ # $(OBJ)/%.o: $(SRC)/%.cc $(CXX) $(CXXFLAGS) -MMD -c $< -o $@ # #$(OBJ)/soundmanager.o: # $(CXX) $(CXXFLAGS) $(DL_CFLAGS) -MMD -c $(SRC)/soundmanager.c -o $@ ifeq ($(PSPDEV),) MD = -mkdir RM = -rm else MD = -mkdir.exe RM = -rm.exe endif maked_directry: @echo Making object tree for $(TARGET) ... @$(MD) -p $(subst //,\,$(sort $(OBJDIRS))) @$(RM) -f PARAM.SFO DELTREE = @$(RM) -f -rd obj rr: @echo Remove all temporaly files. @$(RM) -f PARAM.SFO @$(RM) -f *.elf @$(DELTREE)
■ ウチでは NOIZ2SAv08や rRootage はコンパイルした事がない(==出来ない) (bulletMLとか別口で用意するのめんどくさいし。) つまり、 rRootage (出来ない) NOIZ2SAv08 (出来ない) NOIZ2SAv07 (ok?) って訳。 この Makefile も結構納得がいかない。 LIBS のリンク順序を変えるだけで「リンク出来なくなる」 psp-fixup-imports Noiz2sa.elf Error, could not fixup imports, stubs out of order. Ensure the SDK libraries are linked in last to correct this error make: *** [Noiz2sa.elf] Error 1 (stubの範囲を超えてるので正常にstub出来ません。PSPSDKのライブラリを最後にリンクする様に修正してこのエラーを回避して下さい) こういうエラー。このエラーが出ても EBOOT.PBP は生成される。 しかし PSP で起動(boot)できない。(C言語のmain();を実行する前にpspが死ぬ )
■ 実際 cygwinのコンソールで訳の判らない順序でリンクしてる。というのは、C言語の場合、 LIBS += -lc LIBS += -lc LIBS += -lc とか適当に沢山書いといても、make時に -lc 一つになる。別館のC言語で書いてある mameとか コンパイルするのならそうなる。 NJ氏のえみゅとかもそーなる筈。
しかし、今回のC++言語? D言語? の場合、そーならない。 $ make Making object tree for Noiz2sa ... psp-gcc -I/pspdev/psp/sdk/include/libc -Isrc/. -Isrc/bulletml -Isrc/bulletml/tinyxml -I. -I/pspdev/psp/sdk/include -O3 -G0 -Wall -D_MSC_VER=1 -DFPM_MIPS -D_PSP_FW_VERSION=150 -L. -L/pspdev/psp/sdk/lib obj/noiz2sa.o obj/soundmanager.o obj/ship.o obj/shot.o obj/frag.o obj/bonus.o obj/imageio.o obj/foe.o obj/foecommand.o obj/barragemanager.o obj/attractmanager.o obj/background.o obj/letterrender.o obj/screen.o obj/clrtbl.o obj/vector.o obj/degutil.o obj/rand.o obj/psplib.o obj/bulletml/bulletmlparser-tinyxml.o obj/bulletml/bulletmlparser.o obj/bulletml/bulletmltree.o obj/bulletml/calc.o obj/bulletml/formula-variables.o obj/bulletml/bulletmlrunner.o obj/bulletml/bulletmlrunnerimpl.o obj/bulletml/tinyxml/tinyxml.o obj/bulletml/tinyxml/tinyxmlerror.o obj/bulletml/tinyxml/tinyxmlparser.o -L/pspdev/lib -L/pspdev/psp/sdk/lib -lSDL_mixer -lSDL -lpspgu -lpspaudio -lpsphprm -lGL -lm -lpspvfpu -lvorbisidec -lpsprtc -lpsppower -lpng -lz -lc -lg -lstdc++ -L/usr/local/pspdev/psp/lib -lSDLmain -lSDL -lm -L/usr/local/pspdev/psp/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpsprtc -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet -Wl,--rpath -lpspdebug -lpspdisplay -lpspge -lpspctrl -lpspsdk -lpsplibc -lpspnet -lpspnet_inet -lpspnet_apctl -lpspnet_resolver -lpsputility -lpspuser -lpspkernel -o Noiz2sa.elf こーゆー感じ。青い部分のダブリを取り除いて -L/usr/local/pspdev/psp/lib -lSDLmain -L/usr/local/pspdev/psp/sdk/lib と置き換えてもリンク出来ない。 (2008-07-07,15:30)
↓コメントは、「このページ以外」にいれてね。(なんだか、めんどくさいことになってるので)