diff --git a/mcdp/src/ch/ntb/mcdp/dict/Register.java b/mcdp/src/ch/ntb/mcdp/dict/Register.java new file mode 100644 index 0000000..b1852f7 --- /dev/null +++ b/mcdp/src/ch/ntb/mcdp/dict/Register.java @@ -0,0 +1,32 @@ +package ch.ntb.mcdp.dict; + +public class Register { + + // Register Types + public static String[] types = null; + + public Register(String name, int type, int value, int size, + String description) { + this.name = name; + this.type = type; + this.value = value; + this.size = size; + this.description = description; + } + + public final String name; + + public final int type; + + public final int value; + + public final int size; + + public final String description; + + @Override + public String toString() { + return new String(name + "\t" + types[type] + "\t0x" + + Integer.toHexString(value) + "\t" + size + "\t" + description); + } +} diff --git a/mcdp/src/ch/ntb/mcdp/mc68332/RegisterDict.java b/mcdp/src/ch/ntb/mcdp/dict/RegisterDict.java similarity index 50% rename from mcdp/src/ch/ntb/mcdp/mc68332/RegisterDict.java rename to mcdp/src/ch/ntb/mcdp/dict/RegisterDict.java index c6d6172..075ee70 100644 --- a/mcdp/src/ch/ntb/mcdp/mc68332/RegisterDict.java +++ b/mcdp/src/ch/ntb/mcdp/dict/RegisterDict.java @@ -1,18 +1,14 @@ -package ch.ntb.mcdp.mc68332; +package ch.ntb.mcdp.dict; import java.io.File; import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; +import java.lang.reflect.Constructor; import java.util.Iterator; import java.util.LinkedList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; @@ -21,11 +17,12 @@ import org.w3c.dom.NodeList; import org.xml.sax.ErrorHandler; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; -import org.xml.sax.helpers.DefaultHandler; -public class RegisterDict { +public abstract class RegisterDict { - private static LinkedList registers; + private LinkedList registers; + + private Class regClass; private static final long serialVersionUID = -582382284126896830L; @@ -43,80 +40,41 @@ public class RegisterDict { private static final String REG_ATTR_TYPE = "type"; - private static final String REG_ATTR_OFFSET = "offset"; + private static final String REG_ATTR_VALUE = "value"; private static final String REG_ATTR_SIZE = "size"; - private static final String REG_ATTR_TYPE_CTRLREG = "CtrlReg"; - - private static final String REG_ATTR_TYPE_USERREG = "UserReg"; - - private static final String REG_ATTR_TYPE_SYSREG = "SysReg"; - - static { - registers = new LinkedList(); - - // data registers - add("D0", Register.UserReg, 0x0, 4, "data register 0"); - add("D1", Register.UserReg, 0x1, 4, "data register 1"); - add("D2", Register.UserReg, 0x2, 4, "data register 2"); - add("D3", Register.UserReg, 0x3, 4, "data register 3"); - add("D4", Register.UserReg, 0x4, 4, "data register 4"); - add("D5", Register.UserReg, 0x5, 4, "data register 5"); - add("D6", Register.UserReg, 0x6, 4, "data register 6"); - add("D7", Register.UserReg, 0x7, 4, "data register 7"); - - // address registers - add("A0", Register.UserReg, 0x8, 4, "address register 0"); - add("A1", Register.UserReg, 0x9, 4, "address register 1"); - add("A2", Register.UserReg, 0xA, 4, "address register 2"); - add("A3", Register.UserReg, 0xB, 4, "address register 3"); - add("A4", Register.UserReg, 0xC, 4, "address register 4"); - add("A5", Register.UserReg, 0xD, 4, "address register 5"); - add("A6", Register.UserReg, 0xE, 4, "address register 6"); - add("A7", Register.UserReg, 0xF, 4, "address register 7"); - - // system registers - add("RPC", Register.SysReg, 0x0, 4, "return program counter"); - add("PCC", Register.SysReg, 0x1, 4, - "current instruction program counter"); - add("SR", Register.SysReg, 0xB, 2, "status register"); - add("USP", Register.SysReg, 0xC, 4, "user stack pointer (A7)"); - add("SSP", Register.SysReg, 0xD, 4, "supervisor stack pointer"); - add("SFC", Register.SysReg, 0xE, 4, "source function code register"); - add("DFC", Register.SysReg, 0xF, 4, - "destination function code register"); - add("ATEMP", Register.SysReg, 0x8, 4, "temporary register A"); - add("FAR", Register.SysReg, 0x9, 4, "fault address register"); - add("VBR", Register.SysReg, 0xA, 4, "vector base register"); - - // TODO: remove + protected RegisterDict(String registerClass) { try { - addRegistersFromFile("resources/targets/mc68332/registerDictionary.xml"); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (ParserConfigurationException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch (SAXException e) { - // TODO Auto-generated catch block + this.regClass = Class.forName(registerClass); + } catch (ClassNotFoundException e) { e.printStackTrace(); + System.exit(1); } + this.registers = new LinkedList(); } - private static void add(String name, int type, int addr, int size, + @SuppressWarnings("unchecked") + protected void add(String name, int type, int value, int size, String description) { // remove before add for updates - for (Iterator i = registers.iterator(); i.hasNext();) { - if (i.next().name.equals(name)) { + for (Iterator i = registers.iterator(); i.hasNext();) { + if (((Register)i.next()).name.equals(name)) { i.remove(); } } - registers.add(new Register(name, type, addr, size, description)); + Constructor[] regConstructors = regClass.getDeclaredConstructors(); + Register reg = null; + try { + reg = (Register) regConstructors[0].newInstance(name, type, value, size, description); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + registers.add(reg); } - private static int parseInt(String s) { + protected int parseInt(String s) { if (s == "") return 0; if (s.indexOf('x') > 0) { @@ -136,9 +94,9 @@ public class RegisterDict { } } - public static Register getRegister(String name) { - for (Iterator i = registers.iterator(); i.hasNext();) { - Register r = i.next(); + public Register getRegister(String name) { + for (Iterator i = registers.iterator(); i.hasNext();) { + Register r = (Register) i.next(); if (r.name.equals(name)) { return r; } @@ -146,31 +104,15 @@ public class RegisterDict { return null; } - public static void printRegisters() { + public void printRegisters() { System.out .println("******************** register dictionary *********************"); - System.out.println("Name \t Type \t\t Address \t Size \t Description"); + System.out.println("Name\tType\tAddress\tSize\tDescription"); System.out .println("**************************************************************"); - for (Iterator i = registers.iterator(); i.hasNext();) { - Register r = i.next(); - String type; - switch (r.type) { - case Register.CtrReg: - type = "CtrReg"; - break; - case Register.SysReg: - type = "SysReg"; - break; - case Register.UserReg: - type = "UserReg"; - break; - default: - type = Integer.toString(r.type); - } - System.out.println(r.name + "\t" + type + "\t\t0x" - + Integer.toHexString(r.addr) + "\t\t" + r.size + "\t" - + r.description); + for (Iterator i = registers.iterator(); i.hasNext();) { + Register r = (Register) i.next(); + System.out.println(r.toString()); } System.out .println("**************************************************************"); @@ -189,8 +131,8 @@ public class RegisterDict { * @throws ParserConfigurationException * @throws SAXException */ - public static void addRegistersFromFile(String xmlPathname) - throws IOException, ParserConfigurationException, SAXException { + public void addRegistersFromFile(String xmlPathname) throws IOException, + ParserConfigurationException, SAXException { Document document; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(true); @@ -206,7 +148,7 @@ public class RegisterDict { throw e; } - // treat warnings errors as fatal error + // treat warnings as fatal error public void warning(SAXParseException e) throws SAXParseException { throw e; } @@ -228,12 +170,34 @@ public class RegisterDict { parseRegisterGroup(list.item(j), baseAddr); } } + } else if (list.item(j).getNodeName().equals(REGISTER)) { + NamedNodeMap attributes = list.item(j).getAttributes(); + // attributes: name, type, offset, size + Node n = attributes.getNamedItem(REG_ATTR_NAME); + String name = n.getNodeValue(); + n = attributes.getNamedItem(REG_ATTR_TYPE); + String typeStr = n.getNodeValue(); + int type = convertType(typeStr); + n = attributes.getNamedItem(REG_ATTR_VALUE); + int value = parseInt(n.getNodeValue()); + n = attributes.getNamedItem(REG_ATTR_SIZE); + int size = parseInt(n.getNodeValue()); + parseRegister(list.item(j), name, type, value, size); } } } } - private static void parseRegisterGroup(Node registerGroup, int baseAddr) + protected int convertType(String typeStr) throws SAXException { + for (int index = 0; index < Register.types.length; index++) { + if (typeStr.equals(Register.types[index])) { + return index; + } + } + throw new SAXException("invalid register definition: " + typeStr); + } + + private void parseRegisterGroup(Node registerGroup, int baseAddr) throws SAXException { NodeList list = registerGroup.getChildNodes(); for (int i = 0; i < list.getLength(); i++) { @@ -244,18 +208,8 @@ public class RegisterDict { String name = n.getNodeValue(); n = attributes.getNamedItem(REG_ATTR_TYPE); String typeStr = n.getNodeValue(); - int type; - if (typeStr.equals(REG_ATTR_TYPE_CTRLREG)) { - type = Register.CtrReg; - } else if (typeStr.equals(REG_ATTR_TYPE_SYSREG)) { - type = Register.SysReg; - } else if (typeStr.equals(REG_ATTR_TYPE_USERREG)) { - type = Register.UserReg; - } else { - throw new SAXException("invalid register definition: " - + list.item(i).getNodeName()); - } - n = attributes.getNamedItem(REG_ATTR_OFFSET); + int type = convertType(typeStr); + n = attributes.getNamedItem(REG_ATTR_VALUE); int offset = parseInt(n.getNodeValue()); n = attributes.getNamedItem(REG_ATTR_SIZE); int size = parseInt(n.getNodeValue()); @@ -265,8 +219,8 @@ public class RegisterDict { } } - private static void parseRegister(Node register, String name, int type, - int addr, int size) throws SAXException { + private void parseRegister(Node register, String name, int type, int addr, + int size) throws SAXException { NodeList list = register.getChildNodes(); String description = ""; for (int i = 0; i < list.getLength(); i++) { diff --git a/mcdp/src/ch/ntb/mcdp/mc68332/IMCBTargetBoard.java b/mcdp/src/ch/ntb/mcdp/mc68332/IMCBTargetBoard.java index 300dd3e..f89fe54 100644 --- a/mcdp/src/ch/ntb/mcdp/mc68332/IMCBTargetBoard.java +++ b/mcdp/src/ch/ntb/mcdp/mc68332/IMCBTargetBoard.java @@ -7,24 +7,23 @@ import ch.ntb.usb.USBException; public class IMCBTargetBoard { + static MC68332RegisterDict regDict = new MC68332RegisterDict(); + private static void writeRegister(String name, int value) throws USBException, DispatchException, BDIException { System.out.println("0x" + Integer.toHexString(readRegister(name))); System.out.println("writeRegister: " + name + ", value: 0x" + Integer.toHexString(value)); - Register r = RegisterDict.getRegister(name); + MC68332Register r = (MC68332Register) regDict.getRegister(name); switch (r.type) { - case Register.CtrReg: - System.out.println("writeMem"); - MC68332.writeMem(r.addr, value, r.size); + case MC68332Register.CtrlReg: + MC68332.writeMem(r.value, value, r.size); break; - case Register.SysReg: - System.out.println("writeSysReg"); - MC68332.writeSysReg(r.addr, value); + case MC68332Register.SysReg: + MC68332.writeSysReg(r.value, value); break; - case Register.UserReg: - System.out.println("writeUserReg"); - MC68332.writeUserReg(r.addr, value); + case MC68332Register.UserReg: + MC68332.writeUserReg(r.value, value); break; } System.out.println("0x" + Integer.toHexString(readRegister(name))); @@ -33,17 +32,14 @@ public class IMCBTargetBoard { private static int readRegister(String name) throws USBException, DispatchException, BDIException { System.out.print("readRegister: " + name); - Register r = RegisterDict.getRegister(name); + MC68332Register r = (MC68332Register) regDict.getRegister(name); switch (r.type) { - case Register.CtrReg: - System.out.println("\treadMem"); - return MC68332.readMem(r.addr, r.size); - case Register.SysReg: - System.out.println("\treadSysReg"); - return MC68332.readSysReg(r.addr); - case Register.UserReg: - System.out.println("\treadUserReg"); - return MC68332.readUserReg(r.addr); + case MC68332Register.CtrlReg: + return MC68332.readMem(r.value, r.size); + case MC68332Register.SysReg: + return MC68332.readSysReg(r.value); + case MC68332Register.UserReg: + return MC68332.readUserReg(r.value); } return -1; } @@ -52,8 +48,8 @@ public class IMCBTargetBoard { BDIException { MC68332.reset_target(); - - // RegisterDict.printRegisters(); + + // regDict.printRegisters(); writeRegister("SR", 0x2700); writeRegister("SFC", 0x05); diff --git a/mcdp/src/ch/ntb/mcdp/mc68332/MC68332Register.java b/mcdp/src/ch/ntb/mcdp/mc68332/MC68332Register.java new file mode 100644 index 0000000..21f4319 --- /dev/null +++ b/mcdp/src/ch/ntb/mcdp/mc68332/MC68332Register.java @@ -0,0 +1,28 @@ +package ch.ntb.mcdp.mc68332; + +import ch.ntb.mcdp.dict.Register; + +/** + * For system and user registers the value value is used as BDI + * specific identifier (code specific to each register from the Technical + * Reference Manual). + */ + +public class MC68332Register extends Register { + + // Register Types + static { + types = new String[] { "UserReg", "SysReg", "CtrlReg" }; + } + + static final int UserReg = 0; + + static final int SysReg = 1; + + static final int CtrlReg = 2; + + public MC68332Register(String name, int type, int value, int size, + String description) { + super(name, type, value, size, description); + } +} diff --git a/mcdp/src/ch/ntb/mcdp/mc68332/MC68332RegisterDict.java b/mcdp/src/ch/ntb/mcdp/mc68332/MC68332RegisterDict.java new file mode 100644 index 0000000..3ac8381 --- /dev/null +++ b/mcdp/src/ch/ntb/mcdp/mc68332/MC68332RegisterDict.java @@ -0,0 +1,35 @@ +package ch.ntb.mcdp.mc68332; + +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; + +import org.xml.sax.SAXException; + +import ch.ntb.mcdp.dict.RegisterDict; + +public class MC68332RegisterDict extends RegisterDict { + + private static final String REGISTER_CLASS = "ch.ntb.mcdp.mc68332.MC68332Register"; + + private static final String PATH_TO_REGISTER_FILE = "resources/targets/mc68332/registerDictionary.xml"; + + MC68332RegisterDict() { + super(REGISTER_CLASS); + + // TODO: remove + try { + addRegistersFromFile(PATH_TO_REGISTER_FILE); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ParserConfigurationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SAXException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + printRegisters(); + } +} diff --git a/mcdp/src/ch/ntb/mcdp/mc68332/Register.java b/mcdp/src/ch/ntb/mcdp/mc68332/Register.java deleted file mode 100644 index 75c0382..0000000 --- a/mcdp/src/ch/ntb/mcdp/mc68332/Register.java +++ /dev/null @@ -1,33 +0,0 @@ -package ch.ntb.mcdp.mc68332; - -class Register { - - public final static int UserReg = 0; - - public final static int SysReg = 1; - - public final static int CtrReg = 2; - - Register(String name, int type, int addr, int size, String description) { - this.name = name; - this.type = type; - this.addr = addr; - this.size = size; - this.description = description; - } - - public final String name; - - public final int type; - - /** - * Absolute address of this register.
- * For system and user register this value is used as BDI specific - * identifier. - */ - public final int addr; - - public final int size; - - public final String description; -} diff --git a/mcdp/src/ch/ntb/mcdp/mpc555/MPC555Register.java b/mcdp/src/ch/ntb/mcdp/mpc555/MPC555Register.java new file mode 100644 index 0000000..21f75da --- /dev/null +++ b/mcdp/src/ch/ntb/mcdp/mpc555/MPC555Register.java @@ -0,0 +1,29 @@ +package ch.ntb.mcdp.mpc555; + +import ch.ntb.mcdp.dict.Register; + +public class MPC555Register extends Register { + + // Register Types + static final String[] types = new String[] { "GPR", "FPR", "SPR", "MSR", + "CR", "FPSCR", "CtrlReg" }; + + static final int GPR = 0; + + static final int FPR = 1; + + static final int SPR = 2; + + static final int MSR = 3; + + static final int CR = 4; + + static final int FPSCR = 5; + + static final int CtrlReg = 6; + + protected MPC555Register(String name, int type, int value, int size, + String description) { + super(name, type, value, size, description); + } +} diff --git a/mcdp/src/ch/ntb/mcdp/mpc555/MPC555RegisterDict.java b/mcdp/src/ch/ntb/mcdp/mpc555/MPC555RegisterDict.java new file mode 100644 index 0000000..4a989a9 --- /dev/null +++ b/mcdp/src/ch/ntb/mcdp/mpc555/MPC555RegisterDict.java @@ -0,0 +1,35 @@ +package ch.ntb.mcdp.mpc555; + +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; + +import org.xml.sax.SAXException; + +import ch.ntb.mcdp.dict.RegisterDict; + +public class MPC555RegisterDict extends RegisterDict { + + private static final String REGISTER_CLASS = "ch.ntb.mcdp.mpc555.MPC555RegisterDict"; + + private static final String PATH_TO_REGISTER_FILE = "resources/targets/mpc555/registerDictionary.xml"; + + MPC555RegisterDict() { + super(REGISTER_CLASS); + + // TODO: remove + try { + addRegistersFromFile(PATH_TO_REGISTER_FILE); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (ParserConfigurationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (SAXException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + printRegisters(); + } +}