&size(20){''プロペラの深層に迫る文書''};
//邦題タイトル
&size(15){''原題:Early Propeller Chip Documentation rev.1''};
//洋題タイトル

状態:''この文書は現在翻訳中です''
//もしくは''この文書の翻訳作業は完了しています''

原文:http://forums.parallax.com/showthread.php?83682-Propeller-Guts-Download
//原文へのリンクなど

翻訳者: [[@ksksue>http://twitter.com/#!/ksksue]],[[@yishii>http://twitter.com/#!/yishii]]
//翻訳協力者のTwitterID,ハンドル名 例:@ksksue

対象読者:プロペラのブートシーケンス、アセンブラ仕様などの詳細を知りたい人
//誰向けの文書か簡単に。例:アセンブラ超初心者
#contents

*ハードウェアについて [#id7226e1]
**リセット詳細 [#t446d738]
 リセットが起こると、すべてのCOGはシャットダウンし、すべてのピンは強制的に浮いた状態になります。そのあと、ひとつのCOGがメインメモリのROMからスタートアッププログラムをロードしブートします。このプログラムはP31(RX)のシリアルホスト接続をチェックします。もしホストが存在する場合、P30(TX)を通じて通信を確立します。そしてホストは高レベルコードをメインメモリRAMへロードします。そしてホストは、そのコードが実行される前にまず直接EEPROMへ書き込みます。もしホストが存在しない場合、スタートアッププログラムは24LC256 EEPROMからP28(SCL)とP29(SDA)を経由して高レベルコードをリードし、実行しようと試みます。もし、シリアルホストもEEPROMも存在しない場合、プログラムはそのチップをシャットダウンモードに移行させます。次のリセットが起こるまで、電力は最小になり、すべてのピンは浮いた状態となります。

 高レベルコードとはプログラマの視点で言う初期化プログラムに当たるものです。それは他のcogを高レベルタスクやアセンブリ言語プログラムでブートすることができます。高レベルコードの実行について言えば、ある一つのCOGがメインメモリROMからインタプリタプログラムをロードし、そのインタプリタプログラムがメインメモリRAMに含まれる高レベルコードを実行します。

**COG詳細 [#f88274ba]
 各Cogは512 x 32-bit レジスタ領域を持っています。最後の特殊レジスタ16個を除いて、この512個のレジスタはすべてRAMです。
RAM領域は実行コード、データ、変数のために使われます。最後の16個のレジスタはHUB、IOピン、ローカルCOGペリフェラルのインタフェースとして使われます。

 一つのCOGがブートされたとき、そのCONGのRAM記憶領域はメインメモリからシーケンシャルにロードされます。そしてその特殊レジスタはゼロにクリアされます。
ロードされた後、そのCOGで$000から命令の実行がスタートします。リセットが起こるか、自身もしくは他のCOGによってストップかリブートがかかるまで、コードが実行され続けます。

 I/Oピンや消費電力といったすべての影響をキャンセルするため、
ひとつのCOGがストップされたときもしくはリセットが起こった時、すべてのCOGのI/Oレジスタは即座に0クリアされます。

 下の表はCOG内の特殊レジスタの概要です。
|Address|Name|Access|Description|
|Address|Name|Access|Description|h
|$000-$1EF|-|リード/ライト|汎用RAM|
|$1F0|PAR|リードオンリー*|ロングアドレスパラメータ|
|$1F1|CNT|リードオンリー*|システムカウンタ|
|$1F2|INA|リードオンリー*|P31〜P0の入力値|
|$1F3|INB|リードオンリー*|P63〜P32の入力値**|
|$1F4|OUTA|リード/ライト|P31〜P0の出力値|
|$1F5|OUTB|リード/ライト|P63〜P32の出力値**|
|$1F6|DIRA|リード/ライト|P31〜P0の方向制御|
|$1F7|DIRB|リード/ライト|P63〜P32の方向制御**|
|$1F8|CTRA|リード/ライト|カウンタA制御|
|$1F9|CTRB|リード/ライト|カウンタB制御|
|$1FA|FRQA|リード/ライト|カウンタA周波数|
|$1FB|FRQB|リード/ライト|カウンタB周波数|
|$1FC|PHSA|リード/ライト|カウンタAフェーズ|
|$1FD|PHSB|リード/ライト|カウンタBフェーズ|
|$1FE|VCFG|リード/ライト|ビデオコンフィグレーション|
|$1FF|CSCL|リード/ライト|ビデオスケール|
 *ソースレジスタとしてのみアクセス可能(例 MOV DEST, SOURCE)
 ** 現状未実装。予約領域。

 512COGは32bit命令を実行します。
 COGは512個のレジスタ領域にある32bit命令を実行します。命令はいくつかのビットフィールドに分けられています。
一般的なアセンブリ命令のフォーマットは以下のようになっています。

 {アドレスラベル}{実行コンディション}命令 ディスティネーション, {#}ソース, {実行エフェクト(コンマ区切り)}

例:
 entry rdlong temp,PAR wz 'wait for command (non-0)
 if_z jmp #entry

32bit命令の詳細
|オペコード|Zフラグ|Cフラグ|結果更新|ソース即値|実行コンディション|ディスティネーションレジスタ|ソースレジスタor即値|h
|31..26|25|24|23|22|21..18|17..9|8..0|
|iiiiii|z|c|r|i|cccc|ddddddddd|sssssssss|

|フィールド|範囲|説明|h
|オペコード|31..26|ADD, SUB, AND, OR, JMP など|
|実行エフェクト|25..23|1の場合それぞれCフラグ、Zフラグそしてディスティネーションレジスタを有効にする。&br;ビット25が1の場合、Zフラグ有効。&br;ビット24が1の場合、Cフラグ有効。&br;ビット23が1の場合はディスティネーションレジスタ有効。|
|ソース即値|22|1の場合bit8..0が32ビットの即値として扱われる。このときの32ビット即値は下位9bit以外は0で埋められる。|
|実行コンディション|21..18|CとZフラグの状態によって命令を実行。詳細は「実行コンディション」の項目を参照|
|ディスティネーションレジスタ|17..9|1番目のレジスタ。|
|ソースレジスタor即値|8..0|2番目のレジスタもしくは即値|

**ソースレジスタ or 即値 [#x974c339]
@yishii翻訳中

この9ビットのフィールドは、インストラクションのソースとして、レジスタ(512の内のどれか)の選択、もしくは0拡張された即値指定として使用する。
ビット22に対して0をセットすることでレジスタ選択、または1を指定することで即値となる。
アセンブリコードにおいては、 #シンボルは即値モードをセットする。


**ディスティネーションレジスタ [#dd3e46ef]
@yishii翻訳中

この9ビットのフィールドは、インストラクションのディスティネーションとして512の内のどのレジスタを使用するかを選択する為に使用する。


**実行コンディション [#m35efb4f]

**実行エフェクト [#d9a3a046]

*HUB命令 [#g74e2afb]

**メインメモリアクセス [#p86e85af]

**CLKレジスタ書き込み [#i11f8854]

**COG制御 [#s18a4188]

@ksksue翻訳中

 COGのスタートとストップを管理する3つのHUB命令があります。

 COGID   D `このCOG番号をDへ保存
 COGINT  D `Dに従ってCOGを初期化
 COGSTOP D `COG番号Dをストップ

 COGID命令でDへCOG番号を保存します。この命令は、そのCOGをストップまたはリスタートさせるために、COGのID(全8個)を知るときに使用します。

 COGINIT命令はCOGをスタートもしくはリスタートさせます。レジスタ D は
+どのCOGがスタートするか
+メインメモリのどこからプログラムが始まるか、
+PARレジスタに何が含まれているか

 この3つのフィールドを決定する情報を含んでいます。

 スタートするCOGのPARレジスタのビット[15..2]をD[31..18]へ書き込みます。

**LOCK使用方法 [#x6e0af98]

*分岐命令 [#a90af3cd]

*加算、減算、比較命令 [#f91658b7]

*乗算、除算、平方根命令 [#oae06a90]

*ウェイト命令 [#t5f8b709]

*メインメモリ [#db734528]

**ユーザメモリ($0000-$7FFF) [#hd3dfc0a]

**キャラクタ定義($8000-$BFFF) [#x0839f31]

**対数、逆対数テーブル($C000-$DFFF) [#e2335409]

**対数テーブル($C000-$CFFF) [#x107ae69]

**逆対数テーブル($D000-$DFFF) [#z9556c3c]

**サインテーブル($E000-$F001) [#ta5ffeba]

**ブートプログラムとインタプリタ($F002-$FFFF) [#l71eeb17]
 ROMの最後のパートにはブートプログラムとインタプリタが置かれています。これはアセンブラプログラムで、チップの重要な処理を実行します。

 ブートプログラムはリセットされたら自動的に実行され、チップをブートさせる処理を担っています。ブートプログラムはまずホストとシリアル通信するためしばらくP31とP30を監視します。もしホストが存在した場合、高レベルプログラムをRAMへ転送します。そのプログラムを実行するため外部EEPROMへ書き込みインタプリタを立ち上げます。もしシリアル通信のホストが存在しない場合、ブートプログラムはP29とP28へアクセスし、外部EEPOMからRAMへ高レベルプログラムをロードを試みます。成功したら、インタプリタが立ち上がりそのプログラムを実行します。もしEEPROMがない場合もしくは高レベルプログラムにデータの破損があった場合、ブートプログラムは電力消費を抑えるためチップをシャットダウンします。

 インタプリタは高レベルプログラムを実行します。そして、インタプリタは最初は同一COG内で実行されているブートプログラムによって呼び出されます。その高レベルプログラムを実行しているインタプリタによって、ほかのCOGのインタプリタが呼び出されます。そのようにして、他の高レベルプログラムを並列に実行させることができます。

*グローバルクロックレジスタ [#f1e4f778]


* 更新履歴[#f49dd2e2]
2011/12/18:「リセット詳細」追記(@ksksue), 「ブートプログラムとインタプリタ($F002-$FFFF) 」追記(@ksksue)
2011/12/17:ページ作成。「COG詳細」「COG制御」追記(@ksksue)


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS