オリジナルCPU「DL166」の命令セットの動作を確認する:オリジナルCPUでバイナリコード入門(7)(3/3 ページ)
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第7回は、「Tang Nano 9K」に移植したオリジナルCPU「DL166」の命令セットの動作を確認する。
RROTATEの動作を試すコード
rrotate.asm(リスト9)は、下の桁向きにローテートする命令の動作を確認するコードです。演算対象は全てのレジスタです。レジスタのビットを下の桁に向かって1つずつ移動します。最下位のビットは最上位ビットに移動します。
ram[0] <=8'b1010_0101; // mvi r0,5 ram[1] <=8'b01110_000; // rrotate r0 ram[2] <=8'b1001_0010; // jmp 2
LROTATEの動作を試すコード
lrotate.asm(リスト10)は、上の桁向きにローテートする命令の動作を確認するコードです。演算対象は全てのレジスタです。レジスタのビットを上の桁に向かって1つずつ移動します。最上位のビットは最下位ビットに移動します。
ram[0] <=8'b1010_1010; // mvi r0,5 ram[1] <=8'b01111_000; // lrotate r0 ram[2] <=8'b1001_0010; // jmp 2
JNCの動作を試すコード
jnc.asm(リスト11)とjnc2.asm(リスト12)はJNC命令の動作を確認するコードです。今まで紹介した命令はいわゆる演算命令または転送命令といわれるもので、何らかの形でレジスタの値に影響するものでした。JNC命令は制御命令といわれ、次に実行するアドレスを変更するものです。JNCとはJump No Carryの頭文字で、キャリーフラグが立っていない場合はジャンプするという意味です。キャリーフラグが立っている場合とそうでない場合のコードを用意しました。
jnc.asmはキャリーフラグが立っていない場合の動作を確かめるコードです。フラグが立っていないのでJNCが指定したアドレスにジャンプします。命令セットの下4ビットでアドレスを指定します。この場合は0番地ですので同じ番地でジャンプを繰り返します。
ram[0] <=8'b1000_0000; // jnc 0 ram[1] <=8'b1001_0010; // jmp 1
jnc2.asmはキャリーフラグが立った場合の動作を確かめるコードです。15に1を足してオバーフローを起こすようにしています。INCを実行するとキャリーフラグがセットされ、オレンジ色のLEDが光ります。JNCはジャンプはしないで次のアドレスに実行を移します。JNCを実行するとキャリーフラグはリセットされTang NanoのオレンジのLEDが消灯します。その後、4番地のアドレス(ram[4])で永久ループに入ります。
ram[0] <=8'b1010_1111; // mvi r0,15 ram[1] <=8'b01100_101; // inc r0 Set flag ram[3] <=8'b1000_0011; // jnc 3 Reset flag ram[4] <=8'b1001_0100; // jmp 4
JMPの動作を試すコード
ram[0] <=8'b1001_0000; // jmp 0
jmp.asm(リスト13)はJMPの動作を確かめるコードです。JMP命令は、ここまでに何度も登場した命令であり、命令セットの下4桁でジャンプ先のアドレスを指定します。このコードの場合、0番地でジャンプを繰り返します。
MVIの動作を試すコード
mvi.asm(リスト14)はMVIの動作を確かめるコードです。この命令はRO(アキュムレーター)に4ビットの即値を入れる命令です。即値とは命令セットに含まれている値をさします。R0のみに適応される命令セットです。即値の4ビットは命令セットの下4桁です。
ram[0] <=8'b1010_0101; // mvi r0,5 ram[1] <=8'b1001_0001; // jmp 1
MOV の動作を試すコード
mov.asm(リスト16)はMOVの動作を確かめるコードです。MOV命令は、8本あるレジスタを指定して、レジスタ間の値の移動を行います。移動といっても転送元の値がなくなるわけではありません。元の値は保持されます。
ram[0] <=8'b1010_0101; // mvi r0,5 ram[1] <=8'b00_001_000; // mov r1,r0 ram[2] <=8'b1001_0010; // jmp 2
おわりに
ここまでTang Nanoに実装されたDL166の動作をテストしてきました。CPUのコードに何か変更を加えた場合(Verilog-HDLを編集した場合)は必ずこのように各命令セットが正しく動作しているかを確かめる必要があります。CPUを開発する際に必須のテスト項目というわけでで、今回は読者の皆さんにもこのテスト項目に実際に付き合っていただいたわけです。次回からは、このTang Nanoを用いて実際のバイナリコーディング演習が開始できますね。お楽しみに!
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「オリジナルCPUでバイナリコード入門」バックナンバー
- ≫連載「注目デバイスで組み込み開発をアップグレード」バックナンバー
- ≫連載「Black Hatでハードウェアハック!」バックナンバー
- オリジナルCPU「DL166」のレジスタをLEDドットマトリックスで見える化する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第6回は、「Tang Nano 9K」に移植したオリジナルCPU「DL166」のレジスタをLEDドットマトリックスで見える化する。 - 「Tang Nano」にインテル系IDEで開発したオリジナルCPUのソースコードを移植する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第5回は、新たな教材「Tang Nano 9K」に、インテル系IDEで開発したオリジナルCPU「DL166」のソースコードを移植する。 - 新たな教材となる「Tang Nano 9K」を使ってLEDマトリクスを制御する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第4回は、バイナリコーディングを学ぶための新たな教材となる「Tang Nano 9K」とVerilog-HDLコードを使ってLEDマトリクスを制御する。 - 【バイナリコーディング演習】FPGAボードでLチカとPWMによるLED点灯を試す
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第3回は、オリジナル4ビットCPUを用いたバイナリコーディングの前段階の演習として、入手が容易なFPGAボードを使ってVerilog-HDLで簡単な回路プログラムを組んでみる。 - HDLソースコードからオリジナルCPU「DL166」の内部動作を理解する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第2回はオリジナルCPU「DL166」のHDLソースコードを基に内部動作について解説する。 - オリジナル4ビットCPU「DL166」はプログラミングの基礎学習に最適
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第1回はオリジナルCPU「DL166」のインストラクションセットについて解説する。