いつモノコト
マイコンキット「ORANGE-4」で機械語レベルのプログラミング体験
2022年7月23日 09:30
少し前から小学校でもプログラミング学習が始まったほか、企業によってはリスキリング(学び直し)としてプログラミングを習得する例もあるそうで、プログラミングというものが身近になってきている感があります。
プログラミングに使われるのがプログラミング言語で、現代では数え切れないほど様々な種類があるようです。学習では子供なら「Scratch」、大人なら「Python」などが人気でしょうか。いずれも人間が理解しやすい「高水準言語」です。一方、コンピューターを直接的に動かせるのが「低水準言語」で、人間にはわかりにくいですがコンピューターの基本的な動きを理解するには適している言語とされています。
最近、その低水準言語である「アセンブリ言語」でプログラミングし、ハードウェアに近い「機械語」を入力して動かせるマイコンキットの存在を知り、組み立ててみることにしました。
ルーツは40年以上前の学研「電子ブロック」
購入したのは、ピコソフトという会社が作っている4bitのマイコンキット「ORANGE-4」です。いわゆるワンボードマイコンと呼ばれるタイプで、そのレトロ感のある見た目には1970年代後半に興ったマイコンブームの頃のマシンを思い浮かべる人もいるでしょう。
価格は2,750円で、公式サイトで送料を入れても3,000円でお釣りが来るのが嬉しいところ。気軽に機械語を体験できます。発売されたのは2017年なので、結構ロングセラーのアイテムです。組立にはハンダ付けが必要ですが、小学生でも作れるのではないかと思います。その点では「夏休みの自由研究」の題材にもなりそうです。
実はこのORANGE-4、2009年に学研が発売して話題となった「大人の科学マガジン vol.24」の付録のマイコン「GMC-4」の互換機なのです。件のvol.24は今では入手困難ですから、こうして互換機が長く売られているのはありがたいことです。
GMC-4も、元はといえば1981年に学研が発売した「電子ブロックFX-マイコン」の動作を再現したもの。そういう意味では、いまORANGE-4で遊ぶことは40年以上前の“マイコン少年”を追体験することだともいえましょう。
なお、ORANGE-4の互換機というのも別な会社から販売されていて、aitendoの「ATD-K-004」がそれ。価格はORANGE-4と同じです。
調整の必要も無く組み立てやすいキット
組立ですが、基本的には部品表に沿って1枚の基板にパーツをハンダ付けしていきます。背の低い部品からハンダ付けをするとやりやすいと思います。また、LEDなど極性がある部品は向きに注意します。
タクトスイッチのラベルは、同梱されている紙を切ってはめ込んでいきます。自分でオリジナルのラベルをデザインしてプリントしたものを使うのも面白そうです。
完成したところで眺めてみると、どこか秘密道具めいていてわくわくしてきます。電源はMicro USBで供給します。スイッチを入れて数字LEDに「F」が出ればOKです。
ところで、本機は「4bitマイコン」と謳っていますが、本物の4bitプロセッサを搭載しているわけではありません。使っているのはMicrochip Technologyの32bitワンチップマイコンで、その中に4bitマイコンを再現する仕組みになっています。
機械語を分かりやすくしたのが「アセンブリ言語」
プログラミングの初歩は、ピコソフトが公開している「必ずわかる ORANGE-4 機械語プログラミング」というテキストで学習できるようになっています。プログラミングでは必須の2進数や16進数の表し方から丁寧に解説されていました。
プログラム自体は、ORANGE-4の命令表を見ながら作っていきます。そして本体にプログラムを記録するには、タクトキーから16進数の機械語で入力していきます。機械語のプログラムは「80AF4AE0F071……」のようなものです。ほんの短いプログラムなら直接機械語でプログラミングできそうですが、少し長くなると分からなくなってしまうでしょう。
そこで機械語の命令と1対1に対応し、人間に多少読みやすくしたアセンブリ言語を使います。ORANGE-4では例えば“Yレジスタに数値を足す”という命令の機械語はただの「B」ですが、アセンブリ言語では「addyi」と機能を想像できる名前になっています。
この「addyi」などの命令を「ニーモニック」と呼びますが、学研のGMC-4とはニーモニックは異なります。ORANGE-4の「addyi」は、GMC-4では「AIY」です。すると、一体どこが互換機なのかという話になりますが、「addyi」も「AIY」も機械語では同じ「B」になるのです。これがORANGE-4のWebサイトに書かれている「機械語レベルでの互換」という意味です。
幸いなことに、学研が1981年当時の「FX-マイコン R-165プログラム集」を公開してくれています。「大人の科学マガジン vol.24」のWebサイトの「補足説明・ダウンロード」のところから見られますが、そこに載っているプログラムの機械語をそのままORANGE-4に打ち込めば動作するわけです。全部は試していませんが、筆者がいくつか打ち込んだところ、きちんと動作しました。このプログラム集は、100のプログラムで段階的に学べるという非常に良く書かれたものなので、ぜひ一読して欲しいと思います。
2つのプログラムを作ってみた
プログラミングの実際ですが、ピコソフトが公開している「GUI版クロスアセンブラ」というPC用のソフトを使います。「アセンブラ」とは、アセンブリ言語で書かれたプログラムを機械語に変換してくれるソフトのこと。命令表と睨めっこして人力で機械語に変換することもできますが、骨が折れるのでこうしたソフトを用いるわけです。
あらかじめテキストエディタでアセンブリ言語によるプログラムを作っておき、GUI版クロスアセンブラにコピーして「A(アセンブル)」ボタンを押すと、機械語になって右側に出てきます。この英数の羅列をORANGE-4に1文字ずつ入力して実行するという流れです。この時「E00:」は入力せず、それ以降を打ち込みます。
先のテキストなどを参考にして、2つのプログラムを作ってみました。1つ目は、16進で入力されたキーの値を「数字LED」と「2進LED」に表示するというもの。2つ目は、3分を計測するいわゆる「ラーメンタイマー」です。
プログラム[1]の機械語
E00:80AF4AE10F08E914EDF08
プログラム[1]を試すと、16進数と2進数の対応がよく分かります。とても単純な機能なのですが、結構考えないと思った動きになりませんでした。
数字LEDの表示は、押されたキーの値が入るAレジスタをそのまま表示できるので簡単です。しかし、2進LED(右側の7個並んでいるLED)に2進数を表示するには、左側3個と右側4個のLEDを別々にコントロールせねばならず、さらに値をメモリーの5Eと5Fという決められた番地に置かなければならないので、その操作で複雑になっています。
ここでは左側3個のLEDは使いませんので、0を入れて消灯させています。というのも、ORANGE-4のメモリーは初期状態では全ての番地が「F」で埋められているため、0を入れておかないと全点灯してしまうのです。
2つ目のラーメンタイマーは、時間の経過とともに2進LEDの点灯を増やしていき、最後の9秒を数字LEDでカウントダウンするものです。カウントが0になったら数字LEDと2進LEDを点滅させてエンド音を3回鳴らして終了します。
プログラム[2]の機械語
E00:A0E18028AECEC291CBF06B1D7F0289ECEC891E9F6285ECF639FC0F24F80
E80:80280ECE0F60A5EC801F60B3E7291C3F82FA2A0E2B1D7FA7F61A0E1B1D7FB5F61
これも最初、簡単にできるのでは? と思っていたのですが、結構大変でした。マイコンにはレジスタという数値を入れておく箱がいくつかあるのですが、ORANGE-4では直接数値を格納したり操作できるのは、AレジスタとYレジスタの2つだけのようでした。しかし、これらのレジスタを例えばウエイトの量、カウント、LEDの表示位置など3つ以上で同時に使う場合に足りなくなります。その場合、ほかのレジスタに一時退避させて、また必要なところで復元するといった操作が必要になります。そのあたりをクリアしていくのも、パズルのようで面白いところではあります。
タイマーのプログラムということで、時間を稼ぐウエイト処理を各所で使っています。ただ、1つのウエイト命令だと最大で1.6秒ほどにしかならないので、ウェイト命令を2つ並べたり、それをループさせるなどして待ち時間を増やしています。最終的に3分ぴったりになるように、ウエイトの量やループ回数などを試行錯誤しました。
実は、ORANGE-4はGMC-4に対してメモリーのプログラムエリアが拡張されているので、GMC-4では収まらなかったサイズのプログラムも動かせるようになりました。このラーメンタイマーもGMC-4では収まらないサイズなので、プログラムの後半を拡張された80番地以降に格納しています。プログラミングの際はWebサイトにあるメモリマップを確認して、メモリーの中程にあるデータ領域やシステム領域にプログラムが被らないようにしましょう。
加えて、GMC-4には無かった「スタック」の命令が使えるようになりました。スタックは“後入れ先出し型”のメモリー構造で、コマンド1つでレジスタの値をスタックに積んだり、スタックから取り出してレジスタに戻したりできます。ラーメンタイマーでは試しに、Aレジスタの値を一時退避させる先としてスタックを使ってみました。
PCからプログラムを転送することもできる
ところで、プログラムが長くなるとタクトキーからの手入力はかなり大変になってきます。そこで活用したいのが、PCと繋いで機械語を転送できる「USBシリアルモジュール+ケーブル」です。これがあると作業がかなり楽になります。というか、先のラーメンタイマーほどの長さになるとちょっと手入力をする気にはなれません。公式ショップで550円なので、本体と一緒に入手することをお勧めします。
これはORANGE-4のI/Oポートに繋いで使います。I/Oポートの信号は昔のシリアル通信タイプなので、これをUSBに変換するというものです。変換モジュール自体は筆者のWindows 10環境では特にドライバーのインストールなどは必要なく、差し込むと認識されました。
変換モジュールとORANGE-4は、付属の4本束のケーブルで接続します。Webにある説明書に従って、間違えないように接続します。USBモジュールを接続すると電源も供給されるようになるので、USB端子に電源を繋がなくてもよくなります。
ORANGE-4との通信には無料の「Tera Term」というソフトを使います。起動すると最初に接続先を選ぶウィンドウが出ますので、「Silicon Labs CP210x USB to UART Bridge」と表示されている「シリアル」を選びます。出ない場合はメニューの「ファイル」→「新しい接続」で出せます。
次に通信速度を変更します。Tera Termの初期設定では、通信速度が「9600」になっておりORANGE-4と繋がりません。メニューの「設定」→「シリアルポート」で出てくるウィンドウの「スピード」を「115200」にして「現在の接続を再設定」を押します。
ここでORANGE-4の「D」を押してから「RUN」を押すと通信可能なモードに入ります。この時、Tera TermにはORANGE-4のバージョンやレジスタの値などが表示されます。
プログラムの転送ですが、「GUI版クロスアセンブラ」で出力された機械語を選択して(先頭の「E00:」部分も含む)、Ctrl+Cでコピーします。次いで、Tera Term上で右クリックすると「クリップボードの確認」が出ますので、「OK」を押すと貼り付けられると同時に転送が完了します。
Tera Termで「l」と入力すると書き込まれた内容が表示されます。また、「d」および「de」でメモリーの内容が表示できます。これらを使ってどれくらいのアドレスまで使っているか、システム領域に被っていないかといったことも確認できます。
プログラムの転送が終わったら、Tera Termで「q」を入力するとORANGE-4を操作できるようになります。なお、新しくプログラムを書き込む際は、前のプログラムが残っていて上手く動かないことがありますから、一度ORANGE-4の「ハードウェアリセットスイッチ」を押してメモリーをクリアすると良いでしょう。
原点に触れて歴史を感じる
命令やデータを読み込んで、解釈して演算する、それを繰り返すというマイコンの動きは、現代のPCでも基本的な原理は同じと言えます。PCの原点とも言えるこうしたマイコンに触れ、制限が多い中であれこれリソースを工面しながらプログラミングするのは、創造的で知的な楽しみがあると思いました。
なんと言っても、自分で組み立てたマシンで自作のプログラムが思ったように動いたときの嬉しさはひとしおです。大人だけでなく、ぜひ子供にもこうした体験をして欲しいところです。
そして、4bitといえば思い出されるのがPC界の巨人 Intelによる有名な世界初のマイクロプロセッサ「4004」です。昨年(2021年)がちょうど誕生から半世紀だったそうです。「当時もこんな感じでプログラミングをしていたのかなあ」などと、4bit繋がりで歴史のロマンを感じさせてくれるのもまた一興でしょうか。