- 追加された行はこの色です。
- 削除された行はこの色です。
[[FrontPage]]
2009/07/18 からのアクセス回数 &counter;
#contents
** GMC-4について [#ve7ca79f]
GMC-4は、学研の「大人の科学」Vol.24の付録に付いている4ビットマイコンボードです。
http://otonanokagaku.net/magazine/vol24/index.html
&ref(GMC-4.jpg);
*** ハードウェア構成 [#qe5942f6]
GMC-4には、
- 1個の7セグメントLED
- 1個のスピーカ
- 7個のLED
- 数字キーとASET, INCR, RUN, RESETのキー
が載っており、
- プログラム領域は、00-4F
- メモリ領域は、50-5F
- A, B, Y, Z, A', B', Y', Z'の8個のレジスタ
を持っています。
- Aレジスタは、演算用レジスタ
- Yレジスタは、アドレスレジスタ
- Zレジスタは、条件レジスタ
として使用され、その他は、補助用のレジスタとなっています。
*** 命令セット [#tf2638b8]
GMC-4の命令セットは、
|命令コード|命令記号|実行フラグ|機能|
|0|KA|0,1|押している数字キーをArに入れる。押されていない場合は実行フラグが1。|
|1|AO|1|Arの内容を数字LEDに点灯する。|
|2|CH|1|ArとBr、YrとZrの内容をそれぞれ入れ替える。|
|3|CY|1|ArとYrの内容を入れ替える。|
|4|AM|1|Arの内容をデータメモリに入れる。|
|5|MA|1|データメモリの内容をArに入れる。|
|6|M+|0,1|データメモリの内容にArの内容を加え、Arに入れる。桁上げがあると実行フラグが1。|
|7|M-|0,1|データメモリの内容からArの内容を引き、Arに入れる。引けないとき実行フラグが1。|
|8|TIA|1|命令の次のデータをArに入れる。|
|9|AIA|0,1|Arの内容に命令の次のデータを加え、Arに入れる。桁上げがあると実行フラグが1。|
|A|TIY|1|命令の次のデータをYrに入れる。|
|B|AIY|0,1|Yrの内容に命令の次のデータを加え、Yrに入れる。桁上げがあると実行フラグが1。|
|C|CIA|0,1|Arと命令の次のデータを比べる。異なる場合は実行フラグが1。|
|D|CIY|0,1|Yrと命令の次のデータを比べる。異なる場合は実行フラグが1。|
|F|JUMP|1|実行フラグが1のとき、続けて指定したアドレスにジャンプする。|
この他にサービスコールとして、
|命令コード|命令記号|実行フラグ|機能|
|E0|CAL RSTO|1|数字LEDを消灯する。|
|E1|CAL SETR|1|2進LEDを1個点灯する。点灯するLEDはYrで指定する。|
|E2|CAL RSTR|1|2進LEDを1個消灯する。消灯するLEDはYrで指定する。|
|E4|CAL CMPL|1|Arの内容をbit反転する。|
|E5|CAL CHNG|1|Ar、Br、Yr、Zrと補助レジスタA'r、B'r、Y'r、Z'rの内容を入れ替える。|
|E6|CAL SIFT|0,1|Arの内容を1bit右へ移動する。結果が偶数のとき実行フラグが1。|
|E7|CAL ENDS|1|エンド音を鳴らす。|
|E8|CAL ERRS|1|エラー音を鳴らす。|
|E9|CAL SHTS|1|"ピッ"という音を鳴らす。|
|EA|CAL LONS|1|"ピー"という音を鳴らす。|
|EB|CAL SUND|1|Arの内容に対応する音階を鳴らす。|
|EC|CAL TIMR|1|(Arの内容+1)×0.1秒間プログラムの実行を停止する。|
|ED|CAL DSPR|1|データメモリの内容を2進LEDに点灯する。5F番地の内容を上位、5E番地の内容を下位に表示する。|
|EE|CAL DEM-|1|データメモリからArの内容を引き、10進数に直してデータメモリに入れる。|
|EF|CAL DEM+|1|データメモリにArの内容を加え、10進数に直してデータメモリに入れる。桁上げがある場合は一つ前の番地の値に1を加える。|
があります。((E3のCAL INPTは、ありません))
** コンパイラー [#h5730b34]
GMC-4では、
- プログラムを命令セットで表現し
- 手でコードに翻訳
することで、プログラミングします。しかし、これではミスも多く、小さなプログラムを作るのでも大変です。
そこで、以下のような簡易言語から命令セットに変換するコンパイラーを作成しました。
例)15秒カウンタ
#pre{{
int a;
a = 15;
while (a > 0) {
out(a);
shts();
a = a - 1;
timer(10);
}
}}
生成された命令セット(アセンブラ)は、
#pre{{
TIA f
TIY 0
AM
L1: TIY 0
TIA 0
AIA 1
M-
JUMP L2
TIY 0
MA
AO
CAL SHTS
TIY 0
TIA 1
M-
TIY 0
AM
TIA a
CAL TIMR
JUMP L1
L2: CAL ENDS
L3: JUMP L3
}}
*** アセンブラ [#fbb36069]
命令セットからコードに翻訳するアセンブラが、以下のサイトにあります。
http://www.musashinodenpa.com/misc/GMC4/
ここで変換すると
#pre{{
アドレス 命令 命令コード
00 TIA 8
01 <F> F
02 TIY A
03 <0> 0
04 AM 4
05 TIY A
06 <0> 0
07 TIA 8
08 <0> 0
09 AIA 9
0A <1> 1
0B M- 7
0C JUMP F
0D <0> 0
0E <2> 2
0F TIY A
10 <0> 0
11 MA 5
12 AO 1
13 CAL E
14 _SHTS 9
15 TIY A
16 <0> 0
17 TIA 8
18 <1> 1
19 M- 7
1A TIY A
1B <0> 0
1C AM 4
1D TIA 8
1E <A> A
1F CAL E
20 _TIMR C
21 JUMP F
22 <0> 0
23 <5> 5
24 CAL E
25 _ENDS 7
26 JUMP F
27 <2> 2
28 <6> 6
}}
ただし、最初のJUMP 02はバグのようで必ず最初のJUMPの値が正しくセットされません。
正しくは、JUMP 24です。
** シミュレータ [#i4366508]
GMC-4の元になった「FX-マイコン」のシミュレータが以下のURLに公開されています。
http://homepage2.nifty.com/kocha_web/fxms/fxms.html
これを使って生成されたコードが正しく動作するか試してみます。((コンパイラーのデバッグに重宝しました))
&ref(FX-Simulator.jpg);
- 例題をFX-マイコン・シミュレータで実行するためのファイル&ref(sample.fxp);
** 言語仕様 [#f7bba4b6]
言語は、命令セットの影響を強く受け、
- $A, $ZでAレジスターの値、Zレジスターの値をそのまま使うことを指定できるようにしました。
- 条件レジスタの制約がきつく、比較が>と==のみとなりました。
- 引き算は、変数に対してのみ可能です。
となりました。
コンパイラーの処理する言語仕様を以下に示します。
#pre{{
prog ::
declaration* statement+
declaration ::
int ID ( ',' ID )*
compoundStatement ::
'{' statement+ '}'
statement ::
expr ';'
| ID '=' expr;
| ';'
| compoundStatement
| ifStm
| whileStm
| 'led' '(' expr ')' ';'
| 'out' '(' expr ')' ';'
| 'cmpl' '(' expr ')' ';'
| 'shift' '(' expr ')' ';'
| 'shts' '(' expr ')' ';'
| 'sound' '(' expr ')' ';'
| 'timer' '(' expr ')' ';'
expr ::
'$A'
| 'key' '(' ')'
| term ( '+' CONST | '+' ID )*
| ID '-' CONST
| ID '-' ID
term ::
CONST | ID
ifStm ::
'if' '(' comparisonExpr ')' statement
whileStm ::
'while' '(' comparisonExpr ')' statement
comparisonExpr ::
'$Z'
| 'key' '(' ')'
| ID '>' CONST
| term '==' ( ID | CONST )
ID :: ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*
CONST :: '0'..'9'+
}}
** ソース [#u66b7263]
GMC-4コンパイラーのEclipseプロジェクトを以下のファイルをダウンロードしてください。
- &ref(Gem4c.zip);
** コメント [#ia6995e1]
この記事は、
#vote(おもしろかった,そうでもない,わかりずらい)
#vote(おもしろかった[1],そうでもない[0],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha