SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

VB.NETで学ぶ機械語の基礎

VB.NETで仮想CPUを作ろう (4) - テストドライバの改良

VB.NETで学ぶ機械語の基礎 第4回

ダウンロード VirtualCPU4.zip (213.5 KB)

テストドライバ側の実装

 テストドライバに次のコードを実装します。

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の基礎動作(命令読み込み、解析、実行)の実装を行います。お楽しみに。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
VB.NETで学ぶ機械語の基礎連載記事一覧

もっと読む

この記事の著者

インドリ(インドリ)

分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2836 2010/04/27 12:01

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー