DEEPER THAN POCKETS

~白の携帯者~

            .aaaaaaa$$$$$$$$$$$$$$$$$$$$$$$$$$$$$aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.           
           aaaaaaa$$$@$$$$$$$$$$$$$$$$$$$$$$$$$$aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*          
         +aaaaaaa$$$@$$$$$$$$$@$$$$$$$$$$$$$$$a$aaaaaaaa$$$aaaaaaaaaaaaaaaaaaaaaaa+        
        aaaaaaaa$$$@@$$@@$$@@@@$$$$$$$$$$$@@$$$$$$a$aaa$$$aaaaaaaaaa$aa$$aaaaaaaaaa+       
       aaaaaaa$$$$$@$@@@$@@@@@@$$$$$$$$$@@@@$$a$$$$$a$$$$aaaaaaaaa$$$$aa$$aaaaaaaaaa+      
      aaaaa$$$$@@@@@@@@@@@@@@@@$$$$$$@@@@@@$$$$$$$$$$$$$$$$$$$$$$$@@@@$$$$$$$aaaaaaaa+.    
     aaaaa$$$$@@@@@@@@@@@@@@@@@@@$$$@@@@@@@$@@@$$$$$$$$$$@$$$$$@@@@@@@$$$$$$$$$$aaaaaaa.   
    aaaa$$$$$@@@@@@@@@@@@@@@@@@@@$@@@@@@@@$@@@$$$$$$$@@@@$$$$@@@@a@@@@$$$$$$$$$$$$$$aaaa   
   +aaa$$$$$@@@@@@@@@@@@@@@@@@@@@$$@@@@@@@@@@$$$$$$@@@@@@$$$@@@a*+@@@$$$$$$$$$$$$$$$$aaaa  
   aa$$$$$@@@@@@@@@@@@@@@@@@@@@@@$@@@@@@@@$$$$$$$$@@@@$+$$@@@+ aaa@@@$$$$$$$$$$$$$$$$$$aa  
  +$a$$$$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$*+$$$$$@$@@* +a$@@a  +aa$@@@$$$$$$$$$$$$$$$$$$$a+ 
  aaa$$@@@@@@@@@@@@@@@@@@$@@a@@@@@@@@@a+*+a$$$$$$@++aa+@$@+   aa+@@@$$$$$$$$$$$$$$$$$$$$aa 
  @+$$$@@@@@@@@@@@@aa@@@$+@@+$@@@@$$$a+.a*$$$$$$a  +aaa$$a   +a*a@@@$@@$$$$$$$@$@$$$$$$$a$ 
 .a.$$$@@@@@@@@@@aaa@@$aa+@aaa@@@$$a++ +aa$$$$aaaa+   +$+aa$a+++$@@$$@$$$$$$$$@$@$$$$$$$a$ 
 ++a$$$$@@@@@@@$aaa$@aaaaa@aa*$$$$$+   **a$$$a   +$a$a$aa+++++aa$@$$@$$$$$@@$@@@@$$$$$$$$a+
 a a$+@$@@@@@@a+aa+@aaaaaa$aaaa@$$+    a+$aa   .+a$aaaa a+++++a@$$@$$$$$@a@a@@@@@$$$$$$a$a+
 a a@ @@@@@@@@@aaaaaaaaaaaaaaa+a$$     a.$a                a++$$$$$$$$$aa@$*@@@@$$$$$$$+ @+
 + aa.@$@@@@@@@@a+aaaaaaaaaaaaa.a$     a @                +++a$$$$$a$a+.a+.a@@@$$$$$$$$  @.
   ++ $$@@@@@@@@@@aaaaaaaaaaaaa  +     . +               *++$a$$a$a  +@$$$$@@$@$$$$$$aa  a 
   ++ @$@@@@@@@@@@@aaaaaaaaaaa+                         +++aaaaa  . +$$aa a$$$$$$$$$aa   a 
    + $$ @@@@@@@@@@aaaaaaaaaaa+                        *++aaa     +      a@$@$a$$$$$aa   + 
      $a @$@@@@@@@@aaaaaaaaaaaa                      .  a+        +     +@$$$$$.a$$aa      
      a+ $$@@@@@@@$aaaaaaaaaaaa                                   +    .$$$$$$a +aaa.      
      .. @$@@@@@$@aaaaaaaaaaaaa.                                  .   aa aaaa$  +aa+       
        a$@$@@@a+@aaaaaaaaaaaaa+                                   .     +$a$   aa+        
    .   @+$@@@@aa$aaaaaaaaaaaaaa                         a+a*+++++a+      $a$   $+         
 .     $  @@@@aaaaaaaaaaaaaaaaaa+                          +aa             @+  .+          
