
    UHjyD                       d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZmZmZ  e	e      j!                         j,                  d   Zedz  Zd	Zd
ZdZdZdZdZdZdZ dZ!dZ"d"dZ#d"dZ$d#dZ%d$dZ&d%dZ'd&dZ(d'dZ)d(dZ*d)dZ+d*dZ,d+d,dZ-d-dZ.d-dZ/d.dZ0d/d Z1e2d!k(  r e1        yy)0z<Summarize sources for the opcode 0x12 active-selection flag.    )annotationsN)Path)Any)offset_to_varead_sectionsva_to_offset   outmap1_01amap2_02diDwE iIwE i A i_@ i@ i?@ ivE c                    d| dS )N0x08x values    H/home/exedev/hwanse/tools/summarize_save_selector_active_flag_sources.pyhex32r   !       c{    c                    d| dS )Nr   04xr   r   s    r   hex16r   %   r   r   c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     r   	load_jsonr$   )   s*    ;;=::dnngn677r   c                N    | D ]   }|d   }||d   z   }||cxk  r	|k  s|c S  " y )Nrawraw_sizer   )sectionsoffsetsectionstartends        r   section_for_offsetr-   /   sE     gj))F S N !
 r   c                F    t        ||      }||t        |       k\  ry | |   S N)r   len)exer(   var)   s       r   byte_atr3   8   s+    (B'F~3s8+v;r   c           	     V   g }|dk\  rm| |dz
     dv rc| |dz
     }|dk(  r|j                  d       nD|dk(  r|j                  d       n-|dk(  r|j                  d       n|d	k(  r|j                  d
       dD ]I  \  }}}}|t        |      k\  s| |t        |      z
  | |k(  s,|j                  |||t        |      f       K dD ]I  \  }}}}|t        |      k\  s| |t        |      z
  | |k(  s,|j                  |||t        |      f       K |sdd dddS |d   \  }}}}||||dS )Nr	   >               r5   )readr	   zmov al, ds:[addr]r	   r6   )r9      zmov eax, ds:[addr]r	   r7   )writer	   zmov ds:[addr], alr	   r8   )r;   r:   zmov ds:[addr], eaxr	   )
)s   r9   r	   zmov cl, byte ptr ds:[addr])s   r9   r:   zmov ecx, dword ptr ds:[addr])s   r;   r	   zmov byte ptr ds:[addr], cl)s   r;   r:   zmov dword ptr ds:[addr], ecx)s   r9   r	   zmov dl, byte ptr ds:[addr])s   r9   r:   zmov edx, dword ptr ds:[addr])s   r;   r	   zmov byte ptr ds:[addr], dl)s   r;   r:   zmov dword ptr ds:[addr], edx)s   r;   r	   mov byte ptr ds:[addr], imm8)s   r;   r:   zmov dword ptr ds:[addr], imm32))s   fr9      zmov cx, word ptr ds:[addr])s   fr;   r=   zmov word ptr ds:[addr], cxunknownz%unclassified direct address referencer   )
accessKindwidthinstructionprefixLength)appendr0   )	datapos
candidatesopcodeprefixaccessr@   rA   prefix_lengths	            r   classify_direct_refrK   ?   s   J
axDqM%==cAgT>ABt^BCt^BCt^CD/ I*{ #f+$sS['8"="Gvuk3v;GHI/ I*{ #f+$sS['8"="Gvuk3v;GHI #B	
 	
 1;1-FE;"%	 r   c                    t         | cxk  r	t        k  ry t        | cxk  r	t        k  ry t        | cxk  rt        dz   k  ry yy)Nz&opcode 0x12 active-state slot selectorz(opcode 0x13/runtime-slot related handleri  zstartup/runtime init routinezother text routine)OPCODE12_HANDLER_STARTOPCODE13_HANDLER_STARTOPCODE16_HANDLER_STARTSTARTUP_INIT_VA)instruction_vas    r   classify_contextrR   o   sN    H2HH7 IH2HH9 I.B?U+BB- Cr   c                R   g }t        j                  d|      }d}	 | j                  ||      }|dk  rn|dz   }t        ||      }||d   dk7  r5t	        ||      }|Dt        | |      }	||	j                  d      xs dz
  }
