テストドライバ側の実装
テストドライバに次のコードを実装します。
Private Sub TestForm_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'テスト対象となるIntelCpuオブジェクトを用意する cpu = New IntelCpu() AddHandler cpu.RegisterValueChanged, _ AddressOf RegisterValueChanged 'エラーを防止するために、レジスタが必ず選択されている状態にする。 RegisterCombo.SelectedIndex = 0 '値を見やすくするための設定 format = New NumberFormatInfo() format.NumberDecimalDigits = 0 End Sub Private Sub RegisterValueChanged(ByVal sender As Object, _ ByVal e As RegisterValueChangedEventArgs) Select Case e.Gruop Case RegisterGruop.A Me.ShowEaxRegisters(e.Value) Case RegisterGruop.B Me.ShowEbxRegisters(e.Value) Case RegisterGruop.C Me.ShowEcxRegisters(e.Value) Case RegisterGruop.D Me.ShowEdxRegisters(e.Value) End Select End Sub Private Sub ShowEaxRegisters(ByVal value As Register) EaxValueLabel.Text = value.ValueU32.ToString("N", format) EaxHValueLabel.Text = String.Format("&&H{0:X}", value.ValueU32) AxValueLabel.Text = value.ValueU16.ToString("N", format) AxHValueLabel.Text = String.Format("&&H{0:X}", value.ValueU16) AhValueLabel.Text = value.ValueHighByte.ToString("N", format) AhHValueLabel.Text = String.Format("&&H{0:X}", value.ValueHighByte) AlValueLabel.Text = value.ValueLowByte.ToString("N", format) AlHValueLabel.Text = String.Format("&&H{0:X}", value.ValueLowByte) End Sub
これで準備万端です。クリックイベントを改良することができます。
Private Sub MoveDataButton_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MoveDataButton.Click If RegisterCombo.SelectedItem(0) = "E" Then 'ダブルワード(32ビット)のレジスタの値を設定する Dim value As UInteger If UInteger.TryParse(RegisterText.Text, value) = True Then Select Case RegisterCombo.SelectedItem Case "EAX" cpu.EAX = value Case "EBX" cpu.EBX = value Case "ECX" cpu.ECX = value Case "EDX" cpu.EDX = value End Select Else MessageBox.Show("0~" & UInteger.MaxValue.ToString() & _ "までの数値を入力してください。", _ "入力エラー", _ MessageBoxButtons.OK, _ MessageBoxIcon.Error) RegisterText.Focus() Exit Sub End If ElseIf RegisterCombo.SelectedItem(1) = "X" Then '1ワード(16ビット)のレジスタの値を設定する Dim value As UShort If UShort.TryParse(RegisterText.Text, value) = True Then Select Case RegisterCombo.SelectedItem Case "AX" cpu.AX = value Case "BX" cpu.BX = value Case "CX" cpu.CX = value Case "DX" cpu.DX = value End Select Else MessageBox.Show("0~" & UShort.MaxValue.ToString() _ & "までの数値を入力してください。", _ "入力エラー", _ MessageBoxButtons.OK, _ MessageBoxIcon.Error) RegisterText.Focus() Exit Sub End If Else '1バイト(8ビット)のレジスタの値を設定する Dim value As Byte If Byte.TryParse(RegisterText.Text, value) = True Then Select Case RegisterCombo.SelectedItem Case "AH" cpu.AH = value Case "AL" cpu.AL = value Case "BH" cpu.BH = value Case "BL" cpu.BL = value Case "CH" cpu.CH = value Case "CL" cpu.CL = value Case "DH" cpu.DH = value Case "DL" cpu.DL = value End Select Else MessageBox.Show("0~" & Byte.MaxValue.ToString() _ & "までの数値を入力してください。", _ "入力エラー", _ MessageBoxButtons.OK, _ MessageBoxIcon.Error) RegisterText.Focus() Exit Sub End If End If End Sub
これでコードがすっきりして、今後機械語のテストも行いやすくなります。ぜひ実際に動かしてみてください。前回のテストドライバと同じ動きをするはずです。
まとめ
いかがだったでしょうか? 今回は今後機械語を実装するための強固な基盤を作りました。実際の開発現場でもいきなり本番用プログラムを作るのではなく、このようにして段階的に作業をすることがあります。
人間がいきなり理想的な実装を行うことは不可能です。ですから、このようにしっかり大地を踏みしめるようにプログラミングすることも大事なのです。現場でリファクタリングの重要性が叫ばれているのがそれを裏付けていると筆者は考えております。
次回はCPUの基礎動作(命令読み込み、解析、実行)の実装を行います。お楽しみに。