$@@@@@@@@@@@@@@@@@@@@@@@@@@@@$aaa.   .                           . +        +              
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a+         ++++           +                        
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@$@$+         .+     +                         
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$@   +aaa++      +                           
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+   .  +.     ..                            
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@             .                              
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@a@@@a+ $@@@@@@@.    .      .+                               
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$a$@@@.$@@@@@@@++  . .    +      +a                         
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@aaaa+  .   +       @$                         
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$+ +.$@@@@@@@+a   *a+ .+       $a$a                        

はじめに

本ページはPocketStationの情報を後世に残すことを目的としています。


参考文献

「ARMアーキテクチャレファレンスマニュアル」ARM社のオンラインドキュメント


ブロック図

調査中。


メモリマップ

レジスタ名等は筆者が勝手に命名したものです。

表. PocketStationのメモリマップ
アドレス 名称(仮) ロード ストア 内容
0x00000000~0x000007FF RAM メインメモリ
0x00000800~0x01FFFFFF _ _ おそらくメインメモリのミラー
0x02000000~0x0201FFFF FROM フラッシュROM(FTLB有効)
0x02020000~0x03FFFFFF _ _ おそらくフラッシュROM(FTLB有効)のミラー
0x04000000~0x04003FFF KROM _ カーネルROM
0x04004000~0x05FFFFFF _ _ カーネルROMのミラー
0x06000000~__________ F_CTRL フラッシュROMの制御
0x06000004~__________ F_STAT _
0x06000008~__________ F_TAG FTLBのエントリの有効/無効
0x0600000C~__________ F_WAIT クロックの変更と関係するのでおそらくフラッシュROMのウェイト
0x06000010~__________ F_BANK フラッシュのバンク切り替え。これにより個体識別情報の部分も書き換え可能。
0x06000014~0x060000FF _ _
0x06000100~0x0600013F F_DATA FTLBのエントリ
0x06000140~0x060002FF _ _
0x06000300~0x0600031F F_INFO シリアル番号を含めた個体識別情報
0x06000320~0x07FFFFFF _ _
0x08000000~0x0801FFFF FROM フラッシュROM(FTLB無効)
0x08020000~0x09FFFFFF _ _ おそらくフラッシュROM(FTLB無効)のミラー
0x0A000000~__________ I_PEND _ 割り込み保留
0x0A000004~__________ I_STAT _ 割り込みステータス
0x0A000008~__________ I_MASK 割り込みマスク
0x0A00000C~__________ I_MCLR _ 割り込みマスククリア
0x0A000010~__________ I_PCLR _ 割り込み保留クリア
0x0A000014~0x0A7FFFFF _ _
0x0A800000~__________ T0_MAX _ タイマ0最大値
0x0A800004~__________ T0_COUNT _ タイマ0現在値
0x0A800008~__________ T0_MODE タイマ0モード
0x0A80000C~__________ _ _
0x0A800010~__________ T1_MAX _ タイマ1最大値
0x0A800014~__________ T1_COUNT _ タイマ1現在値
0x0A800018~__________ T1_MODE タイマ1モード
0x0A80001C~__________ _ _
0x0A800020~__________ T2_MAX _ タイマ2最大値
0x0A800024~__________ T2_COUNT _ タイマ2現在値
0x0A800028~__________ T2_MODE タイマ2モード
0x0A80002C~__________ _ _
0x0A800030~0x0AFFFFFF _ _
0x0B000000~__________ CLK_MODE クロックモード
0x0B000004~__________ CLK_CTRL クロック制御(スリープ)。ロードはCLK_MODEのミラー。
0x0B000008~0x0B7FFFFF _ _
0x0B800000~__________ RTC_MODE RTCモード
0x0B800004~__________ RTC_CTRL RTC制御。ロードはRTC_TIMEのミラー。
0x0B800008~__________ RTC_TIME _ RTC時間
0x0B80000C~__________ RTC_DATE _ RTC日付
0x0B000010~0x0BFFFFFF _ _
0x0C000000~__________ COM_CTRL _ COM制御
0x0C000004~__________ COM_STAT _ COMステータス
0x0C000008~__________ COM_DATA COMデータ
0x0C00000C~__________ _ _
0x0C000010~__________ COM_MODE _ COMモード
0x0C000014~__________ COM_READY _ _ COMリードレディ。ステータスでも読めるが、ここはリードレディ部分のみ。
0x0C000018~__________ COM_BAUD _ COMボーレート?
0x0C00001C~__________ _ _
0x0C000020~0x0C7FFFFF _ _
0x0C800000~__________ IR_MODE 赤外線の送・受信モード
0x0C800004~__________ IR_CTRL _ 赤外線の送信(点滅・消灯)
0x0C800008~0x0CFFFFFF _ _
0x0D000000~__________ LCD_CTRL LCD制御
0x0D000004~__________ LCD_LEVEL _ LCDの輝度
0x0D000008~0x0D0000FF _ _
0x0D000100~0x0D00017F VRAM ビデオRAM
0x0D000180~0x0D7FFFFF _ _
0x0D800000~__________ IOP_CTRL IOP制御
0x0D800004~__________ IOP_OFF IOP停止
0x0D800008~__________ IOP_ON _ IOP開始
0x0D80000C~__________ IOP_STAT _ IOPステータス
0x0D800010~__________ DAC_CTRL DAC制御
0x0D800014~__________ DAC_DATA DACデータ。ロードはDAC_CTRLのミラー。
0x0D800018~__________ _ _
0x0D80001C~__________ _ _
0x0D800020~__________ BAT_CTRL バッテリモニタ制御
0x0D800018~0x0D80001F _ _
0x0D800020~0x0FFFFFFF _ _
0x10000000~0xFFFFFFFF _ _ おそらく0x00000000~0x0FFFFFFFのミラー

CPU

PocketStationのCPUはARM7Tであると言われています。動作周波数は最高約8MHzですが、システムクロックに連動し、約63Khzまで下げることが出来ます。

デコード表の見方

「ARMアーキテクチャレファレンスマニュアル」の図A3-1~図A3-6がARMプロセッサのデコード表なのですが、初見では見方が分からないと思うので図A3-1を例に説明します。

(1)まず固定ビットのみ抽出すると以下になります。

X-XX.FEDCBA9876543210FEDCBA9876543210
1-01.____000____________________0____.データ処理イミディエートシフト
1-02.____00010__0_______________0____.その他の命令(表4)
1-03.____000_________________0__1____.データ処理レジスタシフト
1-04.____00010__0____________0__1____.その他の命令(表4)
1-05.____000_________________1__1____.乗算(表3)・拡張ロード/ストア(表5)
1-06.____001_________________________.イミディエートデータ処理
1-07.____00110_00____________________.未定義命令
1-08.____00110_10____________________.イミディエートをステータスレジスタに移動
1-09.____010_________________________.イミディエートオフセットでのロード/ストア
1-10.____011____________________0____.レジスタオフセットでのロード/ストア
1-11.____011____________________1____.メディア命令(表2)
1-12.____01111111____________1111____.アーキテクチャ上未定義
1-13.____100_________________________.複数ロード/ストア
1-14.____101_________________________.分岐およびリンク付き分岐
1-15.____110_________________________.コプロセッサロードストアおよび2つのレジスタの転送
1-16.____1110___________________0____.コプロセッサデータ処理
1-17.____1110___________________1____.コプロセッサレジスタ転送
1-18.____1111________________________.ソフトウェア割り込み

(2)共通する固定ビットで、上下に2分割できるものを見つけます。bit23で[1-01~1-12]と[1-13~1-18]に分割できるのが分かります。

