PSP xvi

PSPプログラミングを教えるブログ(本気で頑張る人アクセス大歓迎サイト)

PSP-X.gif

記事の間違いを報告  新アップローダー
記事修正情報 PSPプログラミング資料 自作ゲーム PSP用エミュレータ リンク

公認リンク
公式PSP専科 公式PSVita専科 はじめるPSPSDK PSP EXEC GAME M@STER PSP 猫山のYouTubeチャンネル

TAG
全記事にタグをつけています  http://nekoyama2gillien.blog36.fc2.com/?tag=タグ
PSP PSPプログラミング DXライブラリPortable OSLib ショートプログラム ハローワールド
PSP自作ゲーム PSP自作ソフト エミュレータ ゲームアーカイブス PSP動画
動画 初音ミク ミクミクダンス MMDドラマ ゲーム 魔法少女まどか☆マギカ 侵略!イカ娘
アイドルマスター

このブログについて

このブログでは、非公式のPSPソフト、いわゆる自作ソフト( PSP Homebrew )を作る事を目的とします。

著作権などの こまかい利用規約については、こちらを開いてお読み下さい

このブログについて知りたい方、初めて来訪された方はこちらを開いてお読みください
お問い合わせは 猫山猫宗(nekomune@gmail.com)までどうぞ


当ブログはリンクフリーです。ブログ名は、アルファベットで「PSP xvi」と書いて『ピーエスピー・エクシビ』とお読みください。
相互リンクを希望されるブログ運営者様は、ココで申請して下さい。


このブログで全記事から探し物の方は、ここをクリックして下さい。
http://nekoyama2gillien.blog36.fc2.com/?all

スポンサーサイト 

--/--/--
--. --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[edit]

CM: --
TB: --

page top

確保したメモリは、プログラムを終了してもメモリが確保されたままになるので、
プログラムを終了する前に、全てのメモリを解放しておかなくてはなりません(重要)

char *memptr = malloc( 確保サイズ );


メモリの解放 は簡単で、下記の関数で行ないます

free( 確保したメモリハンドル );


例を書くなら、

main()
{
#include <malloc.h>
char *memptr = malloc(1024); // メモリの確保、1024バイト

ナイスゲーム( );

free(memptr); // メモリの解放
}

のようになります。

【 関連記事 】
PSPプログラミング ファイルを開く手順をM@STERしよう!
PSPプログラミング ファイルサイズの取得をM@STERしよう!
PSPプログラミング メモリの確保(割り当て)をM@STERしよう!
PSPプログラミング ファイルの読み込みをM@STERしよう!
PSPプログラミング ファイルを閉じて・・・・・。
PSPプログラミング 忘れちゃダメよ!メモリの解放

関連記事
スポンサーサイト

[edit]

CM: 0
TB: 0

page top

PSPプログラミング お詫び。ソースに記述ミス 

2009/10/02
Fri. 13:10

私の作っている関数を利用してらっしゃる方は 少ないかと存じますが、記述ミスを発見したので報告です。


全角文字表示ライブラリの 改造版 の ヘッダー XVIzenkaku.h にて、

// 32ビットカラーの16進数コードを RGBから作成する計算式
#define RGB(r,g,b) (((long)b<<16)|((long)g<<8)|((long)r)
                                           ↑
となっておりましたが、かっこが足りませんでした。ぐはっ


正しくは、下記

#define RGB(r,g,b) (((long)b<<16)|((long)g<<8)|((long)r))
                                           ↑

かっこが多いか少ないか調べるには、Apsaly というテキストエディタを使えば、簡単に分かります!
「かっこ」の片方にカーソルを合わせると、相方の「かっこ」を強調表示してくれます。便利。



原因不明のバグに悩まされていたら、ゴメンなさい・・・Orz。


関連記事

[edit]

CM: 0
TB: 0

page top

2011年6月17日更新

私の書いた この記事がどこかオカシイとの ご意見により、記事を 分かりやすいように加筆修正します。以下
この際ですので、一般に使われている、変なPSP用語も掲載して指摘します。

・1.50カーネル
  これは、システムソフトウェア v1.50という OS が、Homebew起動可能である、という事から
  1.50 の カーネル という意味づけで 1.50カーネルという言葉になったのか?

・カーネル3.xx以降
  これは、1.50カーネル に対して 3.xx以降カーネル と呼ばれなければならないと思う。

・カーネル ってなんだ?
  Wiki で調べて再認識 → カーネル(コンピュータ用語) - Wikipedia
  Wikiの記事を要約すると、カーネルとは、OS の 非常に大事な部分(核に相当する)で、仲介屋ってトコ。
  アプリケーションの起動可否は、カーネル次第でどうともなるそうだ。
  各自、お勉強して下さい。


以下、PSPのCPUについて知っているコトを書きます。

PSP に採用されている、MIPS系 R4400 というMPU(CPU)には、2種類の動作モードがあります。

「カーネルモード」と、「ユーザーモード」

さらに、プログラムの書き方では VSHモードというのもあります(現在調査中)

PSPの実行ファイルにも カーネルモードのプログラム と、ユーザーモードのプログラム が存在します

●CPUがカーネルモードの場合 別名:特権モード
 PSPの全てのメモリやハードウェアに対して無制限にアクセス可能。取り扱いは 多少危険です。

●CPUがユーザーモードの場合 別名:保護モード。
 PSPのメモリやハードウェアの内、保護されている部分だけのみアクセス可能。


実行ファイルが カーネルモード記述の場合は、冒頭で「特権モードである」という宣言がされています。
初期のPSP、PSP-1000でのエミュレータ等のカーネルモード記述のHomebrewが起動してしまうシステムソフトウェア v1.00や v1.50 のOS が、カーネルモード推進していた模様。

PSP-1000用のエミュレータが登場してしまったので、メーカーは緊急に対策を取り、ユーザーモードのOSである、システムソフトウェア1.51以降に切り替えていき、現在のシステムソフトウェア6.39に至る(2011/06/17現在)。
PSPのメーカーは、PSP Homebrewを認めていません。


実行ファイルが ユーザーモード記述の場合は、冒頭で「保護モードである」という宣言がされています。

PSPのメーカーは、OS(システムソフトウェア)だけでは物足らず、ハードウェアまでユーザーモードがメインの、PSP-2000を製作し、PSP2号とした。




ところで、皆さんは、PSPのリカバリーモードの Configuration 項目、

> Game folder homebrew (currentry: 5.XX kernel)

の部分を、1.50カーネル や 5.XXカーネル にする方法は知っていても、本来、何を意味するのか考えたことがありますか?偉そうなこと言ってますが、私は、PSPのCPUの動作モードを、カーネルモード(1.50Kernel)とユーザーモード(3.xxKernel)に切り替える処理をしているのだと考えています。

この答えは、カスタムファームウェアの開発者のみ知ることなのですが、QJ.net さんにて、カスタムファームウェア3.10OE-Aと3.40OE-A のプログラムソースコードが配布中なので、機会があったら解読してみようと思います。 ソースは削除されているっぽいです。アメリカのGoogle でも見つかりませんでした。

ちなみに、1.50カーネルとか、3.xxカーネル、4.XXカーネル、5.XXカーネルとかのカーネル数値は、PSPのシステムソフトウェアのバージョンを意味します。

・1.50カーネル
  システムソフトウェア1.50にちなんで付けられた カーネル名。PSP Homebrew の起動を推進する。

・3.xx以降カーネル
  システムソフトウェア3.xx等の後期システムソフトウェアにちなんで、私が勝手に呼んでみるカーネル名。
 一般では、カーネル3.xx以降とか言うらしい。1.50カーネル用のアプリの起動を抑止する。


1.50カーネル上でしか起動しない事になっているカーネルモードの自作ソフトを、3.xx以降のカーネル上で起動させるには、色々な手段が生み出されました

◆エミュレート
・eLoader v1.000 を起動させて、そこから自作ソフトを起動させる方法
(リバースエンジニアリングして調べたわけではありませんが、多分こんなことをやっているのだろうと推測)
まず、読み込まれる予定のカーネルモードのPRXモジュールなどを、ユーザーモードのPRXモジュールを読み込むように置き換える。
実行ファイルはエミュレートする。ユーザーモードで実行できる処理は行なわれるが カーネルモードでしか実行できない処理はエミュレートできず そこで停止してしまう。

