KUE-CHIP2という教育用マイコンのエミュレータを作った話 (1)

[早稲田大学 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/waseda) 8日目の記事です。

# KUE-CHIP2という教育用マイコンのエミュレータ及び実行環境を作りました

弊大学の2年次の学生実験で、「マイクロコンピュータ」という実験があります。これは、教育用マイクロコンピュータ「KUE-CHIP2」の実習用ボードを使用してコンピュータの基礎を学ぶものです。


この実験では、KUE-CHIP2上で動作するプログラムをつくる課題が出されるのですが、私がその問題を解いている時にアセンブラとエミュレータがあると便利だと思ったので、Webブラウザ上で動作するアセンブラ、エミュレータを実装しました。以下のURLで公開しています。

KEMU-IDE
https://openwaseda.github.io/kemuide/index.html

GitHub
https://github.com/OpenWaseda/kemuide

それでは早速このエミュレータの紹介...といきたいところですが、そもそも元のKUE-CHIP2をご存知でない方が大多数だと思いますので、この記事ではまずそちらを紹介します。
この記事では、実験に使用したKUE-CHIP2実習用ボードとはどのようなものなのか、それを用いてどのような実験を行ったかについて述べ、「[KUE-CHIP2という教育用マイコンのエミュレータを作った話 (2)](http://qiita.com/yasuo-ozu/items/6b14cc514e818dc1cfbb)」では主にKUE-CHIP2の機械語のアーキテクチャについて述べます。

# 「KUE-CHIP2実習用ボード」ってどんなもの?

学生実験では「KUE-CHIP2実習用ボード」という、KUE-CHIP2の載ったマイコンボードを用いて実習を行います。[こちらのページ](http://upc.ice.ous.ac.jp/~uejima/kue-chip2/)に実習用ボードの写真が載っているので、気になる方は確認してください。
KUE-CHIP2教育用ボードは以下のような構成になっています。
![Screenshot from 2016-12-05 23-25-46.png](https://qiita-image-store.s3.amazonaws.com/0/153096/9a2dc0ab-6396-ef08-eef9-9baa6d0cc14e.png)
※画像の出典: KUE-CHIP2教育用ボード　リファレンスマニュアル(京都高度技術研究所, 1993/6/25 v1.11)

図の左にある四角形の中にKUE-CHIP2本体が載っています。それ以外の図中の部品は、KUE-CHIP2に指示を与えるスイッチ類、動作を確認するためのLED, そしてケーブル類を接続するコネクタです。何も書かれていない部分には、KUE-CHIP2ではダイ上に512バイト、そして外部に512x16=8192バイトのメモリが乗ることになっており、この8192バイト分のメモリ素子(黒いムカデ)が並んでいます(学生実験では外部メモリは使いませんが)。

## プログラムの入力

学生実験では、まずKUE-CHIP2に機械語を入力します。手順は以下の通りです。

1. `DATA`と書かれたスイッチで機械語(1バイト分)を入力します。

2. `SET`と書かれたボタンを押し、KUE-CHIP2内のプログラムメモリに値を書き込みます。
   この時、`DATA`と書かれたLEDが先程セットした値を示します。また7セグメントLED(下の方)にも値が反映されます。
3. `ADDRINC`と書かれたボタンを押します。
   KUE-CHIP2内にあるメモリアドレスを示すレジスタ(`MAR`; Memory Address Registerと呼んでいます)がインクリメントされ、その結果7セグメントLED(上の方)の値が変化します。
4. 1. に戻って続きを入力します。

なお、KUE-CHIP2の内蔵メモリには2種類あり(`000-0FF`がプログラムメモリ, `100-1FF`がデータメモリ)、プログラムだけでなくデータメモリ(100h番地以降)をセットする必要がある場合は、`SEL`と書かれたスイッチを`0001`(プログラムメモリの場合は`0000`)にセットし、同様に値を入力します。

## プログラムの実行

さて、入力が終わったらプログラムを実行できます。KUE-CHIP2には3種類の実行モードが有り、それぞれ「SP」, 「SI」, 「SS」と書かれたボタンに対応しています。

### SP(Single Phase)モード

命令を1フェーズ分実行します。KUE-CHIP2の命令は1命令あたり3-5フェーズ(クロックと言い換えても良い)から成っており、SPモードで実行することで、各フェーズがどのような仕事をしているかを調べることが出来ます。なお、次に実行するフェーズが`P0`-`P4`と書かれたLEDで表示されます。

### SI(Single Instruction)モード
命令を1命令文実行します。
### SS(Start / Stop)モード
継続的に命令を実行します。(すでに実行中の場合は停止します。)HLTもしくは無効命令が読み出されると実行を停止します。実行中は`OP`と書かれたLEDが点灯します。
## 内部レジスタ値の確認
KUE-CHIP2の特徴として、CPU内部のレジスタ等の値をいつでも取得、設定できることが挙げられます。具体的には、`SEL`と書かれたスイッチを下の表を参考にセットします。

| SELの値 | 内容 |
|:-:|:-:|
| 0 | メモリのプログラム領域(MARで示された番地) |
| 1 | メモリのデータ領域(MARで示された番地+100h) |
| 2 | PC |
| 3 | FLAG |
| 4 | ACC |
| 5 | IX |
| 6 | DBi |
| 7 | DBo |
| 8 | MAR |
| 9 | IR |
| A | imem, mar |
| B | pc, ir, ios, flag_ob |
| C | obc, cfset, vfset |
| D | phasecut, halt, nfset, zfset |
| E | alu, alu_ope, reg |
| F | acc, ix |
※参考: KUE-CHIP2教育用ボード　リファレンスマニュアル(京都高度技術研究所, 1993/6/25 v1.11)

すると、指定された値がDATAと書かれたLED及びその左の7セグメント表示器に表示されます。
(小文字で書いたものは信号線であり、CPU内部でおもにコントローラがそれ以外のモジュールの動作を制御するために使われます。)
値を書き込みたい場合は、DATAと書かれたトグルスイッチを設定し、SETと書かれたボタンを押します。

## 入出力(通信)機能

KUE-CHIP2には入出力(他のKUE-CHIP2と通信する)機能があります。その際は、出力側のJP1と入力側のJP2をフラットケーブルで接続します。CPU上でOUT命令が実行されると、ACCというレジスタの値がデータバスに出力されます。実習用ボード側がこの出力された値を受け取り、JP1と繋がっているOBUFというレジスタに値を格納します。この値はOBUFと書かれたLEDによって表示されます。(ケーブルが接続されている場合、即座に相手方のIBUFと書かれたLEDにも反映されます。)

## その他の機能

これまでに紹介した以外にも、KUE-CHIP2実習ボードにはいくつかの機能があるので、一応触れておきます。

### JP3 外部KUE-CHIP2の接続

学生実験などで、KUE-CHIP2自体を制作した場合は、これらのポートを介して接続することで、CPUの動作確認にこの実習用ボードを使用できます。

### CLKFRQ 動作周波数の設定

CPUの動作周波数を0.033Hz-1MHzの間で調整できます。ここで設定した周波数で、CLKFRQの右側の2つのLEDが交互に点灯します。

### MEM, CBA9

ボード右上のMEMと書かれたトグルスイッチで、CPU内部のメモリを使用するか、それともボード上の外部メモリを使用するかが選択できます。外部メモリは16個あり、左下のCBA9と書かれたディップスイッチで切り替えられます。これで内蔵メモリと合わせて512x17=8704バイトのメモリ空間が使用できますが、プログラムからは切り替えられないので利便性はあまり高くないです。

# 学生実験で何をやったか?

では、弊大学では実際にKUE-CHIP2実習用ボードを用いてどのような学生実験が行われているのかについて述べます。

## 1ビット加算プログラムの実行及びトレース

まず、`ACC`レジスタにメモリの100h番地の値をロードし、`ADD`(キャリーを考慮しない加算)及び`ADC`(キャリーを考慮する加算)命令を用いてメモリの101h番地の値を加算するプログラムを実行しました。プログラムの機械語及び計算をする値(10進数、負の値を含む)が与えられ、SPモードで実行しトレース(各フェーズごとの各レジスタの値を記録する)を行う、という課題でした。

## 通信を行うプログラムの実行

2台のKUE-CHIP2実習用ボードを接続し、通信を行う課題です。送信側および受信側のプログラム(アセンブリ言語)が与えられるため、それをハンドアセンブルで機械語に変換して入力ｙし、実行します。

## 課題を解きトレース

各班(二人)に課題が与えられます(レベルがA-Eの5種類あり、自由に選べます)。その課題を解き、1週間後の学生実験で、作成してきたプログラムをKUE-CHIP2に入力し、トレースします。またプログラムを元にフローチャート図も書きます。

# 後編に続く

[KUE-CHIP2という教育用マイコンのエミュレータを作った話 (2)](http://qiita.com/yasuo-ozu/items/6b14cc514e818dc1cfbb) に続く