〜白の携帯者〜
.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_WAIT1 | _ | ◎ | クロックの変更と関係するのでおそらくフラッシュROMのウェイト |
| 0x06000010〜__________ | F_WAIT2 | _ | ◎ | クロックの変更と関係するのでおそらくフラッシュROMのウェイト |
| 0x06000014〜0x060000FF | ? | _ | _ | ? |
| 0x06000100〜0x0600013F | F_DATA | _ | ◎ | FTLBのエントリ |
| 0x06000140〜0x060002FF | ? | _ | _ | ? |
| 0x06000300〜__________ | F_SN | _ | _ | シリアル番号 |
| 0x06000304〜0x07FFFFFF | ? | _ | _ | ? |
| 0x08000000〜0x0801FFFF | FROM | ◎ | ◎ | フラッシュROM(FTLB無効) |
| 0x08020000〜0x09FFFFFF | ? | _ | _ | おそらくフラッシュROM(FTLB無効)のミラー |
| 0x0A000000〜__________ | I_HOLD | ◎ | _ | 割り込み保持 |
| 0x0A000004〜__________ | I_STAT | ◎ | _ | 割り込みステータス |
| 0x0A000008〜__________ | I_MASK | ◎ | ◎ | 割り込みマスク |
| 0x0A00000C〜__________ | I_MCLR | _ | ◎ | 割り込みマスククリア |
| 0x0A000010〜__________ | I_HCLR | _ | ◎ | 割り込み保持クリア |
| 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 | _ | ◎ | クロック制御 |
| 0x0B000008〜0x0B7FFFFF | ? | _ | _ | ? |
| 0x0B800000〜__________ | RTC_MODE | _ | ◎ | RTCモード |
| 0x0B800004〜__________ | RTC_CTRL | _ | ◎ | RTC制御 |
| 0x0B800008〜__________ | RTC_TIME | ◎ | _ | RTC時間 |
| 0x0B80000C〜__________ | RTC_DATE | ◎ | _ | RTC日付 |
| 0x0B000010〜0x0BFFFFFF | ? | _ | _ | ? |
| 0x0C000000〜__________ | COMA_MODE | _ | ◎ | COMAモード |
| 0x0C000004〜__________ | COMA_REG1 | _ | _ | COMAレジスタ1 |
| 0x0C000008〜__________ | COMA_DATA | _ | ◎ | COMAデータ |
| 0x0C00000C〜__________ | ? | _ | _ | ? |
| 0x0C000010〜__________ | COMB_MODE | _ | ◎ | COMBモード |
| 0x0C000014〜__________ | COMB_REG1 | _ | _ | COMBレジスタ1 |
| 0x0C000018〜__________ | COMB_DATA | _ | ◎ | COMBデータ |
| 0x0C00001C〜__________ | ? | _ | _ | ? |
| 0x0C000020〜0x0C7FFFFF | ? | _ | _ | ? |
| 0x0C800000〜__________ | IRDA_MODE | ◎ | ◎ | ? |
| 0x0C800004〜__________ | IRDA_CTRL | _ | ◎ | ? |
| 0x0C800008〜0x0CFFFFFF | ? | _ | _ | ? |
| 0x0D000000〜__________ | LCD_CTRL | ◎ | ◎ | ビデオ制御 |
| 0x0D000004〜__________ | LCD_DATA | _ | ◎ | ビデオデータ |
| 0x0D000008〜0x0D0000FF | ? | _ | _ | ? |
| 0x0D000100〜0x0D00017F | VRAM | ◎ | ◎ | ビデオRAM |
| 0x0D000180〜0x0D7FFFFF | ? | _ | _ | ? |
| 0x0D800000〜__________ | IOP_CTRL | ◎ | ◎ | IOP制御 |
| 0x0D800004〜__________ | IOP_STOP | ◎ | ◎ | IOP停止 |
| 0x0D800008〜__________ | IOP_START | _ | ◎ | IOP開始 |
| 0x0D80000C〜__________ | IOP_DATA | ◎ | _ | IOPデータ |
| 0x0D800010〜__________ | DAC_CTRL | ◎ | ◎ | DAC制御 |
| 0x0D800014〜__________ | DAC_DATA | _ | ◎ | DACデータ |
| 0x0D800018〜__________ | ? | _ | _ | ? |
| 0x0D80001C〜__________ | ? | _ | _ | ? |
| 0x0D800020〜__________ | BATT_CTRL | ◎ | ◎ | バッテリモニタ制御 |
| 0x0D800018〜0x0D80001F | ? | _ | _ | ? |
| 0x0D800020〜0x0FFFFFFF | ? | _ | _ | ? |
| 0x10000000〜0xFFFFFFFF | ? | _ | _ | おそらく0x00000000〜0x0FFFFFFFのミラー |
PocketStationのCPUはARM7Tであると言われています。動作周波数は最高約8MHzですが、システムクロックに連動し、約63Khzまで下げることが出来ます。
「ARMアーキテクチャレファレンスマニュアル」の図A3-1〜図A3-6がARMプロセッサのデコード表なのですが、初見では見方が分からないと思うので図A3-1を例に説明します。
(1)まず固定ビットのみ抽出すると以下になります。
(2)共通する固定ビットで、上下に2分割できるものを見つけます。bit23で[1-01〜1-12]と[1-13〜1-18]に分割できるのが分かります。
(3)上部をさらに上下に2分割します。下部も同様です。
(4)上部をさらに上下に2分割します。下部も同様です。
(5)上部をさらに上下に2分割します。下部も同様です。
(6)上部は0x01900000との論理積が0x01000000であるかどうかで、一意にコードが決まります。
ここで注目すべきは、「その他の命令(表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_HOLD | ◎ | _ | 保持信号 |
| +4 | I_STAT | ◎ | _ | 生信号 |
| +8 | I_MASK | ◎ | ◎ | マスク |
| +12 | I_MCLR | _ | ◎ | マスククリア |
| +16 | I_HCLR | _ | ◎ | 保持クリア |
| ビット | デバイス | 割り込みの種類 |
|---|---|---|
| 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 | IrDA | 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) | 分周モード 0:1分周 1:16分周 2:256分周 3:1分周 |
| (2) | 0:カウントダウン停止 1:カウントダウン実行 |
カウントダウン停止・実行に際して、現在値の初期化はないようです。
フラッシュへ書き込みをするシステム割り込みを見ると
のような命令が実行されます。上記のアドレスはフラッシュの何の変哲もない位置であり、これをそのまま書き込みだと解釈してしまうと、とんでもない事になります。おそらく、フラッシュ関係のレジスタに書き込むと、書き込みは不可になり、書き込みを解除するキー(おまじない)が上記の行為であると考えられます。
とりあえず、エミュレータを作ってみました。カーネルROMとフラッシュROMのイメージを実機から抽出し、それぞれ"KROM","FROM"と改名し、PK201.EXEと同じフォルダに置いてから実行して下さい。