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

ブラウザゲーム 『MARIPPY』

画像クリックで飛びます



ただ今、プログラミング中につき、ブログの更新が遅れています。
しばらくの間、このゲームで遊んでてくり(^^;;;;;





-- 続きを読む --
関連記事
スポンサーサイト

[edit]

CM: 0
TB: 0

page top

SONY メモリースティック PRO-HG デュオ HX 32GB USBアダプタ付 MS-HX32GSONY メモリースティック PRO-HG デュオ HX 32GB USBアダプタ付 MS-HX32G
(2009/09/07)
ソニー

商品詳細を見る



なんか、今日発売されたみたいですが、誰か買いましたか?
ボクは、CR-5400 に 16GBx2枚 で 32GB があるのでまだ買ってませんが(買うのか?)

32GBのメモステに、アイマス関連のデータが 21GB占めている、ナイスなボクのPSPであった…。

関連記事

[edit]

CM: 0
TB: 0

page top

PSP FREEDOM HACK (三才ムック VOL. 260) 

2009/09/09
Wed. 17:07

PSP FREEDOM HACK (三才ムック VOL. 260)PSP FREEDOM HACK (三才ムック VOL. 260)
(2009/09/02)
不明

商品詳細を見る



■特別付録CD-ROM

◆独占収録!『完璧UMD Dumper』


あの『PSP Filer』の作者が、本誌読者のためだけに製作した最新鋭UMDリッピングツール!
※ネット配布予定なし!本誌でのみ入手可能!!

UMD吸出しツールの決定版だとか。この本、限定収録。


近所の本屋で売っていたので、貼り付けてみた。


関連記事

[edit]

CM: 1
TB: 0

page top

いきなりですがスーファミのソフトをEBOOT.PBPに変換してPSPに移植することは可能でしょうか?

なんか、こういう質問を受けたので、答えてみます。


変換するのは移植であるかどうか、議論をかましたい今日この頃(笑)

スーパーファミコンとPSPは、まず、プラットフォームが違います。

プラットフォーム (コンピューティング) - Wikipedia
スーパーファミコン - Wikipedia
プレイステーション・ポータブル - Wikipedia

PSPのエミュレータで、スーパーファミコンのROMを実機に近い動作で遊べますが、それはエミュレーションしているのであって、移植では無いですな。

エミュレーションとは、機械語で書かれた実行ファイルを 一語 一語 解析して、何をする命令か判断をして、更に BIOS やハードウェアなどに照らし合わせて、結局、『このような動作になるハズだッッッ』という処理を、絶えず やってのける作業です。人間にはとても出来ない作業でっす(^^;;;;;


日本には、エミュレータについて こんな法律があります。

原則として、ゲームエミュレータ本体に関しては、実物の動作をリバースエンジニアリングして開発する限りは違法性はないとされる。ただし、ハードウェアベンダから提供される、ハードウェア情報やソフトウェア開発キットなど、ベンダとの守秘義務契約に該当する情報を流用した場合は、守秘義務契約を違反した開発者に対して違法性を問われることになる。
リバースエンジニアリング -Wikipedia


EBOOT.PBP に変換というのは、PSP用の実行形式のファイルにするという事なので、スーパーファミコンのゲームソフトのプログラム・ソースを用意して、PSP用のコードに書き直してコンパイルして EBOOT.PBP を作成するのであれば、『可能です』という回答です。それを移植といいます。ええ。

オープンソースで頑張るしかっ!!



近況報告

リンクにある DXライブラリPortable を導入してみました。今後、お世話になりますよ~♪
画像表示プログラムを作っていたら、『画像インフォ』になった。
まず、画像を表示する前に、画像の情報が正しく読めているか確認しているのであった・・・・・。

関連記事

[edit]

CM: 8
TB: 0

page top

質問に答えるシリーズ
- メモリ書き込み編 -

書き換え方法についての質問でしたが、まず、書き込みから解説します(知ってたらスルーで)。


メモリへの書き込みは、メインメモリやグラフィックメモリ(V-RAM)に対して行なうのが一般的です。

基本は、アドレス(=メモリの番地)を指定して、値を代入する事で、実現。

例1
0x90000000 番地 に、0x31 を入れる

char *add; // 1バイト中身のアドレスポインタ
add = 0x90000000; // 0x90000000 番地
*add = 0x31; // 代入

例2
グラフィック画面(32ビットカラーモード & フレーム0 & 座標 [0,0] )に、青色の点(=0x00FF0000)を打つ

long *v-add; // 4バイト中身のアドレスポインタ
v-add = 0x44000000; // フレーム0 & 座標 [0,0] のアドレス(V-RAM)
*v-add = 0x00FF0000; // 青色(=0xFF0000)の点を打つ


PSP Filer 6.0 に、メモリビュワー機能があるので、簡単に ご紹介

PSP Filer を起動後、△ボタン、□ボタン、の順に押すと、メモリビューワになります。
これによると、アドレスは 下記の様になっています。

●メインメモリは、0x80000000 ~ 0x9FFFFFFF
●拡張メモリは、0xA0000000 ~ 0xBFFFFFFF (PSP-2000 or PSP-3000 のみ)
●グラフィックメモリは、0x04000000 ~ 0x041FFFFF (V-RAMでっす)
●スクラッチパッドは、0x00010000 ~ 0x00013FFF (I/Oポートなのか?)

【ヒント】 ビュワーなので、メモリの書き換えは出来ませんよ


むぅ、グラフィックメモリのアドレスが、微妙に違うのかな?(なぞ)
正しいアドレスマップとかは、後日調べます。


SDKに、メモリ操作を行なう関数が用意されているので、ご紹介。
ヘッダの場所
 C:\pspsdk\psp\sdk\include\libc\string.h

この string.h をテキストエディタ等で開いて下さい。
mem~~関数 と、str~~関数 がありますね。

mem~~関数 は、バイナリ操作で、str~~関数 は、文字列型操作です。


配列型変数の初期化をする場合、memset( ); という関数を使うと便利です。

int  hairetu[5963]; // 一次元 配列型変数の宣言
memset( hairetu , 0 , sizeof(hairetu) ); // hairetu の中身全部を 0 で埋める
              // 文字列型変数の初期化(0x00 で 埋める)を行なうときにも対応

sizeof(○○) というのは、○○のサイズ(使用量)を求める計算式です。コンパイル時に計算されます。
sizeof( ) は、関数ではありません。sizeof( ) で無いことに注目!


メモリの書き換えの際、注意する点は、データ格納順番とキャストとアドレッシングです。

long  *pointer;
pointer = 0x88000000;
*pointer = 0x123456;

を実行すると、メモリに書き込まれる内容は、下記のようになります。

アドレス  内容
88000000  56
88000001  34
88000002  12
88000003  00

注目
 ・ "0x123456”は、3桁の16進数ですが、pointer が (long *) なので、4バイト単位でのやりとりになります。
 ・ バイナリ単位で見ると、0x00, 0x12, 0x34, 0x56 の順番ではなくて、0x56, 0x34, 0x12, 0x00 という風に 書き込まれている事実!


いっぽう、
long  *pointer;
pointer = 0x9A000001
*pointer = 0xABCDEF88;

を実行すると、バスエラーが発生します。

注目
 ・ (long *) や (short *) などのポインタ変数の場合、ポインタのアドレスに奇数を代入してはいけません。
 ・ もし偶数アドレスであっても4で割ると余り2になるアドレスへのlong値の転送(代入)の場合もバスエラーが発生します。




次は、メモリの書き換え編ですよー。


関連記事

[edit]

CM: 0
TB: 0

page top

質問に答えるシリーズ
- メモリ内容の書き換え編 -

さて メモリ書き換えですが、方法は、メモリの値を読み込み、内容に変更を加えてから メモリの同じ場所へ書き込むことが基本です。

では早速

例1
8D120000番地(16進数) からの連続9バイトに、各 25(10進数)ずつ足す

char data; // 足し算用
long i; // アドレス 兼、ループ用
for( i = 0x8D12000; i < 0x8D120000+9; i++)
{
data = (char *)i; // メモリ内容の読み込み
data += 25; // 足し算
(char *)i = data; // メモリへ書き出し
}


例2
グラフィック画面(32ビットカラーモード & フレーム0)全体に、青みをかける

#define VRAM_ADDRESS 0x44000000 // グラフィック画面の開始アドレス
#define FRAMESIZE 0x88000 // 1フレーム辺りのサイズ(横512pixel×縦272pixel
// ×色深度4bytes)
long rgb; // データ用
long i; // アドレス 兼、ループ用
for( i = VRAM_ADDRESS; i < VRAM_ADDRESS + FRAMESIZE; i+=4 )
{
rgb = (long *) i ; // 読み出し1回目
rgb = (long *) i ; // 読み出し2回目注 1
rgb |= 0x008F0000; // 青っぽい色(=0x8F0000) を OR でくっつける
(long *) i = rgb; // 書き出し
}
注 1
PSPのグラフィックメモリは、二度読みしないと正しい値が求められない様です。

例3
グラフィック画面(32ビットカラーモード & フレーム0)全体を、少し暗くする

#define VRAM_ADDRESS 0x44000000 // グラフィック画面の開始アドレス
#define FRAMESIZE 0x88000 // 1フレーム辺りのサイズ(横512pixel×縦272pixel
// ×色深度4bytes)
long rgb; // データ用
unsigned char rgbA, rgbR, rgbG, rgbB; // 色成分用
long i; // アドレス 兼、ループ用
for( i = VRAM_ADDRESS; i < VRAM_ADDRESS + FRAMESIZE; i+=4 )
{
rgb = (long *) i ; // 読み出し1回目
rgb = (long *) i ; // 読み出し2回目
rgbA = ((rgb & 0xFF000000) >> 3) & 0xFF000000; // α成分(念のため)
rgbR = ((rgb & 0x000000FF) >> 3) & 0x000000FF; // 赤成分
rgbG = ((rgb & 0x0000FF00) >> 3) & 0x0000FF00; // 緑成分
rgbB = ((rgb & 0x00FF0000) >> 3) & 0x00FF0000; // 青成分
(long *) i = rgbA | rgbR | rgbG | rgbB; // 書き出し
}
RGB各色の情報を、3ビット右にずらして削って、輝度を下げています。


ビット操作も出来ます。


9152FF01番地(16進数)の、1ビット目をOFF にして2ビット目をON にして 6~8ビット目を反転したい

char *pointer; // ポインター変数
char data; // ビット操作用

pointer = 0x9152FF01; // ポインタ変数にアドレス設定
data = *pointer; // 読み出し
data &= 0xFE; // 1ビット目をOFF(アンド記号) 0xFE = 11111110b(2進数)
data |= 0x02; // 2ビット目をON(縦線記号) 0x02 = 00000010b(2進数)
data ^= 0x70; // 6~8ビット目を反転(べき記号)0x70 = 11100000b(2進数)
*pointer = data; // 書き込み

最下位ビット(右側)が 1ビット目で、最上位ビット(左側)が8ビット目です。




さて、お次は本命のファイル操作ですが、その前にビット操作についての講釈をします。

関連記事

[edit]

CM: 9
TB: 0

page top

PSPプログラミング ビット操作の一覧表 

2009/09/19
Sat. 17:40

前回、AND とか OR とかが出てきたので、ご紹介

ビットとは、CPU が扱う数値の基礎です。

真 = ON = 1
偽 = OFF = 0

2進数なので、簡単かと。


ビット操作とは、所定のビットをONにしたり、OFFにしたり、反転する作業です

候補として、AND、OR、XOR、NOT などがあります。

AND ( A かつ B ) アンド
OR ( A または B ) オア
XOR ( A あるいは B のどちらか ) エクスクルーシブ・オア
NOT ( A でなくて ) ノット


以下、一覧表で見てください

AND ( A かつ B )
      ┏━━━━━┓
      ┃  B  ┃
      ┣━━┳━━┫
      ┃ 0 ┃ 1 ┃
┏━━┳━━╋━━╋━━┫
┃  ┃ 0 ┃ 0 │ 0 │
┃ A ┣━━╋──┼──┤
┃  ┃ 1 ┃ 0 │ 1 │
┗━━┻━━┻──┴──┘
A と B が真のとき、1


OR ( A または B )
      ┏━━━━━┓
      ┃  B  ┃
      ┣━━┳━━┫
      ┃ 0 ┃ 1 ┃
┏━━┳━━╋━━╋━━┫
┃  ┃ 0 ┃ 0 │ 1 │
┃ A ┣━━╋──┼──┤
┃  ┃ 1 ┃ 1 │ 1 │
┗━━┻━━┻──┴──┘
A または B が真のとき、1


XOR ( A あるいは B のどちらか)
      ┏━━━━━┓
      ┃  B  ┃
      ┣━━┳━━┫
      ┃ 0 ┃ 1 ┃
┏━━┳━━╋━━╋━━┫
┃  ┃ 0 ┃ 0 │ 1 │
┃ A ┣━━╋──┼──┤
┃  ┃ 1 ┃ 1 │ 0 │
┗━━┻━━┻──┴──┘
A のみが真、もしくは B のみが真のとき、1


NOT( A でなくて )
      ┏━━┓
      ┃反転┃
┏━━┳━━╋━━┫
┃  ┃ 0 ┃ 1 │
┃ A ┣━━╋──┤
┃  ┃ 1 ┃ 0 │
┗━━┻━━┻──┘
A の反転





算術式では、ビット演算と呼ばれます。
ビット演算
┏━━┳━━┳━━┳━━┳━━┳━━━━┳━━━━┓
┃演算┃AND ┃ OR ┃XOR ┃NOT ┃左シフト┃右シフト┃
┣━━╋━━╋━━╋━━╋━━╋━━━━╋━━━━┫
┃記号┃ & ┃ | ┃ ^ ┃ ~ ┃ << ┃ >> ┃
┗━━┻━━┻━━┻━━┻━━┻━━━━┻━━━━┛


条件式では、論理演算と呼ばれます。
論理演算
┏━━┳━━┳━━┳━━┓
┃演算┃AND ┃ OR ┃NOT ┃
┣━━╋━━╋━━╋━━┫
┃記号┃ && ┃ || ┃ ! ┃
┗━━┻━━┻━━┻━━┛
条件式における演算子については、こちらをどうぞ
演算子 - Wikipedia


ちなみに、条件式の記述について うっかりミスとか

if( state = 1 )
{
printf("やったぜ、加トちゃん!\n");
state++;
}

上記を行なうと、state に 1 が代入されてから、+1 加算されます。
何故かというと、if 文が代入式になっているからです。
この場合、

if( (state = 1) != 0)
{
printf("やったぜ、加トちゃん!\n");
state++;
}

という風に、コンパイラに解釈されちゃいます。
こういう記述の間違いは、コンパイル時にもエラーにならないので、自分でトレースして見付けるしかないようですね。
↑↑ ごめんなさい。コンパイルしたら「if文では代入しないほうが良いよん」警告がでますね。なんてカシコイPSPSDK!

さて、次回は ファイルの書き換え へ突入~~っ♪


関連記事

[edit]

CM: 0
TB: 1

page top

現在、配布停止中の『全角文字表示ライブラリ』

mediumgauge氏に申請して、東雲フォントの動画サイトへの公開許諾を得ました。
で、作った動画がコレでっす。





拡大しないと文字が潰れるので、寸法 大きめの動画なのです。ソースは、1280x720 (HD) です。


【 関連記事 】
PSPプログラミング 全角文字表示ライブラリをダウンロード
PSPプログラミング [ 番外編 ] 日本語の文字 一覧表(ASCII & SHIFT-JIS) 完全版
PSPプログラミング 東雲フォント文字を全部表示しちゃうプログラム
PSPプログラミング 東雲フォントのデータ構造を調べました
PSPプログラミング 全角文字表示ライブラリ公開停止中のお知らせ
PSPプログラミング 『東雲フォント』が動画になった

関連記事

[edit]

CM: 0
TB: 0

page top

ファイル操作編 - ファイルを開く
まずは、ファイルを開く方法から、みっちりと お勉強します。


PSPで、ファイルとして扱えるのは、以下のデバイスです。

デバイス名 ドライブ名
・メモリースティック   "ms0:"
・フラッシュメモリ "flash0:" "flash1:" "flash2:" "flash3:"
・UMDディスク "disc0:"
・赤外線ポート "irda0:"

赤外線ポートがあるのは、PSP-1000のみ

ファイルを扱うには、ファイルハンドルを取得して、そのファイルハンドルで行ないます。
ファイルハンドルは、ファイル構造体へのポインタ (FILE *)、もしくは int で定義します。


● ファイルを読み込みモードで開く関数を ご紹介
・FILE *fp; の場合
  fopen( "ファイル名", "r");
    FILE *fp 用のファイルを開く関数です。
    "ファイル名"には、絶対PATH注1、もしくは相対PATH注2 でファイル名を 書きます
    返り値は、ファイル・オープンエラーなら NULL (== 0x00 )
          正常に ファイル・オープン出来たなら ファイルハンドル
    注1
    絶対PATH とは、ファイル名をデバイス名から 全部表記したもの。フルPATH
    注2
    相対PATH とは、ファイル名をカレントディレクトリを基準として相対的な差分で表記したもの。

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


『ファイル構造体』 を 定義しているヘッダーファイル
C:\pspsdk\psp\sdk\include\libc\stdio.h
typedef struct {
int type;
int fd;
int cnt;
int flag;
int has_putback;
u8 putback;
} FILE;

ファイルを開く例 その1 FILE *fp; 編
FILE  *fd;
fd = fopen("ms0:/seplugins/GAME.txt","r");

解説
"r" は、"read""r"。読み込みモードで開く。

"ms0:/seplugins/GAME.txt" というファイルが無かったら、fd には、 NULL( == 0 ) が入る。
"ms0:/seplugins/GAME.txt" というファイルが存在したら、fd には、ファイルハンドルが入る。


FILE 構造体へのポインタ fd を使用している関数は、下記のヘッダーファイルに書いてあるので
各自、探して読んでみて下さい。

C:\pspsdk\psp\sdk\include\libc\stdio.h



ファイルを開く例 その2 int fp; 編
SceUID  fd;
fd = sceIoOpen("ms0:/MUSIC/Mario OP.mp3", PSP_O_RDONLY, 0777 );

SceUID は、int型です。
C:\pspsdk\psp\sdk\include\kerneltypes.h 内で、定義されています。
/** UIDs are used to describe many different kernel objects. */
typedef int SceUID;

解説
PSP_O_RDONLY は、『読み込みモードで開く』というパラメータ値。

"ms0:/MUSIC/Mario OP.mp3" というファイルが無かったら、fd には、 負の値 が入る。
"ms0:/MUSIC/Mario OP.mp3" というファイルが存在したら、fd には、ファイルハンドルが入る。

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

関連記事

[edit]

CM: 18
TB: 0

page top

ファイルを開いたら、何をするのか。

・必要なら、ファイルサイズを求めてみる
・そのファイルを全部読み込むなら、必要分のメモリを確保すべしッッ!
・ファイルの読み込み
・ファイルを閉じる(特に書き込みの後は、ファイルを閉じないと内容は保障されません)
・プログラム終了前に、確保したメモリを解放する事!


ファイルサイズを求めてみよう


ファイルサイズの取得 その1
long GetFileSize( FILE *fd )
// ファイルサイズを求める関数 ( FILE * で宣言したファイルハンドル用 )
// この関数を呼び出す前に、ファイルハンドルを取得しておいて下さい

{
long length; // ファイルサイズ用の変数(ココに入る)

fseek( fd, 0, SEEK_SET ); // 読み出し位置を先頭へ
fseek( fd, 0, SEEK_END ); // 読み出し位置を末尾へ
length = ftell( fd ); // 計ります
fseek( fd, 0, SEEK_SET ); // 読み出し位置を先頭へ

if (length <= 0)
return 0; // エラーや、ファイルサイズが 0 なら 0 を 返します
else
return length; // 数えるのに成功したら、そのファイルサイズ を 返します
}



ファイルサイズの取得 その2
long pgGetFileSize( int fd )
// ファイルサイズを求める関数 ( int で宣言したファイルハンドル用 )
// SceUID キャストが正しく認識しないようなので、int で書いておく
// この関数を呼び出す前に、ファイルハンドルを取得しておいて下さい

{
long length; // ファイルサイズ用の変数(ココに入る)

sceIoLseek(fd, (long long int)0, SCE_SEEK_SET); // 読み出し位置を先頭へ
length = sceIoLseek(fd, (long long int)0, SCE_SEEK_END); // 読み出し位置を末尾へ
sceIoLseek(fd, (long long int)0, SCE_SEEK_SET); // 読み出し位置を先頭へ

return length; // ファイルサイズ を 返します
}



解説

・ファイルシーク関数を使って、ファイルサイズを計ります
・ファイルを開いてから、どちらかの関数を呼び出すと、ファイルサイズが得られます
・ファイル読み込み位置を先頭に戻さないと、[EOF] にナリマスヨー!!


[EOF] は、End Of File の略で、ファイルの終わりを指します。

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

関連記事

[edit]

CM: 0
TB: 0

page top

ファイル操作編 - ファイルサイズ分のメモリを確保する

ファイルからデータを読み込む際、メモリを必要分 確保しておかないと、メモリの内容は保障されません。
メモリを確保しておかないと、データを上書きされたり、消されたりされる可能性があります。


メモリの確保(割り当て)
アロケーション(allocation)は、『割り当てる』という意味ですが、メモリの確保ですよ?

ちゅうい  以下のプログラムは、試作段階なので、実用には向いていません


char *ptr; // メモリ確保用のポインター変数 兼、メモリハンドル用
// ↑↑ グローバル変数にしておくといいかも。
char *malloc( int ); // メモリ確保関数の宣言(通常は、ヘッダーファイルを include すれば宜しいかと )
long GetFileSize( FILE * ); // 前回、製作した関数の宣言。ファイルサイズを求めます


FILE *fd; // ファイルハンドル用
long fsize; // ファイルサイズ

fd = fopen( "ms0:/MUSIC/TETRIS.mp3", "r" );
if(fd == NULL)
return ERROR__FILE_NOT_FOUND; // ファイルが無かったらエラーで返ります.

fsize = GetFileSize( fd );
if(fsize == 0) // ファイルサイズが 0バイトならエラーで返ります.
return ERROR__FILE_SIZE_ZERO;
else
{ // ファイルサイズが 1バイト以上ならメモリ確保処理を行ないます.
// メモリの確保は、ここからがメインです
ptr = malloc( fsize ); // メモリの確保をやってみる.
if(ptr == NULL) // メモリの確保が出来なかったら、以下
{
free(ptr); // メモリの解放.
fclose(fd); // ファイルを開いていたら、リターンの前に閉じておきましょう!
return ERROR__MEMORY_IS_NOT_ALLOC; // エラーで返ります.
}
}
// ← ここまで来れたら、ptr には、指定ファイルのサイズ分のメモリへのハンドルが得られています.

// ← この辺りには、ファイル読み込み処理とかを記述して行きます

free(ptr); // メモリの解放.
// ↑↑ コトが終わったら、メモリを解放します(重要)



解説

・malloc関数 で、必要なバイト数のメモリを確保(割り当て)します。
・この場合では、ファイルサイズ分のバイト数をメモリ確保しています。
・メモリが確保できない場合があります。
・メモリハンドルは、ちゃんと管理しておいて下さい(メモリの解放の時にも必要)。

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

関連記事

[edit]

CM: 0
TB: 0

page top

今さら、初音ミク・グッズ 

2009/09/25
Fri. 06:12

初音ミク -プロジェクト ディーヴァ- (特典 ねんどろいどぷち 初音ミク Project DIVA) 付き初音ミク -プロジェクト ディーヴァ- (特典 ねんどろいどぷち 初音ミク Project DIVA) 付き
()
Sony PSP

商品詳細を見る



ねんどろいど 初音ミク (ノンスケール ABS/PVC塗装済み可動フィギュア)ねんどろいど 初音ミク (ノンスケール ABS/PVC塗装済み可動フィギュア)
(2009/05/11)
グッドスマイルカンパニー

商品詳細を見る



VOCALOID 初音ミク オルゴールフィギュア全2種セットVOCALOID 初音ミク オルゴールフィギュア全2種セット
()
不明

商品詳細を見る



関連記事

[edit]

CM: 0
TB: 1

page top

ファイル操作編 - ファイルの読み込み処理

ファイルを、読み込みモードで 開きます。
必要なら、そのファイルのファイルサイズを計ります。
その後は、ファイルを丸ごと読み込みしたり、必要箇所だけ読み込みしたりなど、何をするかは自由です。

なお、ファイルの読み込みを終えて、もう、そのファイルにアクセスしないという場合は、その開いたファイルを閉じましょう。


では、読み込みに必要な関数を ご紹介

● 1バイト読み込み
int getc( FILE *fd );
  解説:ファイルハンドル fd から、1バイト読み込む。
      ファイルの終わりなら、-1(4バイト値0xFFFFFFFF)が得られます.

● 複数バイト読み込み(チョイ読み型)
char *fgets( char *buff, int size, FILE *fd );
  解説:ファイルハンドル fd から、(size-1) バイト読み込み、buff の指すアドレス以降へ
    読み込みした内容を格納する.
     文字列を読み出す作業に適しています.
     返り値は、ポインタ *buff のアドレス (正常時)
           0 (ファイルの終わり時)
          -1 (エラー時)
    更に、読み込みした内容が、テキストの文字列だった場合、
    文字列の終わりに、[CR][LF][0x00]という3バイトコードが付加されます。
    情報提供 = 憂煉さん 詳細は、この記事のコメントを読んで下さい。


● 複数バイト読み込み( 一気読み型 / FILE *fd 版 )
int read( FILE *fd, char *buff, int size );
  解説:ファイルハンドル fd から、size バイト読み込み、buff の指すアドレス以降へ
    読み込みした内容を格納する.
     バイナリデータを一気に読み込む作業に適しています.
     返り値は、実際に読み込まれたバイト数(正常時)
           0 (ファイルの終わり時)
          -1 (エラー時)

● 複数バイト読み込み( 一気読み型 / read( ); の int fd 版 )
int sceIoRead( int fd, char *buff, int size );
  解説:ファイルハンドル fd から、size バイト読み込み、buff の指すアドレス以降へ
    読み込みした内容を格納する.
     バイナリデータを一気に読み込む作業に適しています.
     返り値は、実際に読み込まれたバイト数(正常時)
           0 (ファイルの終わり時)
          -1 (エラー時)


いっぽう、読み込み中に、データの読み飛ばし(スキップ)をしたい場合もあるかと存じます。
そんな時は、シーク関数を使うと便利です。


● 指定バイト数の読み飛ばし( FILE *fd版 )
fseek( FILE *fd, long, SEEK_CUR );

例:15バイト分、読み飛ばす。
fseek( fd,15, SEEK_CUR );

例:38バイト分、読み飛ばす。
fseek( fd, 38, SEEK_CUR );

解説
使用例を見てもらえば、良く解かるかと。
第2パラメータで、読み飛ばすバイト数を指定。


● 指定バイト数の読み飛ばし( int fd版 )
sceIoLseek( int fd, long, SEEK_CUR );

例:21バイト分、読み飛ばす。
sceIoLseek( fd, 21, SEEK_CUR );

解説
第2パラメータで、読み飛ばすバイト数を指定。


尚、ファイルの終わりの事を、専門用語で [EOF] (= いー・おー・えふ )と言います。
End Of File の略です。

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

関連記事

[edit]

CM: 8
TB: 0

page top

さて、一段落 着きたいので、ファイルを閉じるをお勉強でっす。

これはカンタン!


FILE *fp; なら fclose(fp);

int fp; なら sceIoClose(fp);


fp が指すファイルへのアクセスが出来なくなります。
ファイルを開くときは、また fp を取得してからですよっ!

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

関連記事

[edit]

CM: 0
TB: 0

page top

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

2009/09/30
Wed. 13:05

さて、アイマスカタログ8号の情報がっ!と思ったら、今日から配信です。

2010年9月30日より配信




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

[edit]

CM: 0
TB: 0

page top


h o m e |


 

2009-09