linpsm
PlayStation(TM) Memory Card Utility for Linux

Created: 1 Jan, 2001
Updated: 4 Jan, 2002
Card Captor <card_captor@geocities.co.jp>

1, はじめに

1.1, linpsmパッケージとは?

linpsmは、PlayStation用のメモリカードを AT互換機版Linux(2.2.x)上でアクセスするためのパッケージです。

実際にメモリカードにアクセスするためには、 秋月電子通商で発売されている 「PlayStationメモリカードリーダ」の接続キットが必要です(\2,800)。 このキットはハンダごての使える人なら簡単に製作できますし、 同等の回路が えるむさんのところで公開されていますので、 根性のある方は自作することもできます (根性のない人用に「トライステート」から完成品が販売されているようです)。

なお、PlayStation2用のメモリカード・ポケットステーション・ バンク切替え方式のメモリカードは使用できません。 今のところ私のところでは、SonyのSCPH-1020(基板にはSPC02K1020Bのシルク)、 KARATのKARAT15(基板にはPS1R14のシルク)で動作しています。 SMPマシンでの動作は不明です。

http://www.akizuki.ne.jp/ 秋月電子通商
http://elm-chan.org/reports/psmif/report.html えるむ - Electronic Lives Mfg.

このパッケージは、カーネルモジュール、 起動スクリプト、メモリカード操作プログラムからなります。 起動スクリプトが実行されるとカーネルモジュールがOSにロードされ、 デバイスファイル/dev/linpsmが作成されます。 プログラムはこのデバイスファイルをread/writeすることによって メモリカードにアクセスすることができます。

ddコマンドを使ってメモリカードのダンプ処理を行うこともできますし、 同梱のulpsmというプログラムを使ってデータブロック単位での コピーや削除などの操作を行うことができます。

1.2, このパッケージを使う前に

このパッケージを使う前にぜひ知っておいていただきたいことがあります。

ある業者が「ときめきメモリアル」の改造データをいれて メモリカードを販売した行為が、 著作権侵害であるとの判決が下されています。 いまさら判決の妥当性についてどうこう言っても仕方ない面もありますが、 私的利用の範囲を超えた改造データの配布は明確に違法になってしまいました。

作者としては、(判決の妥当性はどうであれ、)法規を逸脱するような行為に このソフトを使用することを禁止させていただきます。
なお、私的利用のためと、バックアップ作成のために 複製を作ることは著作権法で認められていると考えております (ただし、本当に大丈夫かは裁判所が決めるということはお忘れなく)。 以下に、著作権法の関連条項を示します:

(私的使用のための複製)
第三十条 著作権の目的となつている著作物(以下この款において単に「著 作物」という。)は、個人的に又は家庭内その他これに準ずる限られた範囲内 において使用すること(以下「私的使用」という。)を目的とする場合には、 公衆の使用に供することを目的として設置されている自動複製機器(複製の機 能を有し、これに関する装置の全部又は主要な部分が自動化されている機器を いう。)を用いて複製するときを除き、その使用する者が複製することがで きる。

(プログラムの著作物の複製物の所有者による複製等)
第四十七条の二プログラムの著作物の複製物の所有者は、自ら当該著作物を電 子計算機において利用するために必要と認められる限度において、当該著作物 の複製又は翻案(これにより創作した二次的著作物の複製を含む。)をするこ とができる。ただし、当該利用に係る複製物の使用につき、第百十三条第二項 の規定が適用される場合は、この限りでない。

第百十三条 2 プログラムの著作物の著作権を侵害する行為によつて作成され た複製物(中略)を業務上電子計算機において使用する行為は、これらの複製 物を使用する権原を取得した時に情を知つていた場合に限り、当該著作権を侵 害する行為とみなす。

1.3, このパッケージの使用条件

このパッケージおよびパッケージをコンパイルしたものは、 使用される地域の法規を侵さない範囲で どなたでも自由に使用・改変・再配布することができます。 ただし、再配布に際しては、再配布を受ける人がソースコードを 得る手段を保証しなければなりません。

このパッケージを使用して発生する事態に対して、 作者は一切の責任を負いません。

Copyright © 2001 Card Captor

オリジナルの配布は、 http://geocities.datacellar.net/card_captor/で行っています。

1.4, このパッケージの使用方法

このパッケージは、ソース配布されている場合と、 バイナリ配布されている場合があります。 ソース配布のパッケージをコンパイルするところから始める場合は、 次の2章から読んでください。 バイナリ配布の場合は、4章から読んでください。

今のところバイナリ配布はDebianパッケージのみです。 カーネルのバージョンとの整合性をチェックしないようにコンパイルしてあるため、 多分どのカーネルでもOKなはずです。

2, 準備(ソース配布の場合)

2.1, コンパイル

  1. ソースを展開。
  2. configure実行。書式は以下の通りです。
    ./configure [--prefix=PREFIX] [--kernel-dir=KENERLDIR]
    	[--linpsm-module=MODULE] [--linpsm-file=DEVICE] [--lpt-port=PORT]
    	[--linpsm-perm=PERM] [--linpsm-owner=OWNER] [--linpsm-group=GROUP]
    
    ここでPREFIXは、インストール先を指定します。デフォルトは/usr/localです。 KERNELDIRは、使っているカーネルのソースが入ったディレクトリを指定します。 もし、カーネルのソースがない場合は/usrを指定してください。 デフォルトは/usr/src/linuxです。 MODULEはlinpsmモジュールの名前を指定します。デフォルトはlinpsmです。 DEVICEはlinpsmデバイスのファイル名を指定します。デフォルトは/dev/linpsmです。 PORTはプリンタポートのI/Oアドレスのデフォルト値を指定します。 デフォルトは0x378です。 PERM, OWNER, GROUPはlinpsmデバイス作成時の モード、所有者、所有グループを指定します。 デフォルトはそれぞれ666, root, rootです。
    たぶん、PREFIX, KERNELDIRくらいしか指定する必要はないはずです。
  3. makeします。
  4. rootになってmake installします。

2.2, initスクリプトの登録・設定

linpsmを使うためには、カーネルモジュールをOSに登録し、 /devディレクトリにデバイスファイルを作成する必要があります。 linpsmにはこの作業を行う「initスクリプト」が付属しており、 make installすると/etc以下にインストールされます。

initスクリプトの実行は、起動時に自動的に行わせることもできますし、 linpsmを使う前に手動で行うこともできます。 面倒ならば、起動時に自動的に実行するようにしておけば良いでしょう。 少しでもメモリを節約したいとか、不審なモジュール(f^^)はなるべく 使わないでいたいという場合は、手動で実行するよう設定を行ってください。

カーネルモジュールは以下のようなオプションを受け付けます:

# insmod /full/path/to/linpsm.o [io=0xNNN] [verbose=N]
プリンタポートのポート番号を変更したい場合は、 io=0xNNNをinitスクリプトのINSMOD_ARGの行に追加してください。 メッセージの冗長度を変更したい場合は、verbose=Nを追加してください (N=0の時は何も出力しません。 N=1の時は簡単な動作メッセージを表示します(デフォルト)。 2の時は、動作を逐一表示します。 3以上の時は、メモリカードとの通信のログを表示します)。

2.2.1, 起動時にinitスクリプトを自動的に実行するよう設定する

以下の作業をrootとして行うと、 システムの起動時に自動的にinitスクリプトが実行されます。

2.2.2, initスクリプトを手動で実行する

rootになって下記のように実行してください。
# /etc/init.d/linpsm start

カーネルモジュールをOSからアンロードしたい場合は、 以下を実行してください。

# /etc/init.d/linpsm stop

3, 実行

3.1, ユーザプログラムの実行

linspmのinitスクリプトが実行されると、 /dev/linpsmというデバイスファイルが作成されます。 このデバイスファイルに対して読み書きを行うと メモリカードに対してアクセスが行われます。

このファイルに対してddコマンドなどを使うことができますが、 読み書きのサイズは128bytes単位でなければなりません。 中途半端なサイズでのアクセスを要求するとエラーENXIOが帰ります。 このデバイスファイルをmmap(2)することはできません。

例: メモリカードのバックアップ

# dd bs=128 if=/dev/linpsm of=backup.ps

このままではメモリカードまるごとでしか扱えないので、 メモリカード上のデータをブロック単位で 操作可能なプログラムulpsmが用意してあります (といっても、全ダンプ機能以外はめったに使いませんが ^^;)。

3.2, カーネルモジュールの動作

通信用の250kHzのクロックをソフトウェアで作り出す都合があるため、 メモリカードにアクセスする際はCPU負荷が異常に高くなります。 カーネルモードでビジーウェイトしてるのでこうなってしまうのですが、 仕様ですので焦らないように… 数十μsecくらいでタイムアウトすることってできないですかね〜

なお、こちらではHDDやXがガリガリ動いている最中に メモリカードを読み書きしても特にデータが化けたりということは (今のところ)ありません。 もともとメモリカードとの通信にはXORチェックサムが含まれていますので、 仮にデータを取りこぼしてもたぶん検出できるはずです。

4, ulpsmの実行

ulpsmはセーブされたデータブロックを操作するプログラムです。 ulpsmはメモリカードのイメージがセーブされたファイル、 またはデバイスファイル/dev/linpsmそのものに対して動作します。 イメージファイルはいわゆるpsフォーマットで、 読み出したデータがベタに記録されているものです。

4.1, データブロックのリストを表示

形式
  ulpsm [-f SRCDEV] dir
  ulpsm [-f SRCDEV] ls
SRCDEVで指定されるメモリカードファイルに含まれる データブロックに関する情報をカンマ区切りで表示します。 SRCDEVを指定しなかった場合、/dev/linpsmが使用されます。 表示内容は です。PlayStation本体に装備されているブラウザと異なり、 複数ブロックからなるセーブデータは、そのブロックごとに表示されます (3ブロック使うセーブデータは、3つ表示されるということ)。 途中のブロックについては、タイトル等は表示されません。

表示内容のうち、使用状態は以下のアルファベットであらわされる状態のうちのどれかになります。

r
予約状態。よくわかってません。
f
未使用。
d
一度使われて、その後削除されたブロック。
s
データブロック先頭。
c
データブロック。複数のブロックからなる場合だけ出現します。
e
最終データブロック。複数のブロックからなる場合だけ出現します。
E
エラー状態。ディレクトリフレームのチェックサムが 異常な場合など、この状態になります。
表示例
01,s,51,,2000,SLPS-01751-0,1,1,エリーのアトリエ・セーブデータ1
02,s,51,,2000,SLPS-01751-1,1,1,エリーのアトリエ・セーブデータ2
03,s,51,,2000,SLPS-01751-2,1,1,エリーのアトリエ・セーブデータ3
04,s,51,,2000,SLPS-01751S,1,1,エリーのアトリエ・おまけ用データ
05,s,51,,2000,SLPS-02886,3,1,☆カードキャプターさくら エターナルハート
06,s,51,,2000,SLPS-00970MYANGEL,3,1,子育てクイズ「マイエンジェル」
07,s,51,,2000,SLPSP01830CCSAKURA,3,1, カードキャプターさくら 第11話 さくらとゾウの力比べ    
08,s,51,9,6000,SLPS-03154SISPRI,1,3,シスタープリンセス・ゲームデータ
09,c,52,10,2000,,0,0,
10,e,53,,2000,,0,0,
11,f,a0,,0000,,0,0,
12,f,a0,,0000,,0,0,
13,f,a0,,0000,,0,0,
14,f,a0,,0000,,0,0,
15,E,ee,,,,,dir_csum_mismatch
なお、データのタイトルはSJISで符合化されており、 そのまま表示するとたぶん文字化けします。 nkfなどを適宜使用してください。

4.2, メモリカードイメージの一括コピー

形式
  ulpsm [-f SRCDEV] copyall DSTDEV
  ulpsm [-f SRCDEV] dump DSTDEV
DSTDEVで示されるファイルにカードの中身をそのままコピーします。

4.3, アイコンデータの取り出し

形式
  ulpsm [-f SRCDEV] geticon BLOCK
BLOCKから始まるデータブロックのアイコンを取り出し、 XPMフォーマットで書き出します。 ファイル名はブロック番号をN、アイコン番号をMとすると 「psmN-M.xpm」に決めうちですので、 既存のファイルの上書きや、/tmp等のだれでも書き込めるディレクトリ上での 実行には十分気を付けてください。

4.4, ブロックのコピー

形式
  ulpsm [-f SRCDEV] copy BLOCK DSTDEV
  ulpsm [-f SRCDEV] cp BLOCK DSTDEV
BLOCKから始まるデータブロックを、 DSTDEVで示されるメモリカードファイルにコピーします。 BLOCKがデータの先頭ブロックでない場合はエラーになります。

4.5, ブロックの削除

形式
  ulpsm [-f DSTDEV] delete BLOCK
  ulpsm [-f DSTDEV] rm BLOCK
BLOCKから始まるデータブロックを削除します。 BLOCKがデータの先頭ブロックでない場合はエラーになります。

4.6, メモリカードファイルの初期化

形式
  ulpsm format DSTDEV
  ulpsm newfs DSTDEV
DSTDEVで示されるメモリカードファイルを初期化します。 もちろん、データブロックはすべて使えなくなります。

5, トラブルシューティング

作者が遭遇した開発中のトラブルを列挙してみます。
読めるけど書けない
純正品(Sony製)と互換品(KARAT製)で書き込みタイミングの 許容度が違うようです。ちなみに互換品のほうがレンジが広くて優秀… 現バージョンではWINPSMにあわせたタイミングを採用してますので、 純正品でも問題はないはずです。
最初のフレーム(128bytesの単位)しか読めない
純正品では、フレーム間にいくらかウェイトを入れないとダメなようです。 KARAT製のカードでは不要だったのですが… こちらも修正済みです
「hdr sig illegal, frame=xxx」と表示される。 verbose=3を指定してみると、0しか読めてない。
IRQが足りなかったので、BIOSでプリンタポートを殺していたら こうなってしまいました。 なお、BIOSがらみというと標準/ECP/EPPのモード選択がありますが、 多分どれでもよいはずです。

あと、ハードウェアの故障の場合もこれになるかもしれません。 ロジアナかオシロを持ってる人なら、CLK・COM・DATあたりを見てみてください。

以前は動作していたのに、WINPSMで動作確認してみたらエラーが発生する。
Windowsのデバイスマネージャで「LPTポート」のデバイスを使用禁止にすると、 WINPSMからもプリンタポートにアクセスできなくなります。 直接I/Oポート叩くと思っていたし、IRQが足りなかったので、 つい使用頻度の低いプリンタポートを使用禁止にしてしまったのですが、 許してもらえないようです。って、linpsmとは直接関係ないんですが ^^;

6, 謝辞

プログラム作成にあたり、 Nifty-ID:HFB03536 藤田さんによる 「プレイステーション・PAD/メモリ・インターフェースの解析」 を全面的に参考にさせていただきました。 また、PlayStation2本体を分解する勇気がなかったので、 WINPSMの動作をロジアナで解析させてもらいました。

http://www.vector.co.jp/soft/data/game/se020797.html藤田さんのVectorのページ
http://member.nifty.ne.jp/TAKAYAMA/program_j.htm WINPSM

お二人の作者に感謝いたします。


1