(57)【要約】【課題】論理的・物理的規模の増大を最小限とし、データ処理速度を向上する。【解決手段】命令中のディスプレースメント（基準アドレス）と、汎用レジスタ（ＥＲ０〜ＥＲ７）に割当てられるインデックスレジスタが保有する情報とから実効アドレスを計算するアドレッシングモードを設ける。メモリをアクセスするサイズに応じて、バイトであればインデックスレジスタの値を×１とし、ワードであれば×２というようにシフトする。実効アドレスの計算に、前記拡張およびシフトを含むことにより、命令数を削減し、実行ステート数も短縮できる。配列の大きさは、アドレス空間の大きさより小さいから、汎用レジスタの上位を、別のデータレジスタとして使用し、汎用レジスタに配置できるデータの量を増加でき、メモリとのリードライトの回数を削減することによって、命令数を更に削減し、プログラム容量を削減することができる。【選択図】　　　　図１
2004086837.tif 000002
【特許請求の範囲】
【請求項１】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
前記命令実行手段は、情報保持にその記憶領域の全体又は一部の利用が可能にされる汎用レジスタを有し、前記汎用レジスタの記憶領域の一部を利用する第１の命令を読み込んだとき、情報のアクセスサイズに応じて、前記第１の命令で指定された汎用レジスタの保持情報をシフトし、シフト結果をその他の情報と加算して実効アドレスの演算を行なうことを特徴とするデータ処理装置。
【請求項２】
前記命令実行手段は、前記汎用レジスタの記憶領域の全体を利用する第２の命令を読み込んだとき、前記第２の命令で指定された汎用レジスタの保持情報を、シフトを行わずにその他の情報と加算して実効アドレスの演算を行なうことを特徴とする請求項１記載のデータ処理装置。
【請求項３】
前記その他の情報は、前記第１の命令に含まれる情報であり、前記第１の命令は転送命令であることを特徴とする請求項１記載のデータ処理装置。
【請求項４】
前記第１の命令に含まれる情報は、基準となるアドレス情報であることを特徴とする請求項３記載のデータ処理装置。
【請求項５】
前記その他の情報はプログラムカウント手段が保有する命令アドレス情報であり、前記第１の命令は分岐命令であることを特徴とする請求項１記載のデータ処理装置。
【請求項６】
前記命令実行手段は、前記汎用レジスタの記憶領域の一部を利用する第３の命令を読み込んだとき、情報のアクセスサイズに応じて、その情報をシフトし、シフト結果をその他の情報と加算して演算した実効アドレスを、別の汎用レジスタに格納する処理を実行することを特徴とする請求項１又は２記載のデータ処理装置。
【請求項７】
命令をデコードするデコード手段と、デコード手段のデコード結果に基づいて演算を行なう演算手段とを有し、
前記デコード手段は、所定の命令を解読して、汎用レジスタの選択、情報のアクセスサイズ、及びシフトビット数の各制御情報を出力し、
前記演算手段は、汎用レジスタと前記汎用レジスタに接続される演算器を有し、前記制御信号により選択された汎用レジスタの上位側ビットに対する論理値“０”の０拡張、０拡張されたデータに対する前記アクセスサイズに応ずるビット数のシフト処理、及びシフト処理結果とその他の情報との加算演算を行なうことを特徴とするデータ処理装置。
【請求項８】
前記その他の情報とは命令中に含まれる基準となるアドレス情報であることを特徴とする請求項７記載のデータ処理装置。
【請求項９】
前記演算手段は前記汎用レジスタに格納されたデータのうち、前記情報のアクセスサイズによって指定されたデータのみを演算対象とすることを特徴とする請求項７記載のデータ処理装置。
【請求項１０】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
前記命令実行手段は、命令の所定フィールドの値にオフセットを組合わせ、これに、情報のアクセスサイズに応じたビット数のシフトを行い、シフトされた値にその他の情報を加算してアドレスを演算し、演算されたアドレスでメモリをリードし、リードした内容を分岐先アドレスとする、分岐命令を実行可能であることを特徴とするデータ処理装置。
【請求項１１】
前記所定フィールドは、ベクタ番号フィールドであることを特徴とする請求項１０記載のデータ処理装置。
【請求項１２】
前記オフセットは、前記所定フィールドの値の上位側を規定する０以外の情報であることを特徴とする請求項１１記載のデータ処理装置。
【請求項１３】
前記その他の情報は、命令実行手段に含まれるベクタベースレジスタが保有する情報であることを特徴とする請求項１２記載のデータ処理装置。
【請求項１４】
前記オフセットは、例外処理ベクタテーブルと重ならない別のテーブルをアクセスを可能にする値であることを特徴とする請求項１３記載のデータ処理装置。
【請求項１５】
前記その他の情報は、命令実行手段に含まれる所定のレジスタが保有する情報であることを特徴とする請求項１３記載のデータ処理装置。
【請求項１６】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
命令実行手段は、例外処理ベクタテーブルの参照に利用可能なベクタベースレジスタと、サブルーチンベクタテーブルの参照に利用可能な第１レジスタを有し、
前記命令実行手段は、命令の所定フィールドの値を、情報のアクセスサイズに応じたビット数でシフトし、シフトされた値に前記第１レジスタの値を加算してアドレスを演算し、演算されたアドレスで前記サブルーチンベクタテーブルをリードし、リードした内容を分岐先サブルーチンアドレスとする、サブルーチンコール命令を実行可能であることを特徴とするデータ処理装置。
【請求項１７】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
命令実行手段は、例外処理ベクタテーブルの参照に利用可能なベクタベースレジスタと、サブルーチンへの分岐に利用可能な第１レジスタ及び第２レジスタを有し、
前記命令実行手段は、命令の所定フィールドの値を、情報のアクセスサイズに応じたビット数でシフトし、シフトされた値に前記第１レジスタの値を加算してアドレスを演算し、演算されたアドレスでサブルーチンベクタテーブルをリードし、リードした内容に前記第２レジスタの値を加算して分岐先サブルーチンアドレスとする、サブルーチンコール命令を実行可能であることを特徴とするデータ処理装置。
【請求項１８】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
前記命令実行手段は、メモリ上のデータをリードし、命令コード中に含まれる情報との論理積をとり、前記論理積の結果に対し、前記情報の下位ビット側の第１の状態のビットが最下位ビットになるように右シフトし、前記右シフトの結果を汎用レジスタに格納するロード命令を実行可能であることを特徴とするデータ処理装置。
【請求項１９】
命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、
前記命令実行手段は、メモリ上のデータをリードし、汎用レジスタの内容を、命令コード中に含まれる情報の下位ビット側の第１の状態のビットまで左シフトし、前記情報における第１の状態のビットは前記シフトした内容を選択し、第２の状態のビットは前記リードしたメモリの内容を選択し、その結果を前記メモリに格納するストア命令を実行可能であることを特徴とするデータ処理装置。
【請求項２０】
前記命令コードは、メモリ上のアドレスを指定するための情報と、汎用レジスタを指定するための情報とを含むことを特徴とする請求項１８又は１９記載のデータ処理装置。
【請求項２１】
前記命令実行手段は中央処理装置であり、１個の半導体基板に形成されて成ることを特徴とする請求項１、１０、１６、１８又は１９に記載のデータ処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、マイクロコンピュータ、データプロセッサ又はマイクロプロセッサ等のように称されるデータ処理装置に関し、例えば中央処理装置（ＣＰＵ）に利用してそのプログラム効率もしくはコード効率の向上に有効な技術に関するものである。
【０００２】
【従来の技術】
半導体集積回路化されたマイクロコンピュータは、アドレス空間の拡張や、命令セットの拡大、高速化などが図られてきた。オブジェクトレベルで互換性を保ちつつ、アドレス空間の拡張や、命令セット拡大を実現した例として、例えば、特許文献１並びに特許文献２等がある。それによれば、３２ビットの汎用レジスタは、アドレスレジスタとしては、３２ビットレジスタとして使用可能である。データレジスタは、３２ビットレジスタとして使用するか、分割して１６ビットレジスタとして使用するか、下位側の１６ビットレジスタを更に分割して、８ビットレジスタとして使用するかを選択できる。また、特許文献３にはアドレス空間の大きさを示すレジスタを設け、その値によってアドレスデータを格納する汎用レジスタの大きさを可変にするプロセッサについて記載が有る。プログラム用のメモリであるＲＯＭを内蔵した、シングルチップ型のものにあっては、内蔵ＲＯＭの容量が、外部に接続可能なメモリに比較して、少ないから、プログラム容量を削減することが望ましい。
【０００３】
また、近年、シングルチップ型のマイクロコンピュータのＲＯＭとして、電気的に書込み消去が可能なフラッシュメモリ、ＥＥＰＲＯＭ（電気的に書込み消去可能なＲＯＭ）が用いられることが多い。これらの電気的に書込み消去が可能なメモリは、記憶素子が大きく、また、書込み消去用の高電圧発生回路などが必要であって、その物理的規模が大きくなってしまうため、より一層、プログラム容量の削減が望ましい。内蔵ＲＡＭについても同様であり、使用するデータの容量を小さくできる方が望ましい。
【０００４】
一方、マイクロコンピュータのプログラムを、Ｃ言語などの高級言語で記述することが増えてきている。高級言語で記述する場合、アセンブリ言語で記述する場合に比較して、プログラム容量および使用するデータの容量が大きくなりやすい。
【０００５】
レジスタ間接などのアドレシングモードについて記載された文献の例として特許文献４及び特許文献５がある。特許文献４にはディスプレースメント付きレジスタ間接アドレシングモードを持つデータ処理装置につての記載が有る。特許文献５にはディスプレースメント付きレジスタ間接アドレス指定モードを持つデータ処理装置につての記載が有る。
【０００６】
【特許文献１】
特開平５−２４１８２６号公報
【特許文献２】
特開平６−５１９８１号公報
【特許文献３】
特開平６−１０３０６３号公報
【特許文献４】
特開平４−３３３１５３号公報
【特許文献５】
特開平１０−４９３６９号公報
【０００７】
【発明が解決しようとする課題】
本発明者らは、プログラム容量および使用するデータの容量の削減について以下の観点で検討を行った。
【０００８】
第１の観点は配列などの実効アドレス計算の観点である。ディスプレースメント付きレジスタ間接と称し、汎用レジスタに保持されたアドレスに、命令コード中に含まれるディスプレースメントを加算して実効アドレスを生成し、この実効アドレスのリード／ライトを行うアドレッシングモードがある。これを用いて、所定のアドレス（ＴＯＰ）から始まる領域に配置されたワードサイズデータの配列に対し、汎用レジスタ（Ｒ０Ｌ）に格納された番号のデータ（例えばｎ番目を意味するデータ）をリードする場合、配列の番号をアドレスレジスタとして使用するため、その番号データを３２ビットにゼロ拡張（命令ＥＸＴＵ．Ｗにより８ビットから１６ビット、ＥＸＴＵ．Ｌにより１６ビットから３２ビットの２回に分けて実行）し、さらに、ワードサイズデータに対応して×２（命令ＳＨＬＬによる左１ビットシフト）した後、命令ＭＯＶ．Ｗによりメモリアクセスを行う必要がある。これは例えば、
ＥＸＴＵ．Ｗ　　Ｒ０
ＥＸＴＵ．Ｌ　　ＥＲ０
ＳＨＬＬ．Ｌ　　ＥＲ０
ＭＯＶ．Ｗ　　　＠（ＴＯＰ：１６，ＥＲ０），Ｅ０
のように記述される。
【０００９】
同様に、汎用レジスタに保持されたアドレスに、インデックスを付加することも考えられる。
【００１０】
第２の観点は実効アドレス計算の繰返しに関する。配列アクセスにおいて同じアドレスを複数回使用する場合があり、このとき同じ実効アドレス計算を何回も繰返していては非能率的である。
【００１１】
第３の観点はプログラムカウンタ相対のような分岐命令に関する。この分岐命令はプログラムカウンタ相対と称し、プログラムカウンタの内容に、命令コード中に含まれるディスプレースメントを加算して実効アドレスを生成し、この実効アドレスに分岐するアドレッシングモードを有する。このとき、複数の分岐先があるような場合には、分岐先毎に別々にプログラムカウンタ相対の分岐命令の記述が必要になる。
【００１２】
第４の観点はメモリ間接のような分岐命令に関する。同一のアドレスに複数箇所から分岐される場合がある。この場合、分岐先アドレスをテーブルとして格納し、分岐命令自体の命令コードを短縮することが考えられる。メモリ間接と称し、１６ビット（２バイト）の命令コード中に、８ビットのアドレス情報を持ち、このアドレス情報で分岐先アドレスのテーブルを参照し、この分岐テーブルをリードし、リードした内容に基づいて、分岐を行うアドレッシングモードがある。一方、分岐先アドレス（例えば２４ビット）を、命令コード中に持つ分岐命令は３２ビット長（４バイト）などとなってしまうから、分岐テーブルを３２ビット単位とすれば、同一のアドレスに分岐する分岐命令があれば、前記メモリ間接を使用した方が効率的である。しかしながら、その方式は、用意できる分岐テーブルの数や容量に制限を受け、また、分岐テーブルは例外処理のベクタと共通になることが考えられ、使い勝手が悪くなることも想定される。
【００１３】
第５の観点はＲＡＭの効率的な使用の観点である。３ビットで表現されるなど、８ビットに満たないデータがある場合、１つのアドレス（バイト単位）に、複数のデータを格納できれば、ＲＡＭエリアの使用効率が上がる。例えば、１つのアドレスに下位から、３ビット、３ビット、２ビットのデータを格納することができる。これらの３ビット、３ビット、２ビットのデータを、Ｃ言語でソースプログラムを記述する場合、ビットフィールドで宣言する。例えば、上記の例では、
2004086837.tif 000003
などと定義される。
【００１４】
このビットフィールドデータｂｂを操作する場合、通常汎用レジスタに取り出す。このプログラム例は、
ＭＯＶ．Ｂ　　　＠ａｂｃ，Ｒ０Ｌ
ＡＮＤ．Ｂ　　　＃８’ｂ００１１１０００，Ｒ０Ｌ
ＳＨＬＲ．Ｂ　　＃３，Ｒ０Ｌ
などとされる。つまり、一旦、メモリから、バイト単位で、汎用レジスタにリードし、所望のビットフィールド以外を０にクリアし、所望のビットフィールドが下位詰めになるように３ビットシフトを行う。１ビットシフトしかサポートされていない命令セットでは、ＳＨＬＲ命令は３個必要である。
【００１５】
操作後、メモリに格納する場合は、
ＭＯＶ．Ｂ　　　＠ａｂｃ，Ｒ１Ｌ
ＡＮＤ．Ｂ　　　＃８’ｂ１１０００１１１，Ｒ１Ｌ
ＳＨＬＬ．Ｂ　　＃３，Ｒ０Ｌ
ＯＲ．Ｂ　　　　　　　　Ｒ１Ｌ，Ｒ０Ｌ
ＭＯＶ．Ｂ　　　Ｒ０Ｌ，＠ａｂｃ
などの命令実行が必要とされる。つまり、一旦、格納すべきメモリのデータを汎用レジスタにリードし、所望のビットフィールドを０にクリアする。一方、格納すべきデータを、所望のビットフィールド位置になるようにシフトを行う。両者の論理和をとり、結果をメモリに格納する。
【００１６】
ビットフィールドによって、メモリ（ＲＡＭ）の使用量は節約できるものの、プログラム容量が増加してしまう。８ビットに満たないデータもバイト単位（例えば、下位詰めで、上位は０とする）で扱えば、操作は容易になり、プログラム容量は増えないが、メモリ（ＲＡＭ）の使用量が増えてしまう。
【００１７】
本発明は上記検討内容に鑑みてなされたものである。本発明の目的は、プログラム容量（使用するＲＯＭ容量）を削減可能にすることである。
【００１８】
本発明の別の目的は、使用するデータ容量（使用するＲＡＭ容量）を削減可能にすることである。
【００１９】
本発明の更に別の目的は、論理的・物理的規模の増大を最小限とし、処理速度を向上することである。
【００２０】
本発明の前記ならびにそのほかの目的と新規な特長は、本発明書の記述および添付図面か明らかになるであろう。
【００２１】
【課題を解決するための手段】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００２２】
〔１〕［配列などの実効アドレス計算］
本発明に係るデータ処理装置は、命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、前記命令実行手段は、情報保持にその記憶領域の全体又は一部の利用が可能にされる汎用レジスタを有し、前記汎用レジスタの記憶領域の一部を利用する第１の命令を読み込んだとき、情報のアクセスサイズに応じて、前記第１の命令で指定された汎用レジスタの保持情報をシフトし、シフト結果をその他の情報と加算して実効アドレスの演算を行なう。
【００２３】
詳しくは、例えば、命令中に記述されている基準となるアドレス情報即ち基準アドレス（例えば命令中のディスプレースメントにより与えられる）と、汎用レジスタに割当てられるインデックスレジスタの情報（例えば配列上で第何番目かを示す情報）とから実効アドレスを計算して、メモリをアクセスするアドレッシングモード（ディスプレースメント付きインデックスレジスタ間接アドレシングモード）を設ける。メモリをアクセスするサイズに応じて、バイトであればインデックスレジスタ（アドレスに加算される値を保有するレジスタ）の値を×１とし、ワードであれば×２とし、ロングワードであれば×４というようにシフトする。また、独立に、インデックスレジスタのサイズを、３２ビット、１６ビット、８ビットから選択可能にしてよい。例えば、配列の大きさが２５６以下であれば、インデックスレジスタは８ビットあればよく、同一の汎用レジスタの上位は、別のデータレジスタとして使用可能になる。要するに、汎用レジスタに格納されたデータのうち、アクセスサイズによって指定されたデータのみを演算対象とし、汎用レジスタの上位側は元の情報を保持（若しくは維持）することが可能である。
【００２４】
ディスプレースメント付きインデックスレジスタ間接アドレシングモードを採用する第１の命令は、例えば
ＭＯＶ．Ｗ　Ｅ０，＠（ｄ：１６，Ｒ０Ｌ）
と表記される転送である。ＣＰＵは、このアドレシングモードに対して、汎用レジスタをゼロ拡張し、シフトし、ディスプレースメントなどと、加算し、この結果をアドレスとして利用可能にする機能を持つ。
【００２５】
実効アドレスの計算に、前記ゼロ拡張およびシフトを含むことによって、命令数を削減し、実行ステート数も短縮できる。配列の大きさは、アドレス空間の大きさより小さいから、汎用レジスタの上位を、別のデータレジスタとして使用し、汎用レジスタに配置できるデータの量を増加でき、メモリとのリードライトの回数を削減することによって、命令数を更に削減し、プログラム容量を削減することができる。従来、複数の命令を組合せて、配列のアクセスをしている場合に比較して、処理速度を向上させることができる。
【００２６】
〔２〕［配列などの実効アドレス計算用ＭＯＶＡ命令］
また、本発明の望ましい一つの態様として、前記命令実行手段は、前記汎用レジスタの記憶領域の一部を利用する第３の命令を読み込んだとき、情報のアクセスサイズに応じて、その情報をシフトし、シフト結果をその他の情報と加算して演算した実効アドレスを、別の汎用レジスタに格納する処理を実行する。即ち、上記実効アドレスの計算を行って、メモリをアクセスせずに、その実効アドレスを汎用レジスタに格納する実効アドレス転送命令（ＭＯＶＡ）を設ける。実効アドレスの計算時点では、データのサイズが分からないため、データのサイズに対応する命令を複数用意する。例えば、前記同様の実効アドレス計算を行って、汎用レジスタ（ＥＲ１）に格納する命令は、
ＭＯＶＡ／Ｗ　＠（ｄ：１６，Ｒ０Ｌ），ＥＲ１
のように記述する。上記記述において、／Ｗが、実効アドレスを使用してメモリをアクセスするときの、即ち、配列の、データサイズである。
【００２７】
同じアドレスを複数回使用する場合もあるので、汎用レジスタに格納しておけば、２回目以降はディスプレースメントを必要としないので、プログラム容量を削減でき、また、実行ステート数も短縮できる。
【００２８】
ＣＰＵの演算機能としては、前記ディスプレースメント付きインデックスレジスタ間接アドレシングモードと同様であり、汎用レジスタを拡張し、シフトし、加算し、この結果を汎用レジスタに格納する機能を持つようにする。本命令は、実質的には、演算命令であって、直接的にメモリをアクセスしない。このため、インデックスとして使用するデータを、メモリ上からリードしてもさほど、命令実行シーケンスは複雑にならない。上記ディスプレースメント付きインデックスレジスタ間接アドレシングモードの実効アドレス計算と共通の演算とすることができ、配列などの実効アドレス計算用ＭＯＶＡ命令を追加しても其れによる論理的規模の増加はない。
【００２９】
〔３〕［ＰＣ相対分岐命令］
前記ディスプレースメント付きインデックスレジスタ間接のようなアドレシングモードを採用する第１の命令はＰＣ相対分岐命令としても適用可能である。即ち、インデックスレジスタを、８ビット、１６ビット、３２ビットとし、所定の定数倍（命令が１６ビット単位の場合は×２）をした後、プログラムカウンタ（ＰＣ）と加算して、分岐アドレスを得るようにする、プログラムカウンタインデックスレジスタ相対分岐の実効アドレス生成をサポートする。複数の分岐先がある場合、分岐条件を評価した後、その評価結果に従って、インデックスレジスタに値を設定することにより、分岐命令自体は１個で共通化できる。
【００３０】
ＣＰＵの命令実行機能として、汎用レジスタを拡張し、シフトし、加算し、この結果をアドレスとして利用可能にする機能は、前記と共通化できる。加算対象の他方の値は、ＰＣ値の代わりにディスプレースメントであってもよい。
【００３１】
例えば、Ｃソースプログラム上のケース文（ｃａｓｅ）などを評価し、評価結果に基づき、分岐先アドレスを計算するためのインデックスを汎用レジスタに格納することによって、プログラム容量を削減することができる。
【００３２】
〔４〕［メモリ間接アドレシングモードによる分岐命令］
第２の観点による本発明は、命令を読み込んで解読し、その解読結果に従って命令を実行する命令実行手段を有し、前記命令実行手段は、命令の所定フィールドの値（ｖｅｃ）にオフセット（Ｈ’８０）を組合わせ、これに情報のアクセスサイズに応じたビット数のシフトを行い、シフトされた値にその他の情報（ＶＢＲの値）を加算して実効アドレスを演算し、演算された実効アドレスでメモリをリードし、リードした内容を分岐先アドレスとする分岐命令を実行可能である。前記シフト動作は、例えば、プログラムカウンタ等による命令フェッチサイズに対応して、×２または×４などとされる。
【００３３】
ベクタベースレジスタを基準に、例外処理ベクタテーブルの範囲を超えるように前記オフセットの値を決めれば、その超えた範囲にマッピングされたサブルーチンベクタテーブルを参照して、サブルーチンに分岐することができる。　上記メモリ間接アドレシングモードによる分岐命令を採用すれば、それを短い命令コードととし、同一のアドレスに分岐する分岐命令が多数ある場合に、分岐テーブルと合わせても、プログラム容量を削減することができる。また、プログラムカウンタ若しくはアドレス空間の大きさに対応して、前記命令コード中のデータ（ｖｅｃ）にオフセットを加えて×２又は×４などとすることにより、命令コードのベクタ番号フィールド等の情報を有効に利用でき、多数の分岐アドレスを指定することができる。また、前記命令コード中のデータ（ｖｅｃ）を例外処理ベクタ領域（例外処理ベクタテーブル）の番号と共通化されないように、その使用時に、前記命令コード中のデータ（ｖｅｃ）の前に、所定のオフセット（例えば固定値Ｈ’８０）を設け、更に、その上位側を例えばベクタベースレジスタ（ＶＢＲ）の保持値で埋めることにより、命令コード中のデータ（ｖｅｃ）で指定可能にされる領域を例外処理ベクタ領域と重ならないようにすることができる。ベクタベースレジスタを更に加えることにより、ブートメモリからプログラムメモリへの再配置（所要のプログラムを、高速なメモリ上で使用するために最初に実行すべき処理）などを容易に行うことができる。
【００３４】
ベクタベースレジスタに代えてサブルーチンコールに専用化されたサブルーチンベクタテーブルレジスタのような第１レジスタを採用してサブルーチンコールを可能にする構成を採用することも可能である。即ち、命令実行手段は、例外処理ベクタテーブルの参照に利用可能なベクタベースレジスタ（ＶＢＲ）と、サブルーチンベクタテーブルの参照に利用可能な第１レジスタ（ＴＢＲ）を有し、前記命令実行手段は、命令の所定フィールドの値（ｄｉｓｐ）を、情報のアクセスサイズに応じたビット数でシフトし、シフトされた値に前記第１レジスタ（ＴＢＲ）の値を加算してアドレスを演算し、演算されたアドレスで前記サブルーチンベクタテーブルをリードし、リードした内容を分岐先サブルーチンアドレスとする、サブルーチンコール命令を実行可能である。
【００３５】
ソースプログラムからオブジェクトプログラムを生成するときのリンク時最適化などにおいて、最も使用頻度の高い分岐先の分岐命令を、本命令の分岐命令に置き換えればよい。
【００３６】
上述したように、サブルーチンコールの先頭アドレステーブルをポイントする第１レジスタを、例外処理用のベクタベースレジスタとは別に導入する事により、命令コード内のｄｉｓｐ（ディスプレースメント）のような所定フィールドの値に基づいてサブルーチンコールでき、更に、サブルーチンベースレジスタのような第２レジスタを導入し、第２レジスタで指定される先頭アドレスから６４ＫＢのような範囲内をサブルーチンベクタテーブルの１６ビットのようなエントリアドレスで分岐できるようにすれば、サブルーチンベクタテーブルのサイズを小さくすることができる。要するに、命令実行手段は、例外処理ベクタテーブルの参照に利用可能なベクタベースレジスタと、サブルーチンへの分岐に利用可能な第１レジスタ及び第２レジスタを有し、命令の所定フィールドの値を、情報のアクセスサイズに応じたビット数でシフトし、シフトされた値に前記第１レジスタの値を加算してアドレスを演算し、演算されたアドレスでサブルーチンベクタテーブルをリードし、リードした内容に前記第２レジスタの値を加算して分岐先サブルーチンアドレスとする、サブルーチンコール命令を実行可能にする。
【００３７】
〔５〕［ビットフィールド命令］
第３の観点による本発明では、イミディエイトデータで、メモリ上のビットフィールドの位置を指定（イミディエイトデータの論理値“１”のビットの存在するフィールドをビットフィールドとする）し、当該ビットフィールドと汎用レジスタ（下位詰め）との間のデータ転送を可能にする。すなわち、メモリから汎用レジスタへ転送するロード命令（ＢＦＬＤ）の場合は、メモリ上のデータと、イミディエイトデータの論理積をとり、イミディエイトデータの最下位の１がビット０となるように、右シフトを行った後に、汎用レジスタに格納する。汎用レジスタからメモリへ転送するストア命令の場合（ＢＦＳＴ）は、イミディエイトデータの最下位の１のビットまで、汎用レジスタの内容を左シフトした後に、イミディエイトデータが１のビット位置のデータは前記シフトした汎用レジスタ上のデータとし、それ以外の論理値“０”のビット位置のデータはメモリ上のデータとして組合せて、メモリにライトする。
【００３８】
これにより、ＲＡＭの１個のアドレス（１バイト）の記憶エリアに、複数のビットフィールドを格納できるので、プログラム容量を増やすことなく、内蔵ＲＡＭの容量を節約でき、かつ、この処理を行うプログラム容量を小さくでき、シングルチップマイクロコンピュータに好適である。従来、複数の命令を組合せて、ビットフィールドを使用している場合に比較して、処理速度を向上することができる。
【００３９】
【発明の実施の形態】
図２に、本発明の適用されたシングルチップマイクロコンピュータのブロック図を示す。
【００４０】
同図に示されるシングルチップマイクロコンピュータ１は、全体の制御を司るＣＰＵ２、割込コントローラ（ＩＮＴ）３、主に、ＣＰＵ２の処理プログラムなどを格納するメモリであるＲＯＭ４、主に、ＣＰＵ２の作業領域並びにデータの一時記憶用のメモリであるＲＡＭ５、タイマ６、シリアルコミュニケーションインタフェース（ＳＣＩ）７、Ａ／Ｄ変換器８、第１乃至第９入出力ポート（ＩＯＰ１〜ＩＯＰ９）９Ａ〜９Ｉ、クロック発振器（ＣＰＧ）１０の機能ブロック乃至はモジュールから構成され、公知の半導体製造技術により１つの半導体基板上に形成される。ＲＯＭ４は、フラッシュメモリ、ＥＥＰＲＯＭ（電気的に書込み消去可能なＲＯＭ）、或いはマスクＲＯＭなどである。
【００４１】
前記シングルチップマイクロコンピュータ１は、電源端子として、グランドレベル（Ｖｓｓ）、電源電圧レベル（Ｖｃｃ）、アナロググランドレベル（ＡＶｓｓ）、アナログ電源電圧レベル（ＡＶｃｃ）、の電源端子、その他の専用制御端子として、リセット（ＲＥＳ）、スタンバイ（ＳＴＢＹ）、モード制御（ＭＤ０、ＭＤ１）、クロック入力（ＥＸＴＡＬ、ＸＴＡＬ）端子を有する。
【００４２】
ＣＰＧ１０の端子ＥＸＴＡＬ、ＸＴＡＬに接続される水晶発振子またはＥＸＴＡＬ端子に入力される外部クロックに基づいて生成される基準クロック（システムクロック）に同期して、シングルチップマイクロコンピュータ１は動作を行う。この基準クロック１周期をステートと呼ぶ。
【００４３】
シングルチップマイクロコンピュータ１の機能ブロックは、内部バス１１によって相互に接続される。バスの制御を行う、図示はされないバスコントローラを内蔵している。内部バス１１はアドレスバス・データバスの他、リード信号・ライト信号・バスサイズ信号をエンコードしたバスコマンドが伝達されるコントロールバスを含む。
【００４４】
前記機能ブロックやモジュールは内部バス１１を介して、ＣＰＵ２によってリード／ライトさる。内部バス１１のデータバス幅は３２ビットとする。内蔵ＲＯＭ４やＲＡＭ５のリード／ライトは１ステートで可能にされる。
【００４５】
なお、前記タイマ６、ＳＣＩ７、Ａ／Ｄ変換器８、入出力ポート（ＩＯＰ１〜ＩＯＰ９）９Ａ〜９Ｉ、ＣＰＧ１１が有する制御レジスタを総称して、内部Ｉ／Ｏレジスタと呼ぶ。各入出力ポート９Ａ〜９Ｉは、アドレスバス、データバス、バス制御信号あるいはタイマ６、ＳＣＩ７、Ａ／Ｄ変換器８の入出力端子と兼用されている。
【００４６】
上記シングルチップマイクロコンピュータ１にリセット信号ＲＥＳが与えられると、ＣＰＵ２を始めとし、シングルチップマイクロコンピュータ１はリセット状態になる。このリセットが解除されると、ＣＰＵ２は所定のアドレスからスタートアドレスをリードして、このスタートアドレスから命令のリードを開始するリセット例外処理を行う。この後、ＣＰＵは逐次、ＲＯＭ４などから命令をリードし、解読して、その解読内容に基づいてデータの処理やＲＡＭ５のアクセスを行う。
【００４７】
前記タイマ６、ＳＣＩ７、外部信号などの状態を割込み信号１２として、ＣＰＵ２に伝達することができる。割込信号１２は、Ａ／Ｄ変換器８、タイマ６、ＳＣＩ７、入出力ポート９Ａ〜９Ｉが出力し、割込コントローラ３はこれを入力して、所定のレジスタなどの指定に基づいて、ＣＰＵ２に割込要求信号ｉｎｔｆと受付けた割込みに対応したベクタＶＥＣを与える。割込要因が発生すると、ＣＰＵ２に割込要求が発生され、ＣＰＵ２は実行中の処理を中断して、例外処理状態を経て、前記ベクタＶＥＣに対応したアドレスから、分岐先アドレスをリードして、所定の処理ルーチンに分岐し、所望の処理を行い、割込要因をクリアしたりする。所定の処理ルーチンの最後には、通常復帰命令が置かれ、この命令を実行することによって前記中断した処理を再開する。
【００４８】
図３に、ＣＰＵ２に内蔵されている汎用レジスタ及び制御レジスタの構成例（プログラミングモデル）を示す。
【００４９】
ＣＰＵ２は、夫々３２ビット長の８本の汎用レジスタＥＲ０〜ＥＲ７を持っている。汎用レジスタＥＲ０〜ＥＲ７は、すべて同機能を持っており、アドレスレジスタとしてもデータレジスタとしても使用することができる。使用方法については、後述する。汎用レジスタＥＲ７には、汎用レジスタとしての機能に加えて、スタックポインタ（ＳＰ）としての機能が割当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。例外処理は前記割込み処理を含む。
【００５０】
プログラムカウンタＰＣは３２ビットのカウンタで、ＣＰＵ２が次に実行する命令のアドレスを示す。特に制限されないもののＣＰＵ２の命令は、すべて２バイト（ワード）を単位としているため、最下位ビットは無効であり、命令リード時には最下位ビットは０とみなされる。
【００５１】
コンディションコードレジスタＣＣＲは８ビットのレジスタで、ＣＰＵ２の内部状態を示している。割込みマスクビット（Ｉ）とハーフキャリ（Ｈ）、ネガティブ（Ｎ）、ゼロ（Ｚ）、オーバフロー（Ｖ）、キャリ（Ｃ）の各フラグを含む８ビットで構成されている。
【００５２】
ベクタベースレジスタＶＢＲは、３２ビットのレジスタで、下位１２ビットは０とされ、上位２０ビットが例外処理ベクタテーブルおよび拡張メモリ間接の分岐先テーブル（サブルーチンベクタテーブル）のリード時に、アドレスの上位として利用される。サブルーチンベクタテーブルレジスタ（第１レジスタ）ＴＢＲは、サブルーチンのエントリアドレスが格納されたサブルーチンベクタテーブルの所在を指し示す。
【００５３】
図４には汎用レジスタの使用形態が例示される。アドレスレジスタ及び３２ビットレジスタの場合、一括して汎用レジスタＥＲ（ＥＲ０〜ＥＲ７）として使用される。インデックスレジスタとしては、汎用レジスタＥＲ（ＥＲ０〜ＥＲ７）、汎用レジスタＲ（Ｒ０〜Ｒ７）、汎用レジスタＲＬ（Ｒ０Ｌ〜Ｒ７Ｌ）を使用する。何れを使用するかはアドレッシングモード中のインデックスレジスタのサイズで指定される。
【００５４】
１６ビットレジスタの場合は、汎用レジスタＥＲを分割して汎用レジスタＥ（Ｅ０〜Ｅ７）、汎用レジスタＲ（Ｒ０〜Ｒ７）として使用する。これらは同等の機能を持っており、１６ビットレジスタを最大１６本まで使用することができる。
【００５５】
８ビットレジスタの場合は、汎用レジスタＲを分割して汎用レジスタＲＨ（Ｒ０Ｈ〜Ｒ７Ｈ）、汎用レジスタＲＬ（Ｒ０Ｌ〜Ｒ７Ｌ）として使用する。これらは同等の機能を持っており、８ビットレジスタを最大１６本まで使用することができる。汎用レジスタの使用形態は、各レジスタ独立に選択することができる。
【００５６】
メモリ上のアドレスを指定する場合は、アドレスレジスタとして、３２ビット長で、シフトせずに使用するか、インデックスレジスタとして、３２ビットまたは１６ビットまたは８ビット長で、データのサイズに応じて、シフトなし／１ビットシフト／２ビットシフトして使用するか、がある。
【００５７】
図５にはＣＰＵのアドレス空間が例示される。アドレス空間６４キロバイト（ｋバイト）のミニマムモードと、アドレス空間４ギガバイト（Ｇバイト）のマキシマムモードを持つ。
【００５８】
ミニマムモードの場合は、１６ビットのアドレスで全空間を指定できる。例外処理ベクタテーブルや分岐テーブル（サブルーチンベクタテーブル）は１６ビットでよい。
【００５９】
マキシマムモードの場合は、３２ビットのアドレスで全空間を指定する。ベクタや分岐テーブルは３２ビットでよい。ディスプレースメントや絶対アドレス１６ビットで指定できるのは、Ｈ’００００００００〜Ｈ’００００７ＦＦＦとＨ’ＦＦＦＦ８０００〜Ｈ’ＦＦＦＦＦＦＦＦである。特に制限はされないものの、内蔵ＲＡＭ５はこの領域に配置することにより、比較的短いディスプレースメントや絶対アドレス１６ビットを使用できるので、プログラム容量の削減が可能になる。
【００６０】
図６及び図７には転送／演算命令の実効アドレスの計算方法が例示される。図８、図９及び図２５には分岐命令の実効アドレスの計算方法が例示される。
【００６１】
（１）レジスタ直接〔Ｒｎ〕
これは、命令コードのレジスタフィールドで指定されるレジスタ（８ビット、１６ビットまたは３２ビット）がオペランドとなる。８ビットレジスタとしてはＲ０Ｈ〜Ｒ７Ｈ、Ｒ０Ｌ〜Ｒ７Ｌを指定可能である。１６ビットレジスタとしてはＲ０〜Ｒ７、Ｅ０〜Ｅ７を指定可能である。３２ビットレジスタとしてはＥＲ０〜ＥＲ７を指定可能である。
【００６２】
（２）レジスタ間接〔＠ＥＲｎ〕
これは、命令コードのレジスタフィールドで指定されるアドレスレジスタ（ＥＲｎ）の内容をアドレスとしてメモリ上のオペランドを指定する。アドバンストモードのとき、分岐命令では、下位２４ビットが有効になり、上位８ビットはすべて０（Ｈ’００）とみなされる。
【００６３】
（３）ディスプレースメント付レジスタ間接〔＠（ｄ：２，ＥＲｎ）／＠（ｄ：１６，ＥＲｎ）／＠（ｄ：３２，ＥＲｎ）〕
これは、命令コードのレジスタフィールドで指定されるアドレスレジスタ（ＥＲｎ）の内容に命令コード中に含まれる１６ビットディスプレースメントまたは３２ビットディスプレースメントを加算した内容をアドレスとしてメモリ上のオペランドを指定する。加算に際して、１６ビットディスプレースメントは符号拡張される。また、データのサイズがバイトの場合は、ディスプレースメントが１、２、３のとき、短縮形＠（ｄ：２，ＥＲｎ）が用意されている。同様に、ワードの場合は、２、４、６のとき、ロングワードの場合は、４、８、１２のとき、それぞれ短縮形＠（ｄ：２，ＥＲｎ）が用意されている。
【００６４】
（４）ディスプレースメント付インデックスレジスタ間接〔＠（ｄ：１６／３２，ＥＲｎ．Ｂ／Ｗ／Ｌ）〕
これは、命令コードのレジスタフィールドで指定されるアドレスレジスタの指定されたビット数（ＲｎＬ、Ｒｎ、ＥＲｎ）の内容を、３２ビットにゼロ拡張し、１、２または４を乗算し（実際にはシフトを行う）、乗算結果と命令コード中に含まれる１６ビットディスプレースメントまたは３２ビットディスプレースメントを加算した内容をアドレスとしてメモリ上のオペランドを指定する。データのサイズに応じて、バイトサイズでは１、ワードサイズでは２、ロングワードサイズでは４がそれぞれ乗算される。加算に際して、１６ビットディスプレースメントは符号拡張される。要するに、情報保持に前記汎用レジスタの一部を利用するとき、アクセスする情報のサイズに応じて、前記汎用レジスタの一部を利用する情報をシフトし、シフト結果をその他の情報と加算して実効アドレスの演算を行なう。
【００６５】
（５）プリ／ポストインクリメント／デクリメントレジスタ間接〔＠ＥＲｎ＋／＠−ＥＲｎ／＠＋ＥＲｎ／＠ＥＲｎ−〕
（ａ）ポストインクリメントレジスタ間接〔＠ＥＲｎ＋〕は、命令コードのレジスタフィールドで指定されるアドレスレジスタ（ＥＲｎ）の内容をアドレスとしてメモリ上のオペランドを指定する。その後、アドレスレジスタの内容に１、２または４が加算され、加算結果がアドレスレジスタに格納される。バイトサイズでは１、ワードサイズでは２、ロングワードサイズでは４がそれぞれ加算される。
（ｂ）プリデクリメントレジスタ間接〔＠−ＥＲｎ〕は、命令コードのレジスタフィールドで指定されるアドレスレジスタ（ＥＲｎ）の内容から１、２または４を減算した内容をアドレスとしてメモリ上のオペランドを指定する。その後、減算結果がアドレスレジスタに格納される。バイトサイズでは１、ワードサイズでは２、ロングワードサイズでは４がそれぞれ減算される。
（ｃ）プリインクリメントレジスタ間接〔＠＋ＥＲｎ〕は、命令コードのレジスタフィールドで指定されるアドレスレジスタ（ＥＲｎ）の内容から１、２または４を加算した内容をアドレスとしてメモリ上のオペランドを指定する。その後、加算結果がアドレスレジスタに格納される。バイトサイズでは１、ワードサイズでは２、ロングワードサイズでは４がそれぞれ加算される。
（ｄ）ポストデクリメントレジスタ間接〔＠ＥＲｎ−〕は、命令コードのレジスタフィールドで指定されるアドレスレジスタ（ＥＲｎ）の内容をアドレスとしてメモリ上のオペランドを指定する。その後、アドレスレジスタの内容に１、２または４が減算され、減算結果がアドレスレジスタに格納される。バイトサイズでは１、ワードサイズでは２、ロングワードサイズでは４がそれぞれ減算される。
【００６６】
（６）絶対アドレス〔＠ａａ：８／＠ａａ：１６／＠ａａ：２４／＠ａａ：３２〕
これは、命令コード中に含まれる絶対アドレスで、メモリ上のオペランドを指定する。絶対アドレスは８ビット（＠ａａ：８）、１６ビット（＠ａａ：１６）、２４ビット（＠ａａ：２４）、または３２ビット（＠ａａ：３２）である。データ領域としては、８ビット（＠ａａ：８）、１６ビット（＠ａａ：１６）、または３２ビット（＠ａａ：３２）を使用する。８ビット絶対アドレスの場合、上位２４ビットはすべて１（Ｈ’ＦＦＦＦ）となる。１６ビット絶対アドレスの場合、上位１６ビットは符号拡張される。３２ビット絶対アドレスの場合、全アドレス空間をアクセスできる。プログラム領域としては２４ビット（＠ａａ：２４）、または３２ビット（＠ａａ：３２）を使用する。２４ビット（＠ａａ：２４）のとき上位８ビットはすべて０（Ｈ’００）となる。
【００６７】
（７）イミディエイト〔＃ｘｘ：８／＃ｘｘ：１６／＃ｘｘ：３２〕
これは、命令コード中に含まれる８ビット（＃ｘｘ：８）、１６ビット（＃ｘｘ：１６）、または３２ビット（＃ｘｘ：３２）のデータを直接オペランドとして使用する。
【００６８】
（８）プログラムカウンタ相対〔＠（ｄ：８，　ＰＣ）／＠（ｄ：１６，　ＰＣ）〕
これは、Ｂｃｃ（条件分岐命令）、ＢＳＲ（サブルーチン分岐命令）等の命令で使用される。ＰＣの内容で指定される３２ビットのアドレスに、命令コード中に含まれる８ビット、または１６ビットディスプレースメントを加算して３２ビットの分岐アドレスを生成する。加算に際して、ディスプレースメントは３２ビットに符号拡張される。
【００６９】
（９）プログラムカウンタインデックスレジスタ相対〔＠（ＥＲｎ．Ｂ，　ＰＣ）／＠（ＥＲｎ．Ｗ，　ＰＣ）／＠（ＥＲｎ．Ｌ，　ＰＣ）〕
これは、Ｂｃｃ、ＢＳＲ命令で使用される。命令コードのレジスタフィールドで指定されるアドレスレジスタの指定されたビット数（ＲｎＬ、Ｒｎ、ＥＲｎ）の内容を、３２ビットにゼロ拡張し、２を乗算し（実際にはシフトを行う）、乗算結果と、ＰＣの内容で指定される３２ビットのアドレスを加算して３２ビットの分岐アドレスを生成する。要するに、情報保持に前記汎用レジスタの一部を利用するとき、アクセスする情報のサイズに応じて、前記汎用レジスタの一部を利用する情報をシフトし、シフト結果をその他の情報であるプログラムカウント手段が保有する命令アドレス情報と加算して実効アドレスの演算を行ない、演算された実効アドレスを分岐先アドレスとする。
【００７０】
（１０）メモリ間接〔＠＠ａａ：８〕
これはＪＭＰ（指定アドレスへの無条件分岐命令）、ＪＳＲ（指定アドレスへのサブルーチン分岐命令）等の命令で使用される。命令コード中に含まれる８ビット絶対アドレスでメモリ上のオペランドを指定し、この内容を分岐アドレスとして分岐する。８ビット絶対アドレスの上位のビットは、ベクタベースレジスタＶＢＲで指定される。ミニマムモードの場合は、メモリ上のオペランドはワードサイズで指定し、１６ビットの分岐アドレスを生成する。マキシマムモードの場合は、メモリ上のオペランドはロングワードサイズで指定する。
【００７１】
（１１）拡張メモリ間接〔＠＠ｖｅｃ：７〕
これは、命令コード中に含まれる７ビットなどのデータ（ｖｅｃ）にオフセット例えば固定値Ｈ’８０を組合わせた値に、プログラムカウンタないしアドレス空間の大きさに対応して、×２（２倍）または×４（４倍）などのシフトを行い、シフトされた値に例えばベクタベースレジスタＶＢＲなどのレジスタで指定されるような分岐テーブルの先頭アドレスを加算し、この加算結果をアドレスとして、分岐テーブルをリードし、リードした内容を分岐先アドレスとして分岐するようにする。従って、ベクタベースレジスタＶＢＲを基準に、例外処理ベクタテーブルの範囲を超えるように前記オフセットの値が決められている（要するに、ｖｅｃの上位に固定値Ｈ’８０が付加されている）ので、その超えた範囲にマッピングされたサブルーチンベクタテーブルを参照して、サブルーチンに分岐することができる。
【００７２】
図９にはベクタベースレジスタＶＢＲの値を加算する処理について図示はない。この点を更に明確に表現した図面として図２５の（６ａ）がある。
【００７３】
図２５の（６ｂ）には、ベクタベースレジスタＶＢＲに代えてサブルーチンコールに専用化されたサブルーチンベクタテーブルレジスタＴＢＲを採用してサブルーチンコールを可能にする拡張メモリ間接アドレシングモードが例示される。即ち、命令の所定フィールドの値ｄｉｓｐを、情報のアクセスサイズに応じたビット数例えば２ビット又は４ビットでシフトし、シフトされた値にサブルーチンベクタテーブルレジスタＴＢＲの値を加算してアドレスを演算し、演算されたアドレスで前記サブルーチンベクタテーブルをリードし、リードした内容を分岐先サブルーチンアドレスとする。特に図示はしないが、図２５の（６ａ）においてＶＢＲの代わりＴＢＲの値を用いるアドレシングモードを追加して採用することも可能である。
【００７４】
図２５の（６ｂ）に例示される命令フォーマットの命令は例えばサブルーチンコール命令であり、１６ビット命令とされ、ｄｉｓｐは８ビットとされる。　図１０にはＣＰＵの機械語の命令フォーマットが例示される。ＣＰＵの命令は、２バイト（ワード）を単位にしている。各命令はオペレーションフィード（ｏｐ）、レジスタフィールド（ｒ）、ＥＡ拡張部（ＥＡ）、およびコンディションフィールド（ｃｃ）を含む。
【００７５】
前記オペレーションフィールド（ｏｐ）は、命令の機能を表し、アドレッシングモードの指定オペランドの処理内容を指定する。命令の先頭４ビットを必ず含む。２つのオペレーションフィールドを持つ場合もある。
【００７６】
前記レジスタフィールド（ｒ）は汎用レジスタを指定する。レジスタフィールド（ｒ）はアドレスレジスタのとき３ビット、データレジスタのとき３ビット（３２ビットレジスタ）又は４ビット（８または１６ビットレジスタ）である。２つのレジスタフィールドを持つ場合、またはレジスタフィールドを持たない場合もある。
【００７７】
前記ＥＡ拡張部（ＥＡ）は、イミディエイトデータ、絶対アドレスまたはディスプレースメンを指定する。８ビット、１６ビット、または３２ビットのフィールドである。コンディションフィールド（ｃｃ）は条件分岐命令（Ｂｃｃ命令）の分岐条件を指定する。
【００７８】
図１１には本発明に関する命令フォーマットが例示される。
【００７９】
［配列などの実効アドレス計算］
ＭＯＶ．Ｌ　＠（ｄ：１６，ｒｓ），ｒｄは、２ワードの命令で、第１ワードのビット６〜４でインデックスレジスタ（ｒｓ）を、ビット３〜０でデータレジスタ（ｒｄ）を指定し、第２ワードがディスプレースメント（ｄ）である。この命令は図６の（５）（ａ）に示される１６ビットディスプレースメント付きインデックスレジスタ間接のアドレシングモードを用いる。この命令は第１の命令の一つである。図６の（４）に示されるディスプレースメント付きレジスタ間接のアドレシングモードを用いる転送命令等は第２の命令に分類される。
【００８０】
［配列などの実効アドレス計算用ＭＯＶＡ命令］
ＭＯＶＡ／Ｌ　＠（ｄ：１６，ｒｄ），ｒｄは、２ワードの命令で、第１ワードのビット２〜０でインデックスレジスタとデータレジスタ共通の汎用レジスタ（ｒｄ）を指定し、第２ワードがディスプレースメント（ｄ）である。この命令も図６の（５）（ａ）に示される１６ビットディスプレースメント付きインデックスレジスタ間接のアドレシングモードを用いる。この命令は第３の命令の一つである。
【００８１】
［分岐命令１］
ＢＲＡ　ｒｓは、１ワードの命令で、ビット６〜４でインデックスレジスタ（ｒｓ）を指定する。この命令は図８の（３）に示されるプログラムカウンタインデックスレジスタ相対のアドレシングモードを用いる。この分岐命令は第１の命令の別の例となる。
【００８２】
［分岐命令２］
ＪＭＰ　＠＠ａａ：７は、１ワードの命令で、ビット７〜０に分岐テーブルを指定するアドレス情報（ａａ）を含む。この命令は図９の（６）及び図２５の（６ａ）に示される拡張メモリ間接のアドレシングモードを用いる。
【００８３】
［分岐命令３］
図２６には図２５の（６ｂ）に示されるアドレシングモードによるサブルーチン命令による動作が示される。ここで説明するサブルーチンコール命令（１６ビット命令）の書式は、“ＪＳＲ／Ｎ　＠＠（ｄｉｓｐ８，ＴＢＲ）”とされる。ｄｉｓｐ８は８ビットのｄｉｓｐ（ディスプレースメント）を意味する。命令コードは“１０００００１１ｄｄｄｄｄｄｄｄ”となり、ｄｄｄｄｄｄｄｄは８ビットのｄｉｓｐ（ディスプレースメント）である。動作の概略は以下の通りである。▲１▼復帰のためにプログラムカウンタＰＣをＰＲ（プロシジャレジスタ）に退避する。▲２▼ＴＢＲ（サブルーチンベクタテーブルレジスタ）の値とｄｉｓｐ８×４（２ビット左シフト）の値とを加算して、３２ビットのテーブルエントリアドレスを生成する。▲３▼前記▲２▼で生成されたアドレスのテーブルエントリから３２ビットのアドレスをプログラムカウンタＰＣにロードする。▲４▼　前記▲３▼でロードしたアドレス（全空間をカバー）へジャンプする。
【００８４】
［分岐命令４］
図２７にはサブルーチンコール群の先頭アドレスを示す専用サブルーチンベースレジスタＳＢＲをさらに導入し、そこから６４ＫＢ以内は１６ビットのテーブルアドレスで分岐できるような命令を混在させることで、テーブルサイズの最適化を図る例について説明する。動作の概略を説明する。▲１▼プログラムカウンタＰＣの値を復帰アドレスとしてＰＲ（プロシジャレジスタ）に退避する。▲２▼ＴＢＲ（サブルーチンベクタテーブルレジスタ）の値とｄｉｓｐ８×２の値とを加算して、３２ビットのテーブルエントリアドレスを生成する。▲３▼前記▲２▼で生成されたアドレスのテーブルエントリから１６ビットのアドレスをロードしゼロ拡張し、ＳＢＲ（サブルーチンベースアドレスレジスタ）を加算してアドレスを生成する。▲４▼前記▲３▼で生成したアドレス（６４ＫＢをカバー）へジャンプする。
【００８５】
上述したように、サブルーチンコールの先頭アドレステーブルをポイントする専用サブルーチンベクタテーブルレジスタＴＢＲを、例外処理用のベクタベースレジスタＶＢＲとは別に導入し、上記分岐命令３の場合には、命令コード内のｄｉｓｐ（ディスプレースメント）により、３２ビットアドレステーブルを１６ビット命令１つで参照して、サブルーチンコールでき、また、上記分岐命令４の場合のようにサブルーチンベースレジスタＳＢＲをさらに導入し、そこから６４ＫＢ以内は１６ビットのテーブルアドレスで分岐できるようにすれば、サブルーチンベクタテーブルのサイズを小さくすることができる。
【００８６】
上記分岐命令３、４によれば、命令はコードサイズが１６ビットであり、自由に配置できる専用アドレステーブルエリアを持ち、且つジャンプ先のアドレスの範囲に制限はない。上記により、サブルーチンの配置アドレスおよびアドレステーブルエリアに制限を与えること無く、コード効率を向上させることができる。要するに、１）コード効率（サイズ）、２）ジャンプ可能な範囲の全アドレス空間対応、３）自由に配置できる専用サブルーチンベクタテーブルエリアによるプログラミングの容易化、を全て満たすことができる。
【００８７】
［ビットフィールド命令］
ＢＦＬＤ　＃ｘｘ，＠ａａ：１６，ｒｄは、３ワードの命令で、第２ワードが絶対アドレス（ａａ）であり、第３ワードのビット７〜０にイミディエイト（ｘｘ）を含み、第３ワードのビット１１〜８でデスティネーションレジスタ（ｒｄ）を指定する。
【００８８】
ＢＦＳＴ　ｒｄ，＃ｘｘ，＠ｒｓは、２ワードの命令で、第２ワードのビット７〜０にイミディエイト（ｘｘ）を含み、第１ワードのビット６〜４でアドレスレジスタ（ｒｄ）を、第２ワードのビット１１〜８でソースレジスタ（ｒｓ）を指定する。
【００８９】
図１２にはビットフィールド命令によるデータ処理機能が例示される。
【００９０】
ＢＦＬＤ（ビットフィールドロード）命令は、ソースオペランドにおいて指定されたフィールド（ハッチングされたフィールド）を、下位詰めで、８ビットレジスタＲｄに転送する（上位ビットは０になる）命令である。ビットフィールドは、８ビットのイミディエイトデータ（マスクデータ）の１がセットされているビットで指定される。要するに、ＢＦＬＤ命令は、メモリ上のデータをリードし、命令コード中に含まれるイミディエイトデータとの論理積をとり、その論理積の結果に対し、前記イミディエイトデータの下位ビット側の論理値“１”のビットが、最下位ビットになるように右シフトし、右シフトの結果を汎用レジスタに格納する処理を規定する。
【００９１】
ＢＦＳＴ（ビットフィールドストア）命令は、デスティネーションオペランドにおいてイミディエイトデータで指定されたフィールド（ハッチングされたフィールド）へ、８ビットレジスタＲｓの内容（下位詰め）を転送する。ビットフィールドは、８ビットのイミディエイトデータの１がセットされているビットで指定される。要するに、ＢＦＳＴ命令は、汎用レジスタの内容を、命令コード中に含まれるイミディエイトデータの下位ビット側の論理値“１”のビットまで左シフトし、前記イミディエイトデータの論理値“１”のビットは、前記シフトした内容を選択し、論理値“０”のビットは前記リードしたメモリの内容を選択し、その結果を前記メモリに格納する処理を規定する。
【００９２】
図１には前記ＣＰＵの詳細が例示される。命令実行手段としてのＣＰＵ２は、制御部２Ａと実行部２Ｂから構成される。
【００９３】
制御部２Ａは、命令レジスタＩＲ、命令変更部ＣＨＧ、命令デコーダＤＥＣ、レジスタセレクタＲＥＳＬ、割込み制御部ＩＮＴＣを含む。
【００９４】
命令デコーダＤＥＣは、例えば、マイクロＲＯＭ或はＰＬＡ（Ｐｒｏｇｒａｍｍａｂｌｅ　Ｌｏｇｉｃ　Ａｒｒａｙ）または布線論理で構成される。命令デコーダＤＥＣの出力の一部が命令デコーダＤＥＣにフィードバックされている。これは各命令コード内の遷移に用いるステージコード（ＴＭＧ）を含む。
【００９５】
命令デコーダＤＥＣは、実行部２Ｂの制御を行う。詳細を後述する制御信号ｇｂｂｙｔｅ、ｇｂｗｏｒｄ、ｇｂｓｆｔ１、ｇｂｓｆｔ２、ｂｆｌｄ、ｂｆｓｔ、ａｌｕａｂは算術論理演算器ＡＬＵの制御用に出力される。また、別の制御信号ａａ，ａａ７ｒｄ，ｖｅｃｒｄはメモリアドレスバッファＡＢの制御用に出力される。
【００９６】
レジスタセレクタＲＥＳＬは、命令デコーダＤＥＣの指示と、命令コード中に含まれるレジスタフィールドの情報に基づいて、レジスタ選択信号ｒｓｇｂ［ｎ］、ｗｂｒｄ［ｎ］などを出力し、汎用レジスタの入出力を制御する。［ｎ］は汎用レジスタに対応した０〜７の番号を意味する。
【００９７】
命令レジスタＩＲは、リードした命令を一旦格納する。実行すべき命令は、命令デコーダＤＥＣに出力される。命令変更部ＣＨＧは、リードした命令以外の命令コードを、命令デコーダＤＥＣに与える場合に動作し、そのほかの場合は、命令レジスタＩＲの内容を命令デコーダＤＥＣに与える。リードした命令以外の命令コードは、割込み制御部ＩＮＴＣの指示によって、割込みなどの例外処理を実行するとき、などに用いる。割込み制御部ＩＮＴＣは、図２の割込みコントローラ３の出力する割込み要求信号ｉｎｔｆを受付け、また、命令デコーダＤＥＣの出力する割込みマスク信号２１を参照し、割込みがマスクされていなければ、命令変更部ＣＨＧに信号２０にて割込みを指示する。
【００９８】
前記実行部（ＥＸＥＣ）２Ｂには、汎用レジスタＥＲ０〜ＥＲ７、プログラムカウンタＰＣ、コンディションコードレジスタＣＣＲ、テンポラリレジスタＴＲ、算術論理演算器ＡＬＵ、インクリメンタＩＮＣ、リードデータバッファＤＢＲ、ライトデータバッファＤＢＷ、アドレスバッファＡＢ、ベクタベースレジスタＶＢＲ、ＴＢＲを含む。これらの回路ブロックは内部バスａｂ、ｇｂ、ｄｂ、ｗｂ１、ｗｂ２によって相互に接続されている。
【００９９】
算術論理演算器ＡＬＵは、命令によって指定される各種の演算や実効アドレスの計算などに用いる。インクリメンタＩＮＣは、主にプログラムカウンタＰＣの加算に用いられる。
【０１００】
図３に示される汎用レジスタＥＲ０〜ＥＲ７、プログラムカウンタＰＣ、コンディションコードレジスタＣＣＲ以外は、プログラミング上は参照できず、マイクロコンピュータ１内部の動作にのみ用いられる。即ち、リードデータバッファＤＢＲ、ライトデータバッファＤＢＷ、アドレスバッファＡＢなどは、内部バスＩＡＢ、ＩＤＢとのインタフェースをとるために、一時的なデータのラッチやバッファリングに使用する。テンポラリレジスタＴＲは、マイクロコンピュータ１内部の動作に適宜用いられる。内部バスＩＡＢ、ＩＤＢは前記内部バス１１に含まれる内部アドレスバス、内部データバスを意味する。
【０１０１】
リードデータバッファＤＢＲは、前記ＲＯＭ４、ＲＡＭ５、内部Ｉ／Ｏレジスタ、或は図示はされない外部メモリから、リードした命令コード（ＥＡ拡張部）やデータを一時的に格納する。ライトデータバッファＤＢＷはＲＯＭ４、ＲＡＭ５、内部Ｉ／Ｏレジスタ、或は外部メモリへのライトデータを一時的に格納する。アドレスバッファＡＢは、ＣＰＵ２がリード／ライトするアドレスをバッファリングするほか、例外処理ベクタテーブル（ベクタテーブル）やサブルーチンベクタテーブル（分岐テーブル）のリードアドレスを生成するのに利用される。アドレスバッファＡＢは、割込みコントローラから入力されたベクタ、命令コードに含まれる値ｖｅｃ、および内部バスａｂ上の値等を入力とし、アドレス出力を行う。前記の通り、ベクタベースレジスタＶＢＲの値は、例外処理のベクタＶＥＣを用いるテーブル参照、拡張メモリ間接におけるベクタフィールドの値ｖｅｃを用いるテーブル参照の上位アドレスとして使用される。
【０１０２】
アドレスバッファＡＢの機能を表す論理記述は図１３に示されるように表現することができる。同図の論理記述は、ＲＴＬ（Ｒｅｇｉｓｔｅｒ　Ｔｒａｎｓｆｅｒ　Ｌｅｖｅｌ）若しくはＨＤＬ（Ｈａｒｄｗａｒｅ　Ｄｅｓｃｒｉｐｔｉｏｎ　Ｌａｎｇｕａｇｅ）記述と呼ばれ、公知の論理合成ツールによって、論理回路に論理展開できる。ＨＤＬはＩＥＥＥ１３６４として標準化されている。これに示される論理記述の構文は、ケース（ｃａｓｅ）文に準拠しており、ａｌｗａｙｓ＠の次の（）内で定義された値若しくは信号に変化が有ったとき、それ以下の記述行の処理を行う、という記述内容になっている。尚、記号「｜」は論理和を示し、「＆」は論理積を示す。「２’ｂ０１」は２ビット長のバイナリコード０１を意味する。図１３の論理記述において、ｍｏｄｅ＝０のときマキシマムモード、ｍｏｄｅ＝１のときミニマムモードとし、拡張メモリ間接の分岐テーブルリードのとき制御信号ａａ７ｒｄ、例外処理のベクタリードのとき制御信号ＶＥＣｒｄを活性状態とする。即ち、図１３の論理記述は、ｍｏｄｅ信号と、制御信号ａａ７ｒｄ、ＶＥＣｒｄに応じて、選択が行われる。前記制御信号がいずれも非活性状態のときは、内部バスａｂの内容が選択される。
【０１０３】
図１４には算術論理演算器ＡＬＵの主要部の構成が例示される。算術論理演算器ＡＬＵは、入力セレクタ２５、算術論理演算部２６、ビットフィールド演算部２７、及び出力セレクタ２８を含む。このほかに、図示はされない、内部バスｄｂ側のＡＬＵ入力セレクタや、ビット操作命令用などの付加的な機能も含むが、ここでは詳細な説明は省略する。
【０１０４】
入力セレクタ２５は、ゼロ拡張機能と１ビットシフト又は２ビットシフト機能を持つ。図１５にはその機能が論理記述で例示される。即ち、出力する汎用レジスタなどの資源が選択され，内部バスｇｂを経由して算術論理演算器ＡＬＵに入力した後、信号ｇｂｂｙｔｅ、ｇｂｗｏｒｄで、使用する汎用レジスタ（インデックスレジスタ）のサイズを指定し、上位はゼロ拡張される。その後、信号ｇｂｓｆｔ１、ｇｂｓｆｔ２でシフトビット数を指定し、×１／×２／×４を選択する。例えば、後述のＭＯＶ．Ｌ　＠（ｄ：１６，Ｒ１Ｌ），ＥＲ０のアドレス計算では、ｇｂｂｙｔｅ＝１、ｇｂｗｏｒｄ＝０、ｇｂｓｆｔ１＝０、ｇｂｓｆｔ２＝１とされる。０拡張とシフト演算されたデータは、リードデータバッファＤＢＲから出力されて内部バスｄｂを経由して算術論理演算部２６に入力されたディスプレースメントと加算される。その加算結果は、出力セレクタ２８と内部バスａｂを経由してアドレスとして出力され、また内部バスｗｂ２を経由して汎用レジスタにも格納される。演算結果はバスａｂにもバスｗｂ２にも出力される。前記入力セレクタ２５は、内部バスｇｂの内容を減算するために、反転する論理を含めることもできる。インデックスレジスタとしては、負の数を使用しないようにして、入力セレクタ２５の論理を並列化して、遅延時間を短縮できる。
【０１０５】
ビットフィールドロード演算部２７は、内部バスｇｂ、ｄｂと、イミディエイトデータ（ｉｍｍ）を入力し、結果を内部バスｗｂ２に出力する。イミディエイトデータ（ｉｍｍ）は、前記の通り、命令コードのビット７〜０（図８のＢＦＬＤ命令のｘｘ）などとされる。内部バスｗｂ２に出力された演算結果は、汎用レジスタまたはライトデータバッファＤＢＷに格納される。ＢＦＬＤ演算を行う論理記述は図１６に例示される。すなわち、イミディエイトデータ（ｉｍｍ）と内部バスｇｂとの論理積をとり、イミディエイトデータ（ｉｍｍ）で指定したビット数だけ（最も下位の”１”のビットがビット０になるまで）、右シフトを行うものである。
【０１０６】
ＢＦＳＴ演算を行う論理記述は図１７に例示される。すなわち、内部バスｄｂを、イミディエイトデータ（ｉｍｍ）で指定したビット数だけ（最も下位の”１”のビット位置まで）、左シフトを行い、ｂｆ＿ｉｎを生成し、イミディエイトデータ（ｉｍｍ）が１のビットはｂｆ＿ｉｎを、そのほかのビットは内部バスｇｂ（メモリからリードしたデータ）の内容を生成するものである。
【０１０７】
次に、本発明に関する命令の実行タイミングを説明する。前記の通り、内部バスは３２ビットであるが、簡単のために、命令リードは１６ビットずつ行うものとする。また、内蔵ＲＯＭ４、ＲＡＭ５のリード／ライトを１ステートでリード／ライト可能とする。
【０１０８】
図１８にはＭＯＶ．Ｌ＠（ｄ：１６，Ｒ１Ｌ），ＥＲ０の実行タイミングが例示される。これは図１１で説明した［配列などの実効アドレス計算］の命令フォーマットに応ずる命令の実行タイミングを示す。
【０１０９】
Ｔ０で、ＣＰＵ２のアドレスバッファＡＢからアドレスがアドレスバスＩＡＢに出力される。また、命令デコーダＤＥＣから、命令フェッチ（ｉｆ）を示す、バスコマンドＢＣＭＤが出力される。
【０１１０】
Ｔ１では、Ｔ０の内部アドレスバスＩＡＢ上のアドレスとバスコマンドＢＣＭＤに従ったリードデータが内部データバスＩＤＢに得られる。このリードデータは、Ｔ２で命令レジスタＩＲに取り込まれる。以上の動作は以前の命令の実行の制御によって行われる。
【０１１１】
特に制限はされないものの、引続き、Ｔ１、Ｔ２、Ｔ４、Ｔ５でも内部アドレスバスＩＡＢにアドレスが出力され、バスコマンドＢＣＭＤが出力され、命令リード（先読み）が行われる。本命令のディスプレースメントは、Ｔ２で内部データバスＩＤＢに得られ、Ｔ３でリードデータバッファＤＢＲに取り込まれる。
【０１１２】
直前の命令の実行が終了すると、最も早く命令の実行が開始される場合には、Ｔ２で、リードデータが、命令コードが命令デコーダＤＥＣに入力されて、命令の内容が解読される。
【０１１３】
命令コードの一部（レジスタ指定フィード）がレジスタセレクタＲＥＳＬに与えられ、解読される。解読結果に従って、Ｔ３で制御信号・レジスタ選択信号が出力される。信号ｒｓｇｂ１が活性状態になって、汎用レジスタＥＲ１の内容が内部バスｇｂに出力される。また、図示を省略する制御信号ｄｂｒｄｂ（リードデータバッファＤＢＲからバスｄｂへの出力制御信号）、図示を省略する制御信号ｄｂｒｅｘｔ（リードデータバッファのデータに対する符号拡張指示信号）が活性状態になって、リードデータバッファＤＢＲに取り込まれた１６ビットディスプレースメントが符号拡張されて、内部バスｄｂに出力される。これらが算術論理演算器ＡＬＵに入力される。信号ｇｂｂｙｔｅ（内部バスｇｂからのバイト入力指示信号）、ｇｂｓｆｔ２（内部バスｇｂからの入力に対する２ビットシフト指示信号）が活性状態になり、内部バスｇｂから入力されたデータの下位８ビットをゼロ拡張し、２ビットシフトされて、内部バスｄｂから入力された内容と加算される。信号ａｌｕａｂ（ＡＬＵの演算結果をバスａｂに出力する指示信号）が活性状態になり、加算結果（ｅａ）が内部バスａｂに出力され、更に、アドレスバッファＡＢを経由して、内部アドレスバスＩＡＢに出力される。同時に、ロングワードのリードを示すバスコマンドＢＣＭＤが出力される。同時に、レジスタ選択信号を含むデータリード制御信号が生成され、順次、Ｔ４、Ｔ５の制御を行う。具体的には、Ｔ４で信号ｌｄｄ（ＩＤＢからＤＢＲへのロード指示信号）が活性状態になり、リードデータバッファＤＢＲ取り込み制御が指示される。Ｔ５では、信号ｄｂｒｒｄ０（ＤＢＲのリード指示信号）が活性状態になり、リードデータバッファＤＢＲの内容がデスティネーションレジスタである汎用レジスタＥＲ０への転送が指示される。
【０１１４】
リードデータは、Ｔ４で内部データバスＩＤＢに得られ、前記の通り、Ｔ５でリードデータバッファＤＢＲに取り込まれ、Ｔ６で、汎用レジスタＥＲ０へ転送される。同時に、転送データの内容に従って、コンディションコードレジスタＣＣＲの所定のフラグが更新される。
【０１１５】
図１９にはＭＯＶＡ／Ｌ　＠（ｄ：１６，Ｒ１Ｌ），ＥＲ１の実行タイミングが例示される。これは図１１で説明した［配列などの実効アドレス計算用ＭＯＶＡ命令］の命令フォーマットに応ずる命令の実行タイミングを示す。
【０１１６】
前記同様に、Ｔ２で、命令コードが命令デコーダＤＥＣに入力されて、命令の内容が解読される。ディスプレースメントは、Ｔ３でリードデータバッファＤＢＲに取り込まれる。命令コードの一部（レジスタ指定フィード）がレジスタセレクタＲＥＳＬに与えられ、解読される。解読結果に従って、Ｔ３で制御信号・レジスタ選択信号が出力される。信号ｒｓｇｂ１（ＥＲ１からバスｇｂへの出力指示信号）が活性状態になって、汎用レジスタＥＲ１の内容が内部バスｇｂに出力される。また、信号ｄｂｒｄｂ（ＤＢＲからバスｄｂへの出力指示信号）が活性状態になって、ＤＢＲに取り込まれたディスプレースメントが内部バスｄｂに出力される。これらが算術論理演算器ＡＬＵに入力される。信号ｇｂｂｙｔｅ、ｇｂｓｆｔ２信号が活性状態になり、内部バスｇｂから入力されたデータの下位８ビットをゼロ拡張し、２ビットシフトされて、内部バスｄｂから入力された内容と加算され、加算結果が内部バスｗｂ２に出力される。同時に、信号ｗｂｒｄ１（バスｗｂ２からレジスタＥＲ１へのライト指示信号）が活性状態になって、内部バスｗｂ２の内容がデスティネーションレジスタである汎用レジスタＥＲ１に格納される。特に制限はされないものの、実効アドレスの転送命令であるＭＯＶＡの場合は、コンディションコードレジスタＣＣＲは保持される。
【０１１７】
図２０にはＢＲＡ　Ｒ２の実行タイミングが例示される。これは図１１で説明した［分岐命令１］の命令フォーマットに応ずる命令の実行タイミングを示す。
【０１１８】
前記同様に、Ｔ２で、命令コードが命令デコーダＤＥＣに入力されて、命令の内容が解読される。命令コードの一部（レジスタ指定フィード）がレジスタセレクタＲＥＳＬに与えられ、解読される。解読結果に従って、Ｔ２では、命令リードが抑止される。Ｔ３で制御信号・レジスタ選択信号が出力される。信号ｒｓｇｂ２が活性状態になって、汎用レジスタＥＲ２の内容が内部バスｇｂに出力される。また、図示を省略する信号ｐｃｄｂ（ＰＣの値のバスｄｂへの出力指示信号）が活性状態になって、プログラムカウンタＰＣの値が内部バスｄｂに出力される。これらが算術論理演算器ＡＬＵに入力される。信号ｇｂｗｏｒｄ、ｇｂｓｆｔ１が活性状態になり、内部バスｇｂから入力されたデータの下位１６ビットをゼロ拡張し、１ビットシフトされて、内部バスｄｂから入力された内容と加算され、加算結果が内部バスａｂに出力される。内部バスａｂに出力されたアドレス（ｔａｒｇｅｔ）は、アドレスバッファＡＢを経由して、内部アドレスバスＩＡＢに出力される。同時に、命令リードを示すバスコマンドＢＣＭＤが出力される。また、内部バスａｂに出力された内容は、インクリメンタで＋２され、プログラムカウンタＰＣに格納される。
【０１１９】
Ｔ４では、更新されたプログラムカウンタＰＣの値に従って、命令リードとプログラムカウンタＰＣのインクリメントが行われる。Ｔ５では、Ｔ３でリードした分岐先の命令コードが命令デコーダＤＥＣに入力されて、分岐先の命令の内容が解読される。
【０１２０】
図２１にはＪＭＰ　＠＠ａａ：７の実行タイミングが例示される。これは図１１で説明した［分岐命令２］の命令フォーマットに応ずる命令の実行タイミングを示す。
【０１２１】
前記同様に、Ｔ２で、命令コードが命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、制御信号ａａ７ｒｄが活性状態になり、Ｔ２では、アドレスバッファＡＢに、命令コードの一部（ビット６〜０）と、上位ビットに固定値（Ｈ’８０）及びベクタベースレジスタＶＢＲの内容が与えられる。更に、ＣＰＵ動作モード（ｍｏｄｅ）に応じて、ミニマムモードの場合は１ビット、マキシマムモードの場合は２ビットシフトが行われ、内部アドレスバスＩＡＢに出力される。同時に、ミニマムモードの場合はワード、マキシマムモードの場合はロングワードのリードを示すバスコマンドＢＣＭＤが出力される。Ｔ３では、待機状態とされる。サブルーチン分岐命令の場合は、このステートでスタック操作を行うとよい。
【０１２２】
Ｔ４で、リードしたデータがリードデータバッファＤＢＲに格納され、この内容が、内部バスａｂと、アドレスバッファＡＢを経由して、内部アドレスバスＩＡＢに出力される。同時に、命令リードを示すバスコマンドＢＣＭＤが出力される。また、内部バスａｂに出力された内容は、インクリメンタＩＮＣで＋２され、プログラムカウンタＰＣに格納される。
【０１２３】
Ｔ５では、更新されたプログラムカウンタＰＣの値に従って、命令リードとプログラムカウンタＰＣのインクリメントが行われる。Ｔ６では、Ｔ３でリードした分岐先の命令コードが命令デコーダＤＥＣに入力されて、分岐先の命令の内容が解読される。
【０１２４】
絶対アドレス３２ビットの分岐命令を、命令コードを１６ビット単位でリードする場合に比較して、実行ステート数を同等にできる。命令コードを３２ビット単位でリードしたりして、絶対アドレス３２ビットの分岐命令の実行開始前に、絶対アドレス３２ビットをリード済みであれば、拡張メモリ間接のアドレシングモードより、高速に実行できるので、高速な分岐が必要な処理は絶対アドレス３２ビット分岐命令を使用すればよい。また、分岐先が共通な分岐命令が多数あって、さほど高速な分岐が必要でない分岐命令では、拡張メモリ間接アドレシングモードの分岐命令を使用すればよい。この指定は、Ｃコンパイラのオプションや、ソースプログラムの制御命令として、指定可能にするとよい。
【０１２５】
図２２にはＢＦＬＤ　＃ｘｘ，＠ａａ：１６，Ｒ３Ｈの実行タイミングが例示される。これは図１１で説明した［ビットフィールド命令］の命令フォーマットに応ずる命令の実行タイミングを示す。
【０１２６】
前記同様に、Ｔ２で、命令コード第１ワード（ｂｆｌｄ−１）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。第２ワードの絶対アドレス（ｂｆｌｄ−２）は、Ｔ３でリードデータバッファＤＢＲに取り込まれる。Ｔ４で第３ワード（ｂｆｌｄ−３）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。
【０１２７】
解読結果に従って、Ｔ３で、夫々図示を省略する信号ｄｂｒａｂ（バッファＤＢＲからバスａｂへの出力指示信号）、ｄｂｒｅｘｔ（バッファＤＢＲの保持情報に対する符号拡張の指示信号）が活性状態になって、下位１６ビットを符号拡張し、内部バスａｂ、アドレスバッファＡＢを経由して、内部アドレスバスＩＡＢに出力される。同時に、バイトのリードを示すバスコマンドＢＣＭＤが出力される。リードしたデータは、Ｔ５でリードデータバッファＤＢＲに取り込まれる。
【０１２８】
Ｔ５で制御信号・レジスタ選択信号が出力される。信号ｄｂｒｇｂが活性状態になって、リードデータが内部バスｇｂに出力され、また、命令コードの一部のイミディエイトデータが、算術論理演算器ＡＬＵに入力される。信号ｂｆｌｄが活性状態になって、算術論理演算器ＡＬＵがビットフィールドロード演算を行い、演算結果が内部バスｗｂ２に出力される。同時に、信号ｗｂｒｄ３ｈ（バスｗｂ２から汎用レジスタＲ３Ｈへのロード指示信号）が活性状態になって、内部バスｗｂ２の内容がデスティネーションレジスタである汎用レジスタＲ３Ｈに格納される。特に制限はされないものの、ＢＦＬＤ命令の場合は、コンディションコードレジスタＣＣＲは保持される。
【０１２９】
図２３にはＢＦＳＴ　Ｒ４Ｌ，＃ｘｘ，＠ＥＲ３の実行タイミングが示される。これは図１１で説明した［ビットフィールド命令］の命令フォーマットに応ずる図２２とは別の命令の実行タイミングを示す。
【０１３０】
前記同様に、Ｔ２で、命令コード第１ワード（ｂｆｓｔ−１）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。Ｔ３で第２ワード（ｂｆｓｔ−２）が命令デコーダＤＥＣに入力されて、命令の内容が解読される。解読結果に従って、Ｔ２で、図示を省略する信号ｙｒｓａｂ３が活性状態になって、汎用レジスタＥＲ３の内容が、内部バスａｂ、アドレスバッファＡＢを経由して、内部アドレスバスＩＡＢに出力される。同時に、バイトのリードを示すバスコマンドＢＣＭＤが出力される。リードしたデータは、Ｔ４でリードデータバッファＤＢＲに取り込まれる。
【０１３１】
Ｔ４で制御信号・レジスタ選択信号が出力される。信号ｄｂｒｇｂが活性状態になって、リードデータが内部バスｇｂに出力され、信号ｒｄｄｂ４ｌが活性状態になって、汎用レジスタＲ４Ｌの内容が内部バスｄｂに出力され、また、命令コードの一部のイミディエイトデータが、算術論理演算器ＡＬＵに入力される。信号ｂｆｓｔが活性状態になって、算術論理演算器ＡＬＵがビットフィールドストア演算を行い、演算結果が内部バスｗｂ２に出力される。同時に、信号ｗｂｄｂｗが活性状態になって、内部バスｗｂ２の内容が、Ｔ５で、ライトデータバッファＤＢＷに格納される。Ｔ４で同時に、Ｔ２と同じ内容が、内部アドレスバスＩＡＢに出力される。これは、Ｔ２で、テンポラリレジスタＴＲに保持するようにし、Ｔ４で内部バスａｂに出力するとよい。これについては、特願２０００−１６１１３７号で別に提案した。或いは、アドレスバッファＡＢに保持してもよい。Ｔ４で更に、バイトのライトを示すバスコマンドＢＣＭＤが出力される。Ｔ５で、ライトデータバッファＤＢＷの内容が内部データバスＩＤＢに出力される。特に制限はされないものの、ＢＦＳＴ命令の場合は、コンディションコードレジスタＣＣＲの値は保持される。
【０１３２】
図２４には前記ＣＰＵ２の開発環境の概略が示される。開発者は、各種エディタなどを用いて、Ｃ言語乃至アセンブリ言語でプログラムを作成する。これは通常、複数のモジュールに分割して作成される。
【０１３３】
Ｃコンパイラ３０は、開発者の作成したそれぞれのＣ言語ソースプログラム３１を入力し、アセンブリ言語ソースプログラム乃至オブジェクトモジュールを出力する。コンパイル時のオプションなどとして、拡張メモリ間接として使用すべき、関数などを指定可能にすることもできる。
【０１３４】
アセンブラ３２は、アセンブリ言語ソースプログラム３３を入力し、オブジェクトモジュールを出力する。
【０１３５】
リンケージエディタ３４は、上記Ｃコンパイラやアセンブラの生成した、複数のオブジェクトモジュール３５を入力して、各モジュールの外部参照や相対アドレスなどの解決を行い、１つのプログラムに結合して、ロードモジュール３６を出力する。このとき、プログラムを解析して、ディスプレースメントや絶対アドレスのビット長を決める。また、分岐命令の分岐先の頻度の高いものを、拡張メモリ間接などの短い命令コードの命令を割当てるようにする。要するに、リンク時に最適化を行なう。
【０１３６】
ロードモジュール３６は、シミュレータ／デバッガ３７に入力して、パーソナルコンピュータなどのシステム開発装置上で、ＣＰＵ２の動作をシミュレーションし、実行結果を表示し、プログラムの解析や評価を行うことができる。また、エミュレータ３８に入力して、実際の応用システム上などで動作する、いわゆるインサーキットエミュレーションを行い、マイクロコンピュータ全体としての、実動作の解析や評価を行うことができる。さらに、ロードモジュールをＰＲＯＭライタ３９に入力して、マイクロコンピュータの内蔵ＲＯＭがフラッシュメモリなどの場合や、外部のフラッシュメモリなどに、作成したプログラムをロードすることができる。必要に応じて、オブジェクトコンバータなどによって、所望のフォーマットに変換する。このほかに、ライブラリアンとして、汎用的なサブルーチンなどを提供することもできる。
【０１３７】
以上説明したマイクロコンピュータによれば、以下の作用効果を得ることができる。
【０１３８】
（１）従来複数の命令を使用して実現していた処理に対応する命令を実行する機能を有することにより、使い勝手を向上するとともに、プログラム容量を縮小し、処理速度を向上することができる。プログラム容量を縮小することによって、ひいては、プログラム格納用のＲＯＭなどのメモリ容量を縮小し、費用を節約することができる。
【０１３９】
（２）インデックスレジスタの使用と、データレジスタの使用を同じ単位で行うことによって、プログラミングを容易にし、上位の汎用レジスタを別のデータレジスタとして使用することを容易にできる。
【０１４０】
（３）汎用レジスタ内容をインデックスレジスタとする実効アドレス計算を行い、結果を同一の汎用レジスタに格納する命令は、使用するレジスタフィールドを少なくし、一旦使用した汎用レジスタは、通常複数回使用することは少ないから、使い勝手を損なわず、命令コード長を短縮し、或いは、他の命令コードの追加を可能にすることができる。
【０１４１】
（４）インデックスレジスタは、下位詰めで使用することで、アドレスレジスタの本数と同一にでき、命令フォーマットを共通にしやすい。既存のＣＰＵに追加する場合も追加しやすい。
【０１４２】
（５）拡張メモリ間接は、例外処理ベクタと連続した領域にサブルーチンベクタテーブルのマッピングを可能にし、プログラミングの容易化に寄与することができる。例外処理ベクタテーブルとサブルーチンベクタテーブルが重ならないようにして、有効活用ができる。ベクタベースレジスタＶＢＲを例外処理と共にサブルーチンコールにも共用すれば、資源の有効活用と、使い勝手の向上を図ることができる。
【０１４３】
（６）Ｃコンパイラで、拡張メモリ間接の使用を選択することにより、効率的に、プログラム容量の削減を行うことができる。
【０１４４】
（７）ビットフィールドをイミディエイトで指定することにより、論理構成を容易にできる。ビットフィールド演算部を、算術演算器は桁上がりを有する算術論理演算と並列とし、遅延時間を均等にして、遅延時間の増加を抑止できる。
【０１４５】
（８）サブルーチンコールの先頭アドレステーブルをポイントする専用サブルーチンベクタベースレジスタＴＢＲを、例外処理用のベクタベースレジスタＶＢＲとは別に導入することにより、コード効率、ジャンプ可能な範囲の全アドレス空間対応、自由に配置できる専用サブルーチンベクタテーブルエリアによるプログラミングの容易化、を満たすことができる。　以上本発明者等によってなされた発明を実施例に限定されるものではなく、その要旨を逸しない範囲において種々変更可能である。
【０１４６】
例えば、汎用レジスタは、アドレス及びデータに共通に利用可能なものである必要はなく、一部または全部がアドレス専用またはデータ専用のものであってもよい。汎用レジスタのデータサイズについても任意とすることができる。また、インデックスレジスタは、下位詰めで使用するものとしているが、汎用レジスタＲＨや、汎用レジスタＥを使用可能にしてもよい。
【０１４７】
ＣＰＵの命令体系や命令フォーマットは任意に変形できる。例えば、ＭＯＶＡ命令は同一の汎用レジスタを指定するものとしたが、他の汎用レジスタや、メモリ上のデータをソース（インデックスレジスタ）とすることもできる。ディスプレースメント付インデックスレジスタ間接は、転送命令のほか、メモリを指定する他の演算命令などに適用することもできる。ディスプレースメント付インデックスレジスタ間接における、ゼロ拡張とシフトは、ＡＬＵの機能とするほか、内部バスｇｂの機能としてもよい。
【０１４８】
ベクタベースレジスタＶＢＲはなくてもよい。動作モードなどに従って、切替えるようなものでもよい。ビットフィールド転送のための詳細な論理や実行シーケンスは変形が可能である。図２５の（６ａ）と（６ｂ）の双方のアドレシングモードを共に持つことは必須ではなく、何れか一方だけであってもよい。
【０１４９】
また、命令コードの基本単位１６ビットに限定する必要はなく、８ビット或いは３２ビットなど任意のビット幅とできる。拡張メモリ間接による分岐命令は、絶対アドレスによる分岐命令より命令コード長が短ければよい。簡単のために、バス幅を３２ビットとし、命令リードを１６ビット単位としたが、命令リードを３２ビット単位にして高速化することができる。これについては、特願平１１−１６７８１２号で提案した。また、バス幅を１６ビットとして、ロングワードのリード／ライトを、ワード単位の２回のリード／ライトで実行するようにしてもよい。
【０１５０】
プログラムカウンタのビット数や、そのほかの制御レジスタの構成なども任意にできる。ＶＢＲは、ＣＰＵ内部のレジスタとして持つほか、内部Ｉ／Ｏレジスタとしてもよい。ビット数も任意にできる。或いは、動作モードなどや内部Ｉ／Ｏレジスタの設定などで、固定値を切替えるようにしてもよい。
【０１５１】
以上の説明では主として本発明者によってなされた発明をその背景となった利用分野であるシングルチップマイクロコンピュータに適用した場合について説明したが、それに限定されるものではなく、その他のシステムオンチップのマイクロコンピュータ、データプロセッサ、汎用マイクロプロセッサ等のデータ処理装置に広く適用することが可能である。本発明は少なくとも、命令を解読して処理し、演算処理を行う条件のものに適用することができる。
【０１５２】
【発明の効果】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記の通りである。
【０１５３】
すなわち、従来複数の命令を使用して実現していた処理に対応する命令を実行する機能を有することにより、使い勝手を向上するとともに、プログラム容量を縮小し、処理速度を向上することができる。プログラム容量を縮小することによって、ひいては、プログラム格納用のＲＯＭなどのメモリ容量を縮小し、費用を節約することができる。
【図面の簡単な説明】
【図１】本発明が適用されたＣＰＵの詳細を例示するブロック図である。
【図２】本発明の適用されたシングルチップマイクロコンピュータのブロック図である。
【図３】ＣＰＵに内蔵された汎用レジスタ及び制御レジスタの構成を例示する説明図である。
【図４】汎用レジスタの使用形態を例示する説明図である。
【図５】ＣＰＵのアドレス空間を例示する説明図である。
【図６】転送／演算命令の実効アドレスの計算方法を例示する説明図である。
【図７】転送／演算命令の実効アドレスの更に別の計算方法を例示する説明図である。
【図８】分岐命令の実効アドレスの計算方法を例示する説明図である。
【図９】分岐命令の実効アドレスの更に別の計算方法を例示する説明図である。
【図１０】ＣＰＵの機械語の命令フォーマットを例示するフォーマット図である。
【図１１】本発明に関する命令フォーマットを例示する説明図である。
【図１２】ビットフィールド命令によるデータ処理機能を例示する説明図である。
【図１３】アドレスバッファの機能を論理記述で例示する説明図である。
【図１４】算術論理演算器の主要部の構成を例示するブロック図である。
【図１５】入力セレクタのゼロ拡張機能と１ビットシフト又は２ビットシフト機能を論理記述で例示する説明図である。
【図１６】ＢＦＬＤ演算機能を論理記述で例示する説明図である。
【図１７】ＢＦＳＴ演算機能を論理記述で例示する説明図である。
【図１８】ＭＯＶ．Ｌ＠（ｄ：１６，Ｒ１Ｌ），ＥＲ０の命令実行タイミングを例示するタイミングチャートである。
【図１９】ＭＯＶＡ／Ｌ　＠（ｄ：１６，Ｒ１Ｌ），ＥＲ１の命令実行タイミングを例示するタイミングチャートである。
【図２０】ＢＲＡ　Ｒ２の命令実行タイミングを例示するタイミングチャートである。
【図２１】ＪＭＰ　＠＠ａａ：７の命令実行タイミングを例示するタイミングチャートである。
【図２２】ＢＦＬＤ　＃ｘｘ，＠ａａ：１６，Ｒ３Ｈの命令実行タイミングを例示するタイミングチャートである。
【図２３】ＢＦＳＴ　Ｒ４Ｌ，＃ｘｘ，＠ＥＲ３の命令実行タイミングを例示するタイミングチャートである。
【図２４】ＣＰＵの開発環境の概略を例示する説明図である。
【図２５】拡張メモリ間接アドレシングモードのアドレス演算手法の詳細を例示する説明図である。
【図２６】図２５の（６ｂ）に示されるアドレシングモードによるサブルーチン命令による動作を示す説明図である。
【図２７】サブルーチンコール群の先頭アドレスを示す専用サブルーチンベースレジスタをさらに導入した場合におけるサブルーチン命令による動作を示す説明図である
。
【符号の説明】
１　マイクロコンピュータ
２　ＣＰＵ
２Ａ　制御部
２Ｂ　実行部
ＩＲ　命令レジスタ
ＤＥＣ　命令デコーダ
ＥＲ０〜ＥＲ７　汎用レジスタ
ＶＢＲ　ベクタベースレジスタ
ＡＬＵ　算術論理演算器
ＩＮＣ　インクリメンタ
ＩＤＢ　内部データバス
ＩＡＢ　内部アドレスバス
ＴＢＲ　サブルーチンベクタテーブルレジスタ
ＳＢＲ　サブルーチンベースレジスタ
【図１】
2004086837.tif 000004
【図２】
2004086837.tif 000005
【図３】
2004086837.tif 000006
【図４】
2004086837.tif 000007
【図５】
2004086837.tif 000008
【図６】
2004086837.tif 000009
【図７】
2004086837.tif 000010
【図８】
2004086837.tif 000011
【図９】
2004086837.tif 000012
【図１０】
2004086837.tif 000013
【図１１】
2004086837.tif 000014
【図１２】
2004086837.tif 000015
【図１３】
2004086837.tif 000016
【図１４】
2004086837.tif 000017
【図１５】
2004086837.tif 000018
【図１６】
2004086837.tif 000019
【図１７】
2004086837.tif 000020
【図１８】
2004086837.tif 000021
【図１９】
2004086837.tif 000022
【図２０】
2004086837.tif 000023
【図２１】
2004086837.tif 000024
【図２２】
2004086837.tif 000025
【図２３】
2004086837.tif 000026
【図２４】
2004086837.tif 000027
【図２５】
2004086837.tif 000028
【図２６】
2004086837.tif 000029
【図２７】
2004086837.tif 000030