今どきの学生には受けなかった「ナイトライダー」を再現する:オリジナルCPUでバイナリコード入門(11)(2/2 ページ)
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第11回では、1980年代の米国テレビドラマ「ナイトライダー」に登場するドリームカーの電飾の再現に挑戦する。
次のサンプルプログラム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
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
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チカ」の記事が参考になると思います。
おわりに
執筆を終えて、ナイトライダーをあらためて動画で確認しましたが、8個の発光部品が並んでいますがLEDか電球かは分かりませんでした。今回のプログラムではurotate命令とlrotate命令を3つずつ並べるというちょっと愚直に見えるコーディングだったかもしれません。もしコンピュータリソースに余裕があればパラメータを変えれば汎用的に使えるようにプログラムを書くのが一般的ですが、リソースに限りがある場合はこのようなコーディングを選択することは組み込み開発では多々あることです。
プログラミングはゲームやパズルと同じという話を以前の記事で書きました。プログラミングをする上でCPUの命令セットはある種のルールなんですね。あらゆるゲームにはルールがあってその中で競うわけですね。ですから本連載で設定したDL166というCPUがルールということになります。ですが、このルールを変えたいと思われる読者の方もいらっしゃるかも知れません。いわゆる命令セットを決めてオリジナルのCPUを創るということです。そのあたりについてもいつか記事にしてみたいと思っています。これを機にバイナリーコーディングに親しんで頂ければ幸いです。それではまた次回をお楽しみに。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- ≫連載「オリジナルCPUでバイナリコード入門」バックナンバー
- ≫連載「注目デバイスで組み込み開発をアップグレード」バックナンバー
- 条件分岐を使ったバイナリコードでLチカをより複雑に
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第10回では、条件分岐を使ったバイナリコードに挑戦する。 - たかがLチカされどLチカ、バイナリコードでLEDを点滅させる
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第9回では、プログラミング演習の定番であるLチカを題材にバイナリコードを動かしてみる。 - 2行で書けるバイナリコードを動かしてみよう
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。今回の第8回からバイナリコードのプログラミング演習がスタートする。まずは、最も短いレベルとなる2行で書けるバイナリコードを動かしてみる。 - オリジナルCPU「DL166」の命令セットの動作を確認する
オリジナル4ビットCPUを用いてバイナリコードを学ぶ本連載。第7回は、「Tang Nano 9K」に移植したオリジナルCPU「DL166」の命令セットの動作を確認する。 - オリジナル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で簡単な回路プログラムを組んでみる。