All pastes #808172 Raw Edit

Stuff

public python v1 · immutable
·published 2007-12-07 10:35 UTC
rendered paste body
import clrclr.AddReferenceByPartialName('System')from System.CodeDom import *from System.CodeDom.Compiler import CodeDomProvider, CodeGeneratorOptionsfrom System.IO import StringWriterimport System.Stringfrom Decoder import Decoderdef 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 handle(self, addr, inst):		dec = self.decoder.decode(inst)				if dec[0] in self.handlers:			handler, branch = self.handlers[dec[0]]			return handler(*dec), branch		else:			raise DecompilerError('No handler for %r', dec)		def decompile(self, memory, addr)		method = CodeMemberMethod()		method.Name = 'Decompiled'		method.ReturnType = CodeTypeReference(System.String)		method.Attributes = MemberAttributes.Public				end = False		while not end:			inst = struct.unpack(self.endian + 'L', memory[addr:addr+4])			stmts, end = self.handle(addr, inst)			for stmt in stmts:				method.Statements.Add(stmt)				provider = CodeDomProvider.CreateProvider('CSharp')		options = CodeGeneratorOptions()		options.BracingStyle = 'Block'		writer = StringWriter()		provider.GenerateCodeFromMember(method, writer, options)		print writer.ToString()		writer.Close()		@Opcode(14)	def addi(self, OPCD, D, A, SIMM):		return CodeCommentStatement('addi %i, %i, 0x%04x' % (D, A, SIMM))