プロペラの深層に迫る文書
原題:Early Propeller Chip Documentation rev.1

状態:この文書は現在翻訳中です

原文:http://forums.parallax.com/showthread.php?83682-Propeller-Guts-Download

翻訳者: @ksksue,@yishii

対象読者:プロペラのブートシーケンス、アセンブラ仕様などの詳細を知りたい人

ハードウェアについて

リセット詳細

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

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

COG詳細

 各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内の特殊レジスタの概要です。

AddressNameAccessDescription
$000-$1EF-リード/ライト汎用RAM
$1F0PARリードオンリー*ロングアドレスパラメータ
$1F1CNTリードオンリー*システムカウンタ
$1F2INAリードオンリー*P31〜P0の入力値
$1F3INBリードオンリー*P63〜P32の入力値**
$1F4OUTAリード/ライトP31〜P0の出力値
$1F5OUTBリード/ライトP63〜P32の出力値**
$1F6DIRAリード/ライトP31〜P0の方向制御
$1F7DIRBリード/ライトP63〜P32の方向制御**
$1F8CTRAリード/ライトカウンタA制御
$1F9CTRBリード/ライトカウンタB制御
$1FAFRQAリード/ライトカウンタA周波数
$1FBFRQBリード/ライトカウンタB周波数
$1FCPHSAリード/ライトカウンタAフェーズ
$1FDPHSBリード/ライトカウンタBフェーズ
$1FEVCFGリード/ライトビデオコンフィグレーション
$1FFCSCLリード/ライトビデオスケール
*ソースレジスタとしてのみアクセス可能(例 MOV DEST, SOURCE)
** 現状未実装。予約領域。

 512COGは32bit命令を実行します。

ソースレジスタ or 即値

@yishii翻訳中

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

ディスティネーションレジスタ

@yishii翻訳中

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

実行コンディション

実行エフェクト

HUB命令

メインメモリアクセス

CLKレジスタ書き込み

COG制御

@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 は

  1. どのCOGがスタートするか
  2. メインメモリのどこからプログラムが始まるか、
  3. PARレジスタに何が含まれているか

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

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

LOCK使用方法

分岐命令

加算、減算、比較命令

乗算、除算、平方根命令

ウェイト命令

メインメモリ

ユーザメモリ($0000-$7FFF)

キャラクタ定義($8000-$BFFF)

対数、逆対数テーブル($C000-$DFFF)

対数テーブル($C000-$CFFF)

逆対数テーブル($D000-$DFFF)

サインテーブル($E000-$F001)

ブートプログラムとインタプリタ($F002-$FFFF)

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

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

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

グローバルクロックレジスタ

更新履歴

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


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