マイクロプロセッサELC-1シミュレータWinELC1simの操作方法

マイクロプロセッサELC-1シミュレータWinELC1simは、 マイクロプロセッサELC-1とELC-1に接続された512バイトのメモリ、ELC-1の状態観測・設定装置、 メモリの内容観測・設定装置、ELC-1実行クロック測定装置、 外部LEDパネルが組み合わされたマイクロプロセッサ評価装置をシミュレーションするツールである。


■WinELC1Simの入手

WinELC1Simは、Microsoft Windows上で実行可能なソフトウェアである。 実行ファイルWinELC1Sim.exeをダウンロードして適当なディレクトリ(フォルダ)に保存する。

WinELC1Sim実行ファイル WinELC1Sim.exe

■WinELC1Simのアンインストール

WinELC1Simをアンインストールするには、実行ファイルWinELC1Sim.exeを消去すればよい。 WinELC1Simは、作業ファイル等は作成せず、レジストリにも何も情報は記録しない。

■WinELC1Simの起動方法

WinELC1Simは、Microsoft Windows 7/8.1/10で実行可能である。
WinELC1Simの起動は、OSのプログラム起動方法を参照のこと。 (スタートメニューの「ファイル名を指定して実行」や、エクスプローラでファイルをダブルクリックするなど)
「dllがない」とのエラーで実行できない場合は、 ダウンロードのページを参照のこと。

WinELC1simの起動画面を図1に示す。レジスタの値などは、図1とは異なっている場合がある。

図1. マイクロプロセッサELC-1シミュレータWinELC1simの起動画面

画面にしたがって、機能を順に説明する。

実行クロックカウンタは、ELC-1が命令を実行中に経過するクロックの数を累計するカウンタである。 実行クロックカウンタはELC-1の外部にあり、ELC-1から値を読み取ったり値を変更したりすることはできない。

■命令定義およびアセンブリ言語プログラムの作成

命令定義およびアセンブリ言語プログラムはテキストデータであり、適当なテキストエディタを用いて作成し、ファイルに保存しておく。

命令定義ファイル、アセンブリ言語プログラムファイルとも、ファイル名の拡張子は自由に付けてよいが、命令定義ファイルの拡張子は".ops"、アセンブリ言語プログラムファイルの拡張子は".asm"とすることを推奨する。 これらの拡張子をつけたファイルは、以下のファイルメニューによるファイル読み込みの際に、自動的に命令定義ファイル、あるいはアセンブリ言語プログラムファイルであると認識される。

■ファイルメニュー

ファイルメニューでは を行う。
図2. WinELC1Simのファイルメニュー

命令定義ファイルの読み込み

ファイルメニューから「命令定義ファイルを開く」を実行すると、読み込む命令定義ファイルを選択するウィンドウが開く。 図3では、拡張子が".ops"であるファイル名のみを一覧表示している。 必要ならばディレクトリ(フォルダ)の変更などを行い、所要の命令定義ファイルを選択する。
図3. 読み込む命令定義ファイルを選択

「開く」ボタンをクリックすると、命令定義ファイルの読み込みを行う。 命令定義に誤りがある場合は、エラーを示すウィンドウが表示されるので、命令定義ファイル中の誤りを訂正し、再度命令定義ファイルの読み込みを行う。

アセンブリ言語プログラム読み込み

ファイルメニューから「プログラム読み込み」を実行すると、読み込む命令定義ファイルを選択するウィンドウが開く。 このウィンドウでは、拡張子が".asm"であるファイル名のみが一覧表示される。 必要ならばディレクトリ(フォルダ)の変更などを行い、所要のアセンブリ言語プログラムファイルを選択する。
図4. 読み込むアセンブリプログラムファイルを選択

プログラム読み込みが完了すると、直ちにアセンブルを行う。 図5に、プログラムを読み込み、アセンブルが終了したあとのWinELC1Simの画面を示す。

図5. 「プログラム読み込み」によりアセンブリプログラムを読み込んだ様子

WinELC1Simウィンドウ中央のプログラムリスト表示領域には、以下の項目が左から順に表示される。

メモリ内容のファイル書き出し

ファイルメニューから「メモリデータ書き出し」を実行すると、ELC-1に接続したメモリのデータをファイルにCSV形式で書き出すことができる。
以下のウィンドウが開く。
図6. 「メモリデータ書き出し」により書き出すデータ、ファイル名を指定

書き出すファイルの形式はCSV形式であり、各行に2個ずつ、すなわち列を2つ有する表形式でデータを出力する。
第1列、第2列に書き出すメモリデータの先頭アドレス、ならびにデータ数を10進数で指定する。
[書き出し]ボタンをクリックすると、シミュレータ実行ファイル(WinELC1Sim.exe)と同じフォルダにファイルを作成する。

■リセット

