MikeAssembler リファレンス - GMC-4

アーキテクチャ名

gmc4

概要

GMC-4は、大人の科学 Vol.24の付録の4ビットマイコンである。

GMC-4 - Wikipedia

以下で(もととなった製品の)PC用シミュレータが公開されている。

FX-マイコン シミュレータの詳細情報 : Vector ソフトを探す!

また、(上位)互換機が発売されている。

ORANGE-4

入出力

GMC-4は、以下の出力装置を持つ。

また、GMC-4は、入力用に0~Fの16個のキーを用いることができる。
(他にも操作用のキーがあるが、プログラムからは扱えない)

レジスタ

GMC-4は、1ビットの実行フラグと、以下の8個の4ビットレジスタを持つ。
各レジスタのデータは、以下のアドレスに格納されている。

レジスタアドレス
A0x6F
B0x6C
Y0x6E
Z0x6D
A'0x69
B'0x67
Y'0x68
Z'0x66

命令セット

MikeAssemblerでは、以下の命令をサポートしている。
命令およびCAL命令に続く種類名の大文字・小文字は区別しない。

imm4は、4ビットの即値である。
addrは、8ビットのアドレス(非負の即値)である。
動作において、実行フラグをF、次に実行する命令のアドレスをPCで表す。
また、[x]は番地xのデータメモリを表す。

命令命令コード動作説明
KA0 F, A ← KEY(A) キーの状態をチェックする。
キーが押されていれば、押されているキーの番号をレジスタAに格納し、実行フラグを0にする。
キーが押されていなければ、レジスタAの値は変更せず、実行フラグを1にする。
AO1 7SEG ← A
F ← 1
レジスタAの値を7セグメントLEDに出力する。
実行フラグを1にする。
CH2 A, B ← B, A
Y, Z ← Z, Y
F ← 1
AレジスタとBレジスタの値、YレジスタとZレジスタの値をそれぞれ入れ替える。
実行フラグを1にする。
CY3 A, Y ← Y, A
F ← 1
AレジスタとYレジスタの値を入れ替える。
実行フラグを1にする。
AM4 [Y] ← A
F ← 1
Aレジスタの値をYレジスタで指定する位置のデータメモリにストアする。
実行フラグを1にする。
MA5 A ← [Y]
F ← 1
Yレジスタで指定する位置のデータメモリからAレジスタに値をロードする。
実行フラグを1にする。
M+6 F ← A + [Y] > 0xF
A ← A + [Y]
AレジスタにYレジスタで指定する位置のデータメモリの値を加算する。
実行フラグは、キャリーがある場合は1、ない場合は0となる。
M-7 F ← [Y] < A
A ← [Y] - A
Yレジスタで指定する位置のデータメモリの値からAレジスタの値を引き、結果をAレジスタに格納する。
実行フラグは、結果が負の場合は1、非負の場合は0となる。
TIA imm48 <imm4> A ← imm4
F ← 1
Aレジスタに即値を格納する。
実行フラグを1にする。
AIA imm49 <imm4> F ← A + imm4 > 0xF
A ← A + imm4
Aレジスタに即値を加算する。
実行フラグは、キャリーがある場合は1、ない場合は0となる。
TIY imm4A <imm4> Y ← imm4
F ← 1
Yレジスタに即値を格納する。
実行フラグを1にする。
AIY imm4B <imm4> F ← Y + imm4 > 0xF
Y ← Y + imm4
Yレジスタに即値を加算する。
実行フラグは、キャリーがある場合は1、ない場合は0となる。
CIA imm4C <imm4> F ← A != imm4 Aレジスタの値と即値を比較する。
実行フラグは、等しい場合は0、等しくない場合は1となる。
CIY imm4D <imm4> F ← Y != imm4 Yレジスタの値と即値を比較する。
実行フラグは、等しい場合は0、等しくない場合は1となる。
CAL nameE <x>後述 比較的複雑な処理(サブルーチン)を実行する。
JUMP addrF <addr上位> <addr下位> if (F) PC ← addr
F ← 1
実行フラグが1の場合、指定した場所に実行を移す。
実行フラグが0の場合、そのまま次の命令に進む。
実行フラグを1にする。

CAL命令

実行フラグが1のときは、下記の動作を行い、CAL SIFT以外は実行フラグを1にする。
実行フラグが0のときは、下記の動作は行わず、実行フラグを1にする。

命令命令コード動作
CAL RSTOE 0 7セグメントLEDを全て消灯する。
CAL SETRE 1 2進LEDのうち、Yレジスタで指定する位置(0~6)のものを点灯する。
CAL RSTRE 2 2進LEDのうち、Yレジスタで指定する位置(0~6)のものを消灯する。
CAL CMPLE 4 Aレジスタの値をビット反転(NOT演算)し、結果をAレジスタに格納する。
CAL CHNGE 5 AとA'、BとB'、YとY'、ZとZ'レジスタの値をそれぞれ入れ替える。
CAL SIFTE 6 Aレジスタの値を1ビット論理右シフトし、結果をAレジスタに格納する。
実行フラグは、もとのAレジスタの最下位ビットが0の場合は1、最下位ビットが1の場合は0となる。
CAL ENDSE 7 エンド音を再生する。※1
CAL ERRSE 8 エラー音を再生する。※1
CAL SHTSE 9 短いブザー音を再生する。※1
CAL LONSE A 長いブザー音を再生する。※1
CAL SUNDE B Aレジスタで指定した高さ(1~0xE)のブザー音を再生する。※1
Aレジスタの値が0または0xFの場合は、何も再生しない。
CAL TIMRE C (Aレジスタの値+1)×0.1秒の間実行を停止する。
CAL DSPRE 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を減算する。
詳しくは後述。

※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 疑似命令を用いると、それ以降に登場するプリフィックス(0x0b0o)がついていない数値を16進数として扱う。
これにより、a~fのアルファベットからなる文字列も(識別子ではなく)16進数値として扱われる。

サンプルコード

7セグメントLEDに0~Fの数字を順に繰り返し表示する。

target gmc4

    tia 0
    tiy 4
loop1:
    ao
    aia 1
    cy
    cal timr
    cy
    jump loop1

戻る