B
    ֳac)                 @   s   d dl T G dd dZdS )    )*c               @   s   e Zd Zd9d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 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/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8S ):
PythonEmitFc             C   s6   || _ || _|| _|| _dg| _g | _i | _d| _d S )NSPa  RAM = {}
ROM = {}
IP = 0
HALT = False
BREAK = False
STEP = False
STACK = []
ERR_UNDERFLOW = ValueError("Stack underflow occured.")

def Get(addr):
	global RAM
	global STACK
	if addr < 0:
		if (-addr - 1) < len(STACK):
			return STACK[-addr - 1]
		else:
			return 0
	elif addr in RAM:
		return RAM[addr]
	else:
		return 0

def Set(addr, value):
	global RAM
	global STACK
	if addr < 0:
		while (-addr - 1) >= len(STACK):
			STACK += [0]
		STACK[-addr - 1] = value
	else:
		RAM[addr] = value

def Execute():
	global ROM
	global IP
	global HALT
	global BREAK
	global STEP

	BREAK = False
	while not HALT:
		if not IP in ROM:
			raise ValueError("Instruction pointer is out of bounds.")
		ROM[IP]()
		IP += 1
		if STEP or BREAK:
			return

)PrintURCLToConsolePrintRegisterStatesToConsole
SingleStepUseDebugger	Registers_LocalRegistersLabelsSource)selfuseDebuggerZprintURCLToConsoleZprintRegisterStatesToConsoleZ
singleStep r   P/mnt/chromeos/GoogleDrive/MyDrive/Programming/Python/URCL/URCL-Toolkit/urclpy.py__init__   s    "zPythonEmit.__init__c             C   s,   |d krdS t |}t|dko*|d dkS )NFr   .)strlen)r   valuer   r   r   IsLabel0   s    zPythonEmit.IsLabelc             C   sf   t |}|d krdS |dkrZt|dkrZ|d dkrZyt|dt| }dS    dS n|dkS d S )NFR0r   R   Tr   )r   r   int)r   r   r   r   r   
IsRegister6   s     zPythonEmit.IsRegisterc             C   s   |  |jr*|j| jkr*|  j|jg7  _|  |jrT|j| jkrT|  j|jg7  _|  |jr~|j| jkr~|  j|jg7  _d S )N)r   OperandAr	   OperandBOperandC)r   instr   r   r   IncludeInstructionRegistersC   s    z&PythonEmit.IncludeInstructionRegistersc             C   s   d|dt |  S )NZLABEL_r   )r   )r   labelr   r   r   GetLabelNameK   s    zPythonEmit.GetLabelNamec             C   s    t |ddddddS )N\z\\"z\"
z\n)r   replace)r   textr   r   r   	StringifyN   s    zPythonEmit.Stringifyc             C   sb   t |dkrT| |r<|  j| |d t| d 7  _q^| dt| d  n
| d d S )Nr   z = r%   r$   z" is not a valid label.zEmpty label was ignored.)r   r   r   r"   r   	EmitErrorEmitWarning)r   r!   positionr   r   r   EmitLabelCodeQ   s
    
&zPythonEmit.EmitLabelCodec             C   s   |  j dt| d 7  _ d S )Nz	raise r%   )r   r   )r   Zexr   r   r   EmitExceptionZ   s    zPythonEmit.EmitExceptionc             C   s~   ||kr<|  j dt| d t| d t| d 7  _ n>|  j dt| d t| d t| d t| d 7  _ d S )N	 z= r%   z = )r   r   )r   targetaopbr   r   r   EmitOperation]   s    4zPythonEmit.EmitOperationc             C   s   |  ||d| d S )N )r4   )r   r0   sourcer   r   r   EmitAssignmentc   s    zPythonEmit.EmitAssignmentc             C   s6   |  j dt| d t| d t| d 7  _ d S )Nz	if r/   z:
	)r   r   )r   r1   r2   r3   r   r   r   EmitConditionalf   s    zPythonEmit.EmitConditionalc             C   s"   |  ||| | d|dd d S )NIP-r   )r8   r4   )r   r0   r1   r2   r3   r   r   r   
EmitBranchi   s    zPythonEmit.EmitBranchc             C   s*   |  j dt| d t| d 7  _ d S )Nr.   z = Get(z)
)r   r   )r   r0   addressr   r   r   EmitLoadm   s    zPythonEmit.EmitLoadc             C   s*   |  j dt| d t| d 7  _ d S )Nz	Set(z, z)
)r   r   )r   r<   r6   r   r   r   	EmitStorep   s    zPythonEmit.EmitStorec             C   s*   |  j dt| d t| d 7  _ d S )Nz	Set(z, Get(z))
)r   r   )r   r0   r6   r   r   r   EmitCopys   s    zPythonEmit.EmitCopyc             C   s    |  dddd | d| d S )Nr   r:   r   )r4   r>   )r   r6   r   r   r   EmitPushv   s    zPythonEmit.EmitPushc             C   s8   |  ddd | d | |d | dddd d S )Nr   z>=r   ERR_UNDERFLOW+r   )r8   r-   r=   r4   )r   r0   r   r   r   EmitPopz   s    
zPythonEmit.EmitPopc             C   s2   |  |r| | |  jdt| d 7  _d S )Nz	global r%   )r   UseRegisterr   r   )r   r0   r   r   r   
EmitGlobal   s    

zPythonEmit.EmitGlobalc             C   s    |  j d| | d 7  _ d S )Nz	print("z")
)r   r(   )r   r'   r   r   r   	EmitPrint   s    zPythonEmit.EmitPrintc             C   s,   |  j d| | d t| d 7  _ d S )Nz	print("z = " + str(z))
)r   r(   r   )r   r6   r   r   r   EmitPrintValue   s    zPythonEmit.EmitPrintValuec             C   s*   |  j dt| d 7  _ td|  d S )Nz
#WARNING: r%   z	WARNING: )r   r   print)r   r'   r   r   r   r*      s    zPythonEmit.EmitWarningc             C   s*   |  j dt| d 7  _ td|  d S )Nz#ERROR: r%   zERROR: )r   r   rH   )r   r'   r   r   r   r)      s    zPythonEmit.EmitErrorc             C   s
   g | _ d S )N)r
   )r   r   r   r   ClearRegisters   s    zPythonEmit.ClearRegistersc             C   s   || j kr|  j |g7  _ d S )N)r
   )r   regr   r   r   rD      s    
zPythonEmit.UseRegisterc             C   sP   |  |r | | | | n,| |r@| |}| | n|tkrLd}|S )Nr   )r   rE   rD   r   r"   ZERO)r   Zoperandr   r   r   ResolveOperand   s    



zPythonEmit.ResolveOperandc       
      C   s  |    t|}|  jdt| d 7  _| jrB| dt|  | |j|_| |j|_| |j|_| j	rt
| jdkr| d x| jD ]}| | qW | jr|  jd7  _|j}|jd k}|jd ko|jd k}|jd ko|jd ko|jd k}|jd ko|jd ko|jd k}	|r|tkr.n|tkrP| d | dd nb|tkrr| d	 | d	d n@|tkr| d
 | d | d
 n| dt| d  n|r|tkr| d | |j n|tkr
| d | d | |j nz|tkr2| d
 | d
|jdd nR|tkrn| d
 | d | d
 | d
|jdd n| dt| d  n|r(|tkr| |j|j q|tkr|  |j|j q|t!ks|t"kr| |j|jd|j q|t#kr| |j|jdd q|t$kr:| |j|jdd n|t%krZ| |j|jdd n|t&krz| |j|jdd n|t'kr| |jdt|j  n|t(kr| d
 | )|j|jdd n\|t*kr| d
 | )|j|jdd n2|t+kr| ,|j|j n| dt| d  nf|	rx|t-krR| |j|jd|j q|t.krv| |j|jd|j q|t/kr| |j|jd|j q|t0kr| |j|jd|j q|t1kr| |j|jd|j q|t2kr| |j|jd|j q|t3kr*| |j|jd|j q|t4krN| |j|jd|j q|t5krr| |j|jd|j q|t6kr| |j|jd|j n|t7kr| )|j|jd|j n|t8kr| )|j|jd|j n|t9kr| )|j|jd |j n||t:kr| )|j|jd!|j nZ|t;kr>| )|j|jd"|j n8|t<kr`| )|j|jd#|j n| dt| d$  n| d%t| d&  | j	rt
| jdkr| d' x| jD ]}| | qW |  jd(t| d) | =| d* t| d+ t| d, 7  _d S )-Nz	def INST_z():
r%   r   zPre-operation registers:z$	input("Press enter to execute...")
ZHALTTrueZBREAKr9   r   r$   z" does not take zero operands.rA   r:   r   z" does not take one operand.r5   z<<z>>rB   ~z==z!=z" does not take two operands.r   z//%&|^<>z<=z>=z" does not take three operands.zInvalid instruction "z".zPost-operation registers:z	return
INST_z.Source = "z"
ROM[z	] = INST_z

)>rI   r   r   r   rF   rL   r   r   r   r   r   r
   rG   r   	OperationNOPHLTrE   r7   BRKRETrC   r)   PSHr@   POPJMPr4   CALLODr=   STRr>   MOVIMMLSHRSHINCDECNOTBRZr;   BNZCPYr?   ADDSUBMLTDIVMODANDORXORBSLBSRBREBNEBRLBRGBLEBGEr(   )
r   r   r+   ZoriginalSourcerJ   r2   ZisZeroOperandZisOneOperandZisTwoOperandZisThreeOperandr   r   r   EmitInstructionCode   s    

"















































zPythonEmit.EmitInstructionCodec             C   s   x|j D ]}| | qW x$| jD ]}|  jt|d 7  _q"W x.|jD ]$}x|j| D ]}| || qXW qHW |  jd7  _x(tt|j D ]}| 	|j | | qW | j
r| jS | jd S d S )Nz = 0
r%   z	Execute())Instructionsr    r	   r   r   r   r,   ranger   rz   r   )r   emitterr   rJ   r+   r!   r   r   r   Emit)  s    zPythonEmit.EmitN)FFFF)__name__
__module____qualname__r   r   r   r    r"   r(   r,   r-   r4   r7   r8   r;   r=   r>   r?   r@   rC   rE   rF   rG   r*   r)   rI   rD   rL   rz   r~   r   r   r   r   r      s8   
,	 r   N)urclr   r   r   r   r   <module>   s   