◆ユーザーモードへ実行ファイルを変換
(「カーネル1.50のソフトをCFW3.xx用に変換するソフト」というアプリを使用)
実際は、実行ファイルに eLoaderを埋め込む処理がされます。eLoaderで実行できないカーネルソフトには、この変換をやっても無駄なだけです

◆OSにカーネルモードの動作をサポートする機能を追加
・カスタムファームウェア5.00M33-6 に LEDA Legacy Software Loader beta0.2 を導入し、カーネルモードを1.50固定にしておく方法
カーネルモードを切り替える必要が無くなり、どっちのモードのソフトでも、ある程度 起動可能にさせてしまう

私の製作した PSP自作ソフトは、殆ど ユーザーモード(保護モード)の仕様です。

なので、PSP-2000 でも 素で起動したりします(笑)。カーネルモードで作っていたらPSP-2000では起動できなかったハズ…。eLoader使用で起動したよ報告が あったな。


判明している事は、PSPのソフトウェアには、3種類のタイプがあるという事実です。
・カーネルモード専用(カーネルハードウェアやカーネルメモリなどにアクセスするアプリとか)
・ユーザーモード専用(メディアエンジンを作動させるアプリとか)
・どっちのモードでも動作する

俺作PSPソフウェア
「じゃんけんゲーム for PSP パワードX」 1.50 or 3.xx どっちでも起動可能
「みくねぎっと。」 初音ミクで ハタあげならぬネギあげゲーム 3.xx以降専用(配布終了)
「PSPデスクトップ ドドド 改」 1.50 or 3.xx どっちでも起動可能
「千早が765衣装で吹っ切れた!? PSP」 3.xx以降専用


おまけで書いておくこと。
この記事は、「PSPそうごう」カテゴリだったけど、「PSPプログラミング」カテゴリに引越ししました。

PSPの、カーネルモード、並びに、ユーザーモード の プログラムの書き方。
参考したもの = CPS1/CPS2 のソース

プログラムの冒頭で、こう記述します。↓↓

カーネルモード発動!

PSP_MODULE_INFO("プログラム名", PSP_MODULE_KERNEL, VERSION_MAJOR, VERSION_MINOR);
PSP_MAIN_THREAD_ATTR(0);


解説
(赤い文字の部分は、自由に書き換えて下さい)
PSP_MODULE_KERNELは、ヘッダーファイルにて、0x1000 という数値が記述されています。
カーネルモードのプログラムである、と宣言しています。

"プログラム名" の部分は、半角の英数字記号で、好きな名前を記述して下さい。

VERSION_MAJOR は、整数 数値。そのプログラムのバージョンの、整数部分(値は何でも可能)
VERSION_MINOR は、整数 数値。そのプログラムのバージョンの、小数点以下部分(値は何でも可能)

PSP_MAIN_THREAD_ATTR(0); は、このプログラムが、CPUをカーネルモードにして実行するというおまじない。


ユーザーモード発動!

PSP_MODULE_INFO("プログラム名", PSP_MODULE_USER, VERSION_MAJOR, VERSION_MINOR);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);


解説
(赤い文字の部分は、自由に書き換えて下さい)
PSP_MODULE_USER は、ヘッダーファイルにて、0 という数値が記述されています。
ユーザーモードのプログラムである、と宣言しています。

"プログラム名" の部分は、半角の英数字記号で、好きな名前を記述して下さい。

VERSION_MAJOR は、整数 数値。そのプログラムのバージョンの、整数部分(値は何でも可能)
VERSION_MINOR は、整数 数値。そのプログラムのバージョンの、小数点以下部分(値は何でも可能)

PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER); は、このプログラムが、CPUをユーザーモードにして実行するというおまじない。


本来、R4400というCPUは、カーネルモード動作時にはカーネルモードのプログラム、あるいは、ユーザーモードのプログラムを実行でき、ユーザーモード動作時にはユーザーモードのプログラムを実行できる、というお約束があるみたいです。どっちのモードでも動作するのは、ユーザーモード記述のプログラムです。
プログラマーが正しくコードを記述して使い分けないと、R4400は悩んでしまうカモ知れず。

PSP-2000のCPUもR4400なので、カーネルモードがあります(メーカー側が、抑止させているだけなのか?)

現に、PSP-2000で カーネルモードのプラグインは動作できるし(例:PSP画面キャプチャ・プラグイン)


本日は、ここまで。では、明日!


皆さん、意見をどうぞ。 コメント欄へ

関連記事

[edit]

CM: 17
TB: 0

page top

楽しい PSP Homebrew ゲーム を見つけました。


これは、PSP用の UNO(ウノ)、『Last Card』です。

遊び方は、ウノのカードを買ってきて説明書を読むか、Wikipedia などで調べて下さい。
UNOのルールは少々ややこしいので、とてもココには書けません。
UNO (ゲーム) - Wikipedia

実際にカードでプレイするといいかもです。なお、UNOを遊ぶ人数は、大勢のほうが楽しいですよ~。



遊んでみた動画を貼り付けてみる。


ダウンロードページへ行く
モジュールは、ユーザーモードです。
PSP-1000、PSP-2000、PSP-3000[HEN] 対応!


インストール方法
PSP-1000ユーザ
  解凍して出来る LastCard フォルダをコピーして、ms0:/PSP/GAME150/ フォルダに貼り付ける。
・PSP-2000ユーザ、PSP-3000ユーザ
  解凍して出来る LastCard フォルダをコピーして、ms0:/PSP/GAME/ フォルダに貼り付ける。

操作方法
・カード選択    ・カードを捨てる   ・カードを取る     ・ウノ 宣言
  移動 ← →     ×ボタン        ○ボタン     Rトリガー

・終了        ・やり直し
  スタートボタン     セレクトボタン

関連記事

[edit]

CM: 0
TB: 0

page top

Pacuman v0.1 実行画面


GPLライセンスの PACMANクローン、Pacuman が先月リリースされました。

こりゃ遊ぶしかないな、と。

-- 続きを読む --
関連記事

[edit]

CM: 0
TB: 0

page top

メモリースティックへのファイル書き込みの方法(C++ プログラミング)をご紹介

● ファイルを書き込みモードで開く関数を ご紹介
・FILE *fp の場合
  fopen( "ファイル名", "w");
    FILE *fp 用のファイルを開く関数です。
    "ファイル名"には、メモリースティック上の PATH を書きます
    返り値は、ファイル・オープンエラーなら NULL (== 0x00 )
          正常に ファイル・オープン出来たなら ファイルハンドル

・int fp の場合
  sceIoOpen( "ファイル名", PSP_O_CREAT | PSP_O_WRONLY | PSP_O_TRUNC, 0777);
    int fp 用のファイルを開く関数です。
    "ファイル名"には、メモリースティック上の PATH を書きます
    返り値は、ファイル・オープンエラーなら -1
          正常に ファイル・オープン出来たなら ファイルハンドル

  注 : ファイル名は、PATH (パス:道)で表記します。絶対PATHと相対PATHがあります。
  絶対PATH とは、ファイル名をデバイス名から 全部表記したもの。フルPATH
  相対PATH とは、ファイル名をカレントディレクトリを基準として相対的な差分で表記したもの。


● ファイルの書き込みに使える関数を ご紹介
・FILE *fp; の場合
  put( int data, FILE *fp );
    1バイト書き込み関数です
    data は、書き込む1バイトデータを int 型 整数値(もしくは文字1個など)で書きます
    fp は、ファイルオープン時のファイルハンドルを書きます
    返り値は、書き込みできたデータの値

  fputs( char *str, FILE *fp );
    文字列の書き込み関数です。
    文字列の終わりは、NULL文字( == 0x00 )になっていなければ なりません。
    書き込み時、文字列の末尾に、0x0d、0x0a、0x00 の3バイトが自動追加されます。
    fp は、ファイルオープン時のファイルハンドルを書きます
    返り値は、いちばん最後に書き込みした1文字

・int fp; の場合
  sceIoWrite(int fp, char *buff, int size);
    連続バイト書き込み関数です
    fp は、ファイルオープン時のファイルハンドルを書きます
    buff は、書き込む連続データの先頭アドレスを書きます
    size は、書き込みするデータのサイズ( 単位は バイト )を書きます
    返り値は、実際に書き込みできたデータのバイト数(負ならエラー発生)


では、まず、処理の手順を 日本語で 書いてみます。

【 手順 】
  1. 書き込みモードでファイルを開いて
  2. ファイル・オープンエラーが発生したら、ファイルを閉じてから エラーで終了する → 異常終了
  3. (ファイル・オープンエラーが発生しないなら、以下を実行)
  4. データを書き込みして
  5. ファイルを閉じて
  6. 終了 → 正常終了


上記手順を C++プログラミングしてみます。

【 プログラム・コード その1 FILE *fp; 編 】
    FILE *fp;
if( (fp = fopen("ms0:/ほえほえ.dat", "w")) == NULL)
{
fclose(fp); // ファイル・オープンでエラーなら、開いたファイルを閉じて…
return FILE_OPEN_ERROR; // エラー数値でリターン
}

int i;
for(i=0; i<1024; i++) // 1024回ループ
{
putc('a', fp); // 半角文字 a を一文字 書き込みする
} // つまり、1024個の a の書き込みになります
fclose(fp); // ファイルを閉じます
return NORMAL_FINISH; // 正常終了の数値でリターン


【 プログラム・コード その2 int fp; 編 】

int fp;
if( (fp = sceIoOpen("ms0:/ダヨーーン.dat", PSP_O_CREAT|PSP_O_WRONLY|PSP_O_TRUNC, 0777)) < NULL)
{
sceIoClose(fp); // ファイル・オープンでエラーなら、開いたファイルを閉じて…
return FILE_OPEN_ERROR; // エラー数値でリターン
}
ptr = GetDATA(); // 架空の、データ取得関数(仮)
sceIoWrite(fp, ptr, サイズ ); // ptrは、書き込むデータの先頭アドレス
// サイズはint型の整数数値です
sceIoClose(fp); // ファイルを閉じます
return NORMAL_FINISH; // 正常終了の数値でリターン


上記のプログラム・コードは、あくまで例です。採用する際は、各自、理想のプログラム・コードに書き換えて下さい。

ファイルを閉じる関数は、読み込み後も書き込み後も共に同じで、fclose( ); 、sceIoClose( ); のどちらかで可能です。使い分けて下さい。


次は、「ファイル入出力関数についての講釈」 です。


関連記事

[edit]

CM: 6
TB: 0

page top

アイドルマスターDSの発売日の1日前に投稿された動画です。

割れているのかっwww




アイドルマスター愛好家としては放っておけない動画でありますwwwww
関連記事

[edit]

CM: 1
TB: 0

page top

PSP自作ゲーム Rubik's Cube v3.0 

2009/10/08
Thu. 08:00

つい先日、PSP用のルービックキューブ v3.0 がリリースされました。

何と、1:11 でクリアしてみたりっwww

3x3x3だけではなくて、4x4x4や5x5x5などのキューブでも遊べたりなwwwww
2x2x2.jpg 4x4x4.png 5x5x5.png


-- 続きを読む --
関連記事

[edit]

CM: 0
TB: 0

page top

さて、ファイルを開く際に、fopen( ); 関数と sceIoOpen( );関数の2種類あるぞ、困った…。と思っておられる方がいるハズ。

そこで、今回は、ファイル入出力について書いてみようと思います。

ファイルポインタ構造体 (FILE *) を使うファイル操作を、バッファド・ファイル入出力と言い、バッファリングや、その他のサービスがされます。
いっぽう、ファイル・ディスクリプタ(ファイル記述子 / int)を使うのを 低水準ファイル入出力と言い、よりOSに近いレベルでのファイル操作となっています。

バッファリング
入力された内容がシステムバッファに溜められて、ある条件を満たした際に 一度にまとめてデータを渡す仕組み


【 バッファド・ファイル入出力の概念 】
文字単位・行単位での処理を行なえます。

【 低水準ファイル入出力の概念 】
ユーザが指定したバッファとの間で直接バイト単位の読み出し/書き込みを行なえます。

【 ファイル・オープンモードの解説 】
C:\pspsdk\psp\sdk\include\pspiofilemgr_fcntl.h ← このファイルに記述されている値について

モード 機 能
PSP_O_RDONLY 読み出し・オンリー・モード
PSP_O_WRONLY 書き込み・オンリー・モード
PSP_O_RDWR 読み出し・書き込み・モード
PSP_O_NBLOCK 不明(ひょっとして、ブロッキング転送に関係あり?)
PSP_O_DIROPEN ディレクトリ・オープン・モード(使用されない)
PSP_O_APPEND 追記モード
PSP_O_CREAT ファイルの新規作成モード
PSP_O_TRUNC 既存ファイルをオープンし、空ファイルにする
PSP_O_EXCL ファイルが存在すれば新規作成しない
PSP_O_NOWAIT 待ち時間無し転送モ-ド
↑↑ この値は、sceIoOpen( );関数などで使用されますね。


【 ファイルオープン関数の返り値 0 or 負 】
fopen( );関数の返り値は、エラーの時はNULLですが、sceIoOpen( );関数でのエラー返り値は、負の数(値は不定) です。うっかり間違えることが多いと思いますので気をつけて下さい。
正常な返り値は、共に正の値です。


PSPSDKでは、ファイルのテキスト形式やバイナリ形式という概念が無いのか、パラメータが省かれているのか、デフォルトでバイナリ形式となっているっぽいです。テキスト形式も扱えるバイナリ型ということでイイノカ?


次は、「メモリースティック内のファイルの書き換えの方法 その1」 の予定です。


【 関連記事 】
PSPプログラミング ファイル入出力関数についての講釈
PSPプログラミング fopen( ); のファイル・オープンモードのレポート
PSPプログラミング ファイル入出力関数まとめ
PSPプログラミング バッファド・ファイル入出力のまとめ(抜粋)
PSPプログラミング 低水準ファイル入出力のまとめ(抜粋)
PSPプログラミング メモリースティック内のファイル書き換え方法 その1
PSPプログラミング メモリースティック内のファイル書き換え方法 その2

関連記事

[edit]

CM: 12
TB: 0

page top

ゴルゴ13 ベストセレクション 1、2、3 [UMD] 

2009/10/09
Fri. 14:07

「ゴルゴ13」 こと、デューク東郷。
原作者のさいとう・たかお氏には、連載開始から現在までに一度も連載を休止しなかったので表彰された、という話がありました。いいねぇ。

「ゴルゴ13」 ってナニ?という方は、コチラを読んでみて下さい
↓↓↓↓↓
        
ゴルゴ13 - Wikipedia


UMDビデオで「ゴルゴ13」を観たいという方は、要チェックですよっ!

ゴルゴ13 ベストセレクション I [UMD]ゴルゴ13 ベストセレクション I [UMD]
(2009/06/26)
舘ひろし

商品詳細を見る


ゴルゴ13 ベストセレクション 2 [UMD]ゴルゴ13 ベストセレクション 2 [UMD]
(2009/07/24)
舘 ひろし

商品詳細を見る


ゴルゴ13 ベストセレクション 3<最終巻> [UMD]ゴルゴ13 ベストセレクション 3<最終巻> [UMD]
(2009/08/25)
舘 ひろし

商品詳細を見る


関連記事

[edit]

CM: 0
TB: 0

page top

ギャグマンガ日和 1、2、3 (UMD Video) 

2009/10/09
Fri. 14:25

増田こうすけ先生 原作、集英社「ジャンプSQ」で好評連載中の『ギャグマンガ日和』の第1期、第2期、第3期をセットでどうぞ。

ヒマな時に、PSPで観ればいいのです。UMDビデオだし。 ないすっ


キッズステーションで放映されたから、観た人は多いのでは??

この作品も、Wikipedia で調べるといいかもっ
↓↓↓↓↓
          
ギャグマンガ日和 - Wikipedia


ギャグマンガ日和 1 (UMD Video)ギャグマンガ日和 1 (UMD Video)
(2009/04/24)
うえだゆうじ名塚佳織

商品詳細を見る


ギャグマンガ日和 2 (UMD Video)ギャグマンガ日和 2 (UMD Video)
(2009/04/24)
うえだゆうじ名塚佳織

商品詳細を見る


ギャグマンガ日和 3 (UMD Video)ギャグマンガ日和 3 (UMD Video)
(2009/04/24)
うえだゆうじ名塚佳織

商品詳細を見る

関連記事

[edit]

CM: 0
TB: 0

page top

未だに人気のあるアニメ、新世紀エヴァンゲリオン。新劇場版では、「ヱ」ヴァンゲリ「ヲ」ンですよ、と。

