この記事は、カオスの坩堝アドベントカレンダー2018の17日目の記事です。
まわりに情報系の学生が多いと、初対面での会話に初めて書いたプログラミング言語についての話題はつきものです。僕はどちらかというと組み込み系からプログラミングの入ったのもあって、初めて書いたのはいわゆる機械語です。情報学科の界隈では珍しいらしく、このことを話すと受けがいいので個人的には気に入っています。
機械語といってもx86とかそういうたいそうなやつではなくて、学研の大人の科学という雑誌のふろくに付いてきたGMC-4というおもちゃみたいなマイコンの命令セットです。いや、「マイコンみたいなおもちゃ」の方が正しいかもしれないです。なんせ4bit長のデータしか扱えません。当然扱えるデータメモリも50 から 5Fまでの16番地分だけです。基本スペックはこんな感じです。
入出力
out : 7個のLED, 7セグLED1つ(0 ~ Fまで表示できるやつ), スピーカー1つ
in : 0 ~ Fまでの16個のキー入力
メモリ
パソコンとかと違ってマイコンのメモリは実行中のプログラムを保持しておく専用のメモリ領域があります。
プログラム領域 : 0 ~ 4F
データ領域 : 50 ~ 5F
レジスタ : A(演算用), B, Y(アドレス指定用), Z, A’, B’, Y’, Z’
実行フラグ、プログラムカウンタ
命令セット
XレジスタをXrと書く。Mem(X)はメモリの(X + 50)番地を表す。Eから始まる命令はCAL命令といい、実行フラグが1の時のみ実行される。
命令コード | ニーモニック | 説明 | 実行フラグ |
0 | KA | 押されているキー番号→Ar | キーが押されていたら0 |
1 | AO | Ar→7セグLED | 1 |
2 | CH | ArとBr、YrとZrをそれぞれ入れ替え | 1 |
3 | CY | ArとYrを入れ替え | 1 |
4 | AM | Ar→Mem(Yr) | 1 |
5 | MA | Mem(Yr)→Ar | 1 |
6 | M+ | Mem(Yr)+Ar→Ar | 桁上がり時は1 |
7 | M- | Mem(Yr)-Ar→Ar | 負数になった時は1 |
8□ | TIA□ | □→Ar | 1 |
9□ | AIA□ | Ar+□→Ar | 桁上がり時は1 |
A□ | TIY□ | □→Yr | 1 |
B□ | AIY□ | Yr+□→Yr | 桁上がり時は1 |
C□ | CIA□ | Arと□を比較 | 不一致→1 |
D□ | CIY□ | Yrと□を比較 | 不一致→1 |
F□□ | JUMP□□ | もし実行フラグが1なら□□番地へジャンプ | 1 |
E0 | CAL RSTO | 7セグLEDを消灯 | 1 |
E1 | CAL SETR | Yr番目のLEDを点灯 | 1 |
E2 | CAL RSTR | Yr番目のLEDを消灯 | 1 |
E4 | CAL CMPL | Arをビット反転する | 1 |
E5 | CAL CHNG | Ar, Br, Yr, Zr を A’r, B’r, Y’r, Z’r と入れ替える | 1 |
E6 | CAL SIFT | Arを1ビット右シフト | ビットがあふれた場合は1 |
E7 | CAL ENDS | エンド音 | 1 |
E8 | CAL ERRS | エラー音 | 1 |
E9 | CAL SHTS | ぴっ | 1 |
EA | CAL LONS | ぴー | 1 |
EB | CAL SUND | Arに指定した音階の音を鳴らす | 1 |
EC | CAL TIMR | (Ar + 1) * 0.1 sec 処理を止める | 1 |
ED | CAL DSPR | 5F番地を上位3ビット、5E番地を下位4ビットとし7つのLEDに2進表示する | 1 |
EE | CAL DEM- | (Mem(Yr)-Ar + 10) % 10 →Mem(Yr), Yr-1→Yr, 実行前にMem(Yr) – Arが負であった場合は、Mem(Yr – 1)から1引いていく | 1 |
EF | CAL DEM+ | (Mem(Yr)+Ar) % 10 →Mem(Yr), Yr-1→Yr, 実行前にMem(Yr) + Arが10以上だった場合は、Mem(Yr – 1)に1足していく | 1 |
例えば、7つのLEDを使ってダイナミック点灯を行うプログラムは次のようになります。
アセンブリ :
L2: TIA 0 L1: TIY C AM CY MA TIY E AM TIY C MA AIA 1 TIY C AM CY MA TIY F AM TIY C MA AIA 1 CAL DSPR CIA C JUMP L1 JUMP L2
命令コード
80AC435AE4AC591AC435AF4AC591EDCCF02F00
今ならばこのような貧弱な計算機は1度触って飽きるところですが、中学1年の自分には新鮮そのもので、当時は授業そっちのけで狂ったようにプログラムを書いていました。卓球ゲームやルーレットを書いたり、入出力周りを改造して2色の4×7ディスプレイを点灯させたりと、飽きるまで遊び尽くしました。当時はフローチャートもアセンブラも知らなかったので、ノートに命令列を直接書いてプログラムを書いました。たぶんクラスメイトからは変なやつだと思われていたでしょう。
こんなGMC-4の何が面白かったのかと考えると、プログラムメモリが40バイトしかなかったからではないかと思います。どうやったら40バイトに収まるか?得点の記録機能は追加できるか?そうやって試行錯誤を繰り返しながらプログラムを完成させるのは、C言語のプログラミングとはまた違った楽しさがありました。それはおそらく、近年の一般的なプログラミングにはない楽しさだったと思います。
GMC-4はシミュレータが無料で公開されています。よかったら遊んでみてください。もしもプログラムを作ってみた人がいたら、僕にも見せてくれると嬉しいです。
コメント
だめ、わかんない