テストドライバの内容
重要なポイントは、TestFormのLoadイベントと、MoveDataButtonのClickイベントの2か所です。
Loadイベントでは、テスト対象となるIntelCpuオブジェクトの用意、エラー防止のための工夫、レジスタの値を見やすくするための準備の3つを行っています。コードは次のとおりです。
Private Sub TestForm_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'テスト対象となるIntelCpuオブジェクトを用意する cpu = New IntelCpu() 'エラーを防止するために、レジスタが必ず選択されている状態にする。 RegisterCombo.SelectedIndex = 0 '値を見やすくするための設定 format = New NumberFormatInfo() format.NumberDecimalDigits = 0 End Sub
MoveDataButtonのClickイベントは、RegisterTextに入力された値をレジスタに送る処理をしています。
最初は、次のIf文で選択されたレジスタを判定しています。
If RegisterCombo.SelectedItem(0) = "E" Then
ポイントはダブルワード(32ビット)レジスタは名前の先頭がEになっていることと、1ワード(16ビット)レジスタは一番最後の文字がXになっていることです。それ以外は必ず1バイト(8ビット)のレジスタとなります。
次に行っているのは、入力された文字が正しいのか判定して、正しくない場合はエラーを表示することです。それは次のIf文で行っています。
If UInteger.TryParse(RegisterText.Text, value) = True Then
このTryParseメソッドは、指定された文字が正しい数値ならばvalue変数に値を設定し、正しくない場合はFalseを返すメソッドです。このメソッドを使用すれば、簡単に入力された文字のエラーチェックが行えるので便利です。実務でも必要な場面が多々ありますので、このメソッドは覚えておいて損はありません。この機会にぜひ習得してください。
最後に行っているのは、IntelCpuオブジェクトに値を代入して、その最新の値を10進表記と16進表記で表示することです。「レジスタは入れ子状態になっているので」ShowEaxRegistersなどのメソッドで、関連しているレジスタ値の表示を更新していることに注目してください。これがこのテストドライバの特徴です。例えば、EAXの値を4万以上の値で更新して確認してください。そうすれば、AX、AH、ALの値も更新されます。
初心者の方はMoveDataButton_Clickメソッドが長くて難しく感じがちですが、大まかな流れさえつかめば単純な処理の集まりであることが分かります。このように簡単なプログラム集まりが難しく感じる場合が実務でもありますが、慌てず大まかな流れをつかむようにします。そうすればおのずと分ってきます。
これでテストドライバの作成は終わりです。実際に実行して、いろいろな値を設定してみてください。そうすれば、CPUのレジスタの動きが視覚的に確認できます。
まとめ
いかがだったでしょうか? 今回はついにCPUの大まかな動作を実装し、仮想CPUの動きを視覚的にテストするための準備を行いました。その中で実務でも役に立つテクニックをなるべく提供するべく工夫しました。
GUIのテストドライバで1つ注意点があります。実務ではこういった視覚テストよりもプログラムによる単体テストをするのが一般的だと思います。しかしながら、趣味で楽しくプログラミングする際には必ずしも実務にすべての作業を合わす必要はありません。実務と同じにするのではなく、いかに楽しく学習するのかを工夫をしましょう。そうすれば、楽しく学習を続けられて技術力を向上させられますし、どんな高度な技術でも高いモチベーションで学べば習得できます。
この記事により、一見地味で面白みを感じづらいバイナリプログラミングでも、楽しく、なおかつプログラミング技術の向上につなげられることが伝われば幸いです。
次回は、機械語の動作を実装することにより、CPUの動作の細部を実装していきます。今回、GUIで動作確認できるようになったので、次回以降さらに面白くなってくるでしょう。お楽しみに。
