~白の携帯者~
.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を例に説明します。
(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_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) | 分周モード 0:1分周 1:16分周 2:256分周 3:1分周 |
(2) | 0:カウントダウン停止 1:カウントダウン実行 |
カウントダウン停止・実行に際して、現在値の初期化はないようです。
フラッシュへ書き込みをするシステム割り込みを見ると
のような命令が実行されます。上記のアドレスはフラッシュの何の変哲もない位置であり、これをそのまま書き込みだと解釈してしまうと、とんでもない事になります。おそらく、フラッシュ関係のレジスタに書き込むと、書き込みは不可になり、書き込みを解除するキー(おまじない)が上記の行為であると考えられます。
とりあえず、エミュレータを作ってみました。カーネルROMとフラッシュROMのイメージを実機から抽出し、それぞれ"KROM","FROM"と改名し、PK201.EXEと同じフォルダに置いてから実行して下さい。