gmc4
GMC-4は、大人の科学 Vol.24の付録の4ビットマイコンである。
以下で(もととなった製品の)PC用シミュレータが公開されている。
FX-マイコン シミュレータの詳細情報 : Vector ソフトを探す!
また、(上位)互換機が発売されている。
GMC-4は、以下の出力装置を持つ。
また、GMC-4は、入力用に0~Fの16個のキーを用いることができる。
(他にも操作用のキーがあるが、プログラムからは扱えない)
GMC-4は、1ビットの実行フラグと、以下の8個の4ビットレジスタを持つ。
各レジスタのデータは、以下のアドレスに格納されている。
レジスタ | アドレス |
---|---|
A | 0x6F |
B | 0x6C |
Y | 0x6E |
Z | 0x6D |
A' | 0x69 |
B' | 0x67 |
Y' | 0x68 |
Z' | 0x66 |
MikeAssemblerでは、以下の命令をサポートしている。
命令およびCAL
命令に続く種類名の大文字・小文字は区別しない。
imm4
は、4ビットの即値である。
addr
は、8ビットのアドレス(非負の即値)である。
動作において、実行フラグをF
、次に実行する命令のアドレスをPC
で表す。
また、[x]
は番地x
のデータメモリを表す。
命令 | 命令コード | 動作 | 説明 |
---|---|---|---|
KA | 0 |
F, A ← KEY(A) |
キーの状態をチェックする。 キーが押されていれば、押されているキーの番号をレジスタAに格納し、実行フラグを0にする。 キーが押されていなければ、レジスタAの値は変更せず、実行フラグを1にする。 |
AO | 1 |
7SEG ← A |
レジスタAの値を7セグメントLEDに出力する。 実行フラグを1にする。 |
CH | 2 |
A, B ← B, A |
AレジスタとBレジスタの値、YレジスタとZレジスタの値をそれぞれ入れ替える。 実行フラグを1にする。 |
CY | 3 |
A, Y ← Y, A |
AレジスタとYレジスタの値を入れ替える。 実行フラグを1にする。 |
AM | 4 |
[Y] ← A |
Aレジスタの値をYレジスタで指定する位置のデータメモリにストアする。 実行フラグを1にする。 |
MA | 5 |
A ← [Y] |
Yレジスタで指定する位置のデータメモリからAレジスタに値をロードする。 実行フラグを1にする。 |
M+ | 6 |
F ← A + [Y] > 0xF |
AレジスタにYレジスタで指定する位置のデータメモリの値を加算する。 実行フラグは、キャリーがある場合は1、ない場合は0となる。 |
M- | 7 |
F ← [Y] < A |
Yレジスタで指定する位置のデータメモリの値からAレジスタの値を引き、結果をAレジスタに格納する。 実行フラグは、結果が負の場合は1、非負の場合は0となる。 |
TIA imm4 | 8 <imm4> |
A ← imm4 |
Aレジスタに即値を格納する。 実行フラグを1にする。 |
AIA imm4 | 9 <imm4> |
F ← A + imm4 > 0xF |
Aレジスタに即値を加算する。 実行フラグは、キャリーがある場合は1、ない場合は0となる。 |
TIY imm4 | A <imm4> |
Y ← imm4 |
Yレジスタに即値を格納する。 実行フラグを1にする。 |
AIY imm4 | B <imm4> |
F ← Y + imm4 > 0xF |
Yレジスタに即値を加算する。 実行フラグは、キャリーがある場合は1、ない場合は0となる。 |
CIA imm4 | C <imm4> |
F ← A != imm4 |
Aレジスタの値と即値を比較する。 実行フラグは、等しい場合は0、等しくない場合は1となる。 |
CIY imm4 | D <imm4> |
F ← Y != imm4 |
Yレジスタの値と即値を比較する。 実行フラグは、等しい場合は0、等しくない場合は1となる。 |
CAL name | E <x> | 後述 | 比較的複雑な処理(サブルーチン)を実行する。 |
JUMP addr | F <addr上位> <addr下位> |
if (F) PC ← addr |
実行フラグが1の場合、指定した場所に実行を移す。 実行フラグが0の場合、そのまま次の命令に進む。 実行フラグを1にする。 |
CAL
命令実行フラグが1のときは、下記の動作を行い、CAL SIFT
以外は実行フラグを1にする。
実行フラグが0のときは、下記の動作は行わず、実行フラグを1にする。
命令 | 命令コード | 動作 |
---|---|---|
CAL RSTO | E 0 |
7セグメントLEDを全て消灯する。 |
CAL SETR | E 1 |
2進LEDのうち、Yレジスタで指定する位置(0~6)のものを点灯する。 |
CAL RSTR | E 2 |
2進LEDのうち、Yレジスタで指定する位置(0~6)のものを消灯する。 |
CAL CMPL | E 4 |
Aレジスタの値をビット反転(NOT演算)し、結果をAレジスタに格納する。 |
CAL CHNG | E 5 |
AとA'、BとB'、YとY'、ZとZ'レジスタの値をそれぞれ入れ替える。 |
CAL SIFT | E 6 |
Aレジスタの値を1ビット論理右シフトし、結果をAレジスタに格納する。 実行フラグは、もとのAレジスタの最下位ビットが0の場合は1、最下位ビットが1の場合は0となる。 |
CAL ENDS | E 7 |
エンド音を再生する。※1 |
CAL ERRS | E 8 |
エラー音を再生する。※1 |
CAL SHTS | E 9 |
短いブザー音を再生する。※1 |
CAL LONS | E A |
長いブザー音を再生する。※1 |
CAL SUND | E B |
Aレジスタで指定した高さ(1~0xE)のブザー音を再生する。※1 Aレジスタの値が0または0xFの場合は、何も再生しない。 |
CAL TIMR | E C |
(Aレジスタの値+1)×0.1秒の間実行を停止する。 |
CAL DSPR | E D |
データメモリ[0xE] の値を2進LEDの下位4ビットに、[0xF] の値の下位3ビットを2進LEDの上位3ビットに出力する。 |
CAL DEM- | E E |
Yレジスタで指定する位置のデータメモリからAレジスタの値を10進演算で減算する。 そして、Yレジスタの値から1を減算する。 詳しくは後述。 |
CAL DEM+ | E F |
Yレジスタで指定する位置のデータメモリにAレジスタの値を10進演算で加算する。 そして、Yレジスタの値から1を減算する。 詳しくは後述。 |
音声の再生中は、2進LEDの3番目(0-origin、真ん中のLED)が点灯し、実行が停止する。
CAL SUND
においてAレジスタの値が0または0xFの場合は、何も再生しないので、すぐに次の命令の実行に移る。
CAL DEM-
命令の動作
実験の結果、CAL DEM-
命令の動作は以下の擬似コードで表せるようである。
if [Y] < A
// ボローが発生する場合
[Y] ← [Y] - A - 6
[Y - 1] ← 1
else
// ボローが発生しない場合
[Y] ← [Y] - A
endif
Y ← Y - 1
CAL DEM+
命令の動作
実験の結果、CAL DEM+
命令の動作は以下の擬似コードで表せるようである。
ただし、「足す数」「足す位置」は動作の記述用の4ビットの変数である。
足す数 ← A
足す位置 ← Y
while 足す数 > 0
if [足す位置] + 足す数 > 9
// 10進で繰り上がる場合
[足す位置] ← [足す位置] + 足す数 + 6
足す数 ← 1
足す位置 ← 足す位置 - 1
else
// 繰り上がらない場合
[足す位置] ← [足す位置] + 足す数
足す数 ← 0
endif
endwhile
Y ← Y - 1
DEFAULTHEX
疑似命令を用いると、それ以降に登場するプリフィックス(0x
、0b
、0o
)がついていない数値を16進数として扱う。
これにより、a~fのアルファベットからなる文字列も(識別子ではなく)16進数値として扱われる。
7セグメントLEDに0~Fの数字を順に繰り返し表示する。
target gmc4
tia 0
tiy 4
loop1:
ao
aia 1
cy
cal timr
cy
jump loop1