package Ġio . github . ph ant am anta 4 4 . ko bo i . memory Ċ Ċ import Ġio . github . ph ant am anta 4 4 . ko bo i . util . cons Ċ import Ġio . github . ph ant am anta 4 4 . ko bo i . util . get High Byte Ċ import Ġio . github . ph ant am anta 4 4 . ko bo i . util . get Low Byte Ċ Ċ interface ĠI Memory Area Ġ{ ĊĊĠĠĠ Ġval Ġlength : ĠInt ĊĊĠĠĠ Ġfun Ġread ( addr : ĠInt , Ġdirect : ĠBoolean Ġ= Ġfalse ): ĠByte ĊĊĠĠĠ Ġfun Ġread Short ( addr : ĠInt , Ġdirect : ĠBoolean Ġ= Ġfalse ): ĠShort Ġ= ĠShort . cons ( read ( addr Ġ+ Ġ 1 , Ġdirect ), Ġread ( addr , Ġdirect )) ĊĊĠĠĠ Ġfun Ġread Range ( first Addr : ĠInt , Ġlast Addr : ĠInt ): ĠI Memory Range ĊĊĠĠĠ Ġfun Ġread Length ( first Addr : ĠInt , Ġlength : ĠInt ) Ġ= Ġread Range ( first Addr , Ġfirst Addr Ġ+ Ġlength ) ĊĊĠĠĠ Ġfun Ġwrite ( addr : ĠInt , Ġvar arg Ġvalues : ĠByte , Ġstart : ĠInt Ġ= Ġ 0 , Ġlength : ĠInt Ġ= Ġvalues . size , Ġdirect : ĠBoolean Ġ= Ġfalse ) ĊĊĠĠĠ Ġfun Ġwrite ( addr : ĠInt , Ġvalues : ĠI Memory Range , Ġstart : ĠInt Ġ= Ġ 0 , Ġlength : ĠInt Ġ= Ġvalues . length , Ġdirect : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite ( addr , Ġ* values . toArray (), Ġstart Ġ= Ġstart , Ġlength Ġ= Ġlength , Ġdirect Ġ= Ġdirect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrite ( addr : ĠInt , Ġvalue : ĠShort , Ġdirect : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite ( addr , Ġvalue . get Low Byte (), Ġvalue . get High Byte (), Ġdirect Ġ= Ġdirect ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtype At ( addr : ĠInt ): ĠString ĊĊĠĠĠ Ġfun Ġread Range Direct ( first Addr : ĠInt , Ġlast Addr : ĠInt ): ĠI Memory Range Ġ= ĠDirect Memory Range ( this , Ġfirst Addr , Ġlast Addr ) Ċ Ċ } Ċ Ċ abstract Ġclass ĠDirect Observable Memory Area Ġ: ĠI Memory Area Ġ{ ĊĊĠĠĠ Ġopen Ġvar Ġdirect Observer : ĠID irect Memory Observer Ġ= ĠID irect Memory Observer . No op () Ċ Ċ } Ċ Ċ class ĠDirect Memory Range ( val Ġmemory : ĠI Memory Area , Ġval Ġfirst Addr : ĠInt , Ġlast Addr : ĠInt ) Ġ: ĠI Memory Range Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġlength : ĠInt Ġ= Ġlast Addr Ġ- Ġfirst Addr ĊĊĠĠĠ Ġoverride Ġfun Ġget ( index : ĠInt ): ĠByte Ġ= Ġmemory . read ( first Addr Ġ+ Ġindex , Ġdirect Ġ= Ġtrue ) ĊĊĠĠĠ Ġoverride Ġfun Ġto Array (): ĠByteArray Ġ= ĠByteArray ( length , Ġ:: get ) Ċ Ċ } Ċ Ċ interface ĠI Memory Range Ġ: ĠIterable < Byte > Ġ{ ĊĊĠĠĠ Ġval Ġlength : ĠInt ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠByte ĊĊĠĠĠ Ġfun Ġto Array (): ĠByteArray ĊĊĠĠĠ Ġoverride Ġfun Ġiterator (): ĠByte Iterator Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMemory Range Iterator ( this ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠMemory Range Iterator ( private Ġval Ġrange : ĠI Memory Range ) Ġ: ĠByte Iterator () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġindex : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġindex Ġ< Ġrange . length ĊĊĠĠĠ Ġoverride Ġfun Ġnext Byte (): ĠByte Ġ= Ġrange [ index ++] Ċ Ċ } Ċ Ċ interface ĠID irect Memory Observer Ġ{ ĊĊĠĠĠ Ġfun Ġon Mem Mutate ( addr : ĠInt , Ġlength : ĠInt ) ĊĊĠĠĠ Ġclass ĠNo op Ġ: ĠID irect Memory Observer Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Mem Mutate ( addr : ĠInt , Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNO - OP ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }