ST6とST7

ST6アーキテクチャに基づくST62E40マイクロコントローラ

ST6およびST7はSTマイクロエレクトロニクスの8ビットマイクロコントローラ製品ラインです。洗濯機などの小型組み込みアプリケーションでよく使用されます。

これらは同様の周辺機器を使用し、同じ製品ラインの一部として販売されていますが、[ 1 ] [ 2 ] 2つのアーキテクチャは実際にはかなり異なります。

どちらも、ほとんどの演算に使用される8ビットのアキュムレータと、メモリアドレス指定に使用される2つの8ビットインデックスレジスタ(XとY)を備えています。また、どちらも8ビット命令とそれに続く最大2バイトのオペランドを備え、メモリの個々のビットに対する操作と分岐をサポートしています。

類似点はそこで終わります。

ST6はハーバード・アーキテクチャを採用しており、8ビット(256バイト)のデータアドレス空間と、それとは別に12ビット(4096バイト)のプログラム空間を備えています。オペランドは常に1バイト長ですが、「8ビット即値を8ビットメモリアドレスに転送する」などの一部の命令は2つのオペランドをサポートします。サブルーチン呼び出しは独立したハードウェアスタックを使用して行われます。データレジスタ(プログラムカウンタとフラグは除く)はメモリマップされています。

ST6 のアドレス指定モードは、即値、8 ビット絶対メモリ アドレス、およびレジスタ間接モード (X) と (Y) に制限されています。

ST7は、16ビット(64 kiB)の単一アドレス空間を持つフォン・ノイマン・アーキテクチャです。RAMの最初の256バイト(ゼロページ)は、高い柔軟性を備えています。「テストビットと分岐」命令を除き、2オペランド命令は存在しません。レジスタはメモリマップされておらず、サブルーチン呼び出しには汎用RAM(およびスタックポインタレジスタ)を使用します。

ST7 は、ベース + インデックスや二重間接など、さまざまなアドレス指定モードをサポートしています。

ST6マイクロコントローラファミリーの3つのメンバー:ST62E01、ST62E20、ST62E25

ST6アーキテクチャ

ST6には64バイトのRAMと4096バイトのプログラムROMが搭載されています。ROMの下位2KBセクションを バンク切り替えすることで、より大きな容量のメモリにアクセスできます。

RAM アドレス空間は実際には 256 バイトであり、次のように分割されます。

  • 0~63: 実装されていません
  • 64~127: プログラムROMとデータEPROMへのバンク切り替え可能なウィンドウ。
  • 128~191: 汎用RAM
  • 192~255: 周辺制御レジスタ (GPIO ポート、タイマーなど)アキュムレータはアドレス 255 にマップされていますが、暗黙的にアドレス指定されるのが一般的です。

アドレス空間には、12ビットのプログラムカウンタとそれに関連するハードウェアスタック(モデルによって4レベルまたは6レベルの深さ)はマッピングされていません。ステータスビットは2つ(キャリーゼロ)のみで、プロセッサモードに基づいてバンク化されており、通常動作、割り込み動作、マスク不可能割り込み動作ごとに個別のステータスビットが割り当てられています。

汎用RAMの最初の4つの位置は、X、Y、V、Wレジスタとも呼ばれ、一部の命令は特殊なショートアドレッシングモードを使用してこれらのレジスタにアクセスできます。XレジスタとYレジスタはインデックスレジスタとして機能し、間接アドレッシングモード(X)とを使用できます(Y)

命令セットは、1バイトのオペコードと、それに続く最大2つの1バイトのオペランドで構成されます。命令セットは次のように要約できます。

