A21b遅くなってるが続行しよう。
現在別館からDLしたものを、
A.「明らかに不要なルーチンの削除」
B.「VDP、WORD、READの変更」
C.「VRAM_DATA_POINTERの変更」
の3点しか変更してない。これを「A21b」と名づけた。
「A21b」にそれ以外の(破棄したよって日記で書いた)VERのテクノロジーを投入しよう。
(A.)は明らかに遅くなる。が、一度は通らないといけない道。我慢しよう。
(B.)は昨日の日記の変更。パフォーマンス次第では戻すが、理屈上おかしいよ。納得いかない。
(C.)は今日やった変更。現実にこの変更で、微妙に重くなってるが、それも理屈上おかしいので、直さない。
■(C.)について詳しく説明。
えーと、例えばMAMEの標準OBJ(スプライト)描画ルーチンでは、オフセットがかかってるの、知ってるかな?
えーと確か32バイトだったよね。32バイトはPC(DOS/V)のALIGNにとって都合の良いサイズ。
このオフセット何で存在するのか?というと、OBJ(スプライト)描画ルーチンがどお言う風に作るかワカンナイ
から、都合上ちっと横にはみ出すルーチンの方が、効率(ソースの読みやすさ、実行速度)が良いかもしんない。
じゃない?
そおいうわけで、横にはみ出すルーチン書いてもいいよ。ってオフセット分。
SEGADRIVE(つまりDGEN)でも、同じ仕組みが用意されてる。
ええと、こいつの場合は縦にはみ出してもいいらしい。だってオフセットが丁度一ラスター分。
いや、縦にはみ出して良いんじゃなくて、やっぱ横用のオフセットなんじゃろ。
32バイトなんて気持ち悪いし、だから気分で書いてあるんだと思う。それにどんだけはみ出すんだか、
よくワカンナイし。
A21では、ここのオフセットは、これ。
// The main interface function, to generate a scanline
void md_vdp::draw_scanline(struct bmap *bits, int line)
{
    unsigned short *ptr, i;
    // Set the destination in the bmap
    dest = bits->data + (bits->pitch * (line + 8) ); //+ 16);
管理人が、初めてDGENで見た時から、変わってないと思うよ。
「dest」って所はメガドラの画像を計算して、後で書き込む基準位置。あとで実際に描画する時に使う、
いわば「原点」だ。
「bits->data」は変な名前だが、結局PSPのVRAMの先頭番地。つまり、0x04000000にちと細工を施した物が
入ってくる。大雑把に言えばこの付近だがちと都合によりずらす。このずらす都合は
「psp_main.c」で、「md_setframe( PSP_Screen_GetTempBuffer( 16, 8 ) );」ってな感じで。
ええと、md_setframe()は、「bits->data」に値を入れるだけ、C言語とC++言語の橋渡し部分だ。 
PSP_Screen_GetTempBuffer()ってのは、関数ではなくて、単に数字を計算するマクロ。計算結果は、
ずらしたい量の整数になる。
「bits->pitch」は、管理人のエミュ「A21」では、PSP_VRAMの一ライン分。つまり、
「LINESIZE x 2」。LINESIZE は512、「x 2」はPSPのVRAMの1ドットが2バイトだから。
さて、ここまで説明すれば、気が付くと思う。ええと、要するにそんなのは「定数」なんだから、始めの
定数計算マクロにいれちまえ。そしたら、
  dest = bits->data + (bits->pitch * (line + 8) ); //+ 16);
が
  dest = bits->data + (bits->pitch * (line  ) ); //+ 16);
で済むジャン。しかも、「ラスター毎→フレーム毎」になるから計算量「1/262」だし。
(注:これ(計算量)は多分殆ど関係ない計算量==計算負荷ではないので)
ええと、そおいう訳で、やってみたけど、重くなる。FSKIP2、22050、OutRunで、(-2~-3fpsグライ)
だけど、こういうのも、単に減量してるだけだから、やっぱ直す気ないよ。
(15:45)
うーん、上のPSP_Screen_GetTempBuffer()は都合によりマクロじゃなかったし、ちとやり方を間違えてるので、
もう一回試行錯誤中。なんかちと勘違いした。上の(-2~-3fpsグライは違う奴の値、間違い)
(16:38)
画像の縮小保存とかいろいろ、その辺の機能もPSP_Screen_GetTempBuffer()とPSP_Screen_GetBackBuffer()を
使ってるから、どっかおかしくなるかと、思ったら何処もおかしくならないみたい。つまり、辻褄が合っちゃうみたい。
で、A21に比べて、FSKIP2、22050、OutRunで、(-1~-2fpsグライ)今度はCPPの中だけじゃなくて、
あちこち関連ヶ所を書き換えた。
いずれにせよ、A21よりトロイ事には、変わりがない。
(17:20)
■え~ん、やっぱ辻褄あってないじゃん。
なんか、PSP実機で動作させると、上に8ドット分ずれる。ってゆーか、ソースよく読んで、
「何でPSP-DGENは、ずれないんじゃろ。」
そっちのほーが、実は不思議。まあ、手直しするのは、いいんだケド。いまいち府に落ちない気がするし。う~んワカラン。
(21:03)
■え~ん、ずれる、ほーこーが逆だよお。
一体何処をずらしたら良いものや、見当がつかなかったので。てきとーに。
        switch(emc->screen_mode)
        {
        case SCREEN_1X:
            md_setframe( PSP_Screen_GetBackBuffer_offs( 80, 16 ) );
            break;
        case SCREEN_FIT:
            md_setframe( PSP_Screen_GetTempBuffer_offs( 8, 8-8 ) );
            PSP_Screen_Flip_FIX();
            break;
        case SCREEN_FULL:
            md_setframe( PSP_Screen_GetTempBuffer_offs( 16, 8-8 ) );
            PSP_Screen_Flip_FIX();
            break;
        }
ってやってみたが、ずれる方向が正反対。ええっ?って事は「8+8」何でぇ?
(22:26)
うん、+8にしたらOK。でもA21に比べて、
   「びみょーに遅くなってる」か
   「変わらない」か
   「びみょーに速くなってる」
の、どれか。
えーだって、測る度に、値が変わるんだもん。ワカンナイよ。
(22:35)
■今何だかアメブロ混んでたんで、このページの日記をはじめっから読み直してたら、確かにオフセット
縦にずれてもいいんじゃん。
    dest = bits->data + (bits->pitch * (line + 8) ); //+ 16);
だよ。
「bits->data」は先頭アドレスだから関係ない。
「bits->pitch」は1ラインの長さ。(実は定数)
「+8」だから縦に8ドット。
つまりここの指定は、本来描く筈の位置より、下に8ドットずらして描くって事。
でも、それがどおして、PSP_MAINからは16ドットなんだろ?
なんかPSP_DGENってVRAMの下の方に一回書いてるみたい何だけど、つまり。PSPのVRAMって、
FLIPするとして(表:0x04000000)(裏:0x04400000)でしょ?
でも表も裏も広すぎて、下の方、開きまくってるじゃない?表も裏も十分表示画面が2画面分以上取れる。
つまり、VRAMを余らせまくっても、4画面分。十分に取れるじゃない?
この辺のないよーはどっか過去日記で書いたよお。もう1ヶ月グライ前だから、えーと。
どーでもいーけど管理人。日記増えすぎにゃん。これじゃあ技術じょーほー埋まってても、探し出せないにゃん。
にゃんどかじろー。ごろーにゃん。(注:最近映画がリメイクされたらしいにゃん。でも実は原作も見た事ないにゃん)
(文責:ねこ)
はい、ごめんなさい。もう管理人にも探し出せないですぅ。既に探し出すのが時間の無駄ですぅ。自分のブログが
りょーが多すぎて一番読めないので、最近は現実逃避で、他のブログに探検に行くのが趣味とか。趣味ってのは
もちっと、こーしょーな奴だっけ?
つー訳で、どっかにあるから、ガンガッテ探すか、潔くあきらめましょー。(注:管理人はあきらめた)
■えーと、とにかくPSP-DGENは4画面分も取れるから、一番始めはVRAMの下のほーの2画面に描いといて
(注:FLIPだから、2画面分いるでしょ?)で、後でも一回見える所。つまり上のほーに転送します。
(注:これもFLIPだから、2画面分です)
■なんつーか、またまたかんけーない話なんだけど、これって元祖PSと仕組みが似てたりして。こーゆー
見えないりょーいきに、ふつーはテクスチャ配置しとくんだお。そおするともうVRAMにあるけん。GPUがらくしょー
って言っててんそーがはやかつたよーな。ううんふるい記憶は当てにしたらダメぽ。何れにしろ似た仕組み。
で、元祖PSって密かに「インターレースモード」あるじゃん。あれ使うと画面がきれーなのはいいんだけど、
VRAMが圧迫されて、テクスチャー何処に置いたら良いのやら、路頭に迷う仕掛けになってんの。だから、
「インターレースモード」のゲームは少ないの。スピードよりも、メモリが大変なの。PSPはインターレースモード
なんてあるんかいな?
(23:26)
■http://red.ribbon.to/~pspemu/
ここは結構良いな。
PSのエミュの話ってフェイクじゃなかったんだ。
最近は2.6でも道が開けてるんだ。(http://www3.ezbbs.net/04/psp-psp-psp/のちっと前の記事。)
うううなんか浦島太郎って感じ。
PSP2ってのもなあ。どうなるやら。
■ああまた勝手に転載病が...いいやちと一部だけ。
以下無断転載:http://red.ribbon.to/~pspemu/old_news_009.html
2006/01/27  関連項目  
■EBOOT Loader for 2.00, 2.01, 2.50リリース
 ●現時点で動作するソフト
 (1)uo_Snes9x v0.02y32 Dual Tetris
 (2)Lunar Lander
 (3)Ghost in the Matrix
 (4)Nem's Hello world
●問題点
 (1)[HOME]ボタンが動作しない
<中略> 
v2.00のPSPなので
v2.01/v2.50ではどうなるか分かりませんが、GTA:LCSを使用している限りは多分同じ
<中略> 
[NG]
 (1)RIN -GB/GBC Emulator- v1.32 NG
 (2)Lua player v0.16 NG
 (3)PSPSOne v0.1 alpha NG
 (40)Vector Infector NG 
 (5)PSP-OSS 0.2b NG
 (6)PSPGBA v1.0 NG
 (7)Filer v0.1 NG
ええと、知らん人に解説(そんな柄じゃないが)すると。
北米版の「Grand Theft Auto - Liberty City Stories」
通称「GTA:LCS」 とゆーPSPのソフトを購入し、eBOOT Loaderと組み合わせると、
上記の記事はちと古いので2.00だが、
現状の「eBOOT Loader」(注:以下、えBOOT)では2.60でも動くらしい。
が、何処まで動くのやら、報告例がネットで切れ切れなので、良く解からん。
つまり100%何でもかんでも動くって訳ではないらしい。で、上記の記事は2.00と、ちと古いVERの
えBOOTの記事らしい。上記、記事の場合。
RIN132は動かん。って書いてあるから、管理人のエミュも動かん可能性が高い。
が、現状どおなんだろ。誰かGTA:LCS買った人。(注:通販で買える)で、2.60で、最新のえBOOTで
(出来れば管理人のエミュ)動くか、動かんか。試した人がもしいたらコメント入れてよ。別に管理人の奴でなくても、
RINやDGEN。その辺はどおなんだろ。なんかyoyoFrのTYLは独自技術で動きそーだから参考になるか
ならんかビミョーだが、何でもいいから、(ソース公開されてる。エミュ・プログラム)で、
ある程度のEBOOT.PBPサイズのあるもの(つまり1MBytes以上が望ましい)が、
A.起動するか?
B.[HOME]は受け付けるか?
C.出来ればROMが読むかどおか?(注:合法ROMがない場合は、フリーROM使え)
そおそお、管理人フリーROM作ってもいいよ。エーと、作成経験があるフリーROMは、
A.スーパーファミコン          (アセンブラ)
B.メガドライブ              (アセンブラ、C言語だが貧弱)
C.ゲームボーイ(カラー)       (アセンブラ、C言語)
D.ファミコン               (アセンブラ)
そんだけ。でも「ゲームボーイアドバンス」は、TeamKNOXの開発キットあるから、
やった事ないけど、簡単に作れる。
「PCエンジン」は、ちと市販ゲームと同じ状態にもってく方法が良くわからんので保留。
(でべろがあるがそんなのあっても無駄だろ。でもあれにアッセンブラ自体のCソースがあって、
改造しまくった記憶がある。(だってあのアッセンブラ、バグだらけの上にデカイコードが吐けんじゃないか。
ちとデーターをソースにいれるだけで、ソースなんてすぐデカクなるんだから、まったく全然、もとのママだと、
実用性が全然ない。まあその辺ねらってるのかもしんないけど)
市販ゲーム形式がハッキリすれば、クロスアッセンブラに仕立て直す事は出来る)
「ワンダースワン」は、「ワンダーウィッチ」なら持ってるが、市販形式で作った事はない。
ただし、FreyaOSをまったく使わない(起動以外)プログラムなら作ったんで、ちとカイゾーすれば、
市販形式になる可能性は、あるこいつは(アセンブラ)
つーか管理人Freyaは完全にDISっちゃったんだか。これライセンス事項に触れるのかな?
あれはいちおー暗号化してあるんだが、特殊な発想転換により、プログラムを一行も書かないでも
実機があれば、復号が可能なんだよ。管理人プログラム組んでちまちま吸い出した奴と、完全にバイナリ
一致したから、頭の少し回る人なら、既にずーーと前にやったんじゃないのか?
但しライセンスに触れるとまずいから、そおいう話は、何処にもなかっただけなんじゃないか?
だって、某氏のーーーと、某氏のーーーはオフィシャルのソフトに入ってたが、
とてもFreya全く見ないで開発したとは思えない。特に某氏のーーーはREADMEにさりげなく
DISったらしき記述があるよな。「ワンダーウィッチ」持ってる人しか判らんネタだが。
(速度の要求されるソフトで)みょーに、完成度が高く、みょーにサイズが小さく、ソースリストが入ってない、
あの2本だよ。それだけ言えば、完全に特定できてるよ。これでもワカンナイならにぶすぎ。
ちなみに上記バイナリ一致した後で、実機を使わない復号ソフトも、ちと書いてみたんだが、(ええとC言語で
画面一頁くらいのHelloWorld(本物)に毛が生えた位のプログラム)256バイト毎のチェックサムだか、
なんだかの計算方法が良くワカンナカッタんで、それ以外は完璧に復号出来るんだがそこがワカンナカッタ
ンデなげた。(注:さじ)
だから、その手で(不完全な)復号をした奴もいたかもしれん。(つまり管理人は3種類復号は試した)
ちなみにFreyaはメチャメチャ基本に忠実なアセンブラコードでしかも本体が小さいから、DIS初心者でも、
簡単にDISれると思うよ。(バイナリの後半殆どはフォント)下手したらフルオートでDISれそうな勢いだ。
普通、管理人が苦労してDISるコードとは別次元で、何だかDISるだけで、さわやかな気分になれる。
貴重なバイナリだよ。みんなこんなコードにしてくれれば、フルオートで、世の中にソースリストなんて
なくても要らないのにってレベルの素直なコード。あんまり書くと却って嘘っぽいが、目から鱗。
本当なんだって。
メガドラ開発も真面目にやるならアセンブラさえなんとかすればっていうかX68000用やアミーガ用が、
そのまま流用出来そうな気がする。X68000時代は「リロケータブル」コードしか作成した記憶がなく、
「絶対番地」で吐けるオプションがあったかどおか、覚えてないが。もしあれば、
A. PCのX68000エミュで絶対番地のコードで開発。Cコンパイルもしくはアセンブル。
B. ツールでイメージを取り出す。(X68000側に仮想ドライバを入れるとWinのファイルが全て読み書き可能。
それとは正反対で、逆のWin側でX68000のHDDイメージを読み書きするツールもある。XPならそのタイプかも)
C. そのままPSPに持ってってエミュで実行。
つーのも簡単だな。だってチェックサムなど、自作ソフトなら端から関係ないもん。
あー、殆どの人には何の話か解からんか。よーするに、「フリーROMのクロス開発」だな。よけー解からんか。
(次の日の朝04:02、そろそろねよーかな)