これも、Wikipedia 読んでみるかの。
↓↓↓↓↓
         
新世紀エヴァンゲリオン - Wikipedia


↓↓この本は、PlayStationPortable & PlayStation 2 の同タイトルゲームの攻略本です。
Takka氏製作の eboot_exchange にて、カスタムファームウェアでも遊べるようになったので、ようやく遊び始めた方も居るのかな?

ヱヴァンゲリヲン:序 ザ・コンプリートガイドヱヴァンゲリヲン:序 ザ・コンプリートガイド
(2009/07/11)
電撃プレイステーション編集部

商品詳細を見る


そうそう、
『新世紀エヴァンゲリオン バトルオーケストラ』の攻略ページは、こっちを見て下さい(このブログとは無関係なサイトです)。

関連記事

[edit]

CM: 0
TB: 0

page top

下記の表は、PSPSDK での fopen( );関数のファイル・オープンモードを調べた結果です。
標準Cでのモノと同じであるようです。

fopen_hyou2.png


fopen( );のモードは、fopen(ファイル名, "モード"); の部分ですよ。

w+ と a+ は共に、ファイルからの読み出しが出来なかったようです。
興味がある方は調べて報告してください。

報告ありがとうございます。訂正しました。

r+ は、読み出し位置、書き込み位置をシークで移動できます。
読み出し後にシークしないで書き込みすると、ファイル末尾に追記書き込みになります
r+ は、ファイル書き換えに使えます(シーク使ってね)

w+ は、書き込み位置のシーク可能で、書き込み後ファイルを閉じると書き込みした部分までのファイルになります
w+ の場合、ホントはシークしちゃだめらしいですが…(ぉ

a+ の場合は書き込み位置をシークで移動できません。書き込み位置は常に末尾です。
a+ は、読み出し位置を いじれますが。

以上。


【 関連記事 】
PSPプログラミング ファイル入出力関数についての講釈
PSPプログラミング fopen( ); のファイル・オープンモードのレポート
PSPプログラミング ファイル入出力関数まとめ
PSPプログラミング バッファド・ファイル入出力のまとめ(抜粋)
PSPプログラミング 低水準ファイル入出力のまとめ(抜粋)

関連記事

[edit]

CM: 2
TB: 0

page top

PSPプログラミング ファイル入出力関数まとめ 

2009/10/12
Mon. 23:02

ファイル入出力関数には、低水準ファイル入出力と、バッファド・ファイル(ストリーム)入出力とがあるのは、以前までに書いたのでご存知かと。

・バッファド・ファイル(ストリーム)入出力
  システムバッファを介して1文字単位あるいは1行単位のファイルアクセスを行ないます。
  テキストファイルの処理を行なうのに都合が良い。

・低水準ファイル入出力

  バイト単位のファイルアクセスを、ユーザバッファとの間で行ないます。

さて、次から、ファイル入出力関数を全部書いてみることにします。

ファイルの書き換え記事は出来ているのですが、順番に公開します(ファイル入出力関数記事が終わったら公開)。


【 関連記事 】
PSPプログラミング ファイル入出力関数についての講釈
PSPプログラミング fopen( ); のファイル・オープンモードのレポート
PSPプログラミング ファイル入出力関数まとめ
PSPプログラミング バッファド・ファイル入出力のまとめ(抜粋)
PSPプログラミング 低水準ファイル入出力のまとめ(抜粋)

関連記事

[edit]

CM: 0
TB: 0

page top

この記事は、バッファド・ファイル入出力で主に使う関数のまとめです。
あまり使わないであろう関数については省いてあります。

全部の関数については、下記のヘッダーファイルを参照してください。
↓↓↓↓↓
C:\pspsdk\psp\sdk\include\libc\stdio.h


・バッファド・ファイル(ストリーム)入出力
  システムバッファを介して1文字単位あるいは1行単位のファイルアクセスを行ないます。
  テキストファイルの処理を行なうのに都合が良い。
  これらの関数が直接、データを 読み/書き するのではなくて、システムが設定したバッファとの間で行なうのです。
  システム・バッファのデータが空になったり、一杯になった時は、システムが自動的に(低水準ファイル入出力関数を用いて)データを 読み/書き します。


FILE *fp
    ↑ この fp は、ファイル・ポインタ変数と呼ばれます。

● fopen (ファイルを開く)
FILE *fopen(const char *PATH, const char *MODE);
  PATH == ファイル名を指すポインタ
  MODE == オープンモード("r" or "w" or "a" or "r+" or "w+" or "a+"
 [機能]
  PATHで示されるファイルを、MODEで示されるモードでファイルを開きます。
 [返り値]
  エラーなら NULL。
  正常に開けたなら、そのファイルへのファイル・ポインタ。

● fclose (ファイルを閉じる)
int fclose(FILE *fp);
  fp == ファイル・ポインタ
 [機能]
  fpで開かれているファイルを閉じます。
 [返り値]
  エラーなら 0以外(-1 みたいです)
  正常に閉じる事ができたら 0

● getc (ファイルからの1文字入力)
int getc(FILE *fp);
  fp == ファイル・ポインタ
 [機能]
  fpで開かれているファイルから1文字読み込み、その文字コードを返します。
 [返り値]
  ファイル・エンド [EOF] なら -1
  正常に読み込めたら その文字のコード

● putc (ファイルへの1文字出力)
int putc(int CH, FILE *fp);
  CH == 出力する文字データ
  fp == ファイル・ポインタ
 [機能]
  fpで開かれているファイルに、文字CHを出力します。
 [返り値]
  エラーなら -1
  正常に出力できたら その文字のコード

● fgets (ファイルからの1行入力)
char *fgets(char *BUFF, int SIZE, FILE *fp);
  BUFF == 文字列バッファへのポインタ
  SIZE == 読み込む最大文字数(単位はバイト)
  fp == ファイル・ポインタ
 [機能]
  fpで開かれているファイルから、バッファBUFFに1行読み込みします。
  1行の終わりは 1バイトデータ '0x0a' コードで判定されます。C++では "\n"文字
  読み出した1行の終わりには、1バイトデータ '0x00' が付け加えられます。
 [返り値]
  エラーなら NULL(0)
  正常に行なわれたらBUFFへのポインタ

● fputs (ファイルへの1行出力)
int fputs(const char *BUFF, FILE *fp);
  BUFF == 文字列バッファへのポインタ
  fp == ファイル・ポインタ
 [機能]
  バッファBUFFの文字列(終了コードは '0x00' )を、fpで開かれているファイルに書き込みします。
  '\n' は、LF( 0x0a )に変換されて出力されます。
 [返り値]
  エラーなら -1
  正常に出力できたら 最後に出力した文字のコード(大抵、0x00000000 みたいです。NULL文字)

● fscanf (書式付きファイル入力)
int fscanf(FILE *fp, const char *format, void *arg1, void *arg2, ...)
  fp == ファイル・ポインタ
  format == 書式制御文字列
  arg1,arg2,... == 引数、もしくはポインタ
 [機能]
  fpで開かれているファイルから、書式formatに従い、引数 arg1,arg2,...にデータを入力します。
  書式制御の部分(方法)は、scanf と同じ。
 [返り値]
  ファイル・エンド、もしくはエラーなら -1
  正常に出力できたら 入力できた項目数

● fprintf (書式付きファイル出力)
int fprintf(FILE *fp, const char *format[,arg1,arg2, ...])
  fp == ファイル・ポインタ
  format == 書式制御文字列
  arg1,arg2,... == 引数
 [機能]
  fpで開かれているファイルに書式formatに従い、引数 arg1,arg2,...のデータを出力します。
  書式制御の部分(方法)は、printfと同じ。
 [返り値]
  エラーなら、負の値(-1 みたいです)。
  正常に出力できたら 出力したバイト数。

● fseek (ファイル読み書き位置の移動)
int fseek(FILE *fp, long POS, int MODE);
  fp == ファイル・ポインタ
  POS == 移動量
  MODE == 移動の基点モード(SET、CUR、END)
 [機能]
  fpで開かれているファイルからの読み書きをする現在位置を、任意位置へ移動します。
  MODE ─┬ SEEK_SET ファイルの先頭から
         ├ SEEK_CUR ファイルの現在位置から
         └ SEEK_END ファイルの終わりから
 [返り値]
  エラーなら 0以外
  正常に移動できたら NULL(0)




もう一度書きますが、バッファド・ファイル入出力の関数 全部については、下記のヘッダーファイルを参照してください。
↓↓↓↓↓
C:\pspsdk\psp\sdk\include\libc\stdio.h


【 関連記事 】
PSPプログラミング ファイル入出力関数についての講釈
PSPプログラミング fopen( ); のファイル・オープンモードのレポート
PSPプログラミング ファイル入出力関数まとめ
PSPプログラミング バッファド・ファイル入出力のまとめ(抜粋)
PSPプログラミング 低水準ファイル入出力のまとめ(抜粋)

関連記事

[edit]

CM: 0
TB: 0

page top

この記事は、低水準ファイル入出力で主に使う関数のまとめです。
あまり使わないであろう関数については省いてあります。

全部の関数については、下記のヘッダーファイルを参照してください。
↓↓↓↓↓
C:\pspsdk\psp\sdk\include\pspiofilemgr.h


・低水準ファイル入出力

  バイト単位のファイルアクセスを、ユーザバッファとの間で行ないます。

int fp
  ↑この fp は、ファイル・ディスクリプタと呼ばれます。


低水準ファイル入出力では、ファイル・ディスクリプタ(ファイル記述子)という整数値を用いてファイル操作をします。

● sceIoOpen (ファイルを開く)
int sceIoOpen(const char *PATH, int FLAG, SceMode MODE);
  PATH == ファイル名を指すポインタ
  FLAG == ファイルのアクセスフラグ
  MODE == ファイルの属性(パーミッション)
 [機能]
  PATHで示されるファイルを、FLAGで示されるアクセスフラグでファイルを開きます。
  その際のファイルの属性は、MODEとします。

   FLAGの値  機 能
   PSP_O_RDONLY 読み出し・オンリー・モード
   PSP_O_WRONLY 書き込み・オンリー・モード
   PSP_O_RDWR 読み出し・書き込み・モード
   PSP_O_NBLOCK 不明(ひょっとして、ブロッキング転送に関係あり?)
   PSP_O_DIROPEN ディレクトリ・オープン・モード(使用されない)
   PSP_O_APPEND 追記モード
   PSP_O_CREAT ファイルの新規作成モード
   PSP_O_TRUNC 既存ファイルをオープンし、空ファイルにする
   PSP_O_EXCL ファイルが存在すれば新規作成しない
   PSP_O_NOWAIT 待ち時間無し転送モ-ド

MODE ファイルの属性(パーミッション) は、0777 で良いみたいです。

 [返り値]
  エラーなら 負の値 ( -2147418110 )
  正常ならファイル・ハンドル値

● sceIoClose (ファイルを閉じる)
int sceIoClose(int fp);
  fp == ファイル・ディスクリプタ
 [機能]
  fpのファイルを閉じます。
 [返り値]
  エラーなら 負の値 ( -2147351773 )
  正常なら 0

● sceIoRead (ファイルからの一括読み出し)
int sceIoRead(int fp, char *BUFF, int SIZE);
  fp == ファイル・ディスクリプタ
  BUFF == 読み出すデータの格納先
  SIZE == 読み出すデータのバイト数(希望する値)
 [機能]
  fpのファイルからバッファBUFFにSIZEバイトのデータを読み出します。
 [返り値]
  エラーなら 負の値 ( -2147351773 )
  正常なら 読み込みしたデータのバイト数

● sceIoWrite (ファイルへの一括書き込み)
int sceIoWrite(int fp, char *BUFF, int SIZE);
  fp == ファイル・ディスクリプタ
  BUFF == 書き込むデータが格納されているバッファ
  SIZE == 書き込むデータのバイト数(希望する値)
 [機能]
  fpのファイルへバッファBUFFからSIZEバイトのデータを書き込みします。
 [返り値]
  エラーなら 負の値 ( -2147351773 )
  正常なら 書き込みできたデータのバイト数

● sceIoLseek (ファイル読み/書き位置の移動)
int sceIoLseek(int fp, SceOff OFFSET, int WHENCE);
  fp == ファイル・ディスクリプタ
  OFFSET == 移動量
  WHENCE == 移動の基点モード(PSP_SEEK_SET、PSP_SEEK_CUR、PSP_SEEK_END)
 [機能]
  fpで開かれているファイルからの読み書きをする現在位置を、任意位置へ移動します。
  WHENCE ─┬ PSP_SEEK_SET ファイルの先頭から
           ├ PSP_SEEK_CUR ファイルの現在位置から
           └ PSP_SEEK_END ファイルの終わりから
 [返り値]
  エラーなら 0以外 ( 負の値 : -2147351773 )
  正常に移動できたら NULL(0)

● sceIoRemove (ファイルの削除)
int sceIoRemove(const char *PATH);
  PATH == ファイル名を指すポインタ
 [機能]
  PATH の ファイルを削除します。
 [返り値]
  エラーなら 0以外 ( 負の値 : -2147418110 )
  正常に削除できたら NULL(0)




もう一度書きますが、低水準ファイル入出力の関数 全部については、下記のヘッダーファイルを参照してください。
↓↓↓↓↓
C:\pspsdk\psp\sdk\include\pspiofilemgr.h


【 関連記事 】
PSPプログラミング ファイル入出力関数についての講釈
PSPプログラミング fopen( ); のファイル・オープンモードのレポート
PSPプログラミング ファイル入出力関数まとめ
PSPプログラミング バッファド・ファイル入出力のまとめ(抜粋)
PSPプログラミング 低水準ファイル入出力のまとめ(抜粋)

関連記事

[edit]

CM: 0
TB: 0

page top

PSPプログラミング 8進数の罠 

2009/10/18
Sun. 00:25

プログラミングの際は、扱う数値にも気を付けて下さい。

sceIoOpen( , , 0777);
0777 は、8進数の値です。

C++では8進数は、数値の左端に 0 を付けます。
C++では16進数は、数値の左端に 0x を付けます。

8進数は、0、1、2、3、4、5、6、7 の数字を使って表現します。
16進数は、0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F の英数字を使って表現します。


ポカミスしそうなので書いてみました。

【 関連記事 】
PSPプログラミング [ 番外編 ] シフト演算に潜む罠 (重要問題)
PSPプログラミング - 準備編 1 2進数に慣れよう
PSPプログラミング - 準備編 2 「ビット」と「バイト」、「16進数」について
PSPプログラミング - 準備編 3 バイト・ワード・ダブルワード、符号、変数

関連記事

[edit]

CM: 0
TB: 0

page top

メモリースティック内のファイル書き換えの方法


ファイルの書き換えは、2通りの場合について解説します
(1) ファイルサイズが変わらない場合(この記事で紹介
(2) ファイルサイズが変わる場合(次の記事で紹介


>> (1) ファイルサイズが変わらない場合
書き換えする前と後で、デバイス上のファイルの並び方が物理的に変わらない場合です。
書き換えするデータ数が同じという条件

この場合の、ファイル書き換え方法の手順(日本語)

1. ファイルを読み書きモードで開きます
2. 書き換えする部分のデータを読み出します
3. 書き換え済みか調べます
4. 書き換え済みなら次の作業に移ります
5. 未書き換えなら、書き換える作業に入ります(以下)
6. ファイルの、書き換える位置にシーク命令で移動します
7. 必要なデータだけを書き込みます
8. ファイルを閉じます

上記を C++プログラミングしてみます

【 ファイル "ms0:/機密文書.TXT" の、
10バイト目からの連続8バイトデータ "ULTRAMAN" を "GORENJER"に書き換える例 】

この関数のコピペ&利用&改造は、ご自由にどうぞ。
赤い文字の部分は必要に応じて書き換える箇所です

// ファイルのデータ書き換え関数サンプル(同じデータ数での書き換え)
int File_Kakikae(void)
{
int fp;
char buff[256]; // バッファサイズは、書き換えに余裕の256バイト長だ

fp = sceIoOpen("ms0:/機密文書.TXT", PSP_O_RDONLY|PSP_O_WRONLY, 0777);
if(fp <0) // ファイル・オープンエラーなら
{
sceIoClose(fp); // ファイルを閉じて
return -1; // ファイルが開けないエラー
}
sceIoLseek(fp, 0, PSP_SEEK_SET); // ファイルの先頭へ移動
sceIoLseek(fp, 10, PSP_SEEK_CUR); // ファイルの10バイト目へ移動
sceIoRead(fp, buff, 8); // fpから、8バイトのデータ読み込み

if(memcmp(buff,"ULTRAMAN",8)==0) // 書き換え前か確認して
{ // 書き換え前なら書き換える(以下)
sceIoLseek(fp, 0, PSP_SEEK_SET); // ファイルの先頭へ移動
sceIoLseek(fp, 10, PSP_SEEK_CUR); // ファイルの書き換え位置へ移動
sceIoWrite(fp, "GORENJER", 8); // 書き換えデータを書き込む
}
sceIoClose(fp); // ファイルを閉じる
return 0; // 正常終了
}



FILE *fp; での記述例は省略します。


【 関連記事 】
PSPプログラミング ファイルを開く手順をM@STERしよう!
PSPプログラミング ファイルサイズの取得をM@STERしよう!
PSPプログラミング メモリの確保(割り当て)をM@STERしよう!
PSPプログラミング ファイルの読み込みをM@STERしよう!
PSPプログラミング ファイルを閉じて・・・・・。
PSPプログラミング 忘れちゃダメよ!メモリの解放
PSPプログラミング メモリースティック内のファイル書き換え方法 その1
PSPプログラミング メモリースティック内のファイル書き換え方法 その2

関連記事

[edit]

CM: 0
TB: 0

page top

メモリースティック内のファイル書き換えの方法


ファイルの書き換えは、2通りの場合について解説します
(1) ファイルサイズが変わらない場合(前の記事で紹介
(2) ファイルサイズが変わる場合(この記事で紹介


>> (2) ファイルサイズが変わる場合

異なるデータ長へ書き換えするという条件
書き換えする前と後で、デバイス上のファイルの長さが変わってしまう場合です。

この場合の、ファイル書き換え方法の手順(日本語)

1. 書き換えるファイルを、読み書きモードで開きます
2. 更に、書き換えるファイルを、読み出しモードでも開きます
3. 書き換えする行まで、読み飛ばします
4. 書き換え済みかチェックします
5. 未書き換えなら、以下の作業をします
6. 書き換えする行の、次の行を読み込みます
7. 書き換えるデータ(行)を書き込みます
8. 6.で読み込みしたデータ(行)を書き込みます
9. [EOF]まで、データの切り詰め処理(書き直し)をします
10. 書き換え後のファイルサイズを取得します
11. 実際のファイルサイズを取得します
12. ファイルを閉じます
13. 書き換え後のファイルサイズが書き換え前より長くなった場合は、ここでおしまい
   (書き換え後のファイルサイズが書き換え前より短くなる場合は、下記を行なう)
14. メモリを確保して、ファイルをメモリに読み込んでから書き出す
15. メモリを解放して、ファイルを閉じます

上記を C++プログラミングしてみます


この関数のコピペ&利用&改造は、ご自由にどうぞ。

#include <stdio.h>
#include <malloc.h>

// テキストファイルを書き換える関数のサンプル
int File_Kakikae(filename, posLine, before, after)
// 引数の説明とか
const char *filename; // 書き換えを行なうファイルのPATH
int posLine; // 書き換えを行なう行の行番号(最初を1行目として計算)
const char *before; // 書き換え前の文字列へのポインタ
const char *after; // 書き換える文字列へのポインタ
{
char buff[256]; // 作業用のバッファ

FILE *fpRW = fopen(filename, "r+"); // 読み書き
FILE *fpR = fopen(filename, "r" ); // 読み出し
if( (fpRW == NULL) || (fpR == NULL) )
return -1; // ファイルが開けないエラー

int i;
for(i=1; i<posLine; i++) { // ループ(書き換えをおこなう行の手前まで)
fgets(buff, 256, fpRW); // 読み飛ばし
}
fseek(fpR, ftell(fpRW), PSP_SEEK_SET); // 読み出し位置をコピペ
fgets(buff, 256, fpR); // 1行 読み出し
if(strcmp(buff, before) == NULL) // 書き換え前か?
{ // 書き換え前なら以下を実行
fgets(buff, 256, fpR); // 書き換える行の、次の1行を読み出し
fputs(after, fpRW); // データを書き換える
fputs(buff, fpRW); // 先ほど読み出しておいた1行を書き込む

while(fgets(buff, 256, fpR) != NULL) { // 次の1行を読み出し
fputs(buff, fpRW); // 1行 書き込み(複写)
} // [EOF]まで繰り返し
}
else
{ // すでに書き換え済みだったら、何もせずにリターン
fclose(fpRW); // ファイルを閉じます
fclose(fpR ); // ファイルを閉じます
return 0; // すでに書き換え済みなのでエラーでは無い
}

long offset = ftell(fpRW); // 書き換え後のファイルサイズを取得
long fsize;
fseek(fpRW, 0, SEEK_SET);
fseek(fpRW, 0, SEEK_END);
fsize = ftell(fpRW); // 実際のファイルサイズを取得

fclose(fpRW); // ファイルを閉じます
fclose(fpR ); // ファイルを閉じます

if(fsize > offset) // ファイルサイズが短くなる場合への対処を以下に
{ // ここから、trancate( ) 関数のような処理(ファイルを短くする)
char *ptr; // メモリ確保用のポインター変数 兼、メモリハンドル用
int fp;

ptr = malloc( offset ); // メモリの確保をやってみる.
if(ptr == NULL) // メモリの確保が出来なかったら、以下
{
free(ptr); // メモリの解放.
return -1; // メモリが確保できなかったエラー
} // でも書き換えは成功しています。ファイルの末尾にゴミ付着エラー
fp = sceIoOpen(filename, PSP_O_RDONLY, 0777); // 読み出して
sceIoRead(fp, ptr, offset);
sceIoClose(fp);
fp = sceIoOpen(filename, PSP_O_WRONLY, 0777); // 書き込む
sceIoWrite(fp, ptr, offset);
sceIoClose(fp); // 閉じるとファイルが短くなる

free(ptr); // メモリの解放.
}
return 0; // 正常終了
}

(注) PSPSDKに、truncate( ) 関数が無かったので、代用処理を作ってみました。


【 ファイル "ms0:/重要文書.txt" の 5行目の文字列 "BEFORE\n" を "XYZ\n" に書き換える例 】
File_Kakikae("ms0:/重要文書.txt", 5, "BEFORE\n", "XYZ\n");


この関数の長所と問題点
○ 書き換える行を指定しているのは、他の行にも同じ文字列がある場合を想定しているからです。
○ 書き換えられているか確認してから書き換えるのは、念のためです。(^^;;;
× パラメータのエラーチェックは行なっていないのです。手抜きです。
× 短い文字列に書き換えを行なう場合、ファイルサイズが 32MB 以上だと、
 ファイルの末尾にゴミが残ります(ファイルがメモリに読み込めないため)。


【 関連記事 】
PSPプログラミング ファイルを開く手順をM@STERしよう!
PSPプログラミング ファイルサイズの取得をM@STERしよう!
PSPプログラミング メモリの確保(割り当て)をM@STERしよう!
PSPプログラミング ファイルの読み込みをM@STERしよう!
PSPプログラミング ファイルを閉じて・・・・・。
PSPプログラミング 忘れちゃダメよ!メモリの解放
PSPプログラミング メモリースティック内のファイル書き換え方法 その1
PSPプログラミング メモリースティック内のファイル書き換え方法 その2

関連記事

[edit]

CM: 0
TB: 0

page top

祝!「伝染るんです」アニメDVD発売!! 

2009/10/21
Wed. 18:04

あの吉田戦車の不条理ギャグ漫画、「伝染るんです」(うつるんです)が、アニメDVD化!
最近、第3巻目が発売されたので、レンタルしたい人は しばらく待つとレンタル料金が安くなるトカ !?

伝染るんです。第1巻 [DVD]伝染るんです。第1巻 [DVD]
(2009/08/21)
茶風林

商品詳細を見る


伝染るんです。第2巻 [DVD]伝染るんです。第2巻 [DVD]
(2009/09/18)
茶風林

商品詳細を見る


伝染るんです。第3巻 [DVD]伝染るんです。第3巻 [DVD]
(2009/10/23)
茶風林

商品詳細を見る


この前、久しぶりにコミックス読んだが、面白いかったゾ。
コミックスでもDVDでも、ドッチでもどうぞ。

アニメ版は、誰が声優やってるのか興味津々・・・・(^^;;;;;


YOUTUBE動画(外部サイトに動画が貼れません)
まさかの実写化!古田新太が「かわうそ君」に @YOUTUBE



関連リンク

「伝染るんです。」公式サイト
「伝染るんです。」 -Wikipedia
伝染るんです。公式ちゃんねる - ニコニコチャンネル

関連記事

[edit]

CM: 0
TB: 0

page top

PSP Homebrew Portable Binary Editor by たけし氏 

2009/10/22
Thu. 00:23

カスタムファームウェアのPSP で、メモリースティック内のファイルのバイナリ編集ができるアプリをご紹介。

BINARY_EDITOR_SS000.png


-- 続きを読む --
関連記事

[edit]

CM: 0
TB: 0

page top

C言語では、プログラムはヘッダーファイルとプログラムコードファイルとライブラリファイルとに大別されます。
一般的には、インクルードとはヘッダーファイルなどを参照することで、リンクとはライブラリを取り込む事のようです。全角文字表示ライブラリでは、東雲フォントのデータ(Shinonomefont.c)をインクルードしています。(注)

ヘッダーファイルとは、プログラムで使用する関数の宣言(返り値や引数のキャストも書かれています)や、定数の定義や変数の構造体の定義や、マクロ定義などを書くテキストファイルで、拡張子は '.h' 。
別名、インクルードするファイルとか、インクルードファイルとか呼ばれます。

ヘッダーファイル中で、変数の本体を宣言したり、関数の本体を書くことはお勧めしません。
理由は、ヘッダーファイルをインクルードした全てのファイルから参照できるので、同じ変数や関数がどこにでも作成されることになり、「本家はどこですか?」というコンパイルエラーが発生します。

一般には、ヘッダーファイルは、「参照すること/参照させること が目的」です。

(注)
全角文字表示ライブラリでの、フォントデータの参照方法
東雲フォントのデータ、const char shinonomefont[ ]; が書かれているファイル shinonomefont.c は、コンパイルされるだけでインクルードはされていませんが、どうやって shinonomefont[ ]; が参照されているのかを紹介します。
ファイル zenkaku.c の、draw_char( ); 関数にて、extern宣言で const char shinonomefont[ ]; を参照する、という記述がされています。
extern宣言で参照させたい変数や関数は、実行ファイルをビルドさせる全てのオブジェクトのどこかに本体が一つだけあれば良いのです。
全角文字表示ライブラリでは、MAKEFILE で

OBJS = main.o zenkaku.o shinonomefont.o

という記述で const char shinonomefont[ ]; のデータ本体があるファイルを リンクさせています。

プログラムコードファイル(という呼び名でいいのかな?)の'.CPP' '.C' '.S' では、変数を宣言したり、関数の実際の処理などを書きます。
プログラムの本体です。このファイルで定数の定義や変数の構造体の定義や、マクロ定義などを書いてもエラーにはなりませんが、美しくないので、プログラムコードとヘッダーとにファイルを分けて書いたほうが良いと思います。
ただし、ヘッダーファイルは参照させたい事を書いておくファイルなので、むやみやたらと分別して書くのでは困ります。
サブルーチンAという関数で、補助サブルーチンB、C、Dを呼び出している場合に、そのヘッダーファイルにも サブルーチンB、C、D の宣言を書いておくと、そのヘッダーファイルをインクルードさせた途端 他からもサブルーチンB、C、D の呼び出しが可能になってしまうので(変数や構造体なども同様)、上手に書き分けて下さい。
参照させたくない定義や変数や補助関数などは ヘッダーファイルに書かないで、プログラムコードソース・ファイル側 に書いて下さい。


ライブラリファイルは、良く使うプログラムソースをコンパイルして出来たオブジェクトファイル(バグ取り済み)を寄せ集めたアーカイブです。拡張子は '.a' 。
「ヘッダーファイルとアーカイブファイル」を指定するだけで利用できる便利な関数群とでも捉えておいて下さい。


PSP用のライブラリには、全角文字表示ライブラリ、画像や音声等を扱える「DXライブラリPortable」、PSP本体内蔵のフォントを利用できるイントラフォントライブラリ、SXライブラリ、タイムマネージャライブラリ、アニメーションライブラリなど、色々あります。

ライブラリは、上手に利用すると、短いソースコードでmp3音楽を再生できたりするので便利です。


次回は、「ライブラリの導入」です。お楽しみに~♪


【 関連記事 】
PSPプログラミング PSPSDK に同梱されているライブラリの一覧とリンク記述
PSPプログラミング EBOOT.PBP 生成用 Makefile 記述方法
PSPプログラミング プラグイン生成用 Makefile 記述方法
PSPプログラミング 正しい main( ) 関数の書き方を ご紹介

関連記事

[edit]

CM: 14
TB: 0

page top

まず、PSPSDK に同梱されているライブラリの一覧を紹介します。

● C:\pspsdk\psp\lib の中にあるライブラリ
crt0.o crt0_prx.o (←念のために記述してあります/使用できるかは未確認)
libbulletml.a libbz2.a libc.a libfreetype.a libfreetype.la libg.a libGL.a libGLU.a libglut.a
libglut.a libjpeg.a liblua.a liblualib.a libm.a libmad.a libmikmod.a libobjc.a libobjc.la
libogg.a libogg.la libpng.a libpspvalloc.a libpspvram.a libSDL.a libSDL.la libSDL_gfx.a
libSDL_gfx.la libSDL_image.a libSDL_image.la libSDL_mixer.a libSDL_mixer.la libSDL_ttf.a
libSDL_ttf.la libSDLmain.a libsmpeg.a libsqlite3.a libsqlite3.la libssp.a libssp.la
libssp_nonshared.a libssp_nonshared.la libstdc++.a libstdc++.la libsupc++.a libsupc++.la
libvorbis.a libvorbis.la libvorbisenc.a libvorbisenc.la libvorbisfile.a libvorbisfile.la
libvorbisidec.a libvorbisidec.la libz.a libzzip.a libzzip.la libzzipfseeko.a libzzipfseeko.la
libzzipmmapped.a libzzipmmapped.la libzzipwrap.a libzzipwrap.la

○ C:\pspsdk\psp\lib の 各ライブラリのリンクの書き方 @MAKEFILE
(注)拡張子が ’.la’の物は、LIGHT版か、LITTLE版かのどちらかだと推測したので割愛
ライブラリ名        リンク記述
libbulletml.a -lbulletml
libbz2.a -lbz2
libc.a -lc
libfreetype.a -lfreetype
libg.a -lg
libGL.a -lGL
libGLU.a -lGLU
libglut.a -lglut
libglut.a -lglut
libjpeg.a -ljpeg
liblua.a -llua
liblualib.a -llualib
libm.a -lm
libmad.a -lmad
libmikmod.a -lmikmod
libobjc.a -lobjc
libogg.a -logg
libpng.a -lpng
libpspvalloc.a -lpspvalloc
libpspvram.a -lpspvram
libSDL.a -lSDL
libSDL_gfx.a -lSDL_gfx
libSDL_image.a -lSDL_image
libSDL_mixer.a -lSDL_mixer
libSDL_ttf.a -lSDL_ttf
libSDLmain.a -lSDLmain
libsmpeg.a -lsmpeg
libsqlite3.a -lsqlite3
libssp.a -lssp
libssp_nonshared.a -lssp_nonshared
libstdc++.a -lstdc++
libsupc++.a -lsupc++
libvorbis.a -lvorbis
libvorbisenc.a -lvorbisenc
libvorbisfile.a -lvorbisfile
libvorbisidec.a -lvorbisidec
libz.a -lz
libzzip.a -lzzip
libzzipfseeko.a -lzzipfseeko
libzzipmmapped.a -lzzipmmapped
libzzipwrap.a -lzzipwrap

[ 説明 ]
libzzipwrap.a というライブラリをリンクしたい場合は、MAKEFILE の "LIBS=” の次の行に下記の記述をします。

# libzzipwrap.a を追加します
LIBS += -lzzipwrap




● C:\pspsdk\psp\sdk\lib の中にあるライブラリ
libpspatrac3.a libpspaudio.a libpspaudio_driver.a libpspaudiocodec.a libpspaudiolib.a
ibpspchnnlsv.a libpspctrl.a libpspctrl_driver.a libpspdebug.a libpspdebugkb.a libpspdisplay.a
libpspdisplay_driver.a libpspfpu.a libpspgdb.a libpspgdb_kernel.a libpspgdb_user.a libpspge.a
ibpspge_driver.a libpspgu.a libpspgum.a libpspgum_vfpu.a libpsphprm.a libpsphprm_driver.a
ibpsphttp.a libpspirkeyb.a libpspjpeg.a libpspkernel.a libpsplibc.a libpspmp3.a libpspmpeg.a
libpspmpegbase.a libpspmpegbase_driver.a libpspnand_driver.a libpspnet.a libpspnet_adhoc.a
ibpspnet_adhocctl.a libpspnet_adhocmatching.a libpspnet_apctl.a libpspnet_inet.a
libpspnet_resolver.a libpspopenpsid.a libpsppaf.a libpsppower.a libpsppower_driver.a
libpspprof.a libpspreg.a libpspreg_driver.a libpsprtc.a libpsprtc_driver.a libpspsdk.a
libpspsircs.a libpspssl.a libpspumd.a libpspumd_driver.a libpspusb.a libpspusb_driver.a
libpspusbbus_driver.a libpspusbcam.a libpspusbstor.a libpspuser.a libpsputility.a libpspvfpu.a
libpspvideocodec.a libpspvshbridge.a libpspwlan.a

○ C:\pspsdk\psp\sdk\lib の 各ライブラリのリンクの書き方 @MAKEFILE
ライブラリ名                 リンク記述
libpspatrac3.a -lpspatrac3
libpspaudio.a -lpspaudio
libpspaudio_driver.a -lpspaudio_driver
libpspaudiocodec.a -lpspaudiocodec
libpspaudiolib.a -lpspaudiolib
libpspchnnlsv.a -lpspchnnlsv
libpspctrl.a -lpspctrl
libpspctrl_driver.a -lpspctrl_driver
libpspdebug.a -lpspdebug
libpspdebugkb.a -lpspdebugkb
libpspdisplay.a -lpspdisplay
libpspdisplay_driver.a -lpspdisplay_driver
libpspfpu.a -lpspfpu
libpspgdb.a -lpspgdb
libpspgdb_kernel.a -lpspgdb_kernel
libpspgdb_user.a -lpspgdb_user
libpspge.a -lpspge
libpspge_driver.a -lpspge_driver
libpspgu.a -lpspgu
libpspgum.a -lpspgum
libpspgum_vfpu.a -lpspgum_vfpu
libpsphprm.a -lpsphprm
libpsphprm_driver.a -lpsphprm_driver
libpsphttp.a -lpsphttp
libpspirkeyb.a -lpspirkeyb
libpspjpeg.a -lpspjpeg
libpspkernel.a -lpspkernel
libpsplibc.a -lpsplibc
libpspmp3.a -lpspmp3
libpspmpeg.a -lpspmpeg
libpspmpegbase.a -lpspmpegbase
libpspmpegbase_driver.a -lpspmpegbase_driver
libpspnand_driver.a -lpspnand_driver
libpspnet.a -lpspnet
libpspnet_adhoc.a -lpspnet_adhoc
libpspnet_adhocctl.a -lpspnet_adhocctl
libpspnet_adhocmatching.a -lpspnet_adhocmatching
libpspnet_apctl.a -lpspnet_apctl
libpspnet_inet.a -lpspnet_inet
libpspnet_resolver.a -lpspnet_resolver
libpspopenpsid.a -lpspopenpsid
libpsppaf.a -lpsppaf
libpsppower.a -lpsppower
libpsppower_driver.a -lpsppower_driver
libpspprof.a -lpspprof
libpspreg.a -lpspreg
libpspreg_driver.a -lpspreg_driver
libpsprtc.a -lpsprtc
libpsprtc_driver.a -lpsprtc_driver
libpspsdk.a -lpspsdk
libpspsircs.a -lpspsircs
libpspssl.a -lpspssl
libpspumd.a -lpspumd
libpspumd_driver.a -lpspumd_driver
libpspusb.a -lpspusb
libpspusb_driver.a -lpspusb_driver
libpspusbbus_driver.a -lpspusbbus_driver
libpspusbcam.a -lpspusbcam
libpspusbstor.a -lpspusbstor
libpspuser.a -lpspuser
libpsputility.a -lpsputility
libpspvfpu.a -lpspvfpu
libpspvideocodec.a -lpspvideocodec
libpspvshbridge.a -lpspvshbridge
libpspwlan.a -lpspwlan


[ 説明 ]
libpspwlan.a というライブラリをリンクしたい場合は、MAKEFILE の "LIBS=” の次の行に下記の記述をします。

# libpspwlan.a を追加します
LIBS += -lpspwlan




PSPSDK のライブラリ全部をリンクさせる例 @MAKEFILE(ファイルの存在チェック用)
(警告) ライブラリを全部リンクさせると、起動できない実行ファイルが生成される場合があります。
     必要最低限のライブラリをリンクする様に勤めて下さい。
 検証しました@猫山

# ライブラリファイルの存在チェック用です。これをメインで使用しないようにお願いします!
# ===== C:\pspsdk\psp\lib section =====
LIBS += -lbulletml -lbz2 -lc -lfreetype -lg -lGL -lGLU -lglut -lglut -ljpeg -llua\
-llualib -lm -lmad -lmikmod -lobjc -logg -lpng -lpspvalloc -lpspvram\
-lSDL -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lSDLmain -lsmpeg\
-lsqlite3 -lssp -lssp_nonshared -lstdc++ -lsupc++ -lvorbis -lvorbisenc\
-lvorbisfile -lvorbisidec -lz -lzzip -lzzipfseeko -lzzipmmapped -lzzipwrap
# ===== C:\pspsdk\psp\sdk\lib section =====
LIBS += -lpspatrac3 -lpspaudio -lpspaudio_driver -lpspaudiocodec\
-lpspaudiolib -lpspchnnlsv -lpspctrl -lpspctrl_driver\
-lpspdebug -lpspdebugkb -lpspdisplay -lpspdisplay_driver\
-lpspfpu -lpspgdb -lpspgdb_kernel -lpspgdb_user\
-lpspge -lpspge_driver -lpspgu -lpspgum -lpspgum_vfpu\
-lpsphprm -lpsphprm_driver -lpsphttp -lpspirkeyb\
-lpspjpeg -lpspkernel -lpsplibc -lpspmp3 -lpspmpeg\
-lpspmpegbase -lpspmpegbase_driver -lpspnand_driver\
-lpspnet -lpspnet_adhoc -lpspnet_adhocctl -lpspnet_adhocmatching\
-lpspnet_apctl -lpspnet_inet -lpspnet_resolver -lpspopenpsid\
-lpsppaf -lpsppower -lpsppower_driver -lpspprof\
-lpspreg -lpspreg_driver -lpsprtc -lpsprtc_driver\
-lpspsdk -lpspsircs -lpspssl -lpspumd -lpspumd_driver\
-lpspusb -lpspusb_driver -lpspusbbus_driver -lpspusbcam\
-lpspusbstor -lpspuser -lpsputility -lpspvfpu\
-lpspvideocodec -lpspvshbridge -lpspwlan




通常のビルド時に、標準でリンクされるライブラリについて

リンク ライブラリ名
-lpspdebug libpspdebug.a
-lpspdisplay libpspdisplay.a
-lpspge libpspge.a
-lpspctrl libpspctrl.a
-lpspsdk libpspsdk.a
-lc libc.a
-lpspnet libpspnet.a
-lpspnet_inet libpspnet_inet.a
-lpspnet_apctl libpspnet_apctl.a
-lpspnet_resolver libpspnet_resolver.a
-lpsputility libpsputility.a
-lpspuser libpspuser.a
-lpspkernel libpspkernel.a



関連記事

[edit]

CM: 5
TB: 0

page top

アイドルマスターSP カタログ9号 PSP 

2009/10/25
Sun. 15:44

PSPアイドルマスターSP』の、その後のニュースです。

2009年10月28日(水曜)より配信




-- 続きを読む --
関連記事

[edit]

CM: 0
TB: 0

page top

ストーリートファイター系の格闘ゲームを紹介

                  ブラウザゲーム

     美少女達が繰り広げる格闘ゲーム

       Dream Club

                            Schoolgirl Street Fighter


 美少女格闘ゲーム Dream Club
     ↑↑ 画像クリックで飛びます

ただ今、記事の製作中につき、しばらくこれで遊んでてクレっ www


-- 続きを読む --
関連記事

[edit]

CM: 1
TB: 0

page top


h o m e |


 

2009-10