ST6ファミリー命令セット[ 3 ]
76543210b2b3ニモニックCZ説明
オフセットOPCC0条件分岐(5ビットPC相対)
オフセット000JRNZ住所Z == 0 の場合、PC + simm5 にジャンプします。
オフセット100JRZアドレスZ == 1 の場合、PC + simm5 にジャンプします。
オフセット010JRNCアドレスC == 0 の場合、PC + simm5 にジャンプします。
オフセット110JRCアドレスC == 1 の場合、PC + simm5 にジャンプします。
imm4c001imm8無条件分岐(12ビット絶対)
imm40001imm8imm12に電話するPCを押して12ビットアドレスにジャンプ
imm41001imm8JP imm1212ビットアドレスへのジャンプ
00101(予約済み)
登録c1c101レジスタ操作(X、Y、V、W)
登録010101INC登録Zレジスタを増分します。Z は設定されていますが、C は設定されていません。
登録110101LD A、登録ZA := {X、Y、V、またはW}
登録01110112月登録Zレジスタをデクリメントします。Z は設定されていますが、C は設定されていません。
登録111101LD reg、AZ{X、Y、V、またはW} := A
オペコード01101その他の業務
00001101住所imm8LDI アドレス、imm8RAMを8ビットの即値に設定する
10001101(予約済み)
01001101レティ割り込みから戻ります。PC をポップし、フラグを復元します。
11001101RETサブルーチンから戻ります。ハードウェア スタックから PC をポップします。
00101101COM AZC補数: C := msbit(A); A := ~A
10101101RLC ACA := A + A + C
01101101停止次の割り込みまでプロセッサ、クロック、ほとんどの周辺機器を停止します
11101101待って次の割り込みまでプロセッサを停止します。クロックは継続します。
少しOPCC011住所?ビット操作(絶対アドレスのみ)
少し00011ソースシム8JRR ビットソースアドレスCC := src.bit; リセット(クリア)の場合はPC+simm8にジャンプ
少し10011ソースシム8JRSビットソースアドレスCC := src.bit; 設定されている場合、PC+simm8にジャンプします
少し01011夏時間RESビットdstdst.bitをリセット(0に設定)
少し11011夏時間SETビットdstdst.bit を 1 に設定
オペコードデータ111?RAMまたは即値を使用したALU演算
オペコード00111(X)オペランドは(X)
オペコード01111(Y)オペランドは(Y)
オペコード10111imm8imm8オペランドは8ビット即値(ソースのみ
オペコード11111住所住所オペランドは8ビットのRAMアドレス
000ソース111?LD A、ソースZA :=ソース
100夏時間111?LD dst、AZdst  := A (即時禁止)
010ソース111?ADD A、ソースZCA := A + src
110ソース111?SUB A、ソースZCA := A − src
001ソース111?CP A、ソースZCA − src
101ソース111?AND A、ソースZA := A & src
011夏時間111?INC dstZdst  := dst + 1 (即時禁止)
111夏時間111?12月の夏時間Zdst  := dst − 1 (即時禁止)

†: ^ a b紛らわしいことに、ST6ファミリーの異なるモデルでは、減算後のキャリービットの値について異なる規則が使用されています。ST60プロセッサは「キャリー」規則を使用しており、減算がアンダーフローした場合にビットをクリアしますが、ST62およびST63プロセッサは「ボロー」規則を使用しており、その場合はビットをセットします。[ 3 ] : 21–22,42

ST7アーキテクチャ

ST7には、アキュムレータ、XおよびYインデックスレジスタ、スタックポインタ、プログラムカウンタ、そしてコンディションコードレジスタの6つのレジスタがあります。また、二重間接アドレッシングにより、RAMのゼロページを追加レジスタとして使用できます。珍しいながらも便利な機能として、割り込みによってこれらのレジスタのうち4つ(AとX、そして通常のPCとCC)がスタックにプッシュされ、割り込みからの復帰によってそれらが復元されます。

ALU 命令は、2 オペランドと 1 オペランドの 2 つのカテゴリに分類されます。

2オペランド命令では、アキュムレータを最初のソースとして使用します。アドレッシングモードによって、2番目のソースが指定されます。これは以下のようになります。

  • 8ビット即値
  • 8ビット絶対アドレス
  • 16ビット絶対アドレス
  • インデックス(X)
  • インデックス+8ビットオフセット(アドレス8、X)
  • インデックス+16ビットオフセット(アドレス16、X)

通常、デスティネーションはアキュムレータですが、いくつかの命令では 2 番目のソースが変更されます。(このような場合、即値オペランドは禁止されます。)

1オペランド命令では、指定されたオペランドをソースとデスティネーションの両方に使用します。オペランドは次のいずれかです。

  • アキュムレータA
  • Xレジスタ
  • 8ビット絶対アドレス
  • インデックス(X)
  • インデックス+8ビットオフセット(アドレス8、X)

レジスタとオフセットを加算すると全角の合計が計算されるため、8 ビット形式では最大 255+255 = 510 のメモリをアドレス指定できます。

上記に加えて、意味のある命令の先頭に追加できる 3 つのプレフィックスバイトがあります。

  • PDY (0x90) は、Xレジスタへのすべての参照をYレジスタに変更します。これにより、(Y)、(アドレス8,Y)、(アドレス16,Y) のアドレッシングモードが有効になります。これは暗黙のオペランドにも影響するため、「load X」命令は「load Y」命令になります。その結果、load X命令はX相対アドレッシングモードのみ、load Y命令はY相対アドレッシングモードのみが有効になります。
  • PIX (0x92) は命令に間接参照ステップを追加します。オペコードバイトに続く8ビットまたは16ビットのアドレスは、8ビットまたは16ビットのアドレス(後者はビッグエンディアン順)を保持するメモリ位置の8ビットアドレスに置き換えられます。このアドレスは通常通りXレジスタでインデックス付けできます。これにより、(address8)、(address16)、([address8],X)、([address8.w],X) のアドレッシングモードが可能になります。
  • PIY (0x91) は上記の効果を組み合わせます。これにより、([address8],Y) および ([address8.w],Y) アドレッシングモードが可能になります。(「ロード Y」および「ストア Y」命令の一部として、他のモードと組み合わせて使用​​することもできます。)
ST7ファミリー命令セット[ 4 ]
76543210b2b3ニモニック説明
000c少しv住所?ビット操作
0000少し0アドレス8ソフ8BTJT addr8、#ビットラベルソースビットが真(セット)の場合、PC + soff8 にジャンプします。
0000少し1アドレス8ソフ8BTJF addr8、#ビットラベルソースビットが偽(クリア)の場合、PC + soff8 にジャンプします。
0001少し0アドレス8BSET addr8、#ビット指定されたビットを1に設定する
0001少し1アドレス8BRESアドレス8、#ビット指定されたビットを0にリセット(クリア)する
0010状態ソフ8条件分岐(8ビット相対オフセット)
00100000ソフ8JRAラベル常に分岐する(true)
00100001ソフ8JRFラベルブランチはなし(偽)
00100010ソフ8JRUGTラベル符号なしがより大きい場合分岐 (C=0 かつ Z=0)
00100011ソフ8JRULEラベル符号なし小さか等しい場合分岐(C=1 または Z=1)
00100100ソフ8JRNCラベルキャリーがない場合(C=0)分岐
00100101ソフ8JRCラベルキャリーの場合分岐(C=1)
00100110ソフ8JRNEラベル等しくない場合に分岐 (Z=0)
00100111ソフ8JREQラベル等しい場合分岐(Z​​=1)
00101000ソフ8JRNHラベルハーフキャリーでない場合は分岐(H=0)
00101001ソフ8JRHレーベルハーフキャリー(H=1)の場合に分岐
00101010ソフ8JRPLラベルプラスの場合に分岐 (N=0)
00101011ソフ8JRMIラベルマイナスの場合に分岐(N=1)
00101100ソフ8JRNMラベル割り込みマスク(M=0)でない場合は分岐
00101101ソフ8JRMラベル割り込みがマスクされている場合に分岐する(M=1)
00101110ソフ8JRILレーベル割り込みラインが低い場合分岐する
00101111ソフ8JRIHラベル割り込みラインがハイの場合に分岐する
0モードオペコード?1オペランド命令
0011オペコードアドレス8OPアドレス88ビット絶対アドレス
0100オペコードOP Aアキュムレータ
0101オペコードOP XXレジスタ(プレフィックス付きYレジスタ)
0110オペコードアドレス8OP (アドレス8,X)8ビットアドレス+X
0111オペコードOP (X)オフセットなしでインデックス付け
0モード0000?NEGオペランド2の補数の否定
0モード0001?(予約済み)
0モード0010?(予約済み)
01000010MUL X、AX:A := X × A. (接頭辞付きのMUL Y,A)
0モード0011?CPLオペランド一の補数、論理否定
0モード0100?SRLオペランド論理的に右にシフトします。MSBIT はクリアされ、LSBIT は繰り上がります。
0モード0101?(予約済み)
0モード0110?RRCオペランドキャリーを介して右に回転、(オペランド:C) := (C:オペランド)
0モード0111?SRAオペランド右シフト算術。MS ビットは保持され、LE ビットは繰り上がります。
0モード1000?SLLオペランド左にシフトします。MSBIT で繰り上がります。
0モード1001?RLCオペランドキャリーを通じて左に回転します。
0モード1010?DECオペランド減分します。(NとZはセットされ、繰り上がりは影響を受けません)
0モード1011?(予約済み)
0モード1100?INCオペランド増分。(NとZは設定され、繰り上がりは影響を受けません)
0モード1101?TNZオペランド非ゼロをテストします。オペランドに基づいて N と Z を設定します。
0モード1110?SWAPオペランドオペランドの半分を交換します (4 ビット回転)。
0モード1111?CLRオペランドオペランドを 0 に設定します。N と Z は固定値に設定されます。オペランド。
100オペコードその他の命令。いずれも暗黙的に条件コードを設定するものではありません。
10000000アイレット割り込みからの復帰(CC、A、X、PCをポップ)
10000001RETサブルーチンからの戻り(PCのポップ)
10000010トラップ強制トラップ割り込み
10000011(予約済み)
10000100ポップAスタックからAをポップする
10000101ポップXスタックからXをポップ
10000110ポップCCスタックから条件コードをポップする
10000111(予約済み)
10001000押すAをスタックにプッシュする
10001001Xを押すXをスタックにプッシュする
10001010プッシュCC条件コードをスタックにプッシュする
10001011(予約済み)
1000110(予約済み)
10001110停止プロセッサとクロックを停止する
10001111WFI割り込みを待ち、プロセッサを停止するがクロックは停止しない
10010000PDY命令のプレフィックス。次の命令でXとYを入れ替える
10010001PIY命令プレフィックス; PDY と PIX
10010010ピックス命令プレフィックス; オペランドに8ビットメモリ間接を使用する
10010011LD X、YX := Y。PDY では、「LD Y,X」を実行します。
10010100LD S、XS := X。スタック ポインタをロードします。
10010101LD S、AS := A. スタック ポインタをロードします。
10010110LD X、SX := S です。
10010111LD X、AX := A です。
10011000RCFキャリーフラグをリセット(クリア)する
10011001SCFキャリーフラグを設定する
10011010リム割り込みマスクをリセットする(割り込みを有効にする)
10011011シム割り込みマスクを設定する(割り込みを無効にする)
10011100RSPスタックポインタをリセット(RAMの先頭へ)
10011101いいえ操作なし。(=LD A,A)
10011110LD A、SA := S
10011111LD A、XA := X です。
1モードオペコード価値?2つのオペランド命令 A := A op operand
1010オペコードimm8OP # imm88ビット即値オペランド(宛先としては禁止)
1011オペコードアドレス8OPアドレス88ビット絶対アドレス
1100オペコード追加追加OPアドレス1616ビット絶対アドレス
1101オペコード追加追加OP (アドレス16 ,X)16ビットオフセットでインデックス付け
1110オペコードアドレス8OP (アドレス8 ,X)8ビットオフセットでインデックス付け
1111オペコードOP (X)オフセットなしでインデックス付け
1モード0000価値?SUB A、オペランドA := A − オペランド
1モード0001価値?CP A、オペランドA − オペランドを比較する
1モード0010価値?SBC A、オペランド借用減算 A := A − オペランド − C
1モード0011価値?CP X、オペランドX − オペランドを比較する
1モード0100価値?AND A、オペランドA := A & オペランド、ビットごとのAND
1モード0101価値?BCP A、オペランドビットテストA & オペランド
1モード0110価値?LD A、オペランドロードA := オペランド
10100111imm8(予約済み、=LD #imm8,A)
1モード0111価値?LDオペランド、Aストアオペランド := A
1モード1000価値?XOR A、オペランドA := A ^ オペランド、排他的論理和
1モード1001価値?ADC A、オペランドA := A + オペランド + C、キャリー付き加算
1モード1010価値?OR A、オペランドA := A | オペランド、包含的または
1モード1011価値?ADD X、オペランドA := A + オペランド
10101100imm8×(予約済み、=JP #imm8)
1モード1100価値?JPオペランドPC := オペランド、無条件ジャンプ
10101101ソフ8CALLRラベルPUSH PC, PC := PC + オペランド
1モード1101価値?CALLオペランドPC をプッシュ、PC := オペランド
1モード1110価値?LD X、オペランドロードX := オペランド
10101111imm8(予約済み、=LD #imm8,X)
1モード1111価値?LDオペランド、Xオペランドを格納 := X

参考文献

  1. ^データシート: ST62T00C/T01C(1998年以降)
  2. ^ 「2006 EDNマイクロコントローラ/マイクロプロセッサディレクトリ、命令セットアーキテクチャ別に分類された8ビットマイクロプロセッサ」(PDF)。p. 26。100616 edn.com
  3. ^ a b「ST6ファミリプログラミングマニュアル」(PDF) . リビジョン2.0. STMicroelectronics . 2004年10月. 2017年2月28日閲覧
  4. ^ 「ST7ファミリプログラミングマニュアル」(PDF) . リビジョン2. STMicroelectronics . 2005年11月. 2017年2月28日閲覧