All pastes #808183 Raw Edit

Stuff

public python v1 · immutable
·published 2007-12-07 11:02 UTC
rendered paste body
import clrclr.AddReferenceByPartialName('System')from System.CodeDom import *from System.CodeDom.Compiler import CodeDomProvider, CodeGeneratorOptionsfrom System.IO import StringWriterimport System.String, System.Int16from Decoder import Decoderimport structdef Opcode(OPCD, XO=0, branch=False):	def sub(func):		func.opcode = OPCD | (XO << 6)		func.branch = branch		return func	return subclass Decompiler(object):	def __init__(self):		self.endian = '>'		self.decoder = Decoder()				self.handlers = {}		for name in dir(self):			attr = getattr(self, name)						if hasattr(attr, 'opcode'):				self.handlers[attr.opcode] = attr, attr.branch			def decompile(self, addr, memory):		method = CodeMemberMethod()		method.Name = 'Decompiled'		method.ReturnType = CodeTypeReference(System.String)		method.Attributes = MemberAttributes.Public				end = False		while not end:			try:				inst, = struct.unpack(self.endian + 'L', memory[addr:addr+4])			except (IndexError, struct.error):				break			stmts, end = self.handle(addr, inst)			for stmt in stmts:				method.Statements.Add(stmt)			addr += 4				provider = CodeDomProvider.CreateProvider('CSharp')		options = CodeGeneratorOptions()		options.BracingStyle = 'Block'		writer = StringWriter()		provider.GenerateCodeFromMember(method, writer, options)		print writer.ToString()		writer.Close()		def handle(self, addr, inst):		dec = self.decoder.decode(inst)				if dec[0] in self.handlers:			handler, branch = self.handlers[dec[0]]			return handler(addr, *dec), branch		else:			raise DecompilerError('No handler for %r', dec)		def SIMM(self, SIMM):		if SIMM & 0x8000:			return 0x10000 - SIMM		else:			return SIMM		@Opcode(14)	def addi(self, addr, OPCD, D, A, SIMM):		yield CodeCommentStatement('addi r%i, r%i, 0x%04x' % (D, A, SIMM))				D = CodeVariableReferenceExpression('r%i' % D)		if A == 0:			yield CodeAssignStatement(D, CodePrimitiveExpression(System.Int16(self.SIMM(SIMM))))		else:			A = CodeVariableReferenceExpression('r%i' % A)			math = CodeBinaryOperatorExpression(				A,				CodeBinaryOperatorType.Add,				CodePrimitiveExpression(System.Int16(self.SIMM(SIMM)))			)			yield CodeAssignStatement(D, math)if __name__=='__main__':	decompiler = Decompiler()	decompiler.decompile(0, '\xde\xad\x39\x0e\xba\xbe\x02\x4e')