《検討課題A乃至Cの解決手段に関する実施の形態》
先ず、前記検討課題A乃至Cの解決手段に関する発明の具体例を説明する。図2には、本発明に係るデータ処理装置の一例であるシングルチップマイクロコンピュータが示される。
同図に示されるシングルチップマイクロコンピュータ1は、全体の制御を司るCPU2、割込コントローラ(INT)3、CPU2の処理プログラムなどを格納するメモリであるROM4、前記CPU2の作業領域並びにデータの一時記憶に用いられるメモリであるRAM5、タイマ〔A〕6、タイマ〔B〕7、シリアルコミュニケーションインタフェース(SCI)8、A/D変換器9、第1乃至第9入出力ポート(IOP〔1〕〜IOP〔9〕)11〜19、クロック発振器(CPG)20、システムコントローラ(SYSC)21及びDMAC(ダイレクトメモリアクセスコントローラ)33の機能ブロック乃至はモジュールから構成され、公知の半導体製造技術により単結晶シリコンのような1つの半導体基板上に形成される。CPUCR22はシステムコントローラ21に配置されたコントロールレジスタである。
前記CPU2は主にROM4から命令をフェッチし、これを解読して演算動作や制御動作を行う。前記DMAC33はCPU2とバス30を共有し、CPU2から設定されたデータ転送制御条件に従って、CPU2に代わってデータ転送制御を行う事ができる。DREQはマイクロコンピュータ1の外部からDMAC33に与えられるデータ転送要求信号である。DMAC33はデータ転送要求信号DREQによるデータ転送要求を受け付けるとき、データ転送要求承認信号DACKを要求元に返す。
かかるシングルチップマイクロコンピュータ1は、電源端子として、グランドレベル(Vss)、電源電圧レベル(Vcc)、アナロググランドレベル(AVss)、アナログ電源電圧レベル(AVcc)、アナログ基準電圧(Vref)の入力端子を有する。そして、専用制御端子として、リセット(RES)、スタンバイ(STBY)、モード制御(MD0、MD1、MD2)、クロック入力(EXTAL、XTAL)等の各端子を有する。
シングルチップマイクロコンピュータ1は、前記CPG20の端子EXTAL、XTALに接続される水晶発振子またはEXTAL端子に入力される外部クロックに基づいて生成される基準クロック(システムクロック)に同期して、動作を行う。この基準クロックの1周期をステートと呼ぶ。
シングルチップマイクロコンピュータ1の機能ブロックは、内部バス30によって相互に接続さる。シングルチップマイクロコンピュータ1は、バスの制御を行なう、図示を省略したバスコントローラを内蔵している。内部バス30は内部アドレスバス・内部データバスの他、リード信号・ライト信号等のコントロールバスを含み、コントロールバスはさらにバスサイズ信号を含んだり、これらをコード化したバスコマンドなどとしてもよい。或いはシステムクロックなどを含んでもよい。
特に図示はしないが、内部アドレスバスはその位相によって、IAB、PABの2種類があり、内部データバスもその位相によって、IDB、PDBが存在する。例えば、リードの場合、IABの後、PABは0.5ステート遅延する。PABとPDBは同期している。PDBの後、IDBは0.5ステート遅延する。IABとPAB、IDBとPDBのインタフェースは、前記バスコントローラが行なう。
かかる機能ブロックやモジュールは内部バス30を介して、CPU2によってリード/ライトさる。内部バス30のデータバス幅は16ビットとする。CPU2は、内蔵ROM4、RAM5を1ステートでリード/ライトすることができる。
なお、タイマ〔A〕6、タイマ〔B〕7、SCI8、A/D変換器9、IOP〔1〕11〜IOP〔9〕19、CPG20が有す制御レジスタを総称して、内部I/Oレジスタと呼ぶ。
各入出力ポート11〜19は、アドレスバス、データバス、バス制御信号、あるいはタイマ6,7、SCI8、A/D変換器9の入出力端子と兼用されている。すなわち、タイマ6、7、SCI8、A/D変換器9は、それぞれ入力信号を有し、入出力ポートと兼用にされた端子を介して、外部と入出力されるものである。例えばIOP〔5〕、IOP〔6〕、IOP〔7〕は、タイマ6,7の入出力端子と兼用され、IOP〔8〕はSCI8の入出力端子と兼用にされている。アナログデータの入力端子は、IOP〔9〕と兼用にされている。
かかるシングルチップマイクロコンピュータ1にリセット信号RESが与えられると、CPU2を始めとし、シングルチップマイクロコンピュータ1はリセット状態になる。このリセットが解除されると、CPU2は所定のアドレスからスタートアドレスをリードして、このスタートアドレスから命令のリードを開始するリセット例外処理を行う。この後、CPU2は逐次、ROM4などから命令をリードし、解読して、その解読内容に基づいてデータの処理或はRAM5、タイマ6,7等とのデータ転送を行う。即ち、CPU2は、入出力ポート11〜19等から入力されるデータ、或はSCI8などから入力される指示を参照しつつ、ROM4などに記憶されている命令に基づいて処理を行い、その結果に基づいて、入出力ポート11〜19、タイマ6,7等を使用しつて、外部に信号を出力し、各種外部接続機器の制御を行う。
タイマ6,7、SCI8、外部信号などの状態を割込み信号として、CPU2に伝達することができる。割込信号は、A/D変換器9、タイマ〔A〕6、タイマ〔B〕7、SCI8、入出力ポート11〜19が出力し、割込コントローラ3はこれを入力して、所定のレジスタなどの指定に基づいて、CPU2に割込要求信号31を与える。割込要因が発生すると、CPU割込要求が発生され、CPU2は実行中の処理を中断して、例外処理状態を経て、所定の処理ルーチンに分岐し、所望の処理を行い、割込要因をクリアしたりする。所定の処理ルーチンの最後には、通常復帰命令が実行され、この命令を実行することによって前記中断した処理を再開する。
図3には、本発明の適用された前記CPU2の汎用レジスタ及びコントロールレジスタの構成例(プログラミングモデル)として上位のCPU2のプログラミングモデルが示される。
CPU2は、32ビット長の汎用レジスタを32本持っている。汎用レジスタER0〜ER31は、すべて同機能を持っており、アドレスレジスタとしてもデータレジスタとしても使用することができる。
データレジスタとしてしては32ビット(ロングワード)、16ビット(ワード)および8ビット(バイト)のレジスタとして使用きる。アドレスレジスタおよび32ビットレジスタとしては、一括して汎用レジスタER(ER0〜ER31)として使用する。16ビットレジスタとしては、汎用レジスタERを分割して汎用レジスタE(E0〜E31)、汎用レジスタR(R0〜R31)として使用する。これらは同等の機能を持っており、16ビットジスタを最大64本まで使用することができる。8ビットレジスタとしては、汎用レジスタRを分割して汎用レジスタRH(R0H〜R31H)、汎用レジスタRL(R0L〜R31L)として使用する。これらは同等の機能を持っており、8ビットレジスタを最大64本まで使用することができる。各レジスタ独立に使用方法を選択することができる。
汎用レジスタER7、ER15、ER23、ER31には、汎用レジスタとしての機能に加えて、スタックポインタ(SP)としての機能が割り当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。例外処理は前記割込み処理を含む。図示されない制御レジスタなどの設定によって、サブルーチン分岐用のスタックポインタと、例外処理用のスタックポインタを、独立して選択することができる。
なお、内部論理構成上はER0〜ER7をグループ0、ER8〜ER15をグループ1、ER16〜ER23をグループ2、ER24〜ER31をグループ3としている。グループ0が既存のCPU(下位のCPU)と同一とされる。
それらの汎用レジスタは、プログラミング仕様上は相違なく、すべて同等に使用できる。少なくとも、アセンブリ言語で書く場合には、グループを意識せず、例えば、R0H、E8、R16、ER31、などと記述できる。例えば平成7年3月(株)日立製作所発行『H8S/2600シリーズH8S/2000シリーズプログラミングマニュアル』のアセンブラフォーマットに従って記述すれば、“MOV.L ER0,ER31”或いは、“ADD.W E8,R16”などとレジスタ番号のみで記述できる。
図3において、PCで示されるものは24ビットのカウンタ(プログラムカウンタ)で、CPU2が次に実行する命令のアドレスを示す。特に制限されないが、CPU2の命令は、全て2バイト(ワード)を単位としているため、最下位ビットは無効であり、命令リード時には最下位ビットは0とみなされる。
CCRで示されるものは8ビットのレジスタ(コンディションコードレジスタ)で、CPU2の内部状態を示している。割込みマスクビット(I)とハーフキャリ(H)、ネガティブ(N)、ゼロ(Z)、オーバフロー(V)、キャリ(C)の各フラグを含む8ビットで構成されている。
EXRで示されるものは8ビットのレジスタで、割込みなどの例外処理の制御を行なう。割込みマスクビット(I2〜I0)とトレース(T)の各ビットを含んでいる。
汎用レジスタ上のデータ構成例、メモリ空間上のデータ構成、アドレッシングモードと実効アドレスの計算方法などについては、平成7年3月(株)日立製作所発行『H8S/2600シリーズH8S/2000シリーズプログラミングマニュアル』記載のCPUと同様であり、アドレス空間16MB(乃至データ用4GB)を利用できる。マキシマムモード/ミニマムモード(前記平成7年3月(株)日立製作所発行『H8S/2600シリーズH8S/2000シリーズプログラミングマニュアル』の記載ではアドバンスト/ノーマルモード)を持って、それぞれ、アドレス空間64kバイト/16Mバイト(乃至データ用4Gバイト)を選択できる。
図4にはCPU2に対する第1の下位互換のCPUのプログラミングモデルが示される。同図に示されるプログラミングモデルは、平成元年7月(株)日立製作所発行『H8/300シリーズプログラミングマニュアル』記載のCPUと同様である。
第1の下位互換のCPUは、16ビット長の汎用レジスタを8本持っている。汎用レジスタは、全て同機能を持っており、アドレスレジスタとしてもデータレジスタとしても使用することができる。
データレジスタとしてしては16ビットおよび8ビットレジスタとして使用できる。アドレスレジスタおよび16ビットレジスタとしては、一括して汎用レジスタR(R0〜R7)として使用する。8ビットレジスタとしては、汎用レジスタRを分割して汎用レジスタRH(R0H〜R7H)、汎用レジスタRL(R0L〜R7L)として使用する。これらは同等の機能を持っており、8ビットレジスタを最大16本まで使用することができる。各レジスタ独立に使用方法を選択することができる。
汎用レジスタR7には、前記同様に、汎用レジスタとしての機能に加えて、スタックポインタ(SP)としての機能が割り当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。
アドレス空間として、64kバイトのアドレス空間を利用でき、ベクタやスタックの構造などが前記上位CPUのミニマムモードと同等の動作になる。
前記図3のプログラミングモデルを有する上位のCPU2は、図4の第1の下位互換のCPUの汎用レジスタ及び命令セットを包含している。すなわち、上位CPU2が第1の下位CPUと互換を保つ為に、詳細を後述するように、汎用レジスタの拡張、命令セットやアドレシングモードの組み合わせの拡張が行われている。
図5にはCPU2に対する第2の下位互換のCPUのプログラミングモデルが示される。
前記図3のプログラミングモデルを有する上位のCPU2は、図5の第2の下位互換(下位互換を単に下位とも称する)のCPUの汎用レジスタ及び命令セットを包含している。すなわち、上位CPU2が第1の下位CPUと互換を保つ為に、詳細を後述するように、汎用レジスタの拡張、命令セットやアドレシングモードの組み合わせの拡張が行われている。一方、図4の第1の下位CPUに対しては、図5の第2の下位CPUは、汎用レジスタ、命令セットを包含したり、包含されたりしない関係を有する。例えば、図4の第1の下位CPUに対して、図5の第2の下位CPUは汎用レジスタのビット長が大きいし、図5の第2の下位CPUに対して、図4の第1の下位CPUは汎用レジスタの本数が大きい。
第2の下位互換のCPUは、32ビット長の汎用レジスタを4本持っている。汎用レジスタは、全て同機能を持っており、アドレスレジスタとしてもデータレジスタとしても使用することができる。
データレジスタとしてしては32ビット、16ビットおよび8ビットレジスタとして使用きる。アドレスレジスタおよび32ビットレジスタとしては、一括して汎用レジスタER(ER0、ER1、ER7、ER15)として使用する。16ビットレジスタとしては、汎用レジスタERを分割して汎用レジスタE(E0、E1、E7、E15)、汎用レジスタR(R0、R1、R7、R15)として使用する。これらは同等の機能を持っており、16ビットレジスタを最大8本まで使用することができる。8ビットレジスタとしては、汎用レジスタRを分割して汎用レジスタRH(R0H、R1H、R7H、R15H)、汎用レジスタRL(R0L、R1L、R7L、R15L)として使用する。これらは同等の機能を持っており、8ビットレジスタを最大8本まで使用することができる。各レジスタ独立に使用方法を選択することができる。
汎用レジスタER7、ER15には、汎用レジスタとしての機能に加えて、スタックポインタ(SP)としての機能が割り当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。前記同様に、図示されない制御レジスタなどの設定によって、サブルーチン分岐用のスタックポインタと、例外処理用のスタックポインタを、独立して選択することができる。
汎用レジスタのビット長などは、前記上位CPU2と同等であり、同等のアドレス空間16Mバイト(乃至データ用4Gバイト)を利用できる。第2の下位CPUはマキシマムモードに相当するモードのみを持つ。
なお、プログラム上、ER0、R0、R0H、R0L、ER1、R1、R1H、R1Lはそれぞれ、EAX、AX、AH、AL、EBX、BX、BH、BLとしても記述できるようにしている。これらは、汎用レジスタの機能を示すものではなく、本発明とは関係のない、更に別のCPUの記述に合わせたものである。このため、前記更に別のCPUでは単独で使用できないE0、E1は、そのままの記述のみを用いる。この場合、例えば、“ADD.W E1,BX”と、“ADD.W E1,R1”は同一の命令コードに対応する。
図6にはCPUのアドレス空間が示される。なお、シングルチップマイクロコンピュータのアドレスマップとしては、ROMは0番地から、一方、RAM及び内部I/OレジスタはH’FFFFまたはH’FFFFFF番地まで、それぞれアドレス空間の両端になるように配置されるようにする。
上位のCPU2は、前記の通り、16MBのアドレス空間のマキシマムモードと64kBのアドレス空間のミニマムモードを持つ。マキシマムモード/ミニマムモードの選択はモード選択信号MD0〜MD2の状態によって決定される。
マキシマムモードでは、絶対アドレス24ビット(上位に8ビットの予約ビットを付加して、命令コード中は32ビット)で全空間を、絶対アドレス16ビットで0〜 H’7FFF及びH’FF8000〜H’FFFFFFを指定する。
また、例外処理時のベクタは24ビット(メモリ上は32ビットとされ、上位8ビットは無視される)、サブルーチン分岐などにおいて待避/復帰されるPCも24ビットとされる。
ミニマムモードでは、絶対アドレスとレジスタ間接のアドッレシングモードのいずれも、下位16ビットのみを使用し、上位ビットは無視する。例外処理時のベクタは16ビット、サブルーチン分岐などにおいて待避/復帰されるPCも16ビットとされる。
第1の下位CPUは、ミニマムモードに相当する64kBのアドレス空間を持つ。絶対アドレスは16ビットのみを持ち、また、レジスタ間接では16ビットレジスタで、それぞれ全空間を指定する。例外処理時のベクタは16ビット、サブルーチン分岐などにおいて待避/復帰されるPCも16ビットとされる。
第2の下位CPUは、マキシマムモードに相当する16MBのアドレス空間を持つ。絶対アドレスは16ビットのみを持ち、0〜 H’7FFF及びH’FF8000〜H’FFFFFFを指定する。一方、レジスタ間接では32ビットレジスタで、全空間を指定する。絶対アドレスは16ビットでは、RAMと内部I/Oレジスタを合わせて32kBまで、及びROMを32kBまで指定できる。内蔵RAMと内部I/Oレジスタを合わせて32kBの容量は、バスを拡張しない応用分野はこのシングルチップマイクロコンピュータでは十分な容量といえる。また、内蔵RAMと内部I/Oレジスタを合わせて32kBを超える場合には、それ自体の論理的・物理的規模が大きくなるから、敢えて論理的規模の小さい下位CPUを使用する必要性は少なく、上位CPUを使うのが適当と言える。少なくとも、第2の下位CPUを使用して、絶対アドレスで指定できないRAM乃至内部I/Oレジスタを設けて、論理的・物理的規模の縮小を追求するか、上位CPUを使用して、全ての空間を絶対アドレスで指定可能にして、使い勝手を追求するかを選択することができる。
絶対アドレス16ビットで指定できるROMのアドレスが限定されてしまうが、ROMに割り当てる定数などについては、Cコンパイラなどで記述した場合も、モジュール間最適化で、再配置することができる。なお、モジュール間最適化は、各プログラムモジュールをリンクする際に、メモリ配置や関数の呼び出し関係に依存した最適化を行なうものであり、平成9年8月(株)日立製作所発行『H8S,H8/300シリーズCコンパイラユーザーズマニュアル』(第4版)などに記載されている。
なお、例外処理時のベクタは24ビット(メモリ上は32ビットとされ、上位8ビットは無視される)、サブルーチン分岐などにおいて待避/復帰されるPCも24ビットとされる。
図7及び図8には実効アドレスの計算方法として、上位CPU2のマキシマムモードにおける実効アドレス計算方法が例示されている。
図7の(1)に示されるレジスタ間接では命令コード中にレジスタを指定する部分を含み、この命令コードで指定された汎用レジスタERの内容の合計32ビットをアドレスとしてメモリ上のアドレスを指定する。アドレスは24ビットでよいため、上位8ビットは無視する。
図7の(2)、(3)に示されるディスプレースメント付レジスタ間接は、前記レジスタ間接と同様に得られた32ビットのアドレスに、命令コード中に含まれるディスプレースメントを加算した結果をアドレスとしてメモリ上のアドレスを指定する。加算結果はアドレスの指定のみに使用され、汎用レジスタERの内容には反映されない。特に制限はされないものの、ディスプレースメントは32ビットまたは16ビットであり、16ビットディスプレースメントは加算する場合には上位16ビットは符号拡張される。すなわち、ディスプレースメントの上位16ビットは16ビットディスプレースメントのビット15と同じ値であるとして加算が行われる。この場合、32ビットディスプレースメントの上位8ビットは、予約領域とされ、無視される。
図7の(4)に示されるポストインクリメントレジスタ間接は、前記レジスタ間接と同様に得られた32ビットのアドレスでメモリ上のアドレスを指定する。その後、このアドレスに1または2または4を加算し、その加算結果が汎用レジスタERに格納される。メモリ上のバイトデータを指定する場合1が、ワードデータを指定する場合2が、アドレスデータを指定する場合4が、それぞれ加算される。加算結果の上位8ビットも拡張レジスタに格納される。
図7の(5)に示されるプリデクリメントレジスタ間接は、前記レジスタ間接と同様に得られた32ビットのアドレスから1または2または4を減算した結果の24ビットのアドレスでメモリ上のアドレスを指定する。その後、その減算結果が汎用レジスタERに格納される。メモリ上のバイトデータを指定する場合1が、ワードデータを指定する場合2が、アドレスデータを指定する場合4が、それぞれ減算される。前記同様に、アドレスが24ビットでよい場合には、特に制限はされないものの、減算結果の上位8ビットも拡張レジスタに格納される。
図8の(6)、(7)、(8)に示される絶対アドレスは命令コード中に含まれる、8ビット、16ビットまたは24ビットの絶対アドレスをアドレスとしてメモリ上のアドレスを指定する。8ビット絶対アドレスは、上位16ビットが1拡張される。すなわちアドレスのビット23〜8は全ビット1とされる。従って使用可能なアドレスはH’FFFF00〜H’FFFFFFの256バイトである。また、16ビット絶対アドレスは、上位8ビットが符号拡張される。すなわち、16ビット絶対アドレスのビット15が0であればアドレスのビット23〜16は全ビット0とされ、ビット15が1であればアドレスのビット23〜16は全ビット1とされる。従って使用可能なアドレスはH’000000〜H’007FFF及びH’FF8000〜H’FFFFFFの64kバイトである。
図8の(9)、(10)に示されるプログラムカウンタ相対は、プログラムカウンタの内容の24ビットのアドレスに命令コード中に含まれるディスプレースメントを加算した結果をアドレスとしてメモリ上のアドレスを指定する。加算結果はプログラムカウンタに格納される。特に制限はされないものの、ディスプレースメントは16ビットまたは8ビットであり、これらのディスプレースメントは加算する場合には上位8ビットまたは16ビットは符号拡張される。すなわち、ディスプレースメントの上位8ビットは16ビットディスプレースメントのビット15と、または上位16ビットは8ビットディスプレースメントのビット7と同じ値であるとみなして加算が行われる。プログラムカウンタ相対は分岐命令のみで使用される。
尚、ミニマムモードでは、実効アドレスの上位8ビットが無視される。前記の他にイミディエイト、レジスタ直接、メモリ間接などのアドレッシングモードを実行するが、これらは本発明に直接は関係しないので詳細な説明は省略する。
第1の下位CPUのデータ転送命令では、レジスタ間接、16ビットディスプレースメント付レジスタ間接、ポストインクリメント/プリデクリメントレジスタ間接、8/16ビット絶対アドレス、が使用可能である。実効アドレスの計算方法は上位CPU2と同様であるが、上位8ビットが無視され、下位16ビットが有効である。
第2の下位CPUのデータ転送命令では、レジスタ間接、16ビットディスプレースメント付レジスタ間接、ポストインクリメント/プリデクリメントレジスタ間接、8/16ビット絶対アドレス、が使用可能である。なお、絶対アドレス24ビットは分岐命令で使用可能とされる。
図9には本発明に係るCPU2の機械語の命令フォーマットが例示されている。前記第1の下位CPU、第2の下位CPUの命令セットは上位CPU2の命令セットのサブセットとされる。
CPU2の命令は、2バイト(ワード)を単位にしている。各命令はオペレーションフィード(op)、レジスタフィールド(r、gr)、EA拡張部(EA)、およびコンディションフィールド(cc)を含む。特に制限はされないものの、前記平成7年3月(株)日立製作所発行『H8S/2600シリーズH8S/2000シリーズプログラミングマニュアル』記載のCPUと同じ命令フォーマットとしている。
オペレーションフィールド(op)は、命令の機能を表し、アドレッシングモードの指定オペランドの処理内容を指定する。命令の先頭4ビットを必ず含む。2つのオペレーションフィールドを持つ場合もある。
レジスタフィールド(r、gr)は汎用レジスタを指定する。レジスタフィールド(r)はアドレスレジスタのとき3ビット、データレジスタのとき3ビット(32ビットレジスタ)または4ビット(8または16ビットレジスタ)である。2つのレジスタフィールドを持つ場合、またはレジスタフィールドを持たない場合もある。
レジスタフィールド(gr)はグループ0〜グループ3の何れのレジスタセットを選択するかを指定する情報を保持することになる。レジスタフィールド(gr)は4ビット存在するが、図3のレジスタ構成に従えば、特に制限はされないものの、下位2ビットを有効にする。レジスタフィールド(gr)を含むワードは省略可能とされ、省略された場合は、0が与えられたものと想定され、グループ0のレジスタセットが指定されたものと見做され、レジスタフィールド(r)で指定されるレジスタはレジスタ番号が0〜7とされ、汎用レジスタER0〜ER7が選択できる。
例えば、レジスタ番号n=gr[1:0]<<3+r[2:0]で求められる(<<3は3ビット左シフトを示す)。即ち、grを上位とし、rの下位3ビットr[2:0]を下位とした5ビットで指定される番号のレジスタを指定する。例えば、gr=0、r=1の場合はレジスタ番号n=1、となり、gr=2、r=3の場合はレジスタ番号n=19、となる。このレジスタ番号nに対応する汎用レジスタERnの、命令コードのサイズを指定する部分や、r[3]の内容によって、レジスタE、レジスタR、レジスタRH、レジスタRLが指定される。例えば、データサイズがロングワード、ワード、バイトの何れであるかは命令コードのオペレーションフィールドの所定のビットで指定される。データサイズがワード又はバイトのとき、利用するレジスタ位置はr[3]で指定される。r[3]は、rの下位から4ビット目のビットデータを意味する。データサイズがワードのときr[3]=1のときはレジスタEを指定し、r[3]=0のときはレジスタRを意味する。データサイズがバイトのときr[3]=1のときはレジスタRLを指定し、r[3]=0のときはレジスタRHを意味する。
尚、gr1、r1はソースレジスタまたはアドレスレジスタのレジスタ指定フィールドを意味し、gr2、r2はデスティネーションレジスタまたはデータレジスタのレジスタ指定フィールドを意味する。gr1(命令コードの基本ワード中のビット7〜4)はr1(命令コードの基本ワード中のビット7〜4またはビット6〜4)に、gr2(命令コードの基本ワード中のビット3〜0)はr2(命令コードの基本ワード中のビット11〜8またはビット3〜0)に対応する。
EA拡張部(EA)は、イミディエイトデータ、絶対アドレスまたはディスプレースメントを指定する。8ビット、16ビット、または32ビットである。
コンディションフィールド(cc)は条件分岐命令(Bcc命令)の分岐条件を指定する。
図9にはCPU2の機械語の命令フォーマットを示している。レジスタフィールド(gr)を持つ前置命令コード(レジスタ拡張用前置命令コード)を省略すると、既存の命令コードになるようになっている。レジスタフィールド(gr)をグループ指定フィールド(gr)とも記す。例えば、図9の(2)に例示される命令コード“H'0901”を単独で使用する場合、ADD.W R0,R1となり、図9の(3)に例示されるように、それに、グループ指定フィールドを持つ前置命令コード“H'0012”を付加すると、命令コード“ H'00120901”は、 ADD.W R8,R17となる。
また、暗黙的に使用されるグループ0のレジスタセットを指定する前置命令レコード“H'0000”は、特に制限されないが、NOP(無操作)命令とされている。 命令コード“H'00xx”(xxは01〜FF)は、レジスタセットのグループを指定し、連続する次の命令コードを実行する(割込みを禁止する)他は、NOP命令と同様に、PCのインクリメントを行い、最小のステート数で実行される。
グループ指定フィールド(gr)は、4ビットあるので、論理的には汎用レジスタグループを16に拡張することができる。この場合では32ビット汎用レジスタ128本(または16ビット汎用レジスタ256本)を利用できる。
グループ指定フィールド(gr)に対応するオペレーションフィールドは複数種類あってもよい。例えば、単純にレジスタ指定のみを行うものと、そのほかの機能(データサイズなど)を切り換える機能とを併せ持つオペレーションコードとを用意してもよい。
上位CPU2の命令コードのサブセットを、前記第1の下位CPU、第2の下位CPUは持つ。具体的には、前記第1の下位CPUは、レジスタ指定フィールド(gr)を持たない。前記第2の下位CPUは、スタックポインタER15を指定するときのみ、レジスタ指定フィールド(gr)を使用する。
図10にはCPU2のメモリに対する転送命令の詳細な命令フォーマットを例示する。
ここでは、レジスタ間接、ポストインクリメント/プリデクリメントレジスタ間接、16ビットディスプレースメント付きレジスタ間接、16ビット絶対アドレスについて示す。このほかのアドレッシングモードも持つが、詳細な説明は省略する。
レジスタ間接(@ERn)は、命令コードのレジスタフィールド(r)で指定されるアドレスレジスタ(ERn)の内容をアドスとしてメモリ上のオペランドを指定する。
ディスプレースメント付きレジスタ間接(@(d:16,ERn))は、命令コードのレジスタフィールド(r)で指定されるアドレスレジスタ(ERn)の内容に命令コード中に含まれる16ビットディスプレースメント(d)を加算した内容をアドレスとしてメモリ上のオペランドを指定する。加算に際して、16ビットディスプレースメントは符号拡張される。
ポストインクリメントレジスタ間接(@ERn+)は、命令コードのレジスタフィールドで指定されるアドレスレジスタ(ERn)の内容をアドスとしてメモリ上のオペランドを指定する。その後、アドレスレジスタの内容に1、2または4が加算され、加算結果がアドレスレジスタに格納される。バイサイズでは1、ワードサイズでは2、ロングワードサイズでは4がそれぞれ加算される。
プリデクリメントレジスタ間接(@−ERn)は、命令コードのレジスタフィールドで指定されるアドレスレジスタ(ERn)の内容から1,2又は4を減算した内容をアドレスとしてメモリ上のオペランドを指定する。その後、減算結果がアドレスレジスタに格納される。バイトサイズでは1、ワーサイズでは2、ロングワードサイズでは4がそれぞれ減算される。
絶対アドレス(@aa:16)は、命令コード中に含まれる絶対アドレス(aa)で、メモリ上のオペランドを指定する。特に制限はされないものの、16ビット絶対アドレスの場合、上位16ビットは符号拡張される。この場合ビット8〜10がアドレッシングモードを指定するフィールドになっている。
図11乃至図14には上位CPU2によるメモリに対する直接的な演算命令の命令フォーマットにおける命令コードの組合せが例示される。メモリに対する直接的な演算命令とは、既存の命令セットに対して拡張された演算命令である。同図に示される命令フォーマットは、命令拡張用前置命令コードを先頭に、転送命令のコード、演算命令のコード等が付加された、1命令として処理されるべき命令のフォーマットである。尚、図示はしないが、第1の下位CPU、第2の下位CPUは上位CPU2の命令セットのサブセットの命令セットを有する。
前記メモリに対する直接的な演算命令は、制御コード(命令拡張用前置命令コード)、EA1コード、EA2コード、及び演算コードの組合せによって構成される。
EA1、EA2は、図10に示される各アドレッシングモードの転送命令の命令コードと同一にされる。転送方向はリード方向、使用しないレジスタフィールド(r2)は、特に制限はされないが、0とする。
演算コードは、汎用レジスタ間の演算命令の命令コードと同一にされる。EA1コード、EA2コード、演算コードの組合せは意味があるものについては任意にできる。即ち、所望の処理の内容に従って、EA1コード、EA2コード、演算コードの必要なものを組合せる。
例えば、インクリメント処理などは、デスティネーション側データだけしか必要としないから、ソース側データをリードするためのEA1コードは不要である。したがって、インクリメント処理のフォーマットは、前置命令コード、EA2コード、演算コードを組合せて構成される。
加算処理などは、ソース側、デスティネーション側の、メモリを使用する方のEA1,EA2を組合せればよい。ソース側のみをメモリ上のデータとする場合(例えば、ADD.W @ER1,R0)は、命令拡張用前置命令コード、EA1コード(MOV.W @ER1,Rxと同一。Rxは意味を持たないが、前記の通りR0とする)、演算コード(ADD.W Rx,R0と同一)を組合せる。デスティネーション側のみをメモリ上のデータとする場合は(ADD.W R1,@ER0)、命令拡張用前置命令コード、EA2コード、演算コードを組合せる。ソース側、デスティネーション側の両方をメモリ上のデータとする場合(ADD.W @ER1,@ER0)は、図11に例示されるように、命令拡張用前置命令コード、EA1、EA2コード、演算コードを組合せる。なお、ソース側、デスティネーション側の両方を汎用レジスタ上のデータとする場合(ADD.W R1,R0)は、既存の命令であり、演算コードのみでよい。換言すれば、前置命令コードは不要である。
イミディエイトデータとメモリ上のデータとの演算(例えば、ADD.W #xx,@ER1)も、同様であるが、イミディエイトデータはソース側とされるから、図13に例示されるようにEA1コードは必要なく、また、演算コードとして、レジスタ間演算の代わりに、イミディエイト・レジスタ間の演算コード(ADD.W #xx,Rxと同一)を用いる。
メモリ間の転送命令(例えば、MOV.W @ER1,@aa:16)は、前記メモリ間の演算同様に、命令拡張用前置命令コード、EA1コード、EA2コード、及びレジスタ間の転送命令コードを組合せてもよいが、この例では、図12に例示されるように命令拡張用前置命令コード、EA1コード(MOV.W @ER1,Rxと同一)、EA2コード(MOV.W Rx,@aa:16と同一)を組合せる。演算コードは不要とし、EA1コードの転送方向はリード方向、EA2コードの転送方向はライト方向とする。これによって、命令コード長を短縮(演算コード分)し、実行ステート数(演算コードのリード、デスティネーション側データのリード)も短縮できる。
イミディエイトデータのメモリへの転送(例えば、 MOV.W #xx,@ER1)は、前記イミディエイトデータとメモリ上のデータとの演算同様に、命令拡張用前置命令コード、EA2コード、演算コードを組合せてもよいが、ここでの例では、図14に例示されるように命令拡張用前置命令コード、イミディエイト・レジスタ間の転送命令コード(MOV.W #xx,Rxと同一)、EA2コード(MOV.W Rx,@aa:16と同一)を組合せる。これによって、実行ステート数(デスティネーション側データのリード)も短縮できる。
図15には命令拡張用前置命令コード(制御コード)のフォーマットが例示される。同図に示される命令拡張用前置命令コードはソース側、デスティネーション側がメモリであるか否かを夫々示す為のビットを有している。対応ビットが例えば論理値“1”であればメモリ、論理値“0”であれば汎用レジスタを指定するものとする。EA1とEA2の転送命令コードは同一としているため、ソース側がメモリであれば、デスティネーション側に拘らず、命令拡張用前置命令コードに続くものが、EA1コードと判断される。一方、ソース側が汎用レジスタとされ、デスティネーション側がメモリであれば、EA2コードと判断される。そのほか、ロングワードサイズを示す情報を持っている。
また、EA1、EA2の転送命令コードの動作を変更させる情報を持っている。例えば、ポストインクリメント/プリデクリメントレジスタ間接が、メモリのリード/ライトの方向によって一義的に指定されてしまう場合、即ち、ポストインクリメントはライト時、プリデクリメントはリード時などと固定されている命令セットの場合、前記変更情報によって、リード時にポストインクリメント動作を行なったり、ライト時にプリデクリメントを行なったりすることを可能にしている。
図16及び図17にはCPUのアドレッシングモードの組合せについて示される。図16はデータ転送命令について示し、図17は加算命令について示す。加算以外の演算命令も、加算命令と同様にされる。
図16及び図17の“ソース”の各欄における上段、中段、下段には、それぞれ、上位CPU2、第1の下位CPU、第2の下位CPUの、それぞれ、実行可能なデータサイズが示されている。Bはバイト(8ビット)、Wはワード(16ビット)、Lはロングワード(32ビット)を意味する。
アドレッシングモードには図16及び図17に示された他に、分岐命令のみに使用する、プログラムカウンタ相対や、メモリ間接のアドレッシングモードもあるが、ここでは図示を省略している。
上位のCPU2は、データ転送命令、加算命令ともに、ソース/デスティネーションとデータサイズのアドレッシングモードの組合せを任意にできる。但し、8ビット絶対アドレスについては、短縮形としての特性上、また、16ビット単位の命令コードの特性上、バイトサイズのみが実行可能である。
第1の下位CPUは、アドレッシングモードは、アドレス空間64kBであることに対応して限定され、32ビットディスプレースメント付レジスタ間接、32ビット絶対アドレスは実行できない。データサイズは、バイト及びワードである。データ転送命令は、ソース側またはデスティネーション側の一方が、レジスタ直接の場合のみ実行可能である。また、加算命令は、ソース側はイミディエイトまたは汎用レジスタ、デスティネーション側は汎用レジスタに限定されている。即ち、メモリのリード/ライトはデータ転送命令で行い、データの処理は汎用レジスタ上で行なう、いわゆるロードストア型の命令セットを持つ。
第2の下位CPUは、アドレス空間16MBであるものの、プログラムの大容量化に対応することを主目的とし、大規模データの高速処理などが必要とされないような応用分野を考え、アドレッシングモードについては、32ビットディスプレースメント付レジスタ間接、32ビット絶対アドレスは実行できない。データサイズは、メモリ上のデータを指定する場合、バイト及びワードである。ソース側がイミディエイトまたは汎用レジスタ、デスティネーション側が汎用レジスタの場合に限り、ロングワードも可能である。
第2の下位CPUにおいては、汎用レジスタの本数は少ないものの、データ転送命令、加算命令ともに、ソース/デスティネーションのアドレッシングモードの組合せを任意にできる。汎用レジスタとメモリ間の転送命令のデータサイズは、マイクロコンピュータの機能ブロックのデータサイズが8ビット乃至16ビット長であったり、内部データバスが16ビットであったり、またシングルチップマイクロコンピュータの応用されるマイクロコンピュータシステムに必要な分解能などの特性上、16ビット(ワード)または8ビット(バイト)でよい応用分野を考え、32ビット(ロングワード)は持たない。当然、32ビット(ロングワード)のデータについては、16ビット(ワード)のデータ転送を2回行なうことによって、実現できる。
一方、第2の下位CPUでは、汎用レジスタが32ビット構成であり、CPUの内部構成が32ビットであるため、メモリ上のデータのリード/ライトを行なう必要のない、イミディエイト及びレジスタ直接については、32ビット(ロングワード)も実行可能としている。
以上の、上位CPU、第1の下位CPU2、第2の下位CPUは、例えば以下の通り、応用分野やマイクロコンピュータシステムの要求に合わせて選択できる。
シングルチップマイクロコンピュータに内蔵されている機能モジュール、即ち、ROM、RAM、タイマA、タイマB、SCI、A/D変換器、入出力ポートのみを使用して動作するようなマイクロコンピュータシステムについては、プログラム容量が60kB程度(RAM、内部I/Oレジスタを合わせて64kB)以下であれば、第1の下位CPUを内蔵するのが都合がよい。
また、プログラム容量がログラム容量が60kB程度(RAM、内部I/Oレジスタを合わせて64kB)以上であれば、第2の下位CPUを内蔵するのが都合がよい。データとして扱うのは、RAM、内部I/Oレジスタ、及び一部のROMであり、アドレス空間の一部(H’8000〜H’FF7FFF)に、データ転送/演算命令でのアクセスに制約があっても、この部分はROM及び未使用の領域とされるから、問題ない。むしろ、CPUの不必要な機能を削除して、論理的規模を縮小し、費用を縮小する方が望ましい。
かかるシングルチップマイクロコンピュータに内蔵されている機能モジュールのみを使用して動作するようなマイクロコンピュータシステムとしては、カメラなどがあり、例えば、平成6年11月写真工業社発行『写真工業』pp58〜71に記載がある。なお、プログラム容量が大きいことは、そのマイクロコンピュータシステムの機能が高いことを示すと言える。
或いは、シングルチップマイクロコンピュータに内蔵されている機能モジュールに加えて、比較的少ないアドレスを有する専用半導体集積回路などを、シングルチップマイクロコンピュータの外部バスに接続して動作するようなマイクロコンピュータシステムも同様であり、この例としては、光ディスクドライブなどがあり、例えば、平成8年2月日立マイコンシステム社発行『日立マイコン技報』pp38〜39に記載がある。
一方、シングルチップマイクロコンピュータに内蔵されている機能モジュール、即ち、ROM、RAM、タイマA、タイマB、SCI、A/D変換器、入出力ポート以外に、プログラム格納用のROMや、データ格納用のDRAM、キャラクタジェネレートROM(CGROM)や、入出力回路や制御回路などを接続して動作するような場合は、大規模なデータを扱うことになり、例えば配列の処理なども考えられるので、全アドレス空間を制限なく使用可能な上位CPU2を内蔵するのが都合がよい。また、外部のメモリなどを効率的に利用するための高機能のバスコントローラや、高速のデータ転送を行なうためのDMAコントローラなども必要とされるから、相対的に論理的規模の大きい上位CPU2を使用しても、全体的な論理的規模に対する影響が小さいと考えられる。かかるマイクロコンピュータシステムとしては、プリンタなどがある。
図1には上位CPU2の詳細な一例が示される。このCPU2は制御部CONTと実行部EXECから構成される。IDB、IABは前記内部バス30に含まれる内部データバス、内部アドレスバスである。
制御部CONTは、命令レジスタIR1、命令レジスタIR2、命令変更部CHG、命令デコーダDEC、レジスタセレクタRSEL、割込み制御部INTCを有する。特に制御部CONTは、命令拡張用前置命令コードの有無に応じた第1の制御、レジスタ拡張用前置命令コードの有無に応じた第2の制御を行なうようになっている。第1の制御は、メモリデータの直接的演算処理制御であり、命令拡張用前置命令コードに後続するデータ転送命令等の複数の命令コードを1個の命令として処理することにより、メモリ上のデータを直接的に演算可能とする制御を行なう。第2の制御は、上位互換を考慮したレジスタ指定制御であり、一方では拡張された汎用レジスタをレジスタ拡張用前置命令コードを用いて指定するようにし、他方では、省略可能なレジスタ指定フィールドgr(gr1、gr2)が省略されたとき省略不可能なレジスタ指定フィールドr(r1、r2)によるレジスタ指定を暗黙的にレジスタグループ0に含まれるレジスタ指定とみなす制御を行なう。
前記命令デコーダDECは、例えば、マイクロROM或はPLA(Programmable Logic Array)または布線論理で構成される。命令デコーダDECの出力の一部が命令デコーダDECにフィードバックされている。そのようなフィードバック信号は、各命令コード内の遷移に用いるステージコード(TMG)と、命令コード間に用いる制御信号(MODS、MODD)を含む。命令デコーダにおける前記第1の制御の全体的な機能を概説すれば、命令拡張用前置命令コードは制御信号(MODS、MODD)を発生し、EA1コード、EA2コードは、前記制御信号を参照しつつ動作し、更に制御信号を発生したりする。演算コードも制御信号を参照して、データの入出力元/先を切替え、演算処理を行なう。制御信号に従って内部で命令コードも発生する。
命令デコーダDECのそのような第1の制御機能を更に詳述する。図1には命令デコーダDECの一部の機能を概念的に示しており、命令拡張用前記前置命令コード(pf)の解読論理200は、制御信号(mod: MODS、MODDを含む)、割込みマスク信号(mskint)を出力する。そのほかは、NOP(無操作)命令などと同じでよく、実質的な動作を何も行なわない。要するに、制御信号modは、後続の命令コードが命令拡張用前置命令コードに付加された命令コードであることを明示する信号として位置付けられる。
転送命令コード(mov)の解読論理201は、ステートコード信号(nxttmg)、割込みマスク信号(mskint)、汎用レジスタライト信号(Rdwr)、テンポラリレジスタライト信号(TRDwr)を出力する。これらの信号の状態は、前記制御信号(mod:MODS、MODD)によって相違される。例えば、MODS=1のときはテンポラリレジスタライト信号(TRDwr)が、 MODS=0のときは汎用レジスタライト信号(Rdwr)が、それぞれ選択される。そのほかの動作は、メモリ・汎用レジスタ間の転送命令の場合と同様とされる。
演算命令コード(exe)の解読論理202は、割込みマスク信号(mskint)、ソース汎用レジスタリード信号(Rsrd)、デスティネーション汎用レジスタリード信号(Rdrd)、デスティネーション汎用レジスタライト信号(Rdwr)、リードデータバッファリード信号(RDBrd)、テンポラリレジスタリード信号(TRDrd)、テンポラリレジスタライト信号(TRDwr)を出力する。信号Rsrdはソースレジスタとして汎用レジスタをリード、Rdrdはディスティネーションレジスタとして汎用レジスタをリード、Rdwrはディスティネーションレジスタとして汎用レジスタをライト、することを指示する。信号RDBrdは実行部EXECの後述するリードデータバッファをリード、信号TRDrdは後述する実行部EXECのテンポラリレジスタをリード、信号TRDwrは後述する実行部EXECの後述するテンポラリレジスタをライト、することを指示する。それらの信号の状態は、前記制御信号(mod:MODS、MODD)によって相違される。即ち、ソース汎用レジスタリード信号(Rsrd)とテンポラリレジスタリード信号(TRDrd)、デスティネーション汎用レジスタリード信号(Rdrd)とリードデータバッファリード信号(RDBrd)、デスティネーション汎用レジスタライト信号(Rdwr)とテンポラリレジスタライト信号(TRDwr)、がそれぞれ排他的に選択され、汎用レジスタを使用するかテンポラリレジスタ等のラッチ手段を使用するかを選択する。また、デスティネーション側メモリの場合は、CPU内部でライト型転送命令を実行するのと同等の動作を行なうための命令コードを発生させる信号(mkmov)を出力する。そのほかの動作は、汎用レジスタに対する演算命令と同様にされる。
命令レジスタIR1、IR2は、リードした命令を一旦格納する。命令デコーダDECには命令レジスタIR1に格納された命令コードが供給されることになる。命令変更部CHGは、リードした命令以外の命令コードを、命令デコーダDECに与える場合に動作し、そのほかの場合は、命令レジスタIR1の内容を命令デコーダDECに与える。リードした命令以外の命令コードは、割込み制御部INTCの指示によって、割込みなどの例外処理を実行するとき、或いは、命令デコーダDECのからの制御信号mkmovによる指示によって前記内部でライト型転送命令と同等の動作を行なう命令コードを発生させるとき、などに用いる。即ち、デスティネーション側をメモリ上のデータとする場合に、EA2コードで生成したアドレスでメモリライト動作を行なう為の命令コードをCPU内部で自動生成して、命令デコーダDECに供給することによって、本発明の命令の命令コード長を短縮し、実行ステート数も短縮できる。
割込み制御部INTCは、図2の割込みコントローラ(INT)3の出力する割込み要求信号31を受け付ける。また、命令デコーダDECの出力する割込みマスク信号mskintを参照して、割込みがマスクされていなければ、命令変更部CHGに割込みを指示する。この場合、命令変更部CHGは、割り込み例外処理の為の所定の命令コードをそのハードウェアに従って生成する。
図11乃至図14で説明したように、複数の命令コードを一連のものとして実行する場合には、それぞれの命令コードが割込みマスクを制御信号mskintを介して指示して、所定の組合せの命令コードの実行が途切れないようにされる。
レジスタセレクタRSELは、命令デコーダDECからの信号Rsrd,Rdrd,Rdwr等による指示、命令コード中に含まれるレジスタフィールドr1、r2、gr1、gr2の情報に基づいて、汎用レジスタを選択する。
実行部EXECには、汎用レジスタER0〜ER7、プログラムカウンタPC、コンディションコードレジスタCCR、テンポラリレジスタTRA、TRD、算術論理演算器ALU、インクリメンタINC、リードデータバッファRDB、ライトデータバッファWDB、アドレスバッファABを含む。これらのブロックは内部バスGB、DB、WBによって相互に接続されている。
前記実行部EXECに含まれる前記レジスタの内、図3にも示される汎用レジスタER0〜ER31、プログラムカウンタPC、コンディションコードレジスタCCR以外は、プログラミング上は参照できず、CPU2の内部の動作にのみ用いられる。即ち、リードデータバッファRDB、ライトデータバッファWDB、アドレスバッファABなどは、内部バスIAB、IDBとのインタフェースをとるために、一時的にデータをラッチする。テンポラリレジスタTRA、TRDは、マイクロコンピュータ内部の動作に適宜用いられ、例えば演算の途中結果などを一時的に貯える。
リードデータバッファRDBは、ROM4、RAM5、内部I/Oレジスタ、或は図示はされない外部メモリから、リードした命令コードやデータを一時的に格納する。ライトデータバッファWDBはROM4、RAM5、内部I/Oレジスタ、或は外部メモリへのライトデータを一時的に格納する。
アドレスバッファABは、CPU2がリード/ライトするアドレスを一時的に格納する他に、格納した内容に対するインクリメント機能を有している。インクリメント機能を有するアドレスバッファは特開平4−333153号公報などに記載されている。
前記算術論理演算器ALUは、命令によって指定される各種の演算や実効アドレスの計算などに用いられる。前記インクリメンタINCは、主にプログラムカウンタPCの加算に用いられる。また、尚、図1では実行部EXECは汎用レジスタER0〜ER31を単位として算術論理演算器ALUやインクリメンタINCが設けられていように図示されているが、実際は、汎用レジスタのE(16ビット)、H(8ビット)、L(8ビット)の各分割部分毎に分割されて設けられている。
前記命令拡張用前置命令コードに後続する命令コードを用いてメモリ上のデータを直接的に演算する場合には、テンポラリレジスタTRA、TRD及びリードデータバッファRDBなどを用いる。テンポラリレジスタTRAは、デスティネーション側データがメモリになる演算命令の場合に、デスティネーションアドレスのリード時にリードアドレス(実効アドレス)を格納し、データのデスティネーション側メモリへのライト時に、デスティネーションアドレス(リードアドレスと同じアドレス)を出力する。
テンポラリレジスタTRDは、ソース側データがメモリになる演算命令の場合などに、ソース側データを一時格納し、演算命令コードの実行時にソース側データを出力する。また、デスティネーション側データがメモリになる演算命令の場合に、演算結果を一時格納し、データのデスティネーション側メモリへのライト時に、ライトデータを出力する。
リードデータバッファRDBは、更に、デスティネーション側データがメモリになる演算命令の場合に、デスティネーション側データを一時格納し、演算コードの実行時にソース側データを出力する。
前記レジスタTRA、TRD、RDB等は既存の命令実行においても適宜利用されるが、その詳細な内容は本発明とは直接関係ないので説明を省略する。
CPU2は前記第2の制御を実現するために、前述のように2個の命令レジスタIR1,IR2を有している。レジスタセレクタRSELには、前記命令デコーダDECの出力信号、命令レジスタIR1,IR2の出力信号、そして前記SYSC21に含まれる内部I/Oレジスタ(CPUCR)22の出力信号が供給される。
前記命令レジスタIR1は内部データバスIDBから命令が供給される。前記命令レジスタIR1の出力は、もう一つの命令レジスタIR2に、前記命令変更部CHGを介して命令デコーダDECに、そして、前記レジスタセレクタRSELに結合される。前記命令レジスタIR2の出力は前記レジスタセレクタRSELに結合される。前記命令デコーダDECの出力はレジスタセレクタRSEL及び前記命令レジスタIR2に結合される。命令デコーダDECは命令レジスタIR1にフェッチされた命令のオペレーションフィールドのオペレーションコードを解読する。命令レジスタIR1にフェッチされた命令コードが前記レジスタ拡張用前置命令コードであるとき、命令デコーダDECがこれを解読することによって、当該レジスタ拡張用前置命令のレジスタグループ指定フィールド(gr)のレジスタ指定情報を命令レジスタIR2にラッチさせる。その時のラッチ信号は命令デコーダDECから出力される。命令レジスタIR2にラッチされたレジスタフィールド指定情報、及び続けて命令レジスタIR1にフェッチされた後続の命令に含まれるレジスタフィールド(r)のレジスタ指定情報は、レジスタセレクタRSELで解読され、それら情報で直接的に指定されたレジスタグループの中のレジスタが選択され、選択されたレジスタを利用して当該後続の命令が実行される。この命令実行後、前記命令デコーダDECは前記命令レジスタIR2のラッチ情報を全ビット値“0”(レジスタグループ0の指定情報)にクリアするためのセット信号を命令レジスタIR2に供給する。したがって、その後に、レジスタ拡張用前置命令コードを省いた命令が命令レジスタIR1にフェッチされても、命令レジスタIR2の出力はレジスタグループ0の指定情報を維持する結果、レジスタセレクタRSELは暗黙的にレジスタグループ0が指定されていると見做して、命令レジスタ31からのレジスタ指定情報に従ったレジスタをレジスタグループ0から選択する。
前記第2の下位CPUは、図1の構成から、その命令セットに必要のない機能ブロックや論理回路を削除して開発することができる。汎用レジスタはER0、ER1、ER7、ER15のみとし、レジスタセレクタRSELも、これに対応して削除することができる。アドレスバッファのインクリメント機能も、メモリに対するロングワードサイズのデータ転送命令を削除したことに対応して、削除できる。
命令デコーダDECも、32ビットディスプレースメント付レジスタ間接、32ビット絶対アドレス、メモリ間接などを削除して、これに必要な論理回路を削除できる。かかるアドレッシングモードによる命令は、長い命令コードを持ち、必然的に、実行ステート数も大きくなるし、また、ロングワードサイズのデータ転送命令なども、内部データバスが16ビットであることに対応して、2回のワードサイズデータ転送を行なうことになどして、制御論理も複雑になりやすいから、これらのアドレッシングモードやロングワードサイズデータ転送命令を削除できれば、論理的規模の縮小を図ることができる。
論理回路の削除に当たっては、汎用レジスタなどの、不必要な機能ブロックを削除し、削除された機能ブロックが出力している信号は非活性のレベルに固定し、また、削除されたブロックが入力している信号は、非接続または解放とすればよい。残りの論理回路は、前記の通り、非活性レベルへの固定や、非接続または解放とした状態で、論理再合成を行なえば、自動的に論理的規模の縮小を実現できる。どのような方法を採るにしても、上位CPUのサブセットとすることにより、新規の開発を行なうより、開発効率を向上できる。
図18には前記レジスタセレクタRSELの一部と命令レジスタIR2の詳細なブロック図が示される。
命令レジスタIR2は、保持手段としてのラッチ回路(LGR1)321及びラッチ回路(LGR2)322を有する。これらラッチ回路(LGR1、LGR2)321,322は、前述の通りレジスタグループ指定フィールドgr1、gr2のレジスタグループ指定情報をラッチする。
図18に従えば、前記ラッチ回路321,322は、いわゆるリセット付きD型フリップフロップによって構成されている。リセット信号RSLGRとして、命令デコーダDECから指定される命令実行終了信号RSLGRを入力する。ラッチクロックとして、命令デコーダDECから指定されるLGRCLを入力し、また、データとして、命令レジスタIR1が保持する命令コードのビット7〜4、3〜0(グループ4個の場合は、ビット5、4、1、0のみでもよい)を入力する。ラッチクロックLGRCLは、レジスタグループを指定する命令コード(省略可能なレジスタ拡張用前置命令コード)を実行したときに活性状態になって、そのときのレジスタフィールド(gr)である、ビット7〜4、3〜0をラッチさせる。ラッチ回路321,322は、命令の実行終了時点で、命令デコーダDECからの制御信号(リセット信号RSLGR)に基づいて、所定の値に設定される。本実施例では、全ビット値“0”にクリアされる。
汎用レジスタグループを指定するレジスタ拡張用前置命令コードを持たない命令は、ラッチ回路(LGR1、LGR2)321、322が値“0”にクリアされたままになっているから、命令実行が行われるとき、レジスタグループ0の汎用レジスタが指定されることになる。
レジスタセレクタRSELのデスティネーションレジスタ指定側には、ラッチ回路(LGR2)322から出力されるレジスタグループ指定フィールド(gr2)の情報を保持するラッチ回路331と、命令レジスタIR1から出力されるレジスタ指定フィールド(r2)の情報をラッチするラッチ回路332が設けられている。それらラッチ回路331,332は、システムクロックφの反転クロックφ#でラッチされるようになっており、ソースレジスタの選択動作より遅くデスティネーションレジスタの選択動作が行なわれる。これによって、デスティネーション側のレジスタ指定情報のラッチタイミング即ちデスティネーションレジスタ選択タイミングがソースレジスタ選択タイミングよりも0.5ステート遅くなるようにされる。ソースレジスタはアドレスレジスタとして先行して選択され、デスティネーションレジスタはデータの書込みのために遅れて選択されることが可能になっている。
図19及び図20には汎用レジスタER8に相当するレジスタセレクタRSELの論理記述の一部が例示されている。図20の記述は図19の後に続く残りの論理記述である。
図19及び図20に示された論理記述は、RTL(Register Transfer Level)若しくはHDL(Hardware Description Language)記述と呼ばれ、公知の論理合成ツールによって、論理回路に論理展開できる。HDLはIEEE1364として標準化されている。これに示される論理記述の構文は、ケース(case)文に準拠しており、always@の次の()内で定義された値若しくは信号に変化が有ったとき、それ以下の記述行の処理を行う、という記述内容になっている。尚、記号「!」は論理的な和を示し、「&」は論理的な積を示す。「3’b001」は3ビット長の001を意味する。
前記論理記述は、always@(gr1,r1,gr2,r2)beginで始まるレジスタ選択記述部分、always@(rs8 or rsgb or rsdb or wbrs or rd8 or rdgb or rddb or wbrd)beginで始まるバス選択記述部分、always@(wbr8 or r2[3] or byte or word or long)beginで始まるレジスタサイズ指定記述部分に大別される。
前記レジスタ選択記述部分では、レジスタフィールドr[2:0]=0、レジスタフィールドgr[1:0]=1のとき、汎用レジスタER8を選択する記述となっている。
即ち、ソースレジスタのグループフィールドがgr1=1(gr1=4'b0001)でソースレジスタのレジスタフィールドがr1=0(r1=3'b000)のときレジスタER8をソースレジスタとして選択するための信号rs8が活性化される(rs8=1)。そうでなければ、信号rs8は非活性状態を維持する(rs8=0)。
また、デスティネーションレジスタのグループフィールドがgr2=1(gr2=4'b0001)でデスティネーションレジスタのレジスタフィールドがr2=0(r2=3'b000)のときレジスタER8をデスティネーションレジスタとして選択するための信号rd8が活性化される(rd8=1)。そうでなければ、信号rd8は非活性状態を維持する(rd8=0)。
前記バス選択記述部分のalways文におけるrsgbはソースレジスタの内容をバスGBに出力することを指示する信号、rsdbはソースレジスタの内容をバスDBに出力することを指示する信号、wbrsはバスWBの内容をソースレジスタに出力することを指示する信号、rdgbはデスティネーションレジスタの内容をバスGBに出力することを指示する信号、rddbはデスティネーションレジスタの内容をバスDBに出力することを指示する信号、wbrdはバスWBの内容をデスティネーションレジスタに出力することを指示する信号である。
命令デコーダ(DEC)33によって、ソースレジスタを指示するレジスタ指定フィールド(gr1、r1)のレジスタの内容を内部バスGBへ出力することが指示された(rsgb=1)ときに信号rs8が活性化されている場合、又は、デスティネーションレジスタを指示するレジスタ指定フィールド(gr2、r2)のレジスタの内容を内部バスGBへ出力することが指示された(rdgb=1)ときに信号rd8が活性化されている場合、汎用レジスタER8から内部バスGBへのデータ出力を指示する信号r8gbが活性化される(r8gb=1)。
同様に、命令デコーダDECによって、ソースレジスタを指示するレジスタ指定フィールド(gr1、r1))のレジスタの内容を内部バスDBへ出力することが指示された(rsdb=1)ときに信号rs8が活性化されている場合、又は、デスティネーションレジスタを指示するレジスタ指定フィールド(gr2、r2)のレジスタの内容を内部バスDBへ出力することが指示された(rddb=1)ときに信号rd8が活性化されている場合、汎用レジスタER8から内部バスDBへの出力を指示する信号r8dbが活性化される(r8db=1)。
更に、命令デコーダDECによって、ソースレジスタを指示するレジスタ指定フィールド(gr1、r1)のレジスタへ内部バスWBからデータを入力させることが指示された(wbrs=1)ときに信号rs8が活性化されている場合、又は、デスティネーションレジスタを指示するレジスタ指定フィールド(gr2、r2)のレジスタへ内部バスWBからデータを入力させることが指示された(wbrd=1)ときに信号rd8が活性化されている場合、汎用レジスタER8へ内部バスWBからの入力を指示する信号wbr8が活性化される(wbr8=1)。
前記レジスタサイズ選択の論理記述部分のalways文において、r2[3]はレジスタフィールドr2の下位から4ビット目の値を意味する。
汎用レジスタER8へ内部バスWBからデータの入力が指示された場合、データサイズがロングワードサイズ(long=1)であれば、汎用レジスタERとして32ビットで書込まれる(wb8e=wb8h=wb8l=1)。信号wb8eは図3の16ビット分のレジスタE部分の入力ゲート信号、信号wb8hは図3の8ビット分のレジスタRH部分の入力ゲート信号、信号wb8lは図3の8ビット分のレジスタRL部分の入力ゲート信号を意味する。
また、ワードサイズ(word=1)の場合、r2のビット3の値に対応して、汎用レジスタEとして16ビットで書込まれる(wb8e=1、wb8h=wb8l=0)か、汎用レジスタR(RH,RL)として16ビットで書込まれる(wb8e=0、wb8h=wb8l=1)かが指定される。更に、バイトサイズの場合、r2のビット3の値に対応して、汎用レジスタRHとして8ビットで書込まれる(wb8e=0、wb8h=1、wb8l=0)か、汎用レジスタRLとして8ビットで書込まれる(wb8e=wb8h=0、wb8l=1)かが指定される。
そのほかのレジスタ番号についても前記論理記述におけるgr、rの部分が相違するだけで、そのほかは同様とされる。レジスタセレクタ34は前記既存の下位CPUのレジスタセレクタに対して、grのデコード論理が追加され、また、新規の汎用レジスタER8〜ER31に対応する部分のデコード論理が追加されたことになる。
レジスタセレクタ34の出力先を、grの内容に従って、汎用レジスタ8本単位で切り分けるだけなので、任意の命令に対して、同様の方法で、指定可能な汎用レジスタ本数を増やすことが可能になる。
図21及び図22にはスタックポインタにも使用可能なレジスタER7に関するレジスタセレクタの選択論理の一例を論理記述で示す。図22の記述は図21の後に続く残りの論理記述である。記述形態は図19、図20と同じである。特に制限はされないものの、sspgrはサブルーチン分岐命令用のスタックポインタとして使用するレジスタのグループを指定する情報とされ、ispgrは例外処理用のスタックポインタのとして使用するレジスタのグループを指定する情報とされる。それらの情報sspgr、ispgrはシステムコントローラ(SYSC)21に含まれる制御レジスタ(CPUCR)22からレジスタセレクタRSELに供給される。
前記図19と同様のレジスタ選択のための論理記述の他、命令デコーダからの制御信号(sspgb、wbssp、ispgb、wbisp)と、スタックポインタ指定制御ビットsspgr、ispgrによって、レジスタ選択信号を生成する。信号sspgbはサブルーチン用スタックポインタに利用されるレジスタの値をバスGBに出力することを指示し、信号wbsspはバスWBからサブルーチン用スタックポインタに利用されるレジスタにデータを供給することを指示し、信号ispgbは例外処理用スタックポインタに利用されるレジスタの値をバスGBに出力することを指示し、信号wbispはバスWBから例外処理用スタックポインタに利用されるレジスタにデータを供給することを指示する。従来、サブルーチン分岐と割込み例外処理のスタックポインタとを独立に設けていた場合には、これをサブルーチン分岐用( sspgb、wbssp )、割込み例外処理用(ispgb、wbisp)とに分離して、命令デコーダを構成する必要がある。これは本来別々の処理に対する機能をまとめていたものを分離するようにしたものであるので、論理的な規模の増大などは少ない。
これ以外に例外処理のスタックポインタとなり得るレジスタER15、ER23,ER31も同様に構成することができる。即ち、レジスタER15は、sspgr=1またはispgr=1のとき選択される。同様に、レジスタER23は、sspgr=2またはispgr=2のとき選択され、レジスタER31は、sspgr=3またはispgr=3のとき選択される。
制御レジスタ(CPUCR)22の構成は、公知の技術であるので詳細な説明は省略する。制御レジスタ(CPUCR)22はリセット時にレジスタグループ0が選択される(sspgr=ispgr=0)ようにするとよい。
また、カレントグループ選択ビットを設けるようにしてもよい。即ち、レジスタ拡張用前置命令コードが付加されない場合、レジスタグループ0とせずに、スタックポインタグループ選択ビットと同様の制御レジスタに前記カレントグループ選択ビットを設け、RSLGR信号によって、前記カレントグループ選択ビットの内容を命令レジスタIR2(LGR1、LGR2)にロードするようにする。
カレントグループ選択ビットに0以外が設定されている場合、NOP命令(H'0000)は、レジスタグループ0の前置命令コードとされる。この命令コードの実行後は、割込みを受付けたりすることなく、次の命令コードを実行するようにすればよい。
レジスタグループ0を指定するために、H'0000を使用することになり、既存のNOP命令と同じコードであり、NOP命令は使用しないようにすればよい。NOP命令の代りに、BRA $+2などを使用するようにすればよい(「$+2」はその命令の存在するアドレスに対して2番地先、即ち次の命令のアドレスであることを示す)。
各時点でのプログラムの実行内容によって、主に使用する汎用レジスタの対象は異なるから、主に使用するグループの処理を高速にし、ひいてはCPUの処理速度を向上することができる。例えば、レジスタグループ3の汎用レジスタを所定の割込み処理に割り当て、他の処理では使用しない様にしておき、当該割込みが発生したときに、カレントグループを3に変更して、レジスタ拡張用前置命令コードなしで、汎用レジスタグループ3に対する処理を高速に実行することができる。
例えば、割込み優先順位を4レベルとした場合、通常、割込みのネストは4階層になる。即ち、割込みの優先順位を3(高位)〜0(低位)とした場合、同じ優先順位の割込みは同時には受け付けないから、最初に優先順位0の割込みはマスクされ、メインプログラム実行途中に優先順位1の割込みが発生し、この処理途中に優先順位2の割込みが発生し、この処理途中に優先順位3の割込みが発生した場合が、最大のネスト4になる。
例えば、グループ3を優先順位3の割込み用の処理に確保し、グループ2を優先順位2の割込み用の処理に確保しておき、そのほかの割込みと一般の処理ではグループ0と1を使用するようにプログラムを組めば、優先順位3の割込み発生時には、汎用レジスタを待避することなく、汎用レジスタグループ3を使用できるから、割込み応答速度を向上することができる。優先順位2の割込み発生時も同様にでき、より優先度の高い割込み処理を高速に処理することができる。
オペレーティングシステム(OS)などによって、CPUの処理を制御する場合、CPUの処理はいわゆるタスクに分割され、各タスクは独立に管理される。例えば、スタック領域も各タスク毎に独立に管理することになる。
タスクを切り替える場合、スタック領域も切り替えることになり、従来は、使用中のスタックポインタの内容を待避し、スタックポインタの内容を更新しなければならない。更新する場合には、当該タスクが前回待避したスタックポインタの内容を復帰する必要がある。
かかるタスク切替えの場合、前記の例では、前記レジスタ(CPUCR)22の内容を書き換えるのみでよい。切り替える前のスタックポインタの内容は保持することができるから、待避したり、復帰したりする必要がない。CPUの処理に直接影響のない処理を省くことによって、実質的な処理性能を向上することができる。
また、割込みはタスクの実行と独立に発生し、タスクからは予期できない。各タスクで割込みを許可している場合は、発生し得る多重割込みの数分(一般には、割込み優先順位の数に相当する)スタック領域を確保しなければならない。従来は、これを各タスク毎に行なければならず、スタック使用量を不所望に増加させていた。本実施例においては、例外処理用のスタックポインタを用いて、例外処理用のスタックを独立して管理できるから、各タスクは割込み用のスタック領域を確保する必要がない。これによって、スタックの使用量を抑止することができる。スタックはRAMで構成され、また、シングルチップマイクロコンピュータにおいては内蔵できるRAMの容量はチップサイズなどによって制限されるから、例外処理用のスタックポインタを使用可能にすることによって、シングルチップマイクロコンピュータにおいてもOSの適用を容易にする。
また、制御レジスタ(CPUCR)22の初期値を、レジスタグループ0に相当するようにし、初期状態で、既存の下位CPUと同一のスタックポインタの使用方法を可能とすることにより、既存のソフトウェア資産も有効に利用できる。
ER7、ER15、ER23、ER31をスタックポインタとして使用しない場合は、その他の汎用レジスタとして使用できるから、利用効率や使い勝手を向上できる。
図23乃至図25には前記命令デコーダDECに含まれる転送命令コード(mov)の解読論理201を論理記述で例示する。図23乃至図25に示された論理記述は、図19と同じRTL(Register Transfer Level)若しくはHDL(Hardware Description Language)によって記述されている。尚、記号「!」は論理的な和を示し、「&」は論理的な積を示す。「3’b001」は3ビット長のバイナリデータ001を意味する。IR[8]はインストラクションレジスタIRの最下位から9ビット目の論理値を意味する。
図23乃至図25の論理記述は、16ビット絶対アドレスによるワードサイズの転送命令(MOV.W @aa:16,Rn)のコードを解読するための論理記述に相当する。図23乃至図25の論理記述において、casex(IR)の次行に記述された16’b0110_101?_??00_????がその転送命令のコードを意味する。IR[8]=0のときバイトサイズ、 IR[8]=1のときワードサイズ、IR[7]=0のときメモリ→汎用レジスタ(リード型)、IR[7]=1のとき汎用レジスタ→メモリ(ライト型)、の転送を意味する。その命令を、独立した転送命令として実行するか、メモリ上のデータに対する直接的な処理命令の一部として実行するかは、信号MODS、MODDの値によって指示される。即ち、図23乃至図25の論理記述では、ステートコードTMGに従って制御信号を生成するようになっており、現時点でのステートコードTMGの値とその時のMODS、MODDの値等にしたがって、次のステートコードNEXTTMGの値を決定するようになっている。MODS、MODD信号によって、独立した転送命令として実行するか、メモリ上のデータに対する直接的な処理命令の一部として実行するかの制御が大別されることになる。具体的には、MODS=MODD=0の場合は、独立した転送命令として実行される。既存の転送命令と同様の動作になる。特に図示していない部分については、独立した転送命令と同様にできる。
MODS=1の場合は、ソース側データのリード動作として実行される。リードデータは、汎用レジスタに書込まず、テンポラリレジスタTRDに書込む。
MODD=1で、MODS=0またはMODSE=1の場合は、デスティネーション側データのリード動作として実行される。リードアドレスを、テンポラリレジスタTRAに書込む。リードデータは、リードデータバッファRDBに取り込んだ後、1ステート早く実行を終了する。なお、MODSEはソース側のリード型転送命令コードの実行が終了したことを示す信号であり、解読論理201で生成される。
リードデータのテンポラリレジスタTRDへの書込み及びリードアドレスのテンポラリレジスタTRAへの書込みは、いずれの場合も区別なく、実行してもよい(利用されることはなくても、動作に影響しない。区別しないことによって、論理的な無駄を省くことができる)。
従って、独立した転送命令(既存の転送命令)に比較して、MODS=1のとき、汎用レジスタへの書込み禁止、MODD=1のとき、1ステート短縮の相違が存在するのみにできる。論理的な規模の増加を最小限とすることができる。
なお、図15に示される通り、命令拡張用前置命令コードのロングワードサイズの指定によって、MODS、MODDと同様に、ロングワードサイズがLNG信号によって指示される。
また、図において、小文字の信号は、命令デコーダDECで生成され、出力される信号とし、大文字の信号は命令デコーダDECに入力された信号とする。
図23に示される論理記述の第1の部分(1−1)でステートコードTMGが生成される。ステートコードTMGは1→2→3と進行するが、デスティネーション側データのリード動作(MODD=1でMODS=0またはMODSE=1)の場合TMGは1→2で終了するようになっている。
なお、NEXTTMG[5]=0の場合における次ステートコードは単純に下位ビットの値になっている。NEXTTMG[5]=1の場合における次ステートコードは5’b00001とされる様に構成されている。
図23に示される論理記述の第2の部分(1−2)でバス制御を行なう。nop=0はバスアクセス開始、 nop=1はバスアクセス禁止を指示する。data=0は命令リード、data=1はデータアクセスを指示する。long=1はロングワードサイズ、 long=0のとき、byte=0はワードサイズ、byte=1はバイトサイズを指示する。 write=0はリード、 write =1はライトを指示する。
本転送命令の場合、ステートコード1、3で命令リードを行い、ステートコード2で、データアクセスを行なうようになっている。データアクセスのリード/ライトはIR[7]によって指示される。命令リードの場合は所定のタイミングで内部データバスIDBの内容がインストラクションレジスタIRとリードデータバッファRDBに格納される。データリードの場合は所定のタイミングで内部データバスIDBの内容がリードデータバッファRDBに格納される。データライトの場合は所定のタイミングでライトデータバッファWDBの内容が内部データバスIDBに出力される。
図24に示される論理記述の第3の部分(1−3)で実効アドレスを計算する。本転送命令の場合、ステートコード2(=5’b00010)で、リードデータバッファRDBに保持している命令コードのEA拡張部16ビットを、dbrext信号によって32ビットに符号拡張した上、内部バスGBに出力する。バスGBの内容はアドレスバッファABに毎ステート格納されるようにされており、特に制御は必要ない。
図24に示される論理記述の第4の部分(1−4)で、転送データを制御する。リード型(IR[7]=0)の場合は、ステートコード3で、リードデータをリードデータバッファRDBからバスDBへ出力し、MODS=0の場合は汎用レジスタへ、MODS=1の場合はテンポラリレジスタTRDへ格納する。
ライト型(IR[7]=1)の場合は、ステートコード2で、 MODS=0の場合は汎用レジスタから、MODS=1の場合はテンポラリレジスタTRDから内部バスDBへ出力し、いずれの場合もライトデータバッファWDBを経由して、内部データバスIDBに出力する。
図25に示される論理記述の第5の部分(1−5)で、割込みマスク信号を制御する。また、ソース側のデータのリードが終了した場合には、制御信号MODSEを発生する。
図23及び図25においてMODS=1またはMODD=1の場合には入力されたオペレーションレコードの一部が転送命令と異なる様にしてもよい。例えばオペコードのビット15は別の定義に使用する様にしてもよい。
論理規模の縮小のためにはアドレッシングモードなどのメモリの指定方法を決めるビット(オペコードのビット8〜10)は共通にする。
図26及び図27には前記命令デコーダDECに含まれる演算命令コード(exe)の解読論理202を論理記述で例示する。図26及び図27の双方によって示される論理記述は、レジスタ間加算命令(ADD.W Rm,Rn)のコードを解読する為の論理記述に相当する。
前記同様に、独立した転送命令として実行するか、メモリ上のデータに対する処理命令の一部として実行するかは、MODS、MODD信号によって指示される。特に図示していない部分(ALUの制御など)については、独立した演算命令と同様にできる。
図26に示される論理記述の第1の部分(2−1)でステートコードTMGが生成される。ステートコードTMGは1(=5’b00001)で終了する。図26に示される論理記述の第2の部分(2−2)でバス制御を行なう。ステートコード1で命令リードを終了する。
図27に示される論理記述の第3の部分(2−3)で、演算データを制御する。MODS=0の場合には、ソース側データを汎用レジスタとし、汎用レジスタの内容をDBに読み出す(rsdb)。MODS=1の場合には、ソース側データをメモリとし、テンポラリレジスタTRDの内容をDBに読み出す(trddb)。
MODD=0の場合には、デスティネーション側データを汎用レジスタとし、汎用レジスタの内容をGBに読み出す(rdgb)とともに、演算結果を汎用レジスタに書込む(wbrd)。MODD=1の場合には、デスティネーション側データをメモリとし、リードデータバッファの内容をバスDBに読み出す(rdbdb)とともに、演算結果をテンポラリレジスタTRDに書込む(wbtrd)。
図27に示される論理記述の第4の部分(2−4)で、割込みマスク信号を制御する。また、デスティネーション側がメモリの場合には、制御信号mkmovを発生して、ライト型転送命令と同等の動作を行なう命令コードの発生を、命令変更部CHGに指示する。また、ロングワードサイズ信号LNG、バイトサイズ信号BYTEを継続する。
図28乃至図30には前記命令デコーダDECに含まれる演算命令コード(exe)の解読論理202のうち、内部で生成されるライト型転送命令と同等の動作を行なう命令コードを生成する論理の論理記述が例示されている。
前記内部で生成されるライト型転送命令と同等の動作を行なう命令コードは、常に同一の動作を行なうものとし、MODSやMODDの制御信号は参照していない。
図28に示される論理記述の第1の部分(3−1)でステートコードTMGが生成される。ステートコードTMGは1→3と進行する。図28に示される論理記述の第2の部分(3−2)でバス制御を行なう。ステートコード1(=5’b00001)で、データライトを行い、ステートコード3(=5’b00011)で命令リードを行なう。データサイズは演算命令コードの発生した、制御信号LNG、BYTEによって指示される。
図29に示す論理記述の第3の部分(3−3)で実効アドレスを再利用する。ステートコード1で、テンポラリレジスタTRAに保持している実効アドレスを、内部バスGBに出力する。図29に示す論理記述の第4の部分(3−4)で、転送データを制御する。ステートコード3で、テンポラリレジスタTRDから内部バスDBへ出力し、ライトデータバッファWDBを経由して、内部データバスIDBに出力する。
図30に示される論理記述の第5の部分(3−5)で、制御信号はいずれも初期化する。割込みも許可し、割込みが要求すれば、引き続き割込み例外処理を行なうことができる。
命令拡張用前置命令コード(pf)を解読する論理回路の論理記述については特に図示しないが、図15の命令拡張用前置命令コードの解読結果に応じたmodやmskintなどの制御信号を生成し、MODS,MODD等によって図23乃至図30に例示されるような論理動作を制御し、命令デコーダDEC全体として、メモリのデータに対する直接的な演算制御を可能にする。
図31にはレジスタ拡張用前置命令コードを伴わない第1の加算命令(ADD.L ER0,ER1)の実行タイミングが示される。
ADD.L ER0,ER1は、グループ0の汎用レジスタのみを使用するので、汎用レジスグループを指定するレジスタ拡張用前置命令コードを必要とせず、前記既存の下位CPU、例えば、前記平成7年3月(株)日立製作所発行『H8S/2600シリーズH8S/2000シリーズプログラミングマニュアル』に記載のCPUと同じ1ワードの命令とされる。
特に制限はされないものの、内部データバス(IDB)は16ビットであって、内蔵ROM4、RAM5のリード/ライトを1ステートで行うことができるものとして説明する。また、CPUは命令フェッチ、デコード、実行の3段パイプラインで命令を実行するものとする。
サイクルT0のスロットC2(φ#同期:クロック信号φの反転クロックであるφ#同期)で、CPU2のアドレスバッファABからアドレスがバスIABに出力される。また、命令デコーダDECから、命令フェッチ(if)を示す、バスコマンド(BCMD)が出力される。
サイクルT1のスロットC1(φ同期)で、アドレスバスIABの内容が周辺アドレスバス(PAB)に出力され、バスコマンドに基づき、リードサイクルが開始され、周辺データバス(PDB)にデータが出力される。スロットC2で周辺データバス(PDB)のリードデータが内部データバスIDBに得られ、これをサイクルT2のスロットC1で命令レジスタIR1にラッチする。以上の動作は以前の命令の実行の制御によって行われる。前記周辺データバス(PDB)及び周辺アドレスバス(PAB)は内部データバス(IDB)及び内部アドレスバス(IAB)に接続された周辺回路用の図示を省略するバスである。内蔵ROM4、RAM5はそのモジュール内で周辺アドレスバス、周辺データバス相当の動作を行う。
直前の命令の実行が終了すると、最も早く命令の実行が開始される場合には、サイクルT2のスロットC1で命令コードが制御部CONTの命令デコーダDECに入力されて、命令の内容が解読される。命令デコーダDECは、解読結果に従って、制御信号を出力して、各部の制御を行う。命令の一部(レジスタ指定フィールドの情報:SEL1)がレジスタセレクタRSELに与えられる。図においてソース側レジスタ指定フィールドの情報SEL1=0、デスティネーション側レジスタ指定フィールドの情報SEL2=1になっている。SEL1は、図18のRSELのr1[3:0]、SEL2は、r2[3:0]に相当する。
レジスタ間演算命令では、サイクルT2のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスIABにアドレス信号が出力される。レジスタセレクタ34に制御信号を与える。このとき、ラッチ回路(LGR1、LGR2)321,322が何れも0にクリアされているので、レジスタフィールドSEL1、SEL2からの信号と制御部CONTの出力する制御信号A(Rs−DB、Rd−GB)とに基づいて、レジスタ選択信号B(R0−DB、R1−GB)が生成される。
サイクルT3から、次の次の命令がリードされる。サイクルT3のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。入力信号SEL2と制御信号B(WB−Rd)とに基づいて、レジスタ選択信号C(selectC:WB−R1)が生成される。前記レジスタ選択信号Bはレジスタを選択して、ソース側、デスティネーション側のレジスタ(Rs、Rd)のデータを算術論理演算器ALUに入力する。算術論理演算器ALUの演算内容は制御部CONTが制御信号C(controlC)によって指示する。加算・論理演算・シフトなどは1クロックで演算を行うことができる。例えば、前記命令では32ビットの加算を行う。次の命令の制御部CONTへのロードを指示する。
制御信号B(RSLGR)によって、ラッチ回路(LGR1、LGR2)321,322のクリアが指示される。ラッチ回路(LGR1)321はサイクルT3のスロットC1で、ラッチ回路(LGR2)322はサイクルT3のスロットC2でクリアされた結果が伝達される。
サイクルT3のスロットC2で、算術論理演算器ALUの演算結果が、内部バスWBを経由して、レジスタ選択信号が選択したデスティネーション側のレジスタ(ER1)にライトされる。図示はされないが、制御信号Cによって、コンディションコードレジスタCCRの更新を行う。
図31の例ではレジスタグループ0同士のレジスタ間演算は実質的に1ステートで実行されている。
図32にはレジスタ拡張用前置命令コードが付加された第2の加算命令(ADD.L ER8,ER1)の実行タイミングを示す。
汎用レジスタグループを指定するレジスタ拡張用前置命令コードを付加して2ワード命令とする。第2ワードは前記ADD.L R0,R1と同一である。すなわち、gr1=1であるため、同じr1=0に対して、レジスタ番号n=8と解釈される。
サイクルT0のスロットC2で、CPU2のアドレスバッファABかアドレスがアドレスバスIABに出力される。
サイクルT1のスロットC1(φ同期)で、アドレスバスIABの内容が周辺アドレスバス(PAB)に出力され、リードサイクルが開始される。スロットC2でリードデータが内部データバスIDBに得られ、これをサイクルT2のスロットC1で命令レジスタIR1にラッチする。これは、レジスタグループフィールドを持つ省略可能なレジスタ拡張用前置命令コードのワードである。
引き続き、サイクルT2のスロットC2で次のアドレス(+2された内容)がアドレスバスIABに出力され、このリードデータがサイクルT3のスロットC1で命令レジスタIRにラッチされる。以上の動作は以前の命令の実行の制御によって行われ、相対的な関係が異なる場合もある。
直前の命令の実行が終了すると、最も早く命令の実行が開始される場合には、サイクルT2のスロットC1で命令コード(レジスタ拡張用前置命令コード)が制御部CONTに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。グループフィールドラッチ信号LGRCLが発行されて、レジスタグループ指定フィールド(IR1のビット7〜0)がラッチ回路(LGR1、LGR2)321,322にラッチされる。
サイクルT2のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレス信号がアドレスバスIABに出力される。
サイクルT3から、次の次の命令がリードされる。サイクルT3のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。第1ワードと第2ワード以降が分割されないための制御信号B(controlB)で連続命令信号(割込み禁止信号:continue=mskint)を割込み受け付け回路に出力する。本信号によって、割込み要求などが発生していても、命令の実行を継続することができる。また、ラッチ回路(LGR1、LGR)321,322の内容が保持される。
一方、サイクルT2のスロットC1で命令コード(加算命令を指示)が命令デコーダ(DEC)33に入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。LGR1=1及びLGR2=0であるため、SEL1(及びSEL2)と命令デコーダDECの出力する制御信号A(Rs−DB、Rd−GB)とに基づいて、レジスタ選択信号B(R8−DB、R1−GB)が生成される。これ以外の第2ワードによる動作は第1の加算命令(ADD.L ER0,ER1)と同一にできる。第1の加算命令同様に、制御信号B(RSLGR)によって、ラッチ回路(LGR1、LGR2)321,322のクリアが指示される。ラッチ回路(LGR1)321はサイクルT4のスロットC1で、ラッチ回路(LGR2)322はサイクルT4のスロットC2でクリアされた結果が伝達される。
第1ワード(レジスタ拡張用の前置命令コード)に対応するラッチ回路(LGR1、LGR2)321,322のラッチ信号、連続命令信号を出力以外は、命令デコーダDECの内容を、既存のCPUの命令デコーダと同等にできる。命令デコーダDECのレジスタ拡張用前置命令コードに対応する部分は、相対的に小さいことは言うまでもない。すなわち、論理的な規模の追加を最小限にできる。また、命令デコーダDECの大部分を既存のCPUの命令デコーダと同等にできるから、従来の設計資産を有効に利用することができる。
また、そのほかの命令についても、同様のレジスタ拡張用前置命令コードを付加することによって、汎用レジスタのいずれも指定できる。前記命令コードはレジスタ指定フィールドを持つ命令コードの命令について適用できる。
図33にはメモリ・レジスタ型の加算命令(ADD.W @aa:16,R9)の実行タイミングを示す。すなわち、レジスタグループフィールドを持つレジスタ拡張用前置命令コード、メモリ・レジスタ型演算の命令拡張用前置命令コード、MOV.W @aa:16,R0に相当する命令コード、ADD.W R0,R1に相当する命令コードを組合せて1命令とみなされる命令を実行したときのタイミングが示される。
レジスタグループフィールドを持つレジスタ拡張用前置命令コードは、グループ1の汎用レジスタを指定するように、H’0001とされる。すなわち、gr2=1であるため、同じr2=1に対して、レジスタ番号n=9と解釈される。
また、メモリ・レジスタ型の命令拡張用前置命令コードは、図15に従い、H’0108とされ、MODS信号によって、ソース側がメモリであることを指示する。本命令では、直接の関係はないが、EA1命令コードの実行時には、gr1とr1が組み合わされて、汎用レジスタが選択される。また、演算命令コードの実行時には、gr2とr2が組み合わされて、汎用レジスタが選択される。
転送命令コードは、既存の転送命令と同様に、メモリのリードを行なうが、前置命令コードによるソース側をメモリとする指示に基づき、リードデータをテンポラリレジスタTRDに格納する。ソース側をメモリとする指示を継続する。
演算命令コードは、ソース側をメモリとする指示に従い、ソース側データを汎用レジスタではなく、テンポラリレジスタ(TRD)から読み出す。そのほかの動作は、既存の演算命令と同様になる。
サイクルT0のスロットC2(φ#同期。#は反転論理を示す)で、CPU2のアドレスバッファABからアドレスがIABに出力される。
サイクルT1のスロットC1(φ同期)で、IABの内容がPABに出力され、リードサイクルが開始される。サイクルT1のスロットC2でリードデータが内部データバスに得られ、これをサイクルT2のスロットC1でIR(IR1)にラッチする。これは、レジスタグループフィールドを持つ省略可能な命令ワード(レジスタ拡張用前置命令コード)である。
引き続き、サイクルT2のスロットC2で次のアドレス(+2された内容)がIABに出力され、このリードデータがサイクルT3のスロットC1でIR(IR1)にラッチされる。以上の動作は以前の命令の実行の制御によって行われ、相対的な関係が異なる場合もある。
直前の命令の実行が終了すると、最も早く命令の実行が開始される場合には、サイクルT2のスロットC1で命令コード(レジスタ拡張用前置命令コード)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。グループフィールドラッチ信号LGRCLが発行されて、レジスタグループ指定フィールド(IR1のビット7〜0)がラッチLGR1、LGR2にラッチされる。
サイクルT2のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレス情報が出力される。
サイクルT1のスロットC2で、CPU2のアドレスバッファABかアドレス情報がアドレスバスIABに出力される。
サイクルT2のスロットC1(φ同期)で、アドレスバスIABの内容がPABに出力され、リードサイクルが開始される。サイクルT2のスロットC2でリードデータが内部データバスに得られ、これをサイクルT2のスロットC1でIRにラッチする。これは、メモリに対する演算を示す命令拡張用前置命令コード(pf)である。
サイクルT3のスロットC2で次のアドレス(+2された内容)がアドレスバスIABに出力され、このリードデータがサイクルT4のスロットC1で命令レジスタIR(IR1)にラッチされる(MOV命令の第1ワード(mov−1))。
サイクルT3のスロットC1で命令コード(命令拡張用前置命令コードpf)がデコーダDECに入力されて、命令の内容が解読され、かかる命令拡張用前置命令コードの場合には、ソース側データがメモリ上に存在することを指示する。即ち、制御信号CとしてMODS信号を1にセットし、デコーダDECにフィードバックする。
サイクルT3のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレス情報がアドレスバスIABに出力される。
サイクルT4のスロットC1で命令コード(MOV命令の第1ワード(mov−1))が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。絶対アドレスのアドレッシングモードであるので、引き続き、EA拡張部である絶対アドレスをリードした後、この絶対アドレスに基づき、ソースデータのリードを行い、リード結果をテンポラリレジスタTRDに格納する。
サイクルT4のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。サイクルT4のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレス情報がアドレスバスIABに出力される。
サイクルT4から、リードサイクルが開始され、このリードデータがサイクルT5のスロットC1でリードデータバッファRDBにラッチされる(MOV命令の第2ワード(mov−2)、即ち、EA拡張部である絶対アドレス)。
サイクルT5のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。サイクルT5のスロットC2で、リードデータバッファRDBの内容(絶対アドレス)を内部バスGBに読み出して、アドレスバッファABに入力する。アドレスバッファABからアドレス情報がアドレスバスIABに出力される。
サイクルT6から、ソースデータがリードされる。また、サイクルT5のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレス情報がアドレスバスIABに出力される。
サイクルT7のスロットC1で前記リードデータ(ソースデータ)が、リードデータバッファRDBに格納される。更に、リードデータバッファRDBから内部バスDBに出力され、算術論理演算器ALUに入力する。算術論理演算器ALUの動作は無操作とする。
サイクルT7のスロットC2で、リードデータが、算術論理演算器ALUから内部バスWBに出力され、信号MODSが1にセットされているので、汎用レジスタではなく、テンポラリレジスタTRDに格納される。
サイクルT7のスロットC1で、命令コード(ADD命令(add))が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。信号MODSが1にセットされているので、ソース側データを汎用レジスタではなく、テンポラリレジスタTRDから読み出す。デスティネーション側は、汎用レジスタから読み出し、演算結果は汎用レジスタに格納する。
サイクルT7のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレス情報がアドレスバスIABに出力される。
サイクルT8のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。また、デスティネーション側は変更なく、レジスタグループフィールド(gr2=1)と、レジスタフィールド(r2=1)に従って、汎用レジスタ(ER9)から、デスティネーションデータが内部バスGBに出力され、ソース側データが、信号MODSに従って、テンポラリレジスタTRDから内部バスDBに出力され、いずれも算術論理演算器ALUに入力される。算術論理演算器ALUは加算動作とされる。
サイクルT8のスロットC2で、演算結果が、算術論理演算器ALUから内部バスWBに出力され、汎用レジスタ(ER9)に格納される。
なお、第1ワードと第2ワード以降が分割されないための制御信号Bで連続命令信号を出力する。本信号によって、割込み要求などが発生していても、命令の実行を継続することができる。
即ち、命令拡張用前置命令コードに対応する信号MODSの出力と連続命令信号の出力、転送命令コードに対応する信号MODSに従ったデータ格納先の選択と連続命令信号の出力、加算命令コードに対する信号MODSに従ったデータ読み出し元の選択以外は、命令デコーダDECの論理構成を、下位CPUの命令デコーダと同等にできる。これらに対応する部分は、相対的に小さいことは言うまでもない。すなわち、論理的な規模の追加と変更を最小限にできる。また、命令デコーダDECの大部分を既存下位CPUの命令デコーダと同等にできるから、従来の設計資産を有効に利用することができる。
また、そのほかの演算命令(加算、減算、乗算、除算、比較、論理積、論理和、排他的論理和など)についても、同様の命令拡張用前置命令コードと転送命令コードを付加することによって、メモリと汎用レジスタの演算を実現できる。
また、ソース側のアドレッシングモードをレジスタ間接などとする場合、レジスタグループフィールドを持つレジスタ拡張用前置命令コードを、前記命令の先頭に付加し、gr1=1〜3のいずれかとすることによって、ソース側の汎用レジスタを、グループ1〜3とすることができる。即ち、レジスタグループフィールドを持つレジスタ拡張用前置命令コードのgr1がソース側、gr2がデスティネーション側に対応する。
図34にはレジスタ・メモリ型の加算命令(ADD.W R1,@aa:16)の実行タイミングを示す。すなわち、命令拡張用前置命令コード、MOV.W @aa:16,R0に相当する命令コード、及びADD.W R1,R0に相当する命令コードを組合せて、1命令とみなされる命令を実行したときのタイミングが示される。この時の命令拡張用前置命令コードは、図15に従い、H’0104とされ、信号MODDによって、ソース側は汎用レジスタ、デスティネーション側がメモリであることを指示する。
転送命令コードは、既存の転送命令と同様に、サイクルT4のスロットC2から、メモリのリードを行ない、命令拡張用前置命令コードによるデスティネーション側をメモリとする指示(MODD)に基づき、生成した実効アドレス(メモリアドレス)をテンポラリレジスタTRAに格納する。また、サイクルT6のスロットC1で、リードデータをリードデータバッファDBRに格納した時点で、既存の転送命令またはソース側のデータのリードの場合より1ステート早く実行を終了する。このため、命令フェッチとPCのインクリメントは行なわない。デスティネーション側をメモリとする指示を継続する。演算命令コード(add)を、サイクルT5のスロットC1から命令デコーダDECに入力する。
演算命令コードは、デスティネーション側をメモリとする指示(MODD)に従い、サイクルT6のスロットC1で、デスティネーション側データを、汎用レジスタではなく、リードデータバッファRDBから、バスGBに読み出し、算術論理演算器ALUに入力する。ソース側は汎用レジスタが暗黙的に指示されているので、汎用レジスタR1の内容を、バスDBに読み出し、算術論理演算器ALUに入力する。サイクルT6のスロットC2で、演算結果をテンポラリレジスタTRDに格納する。さらに、制御信号mkmovによって、MOV.W R0,@ER0に類似する命令コード(mov−st:16’b0111_1000_1???_????)をCHGで発生し、サイクルT6のスロットC1から命令デコーダDECに入力する。?のビットは任意でよい。
発生された命令コード(mov−st)は、 テンポラリレジスタTRAをアドレスレジスタとし、テンポラリレジスタTRDをデータレジスタとする転送命令同様の動作を行う。即ち、サイクルT6のスロットC2で、テンポラリレジスタTRAに格納されている実効アドレスをバスGBに読み出し、アドレスバッファABを経由して内部アドレスバスIABに出力するとともに、ワードデータライトのバスコマンドを発行する。サイクルT7のスロットC2で、テンポラリレジスタTRDに格納されている演算結果をバスDBに読み出し、ライトデータバッファWDBを経由して、内部データバスIDBに出力して、デスティネーションのメモリアドレスに演算結果を書込む。サイクルT7のスロットC2から命令フェッチを行なうとともに、プログラムカウンタPCのインクリメントを行なう。これによって、転送命令コード(mov−1)の実行を短縮し、命令フェッチとプログラムカウンタPCのインクリメントを行なわなかった分を回復する。
デスティネーション側メモリにライトする場合、命令コード(mov−st)をCPU2内部で発生することにより、命令コードを短縮し、処理時間を短縮することができる。テンポラリレジスタTRAの内容を参照することによって、再度実効アドレスの計算を行なう必要がなく、更に、処理時間を短縮することができる。 MOV.W R0,@ER0に類似する命令コードを使用することにより、設計を容易にし、論理的な規模の増加を抑止することができる。
比較命令の場合は、デスティネーション側メモリにライトする必要がない。この場合も、前記同様に動作させ、サイクルT6のスロットC2のバスコマンドを無操作に変更するのみに止めるとよい。即ち、比較命令の命令コードを実行した場合に、制御信号を発行し、デスティネーション側メモリにライトする命令コードにライト動作を禁止させるようにするものである。制御方式を共通化し、論理的な規模の増加を抑止することができる。或いは、内部で発生する命令コードを無操作(NOP)命令の命令コードに相当するものにしてもよい。この場合は、処理時間を更に短縮することができる。
また、そのほかの2つのデータに対する演算命令(加算、減算、乗算、除算、比較、論理積、論理和、排他的論理和など)についても、同様の命令拡張用前置命令コードと転送命令コードを付加することによって、メモリと汎用レジスタの演算を実現できる。更に、1つのデータに対する演算命令(符号反転、論理反転、シフト、ローテートなど)についても、同様の命令拡張用前置命令コードと転送命令コードを付加することによって、メモリ上のデータの演算を実現できる。
尚、図34で説明した命令の実行においても、演算命令の実行に至るまでの途中の演算結果によるコンディションコードレジスタCCRの変更抑止と、制御信号mskintによる割り込み抑止の制御は前記と同様に行われる。
図35にはメモリ・メモリ型の加算命令(ADD.W @ER1,@aa:16)の実行タイミングを示す。即ち、命令拡張用前置命令コード(pf)、 MOV.W @ER1,R0に相当する命令コード(mov−1)、MOV.W @aa:16,R0に相当する命令コード(mov2)、及びADD.W R0,R1に相当する命令コード(add)を組合せて、1命令とみなされる命令を実行したときのさタイミングが示される。
図35の場合、命令拡張用前置命令コードは、図15に従い、H’010Cとされ、MODS,MODD信号によって、ソース側、デスティネーション側がいずれもメモリであることを指示する。
転送命令コード(mov−1)は、サイクルT3のスロットC2から、メモリのリードを行ない、命令拡張用前置命令コードによるソース側をメモリとする指示(MODS)に基づき、生成した実効アドレス(メモリアドレス)をテンポラリレジスタTRAに格納する。また、サイクルT5のスロットC1で、リードデータ(data1)をリードデータバッファRDBを経由して、バスGBに出力する。算術論理演算器ALUを経由してバスWBに出力され、サイクルT5のスロットC2でテンポラリレジスタTRDに格納される。ソース側及びデスティネーション側をメモリとする指示を継続すると共に、ソース側データの終了を指示する(MODSE)。
転送命令コード(mov−2)は、図34の転送命令コードと同様に、サイクルT6のスロットC2から、メモリのリードを行ない、命令拡張用前置命令コードによるデスティネーション側をメモリとする指示(MODD)とソース側データの終了指示(MODSE)に基づき、生成した実効アドレス(メモリアドレス)をテンポラリレジスタTRAに格納する。また、サイクルT8のスロットC1で、リードデータをリードデータバッファRDBに格納した時点で、既存の転送命令またはソース側のデータのリードの場合より1ステート早く実行を終了する。ソース側及びデスティネーション側をメモリとする指示を継続する。
演算命令コードは、ソース側及びデスティネーション側をメモリとする指示(MODS、MODD)に従い、サイクルT8のスロットC1で、デスティネーション側データをリードデータバッファRDBから、バスGBに読み出し、算術論理演算器ALUに入力する。ソース側データをテンポラリレジスタTRDから、バスDBに読み出し、算術論理演算器ALUに入力する。サイクルT8のスロットC2で、演算結果をテンポラリレジスタTRDに格納する。さらに、MOV.W R0,@ER0に類似する命令コード(mov−st)を発生し、サイクルT6のスロットC1から命令デコーダDECに入力する。
発生された命令コード(mov−st)は、テンポラリレジスタTRAをアドレスレジスタとし、テンポラリレジスタTRDをデータレジスタとする転送命令同様の動作を行う。
ここで、ソース側及びデスティネーション側をメモリとする指示(MODS、MODD)がなされている場合、転送命令コードは、1回目はMODSE信号が0にクリアされており、ソース側のデータのリードを行ない、2回目はMODSE信号が1にセットされており、デスティネーション側のリードを行なうものとする。
尚、図35で説明した命令の実行においても、演算命令の実行に至るまでの途中の演算結果によるコンディションコードレジスタCCRの変更抑止と、制御信号mskintによる割り込み抑止の制御は前記と同様に行われる。
図36にはメモリ・メモリ型の転送命令(MOV.W @ER1,@aa:16)の実行タイミングを示す。即ち、命令拡張用前置命令コード、MOV.W @ER1,R0に相当する命令コード、MOV.W R0,@aa:16に相当する命令コードを組合せて、1命令とみなされる命令を実行したときのタイミングが示される。この時の命令拡張用前置命令コードは、図15に従い、H’0108とされる。
メモリ・メモリ間の転送命令は前記加算命令と同様にし、ADD.W R0,R1に相当する命令コードの代わりに、MOV.W R0,R1に相当する命令コードを用いて、実現することもできる。この場合は、デスティネーション側のリードを行なってしまうが、転送命令の性質上、デスティネーション側のリードは必要なく、処理時間が無駄になってしまう。
この例では、命令拡張用前置命令コードと、リード型の転送命令コードと、ライト型の転送命令コードを組合せ、命令拡張用前置命令コードは、ソース側がメモリであることを指示する。
リード型転送命令コードは、メモリのリードを行なって、命令拡張用前置命令コードの指示に基づき、リードデータをテンポラリレジスタTRDに格納する。ソース側をメモリとする指示を継続する。
ライト型転送命令コードは、既存の転送命令と同様に、メモリのライトを行なうが、ソース側をメモリとする指示(MODS)に従い、ライトデータを汎用レジスタではなく、テンポラリレジスタTRDから取り出す。
前記加算命令と同等の実現方法を採用した場合に比べて、演算命令コードを省略できる。結果的に、命令コード長を1ワード短縮し、実行ステート数を3ステート短縮できる。
図37にはイミディエイト−メモリ型の加算命令(ADD.W #xx,@aa:16)の実行タイミングを示す。同図の内容は、図34と同様に、命令拡張用前置命令コード、MOV.W @aa:16,R0に相当する命令コード、及びADD.W #xx,R0に相当する命令コードを組合せて定義されて、1命令とみなされる命令を実行したときのタイミングが示されている。デスティネーション側がメモリであるが、イミディエイトデータの場合は、リードデータを一旦テンポラリレジスタTRDに格納する。このため、命令拡張用前置命令コードは、図15に従い、H’0108とされ、ソース側をメモリとする制御信号(MODS)を発行する。
命令拡張用前置命令コード、転送命令コードの動作は、サイクルT6のスロットC1で、リードデータがリードデータバッファRDBからバスGBに読み出される。算術論理演算器ALUを経由して、バスWBに出力され、サイクルT6のスロットC2でテンポラリレジスタTRDに格納される。
命令拡張用前置命令コードの指示(MODS)に対して、イミディエイトデータの演算命令コードは、サイクルT8のスロットC1で、デスティネーション側データを、汎用レジスタではなく、テンポラリレジスタTRDから、バスGBに読み出し、算術論理演算器ALUに入力する。ソース側はイミディエイトデータがリードデータバッファRDBから、内部バスDBに読み出し、算術論理演算器ALUに入力する。サイクルT8のスロットC2で、演算結果をテンポラリレジスタTRDに格納する。さらに、命令拡張用前置命令コードの指示(MODS)に基づいて、サイクルT6のスロットC2からワードサイズライトを開始する。アドレスはテンポラリレジスタTRAから、サイクルT6のスロットC2で読み出し、バスGB及びアドレスバッファABを経由して内部アドレスバスIABに出力する。データは、サイクルT8のスロットC1で、演算結果を、テンポラリレジスタTRDから読み出して、バスDB及びライトデータバッファWDBを経由して内部データバスIDBに出力する。命令拡張用前置命令コードの指示(MODS)に従って、イミディエイトデータの演算命令にライト動作が加えられることになる。
ADD.W #xx,@aa:16の場合は、演算命令コードが2ワードであるため、図34と相違されているが、バイトサイズのイミディエイトの場合、演算命令コードが1ワードであれば、図34と同じ動作タイミングとすればよい。
尚、図37で説明した命令の実行においても、演算命令の実行に至るまでの途中の演算結果によるコンディションコードレジスタCCRの変更抑止と、制御信号mskintによる割り込み抑止の制御は前記と同様に行われる。
図38にはイミディエイト・メモリ型の転送命令(MOV.W #xx,@aa:16)の実行タイミングを示す。すなわち、命令拡張用前置命令コード、MOV.W #xx,R0に相当する命令コード、及びMOV.W R0,@aa:16に相当する命令コード(ライト型転送命令コード)を組合せて1命令とみなされる命令を実行したときにタイミングが示される。このとき、命令拡張用前置命令コードは、図15に従い、H’0104とされる。
図38におけるサイクルT4のスロットC1で、イミディエイトデータをリードデータバッファRDBからバスDBに読み出し、算術論理演算器ALUを経由して、サイクルT4のスロットC2で、バスWBに出力する。このイミディエイトデータを、命令拡張用前置命令コードの指示(MODD)に基づき、テンポラリレジスタTRDに格納する。
ライト型転送命令コードは、既存の転送命令と同様に、メモリのライトを行なうが、サイクルT7のスロットC2で、命令拡張用前置命令コードの指示(MODD)に従い、ライトデータを汎用レジスタではなく、テンポラリレジスタTRDから取り出す。
イミディエイトデータを、内部I/Oレジスタを含むメモリに設定することは、比較的出現頻度が高いと考えられるので、命令コード長の短縮、及び処理時間の短縮は望ましい。
図39乃至図41には、命令デコーダDECに含まれる演算命令コード(exe)の解読論理201の一部に関する論理記述の別の例が示される。同図に示される論理記述は、16ビットイミディエイトデータのワードサイズの加算命令(ADD.W #xx:16,Rn)に相当する。
MODS信号に対応して、実行ステートが延長され、ライト動作が挿入される。図39に示される論理記述の第1の部分(4−1)でステートコードTMGが生成される。単独の命令としては、ステートコードTMGは1→3と進行する。イミディエイトデータとメモリ上のデータとを演算する場合は、MODS=1とされ、ステートコードTMGは1→17→3と進行する。
図39に示される論理記述の第2の部分(4−2)でバス制御を行なう。MODS=0の場合は、2回の命令リードを行なう。MODS=1の場合は、ステートコード1で、データライトを行い、ステートコード17、3で命令リードを行なう。データサイズは演算命令コードの発生した、当該命令(ADD.W #xx:16,Rn)のデータサイズであるワードサイズとされる。
図40に示される論理記述の第3の部分(4−3)で実効アドレスを計算する。MODS=1の場合は、ステートコード1で、テンポラリレジスタTRAに保持している実効アドレスを、内部バスGBに出力する。
図40に示される論理記述の第4の部分(4−4)で、転送データを制御する。ステートコード1で演算を行なう。MODS=0の場合は、汎用レジスタとリードデータバッファRDBからデータを読み出し、演算結果を汎用レジスタに格納する。MODS=1の場合は、テンポラリレジスタTRDとリードデータバッファRDBからデータを読み出し、演算結果をテンポラリレジスタTRDに格納する。
図41に示される論理記述の第5の部分(5)で、制御信号はいずれも初期化する。割込みも許可し、割込みが要求すれば、引き続き割込み例外処理を行なうことができる。
ここで、前記命令拡張用前置命令コードを省略してもそれと同様に命令の拡張を行うことができる複合命令について説明する。例えば、図38に基づいて説明したMOV.W #xx,R0の命令コードに余裕があり、メモリに対する転送か、汎用レジスタに対する転送かのデスティネーション情報を持つことができれば、命令拡張用前置命令コードを設けなくてもよい。要するに、命令コードに実質的な空き領域があり、その空き領域にメモリに対する転送か、汎用レジスタに対する転送かの情報を組み込んでも、その他の命令コードと区別が付けばよい。このような前記デスティネーション情報に基づき、イミディエイトデータをテンポラリレジスタTRDに格納するとともに、デスティネーション側をメモリとする制御信号を発生すればよい。そのような前記デスティネーション情報を付加した転送命令コードと演算命令コードを結合して1命令として実行可能な複合命令を採用すれば、命令拡張用前置命令コードを設けた場合と同様の機能を実現でき、更に当該命令拡張用前置命令コードを設けない分だけ、命令コード長を短縮でき、命令実行時間を短縮することができる。
図52には命令拡張用前置命令コード、MOV.W #xx,R0に相当する命令コードに前記ディスティネーション情報を付加した命令コードを組合せて1命令とみなされる命令を実行したときのタイミングが示される。図38と比較すれば明らかなように、命令拡張用前置命令コード(pf=H’0104)に対する処理はない。
図42には本発明に係るCPUの開発環境の概略が示される。開発環境の使用者は、各種エディタなどを用いて、C言語乃至アセンブリ言語でプログラムを作成する。これは通常、複数のモジュールに分割して作成される。
Cコンパイラ400は、使用者の作成したそれぞれのC言語ソースプログラムを入力し、アセンブリ言語ソースプログラム乃至オブジェクトモジュールを出力する。
アセンブラ401は、アセンブリ言語ソースプログラムを入力し、オブジェクトモジュールを出力する。
リンケージエディタ402は、前記Cコンパイラ400やアセンブラ401の生成した、複数のオブジェクトモジュールを入力して、各モジュールの外部参照や相対アドレスなどの解決を行い、1つのプログラムに結合して、ロードモジュールを出力する。
ロードモジュールは、シミュレータデバッガ403に入力され、パーソナルコンピュータなどのシステム開発装置上で、CPU2の動作をシミュレーションし、実行結果を表示し、プログラムの解析や評価を行なうことができる。また、ロードモジュールはエミュレータ404に入力され、実際の応用システム上などで動作する、いわゆるインサーキットエミュレーションを行ない、CPU2を有するマイクロコンピュータ全体としての、実動作の解析や評価を行なうことができる。
このほかに、ライブラリアンとして、汎用的なサブルーチンなどを提供することもできる。
図43には本発明に係るCPU2のシステム開発装置におけるCPU選択方法を示す。
ここでは、上位CPU2のマキシマムモードを選択する場合を例示してある。(a)の場合、パーソナルコンピュータなどのシステム開発装置上のディスプレイでプロンプトが表示された状態で、“SET CPU= CPU−UMAX”と入力すればよいようにする。(b)の場合は、プロンプトが表示された状態で、“SET CPU”とコマンドを入力し、これに対して、CPUの種類及び動作モードのメニューを、例えば“CPU NAME (1.CPU−UMAX、2.CPU−UMIN、3.CPU−L1、4.CPUL2)”と表示するとともに、メニュー番号の入力を要求し、使用者がメニューの番号1〜4のいずれかを入力すればよいようにする。ここで、CPU−UMAXは前記上位CPU2のマキシマムモード、CPU−UMINは前記上位CPUのミニマムモード、CPU−L1は前記第1の下位CPU、CPUL2は前記第2の下位CPU、を示すものとする。
このほか、ウィンドウのドロップダウンメニューで選択可能にしてもよいし、ワークステーションなどであれば、Cシェルコマンドとして入力することもできる。
更に、アセンブラ401やCコンパイラ400などの、ソースプログラムの制御命令として、CPUの種類及び動作モードを入力するようにしてもよい。
アセンブラ401は、選択されたCPUの種類及び動作モードに従って、入力されたアセンブリ言語ソースプログラム上の記述を解釈し、オブジェクトモジュールを生成したり、エラーがあればそれを表示したりする。下位CPUを選択し、上位CPUに存在して、下位CPUに存在しない命令を記述するとエラーになる。命令コード自体は上位CPUが包含しているから、このためのアセンブラを開発し、下位CPUについては、上位CPUに存在して、下位CPUに存在しない命令を検出するような追加を行なうなどして、容易に開発できる。
Cコンパイラ400は、選択されたCPUの種類及び動作モードに従って、使用可能な、オペレーション、データサイズ、アドレッシングモードの組合せで示される命令や、汎用レジスタ、アドレス空間を判別して、C言語によるプログラムを、CPUの命令に変換し、アセンブリ言語プログラムやオブジェクトモジュールとして出力する。
Cコンパイラ400自体には、C言語によるプログラムを、CPUの命令に変換する場合に、そのプログラム自体の解析を最適化するステップとその結果を当該CPUの命令で実現するステップとを有する。また、C++言語によるプログラムのコンパイルや、モジュール間最適化などといった、CPUの命令セットとは直接関係のない機能の向上が図られているが、CPU毎の個別のコンパイラでは、これらのCPUに依存しない機能向上を全ての個別のコンパイラに適用しなければならない。本発明のように、互いに互換性のないCPUを含めて、共通のCコンパイラとしておけば、前記、CPUの命令セットとは直接関係のない機能向上を図ることが容易になり、また、開発効率などを向上することができる。
前記シミュレータデバッガ403は、入力されたロードモジュールのプログラムを解釈して、CPUの動作をシミュレーションし、その中で、エラーがあればそれを表示したりする。例えば、下位CPUを選択し、上位CPUに存在して、下位CPUに存在しない命令を記述するとエラーになる。命令コード及び命令実行機能自体は上位CPUが包含しているから、このためのシミュレータデバッガを開発し、下位CPUについては、上位CPUに存在して、下位CPUに存在しない命令を検出するような追加を行なうなどして、容易に開発できる。
図44には本発明のCPU2のアセンブラが出力するリストを例示する。リストには、行番号、ロケーションカウンタ、オブジェクトコード、ソース行番号、ソースステートメントが表示される。
図44の(a)に示されるプログラムでは、制御命令(.CPU)で、CPU−UMAX、即ち、前記上位CPUのマキシマムモードを指定している。なお、ソースプログラム上で「.」で始まる命令は制御命令であり、マイクロコンピュータのプログラムには直接の関係はない。
SPはER7を表す。これはスタックポインタとしての機能の表記である。更に、本発明では、前記図5の通り、R0LをALと、ER1をEBXと表記してもよいとしている。いずれの表記を用いても、エラーとはされず、同一のオブジェクトコードに変換される。
また、STACKなどのラベルは、本プログラムのみでは解決されないので、オブジェクトコード上の相当するフィールドは0とされている。これらは、前記の通り、リンケージエディタで解決される。
図44の(b)に示されるプログラムでは、同一のプログラムを、第1の下位CPU(CPU−L1)を指定してアセンブルした例を示す。第1の下位CPUには、MOV.L命令が存在しないため、エラーが表示され、オブジェクトコードは生成されない。図44のリストに関する更に詳細な内容は本発明と直接の関係ないので説明を省略する。
図45には本発明に係るCPU2を有するマイクロコンピュータのためのエミュレータを示す。
エミュレーション用プロセッサ410は、マイクロコンピュータ部分にエミュレーション用インタフェースを加えて構成される。前記マイクロコンピュータ部分は、例えば図2のマイクロコンピュータ1の構成に相当される。
コネクタ部411がシングルチップマイクロコンピュータの代わりに応用システム(ターゲットシステム又はユーザシステムとも称する)412のターゲットマイクロコンピュータ搭載領域413に装着される。エミュレーション用プロセッサ410は前記コネクタ部411とインタフェースケーブル414を介し、前記ターゲットシステムインタフェースを用いて前記応用システムと信号の入出力を行う。
特に制限はされないものの、前記応用システム412に、ユーザバス415が存在し、ユーザメモリ416を接続することも可能とされる。この場合、エミュレーション用プロセッサ410が出力し、インタフェースケーブル414を介して供給されるユーザストローブ信号に従って、ユーザメモリ416はリード/ライトされる。
一方、エミュレーション用プロセッサ410は前記エミュレーションインタフェースを用いてエミュレーションバス420に接続される。エミュレーションバス420には図示はされない状態信号・制御信号などを含む。前記エミュレーションバス420を用いて、エミュレーション用プロセッサ410から、応用システム412とエミュレーション用プロセッサ410の内部状態に応じた情報などが出力され、また、エミュレーション用プロセッサ410に対し、エミュレーションのための各種信号が入力される。エミュレーション用プロセッサ410の、図示はされないエミュレートモード端子が電源レベルに固定され、エミュレーション用プロセッサ410内部ではエミュレートモードが設定される。
さらに、前記エミュレーションバス420には、エミュレーションメモリ421、ブレーク制御回路422、リアルタイムトレース回路423などが接続される。前記エミュレーションメモリ421は、特に制限はされないものの、RAMなどによって構成され、前記のユーザプログラムを格納した領域と、エミュレーションのためのプログラムを格納した領域とを持つ。前記ブレーク制御回路422は、エミュレーション用プロセッサ410による制御状態やエミュレーションバス420の状態を監視して、その状態が予め設定された状態に達した時に、前記エミュレータ専用割込みを入力して、エミュレーション用プロセッサ410のCPU(便宜上CPU2と記す)によるユーザプログラムの実行を停止させ、エミュレーション用プログラム実行状態に遷移させる(ブレークする)。前記リアルタイムトレース回路423は、前記CPU2のリード動作またはライト動作を示す信号、命令リード動作を示す信号(CPUステータス信号)、エミュレーションバスに与えられるアドレスやデータさらには制御信号を逐次蓄える。
前記エミュレーションメモリ421、ブレーク制御回路422、リアルタイムトレース回路423はコントロールバス424にも接続され、コントロールバス424を介してコントロールプロセッサ425の制御を受けるようになっている。前記コントロールバス424は、前記コントロールプロセッサ425に接続されるとともに、ホストインタフェース回路426を介して、特に制限はされないものの、前記パーソナルコンピュータなどのシステム開発装置427に接続される。
例えば、システム開発装置427から入力されたプログラム(ロードモジュール)をエミュレーションメモリ421のユーザプログラム格納領域に転送し、内蔵ROM上に配置されるべきかかるプログラムをCPU2がリードすると、エミュレーションメモリ421上のプログラムがリードされ、実行される。また、ブレーク条件や、リアルタイムトレース条件などもシステム開発装置427から与えることができる。
コントロールプロセッサ425は、応用システム412で本来使用するCPUの種類の選択を行うためのプログラムを、エミュレーションメモリ421のエミュレーションプログラム格納領域に格納する。CPU2は、かかるプログラムを、所定の条件でブレークした状態で、実行し、エミュレーションインタフェース442内の制御レジスタ449の設定を行なうことで、エミュレーション上の必要な設定を行なう。この場合は、エミュレーション用プログラムの実行モード、いわゆるブレークモードでのみライト可能にすると都合がよい。開発途上にあるユーザのソフトウェアの誤動作によって、誤った設定を行なってしまうことを抑止できる。また、制御レジスタを用いることによって、応用システム412で本来使用するCPUの種類の選択対象が増えたりしても、制御レジスタの構成のみを変更すればよく、エミュレーション用インタフェースを変更する必要がなく、エミュレータのハードウェアを変更しなくてよい。
エミュレーション用プロセッサ410およびエミュレータを複数のCPUをサポート可能にすることによって、実際のマイクロコンピュータのみを開発すればよく、開発効率を向上することができる。
エミュレータにおいても、前記同様に、CPUの種類を選択可能にする。選択方法は、パーソナルコンピュータなどのシステム開発装置上で、図42と同様に、行なえばよい。選択された内容は、コントロールプロセッサ425を介して、所定のプログラムとして、エミュレーションメモリ421のエミュレーションプログラム格納領域に格納され、CPU2は、かかるプログラムを実行し、エミュレーションインタフェース内の制御レジスタの設定を行なうことで、前記選択が実行される。
このとき、同時に、シングルチップマイクロコンピュータの動作モードなどを同時に指定してもよい。シングルチップマイクロコンピュータの動作モードは、例えば、シングルチップモード、内蔵ROM有効拡張モード、内蔵ROM無効拡張モードなどがあり、これに、CPU2の動作モードを組合せて指定することができる。また、汎用レジスタの表示方法も合わせて選択するようにしてもよい。トレースリスト上などの逆アセンブル時に、ER0と表示するか、EAXと表示するかなどを切り替えるようにする。
応用システム412で本来使用するCPUの種類を指定可能にすることにより、同一のエミュレーション用プロセッサ乃至同一のエミュレータを以って、内蔵機能モジュールや内蔵メモリの容量の組合せなどで、多数の種類のシングルチップマイクロコンピュータをエミュレーションできる。エミュレーション用プロセッサ乃至エミュレータの開発後でも、内蔵している機能の組合せで実現できれば、エミュレーション用プロセッサ乃至エミュレータの開発を行なうことなく、応用分野などの動向に合わせた、シングルチップマイクロコンピュータのみを開発していくことができる。開発効率を向上することができる。
エミュレータに占めるエミュレーション用プロセッサの費用は、少ないから、エミュレーション用プロセッサにはなるべく多くの機能モジュールなどを内蔵しておけばよい。
図46には本発明に係るCPUのためのエミュレータによるトレースリストを例示する。
トレースリストは、行番号(BP)、アドレスバス(AB)、データバス(DB)、アドレスデコード(MA)、リード/ライト(R/W)、ステータス(ST)、割込み信号(NMI、IRQ)を表示するとともに、実行した命令のアセンブリ言語によるリストを示す。これは、データバスの状態と、図示はされないCPU命令実行状態信号を解析して、逆アセンブラが表示する。なお、行番号は、トレースリストの最後は0になる。また、アドレスデコード(MA)のROMは内蔵ROMへのアクセス、リード/ライト(R/W)のRはリードサイクル、ステータス(ST)のPRGは命令を示す。
更に、(a)で示されている、LIR、LID信号は、エミュレーション用インタフェースに含まれている、命令解析用の信号のトレース結果である。通常、かかる信号は、トレースリスト上には表示されないが、トレースメモリには格納され、逆アセンブラなどの解析に用いられる。また、使用者には、通常公開されないコマンドなどによって、表示することができる。
LIR信号は当該バスサイクルが、命令リードであることを示す。LID信号は命令実行開始を示す。
例えば、200行目は、100番地から、命令リードを行い、命令コードH’7A07を読み出したことを示す。199、198行目と合わせて、MOV.L #FFFFFF0E:32,ER7を実行したことが表示されている。逆アセンブラは、LID信号で命令の第1ワードを判定して、H’7A07FFFFFF0Eを、前記MOV.L #FFFFFF0E:32,ER7と解釈して表示するものである。
下位CPUのエミュレーション時に、逆アセンブラは、上位CPUは持つが、下位CPUが持たない命令を実行すると、未定義の命令として、表示する。未定義の命令として表示する場合は、データとして、命令コードを表示する。
図46では、上位CPUの“MOV.L ER0,@ER1”に相当する命令コードを、80、79行目で、200番地から、命令リードを行い、第2の下位CPUで未定義の命令(DATA.L H’01006990)として表示する例が示されている。
図47には本発明を適用したマイクロコンピュータのエミュレーション用プロセッサのブロック図を示す。
エミュレーション用プロセッサ410は、図2のシングルチップマイクロコンピュータ1の部分(マイクロコンピュータコア441)と、エミュレーションインタフェース442から構成される。なお、図2のタイマや入出力ポートなどは、I/Oとして代表させ、また、内部バスの詳細とバスコントローラを図示している。なお、図2のタイマ6,7や入出力ポート11〜19などは、I/O443、ユーザバッファ(ユーザBUF)444として代表させ、また、図2ではその詳細な図示を省略した内部バスIDB,IAB,PDB,PABの詳細とバスコントローラ(BSC)445を図示している。ユーザインタフェース446は前記I/O443、ユーザバッファ444、及び図示を省略する入出力バッファなどを含む、ユーザシステム(エミュレーション対象システムであるターゲットシステム)に接続されるインタフェース回路を総称する。
マイクロコンピュータコア441は、図2のマイクロコンピュータ1に対して未定義命令検出回路448が追加されている。エミュレーションインタフェース440は、制御レジスタ449を含む。制御レジスタ449は、ブレークモードでのみライト可能とされる。エミュレーションインタフェース440から入出力される信号は、アドレスバス、データバス、リード信号、ライト信号、データサイズ信号、命令フェッチ信号などバスの状態を表示するバスステータス信号、命令の実行開始を示す信号、割込み処理の実行開始を示す信号などのCPU2の実行状態を示すCPUステータス信号、などを含み、エミュレータによる、マイクロコンピュータの動作解析に使用される。
未定義命令検出回路448は、CPU2に入力される命令コードを解析し、選択されているCPU2に存在しない命令が実行を開始したことを検出すると、CPU2にブレーク割込みを要求する。CPU2に何れの機能が選択されるかは、制御レジスタ449から指示される。例えば、第1の下位CPUが選択されている場合には、レジスタグループフィールドを持つ前置命令コードを実行すると、未定義命令として検出される。具体的には、命令コードを前記LIR信号でラッチして、解析し、未定義と解読された場合、前記LID信号が発生した時点で、ブレーク割込みを要求するようにすればよく、容易である。
エミュレーション用プロセッサ410は、前記の通り、上位CPU2(CPU−U)を内蔵して、これを用いて、サブセットの機能を持つ、第1の下位CPU、第2の下位CPUの代行をさせる。これによって、下位CPUにエミュレーション用の機能を持たせる必要がなく、開発効率を向上したり、下位CPUは、エミュレーション用の論理回路を含む必要がなく、論理的規模を縮小したりできる。上位CPU2についても、未定義命令検出回路448を独立した機能ブロックとして持つことにより、CPU2を変更する必要がなく、開発効率を損なうことはない。
いずれにせよ、エミュレーション用インタフェースを共通化しておけば、CPU乃至そのほかの機能ブロックが変更になった場合にも、エミュレータ側のハードウェアの変更をする必要がなく、エミュレーション用プロセッサ410のみを変更して、命令の動作を解析して表示する際の逆アセンブラに、いずれのCPUを対象にするかを指示すればよい。逆アセンブラに対する指示は、使用者がシステム開発装置から指定することもできるし、アセンブラからの入力情報によって、自動的に選択されるようなものであってもよい。これによってエミュレータの開発効率を向上し、逸早くエミュレータの開発環境を提供することができる。
図48には第2の下位CPUの別のプログラミングモデルが示される。このプログラミングモデルにおいても、汎用レジスタの総ビット数は同等としているが、汎用レジスタのみ4本としている。汎用レジスタの機能自体は、前記同様である。前記図5と同様に、R0、R1、R2、R3をAX、BX、CX、DXなどと表記できるようにしている。また、PCは24ビットで同等である。図示はされないものの、レジスタ直接やイミディエイトも含めて、ロングワードサイズのデータは扱わないようにする。汎用レジスタを16ビット構成にすることにより、算術論理演算器ALUなど、CPUの実効部の構成を、プログラムカウンタPCとインクリメンタを除いて、16ビット構成にでき、論理的規模を更に縮小できる。
図49にはCPUのアドレスマップの別の例が示される。第2の下位CPUのアドレスマップは、マキシマムモードに相当する16MBのアドレス空間を持つ。データアクセス時は実効アドレスを16ビットで生成し、0〜H’7FFF及びH’FF8000〜H’FFFFFFを指定する。従って、RAMと内部I/Oレジスタを合わせて32kBまで、及びROMを32kBまで指定できる。前記の通り、RAMと内部I/Oレジスタを合わせて32kBの容量は、内蔵された機能モジュールのみで動作する、シングルチップマイクロコンピュータ乃至はマイクロコンピュータシステムでは十分な容量といえる。
データアクセス時で指定できるROMのアドレスが限定されてしまうが、前記の通り、ROMに割り当てる定数などについては、Cコンパイラなどで記述した場合も、モジュール間最適化で、再配置することができる。
プログラムカウンタPCは24ビット構成であり、命令リード時は、24ビットでアドレスを生成し、16MBのアドレス空間を利用できる。分岐命令について、プログラムカウンタ相対と、メモリ間接または絶対アドレス24ビットを実行可能にするとよい。分岐命令は、レジスタフィールドを持たないから、2ワードの命令長で、絶対アドレス24ビットを持つことは可能である。16MBのアドレス空間を連続したものとして、ソフトウェアの負荷なく、利用できる。
また、例外処理時のベクタは24ビット(メモリ上は32ビットとされ、上位8ビットは無視される)、サブルーチン分岐などにおいて待避/復帰されるプログラムカウンタPCも24ビットとされる。
一方、上位CPUについても、準マキシマムモードを追加し、マキシマムモードに相当するアドレスマップを持つ第2の下位CPUと同等の動作を行なうことができるようにしている。
図50及び図51には図49に示される第2の下位CPUのアドレスマップにおける実効アドレスの計算方法が例示されている。
実効アドレスの計算方法は、図7、図8とほぼ同様であるが、データアクセス時には、全て、実効アドレスは16ビットで計算した上で、上位8ビットを符号拡張して、0〜H’7FFF及びH’FF8000〜H’FFFFFFを指定する。
プログラムカウンタ相対は、分岐命令に使用し、前記同様に24ビットで計算する。また、図示はされないものの、分岐命令に、メモリ間接または絶対アドレス24ビットが使用可能な場合は、24ビットで実効アドレスを計算する。
上位CPUの、前記準マキシマムモードにおいては、図49に第2の下位CPUのアドレスマップと同様にする。実際には、実効アドレスの計算自体は図7、図8と同様にしておき、ポストインクリメント/プリデクリメントレジスタ間接の汎用レジスタEへの書込みを抑止するとともに、実効アドレスを利用する際に、上位8ビットを符号拡張すればよい。個別のアドレッシングモードによらず、統一的な制御を可能にして、論理的規模を縮小できる。一方、実効アドレスの計算には、仕様上、汎用レジスタRのみを使用することになるから、汎用レジスタEをデータ用に使用でき、実質的に汎用レジスタを増加させたことになる。
第2の下位CPUの場合には、上位CPUに比較して、汎用レジスタ本数が限定されているから、プログラム用のアドレス空間を縮小せず、実質的に汎用レジスタを増加させるメリットが相対的に大きい。
以上説明した第1の下位CPU及び第2の下位CPUと共に上位CPU2を提供することにより、以下の作用効果を得る。
〔1−1〕異なる命令セットを持つ複数のCPUが、それぞれ論理的規模を縮小しつつ、それぞれ固有の特徴を以って、応用分野乃至使用者の多様な要求に応えることを可能にする。
〔1−2〕下位CPUのレジスタ構成、命令セット、並びに下位CPUの命令実行機能を包含することにより、下位CPUのために開発されたプログラムは、少なくとも、ソースプログラムのレベルで上位CPUに利用可能になり、少なくとも、ソースプログラムレベルでの上位互換を実現することができる。
〔1−3〕有効なアドレスのビット数と、ベクタ及びスタックの単位サイズとを切り替える動作モードを予め用意しておくことにより、オブジェクトプログラムレベルでの上位互換も簡単に実現できるようになる。
〔1−4〕第1、第2の下位CPUの双方に対して、ソースプログラムレベルまたはオブジェクトプログラムレベルでの上位互換を実現した、上位CPUを提供することにより、第1、第2の下位CPUのそれぞれの上位互換のCPUを開発することに比較して、開発効率を向上できる。更に、機能乃至性能を向上する場合にも、上位CPUに対する互換性を維持すれば、自ずから、第1、第2の下位CPUに対しても上位互換を維持できるから、将来拡張性を維持できるし、また開発効率も向上することができる。例えば、上位CPUについて、内部データバスを32ビット化するなどして高速化できれば、第1、第2の下位CPUのソフトウェア資産を有効に利用しつつ、高速化を享受できることになる。
〔1−5〕内部構成を共通化することによって、第1の下位CPUの上位互換で、上位CPUの下位互換となるようなCPU、或いは、第2の下位CPUに、更に下位互換のCPUなど、種々の互換性のあるCPUを提供することが容易にできる。
〔1−6〕第2の下位CPUの命令セットを上位CPUのサブセットとし、削除した命令セットに対応する論理回路などを、上位CPUから削除して、第2の下位CPUを開発することにより、開発効率を向上することができる。
〔1−7〕第1の下位CPUに対して、上位CPUで追加された命令セットの部分の一部を、第2の下位CPUで継承することによって、第1、第2の下位CPUを互いに包含しない命令セットにして、総体的に、多様な要求に応えることができる。
〔1−8〕ソースプログラムレベルまたはオブジェクトプログラムレベルでの上位互換を実現することによって、ソフトウェア資産を有効に利用することができ、使用者のソフトウェア開発効率を向上することができる。
〔1−9〕異なる命令セットを持つ複数のCPUを含めて、ソフトウェア開発装置を共通に利用可能にし、CPUを選択する手段を設けることによって、ソフトウェア開発費用を減少させることができる。また、アセンブラなどは上位CPUについて開発して、そのほかのCPUについては、未定義の命令を検出すればよいから、ソフトウェア開発装置の開発効率を向上することができる。開発効率を向上することによって、開発に必要な資源を削減し、削減した資源を以って、機能向上の頻度を高めることも可能になる。
〔1−10〕ソフトウェア開発装置及び、アセンブリ言語での記述フォーマットを、第1、第2の下位CPUで共通に利用可能にし、第1、第2の下位CPU間でのソフトウェア資産の移植を、比較的容易にすることができる。いずれかの下位CPUを使用することにより、上位のCPUに移行するほど費用を増加させない。
〔1−11〕ソフトウェア開発装置上の、汎用的な機能のみを有する汎用レジスタの記述を複数使用可能にすることにより、他のCPUからのプログラムの移植を、比較的容易に行なうことができる。
〔1−12〕複数のCPUに対応させてエミュレーション用プロセッサのエミュレーション用インタフェースを共通化することにより、同じエミュレータのハードウェアを共有できる。エミュレーション用インタフェースを共通化したり、エミュレータのハードウェアを共通化することによって、逸早く開発環境を整えることができ、また、エミュレータの開発に必要な資源を最小限にすることができる。
〔1−13〕上位CPUに対するエミュレーション用論理を持ち、かかる上位CPUに対するエミュレーション用論理を以って、第1、第2の下位CPUのエミュレーション用プロセッサを構成することができ、エミュレーション用プロセッサの開発効率を向上することができる。
以上説明した上位CPU2によれば以下の作用効果を得る。
〔2−1〕レジスタ拡張用前置命令コードで、レジスタグループを指定し、このレジスタ拡張用前置命令コードを省略可能とし、更にはレジスタ拡張用前置命令コードを付加しない場合の命令コードを既存のCPUの命令コードと同一とすることにより、互換性を損なわずに、汎用レジスタを増加させることができる。ソフトウェア資産を有効に利用可能とするとともに、使い勝手を向上し、処理速度を向上することができる。レジスタ拡張用前置命令コードを用いることにより、全ての汎用レジスタは同時に指定可能であるから、汎用レジスタ上のデータの配置などを考慮する必要がなく、プログラムの作成を容易にすることができる。
〔2−2〕グループ指定フィールドを既存の命令コードの前に配置することにより、汎用レジスタを使用する全ての命令について、汎用レジスタを増加させることができる。この指定方法を共通化することにより、必要な論理的・物理的規模の増加を抑止し、ひいては製造費用の増加も抑止することができる。既存の論理と大部分を共通にできるから、設計資産を有効に利用して、設計品質を向上したり、開発期間を短縮したりできる。また、互換性を保った、アドレス空間の広いCPUと狭いCPUがある場合、双方に、互換性を維持しつつ汎用レスタを追加することも可能である。
〔2−3〕下位CPUにおける既存のレジスタグループを指定するものに相当するオペレーションコード(レジスタ拡張用前置命令コード)を、NOP(ノーオペレーション)命令と同一にすることにより、オペレーションコードマップを有効に利用するとともに、論理構成を共通化し、論理的規模の増加を抑止することができる。
〔2−4〕グループ指定フィールドに余裕を持たせることにより、半導体製造プロセスの進展などに対応して、互換性を維持しつつ、汎用レジスタを増加させることができる。使い勝手を更に向上し、処理速度を向上することができる。方式的には同一にできるので、開発効率を向上することができる。また、アセンブラやCコンパイラ、シミュレータ、逆アセンブラなどのソフトウェアツールなどを、前記拡張を考慮して設計しておく、乃至、予め、前記拡張に対応させておくことにより、開発効率を向上することができる。
〔2−5〕CPUCRのような制御レジスタを設けて、これによって暗黙的に使用されるスタックポインタなどのグループを指定することにより、スタックポインタを変更可能になり、スタックの再配置などを容易に行ことができる。レジスタ拡張用前置命令コードを付加できない割込例外処理についても、スタックポインタを変更することができる。サブルーチン分岐と割込みなどの例外処理のスタックポインタを分離することができる。サブルーチン用のスタック領域と、割込用のスタック領域とを別に持つことができる。これによって、サブルーチン分岐などで実現される各タスクが、予期し得ない割込み例外処理に対応するためにスタックを確保する必要がなくなり、スタックの使用量を抑止することができる。
〔2−6〕上位CPUは、第1の下位CPUに既存の、転送命令コード、演算命令コードを命令拡張用前置命令コードと共に組合せて1命令として実行し、前記各命令コード単独では既存の動作を行なうから、既存の命令実行を阻害することがない。また、第1の下位CPUで作成した、既存の命令のみを使用した既存のソフトウェア資産をそのまま利用できる。換言すれば、第1の下位CPUとの互換性を損なわずに、メモリ上のデータに対する直接的な演算を可能とすることができる。メモリとレジスタ間の演算のみならず、メモリ間の直接的なデータ転送を可能とすることができる。ソフトウェア資産を有効に利用可能とするとともに、不所望な汎用レジスタの待避/復帰動作などを抑止して、使い勝手を向上するとともに、プログラム容量を縮小し、処理速度を向上することができる。プログラム容量を縮小することによって、ひいては、プログラム格納用のROMなどのメモリ容量を縮小し、費用を節約することができる。
〔2−7〕第1の下位CPUに既存の、転送命令の命令コード、演算命令の命令コードを命令拡張用前置命令コードと共に組合せて、動作するから、命令デコーダの、従来の設計資産を有効に利用することができ、論理的な規模の追加と変更を最小限にし、論理的・物理的規模の増大を最小限にできる。また、開発に必要な期間を短縮し、資源を節約することができる。既存のデータアクセスのためのアドレッシングモードを全てサポートできるから、任意のアドレッシングモードの組合せを可能にして、プログラムの作成を容易にすることができる。
〔2−8〕第1の下位CPUの命令セットに追加する命令コードをレジスタ拡張用及び命令拡張用前置命令コードに止めることができるから、命令セットの変更を最小限にして上位CPU2の命令セットを構成することができる。
〔2−9〕デスティネーションがメモリである場合に、デスティネーションデータのリード時の実効アドレスをテンポラリレジスタに確保し、演算結果のデスティネーションデータのライト時の実効アドレスの計算を不要にし、直ちにライト動作を実行可能にして、実行時間を短縮することができる。また、デスティネーションデータのライトを行なう命令コードを、CPU内部で自動的に生成し、命令長を短縮するとともに、かかる命令コードに、データサイズを指示することによって、必要な命令コードを節約し、かかる命令コードを転送命令の動作と類似にすることによって、設計を容易にし、制御回路の論理規模を縮小することができる。比較命令のように、デスティネーションデータのライト動作を必要としない命令においては、ライトサイクルを空きサイクルとすることによって、他の命令との動作を共通化し、設計を容易にし、制御回路の論理規模を縮小することができる。設計を容易にすることによって、ひいては、開発期間を短縮することができる。
〔2−10〕命令拡張用前置命令コードと、メモリをリードする転送命令の命令コードと、メモリに対する転送命令の命令コードを組合せることによって、メモリ・メモリ間の転送を実現できる。
〔2−11〕イミディエイトデータの転送命令の命令コードと、メモリに対する転送命令の命令コードを組合せることによって、イミディエイト・メモリ間の転送を実現できる。
〔2−12〕命令拡張用前置命令コードに他の情報を含めることによって、命令コード長を短縮し、実行時間を短縮することができる。例えば、既存のCPUにおいて、メモリに対する演算以外の指示を行なう前置命令コードと演算コードとを組合せて実現されている命令が存在する場合、前記メモリに対する演算以外の指示を、前記メモリに対する演算を指示する命令拡張用前置命令コードに含めることによって、命令コード長を短縮し、実行時間を短縮することができる。
〔2−13〕既存の命令を組合せ、新規の命令機能を実現しているので、既存のCPUと比較して、将来拡張余裕を同等程度に保持することができる。例えば、既存のCPUに対して、更なる命令セットの拡張や更なる高速化が可能になった場合には、かかる技術を、本発明を適用したCPUにも用いることができる。新規の命令機能を実現している、既存の命令に、前記技術を用い、これを組合せて、前記新規の命令機能を実現することができる。
以上説明した第2の下位CPUによれば以下の作用効果を得る。
〔3−1〕第2の下位CPUにおいて、アドレス空間とプログラムカウンタを上位CPUと同等にし、プログラムの大容量化に応えるとともに、比較的小規模なデータを扱える程度に、データ転送のアドレッシングモードを縮小したり、転送データのデータサイズを限定したりして、所望の応用分野などでの使い勝手を損なわずに、CPUの論理的規模を縮小できる。
〔3−2〕データアクセス時に使用できるアドレス空間を小さくすることによって、更に論理的な規模を縮小できる。また、データアクセス時に使用できるアドレス空間を2つに分割することによって、使い勝手を損なわずに、上位CPUとのアドレス空間上の互換性を維持するとともに、上位CPUに実効アドレス計算方法などを切り替える動作モードを予め用意しておくことにより、ソフトウェア上の互換性を維持することができる。
〔3−3〕プログラム用のアドレス空間を、上位CPUと同等に、大きくしていることにより、C言語などの高級言語を使用したプログラミングなどに対する適性を向上できる。また、スタックポインタを切替え可能にすることによって、OSなどのタスク管理時のスタックの容量の不所望な増加を抑止できる。
〔3−4〕データアクセス用の実効アドレスの計算を、アドレス空間に対応するビット長より、短いビット長(16ビット)で行い、符号拡張して実効アドレスを得ることによって、汎用レジスタの上位側(汎用レジスタE)をデータレジスタとして使用可能にし、実質的に汎用レジスタ数を増加させることができる。
前記検討課題A乃至Cの解決手段に関する発明の具体例について説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
例えば、対象になるCPUは、上位CPU、第1、第2の下位CPUに限定されない。第1の下位CPUの上位互換で、上位CPUの下位互換となるようなCPUが存在してもよい。或いは、第2の下位CPUに、更に下位互換のCPUが存在してもよい。第2の下位CPUの2つの実施例は、排他的なものではなく、同時に存在してもよい。そのほか、種々の互換性のあるCPUを提供することができる。
レジスタ構成(プログラミングモデル)、即ち、汎用レジスタのビット数あるいはレジスタの本数などは任意に選択することもできる。アドレッシングモードと実効アドレスの計算方法についても種々変更可能である。 CPUの具体的な論理回路例などについても限定されない。EA1コードなどは転送命令コードと全く同じでなくてもよい。少なくともCPU内部の実行において同等の動作をすればよい。前置コードに従って転送命令コードの一部のビットの意味を変更してEA1コードとしたりすることができる。汎用レジスタは、アドレス及びデータに共通に利用可能なものである必要はなく、一部または全部がアドレス専用またはデータ専用のものであってもよい。
前置命令コードの種類は特に限定はされない。命令拡張用前置命令コードは、転送命令と演算命令を組合せる情報や、転送命令と転送命令を組み合わせる情報以外の別の制御情報を含んでもよい。例えば、データサイズを指示する情報を含んでもよい。また、命令コードの基本単位16ビットに限定する必要はなく、8ビット或いは32ビットなど任意のビット幅とできる。命令コードの組合せについては、命令拡張用前置命令コード、第1のリード型転送命令コード、第2のリード型転送命令コード、演算命令コード、ライト型転送命令コードを組合せて、メモリ上の相異なる2つのアドレスのデータを入力して、演算し、結果を、ライト型転送命令コードで指定する別のメモリのアドレスに格納するようにすることもできる。第1、第2のリード型転送命令コードを省略して、汎用レジスタ上のデータを入力とすることもできる。命令拡張用前置命令コード、第1のリード型転送命令コード、第2のリード型転送命令コードを組み合せて、第1のリード型転送命令コードでリードしたデータを、第2のリード型転送命令コードのアドレス計算に用いるようにすることもできる。
また、グループ0の汎用レジスタのみを、メモリ上のデータに対する演算命令に使用可能としてもよい。シングルチップマイクロコンピュータのその他の機能ブロックについても何等制約されない。
《検討課題Dの解決手段に関する実施の形態》
次に、前記検討課題Dの解決手段に関する発明の具体例を説明する。ここで説明するマイクロコンピュータは、特に制限されないが、図53に例示されるCPU2Aを有する。マイクロコンピュータのモジュール構成は、特に制限されないが図2と同様である。CPU2Aは図3のレジスタ構成を有し、CPU2Aのアドレス空間は図6と同様であり、CPU2Aによる実効アドレスの演算手法は図7及び図8に示される通りである。CPU2Aの機械語の命令フォーマットは図9に準拠する。
図54にはCPU2Aのビットテスト命令の命令フォーマットが例示される。ビットテスト命令は、汎用レジスタ上またはアドレス空間上のデータの所定のビットを検査して、検査結果をCCRのZフラグに反映するものである。
ビットテスト命令において、汎用レジスタ上のデータは、図54の(5)に例示されるように、レジスタ直接で指定される。この時のビットテスト命令は、オペレーションフィード(op)とレジスタフィールド(r)及び、ビット番号を指定するビットフィールド(n)を有する命令コードとなる。
ビットテスト命令において、汎アドレス空間上のデータの指定は、図54の(1)、(2)、(3)、(4)に例示されるように、絶対アドレス8ビット、16ビット、32ビット、及びレジスタ間接を使用することができる。即ち、絶対アドレスの場合はオペレーションフィールド(op)とEA拡張部(EA)を持つワード、レジスタ間接の場合はオペレーションフィード(op)とレジスタフィールド(r)を持つワードを有し、これに、前記レジスタ直接のビットテスト命令に相当するワードが続く、命令フォーマットを有する。
図55乃至図57にはCPU2Aのアドレス空間上からデータを読み込んで、前記データの所定のビットの状態に応じた処理を行う複合命令の命令フォーマットとして、アドレス空間上のデータの所定ビットに対する条件分岐命令(ビット条件分岐命令)の命令フォーマットを示す。ここで示す命令フォーマットは命令拡張用前置命令コードを用いる後述の例とは異なる例である。尚、単独の条件分岐命令ではコンディションコードフィールド(cc)が分岐条件を指定する。複合命令として分岐命令が組み込まれたビット条件分岐命令において分岐条件はビットコンディションフィールド(bc)で指定されることになる。
アドレス空間上のデータの指定は、図55乃至図57に示されるように、絶対アドレス8ビット、16ビット、32ビット、及びレジスタ間接を使用することができる。これは前記ビットテスト命令の場合のデータ指定のための命令コード(ワード)と完全同一ではないが共通のコードを有する。即ち、データ指定のための命令コードは、例えば“MOVE命令”のようなデータ転送命令であり、命令コード中に単数又は複数の余剰ビットが存在し、その余剰ビットに適当な情報を設定しても、命令セット上でその他の命令コードと区別がつくようになっている。このようなデータ指定のための命令コードは、メモリ空間上で参照したデータをプログラム上解放されていないレジスタ例えばテンポラリデータレジスタTRDにロードする。
前記データ指定のための命令コードの後ろには、前記レジスタ直接のビットテスト命令に相当する命令ワードに代えて、条件分岐命令、サブルーチン分岐命令に相当するワードが続くことである。分岐アドレスの指定は、ディスプレースメント8ビット、16ビットのプログラムカウンタ相対を使用することができる。これは、既存の条件分岐命令と共通の命令コードであり、コンディションフィールド(cc)が、ビットコンディションフィールド(bc)となっている。更に、サブルーチン分岐は、ディスプレースメント16ビットのプログラムカウンタ相対のみを使用することができるようにしている。
尚、前記アドレス空間の小さい、若しくは下位のCPUにおいて、ビットテスト命令に絶対アドレス32ビットがなかった場合には可能な範囲の組合せのみを持つようにすればよい。
ビットコンディションフィールド(bc)は、下位3ビットbc[2:0]が前記テンポラリデータレジスタTRDのビット番号を、上位1ビットbc[3]が分岐条件(セット/クリア)を指定する。即ち、ビット条件分岐命令の最初の命令コードによりアドレス空間上で参照されて前記テンポラリデータレジスタTRDにロードされたデータに対するビット番号が下位3ビットbc[2:0]で指定され、指定されたビット番号の値の真値(True)を前記上位1ビットbc[3]が指定し、参照値が真値であるとき分岐を指示するように作用される。
図55乃至図57の複合命令としてのビット条件分岐命令によれば、アドレスaaのビットnが1にセットされている場合に分岐する命令は、BBS #n,@aa,dと記述すればよく、アドレスaaのビットnが0にクリアされている場合に分岐する命令は、BBC #n,@aa,dと記述すればよく、アドレスaaのビットnが1にセットされている場合にサブルーチン分岐する命令は、BSSR #n,@aa,dと記述すればよく、アドレスaaのビットnが0にクリアされている場合にサブルーチン分岐する命令は、BCSR #n,@aa,dと記述すればよい。前記の通り、n=bc[2:0]である。ディスプレースメントdは、アセンブリ言語においてはラベルを記述すればよく、相対値の計算はアセンブラが行なう。
前記ビット条件分岐命令をサポートしないCPUでは、例えばBBS #n,@aa,dは、
BTST #n,@aa
BNE d
のように、ビットテスト命令(BTST)とその命令の実行結果に応じて分岐する命令(BNT)とを記述する必要があった。また、BSSR #n,@aa,dは、例えば、
BTST #n,@aa
BEQ NEXT
BSR d
NEXT:
のように、ビットテスト命令(BTST)と、その命令の実行結果に応じて分岐する命令(BEQ)と、PC相対によるサブルーチン分岐命令(BSR)とを記述する必要があった。ビットテスト命令に代えてビット転送命令(BLD)とその命令の実行結果に応じて分岐する命令(BCSまたはBCC)を用いても同じである。
図55乃至図57に示されるビット条件分岐命令では、アドレス空間所で参照されたデータが汎用レジスタではなくテンポラリデータレジスタTRDにロードされ、その所定ビットの値に応じて分岐の可否を制御する事ができる。したがって、当該命令コードは1ワード、実行ステート数は1ステートの短縮が可能である。また、ビット条件サブルーチン分岐命令では、命令コードは2ワード、実行ステート数は3ステートの短縮が可能である。
前記の通り、機器制御の場合には、これらの条件分岐命令が組合せて(ツリー状に構成して)、多数の分岐条件の中から分岐先を判定することが多いから、上記短縮効果は全体的には、更に大きくなる。
図58にはCPU2Aにおけるビット条件分岐命令を考慮したときの別の命令フォーマットにおける命令コードの組み合わせが例示される。ここに示す例は、図55乃至図57で説明した命令フォーマットの命令による機能を命令拡張用前置命令コードを用いて実現する例である。即ち、アドレス空間上のデータ指定に用いる命令コードを前記ビットテスト命令の場合のデータ指定のための命令コード(ワード)と同一とし、更にそのワードの前に、プリフィックスコードとして前置命令コードを付加する事により、上記同様に、複合命令をテンポラリデータレジスタTRD等を用いて単一命令として実行可能にするものである。
図58は前記図12乃至図14と合わせれば、前記図11乃至図14に基づいて説明した命令拡張用前置命令コード及び転送命令と共に複合された前記直接的な演算命令の命令フォーマットにおける命令コードの組合せも含めて表現されることになる。尚、CPU2Aのメモリに対する転送命令の例の命令フォーマットは前記図11に基づいて説明した命令フォーマットと同じである。
図58の命令フォーマットにおいて、ビット条件分岐命令は、命令拡張用前置命令コード、EA1コード、分岐コードを組合せ手実現される。図ではEA2コードとの組合せも可能であるが、EA2コードはメモリアドレスをディスティネーションアドレスとするコードを意味するから、実際には意味がない。
図58の命令フォーマットにおいて、複合命令としてのビットテスト命令は、命令拡張用前置命令コード、EA1コード、ビットテスト命令コードを組合せて実現することができる。このときの、ビットテスト命令コードは、汎用レジスタ上の所望のビットに対するビットテスト命令、即ち、図54の(5)の前記レジスタ直接のアドレッシングモードに相当する命令コードとする。また、所望のビットとキャリとの演算命令を備えているような場合には、ビットテスト命令と同様に実現できる。図ではEA2コードとの組合せも可能であるが、上記同様に実際には意味がない。
図58の命令フォーマットにおいてはビットセット命令の機能を拡張できる。単独のビットセット命令は、指定されたデータの指定されたビットにセットする命令である。図58の命令フォーマットにおいて、複合命令としてのビットセット命令は、命令拡張用前置命令コード、EA2コード、ビットテスト命令コードを組合せる。このときの、ビットセット命令コードは、前記同様に、汎用レジスタ上の所望のビットに対するビットセット命令に相当する命令コードとする。図ではEA1コードとの組合せも可能であるが、EA1コードはメモリアドレスをソースアドレスとするコードを意味するから、実際には意味がない。
CPU2Aにおける前記命令拡張用前置命令コード(制御コード)のフォーマットは前記図15に基づいて説明したフォーマットと同じである。このフォーマットに従えば、ソース側、デスティネーション側がメモリである情報を示すビットを持っている。ビット条件分岐命令、ビット操作命令の場合は、ソース側がメモリとなるように指定する。EA1とEA2の転送命令コードは同一としているため、ソース側がメモリであれば、デスティネーション側に拘らず、命令拡張用前置命令コードに続くものが、EA1と判断される。一方、ソース側が汎用レジスタとされ、デスティネーション側がメモリであれば、EA2と判断される。図58の命令フォーマットを有し1個の命令として実行されるとき、命令コード間でのデータの受け渡しにはテンポラリデータレジスタTRDが利用されることについては図55乃至図57で説明したのと同様である。
図58による命令コードの組み合わせにより、所望のビットの存在するアドレスを指定するために、転送命令と同等のアドレッシングモードを使用することができる。当該命令セットの中で、任意のアドレッシングモードを使用できるから、プログラミングを容易にすることができる。例えば、レジスタ直接、レジスタ間接と絶対アドレスのみしか持たない既存のCPUに対し、ディスプレースメント付きレジスタ間接、プリデクリメント/ポストインクリメントレジスタ間接などを追加することによって、複数のアドレスに存在するビットを操作したり、参照したりする場合に、プログラムステップ数を低減したり、処理速度を向上したりできる。このとき、既存の、転送命令の命令コード、ビット操作命令の命令コードを組合せて、動作するから、命令デコーダの、従来の設計資産を有効に利用することができ、論理的な規模の追加と変更を最小限にし、論理的・物理的規模の増大を最小限にできる。
ビット条件分岐命令については、図55乃至図57のフォーマットのものと図58のフォーマットのものとを揃えることができる。両方で同等の機能が実現できる命令(データ及び分岐先のアドレッシングモードの組合せ)については、命令コード長及び実行ステート数の短い方を採用すればよい。
図53には前記CPU2Aの詳細な一例が示される。図1のCPU2では特に図示はしなかったが、コンディションコードレジスタCCRにはコンディションフィールド(cc)の値が入力され、コンディションコードレジスタCCRの所定のビットの値がコンディションフィールド(cc)の値に一致するか否かを判定する判定回路(CMP)35が設けられ、これによる判定結果を受けて分岐制御信号36を生成する分岐制御論理(BRC)37が設けられている。
図55乃至図58の命令フォーマットで説明した複合命令としてのビット条件分岐命令において、テンポラリデータレジスタTRDにはビットコンディションフィールド(bc)の値が入力され、これによって指定されるビット位置の値が分岐条件に一致するか否かを判定する判定回路(CMP)38が設けられ、これによる判定結果は前記分岐制御論理37に供給される。分岐制御論理37は、制御信号MODSの論理値にしたがって判定回路35又は判定回路38からの入力を有効とする。即ち、複合命令としてのビット条件分岐命令を実行してアドレス空間上からデータを参照するとき、命令デコーダDECはMODS=1とし、MODS=1のときテンポラリレジスタライト信号TRDwrが有効にされ、汎用レジスタに代えてテンポラリデータレジスタTRDに参照データが書込まれる。命令デコーダDECは前記複合命令以外のときはMODS=0とし、MODS=0のとき汎用レジスタライト信号Rdwrが有効にされ、汎用レジスタに書込まれる演算結果に応じてCCRのフラグが操作される。前記分岐制御論理37はMODS=1のときテンポラリデータレジスタTRDの判定回路38から出力される情報を採用し、其れに応じて分岐制御を行う。MODS=0のとき、分岐制御回路37はコンディションコードレジスタCCRの判定回路35から出力される情報を採用して分岐制御を行う。
割り込み制御部INTCは、図55乃至図58に示されるように、複数の命令コード(オペレーションフィールドを持つワード)を一連のものとして実行する場合には、それぞれの命令コードが割込みマスクを指示して、所定の組合せの命令コードの実行が途切れないようにする。
算術演算器AUは、プログラムカウンタ相対の分岐命令/サブルーチン分岐命令の分岐アドレスの生成に使用する。具体的には、直前の命令リードに使用したプログラムカウンタPCの出力を入力すると共に、リードデータバッファRDBが保持するディスプレースメントを入力して、それらの加算を行なう。8ビットディスプレースメントのプログラムカウンタ相対の分岐命令/サブルーチン分岐命令の実行開始時には、分岐アドレスが得られているようにする。
インクリメンタINCは、プログラムカウンタPCのインクリメントに用いられる。前述の如く、ビット条件分岐命令では、テンポラリデータレジスタTRDと判定回路38を用いる。
尚、その他、図1と同一の機能を有する回路ブロックには同じ符号を付してその詳細な説明は省略する。
図59には前記テンポラリデータレジスタTRDの判定回路38の論理構成及び分岐制御論理37を論理記述によって例示する。
図59の(5−1)の部分において、ビットコンディションフィールド(bc)は、命令コードに応じて、命令コードのビット11〜8、ビット7〜4の何れかである。これを、制御信号bcc1で選択した結果を、内部信号bc1とする。この内部信号bc1の、最上位ビットbc1[3]はビットの状態(セット/クリア)を、下位ビットbc1[2:0]はビット番号を指定する。
図59の(5−2)の部分では、bc1[2:0]によるセレクタによって、TRDの所望のビットが選択される(trdsel)。
図59の(5−3)の部分では、bc[3]=0のときは、選択されたビットの反転が、bc[3]=1のときは、選択されたビットがそのまま、出力される(bout)。これがビット条件の判定結果である。
図59の(5−4)の部分では、MODS信号によって、既存の条件分岐命令のコンディションコードCCRの判定結果(cout)と前記出力(bout)とが選択されて、分岐/非分岐の結果を得る(bcout)。この結果が、1のとき分岐成立、0のとき分岐不成立である。なお、特に制限はされないものの、分岐条件判定信号(bcc1とbcc2の論理和)が活性状態でないときには、1とするようにしている。
図60乃至図62にはビットテスト命令及びビット条件分岐命令の一部(第1のワード)に対する命令デコーダDECの論理構成が論理記述によって示される。デコーダDECの論理記述において、小文字の信号は、命令デコーダDECで生成されて出力される信号とし、大文字の信号は命令デコーダDECに入力された信号とする。同図の論理記述は、8ビット絶対アドレスによるデータリードを行ない、リードしたデータをテンポラリデータレジスタTRDに格納する場合を例示する。
図60の(6−1)の部分でステートコードTMGが生成される。ステートコードTMGは1→2と進行する。なお、NEXTTMG[5]=0のとき、次のTMGはNEXTTMG[4:0]とされる。NEXTTMG[5]=1のとき、次のTMGは5’b00001とされる。
図60の第2の部分(6−2)ではバス制御を行なう。nop=0はバスアクセス開始、nop=1はバスアクセス禁止を指示する。data=0は命令リード、data=1はデータアクセスを指示する。long=1はロングワードサイズ、long=0のとき、byte=0はワードサイズ、byte=1はバイトサイズを指示する。write=0はリード、write =1はライトを指示する。命令リードの場合は所定のタイミングでバスIDBの内容がIR1とリードデータバッファRDBに格納される。データリードの場合は所定のタイミングでバスIDBの内容がリードデータバッファRDBに格納される。データライトの場合は所定のタイミングでライトデータバッファWDBの内容がバスIDBに出力される。本命令の場合、ステートコード1でデータアクセスを行い、データアクセスのリード且つバイトアクセスと指示される。ステートコード2で命令リードを行なう。
図61の(6−3)の部分で実効アドレスを計算する。本転送命令の場合、ステートコード1で、dbragb=1として、DBRAに保持している命令コードのEA拡張部8ビットを、32ビットに1拡張(上位24ビットをすべて1とする)した上、内部バスGBに出力する。GBの内容はアドレスバッファABに毎ステート格納されるようにされており、特に制御は必要ない。
図61の(6−4)の部分で、転送データを制御する。ステートコード2で、dbrdb=1とし、リードデータをDBRからDBへ出力すると共に、算術論理演算器ALUを経由して、wbtrd=1とし、テンポラリデータレジスタTRDへ格納する。
図62の(6−5)の部分で、割込みマスク信号を制御する。また、制御信号MODSを発生する。
図63乃至図65には条件分岐命令の一部に対する命令デコーダDECの論理構成が論理記述によって示される。本論理記述は、8ビットディスプレースメントの条件分岐命令(Bcc d:8)に相当する。
図63の(7−1)の部分ではステートコードTMGが生成される。ステートコードTMGは1→2と進行する。図63の(7−2)の部分でバス制御を行なう。本命令の場合、ステートコード1、2で命令リードを行い、ステートコード1では、算術演算器AUで計算した分岐アドレスに基づいて分岐アドレスの命令リードを行なう。後述するように、リード完了以前に、分岐するかしないかの判定を行なって、分岐しない場合は、リードした命令は取り込まない。ステートコード2では、前記判定結果に従って、分岐アドレスの次のアドレスまたは、当該分岐命令の次の次のアドレスの命令リードを行なう。
図64の(7−3)の部分で実効アドレスを計算する。ステートコード1で、augb=1とし、算術演算器AUの結果(分岐アドレスの実効アドレス)を、内部バスGBに出力する。また、bcc1=1とし、分岐判定を指示する。実際の判定は、MODS=0のときコンディションコードレジスタCCRの、MODS=1のときテンポラリデータレジスタTRDの内容に従って行われる。なお、bcc1とbcc2は、コンディションフィールド(cc/bc)として使用される命令コードのビット位置が相違される。bcc1の場合はビット11〜8が、bcc2の場合はビット7〜4が使用される。
図64の(7−4)の部分で、転送データを制御するが、本命令では動作を行なわない。図64の(7−5)の部分で、制御信号はいずれも初期化する。割込みも許可し、割込みが要求すれば、引き続き割込み例外処理を行なうことができる。
図66乃至図68にはサブルーチン分岐命令の一部に対する命令デコーダDECの論理構成が論理記述によって示される。本論理記述は、16ビットディスプレースメントのサブルーチン命令(BSR d:16)に相当する。MAX信号は、マキシマムモードを示す。実際には、スタックポインタ(ER7)のデクリメントや、GBへの出力の制御を行なうが、本発明に直接の関係はないので、図示は省略する。
条件成立/不成立に従って、動作が異なる。また、マキシマム/ミニマムモードで、スタックするプログラムカウンタPCのビット長が異なる。
図66の(8−1)の論理記述部分でステートコードTMGが生成される。ミニマムモードの条件成立時、ステートコードTMGは1→14→2→3と進行する。マキシマムモードの条件成立時、ステートコードTMGは1→14→2→11→3と進行する。不成立の場合は、ステートコードTMGは1→14→3と進行する。
図66の(8−2)の論理記述部分でバス制御を行なう。本命令の場合、ステートコード14、3で命令リードを行い、ステートコード2、11は、スタックへのライトを行なう。ステートコード1ではバスアクセスを行なわない。ステートコード14での命令リードは、分岐条件判定結果に基づいて行なう。
図67の(8−3)の論理記述部分で実効アドレスを計算する。bcc2=1とし、分岐判定を指示する。実際の判定は、MODS=1のときテンポラリデータレジスタTRDの内容に従って行われる。また、ステートコード1では、リードデータバッファRDBに保持している命令コードのEA拡張部16ビットを、dbrext信号によって32ビットに符号拡張し、内部バスDBへ出力する。図示はされないものの、プログラムカウンタPCの内容を内部バスGBへ出力して、算術論理演算器ALUで加算を行なう。ステートコード2では、判定結果(BCOUT)に従って、BCOUT=1ならばALUから内部バスGBへの出力を行なう。また、図示はされないものの、BCOUT=0ならPCから内部バスGBへの出力を行なう。
図67の(8−4)の論理記述部分で、転送データを制御するが、本命令では動作を行なわない。図68の(8−5)の論理記述部分で、制御信号はいずれも初期化する。割込みも許可し、割込みが要求すれば、引き続き割込み例外処理を行なうことができる。
図60乃至図68で説明した論理記述を組合せることによって命令デコーダDECは前記ビット条件分岐命令を制御することができる。
命令デコーダDECにおける転送命令の一部の論理記述は図23乃至図25の例と同じである。また、命令デコーダDECにおける演算命令の一部の論理記述は図26及び図27と同じである。
図69及び図70には他の演算命令に対する命令デコーダDECの論理構成の論理記述が例示される。本論理記述は、ビットテスト命令(BTST #n,Rn)に相当する。前記同様に、独立したビットテスト命令として実行するか、メモリ上のデータに対する処理命令の一部として実行するかは、MODS信号によって指示される。特に図示していない部分(算術論理演算器ALUの制御など)については、独立したビットテスト命令と同様にできる。
図69における(9−1)の論理記述部分でステートコードTMGが生成される。ステートコードTMGは1で終了する。同図における(9−2)の論理記述部分ではバス制御を行なう。ステートコード1で命令リードを終了する。
図70における(9−3)の論理記述部分では演算データを制御する。MODS=0の場合には、データを汎用レジスタとし、汎用レジスタの内容をDBに読み出す(rsdb)。MODS=1の場合には、データをメモリとし、テンポラリレジスタTRDの内容をDBに読み出す(trddb)。同図における(9−4)の論理記述部分で制御信号が何れも初期化される。割込みも許可し、割込みが要求すれば、引き続き割込み例外処理を行なうことができる。
図71及び図72には更に他の演算命令に対する命令デコーダDECの論理構成を論理記述で例示する。本論理記述は、ビットセット命令(BSET #n,Rn)に相当する。前記同様に、独立したビットセット命令として実行するか、メモリ上のデータに対する処理命令の一部として実行するかは、MODD信号によって指示される。特に図示していない部分(算術論理演算器ALUの制御など)については、独立したビットセット命令と同様にできる。
図71における(10−1)の論理記述部分でステートコードTMGが生成される。ステートコードTMGは1で終了する。同図における(10−2)の論理記述部分でバス制御を行なう。 ステートコード1で命令リードを終了する。
図72における(10−3)の論理記述部分で、演算データを制御する。MODD=0の場合には、データを汎用レジスタとし、汎用レジスタの内容をGBに読み出す(rdgb)とともに、演算結果を汎用レジスタに書込む(wbrd)。MODD=1の場合には、データをメモリとし、リードデータバッファの内容をバスDBに読み出す(DBRdb)とともに、演算結果をテンポラリデータレジスタTRDに書込む(wbtrd)。
図72における(10−4)の論理記述部分では、割込みマスク信号を制御する。また、デスティネーション側がメモリの場合には、制御信号MKMOVを発生して、ライト型転送命令と同等の動作を行なう命令コードの発生を、命令変更部CHGに指示する。また、ロングワードサイズ信号LNG、バイトサイズ信号BYTEを継続する。
次に上記ビット条件分岐命令などの複合命令の実行タイミングの例を説明する。特に制限はされないものの、内部データバスは16ビットであって、内蔵ROM、RAMリード/ライトを1ステートでリード/ライト可能とする。内蔵ROM、RAMは、バスIABをアドレスバスとし、バスIDBをデータバスとする。後述のPAB、PDBは接続されていないが、同様のタイミングを内部で生成していると理解されたい。
図73にはビット条件分岐命令の第1の例(BBS #0,@FFFFFE,$+20)の実行タイミングが例示される。サイクルT0のスロットC2で、CPU2Aのアドレスバッファ(AB)からアドレスがバスIABに出力される。
サイクルT1のスロットC1で、バスIABの内容がバスPABに出力され、リードサイクルが開始される。スロットC2でリードデータが内部データバスに得られ、これをサイクルT2のスロットC1でレジスタIR1にラッチされる。これは、ビットテスト命令の第1のワードと共通のワードであり(bld)、指定したアドレスのデータをテンポラリレジスタへ格納する。
引き続き、サイクルT2のスロットC2で次のアドレス(+2された内容)がバスIABに出力され、このリードデータがサイクルT3のスロットC1でレジスタIR1にラッチされる(条件分岐命令の命令コード(bcc))。以上の動作は以前の命令の実行の制御によって行われ、相対的な関係が異なる場合もある。
直前の命令の実行が終了すると、最も早く命令の実行が開始される場合には、サイクルT2のスロットC1で命令コード(bld)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、図60乃至図62に基づいて説明した通り、制御信号を出力して、各部の制御を行う。即ち、8ビット絶対アドレスのアドレッシングモードであるので、この絶対アドレスに基づき、ソースデータのリードを行い、リード結果をテンポラリレジスタTRDに格納する。また、制御信号MODS=1とする。
サイクルT2のスロットC2で、リードデータバッファRDBの内容(絶対アドレス)を内部バスGBに読み出して、アドレスバッファABに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。
サイクルT3から、データがリードされる。また、サイクルT3のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。算術演算器AUは、このバスGBの内容を入力して、サイクルT4のスロットC1から分岐アドレスの計算を行なう。
サイクルT4のスロットC1で前記リードデータが、リードデータバッファRDBに格納される。更に、リードデータバッファRDBから内部バスDBに出力され、算術論理演算器ALUに入力する。算術論理演算器ALUの動作は無操作とする。
サイクルT4のスロットC2で、リードデータが、算術論理演算器ALUから内部バスWBに出力され、テンポラリデータレジスタTRDに格納される。
サイクルT4のスロットC1で、命令コード(条件分岐命令(bcc))が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、図63乃至図65に基づいて説明した通り、制御信号を出力して、各部の制御を行う。MODS信号が1にセットされているので、コンディションコードレジスタCCRではなく、テンポラリデータレジスタTRDの所定のビットのテストを行なう。
サイクルT4のスロットC2で、前記の通り、算術演算器AUで計算した分岐アドレスの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。
サイクルT5のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してテンポラリレジスタTRAにライトされる。分岐条件のテストが指示される。
サイクルT5のスロットC2で、分岐条件が成立している場合にはテンポラリアドレスレジスタTRAの内容を、不成立の場合にはプログラムカウンタPCの内容を、内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。これによって、次の次の命令コードのアドレスを切り替える。
一方、サイクルT6のスロットC1で、分岐条件が成立している場合には、バスIDBの内容をレジスタIR1にラッチする(分岐先の命令コード)。不成立の場合には、レジスタIR1の内容が保持され、ビット条件分岐命令の次の命令コードが保存される。これによって、次の命令コードを切り替える。
なお、第1ワードと第2ワード以降が分割されないための連続命令信号(mskint)を出力する。本信号によって、割込み要求などが発生していても、命令の実行を継続することができる。
図74にはビット条件サブルーチン分岐命令の例(BBSR #5,@FFFE00,$+300)の実行タイミングが示される。
サイクルT2のスロットC1で命令コード(bld−1)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。即ち、16ビット絶対アドレスのアドレッシングモードであるので、引き続き、EA拡張部である絶対アドレスをリードした後、この絶対アドレスに基づき、ソースデータのリードを行い、リード結果をテンポラリデータレジスタTRDに格納する。また、制御信号MODS=1とする。
サイクルT1のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。サイクルT2から、リードサイクルが開始され、このリードデータがサイクルT3のスロットC1でリードデータバッファRDBにラッチされる(EA拡張部である絶対アドレス(bld−2))。
サイクルT2のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。サイクルT3から、リードサイクルが開始され、このリードデータがサイクルT4のスロットC1でリードデータバッファRDBにラッチされる(サブルーチン分岐命令(bsr−1))。
サイクルT3のスロットC2で、リードデータバッファRDBの内容(絶対アドレス)を内部バスGBに読み出して、アドレスバッファABに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。サイクルT4から、データがリードされ、サイクルT6のスロットC1で前記リードデータが、リードデータバッファRDBに格納される。更に、リードデータバッファRDBから内部バスDBに出力され、算術論理演算器ALUに入力する。算術論理演算器ALUの動作は無操作とする。
サイクルT6のスロットC2で、リードデータが、算術論理演算器ALUから内部バスWBに出力され、テンポラリデータレジスタTRDに格納される。
サイクルT5のスロットC1で、命令コード(サブルーチン分岐命令(bsr−1))が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、図66乃至図68に8基づいて説明した通り、制御信号を出力して、各部の制御を行う。MODS信号が1にセットされているので、テンポラリレジスタTRDの所定のビットのテストを行なう。
サイクルT5で分岐条件のテストが指示される。サイクルT6のステートC1でプログラムカウンタPCの内容を内部バスGBに、リードデータバッファRDBの内容(ディスプレースメント)を内部バスDBに、それぞれ読み出して、算術論理演算器ALUで加算を行なう。サイクルT6のスロットC2で、分岐条件が成立している場合には算術論理演算器ALUの内容を、不成立の場合にはプログラムカウンタPCの内容を、内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。これによって、次の命令コードのアドレスを切り替える。サイクルT7のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。
サイクルT7のスロットC1でスタックポインタSP(ER7)の内容を内部バスGBに読み出して、算術論理演算器ALUでデクリメント(マキシマムモードのときは4、ミニマムモードのときは2を減算)を行なう。サイクルT7のスロットC2で、算術論理演算器ALUの内容を内部バスGBに読み出して、アドレスバッファABに入力し、アドレスバッファABからアドレスバスIABにアドレスが出力される。ワードサイズライトのバスコマンドを発生する。サイクルT8のスロットC2で、プログラムカウンタPCの内容が内部バスDB、ライトデータバッファWDBを経由して、内部バスIDBに出力される。マキシマムモードの場合は、更に、もう1回のワードサイズライトが行われる。条件不成立の場合には、このスタック動作は行なわない。
サイクルT8のスロットC2で、条件不成立の場合は、サイクルT8のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。次のステートから、リードサイクルが開始される。
図75にはビットテスト命令の第1の例(BTST #0,@FFFFFE)の実行タイミングが示される。これは既存の単独の命令の場合である。
サイクルT2のスロットC1で命令コード(bld)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、図60乃至図62に基づいて説明した通り、制御信号を出力して、各部の制御を行う。即ち、8ビット絶対アドレスのアドレッシングモードであるので、この絶対アドレスに基づき、ソースデータのリードを行い、リード結果をテンポラリデータレジスタTRDに格納する。また、制御信号MODS=1とする。
サイクルT2のスロットC2で、リードデータバッファRDBの内容(絶対アドレス)を内部バスGBに読み出して、アドレスバッファABに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。
サイクルT3から、データがリードされる。また、サイクルT3のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。算術演算器AUは、このバスGBの内容を入力して、サイクルT4のスロットC1から分岐アドレスの計算を行なう。
サイクルT4のスロットC1で前記リードデータが、リードデータバッファDBRに格納される。更に、リードデータバッファDBRから内部バスDBに出力され、算術論理演算器ALUに入力する。算術論理演算器ALUの動作は無操作とする。
サイクルT4のスロットC2で、リードデータが、算術論理演算器ALUから内部バスWBに出力され、テンポラリデータレジスタTRDに格納される。
サイクルT4のスロットC1で、命令コード(ビットテスト命令(btst))が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。MODS信号が1にセットされているので、データを汎用レジスタではなく、テンポラリデータレジスタTRDから読み出す。
サイクルT4のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスIABが出力される。サイクルT5のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。
サイクルT5のスロットC1で、データが、MODS信号に従って、テンポラリレジスタTRDから内部バスGBに出力され、算術論理演算器ALUに入力される。指定されたビットの選択を行なう。
サイクルT7のスロットC2で、ビットテスト結果が、コンディションコードレジスタCCRのZフラグに格納される。選択されたビットが0のときZ=1、1のときZ=0とされる。
図76にはビットテスト命令の第2の例(BTST #1,@ER0+)の実行タイミングが示される。これは、アドレッシングモードを拡張した例である。前置命令コード、MOV.B @ER0+,R0に相当する命令コード、BTST #1,R0Hに相当する命令コードを組合せて実行される。前置命令コードは、図15に従い、H’0108とされ、MODS信号によって、ソース側がメモリであることを指示する。
転送命令コードは、既存の転送命令と同様に、メモリのリードを行なうが、前置命令コードによるソース側をメモリとする指示に基づき、リードデータをテンポラリデータレジスタTRDに格納する。ソース側をメモリとする指示を継続する。演算命令コードは、ソース側をメモリとする指示に従い、ソース側データを汎用レジスタではなく、テンポラリデータレジスタTRDから読み出す。そのほかの動作は、既存の演算命令と同様になる。
サイクルT2のスロットC1で命令コード(前置命令コードpf)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。かかる前置命令コードの場合には、ソース側データがメモリ上に存在することを指示する。即ち、制御信号controlCとしてMODS信号を1にセットし、命令デコーダDECにフィードバックする。
サイクルT2のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。次の命令のリードを行なう。
サイクルT3のスロットC1で命令コード(MOV命令(mov))が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。ポストインクリメントレジスタ間接のアドレッシングモードであるので、アドレスレジスタER0に基づき、ソースデータのリードを行い、リード結果をテンポラリデータレジスタTRDに格納する。
サイクルT3のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。サイクルT3のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。
サイクルT3から、リードサイクルが開始され、このリードデータがサイクルT4のスロットC1でリードデータバッファRDBにラッチされる(ビットテスト命令(btst))。また、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。
サイクルT4のスロットC2で、アドレスレジスタER0の内容(EA)を内部バスGBに読み出して、アドレスバッファABに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。サイクルT5のスロットC1で、再度、アドレスレジスタER0の内容(EA)を内部バスGBに読み出して、算術論理演算器ALUに入力し、インクリメント処理を行なう。この結果は、サイクルT5のスロットC2でアドレスレジスタER0に格納される。
サイクルT5から、データがリードされる。サイクルT6のスロットC1で前記リードデータが、リードデータバッファRDBに格納される。更に、リードデータバッファRDBから内部バスDBに出力され、算術論理演算器ALUに入力する。算術論理演算器ALUの動作は無操作とする。サイクルT6のスロットC2で、リードデータが、算術論理演算器ALUから内部バスWBに出力され、MODS信号が1にセットされているので、汎用レジスタではなく、テンポラリデータレジスタTRDに格納される。
また、サイクルT5のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。次の命令のリードを行なう。
サイクルT6のスロットC1で、命令コード(BTST命令(btst))が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。MODS信号が1にセットされているので、データを汎用レジスタではなく、テンポラリデータレジスタTRDから読み出す。
サイクルT6のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。サイクルT7のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。
また、サイクルT7のスロットC1で、データが、MODS信号に従って、テンポラリデータレジスタTRDから内部バスGBに出力され、算術論理演算器ALUに入力される。指定されたビットの選択が行なわれる。
サイクルT7のスロットC2で、ビットテスト結果が、コンディションコードレジスタCCRのZフラグに格納される。選択されたビットが0のときZ=1、1のときZ=0とされる。
図77にはビットセット命令の例(BSET #2,@ER0+)の実行タイミングが示される。これは、アドレッシングモードを拡張した例である。前置命令コード、MOV.B @ER0+,R0に相当する命令コード、BSET#2,R0Hに相当する命令コードを組合せて実行される。前置命令コードは、図15に従い、H’0104とされ、MODD信号によって、デスティネーション側がメモリであることを指示する。
転送命令コードは、既存の転送命令と同様に、サイクルT4のスロットC2から、メモリのリードを行ない、前置命令コードによるデスティネーション側をメモリとする指示(MODD)に基づき、生成した実効アドレス(メモリアドレス)をテンポラリアドレスレジスタTRAに格納する。また、サイクルT6のスロットC1で、リードデータをリードデータバッファDBRに格納した時点で、既存の転送命令またはソース側のデータのリードの場合より1ステート早く実行を終了する。このため、命令フェッチとプログラムカウンタPCのインクリメントは行なわない。デスティネーション側をメモリとする指示を継続する。ビットセット命令コード(bset)を、サイクルT5のスロットC1から命令デコーダDECに入力する。
演算命令コードは、デスティネーション側をメモリとする指示(MODD)に従い、サイクルT6のスロットC1で、デスティネーション側データを、汎用レジスタではなく、リードデータバッファDBRから、バスGBに読み出し、算術論理演算器ALUに入力する。サイクルT6のスロットC2で、ビットセット結果をテンポラリデータレジスタTRDに格納する。さらに、MOV.W R0,@ER0に類似する命令コード(mov−st)を発生し、サイクルT6のC1から命令デコーダDECに入力する。
発生された命令コード(mov−st)は、 テンポラリアドレスレジスタTRAをアドレスレジスタとし、テンポラリデータレジスタTRDをデータレジスタとする転送命令同様の動作を行う。即ち、サイクルT6のスロットC2で、テンポラリレジスタTRAに格納されている実効アドレスをバスGBに読み出し、アドレスバッファABを経由してバス7IABに出力するとともに、バイトデータライトのバスコマンドを発行する。サイクルT7のスロットC2で、テンポラリデータレジスタTRDに格納されている演算結果をバスDBに読み出し、ライトデータバッファを経由して、バスIDBに出力して、デスティネーションのメモリアドレスに演算結果を書込む。サイクルT7のスロットC2から命令フェッチを行なうとともに、プログラムカウンタPCのインクリメントを行なう。これによって、転送命令コード(mov−1)の実行を短縮し、命令フェッチとプログラムカウンタPCインクリメントを行なわなかった分を回復する。
デスティネーション側メモリにライトする場合、命令コード(mov−st)をCPU2A内部で発生することにより、命令コードを短縮し、処理時間を短縮することができる。テンポラリレジスタTRAの内容を参照することによって、再度実効アドレスの計算を行なう必要がなく、更に、処理時間を短縮することができる。 MOV.W R0,@ER0に類似する命令コードを使用することにより、設計を容易にし、論理的な規模の増加を抑止することができる。
図78にはビット条件分岐命令の第2の例(BBC #0,@ER0+,$+20)の実行タイミングが示される。
前置命令コード、MOV.B @ER0+,R0に相当する命令コード、BRA $+20に相当する命令コードを組合せて実行される。前置命令コードは、図15に従い、H’0108とされ、MODS信号によって、ソース側がメモリであることを指示する。転送命令コードは、既存の転送命令と同様に、メモリのリードを行なうが、前置命令コードによるソース側をメモリとする指示に基づき、リードデータをテンポラリデータレジスタTRDに格納する。ソース側をメモリとする指示を継続する。
サイクルT3のスロットC1で命令コード(条件分岐命令(bcc))が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。ポストインクリメントレジスタ間接のアドレッシングモードであるので、アドレスレジスタER0に基づき、ソースデータのリードを行い、リード結果をテンポラリレジスタTRDに格納する。
サイクルT3のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。サイクルT3のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。
サイクルT3から、リードサイクルが開始され、このリードデータがサイクルT4のスロットC1でリードデータバッファRDBにラッチされる(条件分岐命令(bcc))。また、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。
サイクルT4のスロットC2で、アドレスレジスタER0の内容(EA)を内部バスGBに読み出して、アドレスバッファABに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。サイクルT5のスロットC1で、再度、アドレスレジスタER0の内容(EA)を内部バスGBに読み出して、算術論理演算器ALUに入力し、インクリメント処理を行なう。この結果は、サイクルT5のスロットC2でアドレスレジスタER0に格納される。
サイクルT5から、データがリードされる。サイクルT6のスロットC1で前記リードデータが、リードデータバッファRDBに格納される。更に、リードデータバッファRDBから内部バスDBに出力され、算術論理演算器ALUに入力する。算術論理演算器ALUの動作は無操作とする。サイクルT6のスロットC2で、リードデータが、算術論理演算器ALUから内部バスWBに出力され、MODS信号が1にセットされているので、汎用レジスタではなく、テンポラリデータレジスタTRDに格納される。
また、サイクルT5のスロットC2で、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。次の命令のリードを行なう。
サイクルT6のスロットC1で、命令コード(条件分岐命令(bcc))が命令デコーダDECに入力されて、図74と同様に、命令の内容を解読し、制御信号を出力して、各部の制御を行う。MODS信号が1にセットされているので、コンディションコードレジスタCCRではなく、テンポラリデータレジスタTRDの所定のビットのテストを行なう。
サイクルT6のスロットC2で、前記の通り、算術演算器AUで計算した分岐アドレスの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。
サイクルT8のスロットC1で、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してテンポラリアドレスレジスタTRAにライトされる。分岐条件のテストが指示される。
サイクルT7のスロットC2で、分岐条件が成立している場合にはテンポラリアドレスレジスタTRAの内容を、不成立の場合にはプログラムカウンタPCの内容を、内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレスが出力される。これによって、次の次の命令コードのアドレスを切り替える。
一方、サイクルT8のスロットC1で、分岐条件が成立している場合には、バスIDBの内容を命令レジスタIR1にラッチする(分岐先の命令コード)。不成立の場合には、命令レジスタIR1の内容が保持され、ビット条件分岐命令の次の命令コードが保存される。これによって、次の命令コードを切り替える。
転送命令で使用可能なアドレッシングモードを、ビットテスト命令、ビット条件分岐命令、ビット条件サブルーチン分岐命令の、テスト対象のビットの存在するアドレスの指定に用いることができる。
尚、CPU2Aは加算命令やデータ転送命令等を実行するとき図1のCPU2と同様に図31乃至図41の実行タイミングを実現する。更にCPU2Aの命令デコーダDECは図1のPPU2と同様に図39乃至図41に例示される論理記述の制御論理を実現している。また、CPU2Aの開発環境は図42のように構成できる。このときのシステム開発装置におけるCPU選択手法についても図43で説明した手法をそのまま適用することができる。また、CPU2Aのアセンブラの出力するリストとして図44を例示することができる。更にCPU2Aのエミュレータには図45と同じ構成を採用すればよい。CPU2Aを用いたマイクロコンピュータのエミュレーション用マイクロコンピュータは図47で説明したように構成することができる。
前記検討課題Dの解決手段に関する発明の具体的な実施の形態によれば、以下の作用効果を得るものである。
〔1〕第1のワード、第2のワード(条件分岐命令)などの命令コードは既存のものであるから、単独では従来同様に動作し、既存の命令実行を阻害することがない。また、既存の命令のみを使用していれば、既存のソフトウェア資産を有効に利用できる。汎用レジスタやロードストアアーキテクチャなどの既存のCPUのメリットを損なうことがない。第1のワード、第2のワード(条件分岐命令)に、それぞれ、絶対アドレスのビット長、ディスプレースメントのビット長などに複数の種類があれば、同じ方法によって、これらを組合せることができる。換言すれば、既存のデータアクセスのためのアドレッシングモードや、条件分岐命令のアドレッシングモードを全てサポートできるから、任意のアドレッシングモードの組合せを可能にできる。これらの組合せを可能にすることによって、プログラム上の制約をなくし、使い勝手を向上することができる。また、同じ方法によって、サブルーチン分岐命令と組合せることが可能となり、使い勝手を向上することができる。既存の、独立したビットテスト命令と条件分岐命令を組合せるより、命令コード長の短縮や処理速度の向上に、寄与することができる。
ビットテスト命令、ビットセット命令などのビット操作命令などのアドレッシングモードにも、転送命令と同等のアドレッシングモードを指定でき、使い勝手を向上することができる。多様なアドレッシングモードを指定可能にすることによって、複数のビットの状態に応じて、複数の処理に分岐したり、また、複数のビットを設定したりするような場合などに、最適なアドレッシングモードを使用でき、全体的なプログラム容量の低減や処理速度の向上に、寄与することができる。
〔2〕既存の、転送命令の命令コード、演算命令の命令コードを組合せて、動作するから、命令デコーダの、従来の設計資産を有効に利用することができ、論理的な規模の追加と変更を最小限にし、論理的・物理的規模の増大を最小限にできる。また、開発に必要な期間を短縮し、資源を節約することができる。命令コードの動作内容を変更するための制御信号であるMOD信号を共通化することができる。即ち、データを転送する命令コードを共通にし、続く、命令コードを演算命令コード或いは分岐命令コードを、組合せればよい。命令セットを最適化し、論理的規模の増加を抑止できる。
〔3〕テンポラリレジスタの様なラッチ手段には、指定されたビットの状態を判定する手段を設け、ALUなどに読み出したりすることなく、所定のビットの状態を判定できるようにすることにより、条件分岐命令の全体的な動作を変更することなく、実現できるから、変更する部分を小さくし、また論理的規模の増加を最小限にすることができる。
〔4〕追加する命令コードを前置命令コードに止めることによって、命令セットの変更を最小限にすることができ、一般的なCPU乃至は命令セットに対して、適用することができる。前記前置命令コードは、アドレッシングモードや演算の内容によらず共通に使用できるから、追加する命令コードを最低限にすることができる。また、前置命令コードに、そのほかのデータサイズなどの情報を持たせることによって、全体的な命令コード長を短縮できる。前置命令コードに他の情報を含めることによって、命令コード長を短縮し、実行時間を短縮することができる。例えば、既存のCPUにおいて、メモリに対する演算以外の指示を行なう前置命令コードと演算コードとを組合せて実現されている命令が存在する場合、前記メモリに対する演算以外の指示を、前記メモリに対する演算を指示する前置命令コードに含めることによって、命令コード長を短縮し、実行時間を短縮することができる。
メモリからラッチ手段へのデータ読み込み、演算、ラッチ手段の内容に基づくメモリへのライトは既存の命令と、使用するレジスタが相違なるのみであるから、既存の命令動作を大きく変更することなく、利用できる。これによって、メモリ上のデータへの演算を可能にすることによる論理規模の増加を最小限にすることができる。
〔5〕オブジェクトレベルで互換性を保ちつつ、アドレス空間の広いCPUとアドレス空間の小さいCPUが存在する場合には、アドレス空間の広いCPUで、前記命令を実現することで、下位互換性をもつ、アドレス空間の小さいCPUでもメモリ上のデータを演算を可能にできる。換言すれば、同一の方法で、オブジェクトレベルで互換性を保ちつつ、アドレス空間の広いCPUとアドレス空間の小さいCPUでもメモリ上のデータを演算を可能にできる。オブジェクトレベルで互換性を保つことによる利点とメモリ上のデータを演算を可能にすることの利点の双方を享受することができる。
〔6〕既存の命令を組合せ、新規の命令機能を実現しているので、命令セットの更なる拡張や、更なる高速化に当たって、既存のCPUに対して新たなる課題を生じることが少ない。換言すれば、既存のCPUに対して、更なる命令セットの拡張や、更なる高速化を行なう技術が存在する(発明された)場合には、本発明を適用して、既存のCPUに対して命令セットを拡大したCPUに対しても、同様の技術を適用することができる。新規の命令機能を実現するために用いている、既存の命令のそれぞれに、前記技術を適用して、再度組合せればよい。前置命令コードは動作が単純であり、また、既存の命令に類似した動作とすることによって、変更は容易である。
〔7〕また、既存の命令を組合せ、新規の命令機能を実現しているので、既存のCPUとエミュレーション用インタフェースを共通化することができ、ひいては、同じエミュレータのハードウェアを共通できる。エミュレータのハードウェアを共通化することによって、逸早く開発環境を整えることができ、また、エミュレータの開発に必要な資源を最小限にすることができる。
前記検討課題Dの解決手段に関する発明の実施の形態は一例であり、その要旨を逸しない範囲において種々変更可能である。
例えば、組合せる命令コードは、ビットテスト命令や条件分岐命令に限定されない。新規の命令セットを考える場合、既存の命令セットの上位互換とする場合など、適宜、適当な命令コードを組合せるようにしてよい。少なくとも、1つのオペレーションフィールドで、乃至1回の命令デコードで、ビット条件分岐命令を実行するような複雑な動作を行なわず、当該ビットの存在するアドレスのリード、当該ビットのテスト、分岐判定、分岐などの個別の動作を、類似の命令と共通化するようにすればよい。
ビット条件分岐命令のアドレッシングモードも、実施例に限定されない。分岐アドレスの指定は、プログラムカウンタ相対に限定されず、絶対アドレスや、レジスタ間接などとしてもよい。これは、全体的な命令セットに適合するようにすればよい。
CPUのアーキテクチャは、ロードストア型アーキテクチャでなくてもよい。汎用レジスタは、アドレス及びデータに共通に利用可能なものである必要はなく、一部または全部がアドレス専用またはデータ専用のものであってもよい。汎用レジスタのデータサイズについても任意とすることができる。
前置命令コードの種類は特に限定はされない。また、前置命令コードは、転送命令と条件分岐命令乃至演算命令を組合せる情報のほか、そのほかの制御情報を含んでもよい。例えば、データサイズを指示する情報を含んでもよい。
また、命令コードの基本単位16ビットに限定する必要はなく、8ビット或いは32ビットなど任意のビット幅とできる。制御信号は、MODS、MODDを用いるものとしたが、そのほかの制御信号に分割することもできる。
前置命令コード、第1のリード型転送命令コード、第2のリード型転送命令コード、演算命令コード、ライト型転送命令コードを組合せて、メモリ上の相異なる2つのアドレスのデータを入力して、演算し、結果を、ライト型転送命令コードで指定する別のメモリのアドレスに格納することができる。第1、第2のリード型転送命令コードを省略して、汎用レジスタ上のデータを入力とすることもできる。
《検討課題Eの解決手段に関する実施の形態》
次に、前記検討課題Eの解決手段に関する発明の具体例を説明する。ここで説明するマイクロコンピュータは図2に基づいて説明した構成を有するものであり、繰り返しになるのでその詳細な説明は省略する。従って、マイクロコンピュータ1に内蔵される前記CPU2は図3に示されるような汎用レジスタ及び制御レジスタの構成を有している。当然CPU2は図4のプログラミングモデルを有する下位CPUの汎用レジスタ及び命令セットを包含することになる。そして上位CPUとしてのCPU2は図5のアドレス空間を有している。CPU2の実効アドレスの計算には前述の図7及び図8で説明した手法が採用されている。
ここで説明するマイクロコンピュータの一例は図79に示される。マイクロコンピュータ501は、命令を実行してマイクロコンピュータ501全体の制御を司る中央処理装置(CPU)502、シングルチップマイクロコンピュータの動作モードなどを制御するシステムコントローラ(SYSC)514、割込コントローラ(INT)503、バスコントローラ510、DMAコントローラ(DMAC)511、外部バスDMAC(EXDMAC)512、CPU502の処理プログラムなどを格納するメモリであるリードオンリメモリ(ROM)504、CPU502の作業領域並びにデータの一時記憶用のメモリであるランダムアクセスメモリ(RAM)505、タイマ506、パルス出力回路507、シリアルコミュニケーションインタフェース(SCI)508、A/D変換器(A/D)509、入出力ポートIOPA〜IOPF、入出力ポートIOP1〜IOP5、及びクロック発振器(CPG)513の機能ブロック若しくは回路モジュールを有し、公知の半導体集積回路製造技術により1つの半導体基板(半導体チップ)に形成されている。
前記CPU502は主にROM504から命令をフェッチし、これを解読して演算動作や制御動作を行う。前記DMAC511はCPU502とバスを共有し、CPU502に代ってデータ転送制御を行う。前記EXDMAC512は、外部バス上のデータ転送制御に特化された転送制御装置であり、CPU502またはDMAC511の内部バス上でのアクセス動作に並行して、外部バス上でのデータ転送制御が可能にされる。
バスコントローラ510は、内部バスコントローラ、外部バスコントローラ、及びリフレッシュタイマなどを持つ。内部バスコントローラはCPU502とDMAC511とのバス権調停を行う。外部アドレスは、例えば、8個のエリアに分割され、外部バスコントローラにはエリア毎に、バス幅やアクセスステート数を設定することができ、DRAMやROMなどの高速ページモードといった、連続アクセス時に、短縮されたバスサイクルを実現可能にしている。例えば、外付けのDRAMに対する場合、ノーマル4ステートアクセスに対し、高速ページ2ステートなどとされる。外部バスコントローラは、CPU502、DMAC511、EXDMAC512の夫々からのバス権要求と、外部からバス権要求に対する調停を行う。
マイクロコンピュータ501の前記各種機能ブロックは、内部バスによって相互に接続される。内部バスはアドレスバス、データバスの他、図示はされない、バス権要求信号、バスアクノレッジ信号、バスコマンド、外部バスコマンド、レディ信号、外部バスレディ信号、リード信号・ライト信号、さらにバスサイズ信号、システムクロック信号等を含む。内部アドレスバスバスには、IAB、PAB、EXABが存在する。内部データバスにはIDB、PDBが存在する。
それらのバスは、バスコントローラ510によってインタフェースされている。内部バスIAB、IDBはCPU2、DMAC11、ROM504、RAM505、バスコントローラ510に接続され、更に、アドレスバスIABは外部バスのアドレスバスとインタフェースするために、入出力ポートIOPA〜IOPCに接続され、データバスIDBは外部バスのデータバスとインタフェースするために、入出力ポートIOPD、IOPEに接続される。
ペリフェラルバスPAB、PDBはバスコントローラ510、EXDMAC512、タイマ506、パルス出力回路507、SC5I8、A/D変換器509、割込コントローラ503、入出力ポートIOPA〜IOPF及び入出力ポートIOP1〜IOP5に接続される。これらの機能ブロックが有する制御レジスタを総称して、内部I/Oレジスタと呼ぶ。
アドレスバスEXABは、EXDMAC512とバスコントローラ510、入出力ポートIOPA〜IOPCを接続する。なお、バスコントローラ510は、アドレスバスEXABのアドレスを判定し、バス仕様に従った動作を実行するために参照する。従って、バスコントローラ510はエリアを判定したり、DRAMのロウアドレスを判定する程度の上位ビットを入力するのみでよい。
CPU502とDMAC511が、内部バスマスタとして、内部バスを使用することができ、それぞれのバス権要求信号に従って、バスコントローラ(内部バスアービタ)510が調停する。また、外部バスについては、内部バスマスタによる外部バスアクセス、EXDMAC512、外部バス権解放要求、リフレッシュ要求のバス権要求信号に従って、バスコントローラ(外部バスアービタ)510が調停する。
ROM504、RAM505、及びタイマ506、パルス出力回路507、SCI508、A/D変換器509、入出力ポートIOPA〜IOPF及びIOP1〜IOP5、割込コントローラ503の各機能ブロック及びEXDMAC512は、内部バススレーブとして、CPU502またはDMAC511によって動作制御情報等がリード/ライト可能にされる。
割込コントローラ503は、タイマ506、SCI508、A/D変換器509、入出力ポートIOP5の出力する割込信号を入力し、CPU502に割込要求信号531を、DMAC511に起動要求信号(図示せず)を出力する。また、DMAC511の出力するクリア信号(図示せず)を入力して、割込クリア信号(図示せず)を出力する。
入出力ポートは、外部バス信号、入出力回路の入出力信号と兼用とされている。入出力ポートIOPA〜IOPCはアドレスバス出力、入出力ポートIOPD、IOPEはデータバス入出力、入出力ポートIOPFはバス制御信号入出力信号と兼用されている。外部アドレス、外部データは、それぞれ、これらの入出力ポートに含まれるバッファ回路を介してバスIAB、IDBと接続されている。バスPAB、PDBは入出力ポートのレジスタをリード/ライトするために使用し、外部バスとは直接の関係はない。バス制御信号出力は、アドレスストローブ、ハイ/ロウデータストローブ、リードストローブ、ライトストローブ、バスアクノリッジ信号などがある。バス制御入力信号にはウェイト信号、バスリクエスト信号などがある。これらの入出力信号は図示はされない。外部バス拡張を行うことは、動作モードなどで選択され、これらの入出力ポートの機能も選択される。
また、入出力ポートIOP1はタイマ入出力、入出力ポートIOP2はパルス出力、入出力ポートIOP3はSCI508の入出力、入出力ポートIOP4はアナログ入力、入出力ポートIOP5はEXDMAC512、DMAC511入出力と兼用されている。EXDMAC512、DMAC511、タイマ506、SCI508、パルス出力507、A/D変換器509と入出力ポートIOP1〜IOP5との入出力信号や内部割込み要求信号などは図示を省略してある。
割込要因が発生すると、割り込みコントローラ503でCPU502又はDMAC511の何れに要求を行なうか判定し、また、優先順位などが判定される。CPU502に割込要求が発生されると、CPU502は実行中の処理を中断して、例外処理状態を経て、所定の処理ルーチンに分岐し、所望の処理を行い、割込要因をクリアしたりする。所定の処理ルーチンの最後には、通常復帰命令(RTE命令)がおかれ、この命令を実行することによって前記中断した処理を再開する。
上記マイクロコンピュータ501は、電源端子として、グランドレベル(Vss)、電源電圧レベル(Vcc)、アナロググランドレベル(AVss)、アナログ電源電圧レベル(AVcc)、アナログ基準電圧(Vref)の入力端子の他に、専用制御端子として、リセット(RES)、スタンバイ(STBY)、モード制御(MD0、MD1、MD2)、クロック入力(EXTAL、XTAL)の各端子を有する。
前記端子EXTAL、XTALを介してCPG513に水晶発振子による発振信号又は外部クロック信号が入力され、これに基づいて基準クロック信号(システムクロック)φを生成する。マイクロコンピュータはその基準クロック信号φに同期して動作を行う。この基準クロック信号φの1周期をステートと呼ぶ。
RES端子にリセット信号が加えられると、SYSC514がモード端子MD0〜MD2で与えられる動作モードを取り込み、マイクロコンピュータ501はリセット状態になる。モード端子で設定する動作モードは、シングルチップ/拡張、アドレス空間、内蔵ROMの有効/無効、データバス幅の初期値8ビット/16ビットなどを選択する。
このリセットが解除されると、CPU502は所定のアドレスからスタートアドレスをリードして、このスタートアドレスから命令のリードを開始するリセット例外処理を行う。この後、CPU502は逐次、ROM504などから命令をリードし、解読して、その解読内容に基づいてデータの処理或はRAM505、タイマ506、SCI508、入出力ポートなど、或いは外部バスに接続されるメモリやI/Oなどとのデータ転送を行う。即ち、CPU502は、入出力ポート、A/D変換器509などか入力されるデータ、或はSCI508などから入力される指示を参照しつつ、ROM504などに記憶されている命令に基づいて処理を行い、その結果に基づいて、入出力ポート、タイマ506などを使用して、外部に信号を出力し、各種機器の制御を行う。
図3は前記CPU502に内蔵されている汎用レジスタ及び制御レジスタの構成例(プログラミングモデル)として上位のCPU502のプログラミングモデルを示す図面でもある。
CPU502は、32ビット長の汎用レジスタを32本持っている。汎用レジスタER0〜ER31は、全て同等の機能を持っており、アドレスレジスタとしてもデータレジスタとしても使用することができる。
データレジスタとしてしては32ビット、16ビットおよび8ビットレジスタとして使用きる。アドレスレジスタおよび32ビットレジスタとしては、一括して汎用レジスタER(ER0〜ER31)として使用する。16ビットレジスタとしては、汎用レジスタERを分割して汎用レジスタE(E0〜E31)、汎用レジスタR(R0〜R31)として使用する。これらは同等の機能を持っており、16ビットジスタを最大64本まで使用することができる。なお、汎用レジスタE(E0〜E31)を、特に拡張レジスタと呼ぶ場合がある。8ビットレジスタとしては、汎用レジスタRを分割して汎用レジスタRH(R0H〜R31H)、汎用レジスタRL(R0L〜R31L)として使用する。これらは同等の機能を持っており、8ビットレジスタを最大64本まで使用することができる。各レジスタ独立に使用方法を選択することができる。
汎用レジスタER7、ER15、ER23、ER31には、汎用レジスタとしての機能に加えて、スタックポインタ(SP)としての機能が割り当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。例外処理は前記割込み例外処理を含む。
なお、内部論理構成上はER0〜ER7をグループ0、ER8〜ER15をグループ1、ER16〜ER23をグループ2、ER24〜ER31をグループ3としている。グループ0が既存のCPU(CPU502に対する下位CPU)の汎用レジスタと同一とされる。
それらの汎用レジスタは、プログラミング仕様上は相違なく、すべて同等に使用できる。少なくとも、アセンブリ言語で書く場合には、グループを意識せず、例えば、R0H、E8、R16,ER31、などと記述できる。例えば平成7年3月(株)日立製作所発行『H8S/2600シリーズH8S/2000シリーズプログラミングマニュアル』のアセンブラフォーマットに従って記述すれば、「MOV.L ER0,ER31」或いは、「ADD.W E8,R16」などとレジスタ番号のみで記述できる。
CPU502は更に、コントロールレジスタとして、図3に例示される24ビットのプログラムカウンタPCと8ビットのエクステンドレジスタEXR及び8ビットのコンディションコードレジスタCCRを含んでいる。
前記プログラムカウンタPCは、CPU502が次に実行する命令のアドレスを示す。特に制限されないものの、CPU502の命令は、すべて2バイト(ワード)を単位としているため、バイトを最小単位として指示するアドレス信号の最下位ビットは無効であり、命令リード時には命令アドレスの最下位ビットは0とみなされる。
前記コンディションコードレジスタCCRは8ビットのレジスタで、CPU502の内部状態を示している。割込みマスクビット(I)とハーフキャリ(H)、ネガティブ(N)、ゼロ(Z)、オーバフロー(V)、キャリ(C)の各フラグを含む8ビットで構成されている。
前記エクステンドレジスタEXRは8ビットのレジスタで、割込みなどの例外処理の制御を行なう。割込みマスクビット(I2〜I0)とトレース(T)の各ビットを含んでいる。
図4はCPU502に対する下位互換のCPUのプログラミングモデルを示す図面でもある。前記図3のプログラミングモデルを持つ上位のCPU502は、図4のプログラミングモデルを有する下位CPUの汎用レジスタ及び命令セットを包含している。
下位互換のCPUは、16ビット長の汎用レジスタを8本持っている。汎用レジスタR0〜R7は、すべて同等の機能を持っており、アドレスレジスタとしてもデータレジスタとしても使用することができる。
データレジスタとして16ビット及び8ビットレジスタとして使用きる。アドレスレジスタおよび16ビットレジスタとしては、一括して汎用レジスタR(R0〜R7)として使用する。8ビットレジスタとしては、汎用レジスタRを分割して汎用レジスタRH(R0H〜R7H)、汎用レジスタRL(R0L〜R7L)として使用する。これらは同等の機能を持っており、8ビットレジスタを最大16本まで使用することができる。各レジスタを独立に使用方法を選択することができる。
汎用レジスタR7には、前記同様に、汎用レジスタとしての機能に加えて、スタックポインタ(SP)としての機能が割り当てられており、例外処理やサブルーチン分岐などで暗黙的に使用される。
図80にはCPU502のアドレス空間が示されている。マイクロコンピュータ501のアドレスマップとしては、ROM504は0番地から、一方、RAM505及び内部I/OレジスタはH’FFFFまたはH’FFFFFF番地まで、それぞれアドレス空間の両端になるように配置されるようにする。
上位CPU502は、16MBのアドレス空間のマキシマムモードと64kBのアドレス空間のミニマムモードを持つ。かかるマキシマムモードとミニマムモードの選択は、マイクロコンピュータ501のモード制御入力端子MD0〜MD2の状態によって行われる。
マキシマムモードでは、絶対アドレス24ビット(上位8ビットは予約され、命令コード中は32ビット)で全空間を、絶対アドレス16ビットで0〜 H’7FFF及びH’FF8000〜H’FFFFFFを指定する。また、例外処理時のベクタは24ビット(メモリ上は32ビットとされ、上位8ビットは無視される)、サブルーチン分岐などにおいて待避/復帰されるプログラムカウンタPCも24ビットとされる。
ミニマムモードでは、絶対アドレスとレジスタ間接のアドッレシングモードのいずれも、下位16ビットのみを使用し、上位ビットは無視する。例外処理時のベクタは16ビット、サブルーチン分岐などにおいて待避/復帰されるプログラムカウンタPCも16ビットとされる。
下位CPUは、ミニマムモードに相当する64kBのアドレス空間を持つ。絶対アドレスは16ビットのみを持ち、また、レジスタ間接では16ビットレジスタで、それぞれ全空間を指定する。ベクタやスタックの構造などが前記上位CPU502のミニマムモードと同等の動作になり、例外処理時のベクタは16ビット、サブルーチン分岐などにおいて待避/復帰されるプログラムカウンタPCも16ビットとされる。
前記図7及び図8は上位CPU502のマキシマムモードにおける実効アドレス計算方法を例示する図面でもある。
図7の(1)に示されるレジスタ間接では命令コード中にレジスタを指定する部分(レジスタフィールド)を含み、この命令コードで指定された汎用レジスタERの内容の合計32ビットをアドレスとしてメモリ上のアドレスを指定する。アドレスは24ビットでよいため、上位8ビットは無視する。
図7の(2)、(3)に示されるディスプレースメント付レジスタ間接は、上記レジスタ間接と同様に得られた32ビットのアドレスに、命令コード中に含まれるディスプレースメントを加算した結果をアドレスとしてメモリ上のアドレスを指定する。加算結果はアドレスの指定のみに使用され、汎用レジスタERの内容には反映されない。特に制限はされないものの、ディスプレースメントは32ビットまたは16ビットであり、16ビットディスプレースメントは加算する場合には上位16ビットは符号拡張される。すなわち、ディスプレースメントの上位16ビットは16ビットディスプレースメントのビット15と同じ値であるとして加算が行われる。この場合も上位8ビットは無視される。
図7の(4)に示されるポストインクリメントレジスタ間接は、前記レジスタ間接と同様に得られた32ビットのアドレスでメモリ上のアドレスを指定する。その後、このアドレスに1、2又は4を加算し、その加算結果が汎用レジスタERに格納される。メモリ上のバイトデータを指定する場合には1が、ワードデータを指定する場合には2が、アドレスデータを指定する場合には4が、それぞれ加算される。また、複数レジスタの転送命令では、レジスタ本数分を乗算した結果が用いられる。加算結果の上位8ビットも拡張レジスタに格納される。後述する複数汎用レジスタ転送命令の場合は、2(ワードサイズ)または4(ロングワードサイズ)に、レジスタ本数を乗算した値が用いられる。
図7の(5)に示されるプリデクリメントレジスタ間接は、前記レジスタ間接と同様に得られた32ビットのアドレスから1、2又は4を減算した結果の24ビットのアドレスでメモリ上のアドレスを指定する。その後、その減算結果が汎用レジスタERに格納される。メモリ上のバイトデータを指定する場合には1が、ワードデータを指定する場合には2が、アドレスデータを指定する場合には4が、それぞれ減算される。また、複数レジスタの転送命令では、レジスタ本数分を乗算した結果が用いられる。前記同様に、アドレスが24ビットでよい場合には、特に制限はされないものの、減算結果の上位8ビットも拡張レジスタに格納される。(4)と同様に、後述の複数汎用レジスタ転送命令の場合は、2(ワードサイズ)または4(ロングワードサイズ)に、レジスタ本数を乗算した値が用いられる。
図8の(6)(7)(8)に示される絶対アドレスは命令コード中に含まれる、8ビット、16ビット又は32ビットの絶対アドレスをアドレスとしてメモリ上のアドレスを指定する。8ビット絶対アドレスは、上位16ビットが論理値1に拡張(1拡張)される。すなわちアドレスのビット23〜8は全ビット1とされる。従って使用可能なアドレスはH’FFFF00〜H’FFFFFFの256バイトである。また、16ビット絶対アドレスは、上位8ビットが符号拡張される。すなわち、16ビット絶対アドレスのビット15が0であればアドレスのビット23〜16は全ビット0とされ、ビット15が1であればアドレスのビット23〜16は全ビット1とされる。従って使用可能なアドレスはH’000000〜H’007FFF及びH’FF8000〜H’FFFFFFの64kバイトである。
図8の(9)、(10)に示されるプログラムカウンタ相対は、プログラムカウンタの内容の24ビットのアドレスに命令コード中に含まれるディスプレースメントを加算した結果をアドレスとしてメモリ上のアドレスを指定する。加算結果はプログラムカウンタに格納される。特に制限はされないものの、ディスプレースメントは16ビットまたは8ビットであり、これらのディスプレースメントは加算する場合には上位8ビットまたは16ビットは符号拡張される。すなわち、ディスプレースメントの上位8ビットは16ビットディスプレースメントのビット15と、または上位16ビットは8ビットディスプレースメントのビット7と同じ値であるとみなして加算が行われる。プログラムカウンタ相対は分岐命令のみで使用される。
尚、上位CPU502のミニマムモードでは、実効アドレスの上位8ビットが無視され、下位16ビットが有効になる。上記の他にイミディエイト、レジスタ直接、メモリ間接などのアドレッシングモードを実行するが、これらは本発明に直接は関係しないので詳細な説明は省略する。
図4のプログラミングモデルを持つ下位互換のCPUの、データ転送命令では、レジスタ間接、16ビットディスプレースメント付レジスタ間接、ポストインクリメント/プリデクリメントレジスタ間接、8/16ビット絶対アドレス、が使用可能である。実効アドレスの計算方法は上記同様である。
図81には複数レジスタ転送命令(複数レジスタ・メモリ間転送命令、複数レジスタ・レジスタ間転送命令)としての複数汎用レジスタの転送命令(MOVM)の機能が示される。データサイズは、ワード(W)及びロングワード(L)が可能であり、また、汎用レジスタ間、及び汎用レジスタ・メモリ間のデータ転送が可能である。また、アドレッシングモードは、イミディエイトを除き、従来の転送命令と同様である。
汎用レジスタの選択は、2、3、4本の選択が可能であり、ロングワードサイズの場合、ER0−ER1、ER2−ER3、ER4−ER5、ER6−ER7、…、ER30−ER31の2本の組み合わせ、ER0−ER2、ER4−ER6、…、ER28−ER30の3本の組合せ、ER0−ER3、ER4−ER7、…、ER28−ER31の4本の組合せが可能である。ワードサイズの場合は、相当する汎用レジスタRのみ、または汎用レジスタEのみが選択される。
図81においてRnsはソースになる汎用レジスタ番号を意味し、Rndはディスティネーションになる汎用レジスタ番号を意味し、EAsはソースになる実効アドレスを意味し、EAdはディスティネーションになる実効アドレスを意味する。
図82には複数汎用レジスタの転送命令(MOVM)によるデータ転送のデータ配置が示される。(1)はワードサイズの2個のデータのレジスタ・メモリ間転送を示し、(2)はワードサイズの2個のデータのレジスタ・レジスタ間転送を示し、(3)はロングワードサイズの2個のデータのレジスタ・メモリ間転送を示し、(4)はロングワードサイズの2個のデータのレジスタ・レジスタ間転送を示している。
例えば図82の(3)において、第1の汎用レジスタERnの最上位のデータ、例えば、Enの上位8ビット(aで示される)が、実効アドレスEAで指定されるメモリ(aで示される)に対応し、汎用レジスタの次のデータ、例えば、Enの下位8ビット(bで示される)が、実効アドレスEA+1で指定されるメモリ(bで示される)に対応する。第1の汎用レジスタの最下位のデータ、例えば、RLnのデータdの次は、第2の汎用レジスタ例えばERn+1の最上位のデータ、例えば、En+1の上位8ビットのデータeになる。ワードサイズの場合は、図示を省略するが、EnとEn+1の2本と、RmとRm+1の2本との間のデータ転送も可能である。
図9はCPU502の機械語の命令フォーマットと命令コードを例示する図面でもある。CPU502の命令は、2バイト(ワード)を単位にしている。各命令はオペレーションフィード(op)、レジスタフィールド(r、gr)、EA拡張部(EA)、およびコンディションフィールド(cc)を含む。
オペレーションフィールド(op)は、命令の機能を表し、アドレッシングモードの指定オペランドの処理内容を指定する。オペレーションフィールド(op)は、命令の先頭4ビットを必ず含む。2つのオペレーションフィールドを持つ場合もある。
レジスタフィールド(r、gr)は組合わせて汎用レジスタを指定する。レジスタフィールド(r)はアドレスレジスタのとき3ビット、データレジスタのとき3ビット(32ビットレジスタ)または4ビット(8または16ビットレジスタ)である。2つのレジスタフィールドr1,r2を持つ場合、またはレジスタフィールドr1,r2を持たない場合もある。
レジスタフィールド(gr)は4ビット存在するが、特に制限はされないものの下位2ビットを有効にする。レジスタフィールド(gr)を含むワード(op,gr1,gr2を含むワード)は省略可能とされ、省略された場合は、0が与えられたものと想定され、グループ0のレジスタセットが指定されたものと見なされ、レジスタフィールド(r)で指定されるレジスタはレジスタ番号は0〜7とされ、汎用レジスタER0〜ERが選択できる。そのようなワード(op,gr1,gr2を含む命令コード)をレジスタ拡張用前置命令コードと称する。
レジスタ番号n=gr[1:0]<<3+r[2:0]で求められる(<<3は3ビット左シフトを示す)。即ち、grを上位とし、rの下位3ビットr[2:0]を下位とした5ビットで指定される番号のレジスタを指定する。例えば、gr=0、r=1の場合はレジスタ番号n=1となり、gr=2、r=3の場合はレジスタ番号n=19となる。このレジスタ番号nに対応する汎用レジスタERnの、命令コードのサイズを指定する部分や、r[3]の内容によって、レジスタER、レジスタE、レジスタR、レジスタRH、レジスタRLが指定される。例えば、データサイズがロングワード、ワード、バイトの何れであるかは命令コードのオペレーションフィールドの所定のビットで指定される。データサイズがワード又はバイトのとき、利用するレジスタ位置はr[3]で指定される。r[3]は、rの下位から4ビット目のビットデータを意味する。データサイズがワードのときr[3]=1のときはレジスタEを指定し、r[3]=0のときはレジスタRを意味する。データサイズがバイトのときr[3]=1のときはレジスタRLを指定し、r[3]=0のときはレジスタRHを意味する。
尚、gr1、r1はソースレジスタまたはアドレスレジスタのレジスタ指定フィールドを意味し、gr2、r2はデスティネーションレジスタまたはデータレジスタのレジスタ指定フィールドを意味する。gr1(命令コードの基本ワード中のビット7〜4)はr1(命令コードの基本ワード中のビット7〜4またはビット6〜4)に、gr2(命令コードの基本ワード中のビット3〜0)はr2(命令コードの基本ワード中のビット11〜8またはビット3〜0)に対応する。
EA拡張部(EA)は、イミディエイトデータ、絶対アドレスまたはディスプレースメントを指定し、8ビット、16ビット、または32ビットである。コンディションフィールド(cc)は条件分岐命令(Bcc命令)の分岐条件を指定する。
各命令フォーマット毎に例示されている命令コードは、16進数で表記した機械語を意味する。グループ指定フィールドgr1、gr2を持つ前置命令コード(00)を省略すると、既存の命令コードになるようになっている。
例えば、図9の(2)に例示されたH'0901を単独で使用する場合、ADD.W R0,R1となり、これに、図9の(3)に例示されるグループ指定フィールドを持つ前置命令コードH'0012を付加すると、H'00120901は、 ADD.W R8,R17となる。
また、暗黙的に使用されるグループ0を指定するH'0000はNOP(無操作)命令になる。 H'00xx(xxは01〜FF)は、グループフィールドを指定し、連続的に次の命令コードを実行する(割込みを禁止する)他は、NOP命令と同様に、PCのインクリメントを行い、最小のステート数で実行される。
レジスタ指定フィールド(gr)は、4ビットあるので、論理的には汎用レジスタグループを16に拡張することができる。この場合では32ビット汎用レジスタ128本(または16ビット汎用レジスタ256本)を利用できる。
レジスタ指定フィールド(gr)に対応するオペレーションフィールドは複数種類あってよい。例えば、単純にレジスタ指定のみを行うものと、そのほかの機能(データサイズなど)を切り換える機能とを合わせ持つオペレーションコードとを用意しもよい。
図10はCPU502における単一の汎用レジスタのデータ転送命令の機械語の命令コードを例示する図面でもある。それぞれのアドレッシングモードの実効アドレスの計算は図7及び図8に従い、機械語の命令フォーマットは図9に従っている。
図83には複数汎用レジスタの転送命令(MOVM)のような命令を示す前置命令コード(命令拡張用前置命令コード)が例示される。複数レジスタの転送命令は、命令拡張用前置命令コードと、既存の転送命令コードとを組合せて、複合命令化して実現される。
命令拡張用前置命令コードは以下の通りである。ビット2(最下位から3ビット目)が、レジスタのサイズを示し、B’0(B’はバイナリデータであることを意味する)がワードサイズ、B’1がロングワードサイズを意味する。ビット5、4が汎用レジスタ本数を示し、B’01が2本、B’10が3本、B’11が4本とする。この本命令コードは、下位CPUの命令セットに対して追加された新たな命令コードとされる。
この命令拡張用前置命令コードを用いたデータ転送命令は、単一の汎用レジスタとメモリのデータ転送命令(MOV)のようなワードサイズの命令コード(例えば、絶対アドレス16ビットのとき、2ワード)に、ロングワードサイズを示す命令コードが付加されて構成される(例えば、絶対アドレス16ビットのとき、合計3ワード)のと等価である。
図83によれば、サイズを切り替える情報を保持しているため、単一の汎用レジスタとメモリのデータ転送命令のロングワードサイズを示す命令コードに代えて、前記命令拡張用前置命令コードを付加すればよい。命令コード長を長くすることなく、複数汎用レジスタのデータ転送命令(MOVM)を実現できる。
なお、既存の、複数汎用レジスタのスタックへの待避命令である「STM ER0−3,@−SP」と、本発明の命令である「MOVM.L ER0−3,@−SP」とは概略同様の動作になるが、スタック上での汎用レジスタの配置順序が異なる。STM命令では、スタックの先頭(実効アドレス)からER3、ER2、ER1、ER0の順序でデータが配置されるのに対して、MOVM命令では、スタックの先頭からER0、ER1、ER2、ER3の順序でデータが配置される。上記双方の命令による処理は、後述するようにアドレス演算手法において大きく相違されている。
前記命令拡張用前置命令コードを採用する場合には前記スタックへの退避命令を持たなくても動作上支障はないが、ソフトウェア資産を有効に利用する観点に立つと、両方の命令コードを持つことが望ましい。
または、複数レジスタの転送命令における汎用レジスタのリード/ライトの順序を、番号の大きい方から使用するものとすれば、上記命令を同一の動作にすることもできる。更には、汎用レジスタのリード/ライトの順序を、内部I/Oレジスタなどで指定可能にしてもよい。
図84には上位CPU502の詳細な一例が示される。このCPU502は制御部CONTと実行部EXECから構成される。
制御部CONTは、命令レジスタIR1、命令レジスタIR2、命令デコーダDEC、レジスタセレクタRSEL、割込み制御部INTCを有する。下位CPUに対して、命令レジスタIR2が追加され、レジスタセレクタRSELの構成が相違されている。命令デコーダDECも命令レジスタIR2の追加や、レジスタセレクタRSELの構成の変更に対応して変更されている。特に、制御部CONTは、命令拡張用前置命令コードの有無に応じた第1の制御、レジスタ拡張用前置命令コードの有無に応じた第2の制御を行なうようになっている。
第1の制御は、命令で指定可能な複数の汎用レジスタの組み合わせを固定的にして、当該組み合わせが固定的な複数の汎用レジスタとアドレス空間上のメモリアドレス又は汎用レジスタとの間でデータ転送を可能にする制御を行う。上記転送命令の実効アドレスの計算は、演算器ALUで1回のみ行なうようにし、後続のアドレスについては、アドレスバッファABのインクリメントまたはデクリメント機能で対処させる。
第2の制御は、上位互換を考慮したレジスタ指定制御であり、一方では拡張された汎用レジスタをレジスタ拡張用前置命令コードを用いて指定するようにし、他方では、省略可能なレジスタ指定フィールドgr(gr1、gr2)が省略されたとき省略不可能なレジスタ指定フィールドr(r1、r2)によるレジスタ指定を暗黙的にレジスタグループ0に含まれるレジスタの指定とみなす制御を行なう。
前記命令デコーダDECは、例えば、マイクロROM或はPLA(Programmable Logic Array)または布線論理で構成される。
レジスタセレクタRSELには、前記命令デコーダDECの出力信号、命令レジスタIR1,IR2の出力信号、そして前記SYSC3に含まれる内部I/OレジスタCPUCRの出力信号ispgr,sspgrが供給される。
前記命令レジスタIR1は内部データバスIDBから命令が供給される。前記命令レジスタIR1の出力は、もう一つの命令レジスタIR2、前記命令デコーダDEC及び前記レジスタセレクタRSELに結合される。前記命令レジスタIR2の出力は前記レジスタセレクタRSELに結合される。
前記命令デコーダDECの出力はレジスタセレクタRSEL及び前記命令レジスタIR2に結合される。命令デコーダDECは命令レジスタIR1にフェッチされた命令のオペレーションフィールドのオペレーションコードを解読する。
命令レジスタIR1にフェッチされた命令コードがレジスタ拡張用前記前置命令コードであるとき、命令デコーダDECがこれを解読することによって、当該レジスタ拡張用前置命令コードのレジスタグループ指定フィールド(gr)のレジスタ指定情報を命令レジスタIR2にラッチさせる。その時のラッチ信号は命令デコーダDECから出力される。命令レジスタIR2にラッチされたレジスタフィールド指定情報、及び続けて命令レジスタIR1にフェッチされた後続の命令に含まれるレジスタフィールド(r)のレジスタ指定情報は、レジスタセレクタRSELで解読され、それら情報で直接的に指定されたレジスタグループの中のレジスタが選択され、選択されたレジスタを利用して当該後続の命令が実行される。この命令実行後、前記命令デコーダDECは前記命令レジスタIR2のラッチ情報を全ビット値“0”(レジスタグループ0の指定情報)にクリアするためのセット信号を命令レジスタIR2に供給する。したがって、その後に、前置命令コードを省いた命令が命令レジスタIR1にフェッチされても、命令レジスタIR2の出力はレジスタグループ0の指定情報を維持する結果、レジスタセレクタRSELは暗黙的にレジスタグループ0が指定されていると見做して、命令レジスタIR1からのレジスタ指定情報に従ったレジスタをレジスタグループ0から選択する。
実行部EXECには、更に、テンポラリレジスタTRA,TRD、算術論理演算器ALU、インクリメンタINC、リードデータバッファRDB、ライトデータバッファWDB、アドレスバッファABを含む。これらの回路ブロックはデータバスGB、DB、WBによって相互に接続されている。前記データバスGB、DBはレジスタER0〜ER31に対するデータリードバス、データバスWBはレジスタER0〜ER31に対するデータライトバスとして位置付けられる。尚、詳細な図示を省いているが、実行部EXECの各部は、汎用レジスタの分割E(16ビット)、H(8ビット)、L(8ビット)に呼応して分割されている。
前記算術論理演算器ALUは、命令によって指定される各種の演算や実効アドレスの計算など用いる。前記インクリメンタINCは、主に、プログラムカウンタPCの加算に用いられる。
リードデータバッファRDBは、前記ROM504、RAM505、内部I/Oレジスタ、或は図示を省略する外部メモリから、リードした命令コードやデータを一時的に格納する。ライトデータバッファWDBはROM504、RAM505、内部I/Oレジスタ、或は外部メモリへのライトデータを一時的に格納する。リードデータバッファRDB、ライトデータバッファWDBによってCPU502の内部動作と、CPU502の外部のリード/ライト動作のタイミングを調整している。
アドレスバッファABは、CPU502がリード/ライトするデータのアドレスを一時的に格納するほか、格納した内容に対するインクリメント機能と、インクリメント結果を保持する機能を有している。GBバス、DBバス、WBバスが32ビットであるのに対して、IDBが16ビットであるため、32ビットのデータを、2回の16ビットデータのアクセスとする場合に、2回めのデータアクセスに先立って、アドレスバッファABの内容をインクリメントする。
図85には前記レジスタセレクタRSELの一部と命令レジスタIR2との詳細なブロック図が示される。
前記命令レジスタIR2は、保持手段としてのラッチ回路LGR1,LGR2を有する。これらラッチ回路LGR1,LGR2は、前述の通りレジスタグループ指定フィールドgr1、gr2のレジスタグループ指定情報をラッチする。
図85に従えば、前記ラッチ回路LGR1,LGR2は、いわゆるリセット付きD型フリップフロップによって構成されている。リセット信号RSLGRとして、命令デコーダDECから指定される命令実行終了信号RSLGRを入力する。ラッチクロックとして、命令デコーダDECから指定されるラッチクロックLGRCLを入力し、また、データとして、命令レジスタIR1が保持する命令コードのビット7〜4、3〜0(グループ4の場合は、ビット5、4、1、0のみでもよい)を入力する。ラッチクロックLGRCLは、レジスタグループを指定する命令コード(省略可能なレジスタ拡張用前置命令コード)を実行したときに活性状態になって、そのときのレジスタフィールド(gr)である、ビット7〜4、3〜0をラッチさせる。ラッチ回路LGR1,LGR2は、命令の実行終了時点で、命令デコーダDECからの制御信号であるリセット信号RSLGRに基づいて、所定の値、例えば全ビット0に設定され、レジスタブロック0を指定する状態に初期化される。汎用レジスタグループを指定するレジスタ拡張用前置命令コードを持たない命令は、ラッチ回路LGR1,LGR2が値“0”にクリアされたままになっているから、命令実行が行われるとき、レジスタグループ0の汎用レジスタが指定されることになる。
レジスタセレクタRSELのデスティネーションレジスタ指定側には、ラッチ回路LGR2から出力されるレジスタグループ指定フィールド(gr2)の情報を保持するラッチ回路LAT1と、命令レジスタIR1から出力されるレジスタ指定フィールド(r2)の情報をラッチするラッチ回路LAT2が設けられている。それらラッチ回路LAT1,LAT2は、システムクロックφの反転クロックφ#でラッチ動作を行うようになっており、ソースレジスタの選択動作より遅くデスティネーションレジスタの選択動作が行なわれる。これによって、デスティネーション側のレジスタ指定情報のラッチタイミング即ちデスティネーションレジスタ選択タイミングがソースレジスタ選択タイミングよりも0.5ステート遅くなるようにされる。ソースレジスタはアドレスレジスタとして先行して選択され、デスティネーションレジスタはデータの書込みのために遅れて選択されることが可能になっている。
更に、命令レジスタIR1から出力されるレジスタ指定フィールドr1の情報と、ラッチ回路LAT2から出力されるレジスタ指定フィールドr2の情報とは、論理回路LOG1,LOG2に入力され、入力されたレジスタ指定フィールドr1、r2のビット0と1が、制御信号s1〜s3よって制御されて、論理回路LOG1,LOG2から出力され、組合せ固定的なレジスタ選択に用いられる。前記制御信号s1〜s3はデコーダDECから出力される。制御信号s1〜s3は複数汎用レジスタの転送命令の実効時に使用され、それ以外のときは全部0にされていて、LOG1,LOG2の入力r1,r2がそのまま出力とされる。
前記制御信号s1〜s3の機能は図86に例示されている。制御信号s1はレジスタ指定フィールドr1,r2の情報のビット0を1に固定する。同様に、制御信号s2はレジスタ指定フィールドr1,r2の情報のビット1を1に、ビット0を0に固定する。s3はレジスタ指定フィールドr1,r2の情報のビット1とビット0を共に1に固定する。汎用レジスタ2本を指定する場合は、制御信号s1が出力される。3本の場合は、s1、s2の順に出力され、4本の場合は、s1、s2、s3の順に出力される。これにより、複数本の汎用レジスタを対象とする転送命令において最初に一つのレジスタがレジスタ指定フィールドr1,r2で指定されれば、その後はそれに続くレジスタが上記制御信号s1〜s3により規定の順に選択される。これによって、組合せ固定的に順次汎用レジスタが選択される。上記制御信号s1〜s3の出力論理より明らかなように、複数の汎用レジスタの転送命令において3ビット又は4ビットのレジスタ指定領域r1,r2でレジスタを指定するとき、当該レジスタ指定領域r1,r2に設定可能な初期値は、その命令が転送対象とする汎用レジスタの本数によって異なり、2本の場合は***0、3本の場合は**00、4本の場合は**00でなければならない。記号*はどのような値を採ってもよい。これによって、レジスタセレクタSEL自体をそのほかの命令と共通化して、前記複数汎用レジスタ転送命令に対処できるので、論理的規模の増加を極力抑止できる。
図87には前記アドレスバッファABの一例が示される。アドレスバッファABは、ラッチ回路521、インクリメンタ522、セレクタ・バッファ523から構成される。前記ラッチ回路521は、内部バスGBとインクリメンタ522の出力を入力する。制御信号mabincが活性状態の場合に、インクリメンタ522の出力がラッチされ、非活性状態の場合に、バスGBの内容がラッチされる。
前記インクリメンタ522は、ラッチ回路521の出力を入力して、+2の加算を行なう。制御信号mabincが活性状態にされることによって、インクリメントされた値がラッチ回路21からインクリメンタ22に繰り返し帰還されることにより、複数回のインクリメント+4、+6、…が可能にされる。
セレクタ・バッファ523は、ラッチ回路521とインクリメンタ522の内容を入力する。制御信号mabincが活性状態の場合に、インクリメンタ522の出力が選択され、非活性状態の場合に、ラッチ回路521の出力が選択される。選択された内容は、バス権アクノレッジ信号に従って、内部アドレスバスIABに出力される。バス権アクノレッジが非活性の場合には、アドレスバッファABは、内部アドレスバスIABへの出力は行なわず、出力はハイインピーダンス状態にされる。
図88及び図89にはレジスタ・レジスタ間のワードサイズの転送命令(MOV及びMOVM命令)に対するデコーダDECの制御論理の一部が論理記述によって示される。図9の記述は図88の後に続く残りの論理記述である。図93は図88乃至89に記載の論理記述の制御によるレジスタ・レジスタ間の単一及び複数汎用レジスタの転送命令(MOV及びMOVM)による制御動作に対応されるフローチャートである。
図88及び図89に示された論理記述は、RTL(Register Transfer Level)若しくはHDL(Hardware Description Language)記述と呼ばれ、公知の論理合成ツールによって、論理回路に論理展開できる。HDLはIEEE1364として標準化されている。これに示される論理記述の構文は、ケース(case)文に準拠しており、always@の次の()内で定義された値若しくは信号に変化が有ったとき、それ以下の記述行の処理を行う、という内容になっている。「8’b00001000」は8ビット長の00001000を意味する。また、図において、小文字の信号は、命令デコーダDECで生成され、出力される信号とし、大文字の信号は命令デコーダDECに入力された信号とする。
図88の論理記述において転送命令が単一汎用レジスタを用いるか、複数汎用レジスタを用いるかは、信号MOD2〜MOD4によって指示される。信号MOD2は2本の汎用レジスタの指定を示し、信号MOD3は3本の汎用レジスタの指定を示し、信号MOD4信号は4本の汎用レジスタの指定を示す。それら信号MOD2〜MOD4は命令拡張用前置命令コードの内容によって生成される。
図88及び図89の論理記述ではステートコードTMG(5ビットの情報)にしたがって制御信号を生成するようになっており、現時点でのステートコードの値とその時のMOD2〜MOD4の値とに従って、次のステートコードNEXTTMGの値を決定するようになっている。
単一レジスタの転送命令ではステートコードTMGは1(0001)であり、これに対して、複数レジスタの転送命令固有のデータ転送制御のためにステートコードTMG5(00101)、9(01001)、13(01101)が加えられている。
複数レジスタの転送命令は、MOD2〜MOD4信号で示される。図88の論理記述の第1の部分(1)でステートコードTMGが生成される。単一レジスタの場合、ステートコードTMGは1である。複数レジスタの場合、例えば、MOD4=1ではTMGは1→5→9→13と進行する。MOD3=1では、ステートコード13が、MOD2=1では、ステートコード9及び13が、省略される。
なお、NEXTTMG[5]=0のとき、次のTMGはNEXTTMG[4:0]とされる。NEXTTMG[5]=1のとき、次のTMGは5’b00001とされる。
図89の論理記述の第2の部分(2)でバス制御を行なう。nop=0はバスアクセス開始、nop=1はバスアクセス禁止を指示する。data=0は命令リード、data=1はデータアクセスを指示する。
本転送命令の場合、ステートコードTMGが1で命令リードを行い、ステートコードTMGが5、9、13ではバスアクセスを行なわない。
命令リードの場合は所定のタイミングで内部データバスIDBの内容が命令レジスタIR1とリードデータバッファRDBに格納される。データリードの場合は所定のタイミングで内部データバスIDBの内容がリードデータバッファRDBに格納される。データライトの場合は所定のタイミングでライトデータバッファWDBの内容がIDBに出力される。
図89の論理記述の第3の部分(3)で、転送データを制御する。各ステートで、汎用レジスタから内部バスDBへ出力し、算術論理演算器ALUを経由して、内部バスWBから汎用レジスタへのライトを指示する。
いずれの場合も、汎用レジスタを指定した後、レジスタ指定フィールドr2の更新を行なう。信号s1が1のときは、レジスタフィールドr1のビット0を1に固定する。同様に、信号s2は、ビット1を1に、ビット0を0に固定する。信号s3はビット1、0を1に固定する。
ステートコードTMGの1では、単一レジスタの転送命令、即ち、MOD2〜MOD4が何れも0のとき、ccrset信号が1とされ、コンディションコードレジスタCCRの所定のビットが転送データを反映して変化するようにされる。
図90乃至図92に記載の論理記述は、16ビット絶対アドレスによる転送命令(MOV及びMOVM命令)に対するデコーダDECの制御論理の一部を示す。図91の記述は図90の後に続く残りの論理記述、図92の記述は図91の後に続く残りの論理記述である。図94は図90乃至図92に記載の論理記述の制御による16ビット絶対アドレスによる単一及び複数汎用レジスタの転送命令(MOV及びMOVM)による制御動作に対応されるフローチャートである。
図10の「(4)16ビット絶対アドレス」に示される通り、データサイズはIR[8](インストラクションレジスタIRの最下位から8ビット目)=0のときバイトサイズ、IR[8]=1のときワードサイズ、転送方向はIR[7]=0のときメモリ→汎用レジスタ(リード型)、IR[7]=1のとき汎用レジスタ→メモリ(ライト型)、の転送となる。
ワードサイズ/ロングワードサイズ、単一レジスタ/複数レジスタの選択は、信号LNG、信号MOD2〜MOD4によって指示される。信号LNGはロングワードサイズを示す。信号MOD2〜MOD4は、それぞれ2〜4本のレジスタ選択を示し、命令拡張用前置命令コードに従って生成される。
単一レジスタの転送命令のフロー(ステートコード1→2→3)に対して、複数レジスタの転送命令固有のデータ転送のステート(ステートコード6、10、14)と、単一/複数レジスタの転送命令のロングワードサイズ時のステート(ステートコード18、22、26、30)が加えられている。
図90に示される論理記述の第1の部分(1)でステートコードTMGが生成される。単一レジスタの場合、ステートコードTMGは1→2→3と進行する。複数レジスタの場合、例えば、MOD4=1ではTMGは1→2→6→10→14→3と進行する。MOD3=1では、ステートコード14が省略され、MOD2=1では、ステートコード10及び14が省略される。また、ロングワードサイズの場合は、ステートコード18、22、26、30が追加される。
図91の論理記述の第2の部分(2)ではバス制御を行なう。本転送命令の場合、ステートコード1、3で命令リードを行い、ステートコード2、18、6、22、10、26、14、30でデータアクセスを行なう。データアクセスのリード/ライトはIR[7]によって指示される。最後のデータアクセス以外では、long=1とし、バス権移譲禁止を指示する。
命令リードの場合は所定のタイミングで内部データバスIDBの内容がインストラクションレジスタIRとリードデータバッファRDBに格納される。データリードの場合は所定のタイミングで内部デーバスIDBの内容がリードデータバッファRDBに格納される。データライトの場合は所定のタイミングでライトデータバッファWDBの内容が内部データバスIDBに出力される。
図91に示される論理記述の第3の部分(3)で実効アドレスを計算する。本転送命令の場合、ステートコード2で、リードデータバッファRDBに保持している命令コードのEA拡張部16ビットを、信号dbrextによって32ビットに符号拡張した上、内部バスGBに出力する。内部バスGBの内容はアドレスバッファABに毎ステート格納されるようにされており、特に制御は必要ない。ステートコード18、6、22、10、26、14、30では、信号mabincによって、アドレスバッファABに保持した内容のインクリメント(+2)を行なう。
図92に示される論理記述の第4の部分(4)で、転送データを制御する。リード型(IR[7]=0)の場合は、ステートコード6、10、14、3で、リードデータをリードデータバッファRDBから内部バスGBへ出力し、算術論理演算器ALUと内部バスWBを経由して、汎用レジスタへ格納する。ライト型(IR[7]=1)の場合は、ステートコード2、6、10、14で汎用レジスタから内部バスDBへ出力し、ライトデータバッファWDBを経由して、内部データバスIDBに出力する。何れの場合も、汎用レジスタを指定した後、レジスタ指定フィールドr1の更新を行なう。信号s1が1のときは、レジスタフィールドr1のビット0を1に固定する。同様に、信号s2は、ビット1を1に、ビット0を0に固定する。信号s3はビット1、0を1に固定する。これらは、図93においてr2++と示されている。
ステートコード3では、単一レジスタの転送命令、即ち、信号MOD2〜MOD4が何れも0のとき、信号ccrsetが1とされ、コンディションコードレジスタCCRの所定のビットが転送データを反映して変化するようにされる。
そのほかのアドレッシングモードについても、上記同様に、所定の命令リードと実効アドレスの計算に加えて、ステートコード18、6、22、10、26、14、30に相当するデータアクセスの動作を加えればよい。これらは各種のアドレッシングモードに共通にすることができる。
図95にはレジスタ・レジスタ型の、第1の転送命令(MOV.L ER0,ER1)、第2の転送命令(MOV.L ER8,ER17)、及び複数レジスタの転送命令の第1の例(MOVM.W R0−R1,E28−E29)の実行タイミングが例示される。
レジスタ・レジスタ型の第1の転送命令(MOV.L ER0,ER1)は、グループ0の汎用レジスタのみを使用するので、汎用レジスグループを指定する命令コードを必要とせず、前記CPU2に対する下位CPUと同じ1ワードの命令とする。
図95では、特に制限はされないものの、内蔵ROM504、RAM505のリード/ライトを1ステートでリード/ライト可能とする場合のタイミングを示している。以下の説明において、φの立ち上がりに同期する1ステートをφ同期ステートと称し、φ#(クロック信号φの反転クロック信号であり図示を省略する)の立ち上がりに同期する1ステートをφ#同期ステートと称する。
サイクルT0のφ#同期ステートで、CPU502のアドレスバッファABからアドレスが内部アドレスバスIABに出力される。また、命令デコーダDECから、命令フェッチ(if)を示す、バスコマンドBCMDが出力される。
サイクルT1のφ同期ステートで、内部アドレスバスIABの内容が内部アドレスバスPABに出力され、バスコマンドBCMDに基づき、リードサイクルが開始され、内部データバスPDBにデータが出力される。サイクルT1のφ#同期ステートで内部データバスPDBのリードデータが内部データバスIDBに得られ、これをサイクルT2のφ同期ステートでインストラクションレジスタIR1にラッチする。以上の動作は以前の命令の実行の制御によって行われる(プリフェッチ)。ここで、内蔵ROM504、RAM505は、内部アドレスバスPAB及び内部データバスPDBに接続されていないが、前記内部バスPAB、PDB相当の動作をモジュール内で行い、本タイミング図には、このモジュール内の動作を示している。
直前の命令の実行が終了すると、最も早く命令の実行が開始される場合には、サイクルT2のφ同期ステートで命令コードが命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。命令の一部であるレジスタ指定フィードr1、r2の値や複数レジスタのレジスタ本数によって形成される信号s1〜s3を回路LOG1,LOG2が受けて、レジスタフィールドr1、r2の値を制御してそれを出力する。回路LOG1の出力を信号SEL1、回路LOG2の出力を信号SEL2と称する。
レジスタ間演算命令では、サイクルT2のφ#同期ステートで、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレス信号が出力される。このとき、ラッチ回路LGR1及びLGR2が何れも0にクリアされているので、前記信号SEL1、SEL2と命令デコーダDECの出力する制御信号B(Rs→DB)とに基づいて、レジスタセレクタRSELはレジスタ選択信号B(ER0→DB)を生成する。
サイクルT3から、次の次の命令(本例では、MOV.L ER8,ER17)がリードされる。サイクルT3のφ同期ステートで、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。信号SEL1、SEL2と制御信号C(WB→Rd)とに基づいて、レジスタセレクタRSELがレジスタ選択信号C(WB→ER1)を生成する。レジスタ選択信号Bがレジスタを選択して、ソース側のレジスタ(Rs)のデータを算術論理演算器ALUに入力する。算術論理演算器ALUの演算内容は、命令デコーダDECが制御信号Cによって指示する。加算、論理演算、シフトなどは1クロックで演算を行うことができる。例えば、上記命令では32ビットの加算が指示される(バスGB側の入力は0とされる)。
次の命令の命令デコーダDECへのロードが指示される。制御信号B(RSLGR)によって、ラッチ回路LGR1、LGR2のクリアが指示される。ラッチ回路LGR1はサイクルT3のφ同期ステートで、ラッチ回路LGR2はサイクルT3のφ#同期ステートでクリアされた結果が伝達される。
サイクルT3のφ#同期ステートで、算術論理演算器ALUの演算結果が、内部バスWBを経由して、レジスタ選択信号Cが選択したデスティネーション側のレジスタ(ER1)にライトされる。図示はされないが、制御信号Cによって、コンディションコードレジスタCCRの更新を行う。更に次の次の命令を命令レジスタIR1に取り込む。同時に、次の命の実行が開始され、例えば、プログラムカウンタPCの内容を読み出して、アドレスバッファABとインクリメンタINCに入力される。
グループ0同士のレジスタ間演算を実質的に1ステートで実行できる。
レジスタ・レジスタ型の第2の転送命令(MOV.L ER8,ER17)は、汎用レジスタグループを指定する命令コードを付加して2ワード命令とする。第2ワードは前記MOV.L R0,R1と同一である。すなわち、gr1=1であるため、同じr1=0に対して、レジスタ番号n=8、また、gr2=2であるため、同じr2=1に対して、レジスタ番号n=17と解釈される。
サイクルT2のφ#同期ステートで、CPU502のアドレスバッファABからアドレスがアドレスバスIABに出力される。
サイクルT3のφ同期ステートで、アドレスバスIABの内容がアドレスバスPABに出力され、リードサイクルが開始される。サイクルT3のφ#同期ステートでリードデータが内部データバスに得られ、これをサイクルT4のφ同期ステートで命令レジスタIR1にラッチする。これは、レジスタグループフィールドを持つ省略可能な命令ワード(前置命令コード)である。
引き続き、サイクルT4のφ#同期ステートで次のアドレス(+2された内容)がアドレスバスIABに出力され、このリードデータがサイクルT5のφ同期ステートで命令レジスタIR1にラッチされる。以上の動作は前記レジスタ・レジスタ型の第1の転送命令及び図示はされない次の命令の実行の制御によって行われている。
サイクルT4のφ同期ステートで命令コード(前置命令コード)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。グループフィールドラッチ信号LGRCLが発行されて、レジスタグループ指定フィールド(IR1のビット7〜0)がラッチ回路LGR1,LGR2にラッチされる。
サイクルT4のφ#同期ステートで、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレス信号が出力される。
サイクルT5から、更に次の命令(本例では、MOVM.W R0−R1,E28−E29)がリードされる。
サイクルT5のφ同期ステートで、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。第1ワードと第2ワード以降が分割されないための制御信号B(controlB)に含まれる連続命令信号continue(割込み禁止信号mskintと同じ)を割込み制御回路INTCに出力する。本信号によって、割込み要求などが発生していても、命令の実行を継続することができる。また、ラッチ回路LGR1、LGR2の内容が保持される。
一方、サイクルT4のφ同期ステートで命令コード(転送命令を指示)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。LGR1=1及びLGR2=2であるため、信号SEL1,SEL2と命令デコーダDECの出力する制御信号B(Rs−DB)とに基づいて、レジスタ選択信号B(ER8−DB)が生成される。信号SEL1、SEL2と制御信号C(WB−Rd)とに基づいて、レジスタ選択信号C(WB−ER17)が生成される。これ以外の第2ワードによる動作は第1の転送命令(MOV.L ER0,ER1)と同一にできる(第1の転送命令同様に、制御信号B(RSLGR)によって、LGR1、LGR2のクリアが指示される。ラッチ回路LGR1はサイクルT6のφ同期ステートで、ラッチ回路LGR2はサイクルT6のφ#同期ステートでクリアされた結果が伝達される)。
即ち、第1ワード(前置命令コード)に対応するラッチ回路LGR1,LGR2のラッチ信号、連続命令信号を出力する以外は、命令デコーダDECの内容を、既存の下位CPUの命令デコーダと同等にできる。命令デコーダDECの前置命令コードに対応する部分は、相対的に小さいことは言うまでもない。すなわち、論理的な規模の追加を最小限にできる。また、命令デコーダDECの大部分を既存の下位CPUの命令デコーダと同等にできるから、従来の設計資産を有効に利用することができる。
次に、複数レジスタのレジスタ・レジスタ間転送命令である「MOVM.W R0−R1,E28−E29」の例を示す。レジスタ指定フィールドr1は3’b000、r2は3’b100である。
本転送命令「MOVM.W R0−R1,E28−E29」は、汎用レジスタグループを指定するレジスタ拡張用前置命令コードと、MOVMを示す命令拡張用前置命令コード(プリフィックスコードとも称する)を付加して、3ワード命令とする。第3ワード(mov)はMOV.W R0,R4と同一である。gr2=3であるため、同じr1=4に対して、レジスタ番号n=28と解釈される。ワードサイズで、r2[3]=1であるため、汎用レジスタEが指定される。
サイクルT5のφ#同期ステートで、CPU502のアドレスバッファABからアドレスがアドレスバスIABに出力される。
サイクルT6のφ同期ステートで、アドレスバスIABの内容がアドレスバスPABに出力され、リードサイクルが開始される。サイクルT6のφ#同期ステートでリードデータが内部データバスに得られ、これをサイクルT7のφ同期ステートで命令レジスタIR1にラッチする。これは、レジスタグループフィールドを持つ省略可能な命令ワード(前置命令コード)である。
引き続き、サイクルT7のφ#同期ステートで次のアドレス(+2された内容)がアドレスバスIABに出力され、このリードデータがサイクルT8のφ同期ステートで命令レジスタIR1にラッチされる。以上の動作は前記レジスタ・レジスタ型の第2の転送命令及び図示はされない次の命令の実行の制御によって行われている。
サイクルT7のφ同期ステートで第1の命令コードが命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、グループフィールドラッチ信号LGRCLが発行されて、レジスタグループ指定フィールド(IR1のビット7〜0)がラッチ回路LGR1、LGR2にラッチされる。
サイクルT7のφ#同期ステートで、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスバスIABにアドレス信号が出力される。
サイクルT8から、次の次の命令がリードされる。サイクルT8のφで、インクリメンタINCでインクリメント(+2)された結果が、内部バスWBを経由してプログラムカウンタPCにライトされる。第1ワードと第2ワード以降が分割されないための制御信号Bで連続命令信号(割込み禁止信号)を割込み制御回路INTCに出力する。また、ラッチ回路LGR1,LGR2の内容が保持される。また、第2の命令コードが命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号MOD2が出力される。サイクルT8のφ#同期ステートで、プログラムカウンタPCの内容を内部バスGBに読み出して、アドレスバッファABとインクリメンタINCに入力する。アドレスバッファABからアドレスIABにアドレス信号が出力される。
一方、サイクルT9のφ同期ステートで命令コード(転送命令を指示)が命令デコーダDECに入力されて、命令の内容が解読される。解読結果に従って、制御信号を出力して、各部の制御を行う。LGR1=0及びLGR2=3であるため、信号SEL1、SEL2と命令デコーダDECの出力する制御信号B、C(Rs−DB、WB−Rd)とに基づいて、レジスタセレクタRSELでレジスタ選択信号B、C(R0−DB、WB−E28)が生成される。制御信号s1が生成されて、SEL1、SEL2の変更(3’b100→101)が指示される。
引き続き、MOD2信号に従って、信号SEL1、SEL2と命令デコーダDECの出力する制御信号B、C(Rs−DB、WB−Rd)とに基づいて、レジスタセレクタRSELがレジスタ選択信号B、C(R1−DB、WB−E29)を生成する。
図96には複数レジスタの転送命令の第2の例(MOVM.L @aa:16,ER0−ER1)の実行シーケンスが示される。
上記命令は、2本の汎用レジスタへデータをリードする例である。レジスタ指定フィールドは3’b000である。アドレッシングモードは、絶対アドレス16ビットであり、実効アドレスはaaを符号拡張した内容である。この符号拡張は、リードデータバッファRDBから読み出す際に行われるようにされる。以下では、aaを符号拡張した内容も、単にaaと記す。
サイクルT2から転送命令の実行が開始される。特に制限はされないものの、命令コードの第1ワードは、MOVMを示すプリフィックスコードであり、次の命令コードの動作を指定(MOD2信号出力)し、プログラムカウンタPCをインクリメントするほかの動作は行わない。
第2ワードの命令コード(mov−1)は、MOV.L @aa:16,ER0命令と共通である。
サイクルT4のφ#同期ステートでリードデータバッファRDBの内容がバスGBに出力されて、アドレスバッファABに格納される。アドレスバッファABの内容がアドレスバスIABに出力される。同時に、バスコマンドBCMDが出力され、ワードデータリードと次のバスサイクルでのバス権移譲禁止が示される。
サイクルT5のφ#同期ステートで、リードデータの上位16ビット(汎用レジスタEの内容)が内部データバスIDBに出力される。また、アドレスバッファABのインクリメント機能によって、アドレスバスIABの出力値をaa+2とする。同時に、バスコマンドBCMDが出力され、ワードデータリードと次のバスサイクルでのバス権移譲禁止が示される。
サイクルT6のφ同期ステートで、リードデータがリードデータバッファRDBに格納される。
サイクルT6のφ#同期ステートで、リードデータの下位16ビット(汎用レジスタRの内容)が内部データバスに出力される。また、アドレスバッファABのインクリメント機能によって、アドレスバスIABの出力値をaa+4とする。同時に、バスコマンドBCMDが出力され、ワードデータリードと次のバスサイクルでのバス権移譲禁止が示される。
サイクルT7のφ同期ステートで、リードデータの内容が、32ビットでバスGBを経由して算術論理演算器ALUに転送される。
サイクルT7のφ#同期ステートで、リードデータの上位16ビット(汎用レジスタEの内容)が内部データバスに出力される。また、アドレスバッファABのインクリメント機能によって、アドレスバスIABの出力値をaa+6とする。同時に、バスコマンドBCMDが出力され、ワードデータリードと次のバスサイクルでのバス権移譲許可が示される。
サイクルT8のφ#同期ステートで、リードデータの下位16ビット(汎用レジスタRの内容)が内部データバスに出力される。また、第2の制御信号Bによってレジスタ選択信号のビット0が反転される。第1の制御信号Aと信号SEL2(=3’b001)とによって、転送されるレジスタが選択され、レジスタ制御信号Bが生成される。
サイクルT8のφ#同期ステート以降で、前記同様に、次の次の命令の読み出しと、プログラムカウンタPCのインクリメント(+2)を行う。
レジスタ3本を指定した場合は、実行ステート数が2ステート長くなり、アドレスバッファABのインクリメント(+2)が更に2回行われる(合計+6)。また、信号SEL1、SEL2のビット1が反転され、レジスタ指定フィールドが000の場合、010とされ、汎用レジスタER2が選択される。ライト動作が2回(合計6回)行われる。
レジスタ4本を指定した場合は、更に、実行ステート数が2ステート長くなり、アドレスバッファABのインクリメント(+2)が更に2回行われる(合計+10)。また、信号SEL1、SEL2のビット1とビット0が反転され、レジスタ指定フィールドが000の場合、011とされ、汎用レジスタER2、ER3が選択される。ライト動作が2回(合計8回)行われる。
レジスタ番号の下位ビットが固定であるので、これを命令処理の実行に従って、変更する制御が容易である。加算器などを不要にして、論理的規模の増加を抑止できる。例えば、2本のレジスタを待避する場合、命令コード上のレジスタ指定フィールドの下位ビットは0であるので、1回めのレジスタ指定は、レジスタ指定フィールドの値に従い、2回のレジスタ指定は、命令デコーダDECの制御に従って、レジスタ指定フィールドの下位1ビットを1に変更して、行うようにする。
一方、MOV命令はレジスタ1本のリードであり、前記の2回目のリード動作を行わないようにされ、実行動作の共通化を図っている。
図97には複数レジスタの転送命令の第3の例(MOVM.W R10−R11,@ER6)の実行シーケンスが示される。上記命令は、2本のワードサイズの汎用レジスタをライトする例である。レジスタ指定フィールドは3’b010である。
サイクルT2から転送命令の実行が開始される。特に制限はされないものの、命令コードの第1ワードはレジスタグループフィールドを持つプリフィックスコードであり、レジスタグループ指定フィールド(IR1のビット7〜0)がラッチ回路LGR1、LGR2にラッチされ、プログラムカウンタPCをインクリメントする。
第2ワードの命令コードは、MOVMを示すプリフィックスコードであり、次の命令コードの動作を指定する。制御信号MOD2が出力される。第3ワードの命令コードは、MOV.W R2,@ER6命令と共通にされる。
サイクルT4のφ#同期ステートでレジスタER6の内容がバスGBに出力され、アドレスバッファABに格納される。アドレスバッファABの内容がアドレスバスIABに出力される。同時に、バスコマンドBCMDが出力され、ワードデータライトと次のバスサイクルでのバス権移譲禁止が示される。
また、第1の制御信号Bとラッチ回路LGR2のラッチ情報(=3’b001)と信号SEL2(=3’b010)とによって、転送されるレジスタが選択され、レジスタ制御信号Bが生成される。制御信号s1が生成されて、信号SEL2の変更(3’b010→011)が指示される。
ステートサイクルT5のφ同期ステートで、選択されたレジスタ(R10の内容)がバスDB経由で、ライトデータバッファWDBに転送される。
T5のφ#同期ステートで、転送されたデータ(R10の内容)が内部データバスIDBに出力される。また、アドレスバッファABのインクリメント機能によって、アドレスバスIABの出力値をEA+2とする。また、第1の制御信号Bとラッチ回路LGR2のラッチ情報(=3’b001)と信号SEL2(=3’b011)とによって、転送されるレジスタが選択され、レジスタ制御信号Bが生成される。
サイクルT6のφ同期ステートで、選択されたレジスタR11の内容がバスDB経由で、ライトデータバッファWDBに転送される。
サイクルT6のφ#同期ステートで、転送されたデータ(R11の内容)が内部データバスIDBに出力される。
サイクルT6のφ#同期ステート以降で、前記同様に、次の次の命令の読み出しと、プログラムカウンタPCのインクリメント(+2)を行う。
レジスタ3本を指定した場合は、実行ステート数が1ステート長くなり、アドレスバッファABのインクリメント(+2)が更に1回行われる(合計+4)。また、信号SEL1、SEL2のビット1が反転され、レジスタ指定フィールドが000の場合、010とされる。ライト動作が1回(合計3回)行われる。
レジスタ4本を指定した場合は、更に、実行ステート数が1ステート長くなり、アドレスバッファABのインクリメント(+2)が更に1回行われる(合計+6)。また、SEL1、SEL2のビット1とビット0が反転され、レジスタ指定フィールドが000の場合、011とされる。ライト動作が1回(合計4回)行われる。
図98には前記CPU502の開発環境の概略が示される。これは、既存の下位CPUと、これに対する上位互換の前記CPU502とで、共通の開発環境を提供できるようにするものである。
使用者は、各種エディタなどを用いて、C言語乃至アセンブリ言語でプログラムを作成する。これは通常、複数のモジュールに分割して作成される。
Cコンパイラ540は、使用者の作成したそれぞれのC言語ソースプログラムを入力し、アセンブリ言語ソースプログラム乃至オブジェクトモジュールを出力する。アセンブラ541は、アセンブリ言語ソースプログラムを入力し、オブジェクトモジュールを出力する。リンケージエディタ542は、上記Cコンパイラ540やアセンブラ541の生成した、複数のオブジェクトモジュールを入力して、各モジュールの外部参照や相対アドレスなどの解決を行い、1つのプログラムに結合して、ロードモジュールを出力する。
ロードモジュールは、シミュレータデバッガ543に入力して、パーソナルコンピュータなどのシステム開発装置上で、CPUの動作をシミュレーションし、実行結果を表示し、プログラムの解析や評価を行なうことができる。また、ロードモジュールをエミュレータ544に入力して、実際の応用システム上などで動作する、いわゆるインサーキットエミュレーションを行ない、マイクロコンピュータ全体としての、実動作の解析や評価を行なうことができる。更には、ロードモジュールをPROMライタ545に入力して、マイクロコンピュータ1のROM504が、フラッシュメモリのような電気的に書込み可能なメモリである場合に、かかるメモリに書込みを行なうことができる。このほかに、ライブラリアンとして、汎用的なサブルーチンなどを提供することもできる。
図43は前記CPU502のシステム開発装置におけるCPU選択方法を例示する図面でもある。図43に基づいて説明した内容はCPU502のシステム開発装置のもそのまま当てはまる。CPUの選択方法としては、ウィンドウのドロップダウンメニューで選択可能にしてもよいし、ワークステーションなどであれば、Cシェルコマンドとして入力することもできる。更に、アセンブラやCコンパイラなどの、ソースプログラムの制御命令として、CPUの種類及び動作モードを入力することができる。
アセンブラは、選択されたCPUの種類及び動作モードに従って、入力されたアセンブリ言語ソースプログラム上の記述を解釈し、オブジェクトモジュールを生成したり、エラーがあればそれを表示したりする。既存の下位CPUを選択し、前記上位CPU502に存在して、既存CPUに存在しない命令(前記拡張命令)を記述するとエラーになる。命令コード自体はCPU502が包含しているから、このためのアセンブラ541を開発し、既存の下位CPUについては、上位CPU502に存在して、既存の下位CPUに存在しない命令を検出するような追加を行なうなどして、容易に共通化できる。既存の下位CPUについては、アセンブラが存在しているはずであるから、これを容易に改造して、前記上位CPU2に適用できることは言うまでもない。
Cコンパイラは、選択されたCPUの種類及び動作モードに従って、使用可能な、オペレーション、データサイズ、アドレッシングモードの組合せで示される命令や、汎用レジスタ、アドレス空間を判別して、C言語によるプログラムを、CPUの命令に変換し、アセンブリ言語プログラムやオブジェクトモジュールとして出力する。
Cコンパイラ自体には、C言語によるプログラムを、CPUの命令に変換する機能の他、C++言語によるプログラムのコンパイルや、モジュール間最適化などといった、CPUの命令セットとは直接関係のない機能の向上が図られているが、CPU毎の個別のコンパイラでは、これらの機能向上を全ての個別のコンパイラに適用しなければならない。本発明のように、共通のCコンパイラ540としておけば、前記、CPUの命令セットとは直接関係のない機能向上を図ることが容易になり、また、開発効率などを向上することができる。
シミュレータデバッガは、入力されたロードモジュールのプログラムを解釈して、CPUの動作をシミュレーションし、その中で、エラーがあればそれを表示したりする。例えば、既存の下位CPUを選択し、本発明のCPU502に存在して、既存CPUに存在しない命令を実行しようとするとエラーになる。命令コード及び命令実行機能自体は本発明のCPU502が包含しているから、このためのシミュレータデバッガ543を開発し、既存の下位CPUについては、本発明のCPU502に存在して、既存のCPUに存在しない命令を検出するような追加を行なうなどして、容易に共通化できる。既存のCPUについて、シミュレータデバッガが存在していれば、これを容易に改造して、本発明のCPU502に適用できることは言うまでもない。
図45は本発明に係るCPU502を有するマイクロコンピュータのためのエミュレータを示す図面でもある。図45において、エミュレーション用プロセッサ410は、マイクロコンピュータ部分にエミュレーション用インタフェースを加えて構成される。前記マイクロコンピュータ部分は、例えば図79のマイクロコンピュータ501の構成に相当される。例えば、システム開発装置427から入力されたプログラム(ロードモジュール)をエミュレーションメモリ421のユーザプログラム格納領域に転送し、内蔵ROM504上に配置されるべきかかるプログラムをCPU502がリードすると、エミュレーションメモリ421上のプログラムがリードされ、実行される。また、ブレーク条件や、リアルタイムトレース条件などもシステム開発装置427から与えることができる。
コントロールプロセッサ425は、応用システム412で本来使用するCPUの種類の選択を行うためのプログラムを、エミュレーションメモリ421のエミュレーションプログラム格納領域に格納する。CPU502は、かかるプログラムを、所定の条件でブレークした状態で、実行し、エミュレーション用の制御レジスタの設定を行なうことで、エミュレーション上の必要な設定を行なう。この場合は、エミュレーション用プログラムの実行モード、いわゆるブレークモードでのみライト可能にすると都合がよい。開発途上にあるユーザのソフトウェアの誤動作によって、誤った設定を行なってしまうことを抑止できる。また、制御レジスタを用いることによって、応用システム412で本来使用するCPUの種類の選択対象が増えたりしても、制御レジスタの構成のみを変更すればよく、エミュレーション用インタフェースを変更する必要がなく、エミュレータのハードウェアを変更しなくてよい。
図99には前記マイクロコンピュータ501に対応されるエミュレーション用プロセッサのブロック図が示される。エミュレーション用プロセッサ50は、図79のマイクロコンピュータ501の部分(マイクロコンピュータコア571)と、エミュレーションインタフェース572から構成される。なお、図79のタイマや入出力ポートなどは、I/Oとして代表させ、また、内部バスの詳細とバスコントローラを図示している。なお、図79のタイマ506、パルス出力回路507、及び入出力ポートIOP1〜IOP5,IOPA〜IOPFなどは、I/O573、ユーザバッファ(ユーザBUF)574として代表させている。ユーザインタフェース576は前記I/O573、ユーザバッファ574、及び図示を省略する入出力バッファなどを含む、ユーザシステム(エミュレーション対象システムであるターゲットシステム)に接続されるインタフェース回路を総称する。
マイクロコンピュータコア571は、図79のマイクロコンピュータ501に対して未定義命令検出回路578が追加されている。エミュレーションインタフェース572は、制御レジスタ579を含む。制御レジスタ579は、ブレークモードでのみライト可能とされる。エミュレーションインタフェース572から入出力される信号は、アドレスバス、データバス、リード信号、ライト信号、データサイズ信号、命令フェッチ信号などバスの状態を表示するバスステータス信号、命令の実行開始を示す信号、割込み処理の実行開始を示す信号などのCPU502の実行状態を示すCPUステータス信号、などを含み、エミュレータによる、マイクロコンピュータの動作解析に使用される。
未定義命令検出回路578は、CPU502に入力される命令コードを解析し、選択されているCPUの機能に存在しない命令が実行を開始したことを検出すると、CPU502にブレーク割込みを要求する。CPU502に何れの機能が選択されるかは、制御レジスタ579から指示される。例えば、既存の下位CPUの機能が選択されている場合には、レジスタグループフィールドを持つ前置命令コードを実行すると、未定義命令として検出される。具体的には、命令コードを前記LIR信号でラッチして、解析し、未定義と解読された場合、前記LID信号が発生した時点で、ブレーク割込みを要求するようにすればよく、容易である。
エミュレーション用プロセッサ550は、前述の通り、上位CPU502を内蔵し、これを用いて、その他の下位CPUの代行をさせることができる。どれを選択するかはレジスタ579で指定すればよい。
いずれにせよ、エミュレーション用インタフェースを共通化しておけば、CPU乃至そのほかの機能ブロックが変更になった場合にも、エミュレータ側のハードウェアの変更をする必要がなく、エミュレーション用プロセッサ550のみを変更して、命令の動作を解析して表示する際の逆アセンブラに、いずれのCPUを対象にするかを指示すればよい。逆アセンブラに対する指示は、使用者がシステム開発装置から指定することもできるし、アセンブラからの入力情報によって、自動的に選択されるようなものであってもよい。これによってエミュレータの開発効率を向上し、エミュレータの開発環境を早く提供することができる。
図100には本発明の適用されたマイクロコンピュータ501をプリンタ制御に用いたマイクロコンピュータシステムが例示される。
プリンタ制御システムは、マイクロコンピュータ501と、セントロニクスインタフェース(またはIEEE1284)やユニバーサルシリアルバス又はオプションなどの送受信回路(受信回路または送受信回路)580と、バッファRAM(DRAM)581と、キャラクタジェネレートROM(CGROM)582と、プログラムROM583と、印字制御回路584とを含み、これらがマイクロコンピュータの外部バス585を介して接続される。
外部バス585に接続されるアドレス空間は所定の大きさのエリアに分割されており、それぞれにバス仕様(バス幅、アクセスステート数、アドレスマルチプレクス、バースト動作など)を設定可能になっている。エリア毎のそのようなバス制御は、マイクロコンピュータ501に含まれる前記バスコントローラ510の外部バスコントローラが行なう。
プログラムROM583はエリア0に、バッファRAM581はエリア2に、CGROM582はエリア6に、送受信回路580及び印字制御回路584はエリア7に接続される。バッファRAM581はリード/ライト可能なメモリであり、ダイナミック型メモリ故にリフレッシュ動作が必要であるが、安価であることが知られている。バッファRAM581についてはアドレス配置が記載されている。バッファRAM581は2MB(16Mビット)の記憶容量を有し、1MバイトをCPU502の作業領域に、残りを512kBずつのリングバッファとされる。
また、本システムは、更に、ラインフィードモータ590、キャリッジリターンモータ591を含み、これらのモータ590、591は、それぞれタイマ506の出力、パルス出力装置507の出力がバッファ回路92を介して与えられることによって制御される。ラインフィードモータ590、キャリッジリターンモータ591は、特に制限はされないものの、ステッピングモータである。
マイクロコンピュータ501に内蔵されているDMAC511は、印字データの出力、ラインフィードモータ590、キャリッジリターンモータ591を駆動するパルス出力を行う。また、DMAC511はSCI508の送信データ、受信データの転送制御を行なう。
図示はされないものの、SCI508はホストなどとの通信に使用し、A/D変換器509は紙枚数などのセンサ情報を入力する。
EXDMAC512はセントロニクスインタフェースやユニバーサルシリアルバスなどの複数の送受信回路580によるデータの受信を、CPU502の動作と並行して行う。EXDREQ入力に転送要求信号を入力し、転送時には、EXDACK出力によって、シングルアドレス転送を行うことができる。例えば、セントロニクスインタフェースのインプットストローブ信号をEXDREQ0に入力し、チャネル0でデュアルアドレス転送を行い、オプションインタフェースの受信信号をEXDREQ1に入力し、EXDACK1出力を、オプションインタフェースに与えて、チャネル1でシングルアドレス転送を行う。
EXDAMC512は、デスティネーションまたはソースの一方を、アドレス空間上のメモリや内部I/Oレジスタではなく、EXDMAC512のデータレジスタとすることができる。この選択は、EXDMAC512の制御レジスタの所定の制御ビットで行なうようにする。
実質的なデータ転送に先立って、パケットコマンドなどの転送情報を、EXDMAC512のデータレジスタに転送する。CPU502は、この情報を解析し、例えば、前回のデータ転送と連続して受信すればよい場合には、デスティネーションをメモリとするように設定して、転送カウントレジスタを設定して、起動をかければよい。
かかる情報の解析に当たっては、例えば、転送情報が16バイトである場合、「MOVM.L @EXD0DR0,ER0−3」を実行して、汎用レジスタに転送情報を格納して、解析を行なうことができる。なお、EXD0DR0は、EXDMAC512のチャネル0のデータレジスタの先頭アドレスを示すラベルである。前記MOVM命令では、絶対アドレスのアドレッシングモードを用いて、固有のアドレスを容易にアクセスできる。また、EXDMAC512のデータレジスタを使用せず、バッファRAM581上に転送情報が格納されている場合には、「MOV.L @EXDAR0,ER4、MOVM.L @−ER4,ER0−3」とすればよい。EXDAR0は、チャネル0のデスティネーションアドレスレジスタのラベルである。デスティネーションアドレスレジスタは次のデータ転送のデスティネーションとなるアドレスを示している。この内容を汎用レジスタER4に格納し、プリデクリメントレジスタ間接のアドレッシングモードを用いている。間接的にアドレスを扱うことにより、メモリ上の固定されていないアドレスも容易にアクセスできる。
また、バッファRAM581のリードを連続して行なうから、バッファRAM581の高速ページモードなどを有効に利用して、高速化を図ることができる。
転送情報の汎用レジスタへの格納を高速に行い、汎用レジスタ上で解析を行なうことによって、転送情報の受信から、転送情報に基づく処理の開始までの時間を短縮できる。ひいてはシステムの高速化に寄与できる。
上記システムにおいては、ホスト側からプリンタのステータスをリードするような場合は、チャネル2のEXD2DRにCPU502がステータスを随時書込んでおくようにし、EXDREQ2入力に従って、送受信回路580へ出力し、送受信回路580からホストへ転送するようにすることができる。この場合も、設定すべきデータが多ければ、MOVM命令を用いて、EXD2DRの設定を行なうことができる。
例えば、CPU502は、転送情報待ちを示すステータスをEXD2DR0〜7に設定しておく。ホストから、パケットコマンドの転送情報を受信すると、ビジーステータスをEXD2DR0〜7に設定し、転送情報の解析が終了し、EXDMAC512の設定が完了すると、データ受信待ちを示すステータスをEXD2DR0〜7に設定するようにする。ホストは、随時、ステータスを確認しつつ、転送情報やデータを送信するようにすればよい。
バッファRAM581上の印刷データを操作することもできる。各種のアドレッシングモードの複数レジスタ転送命令(MOVM)を用いて、高速化することができる。複数レジスタ転送命令で、バス権移譲を禁止することによって、そのほかのバスマスタであるDMAC511やEXDMAC512のデータ転送との競合による不所望のデータ変化を抑止できる。
なお、半導体集積回路の集積度の向上によって、オプション以外の受信回路の一部や、印字制御回路584などを1個の半導体集積回路に集積することができる。更に、バッファRAM581などの汎用的なメモリも1個の半導体集積回路に集積することができる。プログラムROM583やCGROM582などのように個別のプリンタの機種など、マイクロコンピュータシステム毎に変更になるものは、個別の半導体集積回路にする方が都合よい。
以上説明した図79のマイクロコンピュータ及びデータ処理システムによれば以下の作用効果を得ることができる。
〔1〕単一の命令で、複数の汎用レジスタとメモリ間、又は複数の汎用レジスタ相互間で転送を行なうことによって、相対的に、命令コードのリード回数を低減して、高速化することができる。また、データのリード/ライトを連続して行なうことによって、外部メモリに対するバースト動作などを有効に利用できる。複数のバスマスタが、データを処理する場合に、データアクセス時にバス権を移譲することを禁止して、不所望のデータの競合を回避することができる。
上記転送命令の実効アドレスの計算は、1回のみ行なうようにし、アドレスバッファABにインクリメント(またはデクリメント)機能とインクリメント(またはデクリメント)結果を保持する機能を備えることによって、命令動作を単純にし、転送命令の為の多くの制御を既存の転送命令と共通化を図ることができ、命令デコーダDECの論理的な規模の増加を最小限にすることができる。実効アドレスの計算の回数を低減して、高速化を図ることができる。また、種々のアドレッシングモードを共通に利用することができ、論理的規模の増加を最小限にすることができる。
複数レジスタ転送命令においてレジスタの本数の異なる命令を複数命令サポートすることによって、また、ワードサイズとロングワードサイズなど、データサイズの異なる命令を複数命令サポートすることによって、プログラムの作成を容易にし、マイクロコンピュータの使い勝手を向上することができる。
汎用レジスタのみをCPUが直接処理可能なアーキテクチャにあっては、汎用レジスタとメモリとの転送を高速化して、処理速度を大きく向上することできる。
複数の汎用レジスタの組み合わせを固定的にした、複数の汎用レジスタと、アドレス空間上のアドレス(メモリ)との間の転送命令を備えることによって、汎用レジスタのビット長より大きいデータであっても、容易に扱うことができ、マイクロコンピュータの使い勝手を向上するとともに、データのリード/ライトに対して、命令のリードの頻度を低減して、データ処理の高速化を図ることができる。
複数レジスタの転送を指示する命令コードと、既存の単一の汎用レジスタの転送命令の命令コードを組合せて、複数の汎用レジスタの転送命令を実現することにより、既存のCPUであっても、命令の追加を容易にすることができる。
〔2〕汎用レジスタが分割可能で、かつ分割した部分に機能上の相違がある場合などには、汎用レジスタ全体を使用する転送命令と、分割された一部分を使用する転送命令とを備えることにより、使用し易い汎用レジスタとの転送ができるから、その処理を容易にし、高速化することができる。
オブジェクトレベルで互換性を保ちつつ、アドレス空間の広いCPUとアドレス空間の小さいCPU、または、汎用レジスタのビット長の長いCPUと、汎用レジスタのビット長の短いCPUが存在する場合には、後者のCPUにも無駄なく利用可能な転送命令を提供できる。
〔3〕前置命令コードで、レジスタグループを指定し、この前置命令コードを省略可能とし、更には前置命令コードを付加しない場合の命令コードを既存のCPUの命令コードと同一とすることにより、互換性を損なわずに、汎用レジスタを増加させることができる。
暗黙的に指定可能な汎用レジスタ(既存の汎用レジスタ)をのみを使用していれば、省略可能のワードを省略できるから、命令コードを増加させることがない(少なくとも従来同等の汎用レジスタを使用する場合は、従来同等の命令コードでよい)。命令コードを増加させないことよって、処理速度を低下させることがない。
前記省略可能なワードを付加することによって、命令によって直接汎用レジスタの全てを選択できるから、プログラムの容易性を損う部分が少ない。また、任意の量の汎用レジスタの一部を、所望のタスク毎や所望の割込み処理などに確保しておく(他のタスクや処理では使用しない)ことによって、前記タスクや割込み処理において汎用レジスタを待避したりする必要がなく、高速化が図られる。また、前記タスクや割込み処理に確保する汎用レジスタ数は任意にできるから、タスクや処理の間で、使用する汎用レジスタを相互に融通し合うことも容易である。
前記ワードを付加することによって、指定できる汎用レジスタのアクセスは、RAMなどのメモリのアクセスより、一般に高速にできるから、汎用レジスタ数を増加するとともに、複数の汎用レジスタの転送命令によって、複数の汎用レジスタとメモリとの転送を高速に実行可能にすることにより、CPUの処理速度を向上できる。また、いわゆるロードストア型の命令セットを持ち、メモリの内容に対して直接演算できないようなプロセッサについては、直接処理できるデータ量を増加でき、また、メモリのアクセスを高速化することができ、処理速度を向上することができる。
複数レジスタ転送命令で指定できる汎用レジスタを増加する場合には容易に対処できる。
〔4〕オブジェクトレベルで互換性を保ちつつ、アドレス空間の広いCPUとアドレス空間の小さいCPUが存在する場合には、アドレス空間の広いCPUにおいて、アドレス空間に対応するサイズ(例えば32ビット、MOVM.L命令)の汎用レジスタに対する上記転送命令と、アドレス空間の小さいCPUのアドレス空間に対応するサイズ(例えば16ビット、MOVM.W命令)の汎用レジスタに対する上記転送命令とを備えることによって、後者のサイズの上記転送命令を、下位互換性をもつ、アドレス空間の小さいCPUでも容易に実現可能にできる。換言すれば、同一の方法で、オブジェクトレベルで互換性を保ちつつ、アドレス空間の広いCPUとアドレス空間の小さいCPUでも複数汎用レジスタの転送命令を実現可能にできる。
ソースプログラムレベルまたはオブジェクトプログラムレベルで、既存のCPUの命令セットを包含した上で、上記命令を追加することによって、ソフトウェア資産を有効に利用することができ、使用者のソフトウェア開発効率を向上することができる。ソースプログラムレベルまたはオブジェクトプログラムレベルで互換性を保つことによる利点と前記転送命令を追加することの利点の双方を享受することができる。
〔5〕既存のCPUと、ソフトウェア開発装置を共通に利用可能にし、CPUを選択する手段を設けることによって、使用者の不所望の費用を抑止できる。また、Cコンパイラなどは共通に機能向上などを行うことが可能であるから、ソフトウェア開発装置の開発効率を向上することができる。開発効率を向上することによって、開発に必要な資源を削減し、削減した資源を以って、機能向上に振り当てることも可能になる。
既存のCPUと、エミュレーション用インタフェースを共通化し、ひいては、同じエミュレータのハードウェアを共有できる。エミュレーション用インタフェースを共通化したり、エミュレータのハードウェアを共通化することによって、開発環境を早く整えることができ、また、エミュレータの開発に必要な資源を最小限にすることができる。
前記検討課題Eの解決手段に関する発明の実施の形態は一例であり、その要旨を逸しない範囲において種々変更可能である。
例えば、CPUの命令セットやレジスタ構成、アドレス空間は変更可能である。CPUのアーキテクチャもロードストアアーキテクチャに限定されない。但し、アドレス空間上の大部分より、高速に利用できるレジスタ手段を持っていることが望ましい。また、複数レジスタの転送命令の詳細な仕様についても種々変更可能である。データサイズとしては、バイトサイズを持ってもよい。CPUの論理的な構成、複数レジスタの転送命令の論理的な実現方法についても種々変更可能である。アドレスバッファはインクリメントではなく、デクリメント機能を持つようにし、アドレスの大きい方からアクセスするようにしてもよい。さらに、内部バス幅や内部バス構成なども変更可能である。さらにまた、互換性を維持すべきCPUは、アドレス空間や汎用レジスタの本数が異なるほか、命令の種類とアドレッシングモード及びデータのサイズで定義されるような命令セットが異なるようなものであってもよい。
マイクロコンピュータのその他の機能ブロックについても何等制約されない。データ処理システムである応用分野もプリンタに限定されない。前記EXDMACなどは好適な例として示されているもので、種々変更可能であることは言うまでもない。
以上の説明では主として本発明者によってなされた発明をその背景となった利用分野であるシングルチップマイクロコンピュータに適用した場合について説明したが、それに限定されるものではなく、CPU及びDRAM等を搭載したシステムLSI、システム・オン・チップ化されたVLSI等のデータ処理装置に広く適用可能である。本発明は少なくとも、命令を解読して処理し、演算処理を行なうデータ処理装置に適用することができる。
《検討課題Aに関する発明の効果》
検討課題Aに関する発明の効果は以下の通りである。すなわち、汎用レジスタを指定するレジスタ指定フィールドを、2つの部分に分割し、この2つの部分を命令コードの基本単位上の別のワードに配置するとともに、一方のワードを省略可能とし、省略可能なワードを省略すると、暗黙的な指定が行われるようにする。また、省略可能なワードには、レジスタ指定フィールドの一部のみを持つようにし、演算の種類などは指定しないようにする。したがって、暗黙的に指定可能な汎用レジスタのみを使用していれば、省略可能のワードを省略できるから、命令コードを増加させることがなく、命令コードを増加させないことよって、処理速度を低下させることがない。
前記省略可能なワードを付加することによって、命令によって直接汎用レジスタの全てを選択できるから、プロラムの容易性を損うことがない。また、任意の量の汎用レジスタの一部を、所望のタスク毎や所望の割込み処理などに確保しておく(他のタスクや処理では使用しない)ことによって、前記タスクや割込み処理において汎用レジスタを待避したりする必要がなく、高速化が図れる。更に、前記タスクや割込み処理に確保する汎用レジスタ数は任意にできるから、タスクや処理の間で、使用する汎用レジスタを相互に融通し合うことも容易になる。
前記ワードを付加することによって、指定できる汎用レジスタのアクセスは、RAM等のメモリのアクセスより、一般に高速にできるから、汎用レジスタ数を増加することにより、高速に処理できるデータ量を増加させ、ひいてはCPUの処理速度を向上できる。また、いわゆるロードストア型の命令セットを持ち、メモリの内容に対して直接演算できないようなプロセッサについては、汎用レジスタを増加することにより、直接処理できるデータ量を増加でき、また、メモリのアクセス頻度を低減することができ、処理速度を向上することができる。
《検討課題Bに関する発明の効果》
検討課題Bに関する発明の効果は以下の通りである。すなわち、既存の、メモリ・レジスタ間の転送命令コードの単数または複数、そしてレジスタ・レジスタ間の演算命令コードの内、複数の命令コードを組合せ、これに前置命令コードを前置結合する。前記前置命令コードに結合されたメモリ・レジスタ間転送命令のコードを実行する場合は、汎用レジスタではなく、CPU内の、テンポラリレジスタの様な、プログラム上解放されていない(換言すれば命令コードには明示されていない)ラッチ手段とメモリとの間でデータ転送を行なう。更に、前記前置命令コードに結合されたレジスタ・レジスタ間の演算命令のコードを引き続き実行する場合は、演算対象の内の単数または複数のデータを前記ラッチ手段から読み出すようにする。その演算結果をメモリに格納する場合には、前記転送命令のコードを実行したときに使用したメモリのアドレスを、別のラッチ手段に格納し、上記演算命令の演算結果を前記ラッチ手段に格納するとともに、メモリ・レジスタ間の転送命令のコードを自ら生成し(即ち、プログラムに明示されていなくても生成し)、前記アドレスを格納したラッチ手段の内容をアドレスとして、前記演算結果を格納したラッチ手段の内容をデータとして、メモリへの書込みを行なう。
このとき、データ処理装置にとって、メモリ・レジスタ間の転送命令、レジスタ・レジスタ間の演算命令の命令コードは既存のものであるから、それら命令コード単独の実行では従来同様に動作し、既存の命令実行を阻害しない。したがって、既存の命令のみを使用している既存のソフトウェア資産を有効に利用できる。データ処理装置は、ソフトウェア資産に関する上位互換を維持して、機能向上を実現できる。
また、既存の汎用レジスタ或いはロード・ストア・アーキテクチャのメリットを保持し、前記前置命令コードは、アドレッシングモードや演算の内容によらず共通に使用できるから、追加する命令コードを最低限にすることができる。
メモリからラッチ手段へのデータ読み込み、演算、ラッチ手段の内容に基づくメモリへのライト動作の指示は、既存の命令に対して、使用するレジスタが相違なるのみであるから、既存の命令動作を大きく変更することなく、利用できる。
これによって、設計資産を有効に利用し、メモリ上のデータへの演算を可能にすることによる論理規模の増加を最小限にすることができる。
メモリ上のデータを演算可能とすることによって、直接処理できるデータ量を増加でき、また、汎用レジスタの退避/復帰などを省くことができ、処理速度を向上することができる。
オブジェクトレベルで互換性を保ちつつ、アドレス空間の広いCPUとアドレス空間の小さいCPUが存在する場合には、アドレス空間の広いCPUで、前記ワードを付加し、存在する転送命令、演算命令を組合せることによって、下位互換性をもつ、アドレス空間の小さいCPUでもメモリ上のデータを直接的に演算可能にすることができる。換言すれば、同一の方法で、オブジェクトレベルで互換性を保ちつつ、アドレス空間の広いCPUとアドレス空間の狭いCPUでもメモリ上のデータを直接的に演算可能にすることができる。
オブジェクトレベルで互換性を保つことによる利点とメモリ上のデータを直接的に演算可能にすることの利点の双方を享受することができる。
既存の命令を組合せ、新規の命令機能を実現しているので、将来的な機能拡張や高速化に対する余裕を、既存のCPUと同等程度に保持できる。
また、既存のCPUとエミュレーション用インタフェースを共通化することができ、ひいては、同じエミュレータのハードウェアを共有できる。エミュレータのハードウェアを共通化することによって、早く開発環境を整えることができ、また、エミュレータの開発に必要な資源を最小限にすることができる。
《検討課題Cに関する発明の効果》
検討課題Cに関する発明の効果は以下の通りである。すなわち、レジスタ構成、命令とアドレッシングモードの組合せ等の点で、一方が他方を包含しないような異なる命令セットを含む複数のデータ処理装置例えばCPUを提供することにより、各種適用分野のソフトウェア上の要求に応えたり、利用者の様々な好みに応えたり、別のCPUのアセンブリ言語によるプログラムからも比較的近い命令セットCPUを選択可能でき、機能を向上したCPUへの移行を容易化することができる。
前記の、一方が他方の命令セットを包含しない、複数のCPUに対して、いずれのCPUをも包含する命令セットを持った上位のCPUを準備することによって、ソフトウェア資産の有効利用を可能にしつつ、性能/機能の向上したCPUを用意することができる。ソフトウェア資産の有効利用によって、使用者のソフトウェア開発の開発効率を向上することができる。
上位CPUは、有効なアドレスのビット数と、ベクタ及びスタックの単位サイズ、或いは実効アドレスの計算方法を、切り替える動作モード、例えばマキシマムモード、準マキシマムモードとミニマムモードを用意しておくことによって、メモリの使用方法も含めて上位互換とすることができる。
開発に当たっては、既存のCPU(下位CPUになるCPU)に対して、汎用レジスタを拡張し、命令とアドレッシングモードの組合せを拡張した上位のCPUを開発する。下位CPUは上位CPUの命令セットのサブセットを持つことになる。これにより、上位CPUの論理的規模の増大を最小限にしつつ、性能・機能・使い勝手などを向上することができると共に、前記別の下位CPUの開発を容易にし、開発効率を向上できる。前記上位CPUの、更に上位のCPUを開発する場合には、前記上位のCPUに対する互換性を維持すれば、前記複数のCPUとの互換性を、自動的に維持することができるから、ソフトウェア資産の有効利用を実現しつつ、将来的な機能や性能の向上を図ったCPUを実現し易くなる。換言すれば、個別の応用分野やシステムに適した複数のCPUを提供するとともに、複数のCPUの総体的な開発費用を低減したり、開発効率を向上したりすることができる。
汎用レジスタを拡張するために、汎用レジスタを指定するレジスタ指定フィールドを、2つの部分に分割し、この2つの部分を命令コードの基本単位上の別のワードに配置するとともに、一方のワードを省略可能とし、省略可能なワードを省略すると、暗黙的な指定が行われるようにする。省略可能なワードには、レジスタ指定フィールドの一部のみを持つようにし、演算の種類などは指定しないようにする。これにより、暗黙的に指定可能な汎用レジスタのみを使用していれば、省略可能なワードを省略できる。前記拡張された処理を指定する新規な命令コードを個別的に追加しないから、命令コードが増えず(命令コードのビット数が増えず)、命令の実行処理速度を低下させることがない。前記省略可能な命令コードを付加することによって、命令によって汎用レジスタの全てを選択できるから、プロラムの容易性を損うことがない。また、任意の量の汎用レジスタの一部を、所望のタスク毎や所望の割込み処理などに確保しておく(他のタスクや処理では使用しない)ことによって、前記タスクや割込み処理において汎用レジスタを待避したりする必要がなく、高速化が図れる。また、前記タスクや割込み処理に確保する汎用レジスタ数は任意にできるから、タスクや処理の間で、使用する汎用レジスタを相互に融通し合うことも容易である。
一般に、レジスタのアクセスはメモリのアクセスより高速であるから、汎用レジスタ数を増加することにより、高速に処理できるデータ量を増加させることができ、ひいてはCPUの処理速度を向上できる。
命令とアドレッシングモードの組合せを拡張するために、既存の、メモリ・レジスタ間の転送命令の単数または複数、レジスタ・レジスタ間の演算命令、の内、複数の命令コードを組合せ、これを結合させる命令拡張用前置命令コードを採用する。前記命令拡張用前置命令コードに続いて、メモリ・レジスタ間命令を実行する場合は、汎用レジスタではなく、CPU内の、テンポラリレジスタの様な、プログラム上解放されていないラッチ手段とメモリの間でデータ転送を行なう。更に、引き続きレジスタ・レジスタ間の演算命令を実行する場合は、演算対象の内の単数または複数のデータを前記ラッチ手段から読み出すようにする。その演算結果のメモリに格納する場合には、前記転送命令で使用したメモリのアドレスを、別のラッチ手段に格納し、前記演算命令の演算結果を前記ラッチ手段に格納するとともに、メモリ・レジスタ間の転送命令を自ら生成し(即ち、プログラムに明示されていなくても生成し)、前記アドレスを格納したラッチ手段の内容をアドレスとして、前記演算結果を格納したラッチ手段の内容をデータとして、メモリへの書込みを行なう。
このとき、メモリ・レジスタ間の転送命令、レジスタ・レジスタ間の演算命令の命令コードは既存のものであるから、単独では従来同様に動作し、既存の命令実行を阻害しない。従って、既存の命令のみを使用している既存のソフトウェア資産を有効に利用できる。データ処理装置は、ソフトウェア資産に関する上位互換を維持して、機能向上を実現できる。
アドレス空間全体に対応するビット長のプログラムカウンタを設けて、プログラム用としてはアドレス空間全体、少なくとも大部分をリニアに利用可能にするとともに、比較的小規模なデータを扱える程度に、データ転送のアドレッシングモードを縮小したり、転送データのデータサイズを限定したりして、所望の応用分野などでの使い勝手を損なわずに、論理的規模を縮小できる。
データアクセス時に、使用できるアドレス空間乃至は効率よく使用できるアドレス空間を小さくし、かかるアドレス空間を2つに分割することによって、使い勝手を損なわずに、上位CPUとのアドレス空間上の互換性を維持するとともに、上位CPUに実効アドレス計算方法などを切り替える動作モードを予め用意しておくことにより、ソフトウェア上の互換性を維持することができる。
プログラム用のアドレス空間を広げることにより、C言語などの高級言語を使用したプログラミングなどに対する適性を向上できる。また、スタックポインタを切替え可能にすることによって、OSなどのタスク管理時のスタックの容量の不所望の増加を抑止できる。
また、開発装置については、前記上位のCPUの命令セットについてのソフトウェア開発装置を用意し、更に、一方が他方の命令セットを包含しない、複数のCPUに対しても共通に利用可能にし、利用者がCPUを選択できるようにすることによって、ソフトウェア開発装置の開発効率を向上することができる。使用者にとっては、前記、複数のCPUを使用してもソフトウェア開発装置が共通であるから、不所望な費用を発生させなくてよい。前記、複数のCPUの内での移行が容易になり、開発効率を向上することができる。
ソフトウェア開発装置上で、アセンブリ言語などの、汎用的な機能を持つ汎用レジスタの記述を、複数種類許すようにすることによって、別のCPUからの移行を比較的容易にすることができる。
また、エミュレータについては、上位CPUと下位CPUとで、エミュレーション用インタフェースを共通化することができ、また、上位CPUのエミュレーション用論理回路を開発することによって、これを下位CPUにも利用でき、エミュレーション用プロセッサを含めた開発効率を向上できる。また、同じエミュレータのハードウェアを共通でき、これによって、逸早く開発環境を整えることができるとともに、また、エミュレータの開発に必要な資源を最小限にすることができる。エミュレータに搭載する逆アセンブラは、上位CPUのものを開発するとともに、エミュレータ上で対象のCPUを選択する手段を設けることによって、実質的に一つの逆アセンブラでよいことになるから、開発効率を更に向上できる。
《検討課題Dに関する発明の効果》
検討課題Dに関する発明の効果は以下の通りである。すなわち、既存の命令コード乃至命令コードの1部のワードを組合せて、ビット条件分岐命令/ビット条件サブルーチン命令を実現することによって、既存の命令実行を阻害することがなく、既存のソフトウェア資産を有効に利用できるようになる。そして、既存のCPUと互換性を維持しつつ、また、論理的・物理的規模の増大を最小限にすることができる。更に、メモリ上の任意のアドレスのデータのビットの状態を判定して、分岐及びサブルーチン分岐を可能にできる。その上、CPUの使い勝手の向上、命令コード長の短縮、及び処理性能の向上に寄与する事ができる。特に、複数のビットの状態に応じて、分岐先ひいては処理内容を変更するような処理の、プログラム容量の短縮と処理速度の向上を実現できる。
《検討課題Eに関する発明の効果》
検討課題Eに関する発明の効果は以下の通りである。すなわち、複数の汎用レジスタとメモリ間、又は複数の汎用レジスタ間での転送命令を備えることによって、汎用レジスタのビット長より大きいデータであっても、容易に扱うことができ、使い勝手を向上するとともに、データのリード/ライトに対して、命令のリードの頻度を低減して、高速化を図ることができる。
単一の命令で、複数の汎用レジスタ・メモリ間等の転送を行なうことによって、相対的に、命令コードのリード回数を低減して、データ処理を高速化することができる。また、データのリード/ライトを連続して行なうことによって、外部メモリに対するバースト動作などを有効に利用できる。
複数の汎用レジスタを指定する固定の組合わせにすることによって、命令コード長を短縮でき、更に、各命令の実行ステート数を固定にすることにより、内部の条件分岐を行うことをなくし、内部論理を簡潔にし、論理規模を縮小できる。
複数レジスタの転送を指示する命令コードと、既存の単一の汎用レジスタの転送命令の命令コードを組合せて、複数の汎用レジスタの転送命令を実現するとともに、単一の汎用レジスタの転送命令と共通化した動作を行なうようにすることにより、論理的規模の増加を最小限にすることができる。既存の単一の汎用レジスタの転送命令のアドレッシングモードを共通に利用可能にできる。既存の単一の汎用レジスタの転送命令のアドレッシングモードを利用可能にすることによって、プログラムの作成を容易にし、使い勝手を向上できる。
上記転送命令の実効アドレスの計算は、演算器で1回のみ行なうようにし、アドレスバッファにインクリメント(またはデクリメント)機能とインクリメント(またはデクリメント)結果を保持する機能を備えることによって、命令動作を単純にし、既存の転送命令と共通化を図ることができ、論理的な規模の増加を最小限にすることができる。実効アドレスの計算の回数を低減して、高速化を図ることができる。
レジスタの本数の異なる複数レジスタ転送命令を複数命令サポートすることによって、また、ワードサイズとロングワードサイズなど、データサイズの異なる複数レジスタ転送命令を複数命令サポートすることによって、プログラムの作成を容易にし、使い勝手を向上することができる。