package Ġ_ 2 0 1 9 Ċ Ċ import Ġjava . util .* Ċ Ċ class ĠInt code Computer Ġ{ ĊĠĠĠ Ġvar Ġdebug Ġ= Ġfalse ĊĠĠĠ Ġvar Ġprint Out Ġ= Ġtrue ĊĠĠĠ Ġvar Ġlast Output : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġlateinit Ġvar Ġcode : ĠMutable List < Long > ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġpointer Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġlast Pointer Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġinput : Ġ() Ġ-> ĠLong Ġ= Ġ{ Ġthrow ĠRuntimeException (" No Ġinput Ġprovided ") Ġ} ĊĠĠĠ Ġprivate Ġvar Ġop Code : ĠOp Code ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġparam Modes Ġ= ĠarrayOf ( Param Mode . POSITION , ĠParam Mode . POSITION , ĠParam Mode . POSITION ) ĊĠĠĠ Ġprivate Ġvar Ġrelative Base : ĠLong Ġ= Ġ 0 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġparse Code ( code : ĠString ) Ġ= Ġcode . split (',' ). map Ġ{ Ġit . to Long () Ġ}. to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġcode Ġ= Ġmutable ListOf () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( code : ĠString , Ġinput : ĠLong Ġ= Ġ 0 ) Ġ: Ġthis ( parse Code ( code ), Ġinput ) ĊĊĠĠĠ Ġconstructor ( code : ĠMutable List < Long >, Ġinput : ĠLong Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( code , Ġinput ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( code : ĠString , Ġvar arg Ġinput : ĠLong Ġ= Ġlong ArrayOf ( 0 )) Ġ: Ġthis ( parse Code ( code ), Ġ* input ) ĊĊĠĠĠ Ġconstructor ( code : ĠMutable List < Long >, Ġvar arg Ġinput : ĠLong Ġ= Ġlong ArrayOf ( 0 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( code , Ġ* input ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Finished () Ġ= Ġop Code Ġ!= Ġnull Ġ&& Ġop Code !!. is End () ĊĊĠĠĠ Ġfun Ġinit ( code : ĠMutable List < Long >, Ġinput : ĠLong ): ĠInt code Computer Ġ= Ġinit ( code ) Ġ{ Ġinput Ġ} ĊĊĠĠĠ Ġfun Ġinit ( code : ĠMutable List < Long >, Ġvar arg Ġinput : ĠLong ): ĠInt code Computer Ġ= Ġinit ( code , ĠLinkedList ( input . toList ())) ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( code : ĠMutable List < Long >, Ġinput : ĠLinkedList < Long >): ĠInt code Computer Ġ= ĊĠĠĠĠĠĠĠ Ġinit ( code ) Ġ{ Ġinput . remove First () Ġ} ĊĊĠĠĠ Ġfun Ġinit (): ĠInt code Computer Ġ= Ġinit ( code , Ġinput ) ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( code : ĠMutable List < Long >, Ġinput : Ġ() Ġ-> ĠLong ): ĠInt code Computer Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . code Ġ= Ġcode ĊĠĠĠĠĠĠĠ Ġthis . input Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġpointer Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġlast Pointer Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġop Code Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Input ( input : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . input Ġ= Ġ{ Ġinput Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Last Output () Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Output Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Execute () Ġ= Ġcode . isEmpty () Ġ|| Ġis Finished () ĊĊĠĠĠ Ġfun Ġexecute (): ĠInt code Computer Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( can Execute ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! is Finished ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Step () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute Step (): ĠInt code Computer Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( can Execute ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġparam Modes . fill ( Param Mode . POSITION ) ĊĠĠĠĠĠĠĠ Ġval Ġinstruction Ġ= Ġcode [ pointer ]. toString () ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġinstruction . length ĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ<= Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġop Code Ġ= ĠOp Code . from Code ( instruction . toInt ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġop Code Ġ= ĠOp Code . from Code ( instruction . substring ( length Ġ- Ġ 2 ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstruction . substring ( 0 , Ġlength Ġ- Ġ 2 ). reversed (). forEach Indexed Ġ{ Ġindex , Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Modes [ index ] Ġ= ĠParam Mode . values ()[ c . toString (). toInt ()] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Processing Ġindex Ġ$ pointer Ġ-> Ġ$ instruction /$ op Code : Ġ${ getParam Info () }") ĊĠĠĠĠĠĠĠ Ġif Ġ( op Code !!. is End ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġop Code !!. execute ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( last Pointer Ġ== Ġpointer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Infinite Ġloop Ġdetected !") ĊĠĠĠĠĠĠĠ Ġlast Pointer Ġ= Ġpointer ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute ( step Op : ĠInt code Computer . () Ġ-> ĠUnit ): ĠInt code Computer Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! is Finished ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Step () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep Op ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Direct ( index : ĠInt ) Ġ= Ġcode . getOrElse ( index ) Ġ{ Ġ 0 Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġparam Ġat Ġthe Ġlocal Ġinstruction Ġ[ index ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget ( index : ĠInt ) Ġ= Ġparam Modes [ index ]. getValue ( this , Ġget Direct ( pointer Ġ+ Ġindex Ġ+ Ġ 1 )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġ[ value ] Ġto Ġthe Ġposition Ġdefined Ġby Ġthe Ġlocal Ġinstruction Ġ[ index ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset ( index : ĠInt , Ġvalue : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġparam Modes [ index ] ĊĠĠĠĠĠĠĠ Ġval Ġindex To Set At Ġ= Ġmode . getIndex ( this , Ġpointer Ġ+ Ġindex Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( code . size Ġ<= Ġindex To Set At ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeat ( index To Set At Ġ- Ġcode . size Ġ+ Ġ 1 ) Ġ{ Ġcode . add ( 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġcode [ index To Set At ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetNext Input (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġinput () ĊĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Got Ġinput : Ġ$ i ") ĊĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Param Info (): ĠString Ġ= ĠArray ( op Code !!. num Params ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġget Direct ( pointer Ġ+ Ġit Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġreturn @ Array Ġwhen Ġ( param Modes [ it ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParam Mode . POSITION Ġ-> Ġ" ($ value - P >${ get Direct ( value . toInt ()) })" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParam Mode . IM MEDI ATE Ġ-> Ġ" ($ value )" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParam Mode . REL ATIVE Ġ-> Ġ" ($ value - R >${ get Direct (( relative Base Ġ+ Ġvalue ). toInt ()) })" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. join ToString () ĊĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġprivate Ġenum Ġclass ĠOp Code ( val Ġcode : ĠInt , Ġval Ġnum Params : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠADD ( 1 , Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 0 Ġ= Ġget ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġget ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġv 0 Ġ+ Ġv 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( 2 , Ġr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ADD : Ġ$ v 0 Ġ+ Ġ$ v 1 Ġ= Ġ$ r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠM ULT ( 2 , Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 0 Ġ= Ġget ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġget ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġv 0 Ġ* Ġv 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( 2 , Ġr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" MULT : Ġ$ v 0 Ġ* Ġ$ v 1 Ġ= Ġ$ r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠIN ( 3 , Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( 0 , ĠgetNext Input ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" IN : Ġ${ get ( 0 )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠOUT ( 4 , Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Output Ġ= Ġget ( 0 ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( print Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Output Ġ($ pointer ): Ġ$ last Output ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠJ UMP _ IF _ NOT _ 0 ( 5 , Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get ( 0 ) Ġ!= Ġ 0 . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ= Ġget ( 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" JUMP _ IF _ NOT _ 0 : Ġ$ pointer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠJ UMP _ IF _ 0 ( 6 , Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get ( 0 ) Ġ== Ġ 0 . to Long ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ= Ġget ( 1 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" JUMP _ IF _ 0 : Ġ$ pointer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠL ESS _ THAN ( 7 , Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 0 Ġ= Ġget ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġget ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr : ĠLong Ġ= Ġif Ġ( get ( 0 ) Ġ< Ġget ( 1 )) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( 2 , Ġr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" LESS _ THAN : Ġ$ v 0 Ġ< Ġ$ v 1 Ġ= Ġ$ r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠEQUAL S ( 8 , Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 0 Ġ= Ġget ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 1 Ġ= Ġget ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr : ĠLong Ġ= Ġif Ġ( get ( 0 ) Ġ== Ġget ( 1 )) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( 2 , Ġr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" EQUAL S : Ġ$ v 0 Ġ== Ġ$ v 1 Ġ= Ġ$ r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠREL ATIVE _ BASE _ OFFSET ( 9 , Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 0 Ġ= Ġget ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbefore Ġ= Ġrelative Base ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Base Ġ+= Ġv 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( debug ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" REL ATIVE _ BASE _ OFFSET : Ġ$ before Ġ+ Ġ$ v 0 Ġ= Ġ$ relative Base ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . execute ( computer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠEND ( 9 9 , Ġ 0 ); ĊĊĠĠĠĠĠĠĠ Ġfun Ġis End () Ġ= Ġthis Ġ== ĠEND ĊĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġexecute ( computer : ĠInt code Computer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomputer . pointer Ġ+= Ġnum Params Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval ĠVALUES _ MAP Ġ= Ġvalues (). associate By Ġ{ Ġit . code Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Code ( op Code : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVALUES _ MAP [ op Code ] Ġ?: Ġthrow ĠRuntimeException (" OpCode Ġdoesn 't Ġexist Ġfor Ġcode Ġ$ op Code ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠParam Mode Ġ{ ĊĠĠĠĠĠĠĠ ĠPOSITION Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( computer : ĠInt code Computer , Ġvalue : ĠLong ): ĠLong Ġ= Ġcomputer . get Direct ( value . toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Index ( computer : ĠInt code Computer , Ġindex : ĠInt ): ĠInt Ġ= Ġcomputer . get Direct ( index ). toInt () ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠIM MEDI ATE Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( computer : ĠInt code Computer , Ġvalue : ĠLong ): ĠLong Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Index ( computer : ĠInt code Computer , Ġindex : ĠInt ): ĠInt Ġ= Ġcomputer . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Can 't Ġuse ĠIM MEDI ATE Ġmode Ġfor Ġset Ġoperation Ġat Ġ$ pointer :$ op Code Ġ-> Ġ${ getParam Info () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠREL ATIVE Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue ( computer : ĠInt code Computer , Ġvalue : ĠLong ): ĠLong Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomputer . run Ġ{ Ġget Direct (( relative Base Ġ+ Ġvalue ). toInt ()) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Index ( computer : ĠInt code Computer , Ġindex : ĠInt ): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( computer . relative Base Ġ+ Ġcomputer . get Direct ( index )). toInt () ĊĠĠĠĠĠĠĠ Ġ}; ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun ĠgetValue ( computer : ĠInt code Computer , Ġvalue : ĠLong ): ĠLong ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġget Index ( computer : ĠInt code Computer , Ġindex : ĠInt ): ĠInt ĊĠĠĠ Ġ} Ċ } Ċ