# HG changeset patch # User Windel Bouwman # Date 1371074848 -7200 # Node ID d5debbfc02006af332b957ddcda68c11c074b89d # Parent 5e391d9a33819e66cea1801bada4afe1257af4cd Added all 27 core instructions of msp430 diff -r 5e391d9a3381 -r d5debbfc0200 python/asmnodes.py --- a/python/asmnodes.py Sun Jun 09 16:06:49 2013 +0200 +++ b/python/asmnodes.py Thu Jun 13 00:07:28 2013 +0200 @@ -52,6 +52,7 @@ def __init__(self, n): assert type(n) is int self.n = n + self.number = n def __repr__(self): return '{0}'.format(self.n) diff -r 5e391d9a3381 -r d5debbfc0200 python/msp430.py --- a/python/msp430.py Sun Jun 09 16:06:49 2013 +0200 +++ b/python/msp430.py Thu Jun 13 00:07:28 2013 +0200 @@ -1,4 +1,31 @@ from target import Register, Instruction, Target +from asmnodes import ASymbol, ANumber +from ppci import CompilerError +import struct, types + +# Create the target class (singleton): +msp430target = Target("MSP430") + +REGISTER_MODE = 1 +#TODO: add more modes! +IMMEDIATE_MODE = 7 + +# Add a custom operand mapping method: +def mapOp(self, operand): + if type(operand) is ASymbol: + # try to map to register: + regs = {} + for r in self.registers: + regs[r.name] = r + if operand.name in regs: + reg = regs[operand.name] + return MSP430Operand(REGISTER_MODE, reg.num) + elif type(operand) is ANumber: + # Immediate mode: + return MSP430Operand(IMMEDIATE_MODE, operand.number) + raise CompilerError('Cannot map {0}'.format(operand)) + +msp430target.mapOperand = types.MethodType(mapOp, msp430target) # Target description for the MSP430 processor @@ -9,41 +36,263 @@ # 8 bit registers: PCB = MSP430Reg(0, 'r0') +rpc = PCB +r11 = MSP430Reg(11, 'r11') +r12 = MSP430Reg(12, 'r12') r13 = MSP430Reg(13, 'r13') r14 = MSP430Reg(14, 'r14') r15 = MSP430Reg(15, 'r15') +class MSP430Mem: + pass + +msp430target.registers.append(r11) +msp430target.registers.append(r12) +msp430target.registers.append(r13) +msp430target.registers.append(r14) +msp430target.registers.append(r15) + # .. etc #GR8 = RegisterClass((PCB, R15B)) -# Two operand arithmatic instructions: +class MSP430Operand: + def __init__(self, mode, param): + self.mode = mode + self.param = param + def regField(self): + if self.mode == REGISTER_MODE: + return self.param + elif self.mode == IMMEDIATE_MODE: + return rpc.num + def asField(self): + if self.mode == REGISTER_MODE: + return 0 + elif self.mode == IMMEDIATE_MODE: + return 3 + def adField(self): + if self.mode == REGISTER_MODE: + return 0 + elif self.mode == IMMEDIATE_MODE: + raise CompilerError('Cannot use immediate mode for destination operand') + def extraBytes(self): + if self.mode == IMMEDIATE_MODE: + return pack_ins(self.param) + return bytes() + -class TwoOpArith(Instruction): - operands = (MSP430Reg, MSP430Reg) - def __init__(self, op1, op2): +def pack_ins(h): + return struct.pack('