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.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.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
ram[0] <=8'b1001_0000; // jmp 0
jmp.asm(リスト13)はJMPの動作を確かめるコードです。JMP命令は、ここまでに何度も登場した命令であり、命令セットの下4桁でジャンプ先のアドレスを指定します。このコードの場合、0番地でジャンプを繰り返します。
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.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.