メモリーカードのセーブデータアイコンについて解説します。
PlayStation のセーブデータのアイコンのスペックは以下の通りです。
以下のメモリーカード上のアドレスはセーブデータ1の場合です。 16進数を 0x , 2進数を 0b で表します。
PlayStation のメモリーカード管理画面に表示されるアイコンはアドレス0x2060 ~ 0x21FFに描かれています。
アドレス0x2060 ~ 0x207Fがカラーパレットです。
アドレス0x2080 ~ 0x20FFがアイコン0です。
アドレス0x2100 ~ 0x217Fがアイコン1です。
アドレス0x2180 ~ 0x21FFがアイコン2です。
アイコン0, アイコン1, アイコン2を時間で切り替えることによりアニメーションします。
NOëL のセーブデータのアイコンのアニメーションは2種類あります。
アニメーションはセーブするときにランダムで決定されます。
アイコンのアニメーションは2種類ありますが、カラーパレット (CLUT: Color Lock Up Table) は共通です。
カラーパレットは以下の 32 Byte (アドレス 0x2060 ~ 0x207F)です。
00 00 42 08 08 21 8C 31 10 42 94 52 18 63 9C 73 FF 7F 35 02 C9 00 0F 09 D0 29 AC 14 11 2D B6 3D
2 Byte で1色を表します。
カラーパレットは出現順に0から採番されていて0~F(16色)となります。
CLUT | 16進数 | RGB555 | RGB888 | 色 |
---|---|---|---|---|
0 | 00 00 | ( 0, 0, 0) | ( 0, 0, 0) | ■ |
1 | 42 08 | ( 2, 2, 2) | ( 16, 16, 16) | ■ |
2 | 08 21 | ( 8, 8, 8) | ( 66, 66, 66) | ■ |
3 | 8C 31 | (12, 12, 12) | ( 99, 99, 99) | ■ |
4 | 10 42 | (16, 16, 16) | (132, 132, 132) | ■ |
5 | 94 52 | (20, 20, 20) | (165, 165, 165) | ■ |
6 | 18 63 | (24, 24, 24) | (198, 198, 198) | ■ |
7 | 9C 73 | (28, 28, 28) | (231, 231, 231) | ■ |
8 | FF 7F | (31, 31, 31) | (255, 255, 255) | ■ |
9 | 35 02 | (21, 17, 0) | (173, 140, 0) | ■ |
A | C9 00 | ( 9, 6, 0) | ( 74, 49, 0) | ■ |
B | 0F 09 | (15, 8, 2) | (123, 66, 16) | ■ |
C | D0 29 | (16, 14, 10) | (132, 115, 82) | ■ |
D | AC 14 | (12, 5, 5) | ( 99, 41, 41) | ■ |
E | 11 2D | (17, 8, 11) | (140, 66, 90) | ■ |
F | B6 3D | (22, 11, 15) | (181, 107, 123) | ■ |
ここでは、 CLUT9 を例に計算方法を示します。
アドレス 0x2072 が 0x35, アドレス 0x2073 が 0x02 ですが、 PlayStation のバイトオーダーがリトルエンディアンなので、ヒューマンリーダブルな形式にするために上の桁と下の桁を入れ替えて 0x 02 35 になります。
これを2進数にすると 0b 00000010 00110101 です。
パレットの色は ABGR1555 形式なので、1bit 5bit 5bit 5bit に区切り直して 0b 0 00000 10001 10101 になります。
これを10進数にすると 0 0 17 21 になります。すべてのパレットのアルファチャネルは0なので無視して BGR (0, 17, 21) になります。
BGR よりも RGB の方が一般的なので、 R と B を入れ替えて RGB (21, 17, 0) となります。
この色成分は 5bit なので値域が 0~31 になります。ここでは一般的な RGB888 にするために 255/31 をかけて小数点第一位を四捨五入して RGB (173, 140, 0) になります。
ここでは 2種類あるアニメーションのうち、口を開けるパターンを解説します。
アドレス 0x2080 ~ 0x20FF がアイコン0です。アイコン0の左上の画素0行0列目から右へ16画素、その後1行目0列目から右へ16画素、、、と15行目15列まで続きます。
アイコン0 の 0行目のアドレス 0x2080 ~ 0x2087 を抜き出すと以下のようになります。
30 36 00 00 00 00 63 03
1バイトで2画素のカラーパレットの番号を表します。
ここでは、最初の1バイト (30) を例に指定方法を示します。
カラーパレットは16色なので 4bit (0.5バイト)で指定されます。
30 の上の桁と下の桁がそれぞれ0.5バイト相当になります。
PlayStation はリトルエンディアンなので、上の桁と下の桁を入れ替えた 0 3 が、左から0番目と1番目の画素のカラーパレットの番号になります。
これを8バイト繰り返すことによりアイコン0の0行目の16画素のカラーパレットの番号になります。
アドレス 0x2088 ~ 0x208F が1行目、0x2090 ~ 0x2097 が2行目、 ... 、 0x20F8 ~ 0x20FF が15行目と繰り返してアイコン0が完成します。
同様に、アドレス2100 ~ 217Fがアイコン1です。
同様に、アドレス2180 ~ 21FFがアイコン2です。
アイコンのアニメーションは2種類あります。どちらのアニメーションでもアイコン0 は同一の絵柄です。
アニメ0 | アニメ1 |
---|---|
3つのアイコンを時間で切り替えることによりアニメーションを実現しています。
メモリーカード上にはアニメーションの切り替え速度は指定されていません。負荷次第で早くなったり遅くなったりします。