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

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

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


メモリへの書き込みは、メインメモリやグラフィックメモリ(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

この記事に対するコメント

page top

コメントの投稿

Secret

page top

トラックバック

トラックバックURL
→http://nekoyama2gillien.blog36.fc2.com/tb.php/143-3ed923e0
この記事にトラックバックする(FC2ブログユーザー)

page top


h o m e |


 

2017-04