GMC-4

この記事は、カオスの坩堝アドベントカレンダー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の時のみ実行される。

命令コードニーモニック説明実行フラグ
0KA押されているキー番号→Arキーが押されていたら0
1AOAr→7セグLED1
2CHArとBr、YrとZrをそれぞれ入れ替え1
3CYArとYrを入れ替え1
4AMAr→Mem(Yr)1
5MAMem(Yr)→Ar1
6M+Mem(Yr)+Ar→Ar桁上がり時は1
7M-Mem(Yr)-Ar→Ar負数になった時は1
8□TIA□□→Ar1
9□AIA□Ar+□→Ar桁上がり時は1
A□TIY□□→Yr1
B□AIY□Yr+□→Yr桁上がり時は1
C□CIA□Arと□を比較不一致→1
D□CIY□Yrと□を比較不一致→1
F□□JUMP□□もし実行フラグが1なら□□番地へジャンプ1
E0CAL RSTO7セグLEDを消灯1
E1CAL SETRYr番目のLEDを点灯1
E2CAL RSTRYr番目のLEDを消灯1
E4CAL CMPLArをビット反転する1
E5CAL CHNGAr, Br, Yr, Zr を A’r, B’r, Y’r, Z’r と入れ替える1
E6CAL SIFTArを1ビット右シフトビットがあふれた場合は1
E7CAL ENDSエンド音1
E8CAL ERRSエラー音1
E9CAL SHTSぴっ1
EACAL LONSぴー1
EBCAL SUNDArに指定した音階の音を鳴らす1
ECCAL TIMR(Ar + 1) * 0.1 sec 処理を止める1
EDCAL DSPR5F番地を上位3ビット、5E番地を下位4ビットとし7つのLEDに2進表示する1
EECAL DEM-(Mem(Yr)-Ar + 10) % 10 →Mem(Yr), Yr-1→Yr, 実行前にMem(Yr) – Arが負であった場合は、Mem(Yr – 1)から1引いていく1
EFCAL 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はシミュレータが無料で公開されています。よかったら遊んでみてください。もしもプログラムを作ってみた人がいたら、僕にも見せてくれると嬉しいです。

コメント

  1. nininga より:

    だめ、わかんない