package Ġl un ar . vm . program Ċ Ċ import Ġio . lun arch ain . lun ar coin . util . Byte Util . EMPTY _ BYTE _ ARRAY Ċ import Ġio . lun arch ain . lun ar coin . util . Byte Util . one Byte To HexString Ċ import Ġl un ar . vm . Data Word Ċ import Ġl un ar . vm . program . listener . Program Listener Ċ import Ġl un ar . vm . program . listener . Program Listener Aware Ċ import Ġjava . lang . Math . ceil Ċ import Ġjava . lang . Math . min Ċ import Ġjava . lang . String . format Ċ import Ġjava . util .* Ċ Ċ class ĠMemory : ĠProgram Listener Aware Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠCH UNK _ SIZE Ġ= Ġ 1 0 2 4 ĊĠĠĠ Ġprivate Ġval ĠWORD _ SIZE Ġ= Ġ 3 2 ĊĊĠĠĠ Ġprivate Ġval Ġchunks Ġ= ĠLinkedList < ByteArray >() ĊĠĠĠ Ġprivate Ġvar Ġsoft Size : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġprogram Listener : ĠProgram Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġset Program Listener ( listener : ĠProgram Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . program Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread ( address : ĠInt , Ġsize : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ<= Ġ 0 ) Ġreturn ĠEMPTY _ BYTE _ ARRAY ĊĊĠĠĠĠĠĠĠ Ġextend ( address , Ġsize ) ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( size ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġchunk Index Ġ= Ġaddress Ġ/ ĠCH UNK _ SIZE ĊĠĠĠĠĠĠĠ Ġvar Ġchunk Offset Ġ= Ġaddress Ġ% ĠCH UNK _ SIZE ĊĊĠĠĠĠĠĠĠ Ġvar Ġto Grab Ġ= Ġdata . size ĊĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( to Grab Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied Ġ= Ġgrab Max ( chunk Index , Ġchunk Offset , Ġto Grab , Ġdata , Ġstart ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġnext Ġchunk Ġfrom Ġthe Ġstart ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ chunk Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Offset Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmark Ġrem ind ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Grab Ġ-= Ġcopied ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ+= Ġcopied ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite ( address : ĠInt , Ġdata : ĠByteArray , Ġdata Size : ĠInt , Ġlimited : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdata Size Ġ= Ġdata Size ĊĊĠĠĠĠĠĠĠ Ġif Ġ( data . size Ġ< Ġdata Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Size Ġ= Ġdata . size ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! limited ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextend ( address , Ġdata Size ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġchunk Index Ġ= Ġaddress Ġ/ ĠCH UNK _ SIZE ĊĠĠĠĠĠĠĠ Ġvar Ġchunk Offset Ġ= Ġaddress Ġ% ĠCH UNK _ SIZE ĊĊĠĠĠĠĠĠĠ Ġvar Ġto Capture Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( limited ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Capture Ġ= Ġif Ġ( address Ġ+ Ġdata Size Ġ> Ġsoft Size ) Ġsoft Size Ġ- Ġaddress Ġelse Ġdata Size ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Capture Ġ= Ġdata Size ĊĊĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( to Capture Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaptured Ġ= Ġcapture Max ( chunk Index , Ġchunk Offset , Ġto Capture , Ġdata , Ġstart ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcapture Ġnext Ġchunk ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ chunk Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Offset Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmark Ġrem ind ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Capture Ġ-= Ġcaptured ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ+= Ġcaptured ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprogram Listener ?. on Memory Write ( address , Ġdata , Ġdata Size ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġextend And Write ( address : ĠInt , Ġalloc Size : ĠInt , Ġdata : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġextend ( address , Ġalloc Size ) ĊĠĠĠĠĠĠĠ Ġwrite ( address , Ġdata , Ġdata . size , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġextend ( address : ĠInt , Ġsize : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( size Ġ<= Ġ 0 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Size Ġ= Ġaddress Ġ+ Ġsize ĊĊĠĠĠĠĠĠĠ Ġvar Ġto Allocate Ġ= Ġnew Size Ġ- Ġinternal Size () ĊĠĠĠĠĠĠĠ Ġif Ġ( to Allocate Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Chunks ( ceil ( to Allocate . toDouble () Ġ/ ĠCH UNK _ SIZE ). toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġto Allocate Ġ= Ġnew Size Ġ- Ġsoft Size ĊĠĠĠĠĠĠĠ Ġif Ġ( to Allocate Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Allocate Ġ= Ġceil ( to Allocate . toDouble () Ġ/ ĠWORD _ SIZE ). toInt () Ġ* ĠWORD _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsoft Size Ġ+= Ġto Allocate ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogram Listener ?. on Memory Extend ( to Allocate ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġread Word ( address : ĠInt ): ĠData Word Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠData Word ( read ( address , Ġ 3 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġjust Ġaccess Ġexpecting Ġall Ġdata Ġvalid ĊĠĠĠ Ġfun Ġread Byte ( address : ĠInt ): ĠByte Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġchunk Index Ġ= Ġaddress Ġ/ ĠCH UNK _ SIZE ĊĠĠĠĠĠĠĠ Ġval Ġchunk Offset Ġ= Ġaddress Ġ% ĠCH UNK _ SIZE ĊĊĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= Ġchunks [ chunk Index ] ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchunk [ chunk Offset ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmemory Data Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġfirst Line Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġsecond Line Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsoft Size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġread Byte ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġvalue Ġis ĠASCII ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacter Ġ= Ġif Ġ( 0 x 2 0 . to Byte () Ġ<= Ġvalue Ġ&& Ġvalue Ġ<= Ġ 0 x 7 e . to Byte ()) ĠString ( byte ArrayOf ( value )) Ġelse Ġ" ?" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Line . append ( character ). append ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Line . append ( one Byte To HexString ( value )). append (" Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( i Ġ+ Ġ 1 ) Ġ% Ġ 8 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġformat ("% 4 s ", ĠInteger . toString ( i Ġ- Ġ 7 , Ġ 1 6 )). replace (" Ġ", Ġ" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Data . append (" "). append ( tmp ). append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Data . append ( first Line ). append (" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Data . append ( second Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ+ Ġ 1 Ġ< Ġsoft Size ) Ġmemory Data . append ("\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Line . set Length ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Line . set Length ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmemory Data . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsize (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsoft Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinternal Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchunks . size Ġ* ĠCH UNK _ SIZE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Chunks (): ĠList < ByteArray > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLinkedList ( chunks ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcapture Max ( chunk Index : ĠInt , Ġchunk Offset : ĠInt , Ġsize : ĠInt , Ġsrc : ĠByteArray , Ġsrc Pos : ĠInt ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= Ġchunks [ chunk Index ] ĊĠĠĠĠĠĠĠ Ġval Ġto Capture Ġ= Ġmin ( size , Ġchunk . size Ġ- Ġchunk Offset ) ĊĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( src , Ġsrc Pos , Ġchunk , Ġchunk Offset , Ġto Capture ) ĊĠĠĠĠĠĠĠ Ġreturn Ġto Capture ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgrab Max ( chunk Index : ĠInt , Ġchunk Offset : ĠInt , Ġsize : ĠInt , Ġdest : ĠByteArray , Ġdest Pos : ĠInt ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġchunk Ġ= Ġchunks [ chunk Index ] ĊĠĠĠĠĠĠĠ Ġval Ġto Grab Ġ= Ġmin ( size , Ġchunk . size Ġ- Ġchunk Offset ) ĊĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( chunk , Ġchunk Offset , Ġdest , Ġdest Pos , Ġto Grab ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġto Grab ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Chunks ( num : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġnum ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchunks . add ( ByteArray ( CHUNK _ SIZE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }