package Ġcom . so y wiz . k ps pe mu . cpu . assembler Ċ Ċ import Ġcom . so y wiz . k orge . util .* Ċ import Ġcom . so y wiz . kor io . error .* Ċ import Ġcom . so y wiz . kor io . stream .* Ċ import Ġcom . so y wiz . k ps pe mu . cpu .* Ċ import Ġkotlin . collections . set Ċ Ċ @ Native Thread Local Ċ object ĠAs sembler Ġ: ĠInstruction Decoder () Ġ{ ĊĠĠĠ Ġval Ġmnemonic G pr Ġget () Ġ= ĠC pu State . g pr Infos By Mnemonic ĊĊĠĠĠ Ġfun Ġparse G pr ( str : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( str . startsWith (" r ")) Ġreturn Ġstr . substring ( 1 ). toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġmnemonic G pr [ str ]?. index Ġ?: Ġinvalid Op (" Unknown ĠG PR Ġ$ str ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠString . parseInt ( context : ĠContext ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . labels [ this ]?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġthis . replace ("_ ", Ġ"") ĊĠĠĠĠĠĠĠ Ġif Ġ( str . startsWith (" 0 x ")) Ġreturn Ġstr . substring ( 2 ). toInt ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstr . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassemble Single Int ( str : ĠString , Ġpc : ĠInt Ġ= Ġ 0 , Ġcontext : ĠContext Ġ= ĠContext ()): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġassemble Single ( str , Ġpc , Ġcontext ). value ĊĊĠĠĠ Ġdata Ġclass ĠParsed Instruction ( val Ġstr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġstr . split ( Regex ("\\ s + "), Ġlimit Ġ= Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġname Raw Ġ= Ġparts . getOrElse ( 0 ) Ġ{ Ġ"" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġname Raw . toLowerCase () ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġparts . getOrElse ( 1 ) Ġ{ Ġ"" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġargs Parsed Ġ= Ġargs . trim (). split (',' ). map Ġ{ Ġit . trim () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassemble Single ( str : ĠString , Ġpc : ĠInt Ġ= Ġ 0 , Ġcontext : ĠContext Ġ= ĠContext ()): ĠInstruction Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠParsed Instruction ( str ) ĊĠĠĠĠĠĠĠ Ġval Ġinstruction Ġ= ĠInstructions . instructions ByName [ pi . name ] Ġ?: Ġinvalid Op (" Unknown Ġinstruction Ġ'${ pi . name }' ") ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠInstruction Data ( instruction . vm . value , Ġpc ) ĊĠĠĠĠĠĠĠ Ġval Ġreplacement s Ġ= Ġinstruction . replacement s ĊĠĠĠĠĠĠĠ Ġval Ġformat Regex Ġ= Ġinstruction . format Regex ĊĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġformat Regex . match Ent ire ( pi . args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġinvalid Op ("${ instruction . format } Ġ-> Ġ$ format Regex Ġdoesn 't Ġmatch Ġ${ pi . args }") ĊĠĠĠĠĠĠĠ Ġval Ġresults Ġ= Ġreplacement s . zip ( match . group Values . drop ( 1 )) ĊĠĠĠĠĠĠĠ Ġ// println ( context . labels ) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( pat , Ġvalue ) Ġin Ġresults ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( pat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% s " Ġ-> Ġout . rs Ġ= Ġparse G pr ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% d " Ġ-> Ġout . rd Ġ= Ġparse G pr ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% t " Ġ-> Ġout . rt Ġ= Ġparse G pr ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% a " Ġ-> Ġout . pos Ġ= Ġvalue . parseInt ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% i " Ġ-> Ġout . s _ imm 1 6 Ġ= Ġvalue . parseInt ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% I " Ġ-> Ġout . u _ imm 1 6 Ġ= Ġvalue . parseInt ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% O " Ġ-> Ġout . s _ imm 1 6 Ġ= Ġvalue . parseInt ( context ) Ġ- Ġpc Ġ- Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% j " Ġ-> Ġout . jump _ address Ġ= Ġvalue . parseInt ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġinvalid Op (" Unsupported Ġ$ pat Ġ:: Ġvalue =$ value Ġin Ġinstruction Ġ$ str ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassemble To ( s str : ĠString , Ġout : ĠSync Stream , Ġpc : ĠInt Ġ= Ġout . position . toInt (), Ġcontext : ĠContext Ġ= ĠContext ()): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabel Parts Ġ= Ġs str . split (" :", Ġlimit Ġ= Ġ 2 ). reversed () ĊĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġlabel Parts [ 0 ]. trim () ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġlabel Parts . get OrNull ( 1 )?. trim () ĊĠĠĠĠĠĠĠ Ġif Ġ( label Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . labels [ label ] Ġ= Ġpc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// println ("$ label Ġ-> Ġ${ pc . hex }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// println ("${ pc . hex }: Ġ$ str ") ĊĊĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠParsed Instruction ( str ) ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= Ġout . position ĊĠĠĠĠĠĠĠ Ġwhen Ġ( pi . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNone ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" nop " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write 3 2 _ le ( assemble Single Int (" s ll Ġzero , Ġzero , Ġ 0 ", Ġpc Ġ+ Ġ 0 , Ġcontext )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" li " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreg Ġ= Ġpi . args Parsed [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġpi . args Parsed [ 1 ]. parseInt ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( value Ġ ush r Ġ 1 6 ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write 3 2 _ le ( assemble Single Int (" l ui Ġ$ reg , Ġ${ value Ġ ush r Ġ 1 6 }", Ġpc Ġ+ Ġ 0 , Ġcontext )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write 3 2 _ le ( assemble Single Int (" ori Ġ$ reg , Ġ$ reg , Ġ${ value Ġand Ġ 0 xFFFF }", Ġpc Ġ+ Ġ 4 , Ġcontext )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write 3 2 _ le ( assemble Single Int (" ori Ġ$ reg , Ġr 0 , Ġ${ value Ġand Ġ 0 xFFFF }", Ġpc Ġ+ Ġ 0 , Ġcontext )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . write 3 2 _ le ( assemble Single Int ( str , Ġpc , Ġcontext )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġout . position ĊĠĠĠĠĠĠĠ Ġval Ġwritten Ġ= Ġ( end Ġ- Ġstart ). toInt () ĊĠĠĠĠĠĠĠ Ġ// println (" ĠĠ Ġ: Ġ$ written Ġ(${ pi . name }) ") ĊĠĠĠĠĠĠĠ Ġreturn Ġwritten ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠContext Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabels Ġ= ĠLinkedHashMap < String , ĠInt >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassemble To ( lines : ĠList < String >, Ġout : ĠSync Stream , Ġpc : ĠInt Ġ= Ġout . position . toInt (), Ġcontext : ĠContext Ġ= ĠContext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġc pc Ġ= Ġpc ĊĠĠĠĠĠĠĠ Ġfor Ġ( line Ġin Ġlines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . isEmpty ()) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc pc Ġ+= Ġassemble To ( line , Ġout , Ġc pc , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassemble ( lines : ĠList < String >, Ġpc : ĠInt Ġ= Ġ 0 , Ġcontext : ĠContext Ġ= ĠContext ()): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMemory Sync Stream To ByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassemble To ( lines , Ġthis , Ġpc , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġassemble ( var arg Ġlines : ĠString , Ġpc : ĠInt Ġ= Ġ 0 , Ġcontext : ĠContext Ġ= ĠContext ()): ĠByteArray Ġ= ĊĠĠĠĠĠĠĠ Ġassemble ( lines . toList (), Ġpc Ġ= Ġpc , Ġcontext Ġ= Ġcontext ) Ċ }