カテゴリー「ゲーム(PSP)」の記事

2012年1月 5日 (木)

PSPで動くアプリの自作 【SwitchV】

前回に続きPSP。

ここらでやっと、自分でアプリを作ってみる。

前から欲しかった簡単なのがあるのだが、世間に存在しないようなので作ることに決めた。


【仕様】
  メモリースティックの、VIDEO フォルダを入れ替える。
  具体的には VIDEO というフォルダと VIDEOHIDE というフォルダを入れ替える。

  世間にすでにある、「VIDEOを隠す」に似ているがちょっと違う。
  隠すVIDEOと隠さないVIDEOの2つのフォルダがあり、それを入れ替えるというもの。

  あまり人に見られたくない動画などは普段は VIDEOHIDE に入れておき (=XMBからは見えない)、
  そこにある動画を見たいときにだけ VIDEOフォルダと入れ替える、という使い方。
  入れ替えると、今まで VIDEO に入っていたものが今度は VIDEOHIDE に行き、見えなくなる。

  やることはこれだけなので、画面表示一切なし。
  起動するとなにやらMSをアクセスして終了するだけ(のはず)。

  VIDEOフォルダをスイッチするので、名前は SwitchV とでも。


sampleから適当なのを選んでテンプレート代わりに利用する。
controller/basic を使ってみたがもっといいのがあったかも?

main() 関数の中でループ・終了待ちするように作られているがそのへんはざっくり削除。
関連してたくさん #include されているがいらなそうなものをコンパイルチェックしながら削除。
(めんどくさければ削除しなくても可)
Cのfileio関数、 rename とか stat を駆使して普通に記述。
こちらは逆に #includeを必要な都度追加。
コンパイルして動作を確認してみたところ、期待通りに動いた。
が、XMBに並べると、文字だけだと味気ないのでアイコンを作ることにする。

144x80 の PNG ファイル icon.png を作成して、
Makefileにて PSP_EBOOT_ICON = icon.png と指定することで
XMBに表示されるアプリのアイコンとなる。


というわけで、さらっとできてしまった。


署名済み。 430kB


ダウンロード、解凍した SwitchV フォルダを PSP の ms0:/PSP/GAME/ にコピーすれば使えるはず。


ちなみに CFW上でしか動かないが署名無しの小さいバージョンはこちら。
署名なし。 24kB


ふむふむ。

ちなみにエラーチェックはしているがエラー処理はしていない(手抜き)。


とりあえずやりたいことができてしまったので、これでおしまい かも?

| | コメント (0)

2012年1月 4日 (水)

PSPで動くアプリの自作?(署名)

前回に続いてPSP。

EBOOT.PDPの署名について。

EBOOT.PDPに対して「署名」をすることで、無改造のPSPでそのアプリを実行できる。


◆署名の方法

・公式PSPだけで署名できるツール
  「PSCRYPTER v2.0 w/ source for PSP」
  ms0:/PSP/GAME に、PSCRYPTER_v2.0_signed をフォルダごとコピー
  PSCRYPTER_v2.0_signed/sign フォルダに、署名したいEBOOT.PBP を入れておいて
  PSPにて PSCRYPTER を実行することで、sign に入れておいた EBOOT.PBP が署名される。

  …と(どこかで)説明されていたが、EBOOT.PBPはそのままに、EBOOT_signed.PBP が作られていた。
  他にもいくつかファイルができていたが、これは署名過程で PBP を分解(unpack)した名残。ゴミ。いらない。

  PBPのサイズが、100kB から 5MB へと大幅増加。うーん。。

  PSP上でできるのはおもしろいが、その後結局USBでつないでPC上でファイルを移動して‥などしないといけない。
  PCでやってしまったほうが早い気がする。


・PBPの pack/unpack を駆使して PCでやる

  SDKについている, pack-pbp, unpack-pbp で、PBPファイルの分解、再構成ができる。
  
  unpack-pbp EBOOT.PBP
  で PBP ファイルを分解。
    DATA.PSP
    PARAM.SFO
  という2つのファイルが抽出された。
  署名の対象となるのは DATA.PSP ファイル。
  これに「署名」をしたあと、packしなおせばよい。

  prxEncrypter をダウンロード、展開。
  作成された Release/prxEncrypter.exe に EBOOT.PBP をドラッグ&ドロップしてみる。
  → ?しーん・・・ なにか起きた?
    ( C:/Documents and Settings/[User]/ にdata.psp ができてました)
  ドラッグ&ドロップはあまりよろしくない。
  コマンドラインでやればその場に作られるようなので、ここはやはりバッチファイルで。

@echo off
dir DATA.PSP
echo Encrypting...
prxEncrypter DATA.PSP
dir DATA.PSP
pause

  DATA.PSPのある場所に prxEncrypter.exe と上記バッチをおいて、バッチ実行。
  DATA.PSP が書き換えられた。  、、サイズが5MBに…むー。まあいい。

  最後に再構築。
  pack-pbp EBOOT.PBP PARAM.SFO NULL NULL NULL NULL NULL DATA.PSP NULL
  ※ pack-pbp のコマンドライン引数は固定されている。コマンドラインで pack-pbp と打つとhelpがでる。

  できたっぽい。
  CFWでないPSPで動くか確認。 よしよし、動く。
  ただし、やっぱりサイズが 5MB とでかくなってしまった。

  ※ PACK/UNPACK は pbp_util というGUIを使うと楽。HSPで書かれてるっぽい。


・ サイズをもうちょい小さく

  http://volotax.blog59.fc2.com/blog-entry-24.html に、情報がありました。感謝。

  > Proxima's PRXEncrypterを使用すると署名後のPBPのサイズを500kb程に抑えることが出来ます。
  > some1氏のDowngrader v4.1に付属しています。
  >  DL : http://www.mediafire.com/?fop3fsojv3oesl0
  > このファイルを解凍したbinフォルダ内にあるprxencrypter.exeがそうです。

  というわけで、こっちの prxEncrypter.exe を使うことで、
  たしかにサイズが 500kB くらいになった。1/10 なので満足することにする。


◆コンパイル時に署名できないか?

  コンパイル時のログを見ていると、最後に pack-pdp を実行している。

  待て。
  ということはいちいち分解再構築しなくても、pack直前に署名を実行してしまえばよいのでは。

  Makefile の中を見ると、一番最後のほうで
  pspsdk/psp/sdk/lib/build.mak がincludeされている。
  この build.mak が Makefileの実体らしい。

  build.mak を見てみると、4箇所ほどで pack-pbp を実行している。
  サンプルで実行したところ、後ろの2つのどちらかになる模様。
  なので、この2ヶ所に署名実行を書いてしまおう。

  とりあえずは pspsdk/bin に prxEncrypter.exe をコピーしておく。

  build.mak を編集。以下の赤字部分を追加。

# PSP Software Development Kit - http://www.pspdev.org
# -----------------------------------------------------------------------
# Licensed under the BSD license, see LICENSE in PSPSDK root for details.
#
# build.mak - Base makefile for projects using PSPSDK.
#
# Copyright (c) 2005 Marcus R. Brown
# Copyright (c) 2005 James Forshaw
# Copyright (c) 2005 John Kelley
#
# $Id: build.mak 2333 2007-10-31 19:37:40Z tyranid $

# Note: The PSPSDK make variable must be defined before this file is included.
ifeq ($(PSPSDK),)
$(error $$(PSPSDK) is undefined. Use "PSPSDK := $$(shell psp-config --pspsdk-path)" in your Makefile)
endif

# OS tools
CP = $(shell psp-config --pspdev-path)/bin/cp
RM = $(shell psp-config --pspdev-path)/bin/rm
MKDIR = $(shell psp-config --pspdev-path)/bin/mkdir
TRUE = $(shell psp-config --pspdev-path)/bin/true

CC = psp-gcc
CXX = psp-g++
AS = psp-gcc
LD = psp-gcc
AR = psp-ar
RANLIB = psp-ranlib
STRIP = psp-strip
MKSFO = mksfo
PACK_PBP = pack-pbp
ENCRYPT = prxEncrypter
FIXUP = psp-fixup-imports

PSPDATA = DATA.PSP


  ( 中略 )


all: $(EXTRA_TARGETS) $(FINAL_TARGET)

kxploit: $(TARGET).elf $(PSP_EBOOT_SFO)
$(MKDIR) -p "$(TARGET)"
$(STRIP) $(TARGET).elf -o $(TARGET)/$(PSP_EBOOT)
$(MKDIR) -p "$(TARGET)%"
$(PACK_PBP) "$(TARGET)%/$(PSP_EBOOT)" $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) NULL $(PSP_EBOOT_PSAR)

SCEkxploit: $(TARGET).elf $(PSP_EBOOT_SFO)
$(MKDIR) -p "__SCE__$(TARGET)"
$(STRIP) $(TARGET).elf -o __SCE__$(TARGET)/$(PSP_EBOOT)
$(MKDIR) -p "%__SCE__$(TARGET)"
$(PACK_PBP) "%__SCE__$(TARGET)/$(PSP_EBOOT)" $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) NULL $(PSP_EBOOT_PSAR)

$(TARGET).elf: $(OBJS) $(EXPORT_OBJ)
$(LINK.c) $^ $(LIBS) -o $@
$(FIXUP) $@

$(TARGET_LIB): $(OBJS)
$(AR) cru $@ $(OBJS)
$(RANLIB) $@

$(PSP_EBOOT_SFO):
$(MKSFO) '$(PSP_EBOOT_TITLE)' $@

ifeq ($(BUILD_PRX),1)
$(PSP_EBOOT): $(TARGET).prx $(PSP_EBOOT_SFO)
#
ren $(TARGET).prx $(PSPDATA)
$(ENCRYPT) $(PSPDATA)
ren $(PSPDATA) $(TARGET).prx
#

$(PACK_PBP) $(PSP_EBOOT) $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) $(TARGET).prx $(PSP_EBOOT_PSAR)
else
$(PSP_EBOOT): $(TARGET).elf $(PSP_EBOOT_SFO)
$(STRIP) $(TARGET).elf -o $(TARGET)_strip.elf
#
ren $(TARGET)_strip.elf $(PSPDATA)
$(ENCRYPT) $(PSPDATA)
ren $(PSPDATA) $(TARGET)_strip.elf
#

$(PACK_PBP) $(PSP_EBOOT) $(PSP_EBOOT_SFO) $(PSP_EBOOT_ICON) \
$(PSP_EBOOT_ICON1) $(PSP_EBOOT_UNKPNG) $(PSP_EBOOT_PIC1) \
$(PSP_EBOOT_SND0) $(TARGET)_strip.elf $(PSP_EBOOT_PSAR)
-$(RM) -f $(TARGET)_strip.elf
endif

%.prx: %.elf
psp-prxgen $< $@

%.c: %.exp
psp-build-exports -b $< > $@

%.o: %.m
$(CC) $(CFLAGS) -c -o $@ $<

clean:
-$(RM) -f $(FINAL_TARGET) $(EXTRA_CLEAN) $(OBJS) $(PSP_EBOOT_SFO) $(PSP_EBOOT) $(EXTRA_TARGETS)

rebuild: clean all

  できたっと。

  これで、自作アプリ作成のための環境構築はよしとする。

  長くなったので今回ここまで。

| | コメント (1)

2012年1月 3日 (火)

PSPで動くアプリの自作?(準備・環境)

あけましておめでとうございます。

ものすごく久しぶりの更新です。

正月で少し時間があったので、ふと思い立ってPSPのアプリ自作について調べてみたのでメモメモ。


◆開発環境について

wii や DSでお馴染みの devkitPro でいいと思ったが
調べていて使っている人が多かった
Minimalist PSPSDK v0.8.10
にすることに。

・SDKのインストール

個人的に、C:/pspsdk (デフォルト)にインストールするのが嫌なので
D:/pspsdk にインストールする。それ以外はデフォルト。
※このSDKは2バイト文字に対応していないらしいので日本語を使うなら注意が必要。

・コンパイル

SDKに添付のサンプルをコンパイルしてみる。
pspsdk/psp/sdk/sample フォルダにたくさんあるので適当なのを選ぶ。
たとえば utility/osk
※ osk は on screen keyboard のはず
oskフォルダの中には main.c と Makefile の2つのファイルだけがあるシンプルな構造。

Makefileがあるので、 make すればいいだけのはずではあるが、ビルド環境にパスを通さないといけない。
また、make を打つにもコンソールを開かないといけないので、
バッチファイルを作ってしまおう。

!go.bat

@echo off
PATH=D:\pspsdk\bin\;D:\pspsdk\psp\bin\
rm -f *.o *.elf *.sfo *.prx *.psp *.pbp
make
rm -f *.o *.elf *.sfo *.psp
pause

大事なのは PATH= の行と make だけ。

この !go.bat ファイルを osk フォルダに入れ、実行する。

EBOOT.PDP ファイルができた。


CFW (Custom Firmware) 導入済みのPSPであれば、
ms0:/PSP/GAME にフォルダ osk を作成、その中にこの EBOOT.PDP を入れれば実行できる。


無改造PSPで実行するには、このEBOOT.PDPに対して「署名」をする必要がある。
署名については次回(予定)。


長くなりそうなのでとりあえずここまで~

| | コメント (0)