d }|	d   dk(  r|d	z   t        |       k  r| |d	z      }|j                  t        |      t        |      t        |
      |	d
   |	d   |	d   ||d|dnd t        |
      |t        cxk  xr ||	d   xs dz   k  nc d
       |j                  d        |S )Nz<Ir   r	   name.textrB   rA   r<   r:   r?   r@   r   02x)

addressHexrefVaHexinstructionVaHexr?   r@   rA   	immediateimmediateHexcontextcoversActiveFlagc                    | d   S )NrY   r   )rows    r   <lambda>z!scan_exact_refs.<locals>.<lambda>   s    c"45 r   )key)structpackfindr-   r   rK   getr0   rC   r   rR   ACTIVE_FLAG_VAsort)r1   r(   addressrowsneedlesearchhitr*   ref_varefrQ   rZ   s               r   scan_exact_refsro   y   s\   D[[w'FF
hhvv&7q$Xs3?gfo8h,>!#s+377>#:#?a@	}!??C!GcRUhDVC!GI.f %n 5l+\}-"4=4Ib30t'7 '> YGs7|GXWX<Y Y
 	! 8 	II5I6Kr   c           	     d   t        d |D              }| |d   |d   |d   z    }g }t        dt        dt        |      dz
              D ]e  }||   dk7  r|d   |z   }t	        j
                  d||d	z         d   }|d
z   |z   }	|	|k7  r?|j                  t        |      t        |	      dd       g |S )Nc              3  2   K   | ]  }|d    dk(  s|  yw)rT   rU   Nr   ).0r*   s     r   	<genexpr>z!scan_call_refs.<locals>.<genexpr>   s     NG76?g3MN   r&   r'   r   r:      r2   z<ir	      z
call rel32)	callVaHextargetVaHexrA   )nextrangemaxr0   rb   unpack_fromrC   r   )
r1   r(   	target_vatextr&   ri   r)   call_vadisplacementactual_targets
             r   scan_call_refsr      s    NxNND
d5k4;j)99
:CD3q#c(Q,/0 v;$t*v%))$VaZ@C!l2I%w /'
 	 Kr   c           
        | j                  d      xs g D ]r  }t        |d   d      }t        |d   d      }||cxk  r	||z   k  s0n 3t        |d   d      |z   |z
  }|d   |d   |d   |d   t        |      t        ||z
        dc S  y )	NsaveReadBlocksrx      sizeHexsaveOffsetHexrw   description)rw   rx   r   r   r   offsetWithinBlockHex)re   intr   )save_loader_trace
runtime_var_   targetsizesave_offsets         r   save_block_for_runtime_var      s     $$%56<" S',3y>2&Z/&4-/c/2B7*DvMK -"=1y>"=1!&{!3(-j6.A(B  r   c                b   t        |       }||nt        t        dz  i       }t        | |t              }g }t        t        t        dz         D ]  }t        | ||      }|j                  t        |      t        |t        z
        t        | ||      dt        | ||      dt        |      t        d |D              t        d |D              |d        |D cg c]  }|d   d	k(  s| }}|D cg c]  }|d   d
k(  s| }	}|D cg c]   }|d   dk(  r|j                  d      dk(  r|" }
}t!        |t              }t#        | |t$              }d}i dt&        dt(        dt        t              dt        | |t              ddt        | |t              dd|d|d udt        t$              dt        |      d|dt        |      dt        |	      dt        |      dt        |
      d|d|dd t+        |
      xr t        | |t              dk(  g d!|d"S c c}w c c}w c c}w )#Nzsave_loader_trace.jsonr	   r   rV   c              3  2   K   | ]  }|d    dk(  sd  yw)r?   r9   r	   Nr   rr   r_   s     r   rs   z build_summary.<locals>.<genexpr>   s     N3#l2Cv2MQNrt   c              3  2   K   | ]  }|d    dk(  sd  yw)r?   r;   r	   Nr   r   s     r   rs   z build_summary.<locals>.<genexpr>   s     PC3|3D3OaPrt   )rW   r   staticInitialBytestaticInitialByteHexrefCount	readCount
writeCountrefsr?   r;   r9   rY   
0x00411306rZ   az  The opcode 0x12 active-selection flag is not an unknown static producer: the executable image initializes 0x00457744 to 1, and startup routine 0x00411300 writes it to 1 via a direct byte store called from 0x00401928. The same byte is also inside the first save-read block at save offset 0x006c, so a loaded save can override the startup/default value. For the current blocker this removes the static-writer mystery around byte(0x00457744), but route promotion is still blocked because the actual runtime/save value, prior selectionBuffer[0x20], secondaryBranchState contents, control path, and strict map1_01a hotspot remain unproven.sourcer   activeFlagVaHexactiveFlagStaticInitialByteactiveFlagStaticInitialByteHexactiveFlagSaveSourceactiveFlagInsideSaveReadBlockstartupInitVaHexstartupInitCallCountstartupInitCallsactiveFlagRefCountactiveFlagReadCountactiveFlagWriteCountactiveFlagInitWriteCountactiveFlagRefsneighborFlagRowspromotionStatusblocked)z^actual loaded-save byte at save offset 0x006c, if a save-load path overwrites startup defaultsz<prior selectionBuffer[0x20] when byte(0x00457744) is nonzeroz/runtime contents of secondaryBranchState[0..11]zIcontrol-flow proof that 0x005428bc reaches the 0x00542b0c frontier readerz5strict source tile coordinate or hotspot for map1_01a)resolvedStaticDefaultremainingUnknowns
conclusion)r   r$   OUTro   rf   rz   NEIGHBOR_STARTNEIGHBOR_ENDrC   r   r   FIRST_SAVE_BLOCK_BASEr3   r0   sumre   r   r   rP   ROUTE_SOURCEROUTE_TARGETbool)r1   r   r(   active_refsneighbor_rowsrh   r   r_   direct_writesdirect_readsinit_writessave_sourcestartup_callsr   s                 r   build_summaryr      s   S!H ( 	s55r: 
 "#x@KM)9: sHg6."7-B#BC!(h!@&(h)H(M$ND	N$NNP4PP	
 		 %0PS3|3D3OSPMP#.NC#l2Cv2MCNLN$!"l2sww{7Kq7P 	K  ,,=~NK"3/BM	, ,, 	50 	&wsHn'M	
 	)BwsHn/UVY.Z*[ 	 	(D)@ 	E/2 	M 2 	M 	c+. 	s<0 	M 2 	#C$4 	+  	M!" 	9#$ "&k!2!bwsHn7]ab7b
 !5 # QNs   H"'H"1H'?H'	%H,c                   | j                  d      xs i }ddd| d    d| d    d| d	    d
d| d    d
d|j                  dd       d|j                  dd       d|j                  dd       dd| d    d| d    d| d    d| d    d| d    dd| d     d!| d"    d#| d$    d
d| d%   dd&dd'd(g}| d)   D ]U  }|j                  d*|d+    d,|d-    d.|d/    d0|d1   |d1   nd d2|j                  d3      xs d d.|d4    d0|d5    d6       W |j                  g d7       | d8   D ]8  }|j                  d*|d+    d,|d    d,|d9    d.|d:    d0|d;    d0|d<    d6       : |j                  g d=       | d>   D ]&  }|j                  d*|d    d,|d?    d.|d5    d6       ( | d>   s|j                  d@       |j                  g dA       |j                  dB | dC   D               |j                  d       dDj                  |      S )ENr   z## Save Selector Active Flag Sources z	- route: r   z -> r   z- active flag: `r   `z- static initial byte: `r   z- save source: `r   -z` via `rw   z` (r   )z- startup init routine: `r   z	` calls: r   z- exact refs: r    (reads r   	, writes r   z- init writes to 1: r   z- resolved static default: r   z- promotion status: `r   r   z## Active Flag ReferenceszN| address | instruction | access | width | immediate | context | instruction |z,| --- | --- | --- | ---: | --- | --- | --- |r   z| `rW   z` | `rY   z` | r?   z | r@   z | `r[   r\   rA   z |)r   z## Neighbor Flag Bytesr   z?| address | save offset | static byte | refs | reads | writes |z(| --- | --- | --- | ---: | ---: | ---: |r   r   r   r   r   )r   z## Startup Init Callsr   z| call | target | instruction |z| --- | --- | --- |r   rx   z| - | - | - |)r   z## Remaining Unknownsr   c              3  &   K   | ]	  }d |   yw)z- Nr   rr   items     r   rs   zmarkdown.<locals>.<genexpr>5  s     F2dVFs   r   
)re   rC   extendjoin)summaryr   linesr_   s       r   markdownr     s@   ++45;K-

GH%&d78+<*=>
7#456a8
"7+K#L"MQO
;???C@AYdfiIjHkknozo~o~  @M  OR  pS  oT  TU  	V
#G,>$?#@	'RhJiIjk
!567xH]@^?__hip  rH  jI  iJ  JK  	L
w'ABCD
%g.E&F%GH
(9 :;1=

#
X6%E( '( 
#l#$E#.@*A)B$s<GXFYY\"7|7s7|SAcggnF]FdadEeei9~c#m"4!5R9	

 
LL   )* 
#l#$E#o*>)?uSI_E`Daae:s3{#3"4CL8I7J"N	


 
LLlm)* bs3{+,E#m2D1ET#mJ\I]]_`ab%&_%	LL23	LLF1D)EFF	LL99Ur   c                   | j                  d      xs i }dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              xs d	}d
j                  d | d   D              }dj                  ddddt        j                  | d          dt        j                  | d          d| d    d| d    d|j                  dd       dd| d    d| d    d | d!    d"| d#    d$| d%    d&| d'    d(| d)    dd*t        j                  | d+          d,d-d.|d/d0d1|d/d2d3|d/d4d5| d6g      S )7Nr   r   c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          d|d   |d   nd	 d
t        j                  |j                  d      xs d	       dt        j                  |d          dt        j                  |d          d  yw)<tr><td><code>rW   </code></td><td><code>rY   </code></td><td>r?   	</td><td>r@   Nr   z</td><td><code>r[   r\   rA   
</td></tr>)htmlescapere   r   s     r   rs   zhtml_page.<locals>.<genexpr><  s       	[[\!234 5[[%7!89: ;{{3|,-. /"7|7s7|SA B[[!8!?C@A B{{3y>*+ ,{{3}-./ 0	s   C Cr   c              3     K   | ]d  }d t        j                  |d          dt        j                  |d          dt        j                  |d          d|d    d|d    d|d	    d
 f yw)r   rW   r   r   r   r   r   r   r   r   r   Nr   r   r   s     r   rs   zhtml_page.<locals>.<genexpr>H  s      
 	[[\!234 5[[_!567 8[[%;!<=> ?:  ;  !< ! "	
s   A*A,r   c           
   3     K   | ]R  }d t        j                  |d          dt        j                  |d          dt        j                  |d          d T yw)r   rw   r   rx   r   rA   r   Nr   r   s     r   rs   zhtml_page.<locals>.<genexpr>S  sj       	[[[!123 4[[]!345 6{{3}-./ 0	s   AAr   z:<tr><td colspan="3">No startup init calls found.</td></tr>r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>Nr   r   s     r   rs   zhtml_page.<locals>.<genexpr>[  s#     `4dkk$/06`s   #%r   zU<!doctype html><meta charset="utf-8"><title>Save Selector Active Flag Sources</title>a(  <style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1120px;margin:24px auto;line-height:1.45}table{border-collapse:collapse;width:100%;margin:16px 0 28px}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}th{background:#202020}code{color:#9bd4ff}</style>z*<h1>Save Selector Active Flag Sources</h1>z
<p>route: r   z -&gt; r   z; active flag <code>r   z</code>; static byte <code>r   z</code>; save offset <code>r   r   z</code>.</p>z<p>startup init <code>r   z</code>; calls r   z; exact refs r   r   r   r   r   z); resolved static default: r   z; promotion status <code>r   z<p>r   z</p>z<h2>Active Flag References</h2>z<table><thead><tr><th>address</th><th>instruction</th><th>access</th><th>width</th><th>immediate</th><th>context</th><th>instruction</th></tr></thead><tbody>z</tbody></table>z<h2>Neighbor Flag Bytes</h2>z<table><thead><tr><th>address</th><th>save offset</th><th>static byte</th><th>refs</th><th>reads</th><th>writes</th></tr></thead><tbody>z<h2>Startup Init Calls</h2>zV<table><thead><tr><th>call</th><th>target</th><th>instruction</th></tr></thead><tbody>z<h2>Remaining Unknowns</h2>z<ul>z</ul>)re   r   r   r   )r   r   ref_rowsr   	call_rowsunknownss         r   	html_pager   :  s   ++45;Kyy  +, H II 
 -.
 
M 		  -.  F 
F  ww`7K^C_``H99a 	s4
T[[!234GDKKPXHY<Z;[[opw  yJ  qK  pL  Lg  ho  pP  hQ  gR  Rm  ny  n}  n}  ~M  OR  nS  mT  T`  	a
 );!< =_WUkMlLmmz  |C  DX  |Y  {Z  Zb  cj  k@  cA  bB  BK  LS  Tj  Lk  Kl  lH  IP  Qh  Ii  Hj  jC  DK  L]  D^  C_  _k  	l
dkk',/016) 	h& 	S%`%
xj)  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz&save_selector_active_flag_sources.jsonFr=   )ensure_asciiindentr   r   r   &save_selector_active_flag_sources.html)mkdir
write_textr   dumpsr   )r   out_dirs     r   write_outputsr   t  se    MM$M.77CC

7q9D@ D  77CCIgDVahCir   c                 j   t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                         }t        |j                  j                               }t        ||j                         t        d|j                  dz          y )Nz--exezHwanse2.exe)typedefaultz	--out-dirz+wrote save selector active flag sources -> r   )argparseArgumentParseradd_argumentr   ROOTr   
parse_argsr   r1   
read_bytesr   r   print)parserargsr   s      r   mainr   }  s    $$&F
dD=4HI
$<DDHH//12G'4<<(	7Go8o7p
qrr   __main__)r   r   returnstr)r"   r   r#   r   r   r   )r(   
list[dict]r)   r   r   dict | None)r1   bytesr(   r   r2   r   r   z
int | None)rD   r   rE   r   r   dict)rQ   r   r   r   )r1   r   r(   r   rh   r   r   r   )r1   r   r(   r   r}   r   r   r   )r   r   r   r   r   r   r/   )r1   r   r   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )3__doc__
__future__r   r   r   r   rb   syspathlibr   typingr   r"   insertr   __file__resolveparentprobe_exe_scene_tablesr   r   r   r   r   r   r   r   rf   r   r   rP   rM   rN   rO   r   r   r   r$   r-   r3   rK   rR   ro   r   r   r   r   r   r   r   __name__r   r   r   <module>r     s   B "     
   3tH~--/667 8 L L H~''*
Ul# # # " 8-` !H("BJ0f7tjs zF r   