package Ġch ol iver . n esp ot . debugger Ċ Ċ import Ġch ol iver . n esp ot . cpu . Opcode Ċ import Ġch ol iver . n esp ot . debugger . Command .* Ċ import Ġch ol iver . n esp ot . debugger . Command . Create Point . Break Ċ import Ġch ol iver . n esp ot . debugger . Command . Create Point . Watch Ċ import Ġch ol iver . n esp ot . debugger . Command . Execute .* Ċ import Ġch ol iver . n esp ot . nes . Jo yp ads Ċ import Ġjava . io . InputStream Ċ Ċ internal Ġclass ĠCommand Parser ( ĊĠ Ġstdin : ĠInputStream , ĊĠ Ġprivate Ġval Ġignore Bl anks : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠ Ġprivate Ġval Ġreader Ġ= Ġstdin . buffered Reader () ĊĊĠ Ġfun Ġnext (): ĠCommand Ġ{ ĊĠĠĠ Ġreturn Ġparse Command ( reader . readLine ()) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġparse Command ( raw : ĠString ?): ĠCommand Ġ{ ĊĠĠĠ Ġif Ġ( raw Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠQu it ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġr Ġ= Ġraw . trim () ĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠ Ġr . isEmpty () Ġ&& Ġ! ignore Bl anks Ġ-> Ġreturn ĠRun Macro ĊĠĠĠĠĠ Ġr . isEmpty () Ġ&& Ġignore Bl anks Ġ-> Ġreturn ĠN op ĊĠĠĠĠĠ Ġr . startsWith ("# ") Ġ-> Ġreturn ĠN op ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtokens Ġ= Ġr . split ("\\ s +". to Regex ()) ĊĊĠĠĠ Ġreturn Ġparse Tokens ( tokens ) Ġ?: ĠError (" Can 't Ġparse : Ġ${ r }") ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġparse Tokens ( tokens : ĠList < String >): ĠCommand ? Ġ{ ĊĠĠĠ Ġfun Ġno Args ( cmd : ĠCommand ) Ġ= Ġif Ġ( tokens . size Ġ== Ġ 1 ) Ġcmd Ġelse Ġnull ĊĊĠĠĠ Ġreturn Ġwhen Ġ( tokens [ 0 ]) Ġ{ ĊĠĠĠĠĠ Ġ" script " Ġ-> Ġno Args ( Script ) ĊĊĠĠĠĠĠ Ġ" rep ", Ġ" repeat " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 , Ġ 2 Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcmd (:: Repeat , Ġtokens [ 1 ]. toInt OrNull (), Ġparse Tokens ( tokens . drop ( 2 ))) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" m ", Ġ" macro " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠRun Macro ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcmd (:: Set Macro , Ġparse Tokens ( tokens . drop ( 1 ))) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" s ", Ġ" step " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠStep ( 1 ) ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġtokens [ 1 ]. toInt OrNull ()?. let (:: Step ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" n ", Ġ" next " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠNext ( 1 ) ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġcmd (:: Next , Ġtokens [ 1 ]. toInt OrNull ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" u ", Ġ" until " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtokens [ 1 ] Ġ== Ġ" n mi " Ġ-> ĠUnt il N mi ĊĠĠĠĠĠĠĠĠĠ Ġtokens [ 1 ] Ġ== Ġ" irq " Ġ-> ĠUnt il I rq ĊĠĠĠĠĠĠĠĠĠ Ġtokens [ 1 ]. startsWith ("+ ") Ġ-> Ġcmd (:: Until Offset , Ġtokens [ 1 ]. remove Prefix ("+ "). toInt OrNull ()) ĊĠĠĠĠĠĠĠĠĠ Ġtokens [ 1 ]. startsWith (" 0 x ") Ġ-> Ġcmd (:: Until , Ġtokens [ 1 ]. to Address OrNull ()) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcmd (:: Until Opcode , Ġtokens [ 1 ]. to Enum OrNull < Opcode >()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" c ", Ġ" cont " Ġ-> Ġno Args ( Continue ) ĊĊĠĠĠĠĠ Ġ" f ", Ġ" finish " Ġ-> Ġno Args ( Finish ) ĊĊĠĠĠĠĠ Ġ" b ", Ġ" break " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠBreak . At Offset ( 0 ) ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtokens [ 1 ]. startsWith ("+ ") Ġ-> Ġcmd ( Break :: At Offset , Ġtokens [ 1 ]. remove Prefix ("+ "). toInt OrNull ()) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcmd ( Break :: At , Ġtokens [ 1 ]. to Address OrNull ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" w ", Ġ" watch " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġcmd (:: Watch , Ġtokens [ 1 ]. to Address OrNull ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" display " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġcmd (:: Create Display , Ġtokens [ 1 ]. to Address OrNull ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠTODO Ġ- Ġclear ĊĊĠĠĠĠĠ Ġ" d ", Ġ" delete " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> ĠDelete Point . All ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġcmd ( Delete Point :: By Num , Ġtokens [ 1 ]. toInt OrNull ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" i ", Ġ" info " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġwhen Ġ( tokens [ 1 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ" s ", Ġ" stats " Ġ-> ĠInfo . Stats ĊĠĠĠĠĠĠĠĠĠ Ġ" r ", Ġ" reg " Ġ-> ĠInfo . Reg ĊĠĠĠĠĠĠĠĠĠ Ġ" b ", Ġ" break " Ġ-> ĠInfo . Break ĊĠĠĠĠĠĠĠĠĠ Ġ" w ", Ġ" watch " Ġ-> ĠInfo . Watch ĊĠĠĠĠĠĠĠĠĠ Ġ" d ", Ġ" display " Ġ-> ĠInfo . Display ĊĠĠĠĠĠĠĠĠĠ Ġ" ram " Ġ-> ĠInfo . Cpu Ram ĊĠĠĠĠĠĠĠĠĠ Ġ" v ram " Ġ-> ĠInfo . P pu Ram ĊĠĠĠĠĠĠĠĠĠ Ġ" pp u " Ġ-> ĠInfo . P pu State ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" p ", Ġ" print " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġcmd ( Info :: Print , Ġtokens [ 1 ]. to Address OrNull ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" xi " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 2 , Ġ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtokens [ 1 ]. to Address OrNull ()?. let Ġ{ Ġpc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠInfo . Inspect Inst ( pc , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġcmd ( Info :: Inspect Inst , Ġpc , Ġtokens [ 2 ]. toInt OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" v ", Ġ" verbosity " Ġ-> Ġno Args ( Toggle Verb osity ) ĊĊĠĠĠĠĠ Ġ" bt ", Ġ" backtrace " Ġ-> Ġno Args ( Info . Back trace ) ĊĊĠĠĠĠĠ Ġ" r ", Ġ" reset " Ġ-> Ġno Args ( Event . Reset ) ĊĠĠĠĠĠ Ġ" n mi " Ġ-> Ġno Args ( Event . N mi ) ĊĠĠĠĠĠ Ġ" irq " Ġ-> Ġno Args ( Event . I rq ) ĊĊĠĠĠĠĠ Ġ" up " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 3 Ġ-> Ġparse Button Args ( tokens , ĠButton :: Up ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" down " Ġ-> Ġwhen Ġ( tokens . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 3 Ġ-> Ġparse Button Args ( tokens , ĠButton :: Down ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ" screen " Ġ-> Ġno Args ( Show Screen ) ĊĊĠĠĠĠĠ Ġ" q ", Ġ" quit " Ġ-> Ġno Args ( Quit ) ĊĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġparse Button Args ( tokens : ĠList < String >, Ġcreate : Ġ( Int , ĠJo yp ads . Button ) Ġ-> ĠButton ): ĠButton ? Ġ= Ġcmd ( ĊĠĠĠ Ġcreate , ĊĠĠĠ Ġtokens [ 1 ]. toInt OrNull ()?. let Ġ{ Ġif Ġ( it Ġ== Ġ 1 Ġ|| Ġit Ġ== Ġ 2 ) Ġit Ġelse Ġnull Ġ}, ĊĠĠĠ Ġtokens [ 2 ]. to Enum OrNull < Jo yp ads . Button >() ĊĠ Ġ) ĊĊĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠE Ġ: ĠEnum < E >> ĠString . to Enum OrNull () Ġ= Ġtry Ġ{ ĊĠĠĠ Ġenum ValueOf < E >( this . toUpperCase ()) ĊĠ Ġ} Ġcatch Ġ(_ : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠ Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠString . to Address OrNull () Ġ= Ġremove Prefix (" 0 x ") ĊĠĠĠ Ġ. toInt OrNull ( 1 6 ) ĊĠĠĠ Ġ? . let Ġ{ Ġif Ġ( it Ġin Ġ 0 x 0 0 0 0 .. 0 xFFFF ) Ġit Ġelse Ġnull Ġ} ĊĊĠ Ġprivate Ġfun Ġ< C Ġ: ĠCommand , ĠT 0 > Ġcmd ( create : Ġ( T 0 ) Ġ-> ĠC , Ġarg 0 : ĠT 0 ?): ĠC ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( arg 0 Ġ!= Ġnull ) Ġcreate ( arg 0 ) Ġelse Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġ< C Ġ: ĠCommand , ĠT 0 , ĠT 1 > Ġcmd ( create : Ġ( T 0 , ĠT 1 ) Ġ-> ĠC , Ġarg 0 : ĠT 0 ?, Ġarg 1 : ĠT 1 ?): ĠC ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( arg 0 Ġ!= Ġnull Ġ&& Ġarg 1 Ġ!= Ġnull ) Ġcreate ( arg 0 , Ġarg 1 ) Ġelse Ġnull ĊĠ Ġ} Ċ } Ċ