Setのロジックの説明
Register
構造体のプロパティは値を共有しています。そのため、簡単な値のGet/Setをするプロパティとは違い、注意するべき点として「Setする前に前の値を消す必要があること」が挙げられます。
先程説明したように、無視したい(消したい)桁を0にしたビットごとのAnd論理演算を使用すれば、その桁の値は必ず0になります。今回の場合、前の値を消したいのですから、Getの反対のビットごとのAnd論理演算をすればいいことになります。
それでは、また電卓で確認してみましょう。EAXに2,359,271,448(16進数で8C9F A018)が代入されている時、AXの値を0にしたい場合は値が8C9F 0000になればよいわけです。ということは、8C9F A018 And FFFF 0000の計算をすればよいことになります。電卓で実際に計算してみてください。望む計算結果が得られたはずです。これでGetとSetのロジックを組むための知識が揃いました。
それでは、その知識を元にプロパティの実装を順次行っていきましょう。
ValueU16プロパティ(AXレジスタ)の実装
ValueU16
プロパティとしてAXレジスタを実装します。
ポイントは、VBでは16進の値を「&H~」で表現することです。例えば、10進数で「15」は、16進では「&HF」と表現します。後は、これまでの説明を参考にロジックを実装していけばよいでしょう。
この記事の目的は、読者の皆さんにバイナリプログラミングを楽しんで頂くことです。答えを先に聞いてしまったら面白さが半減してしまいます。まずは自分で実装してみてください。
その際は、繰り返しテストプログラムを実行して、自分が実装したプログラムが正しいか確認する手順を忘れずに。ValueU16
プロパティに関するエラーが表示されなくなれば成功です。
では、著者の実装例を紹介します。
'16ビットレジスタの値 Public Property ValueU16() As UShort Get Dim val As UShort = CUShort(Me.m_value And &HFFFF) Return val End Get Set(ByVal value As UShort) '以前の値を消す Dim val As UInteger = Me.m_value And &HFFFF0000 '新しい値をセットする Me.m_value = val + value End Set End Property
これでAXレジスタに該当する処理が行えるようになりました。テストプログラムを実行してみてください。ValueU16
プロパティに関するエラーは表示されなくなったはずです。これでテスト成功です。次はValueHighByte
プロパティを実装しましょう。
ValueHighByteプロパティ(AHレジスタ)を実装
ValueHighByte
プロパティとして、AHレジスタを実装します。こちらもこれまでの説明を参考に、まずは自分で考えて実装してみてください。ValueHighByte
プロパティに関するエラーが表示されなくなれば成功です。
著者の実装例を紹介します。
'16ビットレジスタの右半分(high) Public Property ValueHighByte() As Byte Get Dim tmp As UShort = CUShort(Me.m_value And &HFF00) Dim val As Byte = CType((tmp >> 8), Byte) Return val End Get Set(ByVal value As Byte) '以前の値を消す Dim val As ULong = CULng(Me.m_value And &HFFFF00FF) '1ワードの右部分だけ取得する(桁を合わしつつ計算しよう) Dim hi As UShort = CUShort(CUShort(value) << 8) '新しい値をセットする Me.m_value = val + hi End Set End Property
これでAHレジスタに該当する処理が行えるようになりました。テストプログラムを実行してみてください。ValueHighByte
プロパティに関するエラーは表示されなくなったはずです。これでテスト成功です。残りのValueLowByte
プロパティについては宿題とします。記事添付のサンプルファイルに答えが載っていますので、ぜひ挑戦してください。
まとめ
いかがだったでしょうか? バイナリプログラミングには数字を使ったパズルのような面白さがあると筆者は思います。バイナリプログラミングの面白さが少しでも伝わっていれば幸いです。次回はCPUの動作を実装して、画面で確認できるようにする方法を解説しますので、お楽しみに。