X-XX.FEDCBA9876543210FEDCBA9876543210
1-01.____000____________________0____.データ処理イミディエートシフト
1-02.____00010__0_______________0____.その他の命令(表4)
1-03.____000_________________0__1____.データ処理レジスタシフト
1-04.____00010__0____________0__1____.その他の命令(表4)
1-05.____000_________________1__1____.乗算(表3)・拡張ロード/ストア(表5)
1-06.____001_________________________.イミディエートデータ処理
1-07.____00110_00____________________.未定義命令
1-08.____00110_10____________________.イミディエートをステータスレジスタに移動
1-09.____010_________________________.イミディエートオフセットでのロード/ストア
1-10.____011____________________0____.レジスタオフセットでのロード/ストア
1-11.____011____________________1____.メディア命令(表2)
1-12.____01111111____________1111____.アーキテクチャ上未定義
=========#=======================================================(2)
1-13.____100_________________________.複数ロード/ストア
1-14.____101_________________________.分岐およびリンク付き分岐
1-15.____110_________________________.コプロセッサロードストアおよび2つのレジスタの転送
1-16.____1110___________________0____.コプロセッサデータ処理
1-17.____1110___________________1____.コプロセッサレジスタ転送
1-18.____1111________________________.ソフトウェア割り込み

(3)上部をさらに上下に2分割します。下部も同様です。

X-XX.FEDCBA9876543210FEDCBA9876543210
1-01.____000____________________0____.データ処理イミディエートシフト
1-02.____00010__0_______________0____.その他の命令(表4)
1-03.____000_________________0__1____.データ処理レジスタシフト
1-04.____00010__0____________0__1____.その他の命令(表4)
1-05.____000_________________1__1____.乗算(表3)・拡張ロード/ストア(表5)
1-06.____001_________________________.イミディエートデータ処理
1-07.____00110_00____________________.未定義命令
1-08.____00110_10____________________.イミディエートをステータスレジスタに移動
==========#======================================================(3)
1-09.____010_________________________.イミディエートオフセットでのロード/ストア
1-10.____011____________________0____.レジスタオフセットでのロード/ストア
1-11.____011____________________1____.メディア命令(表2)
1-12.____01111111____________1111____.アーキテクチャ上未定義

(4)上部をさらに上下に2分割します。下部も同様です。

X-XX.FEDCBA9876543210FEDCBA9876543210
1-01.____000____________________0____.データ処理イミディエートシフト
1-02.____00010__0_______________0____.その他の命令(表4)
1-03.____000_________________0__1____.データ処理レジスタシフト
1-04.____00010__0____________0__1____.その他の命令(表4)
1-05.____000_________________1__1____.乗算(表3)・拡張ロード/ストア(表5)
===========#=====================================================(4)
1-06.____001_________________________.イミディエートデータ処理
1-07.____00110_00____________________.未定義命令
1-08.____00110_10____________________.イミディエートをステータスレジスタに移動

(5)上部をさらに上下に2分割します。下部も同様です。

X-XX.FEDCBA9876543210FEDCBA9876543210
1-01.____000____________________0____.データ処理イミディエートシフト
1-02.____00010__0_______________0____.その他の命令(表4)
================================#================================(5)
1-03.____000_________________0__1____.データ処理レジスタシフト
1-04.____00010__0____________0__1____.その他の命令(表4)
1-05.____000_________________1__1____.乗算(表3)・拡張ロード/ストア(表5)

(6)上部は0x01900000との論理積が0x01000000であるかどうかで、一意にコードが決まります。

X-XX.FEDCBA9876543210FEDCBA9876543210
1-01.____000____________________0____.データ処理イミディエートシフト
============##==#================================================(6)
1-02.____00010__0_______________0____.その他の命令(表4)

ここで注目すべきは、「その他の命令(表4)」のビットパタンは「データ処理イミディエートシフト」のビットパタンに論理的には完全に内包されている点です。つまり、データ処理イミディエートシフト命令において、稀なケース(組み合わせ)を無効とし、全く別の命令として定義しているわけです。ARMはそうやって拡張してきたようです。ある意味合理的ですが、MIPSの整然さとは対極にあります。


CLKC(クロックコントローラ)

CLK_MODEレジスタ

システムクロックの倍率変更と変更完了の確認を行います。

ロードした場合

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
(2) (1)

フィールド 内容
(1) ストアした値
(2) 1:安定状態になった

ストアした場合

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
(1)

フィールド 内容
(1) クロック倍率

クロック倍率とCPU周波数・タイマ周波数の関係は以下になります。CPUとタイマには二倍の関係があり、おそらくタイマはシステムクロックをそのまま使用し、CPUは内部で二倍して使用しているのでしょう。

表. クロック倍率と各デバイスの周波数
クロック倍率 CPU周波数 タイマ周波数
1 0x00F800Hz 0x007C00Hz
2 0x01F000Hz 0x00F800Hz
3 0x03E000Hz 0x01F000Hz
4 0x07C000Hz 0x03E000Hz
5 0x0F8000Hz 0x07C000Hz
6 0x1E8000Hz 0x0F4000Hz
7 0x3D0000Hz 0x1E8000Hz
8 0x7A0000Hz 0x3D0000Hz

倍率5と6の間でベース値が変わっています。PK201では面倒なのでベースを0x7A00で統一しています。倍率0xFも可能ですが、おそらく倍率8と同じです。

CLK_CTRLレジスタ

ロードした場合

CLK_MODEレジスタをロードしたことになります。

ストアした場合

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
(1)

フィールド 内容
(1) 1:クロックを停止する

もしかするとクロック自体は停止していないのかもしれませんが、少なくともCPUとタイマへの供給は停止されます(タイマの割り込みで停止状態を解除することは原理的に不可能)。


INTC

レジスタマップ

表. INTCのレジスタマップ
アドレス 名称(仮) ロード ストア 内容
0x0A000000 I_PEND _ 保留信号
+4 I_STAT _ 生信号
+8 I_MASK マスク
+12 I_MCLR _ マスククリア
+16 I_PCLR _ 保留クリア

表. INTCレジスタのビットとデバイスの関係
ビット デバイス 割り込みの種類
00 決定ボタン irq
01 右ボタン irq
02 左ボタン irq
03 下ボタン irq
04 上ボタン irq
05 不明 irq
06 COM FIQ
07 タイマ0 irq
08 タイマ1 irq
09 RTC irq
10 バッテリモニタ irq
11 IOP irq
12 IR irq
13 タイマ2 FIQ

動作法則


タイマ

レジスタマップ

タイマ0で代表します。

表. タイマ0のレジスタマップ
アドレス 名称(仮) ロード ストア 内容
0x0A800000 T0_MAX _ タイマ0最大値
+4 T0_COUNT _ タイマ0現在値
+8 T0_MODE タイマ0モード

Tn_MAXレジスタ

ロードした場合

タイマのカウンタの最大値を返します。

ストアした場合

タイマのカウンタの最大値を設定します。現在値も最大値で初期化します。

Tn_COUNTレジスタ

ロードした場合

タイマのカウンタの現在値を返します。

先述の様に、周波数はシステムクロックに連動しています。カウントアップではなくカウントダウンで、0の次は最大値に戻ります。周回すると無条件にINTCに信号を送るようです。

ストアした場合

不明です。

Tn_MODEレジスタ

ロードした場合

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
(2) (1)

フィールド 内容
(1) ストアした値
(2) ストアした値

ストアした場合

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
(2) (1)

フィールド 内容
(1) 分周モード
0:1分周
1:16分周
2:256分周
3:1分周
(2) 0:カウントダウン停止
1:カウントダウン実行

カウントダウン停止・実行に際して、現在値の初期化はないようです。


フラッシュROM

フラッシュへ書き込みをするシステム割り込みを見ると

*(ushort *)0x080055AA = 0xFFAA;
*(ushort *)0x08002A54 = 0xFF55;
*(ushort *)0x080055AA = 0xFFA0;

のような命令が実行されます。上記のアドレスはフラッシュの何の変哲もない位置であり、これをそのまま書き込みだと解釈してしまうと、とんでもない事になります。おそらく、フラッシュ関係のレジスタに書き込むと、書き込みは不可になり、書き込みを解除するキー(おまじない)が上記の行為であると考えられます。


PK201

とりあえず、エミュレータを作ってみました。カーネルROMとフラッシュROMのイメージを実機から抽出し、それぞれ"KROM","FROM"と改名し、PK201.EXEと同じフォルダに置いてから実行して下さい。

def

def

カーネルROMの吸出し


inserted by FC2 system