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

記事の間違いを報告 新アップローダー
記事修正情報 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ドラマ ゲーム 魔法少女まどか☆マギカ 侵略!イカ娘
アイドルマスター
このブログについて
著作権などの こまかい利用規約については、こちらを開いてお読み下さい
このブログについて知りたい方、初めて来訪された方はこちらを開いてお読みください
お問い合わせは 猫山猫宗(nekomune@gmail.com)までどうぞ
当ブログはリンクフリーです。ブログ名は、アルファベットで「PSP xvi」と書いて『ピーエスピー・エクシビ』とお読みください。
相互リンクを希望されるブログ運営者様は、ココで申請して下さい。
このブログで全記事から探し物の方は、ここをクリックして下さい。
http://nekoyama2gillien.blog36.fc2.com/?all
PSPプログラミング PSPパッドの読み取り(デジタル部分)
2010/04/07
Wed. 01:44
今回は、DXライブラリPortable での読み取りは行ないません.生データの検出からやります.
この記事でデジタル部分、次回記事でアナログ部分を解説します.
read frame(読み出しフレーム)というのも検出できるようですが、省略です.
定義されている構造体
/** Returned controller data */
typedef struct SceCtrlData {
/** The current read frame. */
unsigned int TimeStamp;
/** Bit mask containing zero or more of ::PspCtrlButtons. */
unsigned int Buttons;
/** Analogue stick, X axis. */
unsigned char Lx;
/** Analogue stick, Y axis. */
unsigned char Ly;
/** Reserved. */
unsigned char Rsrv[6];
} SceCtrlData;
カーネルモードとユーザーモードでは、PSPパッドの読み取れる内容が異なります.
全部 読めるのがカーネルモードで、一部 読めないのがあるのがユーザーモードです.
プログラマブルキーと特殊キーとに区別しようかと.
勝手に命名すると混乱を招く恐れがあるのですが、察して下さい.
参考にした資料 / ヘッダーファイル
pspctrl.h
[ カーネルモードで読み取れるデータ ]
定義されている変数 値(16進数 32ビット)
セレクトキー PSP_CTRL_SELECT 0x00000001
スタートキー PSP_CTRL_START 0x00000008
十字キー上 PSP_CTRL_UP 0x00000010
十字キー右 PSP_CTRL_RIGHT 0x00000020
十字キー下 PSP_CTRL_DOWN 0x00000040
十字キー左 PSP_CTRL_LEFT 0x00000080
Lトリガー PSP_CTRL_LTRIGGER 0x00000100
Rトリガー PSP_CTRL_RTRIGGER 0x00000200
△ボタン PSP_CTRL_TRIANGLE 0x00001000
○ボタン PSP_CTRL_CIRCLE 0x00002000
×ボタン PSP_CTRL_CROSS 0x00004000
□ボタン PSP_CTRL_SQUARE 0x00008000
ホーム PSP_CTRL_HOME 0x00010000
ホールド PSP_CTRL_HOLD 0x00020000
WLANスイッチ PSP_CTRL_WLAN_UP 0x00040000
リモコン差込 PSP_CTRL_REMOTE 0x00080000
音量+ PSP_CTRL_VOLUP 0x00100000
音量- PSP_CTRL_VOLDOWN 0x00200000
スクリーン PSP_CTRL_SCREEN 0x00400000
♪ PSP_CTRL_NOTE 0x00800000
UMD挿入 PSP_CTRL_DISC 0x01000000
メモステ挿入 PSP_CTRL_MS 0x02000000
プログラマブルキー&特殊キー(全部のキー)
2010年04月08日 00:30 更新
「PSP_CTRL_REMOTE」はリモコン付きヘッドフォンをPSPに挿したらONになりました.
書き間違いの訂正
最初、WANと書きましたが、WLAN(無線LAN)の間違いです.ごめんなさい.
イーサネット -Wikipedia
無線LAN -Wikipedia
WAN -Wikipedia
[ ユーザーモードで読み取れるデータ ]
定義されている変数 値(16進数 32ビット)
セレクトキー PSP_CTRL_SELECT 0x00000001
スタートキー PSP_CTRL_START 0x00000008
十字キー上 PSP_CTRL_UP 0x00000010
十字キー右 PSP_CTRL_RIGHT 0x00000020
十字キー下 PSP_CTRL_DOWN 0x00000040
十字キー左 PSP_CTRL_LEFT 0x00000080
Lトリガー PSP_CTRL_LTRIGGER 0x00000100
Rトリガー PSP_CTRL_RTRIGGER 0x00000200
△ボタン PSP_CTRL_TRIANGLE 0x00001000
○ボタン PSP_CTRL_CIRCLE 0x00002000
×ボタン PSP_CTRL_CROSS 0x00004000
□ボタン PSP_CTRL_SQUARE 0x00008000
ホーム PSP_CTRL_HOME 0x00010000
ホールド PSP_CTRL_HOLD 0x00020000
プログラマブルキーのみ
PADの読み取りについて 今までやらなかったのは、ユーザーモードでも 音量+ とか 音量- とか WLANスイッチ などを読み取れないか試行錯誤していたからです.
で、昨日 解決したので、PSPパッド入力について一挙公開です.
PSPパッドの読み取りテストプログラム(生データ閲覧用)のダウンロード(ソース付き)

(PSPパッド読み取りテスト.7z)
通常のカーネルモード版とユーザーモード版と、特殊なユーザーモード版の3種類同梱.
【 ユーザーモードで どうやって特殊キーの読み取りを行なっているのか説明 】
カーネルモードで動作するプラグインを作り、そのプラグイン内にPSPパッドの読み取りを行なう関数を書いておき、ユーザーモードのメインコードから そのプラグインモジュールを読み込んで 関数呼び出しでPSPパッド値を得ています.
ですから、PSPパッドの特殊キー読み取り部分はカーネルモードで実行しています.
PSP-2000でも、カーネルモードのプラグインは実行可能ですよ.
解かったかな?
このソースでプラグイン初公開ですがコードはプラグイン作り勉強向けではありません.これ専用のプラグインです.
技術を色々勉強できるかと思いますので、興味ある方は挑戦してください.
今日はもう遅いので、詳しく解説するのは後日.
【 関連記事 】
PSPプログラミング PSPSDKにライブラリを追加しよう(4) DXLibP v0.5.7
PSPプログラミング DXライブラリPortable でプログラムの「核」を書く
PSPプログラミング PSPパッドの読み取り(デジタル部分)
PSPプログラミング PSPパッドの読み取り(アナログパッド部分) 戦車ゲーム紹介
PSPプログラミング DXライブラリPortable でのパッド入力 その1
PSPプログラミング DXライブラリPortable でのパッド入力 その2
PSPプログラミング DXライブラリPortable でのパッド入力 その3 OSK
PSPプログラミング DXライブラリPortable でのパッド入力 その4 アナログ系
- 関連記事
-
- PSPプログラミング PSPパッドの読み取り(アナログパッド部分) 戦車ゲーム紹介 (2010/04/09)
- PSPプログラミング PSPパッドの読み取り(デジタル部分) (2010/04/07)
[edit]
« PSPプログラミング PSPパッドの読み取り(アナログパッド部分) 戦車ゲーム紹介 | 2010年度 天海春香さん誕生祭! 春香さんに「シェー」をしてもらいましたwww »
この記事に対するコメント
とりあえず、gotoバンバン使うのやめたほうがいいよ。
前も書いたけどまだ使ってるってことは俺の言うことなんて無視してるのかもしれないけど、
「gotoは、gotoを使わないと読みにくくなる時以外、使うべきではない」
ものですよ。
goto文
いや、あなたの意見は無視していませんよ。
どうするか考えて goto を使ったのです。
"C++ goto"検索すると、「あまり使うべきではない」と書かれていますね。
では、何故使用しているか?
continue; break; などを使うべきですが、その後どこへ飛ぶのかわからないので質問します、という質問が頻繁に来るのを避けたかったからです。
この場合、
main7.cの中身
while(1)
{
if( (pad.Buttons & 0x0000FFFF) == (PSP_CTRL_SELECT|PSP_CTRL_START) ) {
counter++;
if(counter > 75) goto OWARI;
}
}
OWARI:
return(0);
}
↑これは、以下に変更可能
改定後…
if(counter > 75) return(0); // ループと関数を抜けます。
皆さんは行番号表示できるテキストエディターを使用してると思うので、今後は コメントアウトで飛び先を書くようにします。
continue; break; も多用するように努めます。
いいわけとか
以前努めていた会社で入社してすぐ COBOLプログラミングやらされていたとき、goto を使わないで
苦労して開発やってたのに、同僚はすぐ仕事を終わらせていたのでソースを見せてもらったら
goto多用の COBOLのスパゲティーソースだった、というワナww
「仕事が遅い」とのクレームを先輩から頂いたのでソースを見せると、「初めて見る命令群だ。これ、
新型COBOL?C?」とか真剣に質問されたし。
その後、COBOL で goto を使うようになり、PSP開発でも使ってたのです。
わかり易く書いたつもりのコードですが、良質なC++コードでは無い事実です。
以後スタイル変更するのだ。
今回もありがとう。トリップコード一致の人
何も考えずにgoto文はダメとかいう奴は無視していいと
思うよ管理人さん
まんざらウソでもないのですよ
http://monpe.cliff.jp/computer/cpp/130_cpp_ed_doc.html
http://wisdom.sakura.ne.jp/programming/c/c11.html
http://www.geocities.jp/ky_webid/c/017.html
http://ja.wikipedia.org/wiki/Goto文
見るとよろし
前職がどうとか以前に、
>continue; break; などを使うべきですが、その後どこへ飛ぶのかわからないので質問します、という質問が頻繁に来るのを避けたかったからです。
これも言い訳なんだけど。
使うべきなら黙って使うだろ。そういう質問が本当に来たらその時に回答すればいいだけ。
君は言い訳癖があるみたいだが、余計なお世話かもしれないが、その癖があるうちは開発は難しいんじゃないかな。
前から思ってたのだが
あんたの指摘することは、プログラムの書き方についてだけですが、もし goto が完全禁止なら goto命令が削除されてるはずです。
そんなことでPSP開発やめちゃえとか言われる筋合いはありません
人それぞれ、個性ってあるんだよ?
無個性なのは天海春香さんという事で…(^^;;;;;
【 コッソリ警告 】
某所の無明長夜さん、思っていることと発言することは区別して下さい
俺も前から思ってたんだけれども
話の通じない人だねえ。
誰が「goto完全禁止」と書いた?
誰が「goto使うならPSP開発やめろ」と書いた?
もっかい読み直してみ。
あと、goto乱用するのは「個性」じゃなくて「悪癖」です。
個性っていうのは基本が完成した人が発揮するものであり、初心者には当てはまりません。
あんたにはC++プログラミングの腕前があるのは認める。
このブログにどれだけの苦労とか時間とか開発費用とかかかっているかは内緒にしますが、あんたは間違いを指摘するだけで良いです。しばらく引っ込んでいて下さい
何を基準に完全初心者扱いするのかは不明
【 コッソリ警告 】
某所の無明長夜さん、そういうの書き込みしちゃダメだと思いますよ?
C++を齧った程度しか知らない私が言うのもなんですが、gotoがどうとか以前に、通りすがりさんの言い方には棘があるのでは?
”前職がどうとか以前に~”の書き込みと、”話の通じない人だねえ~”の書き込みは流石に頭にくるでしょう^^;
逆にあなたが言われている立場だとして考えてみてください。
少なくとも真摯に受け止められるような発言ではないですよね。
たとえあなたに悪気がなかったとしても。。
話し相手が名前も顔も知らない赤の他人でも、あなたの発言が正しいとしても、もう少しモラルをもって書き込みされたほうがいいのかな。と思います。
猫山さん
記事に関係の無いコメントをして申し訳ないです。
邪魔であればお手数ですが削除してください<(_ _)>
私はgotoの「乱用」は悪癖以外の何者でも無いというのは事実だと思います。
スパゲティーを積極的に作ってニヤニヤする遊び(いくらでも汚く書けるC言語特有の頭の体操)なら兎も角、こういう所で書くようなものでは無いかと
通りすがりさんは今までも言ってきましたが、ちょっと口が悪いです。
ブログと2chではネチケットが違いますし、それぞれのサイトでも違うのですから、書き込みをする前に他の方の発言を見てどの程度の言い方までが反感を買わないのか考えるべきだと思います。
とりあえず二人とも頭冷やしてください
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
こんばんは、はじめまして。中学生のLovePluserといいます。
十字キーで四角を動かすプログラムをつくろうとして、
ダウンロードした自作ソフトのKEYS()を次のようにかきかえました↓↓
void KEYS(void)
{
SceCtrlData pad; // PSPパッド構造体
int counter=0;
int x=300;
int y=100;
while(1)
{
sceCtrlReadBufferPositive(&pad, 1); // パッド入力
if (pad.Buttons & PSP_CTRL_UP) y-=5;
if (pad.Buttons & PSP_CTRL_DOWN) y+=5;
if (pad.Buttons & PSP_CTRL_LEFT) x-=5;
if (pad.Buttons & PSP_CTRL_RIGHT) x+=5;*/
DrawBox(x,y,60,60, DXP_COLOR_YELLOW,TRUE);
ScreenFlip(); // 画面を表示
if( (pad.Buttons & 0x0000FFFF) == (PSP_CTRL_SELECT|PSP_CTRL_START) ) {
counter++;
if(counter > 100) goto OWARI;
}
else {
counter=0;
}
}
一応makeもできるしEBOOT.PBPはできます。しかし、実行すると真っ暗な画面に長細い黄色の四角があらわれて、十字キーで操作すると四角が動くのではなく大きくなってしまいます・・
なぜでしょうか?
ヒントだけ
画面の描画&表示の際に気をつけること
画面を全部描き換える
もしくは部分だけ描き換える
その後で、自由に動かすキャラを描きます
この作業をしないと正しく反映されませんよ
つまり この場合、
黄色いトウフを描く前に、背景を黒色などで塗りつぶす作業が必要
それと、DrawBox(x1,y1,x2,y2,color,true); のパラメータは、
x1,y1 ← 四角の左上の座標
x2,y2 ← 四角の右下の座標
であり、x2,y2 は幅ではありません
ココまで書いたら、どう修正すれば良いか解るよね?
あえて答えは書かないので、自分で考えて技術をモノにして下さい
ありがとうございます!
僕は学校(クラブ)でプログラムをやっています
よかったら見てください!
http://sukenweb.s206.xrea.com//
2009年のSkyAction,2008年のパクパクゲーム
は僕の作品です!
トラックバック
| h o m e |




