今どきの学生には受けなかった「ナイトライダー」を再現するオリジナルCPUでバイナリコード入門(11)(2/2 ページ)

» 2023年12月26日 07時30分 公開
[今岡通博MONOist]
前のページへ 1|2       

 次のサンプルプログラムknight1b.asm(リスト3)は、リスト1のknight1a.asmとは逆にLEDをずらしていき桁落ちが起こると最上位ビットに移ります。これを繰り返すプログラムです。knight1a.asmと異なるところは、1番地がlrotateになっているところだけです。lrotateはlower rotateの略です。以前はRROTATE(Right Rotate)と呼んでいたものです。

ram[0] <=8'b1010_0001;  // mvi R0,1
ram[1] <=8'b01110_000;  // lrotate R0 
ram[2] <=8'b1001_0001;  // jmp 	1
リスト3 knight1b.asmのコード

 0番地ではレジスタR0に初期値を代入しています。knight1b.asmではknight1a.asmと同様に、最下位ビットのみを1としています。これだと次のlrotate命令でいきなり桁落ちが発生します。これはちょっと気持ち悪いと思われるかもしれませんが、一巡してしまえばどこのビットが立っていても同じなのでknight1a.asmと同じにしています。どうしても気になるようであれば最上位ビットを1にしてみてください。

 どうでしょう。これら2つのプログラムを組み合わせばナイトライダーができそうな気になりませんか。

いよいよナイトライダーに挑戦

 knight2.asm(リスト4)はナイトライダーのコードです。実際のナイトライダーは8個の電球が左右に移動しながら点灯するんですが、DL166ではレジスタ長の制限で4個のLEDしか光らせることができません。ということで4ビット版のナイトライダーということでご容赦ください。

ram[0] <=8'b1010_0001;  // mvi R0,1
ram[1] <=8'b01111_000;  // urotate R0 
ram[2] <=8'b01111_000;  // urotate R0 
ram[3] <=8'b01111_000;  // urotate R0  
ram[4] <=8'b01110_000;  // lrotate R0 
ram[5] <=8'b01110_000;  // lrotate R0 
ram[6] <=8'b01110_000;  // lrotate R0 
ram[7] <=8'b1001_0001;  // jmp 	1
リスト3 knight2.asmのコード

 0番地でレジスタR0に初期値を設定します。最初に光るLEDを決めるわけですね。この場合だとTang Nanoの基板のUSBコネクターを左に向けた時、LEDドットマトリクスの左上の角のLEDが点灯することになります。その後、1番地から3番地までのurotate命令でLEDの点灯を右に1つずつずらします。そして、4番地から6番地までのlrotate命令で今度は先ほどとは逆にLEDの点灯を左に1つずつずらします。

 そして7行目のjmp命令で1番地に実行を戻します。これを繰り返すわけです。ただ左端のLEDの点灯だけは他のLEDの点灯時間と異なり他より2倍の時間点灯していることになります。少し調子が外れて気持ち悪いかもしれませんが、連載第9回の「たかがLチカされどLチカ」を参考に工夫してみてください。

 今回のプログラムではLEDドットマトリクスのレジスタの値を表示する機能を用いてナイトライダーを実現しました。実際にはTang Nanoの基板のLEDを点灯させるのが良いのでしょうが、そこは皆さんへの課題とします。今回のプログラムと「たかがLチカされどLチカ」の記事が参考になると思います。

オリジナル4ビットCPU「DL166」を組み込んだ「Tang Nano」でLEDドットマトリックスの1列目の点灯をナイトライダー風に制御した様子[クリックで再生]

おわりに

 執筆を終えて、ナイトライダーをあらためて動画で確認しましたが、8個の発光部品が並んでいますがLEDか電球かは分かりませんでした。今回のプログラムではurotate命令とlrotate命令を3つずつ並べるというちょっと愚直に見えるコーディングだったかもしれません。もしコンピュータリソースに余裕があればパラメータを変えれば汎用的に使えるようにプログラムを書くのが一般的ですが、リソースに限りがある場合はこのようなコーディングを選択することは組み込み開発では多々あることです。

 プログラミングはゲームやパズルと同じという話を以前の記事で書きました。プログラミングをする上でCPUの命令セットはある種のルールなんですね。あらゆるゲームにはルールがあってその中で競うわけですね。ですから本連載で設定したDL166というCPUがルールということになります。ですが、このルールを変えたいと思われる読者の方もいらっしゃるかも知れません。いわゆる命令セットを決めてオリジナルのCPUを創るということです。そのあたりについてもいつか記事にしてみたいと思っています。これを機にバイナリーコーディングに親しんで頂ければ幸いです。それではまた次回をお楽しみに。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.