package Ġcom . ky hs ge ek code . dis assembler . dis asm theme Ċ Ċ import Ġandroid . content . Context Ċ import Ġcap stone . Arm 6 4 _ const Ċ import Ġcap stone . Arm _ const Ċ import Ġcap stone . Cap stone Ċ import Ġcap stone . X 8 6 _ const Ċ import Ġcom . ky hs ge ek code . dis assembler . Dis asm Result Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . serialization . Experimental Serialization Api Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . decode From Stream Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ Ċ object ĠColor Helper Ġ{ ĊĠĠĠ Ġprivate Ġval Ġ_ palette Ġ= ĠMutable State Flow ( Palette . Default ) ĊĠĠĠ Ġval Ġpalette Ġ= Ġ_ palette Ġas ĠState Flow < Palette > ĊĊĠĠĠ Ġvar Ġis Updated Color Ġ= Ġfalse ĊĠĠĠ Ġvar Ġarchitecture Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġadd Palette ( palette : ĠPalette ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpa let tes [ palette . name ] Ġ= Ġpalette ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġfun Ġpopulate Pa let tes ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtheme Names Ġ= Ġcontext . assets . list (" themes /") ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . substring Before (". json ") ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( theme Name Ġin Ġtheme Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . assets . open (" themes /$ theme Name . json "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpalette Ġ= ĠJson . decode From Stream < Palette >( it ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġtheme Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpa let tes [ theme Name ] Ġ= Ġpalette ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcombined Ġby ĠOR s Ċ // Ġindex = group _ type Ċ // ĠCommon Ġinstruction Ġgroups Ġ- Ġto Ġbe Ġconsistent Ġacross Ġall Ġarchitectures . Ċ // Ġpublic Ġstatic Ġfinal Ġint ĠCS _ GRP _ INVALID Ġ= Ġ 0 ; Ġ Ġ// Ġun initialized / invalid Ġgroup . Ċ // Ġpublic Ġstatic Ġfinal Ġint ĠCS _ GRP _ JUMP ĠĠĠ Ġ= Ġ 1 ; Ġ Ġ// Ġall Ġjump Ġinstructions Ġ( conditional + direct + indirect Ġjumps ) Ċ // Ġ ĉ public Ġstatic Ġfinal Ġint ĠCS _ GRP _ CALL ĠĠĠ Ġ= Ġ 2 ; Ġ Ġ// Ġall Ġcall Ġinstructions Ċ // Ġ ĉ public Ġstatic Ġfinal Ġint ĠCS _ GRP _ RET ĠĠĠĠ Ġ= Ġ 3 ; Ġ Ġ// Ġall Ġreturn Ġinstructions Ċ // Ġ ĉ public Ġstatic Ġfinal Ġint ĠCS _ GRP _ INT ĠĠĠĠ Ġ= Ġ 4 ; Ġ Ġ// Ġall Ġinterrupt Ġinstructions Ġ( int + syscall ) Ċ // Ġ ĉ public Ġstatic Ġfinal Ġint ĠCS _ GRP _ I RET ĠĠĠ Ġ= Ġ 5 ; Ġ Ġ// Ġall Ġinterrupt Ġreturn Ġinstructions Ċ // Ġ 1 Ġ 2 Ġ 3 Ġ 4 Ġ 5 Ġ 6 Ġ 7 ĊĊĠĠĠ Ġval Ġpa let tes Ġ= ĠHashMap < String , ĠPalette >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput (" Default ", ĠPalette . Default ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Palette ( name : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ palette . value Ġ= Ġpa let tes [ name ] Ġ?: ĠPalette . Default ĊĠĠĠĠĠĠĠ Ġis Updated Color Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠArm 6 4 Call Ins Ġ= Ġset Of ( Arm 6 4 _ const . ARM 6 4 _ INS _ BL , ĠArm 6 4 _ const . ARM 6 4 _ INS _ BR ) ĊĠĠĠ Ġval ĠArm Call Ins Ġ= Ġset Of ( Arm _ const . ARM _ INS _ BL , ĠArm _ const . ARM _ INS _ BL X ) ĊĠĠĠ Ġval ĠArm Push Ins Ġ= Ġset Of ( Arm _ const . ARM _ INS _ PUSH ) ĊĠĠĠ Ġval ĠX 8 6 Push Ins Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ PUSH , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ PUSH AW , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ PUSH AL , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ PUSH F , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ PUSH FD , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ PUSH FQ ĊĠĠĠ Ġ) ĊĠĠĠ Ġval ĠArm Pop Ins Ġ= Ġset Of ( Arm _ const . ARM _ INS _ POP ) ĊĠĠĠ Ġval ĠX 8 6 Pop Ins Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ POP , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ POP AL , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ PO PF , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ POP FD , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ PO PF Q , ĊĠĠĠĠĠĠĠ ĠX 8 6 _ const . X 8 6 _ INS _ POP AW ĊĠĠĠ Ġ) ĊĊĊĠĠĠ Ġfun Ġget Color By Gr ps ( ĊĠĠĠĠĠĠĠ Ġpalette : ĠPalette , ĊĠĠĠĠĠĠĠ Ġgroups : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġgroup _ cnt : ĠInt , ĊĠĠĠĠĠĠĠ Ġid : ĠInt , ĊĠĠĠĠĠĠĠ Ġop codes : ĠByteArray ĊĠĠĠ Ġ): ĠPalette Row Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( architecture ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ ARCH _ ARM Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Arm Call Ins . contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpalette . call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Arm Push Ins . contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpalette . push ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Arm Pop Ins . contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpalette . pop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== ĠArm _ const . ARM _ INS _ BX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" OpCodes : Ġ" Ġ+ ĠArrays . toString ( op codes )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( op codes [ 0 ] Ġ== Ġ 0 x 1 E . to Byte () Ġ&& Ġop codes [ 1 ] Ġ== Ġ 0 xFF . to Byte () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġop codes [ 2 ] Ġ== Ġ 0 x 2 F . to Byte () Ġ&& Ġop codes [ 3 ] Ġ== Ġ 0 xE 1 . to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpalette . ret ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ ARCH _ ARM 6 4 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Arm 6 4 Call Ins . contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpalette . call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ ARCH _ X 8 6 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( X 8 6 Push Ins . contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpalette . push ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( X 8 6 Pop Ins . contains ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpalette . pop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( g Ġin Ġgroups ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ>= Ġgroup _ cnt ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( g . toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ GRP _ INVALID Ġ-> Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ GRP _ JUMP Ġ-> Ġreturn Ġpalette . jmp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ GRP _ CALL Ġ-> Ġreturn Ġpalette . call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ GRP _ RET Ġ-> Ġreturn Ġpalette . ret ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ GRP _ INT Ġ-> Ġreturn Ġpalette . interrupt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCap stone . CS _ GRP _ I RET Ġ-> Ġreturn Ġpalette . interrupt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTim ber . w (" fallback _ color Ġwrong Ġgroup : ($ g )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpalette . default ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Color Row ( palette : ĠPalette , Ġdis asm Result : ĠDis asm Result ?): ĠPalette Row Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( dis asm Result Ġ== Ġnull ) Ġreturn Ġpalette . default ĊĠĠĠĠĠĠĠ Ġreturn Ġget Color By Gr ps ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpalette , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis asm Result . groups , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis asm Result . groups _ count . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis asm Result . id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdis asm Result . bytes ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