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



おことわり
こちらから始まる講座は、若い人向けに分かりやすく書いています。ですから詳しく調べると間違った書き方になっているものもあります。色々な事が分かるようになったら、もっと詳しく自己学習してくださいますよう、お願いします


初回のテーマは「2進数に慣れよう」

コンピュータというか、電子部品の基礎からお勉強するのだっ。

電気が入る   = 通電 = ON
電気が切れる = 断電 = OFF


上記の事は、理解して欲しい。分かりますよね?

電気が入る、切れる、で ON、OFFです。
これは、通電ON / 通電OFF(断電)。

コンピュータの世界では、条件式を演算し、その結果、
その答えが、真なのか偽なのかの判定をして、それぞれの場合の処理を行います。

電子回路(コンピュータも含む)に演算させると、判定結果のフラグ(=旗)の電流の状態が変化します。 通電ON / 通電OFF(断電)。

この 通電ON / 通電OFF は2パターンなので、「0」と「1」の2進数の数値で表す事ができますが、詳細は書きませんので知りたい方は独学で勉強してくださいね

[基礎]
通常 慣れ親しんでいる10進数は、0,1,2,3,4,5,6,7,8,9 の10パターンですね?
2進数は、0,1 の2パターンしか無いのです。


(例) これを踏まえて、プログラミング例

0001 ////////////////////////////////////
0002 //  コメント欄
0003 //     リンゴの色は?
0004 ////////////////////////////////////
0005 
0006 定  義:リンゴを1個、調達
0007 
0008 条件式:リンゴの色は赤色か?
0009 判  定:真(赤色)なら、[ラベル]*AKA の行へ飛べ
0010 //  (偽(赤色でない)場合の処理を下記に書く)
0011 // リンゴは赤くない
0012 処理A1:リンゴの色を赤く塗る
0013 処理A2:売りに出す
0014 処理A3:終了
0015 // リンゴは赤い
0016 *AKA   // [ラベル]
0017 処理B1:リンゴを蒸す
0018 処理B2:売りに出す
0019 処理B3:終了

C++ライクな日本語で、プログラムの核を書いてみた。
理解して頂けるであろうか。
[C++ライク]と定義したのは、C++言語でのプログラミングを想定しているからです。
プログラム中に // とあったら、その2文字(スラッシュ)以降の行は注釈(コメント)です(C++で拡張されたのです)。
また、C言語/C++言語での注釈は、 /* ~~~~~ */ という記号で囲んだ部分に当てはまります。詳しくは、C言語 / C++言語 の教科書参照の事。

では、今回はこれだけ。

スポンサーサイト

[edit]

CM: 4
TB: 0

page top

2010年1月15日 更新
今回は2本立て!

まず、「ビット」と「バイト」について

ビットとは、0もしくは1の2進数表現であり、データの最小単位です。
3ビットと言うと、2進数3桁の数値を指します。
16ビットと言うと、2進数16桁の数値を指します。
バイトとは、記憶容量の最小単位です。

KB=キロバイト
   ↓ 1000倍(注1)
MB=メガバイト
   ↓ 1000倍
GB=ギガバイト
   ↓ 1000倍
TB=テラバイト
   ↓ 1000倍
PB=ペタバイト

※注1・・・正確には、1024倍なのです。(2^10)・・・2の10乗が、1024。よって1024倍。

で、PSPプログラミングに於いては1バイト=8ビット(2進数8桁)で覚えておいてください。
故に 2バイト=16ビット(8ビット×2倍)、4バイト=32ビット(8ビット×4倍)、8バイト=64ビット(8ビット×8倍)、16バイト=128ビット(8ビット×16倍)、………、となります。

コンピュータのCPU(MPU)の性能表現の一つとして、nnビットCPUとかいうのは、一度に扱える2進数の桁数の事を言っているのです(情報量)。

PSP32ビットCPU2基 搭載した高性能コンピュータです。そのCPUは、メイン処理用とサウンド処理用とに割り当てられています。
PlayStation2は、128ビットCPUのコンピュータです。凄いっ!

8ビットで1バイトというのは、PSPプログラミングに於いても都合が良い単位です。覚えて下さい。


では次。「16進数」に慣れましょう。

数値はn進数で表現されます。人間は10進数を良く使いますが、コンピュータは2進数や16進数や8進数(もちろん10進数の演算も行なえます)を好んで使用します(厳密に言うと、2進数のみ理解できる)。

[ 10進数16進数 対応表 ]
 10進数  16進数
    0      0
    1      1
    2      2
    3      3
    4      4
    5      5
    6      6
    7      7
    8      8
    9      9
   10      A
   11      B
   12      C
   13      D
   14      E
   15      F

この16通りの値が、16進数の基本です。
16進数で、Fの次は10です。いちぜろ。10進数の場合と同じように桁上がりします。
16進数は2進数を元に考案されたものかも知れません。
早見対応表にて、即、2進←→16進 変換ができるかと存じます。

[ 2進数8進数16進数10進数 対応表 ]
  2進数   8進数  16進数   10進数

  0000     0     0       0
  0001     1     1       1
  0010     2     2       2
  0011     3     3       3
  0100     4     4       4
  0101     5     5       5
  0110     6     6       6
  0111     7     7       7
  1000    10     8       8
  1001    11     9       9
  1010    12     A      10
  1011    13     B      11
  1100    14     C      12
  1101    15     D      13
  1110    16     E      14
  1111    17     F      15

どうですか?4ビットで16進数の基本が表現出来ますね。

2進数と16進数の相互変換は、対応表を見なくても、自分の手の指を折って数えて計算できるので確認してみて下さい。

ちゃんと数えられますね。

nビット「2のn乗」桁の値を表現できます。4ビットは2の4乗=16通りです。
4ビットで16通りが表現できるので、8ビット(1バイト)では2の8乗=256通りの数値が表現できます

つまり、
1バイト(8ビット)で256通りの表現が でき、

10進数では 0 ~ 255 で、
16進数では 00 ~ FF で、
2進数では 00000000 ~ 11111111

です。


[edit]

CM: 5
TB: 0

page top

今回は、何と4本立てっ!

まず、「バイト(=Byte/Bytes)」を解説します。

昔の8ビット・パソコンの頃は「メモリ64KBです」とか、
OS = Windows 98 , 「メインメモリ128MB!」とか、
OS = Windows XP , 「メインメモリ512MB!」とか、
OS = Windows VISTA , 「メインメモリ4GB!」とか、
OSやパソコンによって様々ですが、この「バイト」について突っ込みします。

「コンピュータ(CPU)は、本当は2進数しか理解できない」という事を肝に銘じて欲しい。

故に、CPUは「2のn乗」単位でのみ、情報を入力/出力しています。
「キロバイトというのは 簡単に バイトの1000倍」と思われがちですが、実際は1024倍なのです。
これは、2の10乗が1024だからです。

よって、1キロバイト(=1KB)は、1024バイトという事になります。

メガバイト(=MB)は、キロバイト(=KB)の1024倍です。
問い詰めると、メガバイトは、1024バイト×1024倍=1048576バイトです。

以下、表記すると

1 Byte
1 KBytes(キロバイト) = 1024 Bytes
1 MBytes(メガバイト) = 1024 KBytes (=1024x1024=1048576 Bytes)
1 GBytes(ギガバイト) = 1024 MBytes (=1024x1024x1024=1073741824 Bytes)
1 TBytes(テラバイト) = 1024 GBytes (=1024x1024x1024x1024)
1 PBytes(ペタバイト) = 1024 TBytes (=1024x1024x1024x1024x1024)

です。

64KB(64キロバイト)というのは、65536バイトです。
16ビット数値で表現できる 数値の個数が、65536個です。
(符号無し 16ビット数値での最大値は 65535 です、注意! / 理由は、ゼロも一つの数値として表現するからです)
範囲は 0~65535 で、個数が 65536個。


「バイト」「ワード」「ダブルワード」等の概念について

1バイトの2倍、2バイト(2 Bytes)は、1ワード(1 words)と表現される事があります。
1ワードの2倍、4バイト(4 Bytes)は、1ダブルワード(1 doubble words)と表現される事があります。
1ダブルワードの2倍、8バイト(8 Bytes)は、1ロングワード(1 long words)と表現される事があります。


「符号」とは何ですか?

符号の概念は、算数や数学のソレと同じですが、CPUが判断するのは、
・数値の一番上のビット(最上位ビット)が0なら正の値
・数値の一番上のビット(最上位ビット)が1なら負の値
と、その数値を2進数に変換して見れば一目瞭然です。
数値が正なのか負なのか 解からなかったら、数値を2進数で考えると理解できるかと存じます。

(例 / テーマはPSPなので32ビットで考えます)
3(10進)  → 00000000000000000000000000000011(2進)
              → 最上位ビットがなので、正の値

-1(10進) → 11111111111111111111111111111111(2進)
              → 最上位ビットがなので、負の値

65534(10進) → 00000000000000001111111111111110(2進)
              → 最上位ビットがなので、正の値

0(10進) → 00000000000000000000000000000000(2進)
              → 最上位ビットがなので、正の値(但し、ゼロである)

? → 1001100101011100110110001011011(2進)
              → 最上位ビットがなので、負の値

"- (マイナス)" という記号を 数値に埋め込む事は、CPU や プログラム上では行ないません。
ソースコード上で、signed で定義されていれば数値がマイナスの数値になることがあります
ソースコード上で、unsigned で定義されていれば数値はマイナスの数値になることはありません


「変数」とは何ですか?

変数とは、数値を代入して演算する為の、英数文字で表記される、値が変動する入れ物、と覚えて下さい。
数学での「Z = X+(Yx4)-12」での、Z , X , Y が それぞれ 変数です。


符号付き1バイトは、-128 ~ 0 ~ 127 の範囲の値 となります。
C言語/C++言語では、符号付き1バイト変数「i」を定義する際は、

signed char  i; // i は符号付き1バイトの値を扱う変数

などと表記します。

逆に、符号無し1バイトは、0 ~ 255 の範囲の値 となります。
C言語/C++言語では、符号無し1バイト変数「i」を定義する際は、

unsigned char  i; // i は符号無し1バイトの値を扱う変数

などと表記します。
行中の // 以降は注釈ですので、プログラム上では無視して下さい。

符号付き2バイト(1ワード)は、-32768 ~ 0 ~ 32767 の範囲の値 となります。
C言語/C++言語では、符号付き1ワード変数「i」を定義する際は、

signed short  i; // i は符号付き2バイトの値を扱う変数

などと表記します。
符号無し1ワード変数「i」を定義する際は、

unsigned short  i; // i は符号無し2バイトの値を扱う変数

などと表記します。i = 0 ~ 65535 の範囲の値。

1ダブルワード変数の定義は、

signed long    i; // i は符号付き4バイトの値を扱う変数
unsigned long  j; // j は符号無し4バイトの値を扱う変数

( i = -2147483648 ~ 0 ~ 2147483647 の範囲の値 )
( j = 0 ~ 4294967295 の範囲の値 )

などと表記します。

また、1ダブルワードは4バイト数値を扱うので int でも定義可能でして・・・

signed int    i; // i は符号付き4バイトの値を扱う変数
unsigned int  j; // j は符号無し4バイトの値を扱う変数

( i = -2147483648 ~ 0 ~ 2147483647 の範囲の値 )
( j = 0 ~ 4294967295 の範囲の値 )

などと表記します。


1ロングワード変数の定義は、

__extension__ signed long long    i; // i は符号付き8バイトの値を扱う変数
__extension__ unsigned long long  j; // j は符号無し8バイトの値を扱う変数
(long long キャストは、先頭に __extension__ を記述しないとダメみたいです )

などと表記します。

変数が何バイトの型であるか宣言するのに使う、char や short や long は、キャストと呼ばれます。
int というキャスト は、C++コンパイラによって2バイト扱いだったり4バイト扱いだったりするので、short か long を使ったほうが無難です。
この講座で使う C++コンパイラ=PSPSDK は、intを32ビット扱いしますので、long と同じです。覚えておいて下さい。

尚、小数点付きの数値を扱うには、float や double というキャストがありますが、省略します。各自、学習しておいて下さい。

ここまで書いておいて何ですが、'signed' の場合は、記述を省略できます。
long だったら 符号付きの 32ビットキャスト(signed long)と考えて良いのです。
私は signed は省略して記述しませんので、各自、覚えておいて下さい。

以下、覚え書き程度に。
char は signed char と同じ
short は signed short と同じ
int は signed int と同じ
long は signed long と同じ


[edit]

CM: 2
TB: 0

page top

2010年01月15日 更新
「コンパイル」「アセンブル」「リンク」とは?

プログラムは、通常、プログラム開発言語 専用の付属プログラム編集システム上にて記述(作成)します。
プログラム開発言語により異なりますが、ワープロソフトみたいな感じで入力/編集が出来ます。
この専用の付属プログラム編集システムが無い場合もありますので、その際は、プログラムソースをテキストエディター(Windowsの場合は メモ帳、テラパッド、秀丸エディター等)や、コードエディター等で作成/編集/校正します。

「秀丸エディター」はプログラミングに特化していて、注釈の部分を緑色文字列部分を赤色、等と色分けして逐次表示してくれます。
他にも、" ~~~~~ "と記述してある部分の にカーソルを当てると、相方の を強調表示してくれます。見やすい!親切!
この秀丸エディターは、シェアウェア(使用期限付き有料ソフトウェア /¥4,200-)です。
お金に余裕があれば、是非 導入したい逸品です。


PSP用の実行ファイル EBOOT.PBP を作るには、
プログラミング部分だけを抜粋すると、

1. プログラムソースを作成/編集/校正
2. プログラムソースをコンパイル or アセンブル
3. リンク
4. 生成されるELFファイルを、PBPファイルに変換
5. PSP に転送して、実行してみる

となります。


C++言語プログラムソースを、中間ファイルに翻訳変換する事をコンパイルと言います。
コンパイルを行なうプログラムを、コンパイラーと呼びます。

アセンブリ言語プログラムソースを、中間ファイルに翻訳変換する事をアセンブルと言います。
アセンブルを行なうプログラムを、アセンブラーと呼びます。

コンパイルやアセンブルを行なうと、中間ファイル(オブジェクトファイル)という物が生成されます。

その中間ファイルを、実行可能なプログラムに翻訳変換する事を、リンクと言います。

リンクを行なうプログラムを、リンカーと呼びます。

最近では、コンパイル・アセンブル・リンクの全部の作業をまとめて「ビルド」する、という言い回しが使われるようになってきました。私も、「ビルド」するという言い回しを推奨しています。
コンパイラ - Wikipedia
アセンブリ言語 - Wikipedia
オブジェクトファイル - Wikipedia
リンケージエディタ - Wikipedia
ビルド (ソフトウェア) - Wikipedia

一般に、ゲームソフト制作会社は、莫大な資金をゲーム機開発元に支払って、ゲーム機用の開発キット一式購入しています。

PSPも、しかり。

海外の PS2DEV.ORG が独自に開発した システムソフトウェア 1.00用 EBOOT.PBP 開発キット(フリーウェア)が存在するので、このブログでは それを使用してプログラミングをします。
Cygwinpsp-toolchainPSPSDK で何とかやってみます。

 ※ システムソフトウェア 1.00用 EBOOT.PBP は、PBPmaker.exe や PSP Easy Installer.exe 等で変換すると、システムソフトウェア 1.50 のPSPでも動作します ※
 ※ また、システムソフトウェア 1.00用 EBOOT.PBP は、カスタムファームウェアが導入されたPSPで そのまま動作可能です ※

 ただし、暗号化されてない実行モジュールしか作れないので、今 販売中の正規PSPでは起動できませんので理解して下さい。

PSPプログラムがソースから実行形式になるまでの流れ

A 各種 C++言語プログラムソース(~.C / ~.CPP)を作成
                 ↓
       コンパイラーでコンパイルする
                 ↓
           中間ファイル(オブジェクトファイル(~.o))に翻訳される


B 各種 アセンブリ言語プログラムソース(~.S)を作成
                 ↓
       アセンブラーでアセンブルする
                 ↓
           中間ファイル(オブジェクトファイル(~.o))に翻訳される


C 中間ファイル(オブジェクトファイル)を全部まとめてリンクする
                 ↓
           マップファイル(~.MAP)が生成される
                 ↓
           ELFファイルが生成される(OUTP)
                 ↓
       ELFファイルをPBPファイルに変換する(EBOOT.PBP)


この方法で、PSPプログラミングをします。夜呂氏区!

[edit]

CM: 0
TB: 0

page top

PSPプログラミング PSPの性能を知ろう! 

2009/01/31
Sat. 23:05

前回までで、PSPプログラミングの方法を教えたつもりです。
さて、今回は、PSPの性能を調べる事に重点を置きます。

プログラムを開発するマシーンの事をお勉強するのです。

まず、下記サイトをご覧下さい。PSP-1000 の性能が 分かるかと存じます。

PSPの性能(スペック)
  http://bu-nyan.m.to/psp/psp01.htm

要約マニュアル(PDFファイル)
  http://www.scei.co.jp/corporate/release/pdf/030514a.pdf

PSP-1000 の取扱説明書(PDFファイル)
  http://www.playstation.com/manual/pdf/PSP-1000.pdf


抜粋すると、

MIPS系の R4000 という型番の32ビットCPU を2基 搭載
CPUの動作クロックは、1~333MHzで、範囲内なら 自由に速度変更 可能

PSP-1000 は、メインメモリは、32MBで、プラスで eDRAM が4MB
PSP-2000 は、メインメモリ64MBですが、拡張された32MB分は
UMD読み込みのキャッシュ(一時退避記憶)に使われていて、正式に
メインメモリが増えた、という感じでは無い。
一部のカスタムファームウェアでは メインメモリ容量54MB位 として扱えるらしいです


画面に表現できる色の鮮やかさは、16ビットカラー(65536色)もしくは
24ビットカラー(16777216色)
公式表記では「16ビットカラーもしくは32ビットカラー」となっている

画面の解像度は、横480ピクセル×縦272ピクセル(固定)で、
フレーム0とフレーム1の、2画面を実装している

つまり、フレーム0の画面を表示させておいて、その間にフレーム1の画面に
描画し、描画し終わるとフレーム1の画面を表示させ、その間にフレーム0
画面に描画する、………、と繰り返す事で、チラつきのない綺麗な映像が表現
可能!

※グラフィック画面の構成は、物理的には、512x272の寸法で2枚の画面です


認識できるメモリカードの容量は、最大32GBですが、本当か判りませんが160GBのUSBハードディスクを繋げられて認識できるらしい

SONY純正のリチウムイオンバッテリーでの駆動時間は、最大 約 5時間弱
フル充電には約2時間20分かかるらしい

次回は、PSPの実行ファイル EBOOT.PBP の構造について解説します。

[edit]

CM: 0
TB: 0

page top


h o m e |


 

2017-04