hello, みんな元気かい?
今日こそ僕はメモリアクセス機能を実装するぞ。
えっと・・・CPUオブジェクトにメモリーフィールドを宣言して・・・
インドリィちゃん「それキャッシュメモリ」
インドリ「え?何ドリィちゃん。」
インドリィちゃん「メモリはCPUの外!」
インドリ「そんな細かい事いいん」(途中でさえぎられる)
インドリィちゃん「いい加減なのは嫌い。」
インドリは何でそこまで現実を反映せねばならないのか大いに疑問だったが、何時もの様にドリィちゃんに押し切られた。
インドリ「うーん。あまり複雑化したくなかったけど、仕方がない
Machineクラスを作るよ。もうやけだ。」
インドリィちゃん「当然よ。」
インドリ「Machineクラスにメモリフィールドをひとまずbyte配列で設定しよう。」
インドリィちゃん「今のところはそれで許してあげる。」
private byte[] memory;
インドリ「肝心なメモリへデータを転送したり、メモリのデータをレジスタに設定するのは・・・イベントにしよう。」
ということで、インドリはメモリに関するイベントを扱うためのオブジェクトを定義した。
public class MemoryAccessEventArgs : EventArgs
{
//アクセスするメモリのアドレス
private uint start;
public uint StartAddress {
get { return start; }
set { start = value; }
}
//データの長さ(例:4バイト、2バイトなど)
private byte length;
public byte DataLength {
get { return length; }
set { length = value; }
}
//データの値
private ValueType value;
public ValueType Value {
get { return this.value; }
set { this.value = value; }
}
public MemoryAccessEventArgs(
uint startAddress, byte dataLength, ValueType value )
{
this.start = startAddress;
this.length = dataLength;
this.value = value;
}
}
インドリ「ふぅー。よし続けてCPUオブジェクトへイベントを実装だ。とぅー。」
public delegate void MemoryAccessEventHandler
( object sender, TEventArgs e ) where TEventArgs : EventArgs;
//データを送るためのイベント
public event MemoryAccessEventHandler SendDataEvent;
private void OnSendDataEvent( MemoryAccessEventArgs e ) {
MemoryAccessEventHandler temp = SendDataEvent;
if ( temp != null ) temp( this, e );
}
private void SendData( uint startAddress, byte dataLength, ValueType value ) {
MemoryAccessEventArgs e =
new MemoryAccessEventArgs( startAddress, dataLength, value );
OnSendDataEvent( e );
}
//データを受信したい旨を伝えるイベント
public event MemoryAccessEventHandler ReceivesDataEvent;
private void OnReceivesDataEvent( MemoryAccessEventArgs e ) {
MemoryAccessEventHandler temp = SendDataEvent;
if ( temp != null ) temp( this, e );
}
MemoryAccessEventArgs e =
new MemoryAccessEventArgs( startAddress, dataLength, value );
OnSendDataEvent( e );
}
インドリィちゃん「どうやってメモリデータをもらうの?」
鶴の一言で、さらにインドリはMachineクラスにも次のコードを実装した。
public delegate void MemoryAccessEventHandler
( object sender, TEventArgs e ) where TEventArgs : EventArgs;
//データを送るためのイベント
public event MemoryAccessEventHandler SendDataEvent;
private void OnSendDataEvent( MemoryAccessEventArgs e ) {
MemoryAccessEventHandler temp = SendDataEvent;
if ( temp != null ) temp( this, e );
}
private void SendData( uint startAddress, byte dataLength, ValueType value ) {
MemoryAccessEventArgs e =
new MemoryAccessEventArgs( startAddress, dataLength, value );
OnSendDataEvent( e );
}
あと他にも、互いにイベントの通知を受けるための作業と、実際にメモリ操作するためのプログラムが必要だが・・・
インドリ「頭使いすぎた、もうだめ・・・」(パタ)
インドリィちゃん「もぅ、だらしないわねぇ。」
インドリが倒れたから次回へ続く・・・
程々にご期待ください。
ではまた明日会いましょう。
テーマ : プログラミング
ジャンル : コンピュータ