リセットボタンをクリックするとELC-1はリセットされる。 リセットを行うと にする。

リセットを行った様子を図6に示す。 マイクロプロセッサELC-1および実行クロックカウンタだけがリセットされ、メモリの内容は保存されることに注意。

図6. リセットボタンによりELC-1をリセット

■1命令実行

ステップボタンをクリックすると、 プログラムカウンタPCの現在の値をメモリアドレスとする位置にある命令を1つだけ実行する。
図7は、メモリアドレス00A(16進数。10進数に変換すると10)にある命令1つを実行した様子である。 メモリアドレス00Aにある命令を実行したことにより、命令の内容にしたがってプログラムカウンタPCとアキュムレータACの値が変更されている。
また、実行クロックカウンタの表示から、この命令のフェッチ、オペランドの読み出し、命令実行の間に9クロックが経過したことがわかる。
図7. ステップボタンにより1命令実行

■仮想プロセッサ動作クロック周波数

WinELC1Simシミュレータ上で仮想的に動作するマイクロプロセッサELC-1のクロック周波数を示す。
例えば、シミュレータ上でELC-1のプログラム中の1200個の命令を実行し、命令種類ごとに異なる実行クロックサイクル数の合計が5510であったとする。 そのシミュレーション実行時間がPC上で2.24秒であったとき、ELC-1にとって1クロック周期の時間(平均値)は2.24(秒)÷5510(クロックサイクル)=407(マイクロ秒)となる。 すなわち、ELC-1は仮想的に周波数1/407(マイクロ秒)=2.46kHzのクロック信号で動作したことになる。
実際には、シミュレータ実行1秒ごとにELC-1上で進んだクロック周期の数をカウントして仮想クロック周波数として表示している。 シミュレーション実行時間の短いプログラムの場合は、仮想クロック周波数は求めず、0が表示される。
この値はWinELC1Simを実行するPCの性能、仮想実行するプログラムの内容、LEDパネルの表示/非表示によって決まる値である。 ELC-1がFPGAなどでハードウェアとして動作するときの実クロック周波数と比較し、プログラム動作速度の目安を立てる際の参考情報とすることを想定している。

■レジスタの値表示および値設定

WinELC1Simウィンドウの右上部には、マイクロプロセッサELC-1のレジスタの値が表示されている。

レジスタ値は、各レジスタについて左から順に

によって表示されている。 レジスタは8ビット幅であり、0または1の8個のビットが組み合わされたものである。 このビットパターンを2桁の16進数に解釈したもの、負数が2の補数(two's complement)表現されているとして10進数に解釈したもの、符号なしの10進数に解釈したものが表示されているのである。

レジスタの値を変更するには、16進数、2進数、2の補数表現による符号つき10進数、符号なし10進数のいずれかの欄をマウスでクリックするとカーソル(縦棒)が現れるので、キーボードを操作して所望の値に書き換え、Enterキーを押す。 書き換えた欄の解釈方法にしたがってその他の欄の表示は正しく更新される。

例えば、図8のようにアキュムレータACの10進数表示の欄で値を書き換えてEnterキーを押すと、符号なし10進数'200'を16進数に変換した'C8'、2進数に変換した'11001000'、符号付き10進数に変換した'-56'がそれぞれの欄に表示されるとともに、ACにはビットパターン'11001000'が設定される。

図8. レジスタの符号つき10進数の値を書き換え
図9. Enterキーを押すと値の変更が反映される

■状態フラグの値表示

レジスタ値表示の下には、 マイクロプロセッサELC-1の状態フラグの値が表示されている。

状態フラグの値は、チェックボックスによって表されており、 チェックが付けられた状態がフラグ値1、チェックのない状態がフラグ値0を意味する。
チェックボックスをクリックするごとにフラグ値の1と0を入れ替えることができる。

stepコマンドとレジスタ値設定
プログラムカウンタPCの値を変更すると、変更後の値がいずれかの命令のアドレスを指している場合には矢印'=>'の表示も更新される。

PCをはじめとするレジスタや状態フラグの値を設定してステップボタンにより1命令実行を行うことで、その命令がどのような処理を実行するか、意図したとおりの処理を実行しているかを調べることができる。

■メモリ・ウォッチ(メモリ内容表示と設定)

指定したアドレスのメモリデータを観察することができる。
メモリ・ブラウザは、メモリのデータをアドレス順に全て表示するため、離れたアドレスのデータを同時に表示することはできない。 メモリ・ウォッチでは、観察したいメモリアドレスを指定することで、注目するメモリデータのみを画面上に表示させることができる。
観察したいメモリアドレスを追加するには、メモリ・ウォッチウィンドウで「(click)」と表示された部分をクリックするとアドレス一覧が表示される。 この一覧でアドレスを選択すると、データを観察するアドレスとして登録される。

図10. 「(click)」をクリック

図11. メモリアドレスを登録

メモリ・ウォッチに表示されるデータは、以下に説明するメモリ・ブラウザと同じである。

■メモリ・ブラウザ(メモリ内容表示と設定)

メモリ・ブラウザには、ELC-1に接続された512バイトのメモリの内容が異なった形式で表示されている。 メモリ・ブラウザの表示例を図12に示す。
図12. メモリ・ブラウザ

メモリ・ブラウザには、以下の項目が左から順に表示される。

文字表示では、メモリ内容が32以上、127以下の場合にのみ文字コードどおりの文字が表示されるが、32未満あるいは128以上では表示不可として'*'が表示される。

例えば図12では、アドレス00のメモリ内容は2進数の'10001110'であり、これを16進数表示すると'8E'である。 アドレス00のメモリ内容である2進数'10001110'を2の補数表現による符号なし10進数表示すると'142'、符号付き10進数表示すると'-114'である。 さらに、アドレス00の次のアドレス01の内容である'00000000'を連結して得られる16ビットデータ'1000111000000000'を符号なし2進数と解釈すると10進数では'36352'、2の補数表現による符号付き2進数と解釈すると10進数では'-29184'であることを表している。

現在のアドレスが16進数の1FF(10進数の511)の場合は、次(+1)のアドレスはアドレス000(10進数の0)を意味する。

メモリ内容を書き換えたい行をクリックすると、図11のようにメモリデータ書き換え用の小さなウィンドウが表示される。

図13. メモリデータの書き換え

メモリデータ書き換えウィンドウに表示されている情報は、メモリ・ブラウザの表示に加えて、メモリ内容(8ビット)を文字コードとする文字が表示される。 「2バイト」と書かれた欄は、現在のアドレスの内容と次(+1)のアドレスの内容を16ビットの符号なし10進数と解釈した値である。 その下の「符号付」と書かれた欄は、現在のアドレスの内容と次(+1)のアドレスの内容を16ビットの符号付き10進数と解釈した値である。 なお、現在のアドレスの内容を上位8ビット、次(+1)のアドレスの内容を下位8ビットとする。

メモリデータ書き換えウィンドウで、所望の欄において値を書き換えてEnterキーを押すことでメモリの内容の変更が可能である。 「2バイト」およびその下の「符号付」の欄で値を書き換えると、現在のアドレスの内容だけでなく、次(+1)のアドレスの内容も書き換えられるので注意のこと。

注意
プログラムが格納されているメモリアドレスの内容も書き換え可能であるが、プログラムリスト表示は変更されない。
プログラムが格納されているメモリアドレスの内容を書き換えると、メモリ内容とプログラムリスト表示が矛盾することになり、その状態でプログラムを実行すると混乱を生じる。

■プログラム実行

実行ボタンをクリックすると、プログラムカウンタPCの 現在の値が指すアドレスからプログラムを実行する。
プログラム実行中は、中断ボタンをクリックして、 プログラム実行を中断する以外の操作はできない。
プログラムが必要な処理を完了し、プログラム実行を終了するには、プログラム自身が命令によって状態フラグH(停止フラグ)に値1を設定し、ELC-1を停止しなければならない。このため、プログラムの最後にELC-1の停止命令を置くこと。

プログラムミスにより発生した無限ループに入った場合にも外部からELC-1を停止する手段はないので、WinELC1Sim自体の実行を強制終了する必要がある。
なお、暴走などにより、プログラムカウンタPCの値がプログラム範囲以外のメモリアドレスとなった場合には、未定義命令エラーによりELC-1が停止することもある。

■ブレークポイント

ブレークポイントとは、プログラム実行を中断する位置のことである。WinELC1Simでは、プログラム中の全ての命令のアドレスにブレークポイントを設定することができる。
実行ボタンをクリックしてプログラムを実行すると、 プログラムカウンタPCの値がブレークポイントの設定されている命令のアドレスになったとき、ELC-1は停止する。 再度実行ボタンをクリックすることで、プログラム実行を再開することができる。 もちろん、ステップボタンによりブレークポイント位置の命令を実行することも可能である。

ブレークポイントを設定するには、設定したい命令の行をマウスでクリックする。 ブレークポイントが設定された命令は、図14に示すように左端に赤色の丸印が表示される。 ブレークポイントが設定されている命令の行を再度マウスでクリックすると、ブレークポイントは解除される。

図14. ブレークポイントの設定

「実行」ボタンをクリックしてプログラムを実行すると、ブレークポイントにおいて実行が停止する。 例えば、図15に示すようにブレークポイントが設定されているアドレス02Cの命令の読み出しの直前でELC-1が停止する。 ブレークポイントで停止した時点では、そのブレークポイントが設定された命令は実行されていないので注意のこと。

図15. ブレークポイントにおいて実行中断

■LEDパネル

LEDパネルは、ELC-1のメモリバス(メモリアドレス信号線およびメモリデータ信号線)に接続されており、指定したメモリアドレスのデータに従ってLEDを点灯または消灯することで、メモリデータを視覚的に確認することができる装置である。
LEDパネルを表示するには、WinELC1Simのウィンドウメニューから「LED表示(L)」を選ぶ。
図16. WinELC1Simのウィンドウメニュー

LEDパネルには、2個の7セグメントLEDと8個の単体LEDがあり、それぞれデータを表示するメモリアドレスを設定することができる。 アドレスを設定するには、図17に示すようにアドレス設定欄右端のボタンをクリックすると表示されるドロップダウンリストで、LEDにデータを表示したいアドレスを選択する。

図17. アドレスの指定

7セグメントLED

LEDパネルの7セグメントLEDは、データ表示モードと、パターン表示モードを切り替えて使用する。

◆データ表示モードでは、指定した1つのアドレスの8ビットデータを2桁の16進数とみなし、 2個の7セグメントLEDを用いて2桁の16進数を表示する。 この場合、7セグメントデコーダが自動的に使用される。
以下の例では、アドレス015(16進数。10進数では21)のデータが16進数の1B(Bは小文字のbで表す)であり、このデータが16進数として7セグメントLEDに表示されている。

図18. データ表示モードの7セグメントLED

◆パターン表示モードでは、指定したアドレスの8ビットデータのうち、下位7ビットを7つのセグメントに対応させてセグメントLEDの点灯/消灯を行う。 2個の7セグメントLEDにそれぞれメモリアドレスを指定することが可能であり、アドレス1は左側の7セグメントLED、アドレス0は右側の7セグメントLEDに対応している。 また、各データのLSB(最下位ビット)がセグメントa、その上位ビットがセグメントbというようにビットとセグメントが順に対応している。ただし、MSB(最上位)ビットはセグメントに対応していない。
以下の例では、アドレス015(16進数)のデータは2進数で00011011、アドレス016(16進数)のデータは2進数で10100101であり、これらのデータに基づいて各セグメントが点灯/消灯した結果が図19の7セグメントLED表示である。

図19. パターン表示モードの7セグメントLED

ビットパターン表示LED

LEDパネルの右半分には、指定したメモリアドレスの8ビットメモリデータをビットパターンとして表示する8個の単体LEDが並んでいる(図19参照)。 左端のLEDがデータのMSB(最上位ビット)、右端のLEDがデータのLSB(最下位ビット)に対応する。
対応するビットの値が1のときにLEDが点灯、0の時にLEDが消灯する。
図19の例では、アドレス015(16進数)のデータは2進数で00011011であり、左から順に消灯(0)、消灯(0)、消灯(0)、点灯(1)、点灯(1)、消灯(0)、点灯(1)、点灯(1)となっている。



■ドットマトリクスLEDパネル

ドットマトリクスLEDパネルは、ELC-1のメモリバス(メモリアドレス信号線およびメモリデータ信号線)に接続されており、指定したメモリアドレスのデータに従ってLEDを点灯または消灯する。
ドットマトリクスLEDパネルを表示するには、WinELC1Simのウィンドウメニューから「ドットマトリクスLED表示(D)」を選ぶ。
図20. WinELC1Simのウィンドウメニュー

ドットマトリクスは縦に8個のLEDが並んだ列が横に16列並んでいる。 列は左から順に列0、列1、...とし、右端が列15となる。
ELC-1が列指定アドレスに書き込む8ビットデータの下位4ビットの2進数をXとすると、列XのLEDが点灯可能となる。 ELC-1がデータアドレスに書き込む8ビットデータの各ビットは、8個の行に順に対応し、MSBが行7、LSBが行0となる。ビット値が1のときにLEDが点灯可能となる。
例えば、列指定アドレスに$nA(nは任意の16進数)、データアドレスに$21を書くと、行0列10と行5列10のLEDが点灯し、その他のLEDは消灯する。

図21. ドットマトリクスLEDの仕組み

このように、同時に点灯可能なLEDは1つの列だけなので、ドットマトリクスのすべてのLEDを利用するには、LEDを点灯する列を順次切り替え、それに伴って行データを適切に切り替える必要がある。
人間がドットマトリクスLEDを見る場合、残像現象により同時に複数の列が表示されているように認識し、全体として16×8個のLEDの点灯/消灯パターンが見えることになる。
WinELC1Simは残像をシミュレーションし、列切り替えが十分速く行われれば以下のように表示される。

図22. ドットマトリクスLED表示例(プログラム実行中)

プログラムが終了もしくはブレークポイントで停止したときは、現在指定されいている列のLEDのみが現在のデータに従って点灯し、その他の列のLEDはすべて消灯する。

図23. ドットマトリクスLED表示例(プログラム停止中)