
    g                     >   d Z ddlmZ ddlmZmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZ  ed	           G d
 d                      Z ed	           G d d                      Zeez  e
z  Ze G d d                      Zded         dee         ez  fdZdS )zrThis module is responsible for representing and loading the specific instruction encoding formats for each opcode.    )	dataclass)LiteralSelf)Opcode	ThreeBits)Register)Mnemonic)	TracebackT)frozenc                   4    e Zd ZU ed         ed<   dZeed<   dS )ImmediateType)            sizeFis_relativeN)__name__
__module____qualname__r   __annotations__r   bool     S/media/seanl/Data/Files/Programming/Python/URCL/urclelf/./x86/encoding/encodings.pyr   r   
   s3         
*
Kr   r   c                   0    e Zd ZU dZed         dz  ed<   dS )RegisterSizeN)r          @   r   )r   r   r   r   r   r   r   r   r   r   r      s,         *.D'-
 4
'.....r   r   c                   |    e Zd ZU eed<   eed<   edz  ed<   ee         ed<   e	de
ded         fd	            Zd
 ZdS )InstructionEncodingFormatmnemonicopcodeNopcode_extentionpermitted_operandsencodingbitsr   r    c                 $   t          dd          }d| vrt          j        d|  d          S |                     dd          \  }}d|v rt|                    dd          \  }}t	          |          }|dk    sD|dk    s>|d	k    s8|d
k    s2|dk    s,|dk    s&|dk    s |dk    st          j        d| d|           S nd }t          j        t                              |                    }|                                }|s7t          j        dt          |                                           d          S |^}}t          |          }	g }
|D ]}t          j        |          }|r|
                    |           /|dk    r9|
                    t          |                                r|nd                     n|dk    r#|
                    t          d                     |dk    r#|
                    t          d                     |dk    r#|
                    t          d                     |dk    r$|
                    t          d                     |dk    r%|
                    t          dd                     >|dk    r%|
                    t          d	d                     i|dk    r%|
                    t          dd                     |dk    r%|
                    t          dd                     |d k    r%|
                    t          dd!                     |d"k    r%|
                    t          d	d!                     |d#k    r%|
                    t          dd!                     @|d$k    r%|
                    t          dd!                     k|d%k    rst          j        d&t          |                                           d'| d(          c S t!          |	|||
          S ))NFr   :z
Encoding 'z' is missing ':'r   )maxsplit.r      r            zOpcode 'z' has invalid extention zEncoding of opcode z is missingrr   r8r16r   r32r   r64r    i8i16i32i64rel8Trel16rel32rel64eszUnknown operand for opcode z: '')r   r
   newsplitint
from_bytesbytesfromhexhexr	   r   	from_nameappendr   get_register_size_bitr   r"   )r'   r(   r$   
opcode_strrestopcode_extention_strr%   mnemonic_stroperandsr#   operand_formatsoperandregs                r   from_strz"InstructionEncodingFormat.from_str   s    q!!h=!Hh!H!H!HIII#>>#>::
D*/9/?/?a/?/P/P,J,"#788$))-=-B-BFVZ[F[F[_ost_t_t  yI  MN  yN  yN  Rb  fg  Rg  Rg  k{  @  k@  k@  DT  XY  DY  DY }%f
%f%fTd%f%fggg#"5==#<#<==zz|| 	Y=!WuV}}7H7H7J7J!W!W!WXXX"&xL))-/ !	g !	gG$W--C g&&s++++C&&|F<X<X<Z<Z4aDD`a'b'bccccD&&|A7777E!!&&|B'7'78888E!!&&|B'7'78888E!!&&|B'7'78888D&&}Q'>'>????E!!&&}Q'>'>????E!!&&}Q'>'>????E!!&&}Q'>'>????F""&&}Q'='=>>>>G##&&}Q'='=>>>>G##&&}Q'='=>>>>G##&&}Q'='=>>>>D }%e5==CTCTCVCV%e%e[b%e%e%efffff(6;K_]]]r   c                 L    | j         D ]}t          |t                    r|c S d S )N)r&   
isinstancer   )selfoperand_formats     r   get_immediatez'InstructionEncodingFormat.get_immediateV   sA    "5 	& 	&N.-88 &%%%%&	& 	&r   )r   r   r   r	   r   r   r   listOperandTypestaticmethodstrr   rS   rX   r   r   r   r"   r"      s         NNN$&&&&[))))7^3 7^gfo 7^ 7^ 7^ \7^r& & & & &r   r"   r(   r)   returnc                    | dk    rd}nd}t          |d          5 }|                                                                }g }|D ]r}t                              ||           }t          |t                    r+|}|                    d| d           |c cd d d            S |                    |           s|cd d d            S # 1 swxY w Y   d S )Nr    z./x86/encoding/isa_data_x64.txtz./x86/encoding/isa_data_x86.txtr2   z'x86 ISA data contains an invalid line 'r@   )	openread
splitlinesr"   rS   rU   r
   	elaboraterI   )r(   pathfileformats	encodingsformatr'   errors           r   load_instruction_set_datari   \   sH   rzz00	dC D))++((**57	 	' 	'F099&$GGH(I..   S& S S STTT        X&&&&                 s   A;C$CCCN)__doc__dataclassesr   typingr   r   x86.encoding.machiner   r   x86.registerr   x86.asmr	   rh   r
   r   r   rZ   r"   rY   ri   r   r   r   <module>rp      s   t t ! ! ! ! ! !                 2 2 2 2 2 2 2 2 ! ! ! ! ! !            
$        $/ / / / / / / / ]*X5
D& D& D& D& D& D& D& D&LGFO =V8WZc8c      r   