PIC命令リスト

PIC命令セットはMicrochip Technology社のPICまたはdsPICマイクロコントローラがサポートする命令セットです。これらの命令は通常、プロセッサの フラッシュメモリにプログラムされ、起動時にマイクロコントローラによって自動的に実行されます。

PICmicroチップはハーバード・アーキテクチャを採用しており、命令ワードのサイズは特殊です。当初は12ビット命令で、メモリオペランドを指定する5ビットのアドレスビットと9ビットの分岐先ビットで構成されていました。その後の改訂でオペコードビットが追加され、アドレスビットを追加できるようになりました。

これらはアキュムレータ マシンであり、共通のアキュムレータ「W」がすべての 2 オペランド命令の 1 つのオペランドになります。

以下の命令セット表では、レジスタ番号は「f」、定数は「k」で表されます。ビット番号(0~7)は「b」で選択されます。算術命令は、結果を「d」ビットで選択された入力の1つに書き込みます。0はW、1は結果がソースレジスタfに書き戻されることを示します。CおよびZステータスフラグは、結果に基づいて設定される場合があります。それ以外の場合は変更されません。Cを設定する加算および減算命令(回転は行いません)は、BCD演算に役立つDC(桁上げ)フラグも設定します。

建築

メモリオペランドは「レジスタ」とも呼ばれます。ほとんどは単なる汎用ストレージ(RAM)ですが、一部の領域は特殊機能レジスタ用に予約されています。1つのアキュムレータ( と呼ばれます)を除き、プログラムカウンタやALUステータスレジスタWなどのレジスタも含め、ほぼすべてのレジスタはメモリマップされています。(メモリマップされていない他の例外は、リターンアドレススタックとGPIOピンの設定に使用されるトライステートレジスタです。)

一部の算術命令は入力の1つしか使用しませんが、それでもdビットを使用します。例えば、はMOVWの値を にコピーします。 = 1 で使用すると、に格納されます。の値を出力する対応する命令があります。= 0 で使用すると、にロードされます。 = 1 で使用すると、の値に応じてゼロフラグが設定されるという目に見える効果しかありません。 WdWfMOVFfdfWdf

この命令セットには条件分岐命令は含まれていません。代わりに、後続の命令を無視する条件スキップ命令が含まれています。条件スキップ命令の後に無条件分岐命令が続くと、条件分岐が実行されます。スキップ命令は、任意のレジスタの任意のビットをテストします。ALUステータスレジスタは、その一例として挙げられます。

メモリオペランドは絶対アドレスで指定されます。その位置はコンパイル時に固定されます。間接アドレス指定を実現するために、2つの特殊機能レジスタが用意されています。

  • ファイル選択レジスタFSR)には、必要なメモリオペランドのアドレスが書き込まれ、その後、
  • 間接ファイルレジスタ(INDF)は、FSR によって指し示されるオペランドのエイリアスになります。

このメカニズムにより、命令セットが5ビットまたは7ビットの絶対アドレスしか許可していない場合でも、最大256バイトのメモリアドレス指定が可能になります。命令に収まるよりも多くのレジスタ(特殊機能レジスタとRAM)を備えたモデルでは、複数のメモリバンクが提供され、それらへのアクセスには以下の2つのメカニズムのいずれかが使用されます。

  1. ほとんどのベースライン コア デバイスと一部のミッドレンジ コア デバイスでは、ファイル選択レジスタの上位ビットを使用して現在のレジスタ バンクを選択します。
  2. 最近のモデルには、別個のバンク選択レジスタと、MOVLBそれを設定する命令があります。

256ワードを超えるプログラムを持つPICプロセッサは、ページメモリを使用します。内部プログラムカウンタとリターンスタックは、すべてのメモリをアドレス指定するために必要な幅を持っていますが、ソフトウェアからは下位8ビットPCL(「PC Low」)レジスタのみを参照できます。ソフトウェアによってのみ変更可能な追加のレジスタ(「PC Latch High」)がありますPCLATH。完全な宛先アドレスを指定しない操作(GOTOPCLレジスタへの9ビットまたは8ビットの書き込みなど)は、PCLATHレジスタの対応する部分から追加の上位ビットを埋めます。(一部のPIC18プロセッサでは、PCLATUレジスタによって16ビット以上に拡張され、ビット16~23が提供されます。)

ベースライン コア デバイス (12 ビット)

これは1976年に汎用計測器PIC1640とPIC1650で導入されたオリジナルの命令セットであり、[ 1 ]それ以降追加されたのはNOP以外のさまざまな命令だけです。

12ビットPIC命令セット
1 11 09876543210ニモニックC ?Z ?説明
0000000オペコードその他の指示
000000000000いいえ操作なし
000000000010オプションWをOPTIONレジスタにコピーする
000000000011寝るスタンバイモードに入る
000000000100CLRWDTウォッチドッグタイマーを再起動する
0000000001fトリスfWをトライステートレジスタにコピーする(f = 1、2、または3)
000000010MOVLB k *バンク選択レジスタをkに設定する
000000011110戻るサブルーチンから戻り、Wは変更されない
000000011111レティフィー割り込みから戻る; 戻って割り込みを有効にする
00オペコードd登録するALU演算: dest ← OP(f,W)
0000001fMOVWF ff ← W
000001dfCLR fdZdest ← 0、通常はCLRWまたはCLRF fと表記される
000010dfSUBWF fdCZ宛先 ← f−W (宛先 ← f+~W+1)
000011dfDECF fdZ宛先 ← f−1
000100dfIORWF fdZdest ← f | W、論理和
000101dfANDWF fdZdest ← f & W、論理積
000110dfXORWF fdZdest ← f ^ W、排他的論理和
000111dfADDWF fdCZ目的地 ← f+W
001000dfMOVF f , dZ宛先 ← f
001001dfCOMF fdZdest ← ~f、ビット補数
001010dfINCF fdZ宛先 ← f+1
001011dfDECFSZ fddest ← f−1、ゼロの場合はスキップ
001100dfRRF fdCdest ← CARRY<<7 | f>>1、キャリーを右に回転
001101dfRLF fdCdest ← F<<1 | CARRY、キャリーを通して左に回転
001110dfSWAPF fddest ← f<<4 | f>>4、ニブルを交換
001111dfINCFSZ fddest ← f+1、ゼロの場合はスキップ
01OPCC少し登録するビット操作
0100少しfBCF f , bfのビットbをクリア
0101少しfBSF f , bfのビットbを設定する
0110少しfBTFSC f , bfのビットbがクリアされている場合はスキップする
0111少しfBTFSS fbfのビットbが設定されている場合はスキップする
10OPCC管理権の移転
1000RETLW kW ← k を設定し、サブルーチンから戻る
1001コールkサブルーチン呼び出し、8ビットアドレスk
101後藤k9ビットアドレスkへのジャンプ[ 2 ]
11OPCC8ビット即値Wと8ビットリテラルの演算: W ← OP(k,W)
1100MOVLW kW ← k
1101IORLW kZW ← k | W、ビットごとの論理和
1110ANDLW kZW ← k & W、ビット単位で
1111XORLW kZW ← k ^ W、ビットごとの排他的論理和
1 11 09876543210ニモニックC ?Z ?説明

*: 拡張命令。ほとんどの12ビットPICでは利用できません。拡張RAM搭載モデル(16C5x、16F5xなど)のほとんどでは、FSRの上位ビットを使用してレジスタアドレス空間を拡張します。一部のモデル(PIC12F529T39Aなど)には、この命令で設定できる独立したバンク選択レジスタがあります。 †: 拡張命令。「拡張ベースライン」PICでのみ利用可能です。割り込みサポート(および4レベルスタック)を備えたごく少数のモデル(16F527、16F570、MCV20A)のみがこれらの命令を搭載しています。これらのモデルはすべてMOVLBも搭載しています。

汎用計測器 PIC1670 (13 ビット、廃止)

1979年に発売されたこの拡張PICは、64バイトのレジスタ空間(16個の特殊機能レジスタと48バイトのRAM)、1024ワードのROM、6レベルのハードウェアスタック、そして割り込み処理をサポートしていました。PIC1665は、マスクROM 1670用のファームウェア開発に使用された、外部ROMを搭載したバリアントでした。

ステータスレジスタ(ビット3)に符号付きオーバーフロービットが追加されました。ステータスレジスタのビット4とビット5は、10ビットプログラムカウンタの上位2ビットへの読み取り専用アクセスを提供します。

命令セットは、アドレスフィールドが拡張された12ビットPICとほぼ同じです。ただし、8ビット即値命令にはオペコードビットが追加されています。8ビット即値オペランドを持つ命令を4つ追加するのではなく、命令セットには、8ビットオペランドを持つ命令を2つ、7ビットオペランド(6ビットアドレスと方向ビット)を持つ命令を2つ、そして6ビットオペランド(6ビットアドレス)を持つ命令を4つ追加します。

  • 8ビットの即値グループは、ADDLWとRETLW命令の追加により6命令に拡張されます。RETLWは制御転送グループから外され、CALL命令で10ビットのアドレスをフルに使用できるようになります。
  • ALU 演算グループは、キャリー付き加算/減算 (ADCWF、SUBBWF) 命令 (7 ビット オペランド) を取得します。
  • CLRW 命令は削除されます (6 ビットのメモリ アドレスが無駄になり、MOVLW 0 が重複します)。
  • 6ビットのメモリアドレスオペランドを持つ5つの新しい命令が追加されました。これらの命令にはデスティネーション選択ビットがなく、結果を書き込まない「比較スキップ」命令が3つと、「キャリーなし回転」命令が2つ含まれています。

この命令セットは現在製造されている部品では使用されておらず、歴史的な興味のみの対象となっています。

13ビットPIC1670命令セット(廃止)[ 3 ]
1 21 11 09876543210ニモニックC ?Z ?説明
0000000オペコードその他の指示
0000000000000いいえ操作なし
0000000000001停止プロセッサを停止する(PIC1665のみ)
0000000000010レトフィ割り込みからの復帰
0000000000011再発行サブルーチンから戻り、Wは変更されない
0000000000100DAW小数点調整 W
00オペコードd登録するALU演算は12ビットおよび14ビットPICと同様ですが、
000001dfSUBBWF  fdCZdest ← f−W− C = f+~W+C (CLR fdではない)
001000dfADCWF fdCZdest ← f+W+C (MOVF f , dではない)
01OPCC少し登録する12ビットおよび14ビットPICと同じビット操作
1000オペコード登録する追加のALU演算、宛先の選択なし
1000000fMOVFW fZW ← f (= MOVF f ,0)
1000001fCLRF fZf ← 0 (CLRWの場合はMOVLW 0を使用)
1000010fRRNC ff ← f<<7 | f>>1、右回転(繰り上がりなし)
1000011fRLNC ff ← f<<1 | f>>7、左回転(繰り上がりなし)
1000100fCPFSLT f比較して f < W (符号なし) の場合はスキップする
1000101fCPFSEQ ff = Wの場合は比較してスキップする
1000110fCPFSGT ff > W (符号なし)の場合は比較してスキップする
1000111fテストF fZf ← f (= MOVF f ,1)
10オペコード8ビット即値Wと8ビットリテラルの演算: W ← OP(k,W)
10010MOVLW kW ← k
10011追加kCZW ← k+W
10100IORLW kZW ← k | W、ビットごとの論理和
10101ANDLW kZW ← k & W、ビット単位で
10110XORLW kZW ← k ^ W、ビットごとの排他的論理和
10111RETLW kW ← k、その後サブルーチンから戻る
11c管理権の移転
110後藤kアドレスkにジャンプ
111コールkサブルーチンを呼び出す
1 21 11 09876543210ニモニックC ?Z ?説明

ミッドレンジ コア デバイス (14 ビット)

これらのデバイスは、14ビット幅のコードメモリと、改良された8レベルのコールスタックを備えています。命令セットはベースラインデバイスとほとんど変わりませんが、2ビットのオペコードビットが追加され、128個のレジスタと2048ワードのコードを直接アドレス指定できます。その他いくつかの命令と、8ビットのリテラル命令である加算と減算が2つ追加されています。ミッドレンジコアは、PIC12およびPIC16と表記されるほとんどのデバイスに搭載されています。

14ビットPIC命令セット
1 31 21 11 09876543210ニモニックC ?Z ?説明
0000000オペコードその他の指示
00000000000000いいえ操作なし
00000000001000戻るサブルーチンから戻り、Wは変更されない
00000000001001レティフィー割り込みからの復帰
00000001100010オプションWをOPTIONレジスタにコピーする(非推奨)
00000001100011寝るスタンバイモードに入る
00000001100100CLRWDTウォッチドッグタイマーを再起動する
000000011001fトリスfWをトライステートレジスタにコピーする(f = 1、2、または3)(非推奨)
00オペコードd登録するALU演算: dest ← OP(f,W)
0000001fMOVWF ff ← W
000001dfCLR fdZdest ← 0、通常はCLRWまたはCLRF fと表記される
000010dfSUBWF fdCZ宛先 ← f−W (宛先 ← f+~W+1)
000011dfDECF fdZ宛先 ← f−1
000100dfIORWF fdZdest ← f | W、論理和
000101dfANDWF fdZdest ← f & W、論理積
000110dfXORWF fdZdest ← f ^ W、排他的論理和
000111dfADDWF fdCZ目的地 ← f+W
001000dfMOVF f , dZ宛先 ← f
001001dfCOMF fdZdest ← ~f、ビット補数
001010dfINCF fdZ宛先 ← f+1
001011dfDECFSZ fddest ← f−1、ゼロの場合はスキップ
001100dfRRF fdCdest ← CARRY<<7 | f>>1、キャリーを右に回転
001101dfRLF fdCdest ← f<<1 | CARRY、キャリーを左に回転
001110dfSWAPF fddest ← f<<4 | f>>4、ニブルを交換
001111dfINCFSZ fddest ← f+1、ゼロの場合はスキップ
01OPCC少し登録するビット操作
0100少しfBCF f , bfのビットbをクリア
0101少しfBSF f , bfのビットbを設定する
0110少しfBTFSC f , bfのビットbがクリアされている場合はスキップする
0111少しfBTFSS fbfのビットbが設定されている場合はスキップする
10c管理権の移転
100コールkサブルーチンを呼び出す
101後藤kアドレスkにジャンプ
11オペコード8ビット即値Wと8ビットリテラルの演算: W ← OP(k,W)
1100××MOVLW kW ← k
1101××RETLW kW ← k、その後サブルーチンから戻る
111000IORLW kZW ← k | W、ビットごとの論理和
111001ANDLW kZW ← k & W、ビット単位で
111010XORLW kZW ← k ^ W、ビットごとの排他的論理和
111011(予約済み)
11110×サブLW kCZW ← k−W (宛先 ← k+~W+1)
11111×追加kCZW ← k+W
1 31 21 11 09876543210ニモニックC ?Z ?説明

強化されたミッドレンジコアデバイス(14ビット)

強化されたミッドレンジコアデバイスでは、より深いハードウェアスタック、追加のリセット方法、14個の追加命令、およびCプログラミング言語の最適化が導入されています。[ 4 ] 特に、2つのレジスタINDF registersINDF0およびINDF1)と、それに対応する2つのFSRレジスタペア(および)があります。特殊命令は、アドレスレジスタなどのレジスタを使用し、さまざまなアドレッシングモードを備えています。 FSRnLFSRnHFSRn

14ビット拡張PIC追加命令
1 31 21 11 09876543210ニモニックC ?Z ?説明
0000000オペコードその他の指示
00000000000001リセットソフトウェアリセット
00000000001010コールWPCを押して、PCLATH:Wにジャンプします
00000000001011BRWPC ← PC + W、Wを使用した相対ジャンプ
00000000010n00ムービー++FSR nZFSR nをインクリメントし、W ← INDF n
00000000010n01ムービー −−FSR nZFSR nをデクリメントし、W ← INDF n
00000000010n10ムービー FSR n ++ZW ← INDF n、その後FSR nをインクリメントする
00000000010n11ムービー FSR n −−ZW ← INDF n、その後FSR nをデクリメントする
00000000011nメートルFSR nを使用したMOVWIINDF n ← W、MOVIWと同じモード
000000001MOVLB kBSR ← k、リテラルをバンク選択レジスタに移動
11オペコードd登録するALU演算: dest ← OP(f,W)
110101dfLSLF fdCZdest ← f << 1、論理左シフト
110110dfLSRF fdCZdest ← f >> 1、論理右シフト
110111dfASRF fdCZdest ← f >> 1、算術右シフト
111011dfSUBWFB fdCZdest ← f + ~W + C、繰り上がり減算
111101dfADDWFC fdCZdest ← f + W + C、繰り上がり加算
11オペコードリテラルkを使った演算
1100010nADDFSR FSR nkFSR n ← FSR n + k、6ビットの符号付きオフセットを加算
1100011MOVLP kPCLATH ← k、7ビットリテラルをPCラッチハイに移動
11001ブラkPC ← PC + k、9ビット符号付きオフセットを使用した相対分岐
1111110nムービーk [FSR n ]ZW ← [FSR n + k ]、6ビット符号付きオフセット
1111111nMOVWI k [FSR n ][FSR n + k ] ← W、6ビット符号付きオフセット
1 31 21 11 09876543210ニモニックC ?Z ?説明

ELAN Microelectronics クローン (13 または 15 ビット)

ELAN Microelectronics Corp.は、13ビットの命令語を持つPICmicroに似たマイクロコントローラシリーズを製造しています。[ 5 ] 命令はミッドレンジの14ビット命令セットとほぼ互換性がありますが、6ビットのレジスタアドレス(16個の特殊用途レジスタと48バイトのRAM)と10ビット(1024ワード)のプログラムスペースに制限されています。

10ビットのプログラムカウンタはR2としてアクセス可能です。読み出しは下位ビットのみにアクセスし、書き込みは上位ビットをクリアします。例外としてTBL命令があり、この命令はビット8と9を保持したまま下位バイトを変更します。

7 つのアキュムレータ即値命令は、14 ビットの PICmicro を基準にして番号が変更され、4 ビットではなく 3 ビットのオペコードに収まるようになっていますが、追加のソフトウェア割り込み命令と同様に、それらはすべて存在します。

いくつかの追加の命令があり、用語もいくつか変更されています (PICmicro OPTION レジスタは CONTrol レジスタと呼ばれ、PICmicro TRIS レジスタ 1 ~ 3 は I/O 制御レジスタ 5 ~ 7 と呼ばれます) が、同等のものは明らかです。

13ビットEM78命令セット[ 6 ] [ 7 ] [ 8 ]
1 21 11 09876543210ニモニックC ?Z ?説明
0000000オペコードその他の指示
0000000000000いいえ*操作なし
0000000000001DAA C加算後の小数点調整
0000000000010続き*CONTレジスタへの書き込み(CONT ← W)
0000000000011睡眠*スタンバイモードに入る(WDT ← 0、時計を停止)
0000000000100WDTC *ウォッチドッグタイマーを再起動する(WDT ← 0)
000000000fつまり、f WをI/O制御レジスタにコピーする(f = 5~7、11~15)
0000000010000エニ割り込みを有効にする
0000000010001ディシ割り込みを無効にする
0000000010010RETサブルーチンから戻り、Wは変更されない
0000000010011レティ割り込みから戻る; 戻って割り込みを有効にする
0000000010100コントロールCONTレジスタの読み取り(W ← CONT)
000000001fIOR f I/O制御レジスタをWにコピーする(f = 5~7、11~15)
0000000100000CZPCL += W、PCビット8と9を保持
0000010000001TBWR †‡フラッシュ書き込みを開始
00オペコードd登録するALU演算は12ビットおよび14ビットPICと同じ
01OPCC少し登録する12ビットおよび14ビットPICと同じビット操作
10c制御転送は14ビットPICと同じ
11オペコード8ビット即値Wと8ビットリテラルの演算: W ← OP(k,W)
110opMOV/IOR/AND/XOR、12ビットPICと同じ
11100RETLW kW ← k、その後サブルーチンから戻る
11101サブLW kCZW ← k−W (W ← k+~W+1)
111100INT k PC をプッシュ、PC ← k (ソフトウェア割り込み、通常は k=1)
11111追加kCZW ← k+W
111101オペコード拡張(後期モデルではk≥128をINT kに置き換える) [ 8 ] [ 9 ] [ 10 ]
111101000ページkROMページkを選択(MOVLP kと同様)
111101001バンクk RAMバンクkを選択
111101010LCALL k 17ビットアドレスによるロングコール(2ワード命令)
111101011LJMP k 17ビットアドレスによるロングジャンプ(2ワード命令)
1111011fTBRD f TBHP:TBLPのROMを指定されたレジスタに読み込む
1 21 11 09876543210ニモニックC ?Z ?説明

*: 12ビットPICと同じオペコード †: PICに相当する命令がないEM78命令セット固有の命令‡:フラッシュメモリモデル(EM78F724N) のみ

一部のモデルは、他のPICマイクロコントローラと同様に、複数のROM、RAM、または特殊用途レジスタバンクをサポートしています。特殊用途レジスタ0x5~0xFとRAMアドレス0x20~0x3Fにはそれぞれ独自のバンク選択ビットがあります。レジスタ0x0~0x4(バンク選択レジスタ0x1を含む)とRAMアドレス0x10~0x1Fはグローバルです。

命令セットには15ビット版もあり、レジスタ番号が8ビットに拡張され、呼び出しアドレスとジャンプアドレスが12ビットに拡張されている点を除けば、ほぼ同一である。その他の違いは以下の通りである。[ 11 ]

  • CONTW、IOW、CONTR、IOR、INT命令は削除され、
  • 8ビットリテラルの演算では、ビット8と9に2つの0ビットが追加されます。
  • 4ビットリテラルの拡張では、ビット4と5に2つの0ビットが追加されます。
  • PAGE 命令と BANK 命令は SBANK と GBANK に名前が変更され、それぞれ特殊用途レジスタと汎用 RAM のバンク部分でバンク切り替えを実行します。

第 2 世代の 15 ビット命令セットでは、アドレス空間が次のように拡張されます。

  • 80個のデバイス制御レジスタ(最初の5個を除くすべてバンク化)
  • 48バイトのバンクなしRAM(0x50~0x7F)と
  • 128バイトのバンクRAM(0x80~0xFF)

これらには、いくつかの追加の指示も含まれます。

15ビットEM78/EM88命令セット拡張[ 12 ] [ 13 ]
1 41 31 21 11 09876543210ニモニックC ?Z ?説明
00000000オペコードその他の指示
000000000000000いいえ*操作なし
000000000000001DAA *C加算後の小数点調整
000000000000011睡眠*スタンバイモードに入る(WDT ← 0、時計を停止)
000000000000100WDTC *ウォッチドッグタイマーを再起動する(WDT ← 0)
000000000000101マルウ8×8 → 16ビット乗算
000000000000110DIVW 8÷8 → 8,8ビット除算
000000000010000エニ*割り込みを有効にする
000000000010001ディシ*割り込みを無効にする
000000000010010リターン*サブルーチンから戻り、Wは変更されない
000000000010011レティ*割り込みから戻る; 戻って割り込みを有効にする
000000000010110リセットソフトウェアリセット
000000000010111TBWRフラッシュROM書き込み
000000001INT kアドレス2×kでのソフトウェア割り込み
00000001少しfBTG fbf のビット b を反転(トグル)する(アドレス範囲が制限されている)
00オペコードd登録するALU演算はEM78およびPICと同じ
01OPCC少し登録するEM78やPICと同じビット操作
10cEM78および14ビットPICと同じ制御転送
11オペコード008ビット即値8ビットリテラルの演算はEM78と同じ(INTを除く)
11オペコード登録または即時命令セット拡張
1100001fJE rW = fの場合はスキップ
1100010fJGE rW > fの場合はスキップ
1100011fJLE rW < fの場合はスキップ
1100101JE kW = kの場合はスキップ
1100110(予約済み)
1100111fTBRDA fTBHP:TBLPのROMをfに読み込み、msbitsをWに格納する
1101001SJCアドレスキャリーセットの場合は PC + sext( k )にジャンプ
1101010SJNCアドレスPCにジャンプ +キャリークリアの場合は sext( k )
1101011SJZアドレスゼロフラグが設定されている場合は PC + sext( k )にジャンプ
1101101SJNZ住所ゼロフラグがクリアされている場合は PC + sext( k )にジャンプ
110111dfRRA/RR fdest ← f<<7 | f>>1、繰り上がりなしで右回転
1110001fXCH ff ↔ W を交換
111001dfRLA/RL fdest ← f<<1 | f>>7、キャリーなしで左回転
1110101f乗数f PRODH:PRODL ← f × W
111011×(予約済み)
111100dfSUBBCZdest ← f + ~W + C、繰り上がり減算
11110100000SBANK k *特殊機能レジスタバンクkを選択
11110100100GBANK k *RAMバンクkを選択
11110101000LCALL k *19ビットアドレスによるロングコール(2ワード命令)
11110101100LJMP k *19ビットアドレスのロングジャンプ(2ワード命令)
1111011fTBRD f *TBHP:TBLPのROMをfに読み込む
1111101f負のfCZf ← −f (f ← ~f + 1)、反転
111111dfADC fCZdest ← f + W + C、繰り上がり加算

*: 13ビットEM78と同じオペコード †: EM89F768Nのみ; オペランドと結果は特殊レジスタに格納されます ‡: EM88F794N、MTF213、MTF351のみ

Holtek クローン (14、15、または 16 ビット)

Holtekは、ミッドレンジコア(非拡張版)と同等の14ビット命令語を備えた8ビットマイクロコントローラを多数製造しています。命令エンコーディングはすべて14ビットに収まり、7ビットのオペランドアドレスを提供します。

命令フォーマットはMicrochip社のものと同一ですが、オペコードの割り当て順序が異なり、メーカーは異なる命令ニーモニックを使用しています。アキュムレータはWではなくACCと呼ばれ、デスティネーションはオペランドではなく命令ニーモニックの接尾辞で指定されます。(アキュムレータをデフォルトで使用しない命令はメモリに書き戻し、デスティネーションがアキュムレータであることを示すためにA接尾辞を使用します。2オペランド命令はデフォルトでアキュムレータに書き込み、デスティネーションがメモリであることを示すためにM接尾辞を使用します。)

異なるオペコードの割り当てに加えて、いくつかの命令には意味上の違いがあります。

  • 減算命令はアキュムレータからオペランドを減算しますが、Microchip の減算命令はその逆を行います。(これにより、減算即値命令は負数の加算と同等になるため、冗長になります。)
  • アキュムレータへの移動命令とクリア命令はフラグを変更しません。
  • ゼロ、キャリー、および数字キャリーフラグ (Holtek では AC と呼ばれます) に加えて、AC を設定するのと同じ加算命令と減算命令によって設定されるオーバーフロー フラグがあります。

14 ビット PICmicro のレパートリーにいくつかの操作が追加されました。

  • キャリーなしで1ビット左と右に回転します。
  • オペランドをすべて1に設定する。
  • オペランドがゼロの場合はスキップする(最初に増分または減分せずに)。
  • オペランドがゼロ以外の場合はスキップする(一部のモデル)
  • 繰り上がりのある加算と減算、
  • 2進化10進演算の場合、加算後の小数点調整、および
  • プログラムROMから読み出し、テーブル検索を行います。この方法では、TBHPレジスタとTBLPレジスタを16ビットポインタとして使用し、そこからワードをフェッチし、下位バイトを指定された位置に格納します。フェッチされたワードの上位6~8ビットはTBLHレジスタに格納されます。2つ目の形式では、TBLPレジスタのみを使用し、ROMの最上位256バイトページから読み出します。一部のモデルには、TBLPレジスタをプリインクリメントするバリアントが含まれています。
  • ほとんどのモデルは、ウォッチドッグタイマーをリセットするための2番目の命令をサポートしています。この命令は最初の命令と交互に実行する必要があります。1つの命令の繰り返しは無視されます。これにより、2つの独立したウォッチドッグルーチンを実行でき、どちらかの命令が失敗するとウォッチドッグが起動します。
  • Holtekは、拡張14ビットPICと同様に、2つの間接アドレス指定レジスタを提供しています。一部のモデル(HT66F70Aなど)は3つの間接アドレス指定レジスタを提供しています。最初の間接アドレス指定レジスタ(IAR0)は8ビットアドレスレジスタ(MP0)を使用し、常にRAMの下位バンクをアドレス指定します。IAR1とIAR2は追加のRAMアドレスビット(MP1HとMP2H)を提供し、RAMの追加のバンクへのアクセスを可能にします。[ 14 ]

15ビットモデルでは、命令のビット14を8番目のオペランドアドレスビットと12番目のCALL/JMPターゲットアドレスビットとして使用します。16ビットモデルでは、13番目のCALL/JMPターゲットアドレスビットが追加されますが、9番目のオペランドアドレスビットは追加されません。[ 15 ]

代わりに、一部の16ビットモデルは拡張命令セットをサポートしています。これにより、いくつかの新しい命令(インクリメントなしのバイトスキップ、キャリー付き即値減算、アドレスインクリメント付きROM読み出し)が追加されるだけでなく、すべてのメモリ命令に2ワードの「ロング」型が追加されます。オペコードのビット15がセットされている場合、オペコードのビット0~6および14の8ビットオペランドアドレスが、後続の命令ワードのビット0~7を使用して16ビットに拡張されることを示します。このような命令はLプレフィックス(ADDではなくLADD)で記述され、実行に1サイクル追加されます。[ 14 ]

14 ビット Holtek 命令セット[ 16 ]
1 31 21 11 09876543210ニモニックPIC相当C ?Z ?説明
00000000000オペコードその他の指示
00000000000000いいえいいえ操作なし
00000000000001CLR WDT1CLRWDTウォッチドッグタイマーを再起動する
00000000000010停止寝る低電力モードに入る
00000000000011RET戻るサブルーチンからの戻り
00000000000100レティレティフィー割り込みからの復帰
00000000000101CLR WDT2≈CLRWDTウォッチドッグタイマーを再起動する
0000000000011×(予約済み)
0000000≠0×××(予約済み)
000オペコードd住所ALU演算パート1: dest ← OP(ACC,[m]) *
0000001メートルMOV [ m ],AMOVWF m[m] ← ACC
000001dメートルCPLA/CPL [男性]COMF mdZdest ← ~[m], ビット補数
000010dメートルSUB/SUBM A,[ m ]≠SUBWF m , dCZ宛先 ← ACC − [m] (宛先 ← ACC+~[m]+1)
000011dメートルADD/ADDM A,[ m ]ADDWF mdCZ目的地 ← ACC + [m]
000100dメートルXOR/XORM [ m ]XORWF mdZdest ← ACC ^ [m]、排他的論理和
000101dメートルOR/ORM [ m ]IORWF mdZdest ← ACC | [m]、論理和
000110dメートルAND/ANDM [ m ]ANDWF mdZdest ← ACC & [m]、論理積
0001110メートル移動 A,[ m ]≈MOVF m ,0ACC ← [メートル]
0001111メートル≈MOVF m ,1[メートル] ← [メートル]
001オペコード8ビット即値8ビットリテラルを使った演算: ACC ← OP(ACC,k)
001000SBC A、k CZACC ← ACC + ~[m] + C、繰り上がり減算
001001RET A、kRETLW kACC ← k、その後サブルーチンから戻る
001010サブA、k≠SUBLW kCZACC ← ACC − k (ACC ← ACC+~k+1)
001011A、kを追加追加kCZACC ← ACC + k
001100XOR A、kXORLW kZACC ← ACC ^ k、排他的論理和
001101またはA、kIORLW kZACC ← ACC | k、論理和
001110そしてA、kANDLW kZACC ← ACC & k、論理積
001111移動 A、kMOVLW kACC ← k
01オペコードd住所ALU演算パート2: dest ← OP(ACC,[m]) *
010000dメートルSZA/SZ [メートル]dest ← [m], ゼロの場合は次の命令をスキップ
010001dメートルSWAPA/SWAP [ m ]SWAPF mddest ← [m]<<4 | [m]>>4、ニブルを交換
010010dメートルSBC/SBCM A,[ m ]≠SUBWFB m , dCZdest ← ACC + ~[m] + C、繰り上がり減算
010011dメートルADC/ADCM A,[ m ]ADDWFC mdCZdest ← ACC + [m] + C、繰り上がり加算
010100dメートルインカ/INC [メートル]INCF mdZ目的地 ← [m] + 1
010101dメートルデカ/デック [メートル]DECF mdZ目的地 ← [m] − 1
010110dメートルサイズ/SIZ [ m ]INCFSZ mddest ← [m] + 1、ゼロの場合はスキップ
010111dメートルSDZA/SDZ [メートル]DECFSZ mddest ← [m] − 1、ゼロの場合はスキップ
011000dメートルRLA/RL [メートル]dest ← [m] << 1 | [m] >> 7、1ビット左に回転
011001dメートルRRA/RR [メートル]dest ← [m] << 7 | [m] >> 1、右に1ビット回転
011010dメートルRLCA/RLC [メートル]RLF mdCdest ← [m] << 1 | C、繰り上がりで左回転
011011dメートルRRCA/RRC [メートル]RRF mdCdest ← C << 7 | [m] >> 1、繰り上がりで右回転
0111オペコード住所特殊操作: [m] ← 特殊*
0111000メートルITABRD [ m ] TBLH:[m] ← ROM[TBHP:++TBLP](プリインクリメント付き)
0111001メートルITABRDL [ m ] TBLH:[m] ← ROM[0xff:++TBLP](プリインクリメント付き)
0111010メートルタブルド [ m ]TBLH:[m] ← ROM[TBHP:TBLP]、テーブル検索
0111011メートルタブル文字 [ m ]TBLH:[m] ← ROM[0xff:TBLP]、ROMの最後のページから読み取る
0111100メートルSNZ [ m ] [m] ← [m]、ゼロでない場合は次の命令をスキップ
0111101メートルDAA [メートル]C[m] ← DAA(ACC)、BCD加算後の小数点調整
0111110メートルCLR [メートル]≈CLRF m[メートル] ← 0
0111111メートル設定 [ m ][メートル] ← 255
10c管理権の移転
100コールkコールkサブルーチンを呼び出す
101JMP k後藤kアドレスkにジャンプ
11OPCC少し住所ビット操作*
1100少しメートルSET [ m ] .bBSF mb[m]のビットbを設定する
1101少しメートルCLR [ m ] 。bBCF mb[m]のビットbをクリアする
1110少しメートルSNZ [ m ] 。bBTFSS mb[m]のビットbが設定されている場合はスキップする
1111少しメートルSZ [ m ] 。bBTFSC mb[m]のビットbがクリアされている場合はスキップする
1 31 21 11 09876543210ニモニックPIC相当C ?Z ?説明

*: 拡張命令セットを備えた 16 ビット モデルでは長い形式で命令が使用できます。 †: 拡張命令セットを備えた 16 ビット モデルでのみ命令が使用できます。

Padauk マイクロコントローラ (13、14、15、または 16 ビット)

パダウクテクノロジーは、 PICに似たマイクロコントローラのシリーズを製造しており、その非常に低価格で有名で、大量購入時の価格は0.033米ドルから始まり、 [ 17 ]多くのモデルは0.10米ドル未満です。[ 18 ] [ 19 ] [ 20 ]

明らかにマイクロチップPIC12シリーズから派生したものですが[ 18 ] [ 21 ] 、いくつか重要な違いがあります。

  • 間接メモリ アクセスを実行するために FSR/INDF メカニズムは使用せず、代わりに任意の RAM 位置をポインタとして使用する間接ロードおよびストア命令を使用します。
  • スタック ポインタ レジスタを備えた RAM ベースの呼び出しスタックを使用します。
  • キャリーフラグは、減算に、Microchip が使用する「キャリー ビット」規則ではなく、「借用ビット」規則を使用します。
  • これらには符号付きオーバーフロー フラグも含まれており、これは数字のキャリーと同様に、加算、減算、比較命令 (シフト命令を除くキャリー フラグを設定するすべての命令) によって設定されます。
  • これらには別々の RAM と I/O レジスタのアドレス空間 (13 ビット命令セットではそれぞれ 64 バイトと 32 バイト) があります。
  • ビット操作は I/O 空間と最初の 16 個の RAM アドレスに制限されます。
  • メモリソースとアキュムレータ宛先を持つ単一オペランド命令は省略されます。
  • アキュムレータのソースとデスティネーションを持つ単一オペランド命令が提供されます。
  • 減算演算は、宛先 − ソースを計算し、宛先に応じて入力オペランドを交換します。
  • 動作速度が速く、ほとんどの命令に1サイクル、制御転送に2サイクルかかります。
  • 一部のモデルは、実行がインターリーブされる複数の実行コンテキストを持つ、時間的なマルチスレッドをサポートしています。
13ビットパダウク命令セット[ 22 ] [ 23 ]
1 21 11 09876543210ニモニックPIC相当C ?Z ?説明
000000000オペコードその他の指示
0000000000000いいえいいえ操作なし
0000000000001(予約済み)
000000000001×(予約済み)
000000000010×(予約済み)
0000000000110LDSPTLA ← ROM[[SP]]、スタックの先頭の16ビットポインタを使用してROMワードの下位/上位バイトをロードする
0000000000111LDSPTH
0000000001(予約済み)
000000001オペコードアキュムレータの1オペランド命令メモリの1オペランド命令(下記)と同様だが、
0000000010111PCADD A≈ADDWF PCL、1PC ← PC + A、プログラムカウンタに追加(XCH Aではない)
0000000011110スワップAA ← A<<4 | A>>4、ニブルを交換(CEQSN Aではない)
000000010(予約済み)
000000011オペコードシステム制御命令
0000000110000WDリセットCLRWDTウォッチドッグタイマーを再起動する
0000000110001(予約済み)
0000000110010プシャフAをプッシュし、スタックの一番上にフラグを置く
0000000110011ポップアフCZフラグをポップし、スタックの上から A をポップする
0000000110100(予約済み)
0000000110101リセットリセットソフトウェアリセット
0000000110110ストップシス寝るスタンバイモードに入る(時計が停止する)
0000000110111ストップエックススタンバイモードに入る(時計は動いている)
0000000111000ENGINTBSF INTCON、GIE割り込みを有効にする
0000000111001ディスギントBCF INTCON、GIE割り込みを無効にする
0000000111010RET戻るサブルーチンAからの戻り値、変更なし
0000000111011レティレティフィー割り込みからの復帰
0000000111100マルMULRH:A ← A × MULOP(全機種対応ではありません)
0000000111101(予約済み)
000000011111×(予約済み)
00000オペコードioaddrバイト幅のI/O操作
00000011ioaddrXOR ioaddr、AIO[ioaddr] ← A ^ IO[address]
00000100ioaddrMOV ioaddr ,AIO[ioaddr] ← A
00000101ioaddrMOV A、ioaddrZA ← IO[ioaddr]
0000011c住所c16ビット操作(RAMアドレス制限、偶数)
00000110住所0STT16アドレスタイマー16 ← [アドレス]
00000110住所1LDT16アドレス[アドレス] ← タイマー16
00000111住所0IDXMアドレス、A[[アドレス]] ← A、間接メモリアドレス
00000111住所1IDXM A、アドレスA ← [[アドレス]], 間接メモリアドレス
00001リテラル定数を返す
00001RET kRETLW kA ← k、そしてサブルーチンから戻る
0001c少しc住所RAM でのビット操作 (最初の 16 バイトのみ)
00010少し0住所T0SNアドレスbBTFSCアドレスb[ addr ] のビットbがクリアされている場合はスキップする
00010少し1住所T1SNアドレスbBTFSSアドレスb[ addr ] のビットbが設定されている場合はスキップします
00011少し0住所SET0アドレスbBCFアドレスb[ addr ] のビットbをクリアする
00011少し1住所SET1アドレスbBSFアドレスb[ addr ] のビットbを設定する
001dオペコード住所Aとメモリ間のALU演算
0010000住所ADDアドレス、AADDWFアドレス、1CZ[住所] ← [住所] + A
0010001住所SUBアドレス、ASUBWFアドレス、1CZ[住所] ← [住所] − A
0010010住所ADDC アドレス、AADDWFCアドレス、1CZ[住所] ← [住所] + A + C
0010011住所SUBC アドレス、A≈SUBWFB アドレス、1CZ[住所] ← [住所] − A − C
0010100住所ANDアドレス、AANDWFアドレス、1Z[ addr ] ← [ addr ] & A、論理積
0010101住所またはアドレス、AIORWFアドレス、1Z[ addr ] ← [ addr ] | A、論理和
0010110住所XORアドレス、AXORWFアドレス、1Z[ addr ] ← [ addr ] ^ A、排他的論理和
0010111住所MOVアドレス、AMOVWFアドレス[住所] ← A
0011000住所ADD A、アドレスADDWFアドレス、0CZA ← A + [住所]
0011001住所SUB A、アドレス≠SUBWFアドレス,0CZA ← A − [住所]
0011010住所ADDC A、アドレスADDWFCアドレス、0CZA ← A + [住所] + C
0011011住所SUBC A、アドレス≠SUBWFB アドレス、0CZA ← A − [住所] − C
0011100住所AND A、アドレスANDWFアドレス、0ZA ← [A] & [ addr ]、論理積
0011101住所またはA、アドレスIORWFアドレス、0ZA ← A | [ addr ]、論理和
0011110住所XOR A、アドレスXORWFアドレス、0ZA ← A ^ [ addr ]、排他的論理和
0011111住所MOV A、アドレスMOVFアドレス、0ZA ← [住所]
010オペコード住所メモリ上の1オペランド演算
0100000住所ADDCアドレスCZ[住所] ← [住所] + C
0100001住所SUBCアドレスCZ[住所] ← [住所] − C
0100010住所IZSNアドレスINCFSZアドレス、1CZ[ addr ] ← [ addr ] + 1、ゼロの場合はスキップ
0100011住所DZSNアドレスDECFSZアドレス、1CZ[ addr ] ← [ addr ] − 1、ゼロの場合はスキップ
0100100住所INCアドレスINCFアドレス、1CZ[住所] ← [住所] + 1
0100101住所12進アドレスDECFアドレス、1CZ[住所] ← [住所] − 1
0100110住所クリアアドレス≈CLRFアドレス[住所] ← 0
0100111住所XCHアドレスA ← [住所], [住所] ← A
0101000住所アドレスではないCOMFアドレス、1Z[ addr ] ← ~[ addr ], ビット補数
0101001住所NEGアドレスZ[ addr ] ← −[ addr ], 反転
0101010住所SRアドレス≈LSRFアドレス、1C[ addr ] ← [ addr ] >> 1、論理右シフト
0101011住所SLアドレス≈LSLFアドレス、1C[ addr ] ← [ addr ] << 1、左シフト
0101100住所SRCアドレスRRFアドレス、1C[ addr ] ← C << 7 | [ addr ] >> 1、キャリーを挟んで右回転
0101101住所SLCアドレスRLFアドレス、1C[ addr ] ← [ addr ] << 1 | C、キャリーを左に回転
0101110住所CEQSNアドレスCZA − [ addr ] を計算し、ゼロの場合はスキップする
0101111住所(CNEQSN 用に予約済み)
011OPCC少し住所I/Oによるビット操作
01100少し住所T0SN  ioaddr . bBTFSC ioaddrb[ ioaddr ] のビットbがクリアされている場合はスキップする
01101少し住所T1SN  ioaddr . bBTFSS ioaddrb[ ioaddr ] のビットbが設定されている場合はスキップする
01110少し住所SET0 ioaddr . bBCF ioaddrb[ ioaddr ] のビットbをクリアする
01111少し住所SET1 ioaddr . bBSF ioaddrb[ ioaddr ] のビットbを設定する
10オペコードリテラルリテラル演算: A ← OP(A, k )
10000A、kを追加追加kCZA ← A + k
10001サブA、k≠SUBLW kCZA ← A − k
10010CEQSN A、kCZA − kを計算し、ゼロの場合はスキップする
10011(CNEQSN 用に予約済み)
10100そしてA、k≈ANDLW kZA ← A & k
10101またはA、k≈IORLW kZA ← A | k
10110XOR A、k≈XORLW kZA ← A ^ k
10111移動 A、kMOVLW kA ← k
11c制御転送: PC ← k
110後藤k後藤kPC ← k
111コールkコールkPCを押してから、PC ← kを押します
1 21 11 09876543210ニモニックPIC相当C ?Z ?説明

14 ビット、15 ビット、16 ビットの命令セットは、主にアドレス フィールドが広い点が異なりますが、いくつかの追加命令 (CNEQSN比較を実行して等しくない場合はスキップする など) を可能にするためにエンコードの変更が行われます。

14ビットパダウク命令セット[ 24 ] [ 25 ]
1 31 21 11 09876543210ニモニックPIC相当C ?Z ?説明
0000000000オペコードその他の命令は13ビットと同じ
0000000001(予約済み)
000000001(予約済み)
000000010(予約済み)
0000000110オペコードAの1オペランド命令は13ビットと同じ
0000000111オペコードシステム制御命令は13ビットと同じ
00000010(予約済み)
00000オペコード住所バイト幅のI/O操作は13ビットと同じですが、オペコードが変更されました
00000011ioaddrXOR ioaddr、AIO[ioaddr] ← A ^ IO[address]
0000010(予約済み)
00000110ioaddrMOV ioaddr ,AIO[ioaddr] ← A
00000111ioaddrMOV A、ioaddrZA ← IO[ioaddr]
00001013ビットと同じリテラル定数を返す
000011c住所c16ビット操作は13ビットと同じですが、範囲は128バイトです
00010少し住所ビットをI/Oにコピー
00010少し住所SWAPC  ioaddr . bCキャリーを[ ioaddr ]ビットbと交換する
00011cd住所追加の2オペランド演算
0001100住所COMP A、アドレスCZA − [アドレス]、フラグ設定、結果は破棄
0001101住所COMPアドレス、ACZ[ addr ] − A、フラグ設定、結果は破棄
0001110住所NADD A、アドレスSUBWF アドレス、0CZA ← [住所] + −A (A ← [住所] + ~A + 1)
0001111住所NADDアドレス、ACZ[住所] ← A + −[住所] ([住所] ← A + ~[住所] + 1)
001dオペコード住所2オペランド命令は13ビットと同じ
010オペコード住所13ビットと同じメモリ上の1オペランド演算、さらにCNEQSN
0101111住所CNEQSNアドレスCZA − [ addr ] を計算し、ゼロでない場合はスキップする
011OPCC少しioaddr13ビットと同じI/Oでのビット操作ですが、範囲は64バイトです
100OPCC少し住所13ビットと同じメモリでのビット操作ですが、範囲は64バイトです
101オペコードリテラルリテラル演算は13ビットと同じ、さらにCNEQSN
101011CNEQSN A、kCZA − kを計算し、ゼロでない場合はスキップする
11c制御転送は13ビットと同じ
1 131 21 11 09876543210ニモニックPIC相当C ?Z ?説明

PIC18ハイエンドコアデバイス(16ビット)

2000年、マイクロチップ社はPIC18アーキテクチャを発表しました。[ 26 ] 17シリーズとは異なり、PIC18は非常に人気があり、現在も多数のデバイスバリエーションが製造されています。以前のデバイスではアセンブリ言語でプログラミングされることが多かったのに対し、C言語が主流の開発言語となっています。[ 27 ]

PIC18は12ビットのRAMアドレス空間を持ち、256バイト×16ページに分割されています。8ビットのフィールドは、ビットと4ビットのバンク選択レジスタ()fとの組み合わせでアドレスを決定します。 =0の場合、は無視され、フィールドは0x000~0x07F(グローバルRAM)または0xF80~0xFFF(特殊機能レジスタ)の範囲に符号拡張されます。=1の場合、フィールドは で拡張され、12ビットのアドレスが生成されます。 aBSRaBSRfafBSR

PIC18 は、以前の PICmicro プロセッサで間接アドレス指定に使用されていた FSR/メカニズムを 2 つの方法で拡張します。INDF

まず、3つのファイル選択レジスタを備えています。これらのレジスタは12ビット長(それぞれが2つの8ビット部分に分割され、から まで)で、対応するレジスタ(から)へのアクセスは、アドレス指定されたバイトのエイリアスとして機能します。 FSRnFSR0LFSR2HINDFnINDF0INDF2

2つ目は、アドレッシングモードです。3つのモードそれぞれに1つではなく5つのレジスタがあり、使用されるレジスタによってアドレッシングモードが決まります。 INDFn

  • INDFn: 位置のバイトにアクセスFSRn
  • POSTDECn: のバイトにアクセスし、デクリメントするFSRnFSRn
  • POSTINCn: のバイトにアクセスし、インクリメントするFSRnFSRn
  • PREINCn: をインクリメントし、インクリメントされたバイトにアクセスしますFSRnFSRn
  • PLUSWn: バイトにアクセスします(インデックス アドレス指定)。FSRn + W

12 ビット アドレスを持つ FSR ペアを直接ロードする命令や、MOVFF2 つの 12 ビット アドレス間でバイトを移動する命令もあります。

PIC18 16ビット命令セット[ 28 ]
1 51 41 31 21 11 09876543210ニモニックC ?Z ?ん?説明
00000000オペコードその他の指示
0000000000000000いいえ操作なし
0000000000000011寝るスタンバイモードに入る
0000000000000100CLRWDTウォッチドッグタイマーを再起動する
0000000000000101押すPCをスタックの一番上にプッシュする
0000000000000110ポップスタックの一番上をポップ(そして捨てる)
0000000000000111DAWC小数点調整 W
0000000000001000TBLRD∗表の読み取り: TABLAT ← mem[TBLPTR]
0000000000001001TBLRD∗+ポストインクリメントによるテーブル読み取り
0000000000001010TBLRD∗−ポストデクリメントによるテーブル読み取り
0000000000001011TBLRD+∗事前増分によるテーブル読み取り
00000000000011モッドTBLWRテーブル書き込み、TBLRDと同じモード
000000000001000sRETFIE [, FAST]割り込みからの復帰
000000000001001s戻る [, 高速]サブルーチンからの戻り
0000000000010100コールW *PCを押してPCLATU:PCLATH:Wにジャンプします
0000000011111111リセット000ソフトウェアリセット
00000001—0—MOVLBリテラルkをバンク選択レジスタに 移動する
00001オペコードリテラルリテラル演算: W ← OP(k,W)
00001000サブLW kW ← k − W
00001001IORLW kW ← k | W、論理和
00001010XORLW kW ← k ^ W、排他的論理和
00001011ANDLW kW ← k & W、論理積
00001100RETLW kリターン W ← k
00001101MULLW kW ← k × W
00001110MOVLW kW ← k
00001111追加kW ← k + W
0オペコードd1つの登録するALU演算: dest ← OP(f,W)
00000011つのfMULWF faPRODH:PRODL ← W × f (符号なし)
000001d1つのfDECF fdaCZ宛先 ← f − 1
000100d1つのfIORWF fdaZdest ← f | W、論理和
000101d1つのfANDWF fdaZdest ← f & W、論理積
000110d1つのfXORWF f , d , aZdest ← f ^ W、排他的論理和
000111d1つのfCOMF fdaZdest ← ~f、ビット補数
001000d1つのfADDWFC fdaCZ目的地 ← f + W + C
001001d1つのfADDWF fdaCZ目的地 ← f + W
001010d1つのfINCF fdaCZ宛先 ← f + 1
001011d1つのfDECFSZ f , d , adest ← f − 1, 0の場合はスキップ
001100d1つのfRRCF fdaCZdest ← f>>1 | C<<7、キャリーを介し右回転
001101d1つのfRLCF fdaCZdest ← f<<1 | C、キャリーを挟んで左回転
001110d1つのfSWAPF fdadest ← f<<4 | f>>4、ニブルを交換
001111d1つのfINCFSZ fdadest ← f + 1、0の場合はスキップ
010000d1つのfRRNCF fdaZdest ← f>>1 | f<<7、右回転(繰り上がりなし)
010001d1つのfRLNCF fdaZdest ← f<<1 | f>>7、左回転(繰り上がりなし)
010010d1つのfINFSNZ fdadest ← f + 1、0でない場合はスキップ
010011d1つのfDCFSNZ fdadest ← f − 1、0でない場合はスキップ
010100d1つのfMOVF f , d , aZ宛先 ← f
010101d1つのfSUBFWB fdaCZ宛先 ← W + ~f + C (宛先 ← W − f − C̅)
010110d1つのfSUBWFB fdaCZ目的地 ← f + ~W + C (目的地 ← f − W − C̅)
010111d1つのfSUBWF fdaCZ目的地 ← f − W (目的地 ← f + ~W + 1)
0110オペコード1つの登録するALU演算、Wに書き込まない
01100001つのfCPFSLT faf < W (符号なし)の場合はスキップ
01100011つのfCPFSEQ faf == Wの場合はスキップ
01100101つのfCPFSGT faf > W (符号なし)の場合はスキップ
01100111つのfTSTFSZ faf == 0の場合はスキップ
01101001つのfSETF faf ← 0xFF
01101011つのfCLRF fa1f ← 0, PSR.Z ← 1
01101101つのfNEGF faCZf ← −f
01101111つのfMOVWF faf ← W
0111少し1つのfBTG fbaトグルビットb/f
10OPCC少し1つの登録するビット操作
1000少し1つのfBSF fbafのビットbを設定する
1001少し1つのfBCF fbafのビットbをクリア
1010少し1つのfBTFSS fbafのビットbが設定されている場合はスキップする
1011少し1つのfBTFSC f , b , afのビットbがクリアされている場合はスキップする
110OPCC住所大規模アドレス操作
1100ソースMOVFF sd絶対移動
1111行き先
11010nブラnPC + 2 nへの分岐
11011nRCALL nPC + 2 nへのサブルーチン呼び出し
11100条件付きn条件分岐(PC+2 nへ)
11100000nBZ nPSR.Zが設定されている場合は分岐する
11100001nBNZ nPSR.Zがクリアの場合に分岐
11100010n紀元前nPSR.Cが設定されている場合は分岐する
11100011nBNC nPSR.Cがクリアなら分岐
11100100nBOV nPSR.Vが設定されている場合は分岐する
11100101nBNOV nPSR.Vがクリアの場合に分岐
11100110nBN nPSR.Nが設定されている場合は分岐する
11100111nBNN nPSR.Nがクリアの場合に分岐
111010OPCCFSR2 をソフトウェア スタック ポインターとして使用するための拡張機能*
11101000nADDFSR n , k *FSRn += k
1110100011ADDULNK k *FSR2 += k、PC をポップ
11101001nSUBFSR n , k *FSRn −= k
1110100111SUBULNK k *FSR2 −= k、PCをポップ
11101010プッシュk *[FSR2] ← k、FSR2をデクリメント
111010110sMOVSF srcf *f ← FSR2[s]
1111f
111010111sMOVSSソース宛先*FSR2[d] ← FSR2[s]
1111—0—d
111011OPCC2語の指示
1110110sk (LSビット)CALL k [, 高速]サブルーチンを呼び出す(20ビットアドレス)
1111k (ミリ秒)
1110111000fk (msb)LFSR f , k12ビットリテラルをFSR fに移動する
11110000k (LSビット)
11101111k (LSビット)後藤k絶対ジャンプ、PC ← k(20ビットアドレス)
1111k (ミリ秒)
1111操作なし、2ワード命令の2番目のワード
1 51 41 31 21 11 09876543210ニモニックC ?Z ?ん?説明

*: これらの拡張命令は一部のモデルでのみ使用可能であり、その場合でもXINST構成ビットが設定されている場合にのみ使用可能です。

Hycon クローン (16 ビット)

Hycon Technologyは、PIC18に非常によく似た「H08」CPUコアを搭載したマイクロコントローラシリーズ(型番プレフィックスHY10からHY17)を製造しています。オペコードの割り当ては公開されていないようですが、[ 29 ] H08A命令セットはPIC18のものと非常によく似ています。ニーモニックの変更点が多数あり(例えば、無条件相対分岐はBRAMicrochip社ではJRHycon社で呼び出されます)、機能面でも若干の変更が見られます。[ 30 ]

  • H08A には 3 つではなく 2 つの FSR/IND レジスタがあります。
  • H08A の ROM スペースは 14 ビット、RAM スペースは 11 ビットと小さいですが (PIC18 では最大 20 ビットと 12 ビット)、これがアーキテクチャ上の制限なのか、それとも現在の製品だけの制限なのかは明らかではありません。
  • H08AにはPIC18 、PUSH[ 31 ] 、、、、、、、DAW命令がTBLWRありません。CALLWRESETMOVFSUBFWBNEGF
  • PIC18 のMOVF命令の代わりに、H08 には がありMVF、これは W をメモリ位置 fに移動しますが、フラグは設定しません。
  • H08A は と のみをサポートしますTBLR *。PIC18TBLR *+TBLRD *-またはに相当するものはありませんTBLRD +*
  • H08CLRF命令は Z フラグを変更しません (PIC18 がそれを設定します)。
  • PIC18 の 4 つの回転命令に加えて、H08A にはARLC( と同じですが、符号ビットRLCFが変化するとオーバーフロー フラグも設定します) と(ソースの msbit を保持する算術右シフト)があります。ARRC
  • H08A には、MVLP14 ビットの即値を ROM テーブル ポインタ レジスタにコピーする命令があります。
  • に加えてSLP、H08A にはIDLE命令があります。

縮小版H08Bも存在します。これはH08Aと以下の点で異なります。[ 32 ] [ 31 ]

  • H08B には FSR/INDF レジスタ ペアが 1 つだけあります。
  • 一部の[ 33 ]にはPIC18の追加のアドレス指定モードレジスタがなく、基本的なFSR0/INDF0ペアのみを備えていますが、 [ 34 ]にはすべてはありません。
  • H08A と説明書が欠けてARLCARRCますMVLP
  • PIC18 および H08A の「高速」コール/リターン オプションに使用されるシャドウ レジスタがありません。
  • PIC18 の乗算 (およびMULLW) MULWF、相対分岐 ( BRA、およびによるRCALL条件分岐)、、、、、および命令に相当するものがありません。BZBNNMOVLBLFSRMOVFFPOPTBLRD

H08CとH08Dのバリエーションもあり、これらはH08Aのわずかに拡張されたバージョンですが、追加された機能は明確ではありません。[ 35 ] H08C [ 36 ]とH08D [ 37 ]には、3番目のFSR2 / INDF2レジスタペアが含まれています。

PIC24およびdsPIC 16ビットマイクロコントローラ

2001年、マイクロチップ社はdsPICシリーズのチップ[ 38 ]を発表し、 2004年後半に量産に入りました。これはマイクロチップ社初の16ビットマイクロコントローラです。PIC24デバイスは汎用マイクロコントローラとして設計されています。dsPICデバイスには、さらに デジタル信号処理機能も搭載されています。

命令には主に2種類あります。1つは古典的な1オペランドPIC命令のようなもので、W0と指定されたfレジスタ(つまりRAMの最初の8K)の値との間で演算を行い、結果で更新されるデスティネーション選択ビットを選択します。Wレジスタはメモリマップされているため、fオペランドでWレジスタを指定することもできます。

PIC24 に新しく追加されたもう 1 つの形式では、3 つの W レジスタ オペランドが指定され、そのうち 2 つは 3 ビットのアドレッシング モード指定を可能にします。

PIC24のアドレス指定モード
ソースオペランド宛先オペランド説明
pppレジ構文qqqレジ構文
000しーっW s000ddddW d直接登録
001しーっ[W s ]001dddd[W d ]間接的
010しーっ[W s −−]010dddd[W d −−]後置デクリメントによる間接
011しーっ[W s ++]011dddd[W d ++]ポストインクリメントによる間接
100しーっ[−−W s ]100dddd[−−W d ]事前減分による間接
101しーっ[++W s ]101dddd[++W d ]プリインクリメント付き間接
11kクックッ# u5(未使用、違法)5ビットの符号なし即値
11しーっ[W s +W w ]11dddd[W d +W w ]レジスタオフセットによる間接

レジスタオフセットアドレッシングモードは命令でのみ使用可能であり、Wwレジスタをソース、デスティネーション、またはその両方のレジスタオフセットとして使用できます。その他の命令では、代わりに符号なし5ビットの即値ソースとしてこのエンコーディングが使用されます。 MOV src,dst

TBLRDプログラム メモリにアクセスするおよびのオペランドについてはTBLWT、間接モードのみが許可され、コード メモリ内のアドレスを参照します。

いくつかの命令は2ワード長です。2番目のワードはNOPで、最大16ビットの追加の即値オペランドを含みます。

PIC24 24ビット命令セット[ 39 ]
2 32 22 12 01 91 81 71 61 51 41 31 21 11 09876543210ニモニックC ?Z ?ん?説明
0000オペコードオフセット管理権の移転
00000000いいえ操作なし
00000000—0—< 22:16>CALL/GOTOアドレス23(2番目の単語)
00000000nDO # kアドレス(2番目の単語)
000000010OPCC—0—1つの計算制御転送(16ビットWaへ)
00000001000—0—1つのR aに電話するPCを押してWaにジャンプ
00000001001—0—1つのRCALL R aPCを押してPCにジャンプ+2×Wa
00000001010—0—1つの後藤 R a倭へジャンプ
00000001011—0—1つのブラR aPC+2×Waへジャンプ
00000010n <15:1>0アドレス23を呼び出す PCを押して絶対アドレスにジャンプ
—0——0—< 22:16>
00000011(予約済み)
00000100n0GOTO アドレス23絶対アドレスにジャンプ
—0——0—< 22:16>
000001010BdRETLW[.B] # k ,W dWd = k、PCをポップ
0000011000—0—戻るポップPC
0000011001—0—レティフィーCZポップSR、PC
00000111nRCALLアドレスPCを押し、PC += 2×s16
0000100000DO # kアドレスゼロオーバーヘッドループ:k+1は繰り返し回数、PC+2×nは最後の命令
—0—n
0000100000繰り返し # k次の命令をk+1回繰り返す
00001000nRCALLアドレスPCを押し、PC += 2×s16
0000101(予約済み)
00001101つのnBRA O a、アドレスアキュムレータがオーバーフロー/飽和している場合、PC += 2×simm16
00001111つのnBRA S a、住所
0オペコードBqdps逆引き: destsource − W w
00010BqdpsSUBR[.B] W wsrcdstCZdst ← src − Ww = src + ~Ww + 1)
00011BqdpsSUBBR[.B] W wsrcdstCZdst ← src − Ww − C̅ = src + ~Ww + C
0010dMOV # k ,W dワード ← #imm16
0011条件付きnPC+2× nへの条件分岐
00110000nBRA OV、住所PSR.Vが設定されている場合
00110001nBRA C、アドレスPSR.Cが設定されている場合
00110010nBRA Z、住所...PSR.Zが設定されている場合
00110011nBRA N、住所PSR.Nが設定されている場合
00110100nBRA LE、住所...PSR.Z または PSR.N ≠ PSR.V の場合
00110101nBRA LT、住所...PSR.N ≠ PSR.V の場合
00110110nBRA LEU、住所PSR.Zが設定されているか、PSR.Cがクリアされている場合
00110111nBRAアドレス...無条件に
00111000nBRA NOV、住所PSR.Vがクリアの場合
00111001nBRA NC、住所PSR.Cがクリアの場合
00111010nBRA NZ、住所PSR.Zがクリアの場合
00111011nBRA NN、住所PSR.Nがクリアの場合
00111100nBRA GT、住所PSR.Zがクリアで、PSR.N = PSR.Vの場合
00111101nBRA GE、住所...PSR.N = PSR.Vの場合
00111110nBRA GTU、住所PSR.Zがクリアされ、PSR.Cが設定されている場合
00111111n(予約済み)
0オペコードBqdpsALU演算: dest ← OP(W w , source )
01000BqdpsADD[.B] W w , src , dstCZdst ← Ww + src
01001BqdpsADDC[.B] W wsrcdstCZdst ← Ww + src + C
01010BqdpsSUB[.B] W w , src , dstCZdst ← Ww − src
01011BqdpsSUBB[.B] W wsrcdstCZdst ← Ww − ~src − C̅ = Ww + ~src + C
01100BqdpsAND[.B] W wsrcdstZdst ← Ww & src
01101BqdpsXOR[.B] W wsrcdstZdst ← Ww ^ ソース
01110BqdpsIOR[.B] W wsrcdstZdst ← Ww | src
01111BqdpsMOV[.B] src , dstZdst ← src (オフセットモードが許可されます)
10000fdMOV f、W dWd ← f
10001fs移動 W sff ← Ws
10010BdsMOV[.B] [W s + s10 ],W d10ビットオフセットでロード
10011BdsMOV[.B]  Ws ,[ Wd + s10 ]10ビットオフセットで保存
10100オペコードbZB—0—psソースのビット操作
10100000b0B—0—psBSET[.B] # bソースsrcのビットbを設定する
10100001b0B—0—psBCLR[.B] # bソースsrcのビットbをクリア
10100010b0B—0—psBTG[.B] # bソースsrcのビットbをトグルする
10100011b00—0—psBTST.C # bソースCPSR.C = srcのビットbを設定します
10100011b10—0—psBTST.Z # bソースZPSR.Zをsrcのビットbに設定する
10100100bZ0—0—psBTSTS. z # bsrcC/Zsrcのビットbをテストし(CまたはZに格納)、次に設定
10100101Z0—0—psBTST. z W wソースC/ZsrcのテストビットWw
10100110b00—0—psBTSS # bソーステストビット、設定されている場合スキップ
10100111b00—0—psBTS # bソーステストビット、クリアの場合はスキップ
10101オペコードbffのビット操作
10101000bfbBSET[.B] f ,# bfのビットbを設定する
10101001bfBCLR.B f、# bfのビットbをクリア
10101010bfBTG.B f、# bトグルビットb/f
10101011bfBTST.B f、# bZfのテストビットb
10101100bfBTSTS.B f、# bZfのビットbをテストし、設定する
10101101Z0—0—psBSW. z src、W wPSW.C またはPSW.Z をsrc のビット Ww に コピーします。
10101110bfBTSS f、# bテストビット、設定されている場合スキップ
10101111bfBTSC f、# bテストビット、クリアの場合はスキップ
101100オペコードBdレジスタ即値演算: W d ← OP(W d , k )
101100000BdADD[.B] # u10 ,W dCZWd ← Wd + k
101100001BdADC[.B] # u10 ,W dCZWd ← Wd + k + C
101100010BdSUB[.B] # u10 ,W dCZWd ← Wd − k
101100011BdSUBB[.B] # u10 ,W dCZWd ← Wd − k − C̅
101100100BdAND[.B] # u10 ,W dZWd ← Wd & k
101100101BdXOR[.B] # u10 ,W dZWd ← Wd ^ k
101100110BdIOR[.B] # u10 ,W dZWd ← Wd | k
101100111BdMOV[.B] # u10 ,W dWd ← k
101101オペコードBDfALU演算: dest ← OP( f ,W0)
101101000BDfADD[.B] f [,WREG]CZ宛先 ← f + W0
101101001BDfADC[.B] f [,WREG]CZ宛先 ← f + W0 + C
101101010BDfSUB[.B] f [,WREG]CZ目的地 ← f − W0
101101011BDfSUBB[.B] f [,WREG]CZ目的地 ← f − W0 + C̅
101101100BDfAND[.B] f [,WREG]Z宛先 ← f & W0
101101101BDfXOR[.B] f [,WREG]Z宛先 ← f ^ W0
101101110BDfIOR[.B] f [,WREG]Z宛先 ← f | W0
101101111B1fMOV[.B] WREG、ff ← W0
1011100OPCCd0ps16×16→32の掛け算
101110000d0psMUL.UU W wsrc、 W dWd+1:Wd ← Ww × src (符号なし)
101110001d0psMUL.US W wsrc、 W dWd+1:Wd ← Ww × src (src 符号付き)
101110010d0psMUL.SU W wsrc、 W dWd+1:Wd ← Ww × src (Ww 符号付き)
101110011d0psMUL.SS W wsrc、 W dWd+1:Wd ← Ww × src(符号付き)
1011101OPCCBqdpsプログラムメモリアクセス(間接モードのみ)
101110100BqdpsTBLRDL[.B] srcdstdst ← ROM[TBLPAG:src] (ビット15:0)
101110101BqdpsTBLRDH[.B] srcdstdst ← ROM[TBLPAG:src] (ビット23:16)
101110110BqdpsTBLWTL[.B] srcdstROM[TBLPAG:dst] ← src (ビット15:0)
101110111BqdpsTBLWTH[.B] srcdstROM[TBLPAG:dst] ← src (ビット 23:16)
101111000B0fMUL[.B] fW3:W2 ← f × W0 (符号なし)
101111000B1(予約済み)
101111001(予約済み)
10111101(予約済み)
1011111000—0—d0psMOV.D src、W dレジスタペアのロード
1011111010qd—0—s0MOV.DW sdstレジスタペアを保存する
10111111(予約済み)
11000メートルS×yj1つのDSP MAC (dsPICのみ)
11001その他の DSP 命令 (dsPIC のみ)
1100111100—0—dpsFF1Rソース、W dC右から最初のものを探す(lsb)
1100111110—0—dpsFF1Lソース、W dC左から最初のものを探す(msb)
110100オペコードBqdps一般的なオペランドのシフト/回転
110100000BqdpsSL[.B] srcdstCZdst ← src << 1、左シフト(キャリーへ)
110100010BqdpsLSR[.B] srcdstCZdst ← src >> 1、論理右シフト
110100011BqdpsASR[.B] srcdstCZdst ← src >> 1、算術右シフト
110100100BqdpsRLNC[.B] srcdstZdst ← src <<< 1、左回転(繰り上がりなし)
110100101BqdpsRLC[.B] srcdstCZC:dst ← src:C << 1、繰り上がりで左回転
110100110BqdpsRRNC[.B] srcdstZdst ← src >>> 1、右に回転(繰り上がりなし)
110100111BqdpsRRC[.B]送信元送信先CZdst:C ← C:src >> 1、繰り上がりで右回転
110101オペコードBDfシフト/回転f
110101000BDfSL[.B] f [,WREG]CZdest ← f << 1、左シフト(キャリーへ)
110101010BDfLSR[.B] f [,WREG]CZdest ← f >> 1、論理右シフト
110101011BDfASR[.B] f [,WREG]CZdest ← f >> 1、算術右シフト
110101100BDfRLNC[.B] f [,WREG]Zdest ← f <<< 1、左回転(繰り上がりなし)
110101101BDfRLC[.B] f [,WREG]CZC:dest ← f:C << 1、繰り上がりで左回転
110101110BDfRRNC[.B] f [,WREG]Zdest ← f >>> 1、右に回転(繰り上がりなし)
110101111BDfRRC[.B] f [,WREG]CZdest:C ← C:f >> 1、繰り上がりで右回転
11011000あなたtdD00s分割ステップ(REPEAT #17 を先頭に付ける)
110110000—0—d000sDIV.SW d、W sCZW0 ← Wd/Ws、W1 ← 余り
110110000td100sDIV.SD W d、W sCZW0 ← Wt:Wd/Ws, W1 ← 余り
110110001—0—d000sDIV.UW d、W sCZW0 ← Wd/Ws、W1 ← 余り
110110001td100sDIV.UD W d、W sCZW0 ← Wt:Wd/Ws, W1 ← 余り
110110010t—0—000sDIVF W t、W sCZW0 ← Wt:0/Ws, W1 ← 余り
110110011(予約済み)
1101101(予約済み)
110111オペコードd00s複数回シフト/回転
110111000d000sSL W w、W s、W dZWd ← Ww << Ws
110111000d100SL W v、# u4、W dZWd ← Ww << k
110111100d000sLSR W w、W s、W dZWd ← Ww >> Ws、論理右シフト
110111100d100LSR W v、# u4、W dZWd ← Ww >> k、論理右シフト
110111101d000sASR W w、W s、W dZWd ← Ww >> Ws、算術右シフト
110111101d100ASR W v、# u4、W dZWd ← Ww >> k、算術右シフト
110111110—0—dpsFBCLソース、W dC許容される算術正規化シフトを見つける
111000000—0—B000psCP0[.B]ソースCZゼロと比較する、src − 0
111000010B000psCP[.B] W wソースCZ比較、Ww − src (Ww + ~src + 1)
111000011B000psCPB[.B] W wソースCZ借用と比較すると、Ww − src − C̅ (Ww + ~src + C)
111000100B0fCP0[.B] fCZゼロと比較する、f − 0
111000110B0fCP[.B] fCZ比較すると、f − W0
111000111B0fCPB[.B] fCZ借用と比較すると、f − W0 − C̅ (f + ~W0 + C)
1110010(予約済み)
1110011OPCCB—0—s比較してスキップ
111001100B—0—sCPSGT[.B] W w、W s...Ww > Wsの場合、符号付き
111001101B—0—sCPSLT[.B] W w、W s...Ww < Wsの場合、符号付き
111001110B—0—sCPSNE[.B] W w、W s...Ww ≠ Ws の場合
111001111B—0—sCPSNE[.B] W w、W s...Ww = Wsの場合
111010000BqdpsINC[.B] srcdstCZdst ← src+1
111010001BqdpsINC2[.B] srcdstCZdst ← src+2
111010010BqdpsDEC[.B] srcdstCZdst ← src−1
111010011BqdpsDEC2[.B] srcdstCZdst ← src−2
111010100BqdpsNEG[.B] srcdstCZdst ← ~src+1
111010101BqdpsCOM[.B] srcdstZdst ← ~src
111010110Bqd—0—CLR[.B] dst日付 ← 0
111010111Bqd—0—SETM[.B] dst夏時間 ← ~0
111011000BDfINC[.B] f [,WREG]CZ宛先 ← f+1
111011001BDfINC2[.B] f [,WREG]CZ宛先 ← f+2
111011010BDfDEC[.B] f [,WREG]CZ宛先 ← f−1
111011011BDfDEC[.B] f [,WREG]CZ目的地 ← f−2
111011100BDfNEG[.B] f [,WREG]CZ宛先 ← ~f+1
111011101BDfCOM[.B] f [,WREG]Z宛先 ← ~f
111011110BDfCLR[.B] f [,WREG]宛先 ← 0
111011111BDfSETM[.B] f [,WREG]宛先 ← ~0
111100メートル1×yjOPCCDSP MPY/MAC/ED/EDAC (dsPICのみ)
111101(予約済み)
11111000f0押すffをスタックの一番上にプッシュする
11111001f0ポップfスタックの上から f をポップする
1111101000リンク # u14W14を押し、W14 ← W15、W15 += k
1111101010—0—ULNKW15 ← W14、W14をポップ
1111101100000dpsSE srcdstCZdst ← sign_extend(src)、ビット7をビット15:8にコピー
1111101110000dpsZE送信元送信先1Z0dst ← zero_extend(src)、ビット15:8をクリア
1111110000DISI # u14k +1サイクル の割り込みを無効にする
1111110100000d000s交換 W s、W dレジスタWs、Wdの内容を交換する
11111101010000000000sDAW.BW sCC、DCに基づいて小数点を調整
111111011B0000000000sSWAP[.B] W sWの半分を交換する
1111111000—0—リセットソフトウェアリセット
11111110010—0—PWRSAV # u1スリープモードまたはアイドルモードに入る
11111110011—0—CLRWDTウォッチドッグタイマーをクリアする
11111110100—0—ポップスポップシャドウレジスタ(W0~3、PSRの一部)
11111110101—0—プッシュSプッシュシャドウレジスタ(W0~3、PSRの一部)
1111111011(予約済み)
11111111NOPR操作なし(バージョン #2)

参考文献

  1. ^ Gruppuso, Frank M. (1982). 「第35章 PIC1650:チップのアーキテクチャと動作」(PDF) . Siewiorek, Daniel P.; Bell, C. Gordon ; Newell, Allen (編). 『コンピュータ構造:原理と例』 (PDF) . McGraw-Hill. ISBN 0-07-057302-6. 2024年8月18日閲覧
  2. ^ PIC10F200/202/204/206 データシート(PDF) . Microchip Technology. 2007. p. 52. 2015年8月11日時点のオリジナル(PDF)からアーカイブ。 2015年1月15日閲覧
  3. ^ General Instrument. PIC1670 8ビットマイクロコンピュータ(PDF) (データシート) . 2024年8月18日閲覧
  4. ^ 「強化されたミッドレンジアーキテクチャの紹介」(PDF) . Microchip . 2022年4月18日時点のオリジナルよりアーカイブ2025年2月5日閲覧。{{cite web}}: CS1 maint: bot: 元のURLステータス不明(リンク
  5. ^ “義隆電子股份有限公司義隆電子,再創未来!” .
  6. ^ ELAN Microelectronics Corp. (2011-03-09)、M78XXX 13ビット命令セット(PDF) (アプリケーションノート)、AN EM78xxx-20110309 、 2025年1月11日取得
  7. ^ ELAN Microelectronics Corp. (2016年4月26日)、EM78P157N 8ビットマイクロコントローラ(OTP ROM搭載)製品仕様(PDF)、バージョン1.3、2016年3月4日のオリジナルからアーカイブ(PDF) 、 2020年6月6日取得
  8. ^ a b ELAN Microelectronics Corp. (2016年4月25日)、EM78P143 8ビットマイクロプロセッサ(OTP ROM搭載)製品仕様(PDF)、バージョン1.7、p. 77 、 2020年6月6日取得
  9. ^ ELAN Microelectronics Corp. (2016年4月)、EM78P346N 8ビットマイクロプロセッサ(OTP ROM搭載)製品仕様(PDF)、バージョン1.5、p. 77 、 2019年7月11日取得
  10. ^ ELAN Microelectronics Corp. (2000年4月17日)、EM78860 8ビットマイクロコントローラ(PDF)、p. 17 、 2019年7月11日取得
  11. ^ ELAN Microelectronics Corp. (2013年3月15日)、EM78F648/644/642/641N/548/544/542/541N フラッシュシリーズ 8ビットマイクロコントローラ製品仕様(PDF)、バージョン1.2、pp.  162– 165 、 2019年7月11日取得
  12. ^ Elan eUIDE II v2.19.60.14の命令エンコーディングテーブル(2019年5月1日リリース、2019年7月13日アクセス)よりファイル。Bin/*.cfg
  13. ^ ELAN Microelectronics Corp. (2014-01-14)、EM78XXX 15ビット命令セット(PDF) (アプリケーションノート)、AN EM78xxx-20140114 、 2025年1月11日取得
  14. ^ a b Holtek Semiconductor Inc. (2016年12月11日)、HT8 MCU拡張命令セットアプリケーション(PDF) (アプリケーションノート)、AN0407E 、 2024年2月9日取得
  15. ^ Holtek Semiconductor Inc. (2019年11月26日)、2.4GHz 8ビットフラッシュRF TX/RX MCU BC66F840/BC66F850/BC66F860 (PDF) (データシート)、バージョン1.60、p. 32 、 2024年2月9日取得オペランド アドレスは 0xFF までしか指定できず、追加の RAM はバンキングによってアドレス指定されることに注意してください。
  16. ^ Wolf, Ash「Ninji」(2018年12月12日)「Mouse Adventures #3: Writing a Disassembler」 。 2019年7月8日閲覧
  17. ^ Carlson, Jay (2019年9月6日). 「3セントのマイクロコントローラーってどうなってるの?(Padauk PMS150Cとその仲間のレビュー)」 . 2020年5月18日閲覧
  18. ^ a b「「ひどい」3セントMCU - 0.10ドル未満のマイクロコントローラーの簡単な調査」ティムのブログ2019年8月12日. 2020年5月18日閲覧
  19. ^ 「無料のPDKドキュメント」。Padauk µCは、Microchip PICアーキテクチャの拡張版ともいえる興味深いアーキテクチャを備えています。
  20. ^ 「ATtiny4と3セントマイクロのチップチューン:Padaukへの移植」一部の人によると、Padaukの命令セットは古いPICに大きく影響を受けており、ほとんどの操作は単一のアキュムレータレジスタで実行されるとのことです。
  21. ^ Jenny List 「入手可能な最も安価なプロセッサについて知りたいことすべて」 2019年。
  22. ^ウルフ、アッシュ「忍者」 (2018年12月12日). 「PADAUK FPPA MCU のドキュメント」GitHub2020年5月18日に取得
  23. ^ Padauk Technology Co. Ltd. (2018年12月11日). 「PMC150/PMS150 8ビットOTP型IOコントローラ」(PDF) (データシート). バージョン1.8. pp.  38– 51. PDK-DS-PMX150-EN-V108 . 2020年6月8日閲覧
  24. ^ Wolf, Ash「Ninji」(2020年5月23日)「PADAUK FPPAコアデバイス(14ビット)命令セット」 。 2020年6月8日閲覧
  25. ^ Padauk Technology Co. Ltd. (2019年6月18日). 「PFS154 8ビットMTPタイプIOコントローラ データシート」(PDF) . バージョン1.04. pp.  71– 84. PDK-DS-PFS154_RN_V104 . 2020年6月9日閲覧。
  26. ^ 「Martin DubucのSDCC PIC18Fプロジェクトページ」 . mdubuc.freeshell.org . 2025年2月24日閲覧
  27. ^ 「Microchip PIC micros と C - ソースコードとサンプルコード」
  28. ^ Microchip Technology, Inc. (2007), PIC18F1220/1320 データシート(PDF) 、 2012年4月2日取得
  29. ^ HYCON -IDE ソフトウェア ユーザーズ マニュアルの23 ~ 26 ページに、PIC18 と一致しないオペコードがいくつか記載されています。
  30. ^ 「命令セットH08A ユーザーズマニュアル」(PDF) . Hycon Technology. 2010年8月1日. APD-CORE002-V03_EN . 2025年1月4日閲覧。
  31. ^ a b「CPUコアアプリケーションの説明:命令セットH08AとH08Bの比較と補足」(PDF) Hycon Technology. 2011年3月24日. PD-CORE001_EN-V06 . 2025年1月4日閲覧。PUSHこれは、H08A の PIC18 のような命令について説明していますが、他の Hycon マニュアルには記載されていません。
  32. ^ 「命令セットH08B ユーザーズマニュアル」(PDF) . Hycon Technology. 2010年8月1日. APD-CORE003-V02_EN . 2025年1月4日閲覧。
  33. ^ 「HY14E10/HY14E10M ユーザーズガイド デジタル圧力センサープラットフォーム」(PDF) Hycon Technology. 2016年12月25日. p. 14. UG-HY14E10-V06_EN . 2025年1月4日閲覧。
  34. ^ 「HY10Pファミリー ユーザーズガイド ミックスドシグナルマイクロコントローラ」(PDF) Hycon Technology. 2017年11月17日. p. 18. UG-HY10S40-V07_EN . 2025年1月4日閲覧。
  35. ^ 「命令セットH08A、H08C、H08D ユーザーズマニュアル」(PDF) . Hycon Technology. 2020年6月1日. APD-CORE002-V04_EN . 2025年1月4日閲覧。
  36. ^ 「HY15S41 ユーザーズガイド ミックスドシグナルマイクロコントローラ」(PDF) Hycon Technology. 2017年11月16日. p. 15,17. UG-HY15S41-V04_EN . 2025年1月4日閲覧。
  37. ^ 「HY17M28 データシート:8ビットRISCライクなミックスドシグナルマイクロコントローラ、組み込み24ビットΣΔADC、低ノイズアンプ、LEDドライバ」(PDF)(繁体字中国語)。Hycon Technology。2023年7月24日。p. 27。DS-HY17M28-V01_TC 2025年1月4日閲覧。英語のデータシートは現在「作成中」です。)
  38. ^ 「マイクロチップ・テクノロジー、世界最高性能の16ビット・マイクロコントローラ「dsPIC」を発表」。 2004年12月13日時点のオリジナルよりアーカイブ。
  39. ^ dsPIC30Fプログラマーズリファレンスマニュアル(PDF)、マイクロチップテクノロジー、2008年、DS70157C 、 2012年7月2日取得