~白の携帯者~
.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社のオンラインドキュメント
調査中.
レジスタ名等は筆者が勝手に命名したものです.
| アドレス | 名称(仮) | ロード | ストア | 内容 |
|---|---|---|---|---|
| 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のミラー |
PocketStationのCPUはARM7Tであると言われています.動作周波数は最高約8MHzですが,システムクロックに連動し,約63Khzまで下げることが出来ます.
「ARMアーキテクチャレファレンスマニュアル」の図A3-1~図A3-6がARMプロセッサのデコード表なのですが,初見では見方が分からないと思うので図A3-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________________________ソフトウェア割り込み
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________________________ソフトウェア割り込み
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____アーキテクチャ上未定義
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____________________イミディエートをステータスレジスタに移動
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)
X-XX FEDCBA9876543210FEDCBA9876543210 1-01 ____000____________________0____データ処理イミディエートシフト ============##==#================================================(6) 1-02 ____00010__0_______________0____その他の命令(表4)
ここで注目すべきは,「その他の命令(表4)」のビットパタンは「データ処理イミディエートシフト」のビットパタンに論理的には完全に内包されている点です.つまり,データ処理イミディエートシフト命令において,稀なケース(組み合わせ)を無効とし,全く別の命令として定義しているわけです.ARMはそうやって拡張してきたようです.ある意味合理的ですが,MIPSの整然さとは対極にあります.
システムクロックの倍率変更と変更完了の確認を行います.
| 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_MODEレジスタをロードしたことになります.
| 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
| ? | (1) | ||||||||||||||
| フィールド | 内容 |
|---|---|
| (1) | 1:クロックを停止する |
もしかするとクロック自体は停止していないのかもしれませんが,少なくともCPUとタイマへの供給は停止されます(タイマの割り込みで停止状態を解除することは原理的に不可能).
| アドレス | 名称(仮) | ロード | ストア | 内容 |
|---|---|---|---|---|
| 0x0A000000 | I_PEND | ◎ | _ | 保留信号 |
| +4 | I_STAT | ◎ | _ | 生信号 |
| +8 | I_MASK | ◎ | ◎ | マスク |
| +12 | I_MCLR | _ | ◎ | マスククリア |
| +16 | I_PCLR | _ | ◎ | 保留クリア |
| ビット | デバイス | 割り込みの種類 |
|---|---|---|
| 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で代表します.
| アドレス | 名称(仮) | ロード | ストア | 内容 |
|---|---|---|---|---|
| 0x0A800000 | T0_MAX | _ | ◎ | タイマ0最大値 |
| +4 | T0_COUNT | ◎ | _ | タイマ0現在値 |
| +8 | T0_MODE | ◎ | ◎ | タイマ0モード |
タイマのカウンタの最大値を返します.
タイマのカウンタの最大値を設定します.現在値も最大値で初期化します.
タイマのカウンタの現在値を返します.
先述の様に,周波数はシステムクロックに連動しています.カウントアップではなくカウントダウンで,0の次は最大値に戻ります.周回すると無条件にINTCに信号を送るようです.
不明です.
| 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) |
分周モード
|
| (2) |
|
カウントダウン停止・実行に際して,現在値の初期化はないようです.
フラッシュへ書き込みをするシステム割り込みを見ると
*(ushort *)0x080055AA = 0xFFAA; *(ushort *)0x08002A54 = 0xFF55; *(ushort *)0x080055AA = 0xFFA0;
のような命令が実行されます.上記のアドレスはフラッシュの何の変哲もない位置であり,これをそのまま書き込みだと解釈してしまうと,とんでもない事になります.おそらく,フラッシュ関係のレジスタに書き込むと,書き込みは不可になり,書き込みを解除するキー(おまじない)が上記の行為であると考えられます.
とりあえず,エミュレータを作ってみました.カーネルROMとフラッシュROMのイメージを実機から抽出し,それぞれ"KROM","FROM"と改名し,PK201.EXEと同じフォルダに置いてから実行して下さい.