条件分岐を使ったバイナリコードでLチカをより複雑にオリジナルCPUでバイナリコード入門(10)(3/3 ページ)

» 2023年11月14日 07時00分 公開
[今岡通博MONOist]
前のページへ 1|2|3       

繰り返し回数を指定する

 condition2a.asm(リスト2)では、レジスタR0にあらかじめ値を入れることによりループの回数を指定します。

ram[0] <=8'b1010_1100;  // mvi R0,12
ram[1] <=8'b01100_000;  // inc R0
ram[2] <=8'b1000_0001;  // jnc 	1 
ram[3] <=8'b1001_0011;  // jmp 	3
リスト2 condition2a.asmのコード

 例えば、4回ループを実行したい場合は16から4を引いた値をR0に入れます。リスト2でレジスタR0に12を入れておくと、Jncは4回目の1番地にジャンプし、5回目で次のjmp 3に実行を移します。

 次のcondition2b.asm(リスト3)は、ループ回数を指定するcondition2a.asmの応用です。

ram[0] <=8'b1010_0001;  // mvi R0,1
ram[1] <=8'b00_001_000; // mov R1,R0
ram[2] <=8'b1010_1100;  // mvi R0,12
ram[3] <=8'b00_110_010; // mov R6,R2
ram[4] <=8'b01100_000;  // inc R0
ram[5] <=8'b00_110_001; // mov R6,R1
ram[6] <=8'b1000_0011;  // jnc 	3 
ram[7] <=8'b00_110_010; // mov R6,R2
ram[8] <=8'b1001_1000;  // jmp 	8
リスト3 condition2b.asmのコード

 ループの中に何か命令を書いておくとその命令を繰り返し回数実行させることができます。このプログラムでは、Tang Nanoの基板に付いた6個のLEDのうち一番上のLEDを4回点滅させています。LEDの点滅の命令は前回記事で紹介したblink7.asmを参考にしてください。ただ少し違うのは、LEDを消灯させるときレジスタR0をR6に転送していますが、このプログラムではR2を使っています。本来R2の値を0にしておく必要があるのですが、リセット時に0になるので値は代入していません。あとR0を使わなかった理由は、R0はループの回数を制御するために使われているからです。

前半と後半で処理を変える

 最初は最下位のビットを2回点滅させて、その後最上位のビットを3回点滅させるプログラムを書いてみましょう。condition3.asm(リスト4)は、Tang Nanoの基板上の一番上のLEDを2回点滅させて、その次に上から4番目のLEDを3回点滅させて終わるプログラムです。

ram[0] <=8'b1010_0001;  // mvi R0,1
ram[1] <=8'b00_001_000; // mov R1,R0
ram[2] <=8'b1010_1000;  // mvi R0,8
ram[3] <=8'b00_011_000; // mov R3,R0
ram[4] <=8'b1010_1110;  // mvi R0,14
ram[5] <=8'b00_110_001; // mov R6,R1
ram[6] <=8'b01100_000;  // inc R0
ram[7] <=8'b00_110_010; // mov R6,R2
ram[8] <=8'b1000_0101;  // jnc 5 
ram[9] <=8'b1010_1101;  // mvi R0,13
ram[10] <=8'b00_110_011;// mov R6,R3
ram[11] <=8'b01100_000; // inc R0
ram[12] <=8'b00_110_010;// mov R6,R2
ram[13] <=8'b1000_1010; // jnc 10
ram[14] <=8'b1001_1110; // jmp 14
リスト4 condition3.asmのコード

 0番地から4番地までの命令は最初に一度だけ実行されます。レジスタR1に1を代入しています。これは基板上の一番上のLEDを点灯させるための値です。またR3に8を代入しているのは上から4番目のLEDを点灯させるための値です。5番地から8番地までの命令は2回実行されます。このループ内で一番上のLEDを2回点滅させます。9番地の命令は一度だけ実行されます。これはR0にループ回数を制御するための値を設定しています。 10番地から13番地までの命令は3回実行されます。このループ内で基板上の上から4番目のLEDを3回点滅させます。その後14番地の永久ループに入りプログラムは停止したようになります。これを抜けてまた最初からプログラムを実行するにはUSBコネクター上のタクトスイッチを押します。

 以下の動画でリスト4を動作させたときの様子を示します。動画の開始3秒あたりでリセットをかけますので、プログラムはそこからスタートします。

Tang Nanoに組み込んだDL166でリスト4を動作させたときの様子[クリックで再生]

おわりに

 今回のテーマは条件分岐でしたが、いかがだったでしょうか。主にループ制御で使った例ですが、次回以降はそれ以外の条件分岐についても紹介していきたいと思います。これを機にバイナリコーディングに親しんでいただければ幸いです。それではまた次回をお楽しみに。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.