You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(21) |
Nov
(12) |
Dec
(41) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(25) |
Feb
(54) |
Mar
(63) |
Apr
(52) |
May
(17) |
Jun
(3) |
Jul
(3) |
Aug
(5) |
Sep
(49) |
Oct
(50) |
Nov
(34) |
Dec
(14) |
2009 |
Jan
(9) |
Feb
(15) |
Mar
(38) |
Apr
(12) |
May
(35) |
Jun
(20) |
Jul
(2) |
Aug
(7) |
Sep
(36) |
Oct
(24) |
Nov
(2) |
Dec
(2) |
2010 |
Jan
(14) |
Feb
(1) |
Mar
(36) |
Apr
(2) |
May
(4) |
Jun
(6) |
Jul
(35) |
Aug
(11) |
Sep
(8) |
Oct
(3) |
Nov
|
Dec
(1) |
2011 |
Jan
(11) |
Feb
(12) |
Mar
(3) |
Apr
(7) |
May
(12) |
Jun
(8) |
Jul
|
Aug
(3) |
Sep
(4) |
Oct
|
Nov
(2) |
Dec
(4) |
2012 |
Jan
(2) |
Feb
(1) |
Mar
(14) |
Apr
(5) |
May
(28) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(21) |
Nov
(4) |
Dec
(1) |
2013 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Joakim E. <jo...@us...> - 2011-05-31 18:57:02
|
The branch "master" has been updated via e47f87e6ba7f8481058b19c34db3ba49a33abed2 (commit) from f96cfa14f141c71c7749718cdc71e8d1954241e3 (commit) Changed paths: M se/sics/mspsim/core/DisAsm.java M se/sics/mspsim/core/MSP430Constants.java - Log ----------------------------------------------------------------- commit e47f87e6ba7f8481058b19c34db3ba49a33abed2 Author: Joakim Eriksson <jo...@si...> Date: Tue May 31 20:56:37 2011 +0200 added disassembly of CALLA diff --git a/se/sics/mspsim/core/DisAsm.java b/se/sics/mspsim/core/DisAsm.java index 48f9de8..c416135 100644 --- a/se/sics/mspsim/core/DisAsm.java +++ b/se/sics/mspsim/core/DisAsm.java @@ -190,6 +190,40 @@ public DbgInstruction disassemble(int pc, int[] memory, int[] reg, break; case 1: // Single operand instructions { + /* check CALLA first */ + int srcdata = (instruction & 0x0f00) >> 8; + int dst = instruction & 0x000f; + int nextData = memory[pc] + (memory[pc + 1] << 8); + String opstr = null; + switch(instruction & 0xfff0) { + case CALLA_REG: + opstr = "CALLA R" + dst; + break; + case CALLA_IND: + opstr = "CALLA @R" + dst; + break; + case CALLA_IND_AUTOINC: + opstr = "CALLA @R" + dst + "+"; + break; + case CALLA_ABS: + opstr = "CALLA &" + Utils.hex20(((dst << 16) | nextData)); + size += 2; + break; + case CALLA_EDE: + opstr = "CALLA " + Utils.hex20(((dst << 16) | nextData)) + "(PC)"; + size += 2; + break; + case CALLA_IMMREG: + opstr = "CALLA #" + Utils.hex20(((dst << 16) | nextData)); + size += 2; + break; + } + if (opstr != null) { + output += dumpMem(startPC, size, memory); + output += opstr + " "; + regs = "R" + srcdata + "=" + Utils.hex16(reg[srcdata]); + regs += " SP=" + Utils.hex16(reg[SP]); + } else { // Register int register = instruction & 0xf; // Adress mode of destination... @@ -197,7 +231,6 @@ public DbgInstruction disassemble(int pc, int[] memory, int[] reg, // Pick up the destination address based on ad more and regs... int dstAddress = 0; String adr = ""; - String opstr = ""; switch(ad) { // Operand in register! case AM_REG: @@ -263,6 +296,7 @@ public DbgInstruction disassemble(int pc, int[] memory, int[] reg, regs = "R" + register + "=" + Utils.hex16(reg[register]); regs += " SP=" + Utils.hex16(reg[SP]); } + } break; // Jump instructions case 2: diff --git a/se/sics/mspsim/core/MSP430Constants.java b/se/sics/mspsim/core/MSP430Constants.java index 091f767..e152443 100644 --- a/se/sics/mspsim/core/MSP430Constants.java +++ b/se/sics/mspsim/core/MSP430Constants.java @@ -76,7 +76,7 @@ public static final int MODE_MAX = MODE_LPM4; public static String[] MODE_NAMES = { - "Active", "LPM0", "LPM1", "LPM2", "LPM3", "LPM4" + "active", "lpm0", "lpm1", "lpm2", "lpm3", "lpm4" }; public static final int CLK_ACLK = 1; @@ -134,6 +134,13 @@ public static final int ADDA_REG = 0x00e0; public static final int SUBA_REG = 0x00f0; + public static final int CALLA_REG = 0x1340; + public static final int CALLA_IND = 0x1360; + public static final int CALLA_IND_AUTOINC = 0x1370; + public static final int CALLA_ABS = 0x1380; + public static final int CALLA_EDE = 0x1390; /* x(PC) */ + public static final int CALLA_IMMREG = 0x13b0; + public static final String[] TWO_OPS = { ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/DisAsm.java | 176 ++++++++++++++++++------------ se/sics/mspsim/core/MSP430Constants.java | 13 ++- 2 files changed, 115 insertions(+), 74 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-05-31 06:12:47
|
The branch "master" has been updated via f96cfa14f141c71c7749718cdc71e8d1954241e3 (commit) via 56313ce484d3bad52a2ad02229c7e2e2b1c1d974 (commit) from c64304df7a162b20da8cfd0b2d6bad19dc623235 (commit) Changed paths: M se/sics/mspsim/core/MSP430Core.java M se/sics/mspsim/core/Timer.java - Log ----------------------------------------------------------------- commit f96cfa14f141c71c7749718cdc71e8d1954241e3 Merge: 56313ce c64304d Author: Joakim Eriksson <jo...@si...> Date: Tue May 31 08:09:52 2011 +0200 Merge branch 'master' of ssh://mspsim.git.sourceforge.net/gitroot/mspsim/mspsim commit 56313ce484d3bad52a2ad02229c7e2e2b1c1d974 Author: Joakim Eriksson <jo...@si...> Date: Mon May 23 22:10:04 2011 +0200 minor fix when writing sr to stack diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index 57e81b8..39de632 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -885,7 +885,7 @@ private int serviceInterrupt(int pc) { write(sp, pc, MODE_WORD); writeRegister(SP, sp = sp - 2); - write(sp, sr & 0x0fff | (pc & 0xf0000) >> 4, MODE_WORD); + write(sp, (sr & 0x0fff) | ((pc & 0xf0000) >> 4), MODE_WORD); } // Clear SR writeRegister(SR, 0); // sr & ~CPUOFF & ~SCG1 & ~OSCOFF); diff --git a/se/sics/mspsim/core/Timer.java b/se/sics/mspsim/core/Timer.java index de1ac91..8031af5 100644 --- a/se/sics/mspsim/core/Timer.java +++ b/se/sics/mspsim/core/Timer.java @@ -750,6 +750,8 @@ public void write(int address, int data, boolean word, long cycles) { resetCounter(cycles); } } + if (ccr[index] == null) + System.out.println("Timer write to " + Utils.hex16(address)); ccr[index].tccr = data; int diff = data - counter; ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/MSP430Core.java | 2 +- se/sics/mspsim/core/Timer.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletions(-) hooks/post-receive -- mspsim |
From: Niclas F. <ni...@us...> - 2011-05-22 22:22:09
|
The branch "master" has been updated via c64304df7a162b20da8cfd0b2d6bad19dc623235 (commit) from 426573abb6df7d92c0a7c3fceb865bf206058599 (commit) Changed paths: M se/sics/mspsim/core/MSP430Constants.java M se/sics/mspsim/core/MSP430Core.java - Log ----------------------------------------------------------------- commit c64304df7a162b20da8cfd0b2d6bad19dc623235 Author: Niclas Finne <nf...@si...> Date: Mon May 23 00:21:13 2011 +0200 Added time and mode information to the info output diff --git a/se/sics/mspsim/core/MSP430Constants.java b/se/sics/mspsim/core/MSP430Constants.java index 3131f1a..091f767 100644 --- a/se/sics/mspsim/core/MSP430Constants.java +++ b/se/sics/mspsim/core/MSP430Constants.java @@ -76,7 +76,7 @@ public static final int MODE_MAX = MODE_LPM4; public static String[] MODE_NAMES = { - "active", "lpm0", "lpm1", "lpm2", "lpm3", "lpm4" + "Active", "LPM0", "LPM1", "LPM2", "LPM3", "LPM4" }; public static final int CLK_ACLK = 1; diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index 57e81b8..f60e498 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -1604,9 +1604,14 @@ public int getConfiguration(int parameter) { public String info() { StringBuilder buf = new StringBuilder(); + buf.append(" Mode: " + getModeName(getMode()) + + " ACLK: " + aclkFrq + " Hz SMCLK: " + smclkFrq + " Hz\n" + + " Cycles: " + cycles + " CPU Cycles: " + cpuCycles + + " Time: " + (long)getTimeMillis() + " msec\n"); for (int i = 0; i < 16; i++) { - buf.append("Vector: at $" + Utils.hex16(0xfffe - i * 2) + " -> $" + - Utils.hex16(read(0xfffe - i * 2, MODE_WORD)) + "\n"); + buf.append(" Vector " + (15 - i) + " at $" + + Utils.hex16(0xfffe - i * 2) + " -> $" + + Utils.hex16(read(0xfffe - i * 2, MODE_WORD)) + "\n"); } return buf.toString(); } ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/MSP430Constants.java | 6 +++--- se/sics/mspsim/core/MSP430Core.java | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) hooks/post-receive -- mspsim |
From: Niclas F. <ni...@us...> - 2011-05-22 20:59:37
|
The branch "master" has been updated via 426573abb6df7d92c0a7c3fceb865bf206058599 (commit) from ffcb783d7f772e6d51dfdf25737a876ebf543009 (commit) Changed paths: M se/sics/mspsim/util/StatCommands.java - Log ----------------------------------------------------------------- commit 426573abb6df7d92c0a7c3fceb865bf206058599 Author: Niclas Finne <nf...@si...> Date: Sun May 22 22:59:11 2011 +0200 show full name in output from 'info' command diff --git a/se/sics/mspsim/util/StatCommands.java b/se/sics/mspsim/util/StatCommands.java index f15d9ea..48e429d 100644 --- a/se/sics/mspsim/util/StatCommands.java +++ b/se/sics/mspsim/util/StatCommands.java @@ -74,7 +74,14 @@ public int executeCommand(CommandContext context) { if (unit == null) { context.out.println(" " + unitName + ": NOT FOUND"); } else { - context.out.println(unitName + ": " + unit); + String id = unit.getID(); + String name = unit.getName(); + if (id == name) { + context.out.println(unit.getName() + ": " + unit.getClass().getName()); + } else { + context.out.println(unit.getID() + " (" + unit.getName() + "): " + + unit.getClass().getName()); + } String info = unit.info(); if (info != null) { context.out.println(info); ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/util/StatCommands.java | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-05-19 20:36:02
|
The branch "master" has been updated via ffcb783d7f772e6d51dfdf25737a876ebf543009 (commit) from 75ce5d3a0726ec2caf71cbcd0b03f0375cec652e (commit) Changed paths: M se/sics/mspsim/core/MSP430Core.java - Log ----------------------------------------------------------------- commit ffcb783d7f772e6d51dfdf25737a876ebf543009 Author: Francois Revol <re...@fr...> Date: Thu May 19 22:35:33 2011 +0200 added support for pushing 20-bit to stack for interrupts diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index 9f60c13..57e81b8 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -82,6 +82,7 @@ public long cycles = 0; public long cpuCycles = 0; MapTable map; + public final boolean MSP430XArch; public final MSP430Config config; // Most HW needs only notify write and clocking, others need also read... @@ -156,6 +157,7 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { MAX_MEM = config.maxMem; memOut = new IOUnit[MAX_MEM_IO]; memIn = new IOUnit[MAX_MEM_IO]; + MSP430XArch = config.MSP430XArch; memory = new int[MAX_MEM]; breakPoints = new CPUMonitor[MAX_MEM]; @@ -883,7 +885,7 @@ private int serviceInterrupt(int pc) { write(sp, pc, MODE_WORD); writeRegister(SP, sp = sp - 2); - write(sp, sr, MODE_WORD); + write(sp, sr & 0x0fff | (pc & 0xf0000) >> 4, MODE_WORD); } // Clear SR writeRegister(SR, 0); // sr & ~CPUOFF & ~SCG1 & ~OSCOFF); @@ -1209,12 +1211,13 @@ public boolean emulateOP(long maxCycles) throws EmulationException { // Put Top of stack to Status DstRegister (TOS -> SR) servicedInterrupt = -1; /* needed before write to SR!!! */ sp = readRegister(SP); - writeRegister(SR, read(sp, MODE_WORD)); - sp = sp + 2; + sr = read(sp, MODE_WORD); + writeRegister(SR, sr & 0x0fff); + sp = sp + 2; // writeRegister(SR, memory[sp++] + (memory[sp++] << 8)); // TOS -> PC // writeRegister(PC, memory[sp++] + (memory[sp++] << 8)); - writeRegister(PC, read(sp, MODE_WORD)); + writeRegister(PC, read(sp, MODE_WORD) | (sr & 0xf000) << 4); sp = sp + 2; writeRegister(SP, sp); write = false; ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/MSP430Core.java | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-05-19 19:18:13
|
The branch "master" has been updated via 75ce5d3a0726ec2caf71cbcd0b03f0375cec652e (commit) from 54d4a2275871f88c234e688f91ec490b70d5c8f9 (commit) Changed paths: M se/sics/mspsim/util/ELF.java - Log ----------------------------------------------------------------- commit 75ce5d3a0726ec2caf71cbcd0b03f0375cec652e Author: François Revol <re...@fr...> Date: Thu May 19 16:10:48 2011 +0200 Allow symbols to have a 20 bit address in the ELF reader. diff --git a/se/sics/mspsim/util/ELF.java b/se/sics/mspsim/util/ELF.java index 8f2d48d..fb00b37 100644 --- a/se/sics/mspsim/util/ELF.java +++ b/se/sics/mspsim/util/ELF.java @@ -416,7 +416,7 @@ public MapTable getMap() { " type: " + type + " size: " + size); } - if (sAddr > 0 && sAddr < 0x10000) { + if (sAddr > 0 && sAddr < 0x100000) { String symbolName = sn; // if (bind == ELFSection.SYMBIND_LOCAL) { // symbolName += " (" + currentFile + ')'; ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/util/ELF.java | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-05-19 17:57:57
|
The branch "master" has been updated via 54d4a2275871f88c234e688f91ec490b70d5c8f9 (commit) via e19edc709c89982c728670477162a85a81487364 (commit) from 51fe539326c533f1b6ac6bfe296f7058fd5f9caf (commit) Changed paths: M se/sics/mspsim/core/DisAsm.java M se/sics/mspsim/util/Utils.java - Log ----------------------------------------------------------------- commit 54d4a2275871f88c234e688f91ec490b70d5c8f9 Author: Joakim Eriksson <jo...@si...> Date: Thu May 19 19:57:31 2011 +0200 slight refactoring diff --git a/se/sics/mspsim/util/Utils.java b/se/sics/mspsim/util/Utils.java index 87fccac..4104ebb 100644 --- a/se/sics/mspsim/util/Utils.java +++ b/se/sics/mspsim/util/Utils.java @@ -90,36 +90,28 @@ public static String binary16(int data) { return s; } + public static String hex(int data, int len) { + String s = Integer.toString(data, 16); + if (s.length() < len) { + s = str16.substring(0, len - s.length()) + s; + } + return s; + } + public static String hex8(int data) { - String s = Integer.toString(data & 0xff, 16); - if (s.length() < 2) { - s = str16.substring(0, 2 - s.length()) + s; - } - return s; + return hex(data & 0xff, 2); } public static String hex16(int data) { - String s = Integer.toString(data & 0xffff, 16); - if (s.length() < 4) { - s = str16.substring(0, 4 - s.length()) + s; - } - return s; + return hex(data & 0xffff, 4); } - public static String hex20(int addr) { - String s = Integer.toString(addr & 0xfffff, 16); - if (s.length() < 5) { - s = str16.substring(0, 5 - s.length()) + s; - } - return s; + public static String hex20(int data) { + return hex(data & 0xfffff, 5); } - public static String hex24(int addr) { - String s = Integer.toString(addr & 0xffffff, 16); - if (s.length() < 6) { - s = str16.substring(0, 6 - s.length()) + s; - } - return s; + public static String hex24(int data) { + return hex(data & 0xffffff, 6); } public static void fill(byte[] array, int pos, int len, byte value) { commit e19edc709c89982c728670477162a85a81487364 Author: Joakim Eriksson <jo...@si...> Date: Thu May 19 19:56:49 2011 +0200 added disassembly of a few more instructions diff --git a/se/sics/mspsim/core/DisAsm.java b/se/sics/mspsim/core/DisAsm.java index 49fb26f..48f9de8 100644 --- a/se/sics/mspsim/core/DisAsm.java +++ b/se/sics/mspsim/core/DisAsm.java @@ -57,6 +57,7 @@ private BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); + public void setMap(MapTable m) { map = m; } @@ -119,6 +120,74 @@ public DbgInstruction disassemble(int pc, int[] memory, int[] reg, size += 2; switch (op) { + case 0: // MSP430X instructions + { + // MSP430X - additional instructions + String opstr = ""; + op = instruction & 0xf0f0; + int srcdata = (instruction & 0x0f00) >> 8; + int dst = instruction & 0x000f; + int nextData = memory[pc] + (memory[pc + 1] << 8); + + switch(op) { + case MOVA_IND0: + opstr = "MOVA @R" + srcdata + ",R" + dst; + break; + case MOVA_IND1: + opstr = "MOVA @R" + srcdata + "+,R" + dst; + break; + case MOVA_ABS2REG: + opstr = "MOVA &$" + Utils.hex20(((srcdata << 16) | nextData)) + "," + dst; + size += 2; + break; + case MOVA_INDX2REG: + opstr = "MOVA $" + Utils.hex16(nextData) + "(R" + srcdata + "),R" + dst; + size += 2; + break; + case MOVA_REG2ABS: + opstr = "MOVA R" + srcdata + ",&$" + Utils.hex20(((dst << 16) | nextData)); + size += 2; + break; + case MOVA_REG2INDX: + opstr = "MOVA R" + srcdata + ",$" + Utils.hex16(nextData) + "(R" + dst + ")"; + size += 2; + break; + case MOVA_IMM2REG: + opstr = "MOVA #$" + Utils.hex20(((srcdata << 16) | nextData)) + ",R" + dst; + size += 2; + break; + case CMPA_IMM: + opstr = "CMPA #$" + Utils.hex20(((srcdata << 16) | nextData)) + ",R" + dst; + size += 2; + break; + case ADDA_IMM: + opstr = "ADDA #$" + Utils.hex20(((srcdata << 16) | nextData)) + ",R" + dst; + size += 2; + break; + case SUBA_IMM: + opstr = "SUBA #$" + Utils.hex20(((srcdata << 16) | nextData)) + ",R" + dst; + size += 2; + break; + case MOVA_REG: + opstr = "MOVA R" + srcdata + ",R" + dst; + break; + case CMPA_REG: + opstr = "CMPA R" + srcdata + ",R" + dst; + break; + case ADDA_REG: + opstr = "ADDA R" + srcdata + ",R" + dst; + break; + case SUBA_REG: + opstr = "SUBA R" + srcdata + ",R" + dst; + break; + } + + output += dumpMem(startPC, size, memory); + output += opstr + " "; + regs = "R" + srcdata + "=" + Utils.hex16(reg[srcdata]); + regs += " SP=" + Utils.hex16(reg[SP]); + } + break; case 1: // Single operand instructions { // Register ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/DisAsm.java | 69 +++++++++++++++++++++++++++++++++++++++ se/sics/mspsim/util/Utils.java | 36 ++++++++------------ 2 files changed, 83 insertions(+), 22 deletions(-) hooks/post-receive -- mspsim |
From: Niclas F. <ni...@us...> - 2011-05-19 15:06:00
|
The branch "master" has been updated via 51fe539326c533f1b6ac6bfe296f7058fd5f9caf (commit) from af9a49b1c94887db5b358835060845c50b401120 (commit) Changed paths: M se/sics/mspsim/cli/DebugCommands.java M se/sics/mspsim/config/MSP430f2617Config.java M se/sics/mspsim/core/MSP430Config.java M se/sics/mspsim/core/MSP430Core.java M se/sics/mspsim/util/Utils.java - Log ----------------------------------------------------------------- commit 51fe539326c533f1b6ac6bfe296f7058fd5f9caf Author: Niclas Finne <nf...@si...> Date: Fri May 13 00:38:32 2011 +0200 Added getAddressAsString to MSP430Config for addresses above 64KB diff --git a/se/sics/mspsim/cli/DebugCommands.java b/se/sics/mspsim/cli/DebugCommands.java index 631febd..0181207 100644 --- a/se/sics/mspsim/cli/DebugCommands.java +++ b/se/sics/mspsim/cli/DebugCommands.java @@ -81,11 +81,11 @@ public int executeCommand(final CommandContext context) { cpu.setBreakPoint(address = baddr, new CPUMonitor() { public void cpuAction(int type, int adr, int data) { - context.out.println("*** Break at $" + Utils.hex16(adr)); + context.out.println("*** Break at $" + cpu.getAddressAsString(adr)); cpu.stop(); } }); - context.err.println("Breakpoint set at $" + Utils.hex16(baddr)); + context.err.println("Breakpoint set at $" + cpu.getAddressAsString(baddr)); return 0; } public void stopCommand(CommandContext context) { @@ -122,8 +122,8 @@ public int executeCommand(final CommandContext context) { public void cpuAction(int type, int adr, int data) { if (mode == 0 || mode == 10) { int pc = cpu.readRegister(0); - String adrStr = getSymOrAddr(context, adr); - String pcStr = getSymOrAddrELF(getELF(), pc); + String adrStr = getSymOrAddr(cpu, context, adr); + String pcStr = getSymOrAddrELF(cpu, getELF(), pc); String op = "op"; if (type == MEMORY_READ) { op = "Read"; @@ -154,7 +154,7 @@ public void cpuAction(int type, int adr, int data) { cpu.setBreakPoint(address + i, monitor); } } - context.err.println("Watch set at $" + Utils.hex16(baddr)); + context.err.println("Watch set at $" + cpu.getAddressAsString(baddr)); return 0; } @@ -187,7 +187,7 @@ public void cpuAction(int type, int adr, int data) { if (mode == 0) { int pc = cpu.readRegister(0); String adrStr = getRegisterName(register); - String pcStr = getSymOrAddrELF(getELF(), pc); + String pcStr = getSymOrAddrELF(cpu, getELF(), pc); context.out.println("*** Write from " + pcStr + ": " + adrStr + " = " + data); } else { @@ -221,7 +221,7 @@ public int executeCommand(final CommandContext context) { MapEntry mapEntry = entries[i]; int address = mapEntry.getAddress(); context.out.println(" " + mapEntry.getName() + " at $" + - Utils.hex16(address) + " (" + Utils.hex8(cpu.memory[address]) + + cpu.getAddressAsString(address) + " (" + Utils.hex8(cpu.memory[address]) + " " + Utils.hex8(cpu.memory[address + 1]) + ") " + mapEntry.getType() + " in file " + mapEntry.getFile()); found = true; @@ -255,7 +255,7 @@ public int executeCommand(final CommandContext context) { ch.registerCommand("stop", new BasicCommand("stop the CPU", "") { public int executeCommand(CommandContext context) { node.stop(); - context.out.println("CPU stopped at: $" + Utils.hex16(cpu.readRegister(0))); + context.out.println("CPU stopped at: $" + cpu.getAddressAsString(cpu.readRegister(0))); return 0; } }); @@ -284,7 +284,7 @@ public int executeCommand(CommandContext context) { } catch (Exception e) { e.printStackTrace(context.out); } - context.out.println("CPU stepped to: $" + Utils.hex16(cpu.readRegister(0)) + + context.out.println("CPU stepped to: $" + cpu.getAddressAsString(cpu.readRegister(0)) + " in " + (cpu.cycles - cyc) + " cycles (" + cpu.cycles + ")"); return 0; } @@ -303,7 +303,7 @@ public int executeCommand(CommandContext context) { } catch (Exception e) { e.printStackTrace(context.out); } - context.out.println("CPU stepped to: $" + Utils.hex16(cpu.readRegister(0)) + + context.out.println("CPU stepped to: $" + cpu.getAddressAsString(cpu.readRegister(0)) + " in " + (cpu.cycles - cyc) + " cycles (" + cpu.cycles + ") - next exec time: " + nxt); return 0; } @@ -314,7 +314,7 @@ public int executeCommand(CommandContext context) { int stackEnd = context.getMapTable().heapStartAddress; int stackStart = context.getMapTable().stackStartAddress; int current = cpu.readRegister(MSP430Constants.SP); - context.out.println("Current stack: $" + Utils.hex16(current) + " (" + (stackStart - current) + " used of " + (stackStart - stackEnd) + ')'); + context.out.println("Current stack: $" + cpu.getAddressAsString(current) + " (" + (stackStart - current) + " used of " + (stackStart - stackEnd) + ')'); return 0; } }); @@ -594,20 +594,20 @@ public int executeCommand(CommandContext context) { } } - private static String getSymOrAddr(CommandContext context, int adr) { + private static String getSymOrAddr(MSP430 cpu, CommandContext context, int adr) { MapEntry me = context.getMapTable().getEntry(adr); if (me != null) { return me.getName(); } - return '$' + Utils.hex16(adr); + return '$' + cpu.getAddressAsString(adr); } - private static String getSymOrAddrELF(ELF elf, int adr) { + private static String getSymOrAddrELF(MSP430 cpu, ELF elf, int adr) { DebugInfo me = elf.getDebugInfo(adr); if (me != null) { return me.toString(); } - return '$' + Utils.hex16(adr); + return '$' + cpu.getAddressAsString(adr); } private static String getRegisterName(int register) { diff --git a/se/sics/mspsim/config/MSP430f2617Config.java b/se/sics/mspsim/config/MSP430f2617Config.java index b33844a..a5b7346 100755 --- a/se/sics/mspsim/config/MSP430f2617Config.java +++ b/se/sics/mspsim/config/MSP430f2617Config.java @@ -41,6 +41,7 @@ import se.sics.mspsim.core.MSP430Core; import se.sics.mspsim.core.Timer; import se.sics.mspsim.core.USCI; +import se.sics.mspsim.util.Utils; public class MSP430f2617Config extends MSP430Config { @@ -100,5 +101,10 @@ public int setup(MSP430Core cpu, ArrayList<IOUnit> ioUnits) { /* 4 usci units */ return 4; } - + + @Override + public String getAddressAsString(int addr) { + return Utils.hex20(addr); + } + } \ No newline at end of file diff --git a/se/sics/mspsim/core/MSP430Config.java b/se/sics/mspsim/core/MSP430Config.java index e17c480..d03bf12 100644 --- a/se/sics/mspsim/core/MSP430Config.java +++ b/se/sics/mspsim/core/MSP430Config.java @@ -2,6 +2,8 @@ import java.util.ArrayList; +import se.sics.mspsim.util.Utils; + public abstract class MSP430Config { public class TimerConfig { @@ -60,4 +62,9 @@ public UARTConfig(int txVector, int rxVector, int txBit, int rxBit, int sftAddr, public boolean MSP430XArch = false; public abstract int setup(MSP430Core cpu, ArrayList<IOUnit> ioUnits); + + + public String getAddressAsString(int addr) { + return Utils.hex16(addr); + } } diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index f060e50..9f60c13 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -82,7 +82,7 @@ public long cycles = 0; public long cpuCycles = 0; MapTable map; - public MSP430Config config; + public final MSP430Config config; // Most HW needs only notify write and clocking, others need also read... // For notify write... @@ -422,7 +422,7 @@ public void writeRegister(int r, int value) { if (oldIE == false && interruptsEnabled && servicedInterrupt >= 0) { // System.out.println("*** Interrupts enabled while in interrupt : " + -// servicedInterrupt + " PC: " + Utils.hex16(reg[PC])); +// servicedInterrupt + " PC: $" + getAddressAsString(reg[PC])); /* must handle pending immediately */ handlePendingInterrupts(); } @@ -832,19 +832,19 @@ void printWarning(int type, int address) throws EmulationException { switch(type) { case MISALIGNED_READ: message = "**** Illegal read - misaligned word from $" + - Utils.hex16(address) + " at $" + Utils.hex16(reg[PC]); + getAddressAsString(address) + " at $" + getAddressAsString(reg[PC]); break; case MISALIGNED_WRITE: message = "**** Illegal write - misaligned word to $" + - Utils.hex16(address) + " at $" + Utils.hex16(reg[PC]); + getAddressAsString(address) + " at $" + getAddressAsString(reg[PC]); break; case ADDRESS_OUT_OF_BOUNDS_READ: message = "**** Illegal read - out of bounds from $" + - Utils.hex16(address) + " at $" + Utils.hex16(reg[PC]); + getAddressAsString(address) + " at $" + getAddressAsString(reg[PC]); break; case ADDRESS_OUT_OF_BOUNDS_WRITE: message = "**** Illegal write - out of bounds from $" + - Utils.hex16(address) + " at $" + Utils.hex16(reg[PC]); + getAddressAsString(address) + " at $" + getAddressAsString(reg[PC]); break; } @@ -899,7 +899,7 @@ private int serviceInterrupt(int pc) { reevaluateInterrupts(); if (servicedInterrupt == MAX_INTERRUPT) { - if (debugInterrupts) System.out.println("**** Servicing RESET! => " + Utils.hex16(pc)); + if (debugInterrupts) System.out.println("**** Servicing RESET! => $" + getAddressAsString(pc)); internalReset(); } @@ -1018,7 +1018,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { // MSP430X - additional instructions op = instruction & 0xf0f0; System.out.println("Executing MSP430X instruction op:" + Utils.hex16(op) + - " ins:" + Utils.hex16(instruction) + " PC = " + Utils.hex16(pc - 2)); + " ins:" + Utils.hex16(instruction) + " PC = $" + getAddressAsString(pc - 2)); int src = 0; /* data is either bit 19-16 or src register */ int srcData = (instruction & 0x0f00) >> 8; @@ -1029,7 +1029,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { src = read(pc, MODE_WORD); writeRegister(PC, pc += 2); dst = src + (srcData << 16); - System.out.println("*** Writing $" + Utils.hex16(dst) + " to reg: " + dstData); + System.out.println("*** Writing $" + getAddressAsString(dst) + " to reg: " + dstData); writeRegister(dstData, dst); break; case CMPA_IMM: @@ -1402,7 +1402,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { src = read(srcAddress, word ? MODE_WORD : MODE_BYTE); // if (debug) { - // System.out.println("Reading from " + Utils.hex16(srcAddress) + + // System.out.println("Reading from " + getAddressAsString(srcAddress) + // " => " + src); // } } @@ -1582,7 +1582,7 @@ public int getModeMax() { MapEntry getFunction(MapTable map, int address) { MapEntry function = new MapEntry(MapEntry.TYPE.function, address, 0, - "fkn at $" + Utils.hex16(address), null, true); + "fkn at $" + getAddressAsString(address), null, true); map.setEntry(function); return function; } @@ -1590,13 +1590,17 @@ MapEntry getFunction(MapTable map, int address) { public int getPC() { return reg[PC]; } - + + public String getAddressAsString(int addr) { + return config.getAddressAsString(addr); + } + public int getConfiguration(int parameter) { return 0; } public String info() { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < 16; i++) { buf.append("Vector: at $" + Utils.hex16(0xfffe - i * 2) + " -> $" + Utils.hex16(read(0xfffe - i * 2, MODE_WORD)) + "\n"); diff --git a/se/sics/mspsim/util/Utils.java b/se/sics/mspsim/util/Utils.java index 4a70dd5..87fccac 100644 --- a/se/sics/mspsim/util/Utils.java +++ b/se/sics/mspsim/util/Utils.java @@ -106,6 +106,22 @@ public static String hex16(int data) { return s; } + public static String hex20(int addr) { + String s = Integer.toString(addr & 0xfffff, 16); + if (s.length() < 5) { + s = str16.substring(0, 5 - s.length()) + s; + } + return s; + } + + public static String hex24(int addr) { + String s = Integer.toString(addr & 0xffffff, 16); + if (s.length() < 6) { + s = str16.substring(0, 6 - s.length()) + s; + } + return s; + } + public static void fill(byte[] array, int pos, int len, byte value) { for (int i = 0; i < len; i++) { array[pos++] = value; ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/cli/DebugCommands.java | 30 +++++++++++++------------- se/sics/mspsim/config/MSP430f2617Config.java | 8 ++++++- se/sics/mspsim/core/MSP430Config.java | 7 ++++++ se/sics/mspsim/core/MSP430Core.java | 30 ++++++++++++++----------- se/sics/mspsim/util/Utils.java | 16 +++++++++++++ 5 files changed, 62 insertions(+), 29 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-05-15 10:21:40
|
The branch "master" has been updated via af9a49b1c94887db5b358835060845c50b401120 (commit) from 6936f21c9210e7cfdc068d3395b6716fd3172b8a (commit) Changed paths: M se/sics/mspsim/util/MapTable.java - Log ----------------------------------------------------------------- commit af9a49b1c94887db5b358835060845c50b401120 Author: Joakim Eriksson <jo...@si...> Date: Sun May 15 12:15:32 2011 +0200 fixed map-table to not be fixed to specific memory size diff --git a/se/sics/mspsim/util/MapTable.java b/se/sics/mspsim/util/MapTable.java index 3c76808..b4d09e6 100644 --- a/se/sics/mspsim/util/MapTable.java +++ b/se/sics/mspsim/util/MapTable.java @@ -73,8 +73,9 @@ private int dataFill = 0; private ArrayList<MapEntry> modules = new ArrayList<MapEntry>(); - private MapEntry[] entries; - + private ArrayList<MapEntry> entries = new ArrayList<MapEntry>(); + private HashMap<Integer, MapEntry> addressMap = new HashMap<Integer, MapEntry>(); + public MapTable() { } @@ -203,43 +204,29 @@ public void loadMap(String file) throws IOException { } public String getFunctionName(int address) { - if (entries != null && entries[address] != null) { - return entries[address].getName(); - } else { - return null; - } + MapEntry entry = getEntry(address); + if (entry != null) { + return entry.getName(); + } else { + return null; + } } public MapEntry getEntry(int address) { - if (entries != null) { - return entries[address]; - } - return null; + return addressMap.get(address); } public MapEntry[] getAllEntries() { - ArrayList<MapEntry> allEntries = new ArrayList<MapEntry>(); - if (entries != null) { - for (int address = 0; address < entries.length; address++) { - MapEntry entry = getEntry(address); - if (entry != null) { - allEntries.add(entry); - } - } - } - return allEntries.toArray(new MapEntry[allEntries.size()]); + return entries.toArray(new MapEntry[entries.size()]); } public MapEntry[] getEntries(String regexp) { Pattern pattern = Pattern.compile(regexp); ArrayList<MapEntry> allEntries = new ArrayList<MapEntry>(); - if (entries != null) { - for (int address = 0; address < entries.length; address++) { - MapEntry entry = getEntry(address); - if (entry != null && pattern.matcher(entry.getName()).find()) { - allEntries.add(entry); + for (MapEntry entry : entries) { + if (pattern.matcher(entry.getName()).find()) { + allEntries.add(entry); } - } } return allEntries.toArray(new MapEntry[allEntries.size()]); } @@ -250,24 +237,18 @@ public void setFunctionName(int address, String name) { } public void setEntry(MapEntry entry) { - if (entries == null) { - entries = new MapEntry[0x10000]; - } - if (entry.getAddress() < 0x10000) { - entries[entry.getAddress()] = entry; - } + entries.add(entry); + addressMap.put(entry.getAddress(), entry); } // Really slow way to find a specific function address!!!! // Either reimplement this or cache in hashtable... public int getFunctionAddress(String function) { - if (entries != null) { - for (int i = 0, n = entries.length; i < n; i++) { - if (entries[i] != null && function.equals(entries[i].getName())) { - return i; + for (MapEntry entry : entries) { + if (function.equals(entry.getName())) { + return entry.getAddress(); } } - } return -1; } ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/util/MapTable.java | 57 ++++++++++++------------------------ 1 files changed, 19 insertions(+), 38 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-05-13 22:11:29
|
The branch "master" has been updated via 6936f21c9210e7cfdc068d3395b6716fd3172b8a (commit) from c1acb4b9aa1a7e40af55851a34690c95c3a7cafc (commit) Changed paths: M se/sics/mspsim/config/MSP430f2617Config.java M se/sics/mspsim/core/MSP430Core.java - Log ----------------------------------------------------------------- commit 6936f21c9210e7cfdc068d3395b6716fd3172b8a Author: Joakim Eriksson <jo...@si...> Date: Sat May 14 00:11:10 2011 +0200 fixed config for I2C addresses diff --git a/se/sics/mspsim/config/MSP430f2617Config.java b/se/sics/mspsim/config/MSP430f2617Config.java index 14aa51b..b33844a 100755 --- a/se/sics/mspsim/config/MSP430f2617Config.java +++ b/se/sics/mspsim/config/MSP430f2617Config.java @@ -80,6 +80,11 @@ public int setup(MSP430Core cpu, ArrayList<IOUnit> ioUnits) { cpu.memOut[0xd8 + i] = usciB1; cpu.memIn[0xd8 + i] = usciB1; } + /* usciBx for i2c mode */ + cpu.setIO(0x118, usciB0, true); + cpu.setIO(0x11a, usciB0, true); + cpu.setIO(0x17c, usciB1, true); + cpu.setIO(0x17e, usciB1, true); ioUnits.add(usciA0); ioUnits.add(usciB0); diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index d121aa5..f060e50 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -140,6 +140,15 @@ boolean isFlashBusy; + public void setIO(int adr, IOUnit io, boolean word) { + memOut[adr] = io; + memIn[adr] = io; + if (word) { + memOut[adr + 1] = io; + memIn[adr + 1] = io; + } + } + public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { super("MSP430", "MSP430 Core", null); MAX_INTERRUPT = config.maxInterruptVector; @@ -1023,6 +1032,10 @@ public boolean emulateOP(long maxCycles) throws EmulationException { System.out.println("*** Writing $" + Utils.hex16(dst) + " to reg: " + dstData); writeRegister(dstData, dst); break; + case CMPA_IMM: + break; + case CMPA_REG: + break; default: System.out.println("MSP430X instructions not yet supported..."); } ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/config/MSP430f2617Config.java | 5 +++++ se/sics/mspsim/core/MSP430Core.java | 13 +++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-) hooks/post-receive -- mspsim |
From: Niclas F. <ni...@us...> - 2011-05-12 22:17:07
|
The branch "master" has been updated via c1acb4b9aa1a7e40af55851a34690c95c3a7cafc (commit) from 40dca89e4d363c04754b05ed4a26d348a5b03e5f (commit) Changed paths: M se/sics/mspsim/core/IOPort.java - Log ----------------------------------------------------------------- commit c1acb4b9aa1a7e40af55851a34690c95c3a7cafc Author: Niclas Finne <nf...@si...> Date: Fri May 13 00:16:15 2011 +0200 Added access method for the port number diff --git a/se/sics/mspsim/core/IOPort.java b/se/sics/mspsim/core/IOPort.java index 1d27b2a..b5e66ff 100644 --- a/se/sics/mspsim/core/IOPort.java +++ b/se/sics/mspsim/core/IOPort.java @@ -27,16 +27,12 @@ * * This file is part of MSPSim. * - * $Id$ - * * ----------------------------------------------------------------- * * IOPort * * Author : Joakim Eriksson * Created : Sun Oct 21 22:00:00 2007 - * Updated : $Date$ - * $Revision$ */ package se.sics.mspsim.core; @@ -52,6 +48,7 @@ private static final String[] names = { "IN", "OUT", "DIR", "SEL" }; + private final int port; private final int interrupt; private final MSP430Core cpu; private int interruptFlag; @@ -84,11 +81,16 @@ public IOPort(MSP430Core cpu, int port, int interrupt, int[] memory, int offset) { super("P" + port, "Port " + port, memory, offset); + this.port = port; this.interrupt = interrupt; this.interruptEnable = 0; this.cpu = cpu; } + public int getPort() { + return port; + } + public int getIn() { return memory[offset + IN]; } ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/IOPort.java | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-05-01 10:19:42
|
The branch "master" has been updated via 40dca89e4d363c04754b05ed4a26d348a5b03e5f (commit) from f9cd90083823f56890f102e5e22af72b8a38e289 (commit) Changed paths: M se/sics/mspsim/core/MSP430Core.java M se/sics/mspsim/core/USARTSource.java M se/sics/mspsim/core/USCI.java - Log ----------------------------------------------------------------- commit 40dca89e4d363c04754b05ed4a26d348a5b03e5f Author: Joakim Eriksson <jo...@si...> Date: Sun May 1 12:19:02 2011 +0200 fixed destination handling for indexed mode to work below and above 64KB diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index 575ecc2..d121aa5 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -988,6 +988,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { op = instruction >> 12; int sp = 0; int sr = 0; + int rval = 0; /* register value */ boolean word = (instruction & 0x40) == 0; // Destination vars @@ -1059,8 +1060,20 @@ public boolean emulateOP(long maxCycles) throws EmulationException { break; case AM_INDEX: // TODO: needs to handle if SR is used! - dstAddress = readRegisterCG(dstRegister, ad) + read(pc, MODE_WORD); -// memory[pc] + (memory[pc + 1] << 8); + rval = readRegisterCG(dstRegister, ad); + + /* Support for MSP430X and below / above 64 KB */ + /* if register is pointing to <64KB then it needs to be truncated to below 64 */ + if (rval < 0xffff) { + dstAddress = (rval + read(pc, MODE_WORD)) & 0xffff; + } else { + dstAddress = read(pc, MODE_WORD); + if ((dstAddress & 0x8000) > 0) { + dstAddress |= 0xf0000; + } + dstAddress += rval; + dstAddress &= 0xfffff; + } // When is PC incremented - assuming immediately after "read"? pc += 2; @@ -1300,6 +1313,8 @@ public boolean emulateOP(long maxCycles) throws EmulationException { srcAddress = readRegisterCG(srcRegister, as) + read(pc, MODE_WORD); // memory[pc] + (memory[pc + 1] << 8); // When is PC incremented - assuming immediately after "read"? + + incRegister(PC, 2); cycles += dstRegMode ? 3 : 6; break; @@ -1344,8 +1359,19 @@ public boolean emulateOP(long maxCycles) throws EmulationException { dstAddress = read(pc, MODE_WORD); //memory[pc] + (memory[pc + 1] << 8); } else { // CG here - probably not!??? - dstAddress = readRegister(dstRegister) + read(pc, MODE_WORD); -// + memory[pc] + (memory[pc + 1] << 8); + rval = readRegister(dstRegister); + /* Support for MSP430X and below / above 64 KB */ + /* if register is pointing to <64KB then it needs to be truncated to below 64 */ + if (rval < 0xffff) { + dstAddress = (rval + read(pc, MODE_WORD)) & 0xffff; + } else { + dstAddress = read(pc, MODE_WORD); + if ((dstAddress & 0x8000) > 0) { + dstAddress |= 0xf0000; + } + dstAddress += rval; + dstAddress &= 0xfffff; + } } if (op != MOV) diff --git a/se/sics/mspsim/core/USARTSource.java b/se/sics/mspsim/core/USARTSource.java old mode 100755 new mode 100644 diff --git a/se/sics/mspsim/core/USCI.java b/se/sics/mspsim/core/USCI.java old mode 100755 new mode 100644 ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/MSP430Core.java | 34 ++++++++++++++++++++++++++++++---- 1 files changed, 30 insertions(+), 4 deletions(-) mode change 100755 => 100644 se/sics/mspsim/core/USARTSource.java mode change 100755 => 100644 se/sics/mspsim/core/USCI.java hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-04-28 19:03:06
|
The branch "master" has been updated via f9cd90083823f56890f102e5e22af72b8a38e289 (commit) from c2a4ec21e21fa26e040f30436d117b8dd68466c7 (commit) Changed paths: M se/sics/mspsim/cli/ProfilerCommands.java M se/sics/mspsim/core/MSP430Config.java M se/sics/mspsim/core/MSP430Constants.java M se/sics/mspsim/core/MSP430Core.java M se/sics/mspsim/ui/CPUHeatMap.java M se/sics/mspsim/util/ELFSection.java - Log ----------------------------------------------------------------- commit f9cd90083823f56890f102e5e22af72b8a38e289 Author: Joakim Eriksson <jo...@si...> Date: Thu Apr 28 20:59:57 2011 +0200 fixed partial support for larger memory than 64K diff --git a/se/sics/mspsim/cli/ProfilerCommands.java b/se/sics/mspsim/cli/ProfilerCommands.java index c53f7b3..142a036 100644 --- a/se/sics/mspsim/cli/ProfilerCommands.java +++ b/se/sics/mspsim/cli/ProfilerCommands.java @@ -239,7 +239,7 @@ public int executeCommand(CommandContext context) { private CPUHeatMap hm; public int executeCommand(CommandContext context) { - hm = new CPUHeatMap((WindowManager) registry.getComponent(WindowManager.class)); + hm = new CPUHeatMap(cpu, (WindowManager) registry.getComponent(WindowManager.class)); cpu.setGlobalMonitor(hm); return 0; } diff --git a/se/sics/mspsim/core/MSP430Config.java b/se/sics/mspsim/core/MSP430Config.java index b92d30e..e17c480 100644 --- a/se/sics/mspsim/core/MSP430Config.java +++ b/se/sics/mspsim/core/MSP430Config.java @@ -55,6 +55,7 @@ public UARTConfig(int txVector, int rxVector, int txBit, int rxBit, int sftAddr, }; public int maxMemIO = 0x200; + public int maxMem = 64*1024; public int maxInterruptVector = 15; public boolean MSP430XArch = false; diff --git a/se/sics/mspsim/core/MSP430Constants.java b/se/sics/mspsim/core/MSP430Constants.java index 6eb04ec..3131f1a 100644 --- a/se/sics/mspsim/core/MSP430Constants.java +++ b/se/sics/mspsim/core/MSP430Constants.java @@ -47,6 +47,8 @@ public static final int MISALIGNED_READ = 0; public static final int MISALIGNED_WRITE = 1; + public static final int ADDRESS_OUT_OF_BOUNDS_READ = 2; + public static final int ADDRESS_OUT_OF_BOUNDS_WRITE = 3; public static final int MODE_BYTE = 0; public static final int MODE_WORD = 1; diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index b0a1efb..575ecc2 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -60,7 +60,7 @@ public static final boolean EXCEPTION_ON_BAD_OPERATION = true; // Try it out with 64 k memory - public static final int MAX_MEM = 64*1024; + public final int MAX_MEM; public final int MAX_MEM_IO; public static final int PORTS = 6; @@ -74,11 +74,11 @@ // For breakpoints, etc... how should memory monitors be implemented? // Maybe monitors should have a "next" pointer...? or just have a [][]? - public CPUMonitor[] breakPoints = new CPUMonitor[MAX_MEM]; + public CPUMonitor[] breakPoints; // true => breakpoints can occur! boolean breakpointActive = true; - public int memory[] = new int[MAX_MEM]; + public int memory[]; public long cycles = 0; public long cpuCycles = 0; MapTable map; @@ -144,9 +144,13 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { super("MSP430", "MSP430 Core", null); MAX_INTERRUPT = config.maxInterruptVector; MAX_MEM_IO = config.maxMemIO; + MAX_MEM = config.maxMem; memOut = new IOUnit[MAX_MEM_IO]; memIn = new IOUnit[MAX_MEM_IO]; + memory = new int[MAX_MEM]; + breakPoints = new CPUMonitor[MAX_MEM]; + /* this is for detecting writes/read to/from non-existing IO */ IOUnit voidIO = new IOUnit(id, memory, 0) { public void interruptServiced(int vector) { @@ -726,6 +730,10 @@ public void handlePendingInterrupts() { // Read method that handles read from IO units! public int read(int address, int mode) throws EmulationException { int val = 0; + if (address > MAX_MEM) { + printWarning(ADDRESS_OUT_OF_BOUNDS_READ, address); + address %= MAX_MEM; + } boolean word = mode != MODE_BYTE; // Only word reads at 0x1fe which is highest address... if (address < MAX_MEM_IO) { @@ -766,7 +774,12 @@ public int read(int address, int mode) throws EmulationException { public void write(int dstAddress, int dst, int mode) throws EmulationException { // TODO: optimize memory usage by tagging memory's higher bits. // will also affect below flash write stuff!!! - if (breakPoints[dstAddress] != null) { + if (dstAddress > MAX_MEM) { + printWarning(ADDRESS_OUT_OF_BOUNDS_WRITE, dstAddress); + dstAddress %= MAX_MEM; + } + + if (breakPoints[dstAddress] != null) { breakPoints[dstAddress].cpuAction(CPUMonitor.MEMORY_WRITE, dstAddress, dst); } boolean word = mode != MODE_BYTE; @@ -816,6 +829,15 @@ void printWarning(int type, int address) throws EmulationException { message = "**** Illegal write - misaligned word to $" + Utils.hex16(address) + " at $" + Utils.hex16(reg[PC]); break; + case ADDRESS_OUT_OF_BOUNDS_READ: + message = "**** Illegal read - out of bounds from $" + + Utils.hex16(address) + " at $" + Utils.hex16(reg[PC]); + break; + case ADDRESS_OUT_OF_BOUNDS_WRITE: + message = "**** Illegal write - out of bounds from $" + + Utils.hex16(address) + " at $" + Utils.hex16(reg[PC]); + + break; } if (logger != null && message != null) { logger.warning(this, message); diff --git a/se/sics/mspsim/ui/CPUHeatMap.java b/se/sics/mspsim/ui/CPUHeatMap.java index 280df8f..cf37744 100644 --- a/se/sics/mspsim/ui/CPUHeatMap.java +++ b/se/sics/mspsim/ui/CPUHeatMap.java @@ -22,13 +22,20 @@ private ManagedWindow window; private BufferedImage heatmap; - private int[] heatR = new int[MSP430Core.MAX_MEM]; - private int[] heatW = new int[MSP430Core.MAX_MEM]; - private int[] heatE = new int[MSP430Core.MAX_MEM]; + private int[] heatR; + private int[] heatW; + private int[] heatE; private int heatMax = 0; private int mode = 1; - public CPUHeatMap(WindowManager windowManager) { + private MSP430Core cpu; + + public CPUHeatMap(MSP430Core cpu, WindowManager windowManager) { + this.cpu = cpu; + heatR = new int[cpu.MAX_MEM]; + heatW = new int[cpu.MAX_MEM]; + heatE = new int[cpu.MAX_MEM]; + window = windowManager.createWindow("CPU Heat Map"); heatmap = new BufferedImage(128, 512, BufferedImage.TYPE_INT_RGB); setPreferredSize(new Dimension(140, 530)); @@ -69,7 +76,7 @@ public void updateImage() { switch (mode) { case 0: int me, mr, mw; - for (int i = 0; i < MSP430Core.MAX_MEM; i++) { + for (int i = 0; i < cpu.MAX_MEM; i++) { mw = me = mr = 0; if (heatW[i] > 0) mw = 80; if (heatR[i] > 0) mr = 80; @@ -83,7 +90,7 @@ public void updateImage() { break; case 1: /* slow... */ - for (int i = 0; i < MSP430Core.MAX_MEM; i++) { + for (int i = 0; i < cpu.MAX_MEM; i++) { int r = heatW[i]; int g = heatR[i]; int b = heatE[i]; diff --git a/se/sics/mspsim/util/ELFSection.java b/se/sics/mspsim/util/ELFSection.java index b57ce7f..3df0f07 100644 --- a/se/sics/mspsim/util/ELFSection.java +++ b/se/sics/mspsim/util/ELFSection.java @@ -114,7 +114,8 @@ public String getName(int i) { int pos = getOffset() + i; StringBuffer sb = new StringBuffer(); char c; - while ((c = (char) elf.elfData[pos++]) != 0) { + int elfSize = elf.elfData.length; + while (pos < elfSize && (c = (char) elf.elfData[pos++]) != 0) { sb.append(c); } return sb.toString(); ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/cli/ProfilerCommands.java | 2 +- se/sics/mspsim/core/MSP430Config.java | 1 + se/sics/mspsim/core/MSP430Constants.java | 2 ++ se/sics/mspsim/core/MSP430Core.java | 30 ++++++++++++++++++++++++++---- se/sics/mspsim/ui/CPUHeatMap.java | 19 +++++++++++++------ se/sics/mspsim/util/ELFSection.java | 3 ++- 6 files changed, 45 insertions(+), 12 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-04-20 22:30:11
|
The branch "master" has been updated via c2a4ec21e21fa26e040f30436d117b8dd68466c7 (commit) from 8178b04e50ba90c1b9b990035ca2e1c4741f226e (commit) Changed paths: M se/sics/mspsim/cli/DebugCommands.java M se/sics/mspsim/core/DMA.java M se/sics/mspsim/core/MSP430Constants.java M se/sics/mspsim/debug/DwarfReader.java M se/sics/mspsim/util/GDBStubs.java - Log ----------------------------------------------------------------- commit c2a4ec21e21fa26e040f30436d117b8dd68466c7 Author: Joakim Eriksson <jo...@si...> Date: Thu Apr 21 00:29:17 2011 +0200 fixed compilation bugs due to refactoring diff --git a/se/sics/mspsim/cli/DebugCommands.java b/se/sics/mspsim/cli/DebugCommands.java index b12d21d..631febd 100644 --- a/se/sics/mspsim/cli/DebugCommands.java +++ b/se/sics/mspsim/cli/DebugCommands.java @@ -323,7 +323,7 @@ public int executeCommand(CommandContext context) { int adr = context.getArgumentAsAddress(0); if (adr != -1) { try { - context.out.println(context.getArgument(0) + " = $" + Utils.hex16(cpu.read(adr, adr >= 0x100))); + context.out.println(context.getArgument(0) + " = $" + Utils.hex16(cpu.read(adr, adr >= 0x100 ? MSP430Constants.MODE_WORD : MSP430Constants.MODE_BYTE))); } catch (Exception e) { e.printStackTrace(context.err); } @@ -433,7 +433,7 @@ public int executeCommand(final CommandContext context) { int val = context.getArgumentAsInt(i); boolean word = Utils.size(type) == 2 | val > 0xff; try { - cpu.write(adr, val, word); + cpu.write(adr, val, word ? MSP430Constants.MODE_WORD : MSP430Constants.MODE_BYTE); adr += word ? 2 : 1; } catch (EmulationException e) { e.printStackTrace(context.out); @@ -441,7 +441,7 @@ public int executeCommand(final CommandContext context) { } else if (mode == Utils.ASCII) { String data = context.getArgument(i); for (int j = 0; j < data.length(); j++) { - cpu.write(adr++, data.charAt(j) & 0xff, false); + cpu.write(adr++, data.charAt(j) & 0xff, MSP430Constants.MODE_WORD); } } } diff --git a/se/sics/mspsim/core/DMA.java b/se/sics/mspsim/core/DMA.java index 2a67311..ca9cacb 100644 --- a/se/sics/mspsim/core/DMA.java +++ b/se/sics/mspsim/core/DMA.java @@ -130,12 +130,12 @@ public void trigger(DMATrigger trigger, int index) { /* perform memory move and possibly clear triggering flag!!! */ /* NOTE: show config byte/word also !!! */ if (enable) { - int data = cpu.read(currentSourceAddress, false); + int data = cpu.read(currentSourceAddress, MSP430Constants.MODE_BYTE); System.out.println("DMA Triggered reading from: " + currentSourceAddress + " => " + data + " " + (char) data + " size:" + size + " index:" + index); trigger.clearDMATrigger(index); - DMA.this.cpu.write(currentDestinationAddress, data, false); + DMA.this.cpu.write(currentDestinationAddress, data, MSP430Constants.MODE_BYTE); currentSourceAddress += srcIncr; currentDestinationAddress += dstIncr; diff --git a/se/sics/mspsim/core/MSP430Constants.java b/se/sics/mspsim/core/MSP430Constants.java index fef37ca..6eb04ec 100644 --- a/se/sics/mspsim/core/MSP430Constants.java +++ b/se/sics/mspsim/core/MSP430Constants.java @@ -48,6 +48,12 @@ public static final int MISALIGNED_READ = 0; public static final int MISALIGNED_WRITE = 1; + public static final int MODE_BYTE = 0; + public static final int MODE_WORD = 1; + public static final int MODE_WORD20 = 2; + + public static final int MODE_MASK[] = {0xff, 0xffff, 0xfffff}; + /* memory tags - not used yet*/ public static final int READ_MONITOR = 0x1000; public static final int WRITE_MONITOR = 0x2000; diff --git a/se/sics/mspsim/debug/DwarfReader.java b/se/sics/mspsim/debug/DwarfReader.java old mode 100755 new mode 100644 diff --git a/se/sics/mspsim/util/GDBStubs.java b/se/sics/mspsim/util/GDBStubs.java index 2b5b3dd..51584c7 100644 --- a/se/sics/mspsim/util/GDBStubs.java +++ b/se/sics/mspsim/util/GDBStubs.java @@ -47,6 +47,7 @@ import java.net.Socket; import se.sics.mspsim.core.EmulationException; +import se.sics.mspsim.core.MSP430Constants; import se.sics.mspsim.core.MSP430Core; public class GDBStubs implements Runnable { @@ -175,7 +176,7 @@ private void handleCmd(String cmd, int[] cmdBytes, int cmdLen) for (int i = 0; i < len; i++) { System.out.println("Writing: " + cmdBytes[cPos] + " to " + addr + " cpos=" + cPos); - cpu.write(addr++, cmdBytes[cPos++], false); + cpu.write(addr++, cmdBytes[cPos++], MSP430Constants.MODE_BYTE); } sendResponse(OK); } ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/cli/DebugCommands.java | 6 +++--- se/sics/mspsim/core/DMA.java | 4 ++-- se/sics/mspsim/core/MSP430Constants.java | 6 ++++++ se/sics/mspsim/util/GDBStubs.java | 3 ++- 4 files changed, 13 insertions(+), 6 deletions(-) mode change 100755 => 100644 se/sics/mspsim/debug/DwarfReader.java hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-04-20 22:03:21
|
The branch "master" has been updated via 8178b04e50ba90c1b9b990035ca2e1c4741f226e (commit) from 0a34f8313930da4a818bc9e146a52e2975edadc5 (commit) Changed paths: M se/sics/mspsim/core/MSP430Core.java - Log ----------------------------------------------------------------- commit 8178b04e50ba90c1b9b990035ca2e1c4741f226e Author: Joakim Eriksson <jo...@si...> Date: Wed Apr 20 23:59:34 2011 +0200 added memIn for IOPorts diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index 647fdcf..b0a1efb 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -103,6 +103,7 @@ // Op/instruction represents the last executed OP / instruction private int op; public int instruction; + private int extWord; int servicedInterrupt = -1; InterruptHandler servicedInterruptUnit = null; @@ -145,6 +146,26 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { MAX_MEM_IO = config.maxMemIO; memOut = new IOUnit[MAX_MEM_IO]; memIn = new IOUnit[MAX_MEM_IO]; + + /* this is for detecting writes/read to/from non-existing IO */ + IOUnit voidIO = new IOUnit(id, memory, 0) { + public void interruptServiced(int vector) { + } + public void write(int address, int value, boolean word, long cycles) { + System.out.println("*** IOUnit write to non-existent IO at " + address); + } + public int read(int address, boolean word, long cycles) { + System.out.println("*** IOUnit read from non-existent IO at " + address); + return 0; + } + }; + + /* fill with void IO */ + for (int i = 0; i < MAX_MEM_IO; i++) { + memOut[i] = voidIO; + memIn[i] = voidIO; + } + this.registry = registry; this.config = config; // The CPU need to register itself as chip @@ -192,6 +213,7 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { bcs = new BasicClockModule(this, memory, 0, new Timer[] {ta, tb}); for (int i = 0x56, n = 0x59; i < n; i++) { memOut[i] = bcs; + memIn[i] = bcs; } Multiplier mp = new Multiplier(this, memory, 0); @@ -208,6 +230,8 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { for (int i = 0, n = 8; i < n; i++) { memOut[0x20 + i] = ioUnits.get(0); memOut[0x28 + i] = ioUnits.get(1); + memIn[0x20 + i] = ioUnits.get(0); + memIn[0x28 + i] = ioUnits.get(1); } // Add port 3,4 & 5,6 @@ -218,6 +242,10 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { memOut[0x19 + i * 4] = p; memOut[0x1a + i * 4] = p; memOut[0x1b + i * 4] = p; + memIn[0x18 + i * 4] = p; + memIn[0x19 + i * 4] = p; + memIn[0x1a + i * 4] = p; + memIn[0x1b + i * 4] = p; } for (int i = 0, n = 2; i < n; i++) { @@ -228,6 +256,10 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { memOut[0x31 + i * 4] = p; memOut[0x32 + i * 4] = p; memOut[0x33 + i * 4] = p; + memIn[0x30 + i * 4] = p; + memIn[0x31 + i * 4] = p; + memIn[0x32 + i * 4] = p; + memIn[0x33 + i * 4] = p; } // SFR and Basic clock system. @@ -692,59 +724,66 @@ public void handlePendingInterrupts() { } // Read method that handles read from IO units! - public int read(int address, boolean word) throws EmulationException { - int val = 0; - // Only word reads at 0x1fe which is highest address... - if (address < 0x1ff && memIn[address] != null) { - val = memIn[address].read(address, word, cycles); - } else { - address &= 0xffff; + public int read(int address, int mode) throws EmulationException { + int val = 0; + boolean word = mode != MODE_BYTE; + // Only word reads at 0x1fe which is highest address... + if (address < MAX_MEM_IO) { + val = memIn[address].read(address, word, cycles); + if (mode == MODE_WORD20) { + val |= memIn[address + 2].read(address, word, cycles) << 16; + } + } else { + if (isFlashBusy && flash.addressInFlash(address)) { + flash.notifyRead(address); + } - if (isFlashBusy && flash.addressInFlash(address)) { - flash.notifyRead(address); + val = memory[address] & 0xff; + if (mode > MODE_BYTE) { + val |= (memory[address + 1] << 8); + if ((address & 1) != 0) { + printWarning(MISALIGNED_READ, address); + } + if (mode == MODE_WORD20) { + /* will the read really get data from the full word? CHECK THIS */ + val |= (memory[address + 2] << 16) | (memory[address + 3] << 24); + val &= 0xfffff; + } else { + val &= 0xffff; + } + } } - - val = memory[address] & 0xff; - if (word) { - val |= (memory[(address + 1) & 0xffff] << 8); - if ((address & 1) != 0) { - printWarning(MISALIGNED_READ, address); - } + if (breakPoints[address] != null) { + breakPoints[address].cpuAction(CPUMonitor.MEMORY_READ, address, val); } - } - if (breakPoints[address] != null) { - breakPoints[address].cpuAction(CPUMonitor.MEMORY_READ, address, val); - } - /* is a null check as fast as a boolean check ?*/ - if (globalMonitor != null) { - globalMonitor.cpuAction(CPUMonitor.MEMORY_READ, address, val); - } - return val; + /* is a null check as fast as a boolean check ?*/ + if (globalMonitor != null) { + globalMonitor.cpuAction(CPUMonitor.MEMORY_READ, address, val); + } + return val; } - public void write(int dstAddress, int dst, boolean word) throws EmulationException { + public void write(int dstAddress, int dst, int mode) throws EmulationException { // TODO: optimize memory usage by tagging memory's higher bits. // will also affect below flash write stuff!!! if (breakPoints[dstAddress] != null) { breakPoints[dstAddress].cpuAction(CPUMonitor.MEMORY_WRITE, dstAddress, dst); } + boolean word = mode != MODE_BYTE; // Only word writes at 0x1fe which is highest address... - if (dstAddress < 0x1ff && memOut[dstAddress] != null) { + if (dstAddress < MAX_MEM_IO) { if (!word) dst &= 0xff; - memOut[dstAddress].write(dstAddress, dst, word, cycles); - // } else { - // // TODO: add check for Flash / RAM! - // memory[dstAddress] = dst & 0xff; - // if (word) { - // memory[dstAddress + 1] = (dst >> 8) & 0xff; - // if ((dstAddress & 1) != 0) { - // printWarning(MISALIGNED_WRITE, dstAddress); - // } - // } + memOut[dstAddress].write(dstAddress, dst & 0xffff, mode != MODE_BYTE, cycles); + if (mode > MODE_WORD) { + memOut[dstAddress].write(dstAddress + 2, dst >> 16, mode != MODE_BYTE, cycles); + } // check for Flash } else if (flash.addressInFlash(dstAddress)) { - flash.flashWrite(dstAddress, dst, word); + flash.flashWrite(dstAddress, dst & 0xffff, word); + if (mode > MODE_WORD) { + flash.flashWrite(dstAddress + 2, dst >> 16, word); + } } else { // assume RAM memory[dstAddress] = dst & 0xff; @@ -753,6 +792,10 @@ public void write(int dstAddress, int dst, boolean word) throws EmulationExcepti if ((dstAddress & 1) != 0) { printWarning(MISALIGNED_WRITE, dstAddress); } + if (mode > MODE_WORD) { + memory[dstAddress + 2] = (dst >> 16) & 0xff; /* should be 0x0f ?? */ + memory[dstAddress + 3] = (dst >> 24) & 0xff; /* will be only zeroes*/ + } } } /* is a null check as fast as a boolean check */ @@ -806,16 +849,16 @@ private int serviceInterrupt(int pc) { // Push PC and SR to stack // store on stack - always move 2 steps (W) even if B. writeRegister(SP, sp = spBefore - 2); - write(sp, pc, true); + write(sp, pc, MODE_WORD); writeRegister(SP, sp = sp - 2); - write(sp, sr, true); + write(sp, sr, MODE_WORD); } // Clear SR writeRegister(SR, 0); // sr & ~CPUOFF & ~SCG1 & ~OSCOFF); // Jump to the address specified in the interrupt vector - writeRegister(PC, pc = read(0xfffe - (MAX_INTERRUPT - interruptMax) * 2, true)); + writeRegister(PC, pc = read(0xfffe - (MAX_INTERRUPT - interruptMax) * 2, MODE_WORD)); servicedInterrupt = interruptMax; servicedInterruptUnit = interruptSource[servicedInterrupt]; @@ -910,7 +953,16 @@ public boolean emulateOP(long maxCycles) throws EmulationException { globalMonitor.cpuAction(CPUMonitor.EXECUTE, pc, 0); } - instruction = read(pc, true); + instruction = read(pc, MODE_WORD); + + /* check for extension words */ + if ((instruction & 0xff00) == 0x1800) { + System.out.println("*** Extension word!!! - read the instruction too..."); + extWord = instruction; + pc += 2; + instruction = read(pc, MODE_WORD); + } + op = instruction >> 12; int sp = 0; int sr = 0; @@ -942,7 +994,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { switch(op) { // 20 bit register write case MOVA_IMM2REG: - src = read(pc, true); + src = read(pc, MODE_WORD); writeRegister(PC, pc += 2); dst = src + (srcData << 16); System.out.println("*** Writing $" + Utils.hex16(dst) + " to reg: " + dstData); @@ -954,13 +1006,14 @@ public boolean emulateOP(long maxCycles) throws EmulationException { break; case 1: + { // ------------------------------------------------------------------- // Single operand instructions // ------------------------------------------------------------------- - { + // Register dstRegister = instruction & 0xf; - // Adress mode of destination... + // Address mode of destination... int ad = (instruction >> 4) & 3; int nxtCarry = 0; op = instruction & 0xff80; @@ -984,7 +1037,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { break; case AM_INDEX: // TODO: needs to handle if SR is used! - dstAddress = readRegisterCG(dstRegister, ad) + read(pc, true); + dstAddress = readRegisterCG(dstRegister, ad) + read(pc, MODE_WORD); // memory[pc] + (memory[pc + 1] << 8); // When is PC incremented - assuming immediately after "read"? @@ -1021,7 +1074,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { dst &= 0xff; } } else { - dst = read(dstAddress, word); + dst = read(dstAddress, word ? MODE_WORD : MODE_BYTE); } switch(op) { @@ -1069,12 +1122,12 @@ public boolean emulateOP(long maxCycles) throws EmulationException { // Put lo & hi on stack! // memory[sp] = dst & 0xff; // memory[sp + 1] = dst >> 8; - write(sp, dst, true); + write(sp, dst, MODE_WORD); } else { // Byte => only lo byte // memory[sp] = dst & 0xff; // memory[sp + 1] = 0; - write(sp, dst & 0xff, true); + write(sp, dst & 0xff, MODE_WORD); } /* if REG or INDIRECT AUTOINC then add 2 cycles, otherwise 1 */ cycles += (ad == AM_REG || ad == AM_IND_AUTOINC) ? 2 : 1; @@ -1086,7 +1139,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { pc = readRegister(PC); // memory[sp] = pc & 0xff; // memory[sp + 1] = pc >> 8; - write(sp, pc, true); + write(sp, pc, MODE_WORD); writeRegister(PC, dst); /* Additional cycles: REG => 3, AM_IND_AUTO => 2, other => 1 */ @@ -1108,12 +1161,12 @@ public boolean emulateOP(long maxCycles) throws EmulationException { // Put Top of stack to Status DstRegister (TOS -> SR) servicedInterrupt = -1; /* needed before write to SR!!! */ sp = readRegister(SP); - writeRegister(SR, read(sp, true)); + writeRegister(SR, read(sp, MODE_WORD)); sp = sp + 2; // writeRegister(SR, memory[sp++] + (memory[sp++] << 8)); // TOS -> PC // writeRegister(PC, memory[sp++] + (memory[sp++] << 8)); - writeRegister(PC, read(sp, true)); + writeRegister(PC, read(sp, MODE_WORD)); sp = sp + 2; writeRegister(SP, sp); write = false; @@ -1222,7 +1275,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { break; case AM_INDEX: // Indexed if reg != PC & CG1/CG2 - will PC be incremented? - srcAddress = readRegisterCG(srcRegister, as) + read(pc, true); + srcAddress = readRegisterCG(srcRegister, as) + read(pc, MODE_WORD); // memory[pc] + (memory[pc + 1] << 8); // When is PC incremented - assuming immediately after "read"? incRegister(PC, 2); @@ -1266,15 +1319,15 @@ public boolean emulateOP(long maxCycles) throws EmulationException { pc = readRegister(PC); if (dstRegister == 2) { /* absolute mode */ - dstAddress = read(pc, true); //memory[pc] + (memory[pc + 1] << 8); + dstAddress = read(pc, MODE_WORD); //memory[pc] + (memory[pc + 1] << 8); } else { // CG here - probably not!??? - dstAddress = readRegister(dstRegister) + read(pc, true); + dstAddress = readRegister(dstRegister) + read(pc, MODE_WORD); // + memory[pc] + (memory[pc + 1] << 8); } if (op != MOV) - dst = read(dstAddress, word); + dst = read(dstAddress, word ? MODE_WORD : MODE_BYTE); pc += 2; incRegister(PC, 2); } @@ -1285,7 +1338,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { // Got very high address - check that?!! srcAddress = srcAddress & 0xffff; - src = read(srcAddress, word); + src = read(srcAddress, word ? MODE_WORD : MODE_BYTE); // if (debug) { // System.out.println("Reading from " + Utils.hex16(srcAddress) + @@ -1434,7 +1487,7 @@ public boolean emulateOP(long maxCycles) throws EmulationException { writeRegister(dstRegister, dst); } else { dstAddress &= 0xffff; - write(dstAddress, dst, word); + write(dstAddress, dst, word ? MODE_WORD : MODE_BYTE); } } if (updateStatus) { @@ -1485,7 +1538,7 @@ public String info() { StringBuffer buf = new StringBuffer(); for (int i = 0; i < 16; i++) { buf.append("Vector: at $" + Utils.hex16(0xfffe - i * 2) + " -> $" + - Utils.hex16(read(0xfffe - i * 2, true)) + "\n"); + Utils.hex16(read(0xfffe - i * 2, MODE_WORD)) + "\n"); } return buf.toString(); } ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/MSP430Core.java | 171 +++++++++++++++++++++++------------ 1 files changed, 112 insertions(+), 59 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-04-20 13:56:09
|
The branch "master" has been updated via 0a34f8313930da4a818bc9e146a52e2975edadc5 (commit) from f82ac147fce3e6dd4726738a2d595cd783892001 (commit) Changed paths: M se/sics/mspsim/core/MSP430Core.java - Log ----------------------------------------------------------------- commit 0a34f8313930da4a818bc9e146a52e2975edadc5 Author: Joakim Eriksson <jo...@si...> Date: Wed Apr 20 15:55:53 2011 +0200 cleanup of IOPort setup diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index d476b69..647fdcf 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -212,20 +212,22 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { // Add port 3,4 & 5,6 for (int i = 0, n = 2; i < n; i++) { - ioUnits.add(new IOPort(this, (3 + i), 0, memory, 0x18 + i * 4)); - memOut[0x18 + i * 4] = ioUnits.get(i + 2); - memOut[0x19 + i * 4] = ioUnits.get(i + 2); - memOut[0x1a + i * 4] = ioUnits.get(i + 2); - memOut[0x1b + i * 4] = ioUnits.get(i + 2); - } + IOPort p = new IOPort(this, (3 + i), 0, memory, 0x18 + i * 4); + ioUnits.add(p); + memOut[0x18 + i * 4] = p; + memOut[0x19 + i * 4] = p; + memOut[0x1a + i * 4] = p; + memOut[0x1b + i * 4] = p; + } for (int i = 0, n = 2; i < n; i++) { - ioUnits.add(new IOPort(this, (5 + i), 0, memory, 0x30 + i * 4)); + IOPort p = new IOPort(this, (5 + i), 0, memory, 0x30 + i * 4); + ioUnits.add(p); - memOut[0x30 + i * 4] = ioUnits.get(i + 4); - memOut[0x31 + i * 4] = ioUnits.get(i + 4); - memOut[0x32 + i * 4] = ioUnits.get(i + 4); - memOut[0x33 + i * 4] = ioUnits.get(i + 4); + memOut[0x30 + i * 4] = p; + memOut[0x31 + i * 4] = p; + memOut[0x32 + i * 4] = p; + memOut[0x33 + i * 4] = p; } // SFR and Basic clock system. @@ -579,13 +581,12 @@ public void printEventQueues(PrintStream out) { out.println("Virtual time event queue: (next time: " + nextVTimeEventCycles + ")"); vTimeEventQueue.print(out); } - + // Should also return active units... public IOUnit getIOUnit(String name) { - for (int i = 0, n = ioUnits.size(); i < n; i++) { - IOUnit ioUnit = ioUnits.get(i); - if (ioUnit != null && name.equalsIgnoreCase(ioUnit.getID()) || - name.equalsIgnoreCase(ioUnit.getName())) { + for (IOUnit ioUnit : ioUnits) { + if (name.equalsIgnoreCase(ioUnit.getID()) || + name.equalsIgnoreCase(ioUnit.getName())) { return ioUnit; } } ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/core/MSP430Core.java | 33 +++++++++++++++++---------------- 1 files changed, 17 insertions(+), 16 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-04-19 21:15:22
|
The branch "master" has been updated via f82ac147fce3e6dd4726738a2d595cd783892001 (commit) from 4ab3bc993f1f929bbc7703f1f8c31d03ce414140 (commit) Changed paths: M se/sics/mspsim/debug/DwarfReader.java - Log ----------------------------------------------------------------- commit f82ac147fce3e6dd4726738a2d595cd783892001 Author: Joakim Eriksson <jo...@si...> Date: Tue Apr 19 23:13:18 2011 +0200 applied patch by Francois Revol / Read every statement program sequences until the end of the compilation diff --git a/se/sics/mspsim/debug/DwarfReader.java b/se/sics/mspsim/debug/DwarfReader.java index e1655c1..e064717 100755 --- a/se/sics/mspsim/debug/DwarfReader.java +++ b/se/sics/mspsim/debug/DwarfReader.java @@ -207,109 +207,109 @@ private void readLines(ELFSection sec) { System.out.println("Line: first bytes of the machine: "); System.out.print("Line: "); } - /* reset the "state" of the state machine (6.2.2 spec) */ - lineAddress = 0; - lineFile = 1; - lineLine = 1; - lineColumn = 0; - endSequence = false; - isStatement = defaultIsStmt != 0; - isBasicBlock = false; - if (sec.getPosition() >= endPos) { - endSequence = true; - } - lineData.clear(); - - while(!endSequence) { - int ins = sec.readElf8(); - if (DEBUG) System.out.print(Utils.hex8(ins) + " "); - switch(ins) { - case DW_LNS_EXT: - /* extended instruction */ - int len = sec.readElf8(); - int extIns = sec.readElf8(); - switch(extIns) { - case DW_LNE_end_sequence: - endSequence = true; - if (DEBUG) System.out.println("Line: End sequence executed!!!"); + while (sec.getPosition() < endPos) { + /* reset the "state" of the state machine (6.2.2 spec) */ + lineAddress = 0; + lineFile = 1; + lineLine = 1; + lineColumn = 0; + endSequence = false; + isStatement = defaultIsStmt != 0; + isBasicBlock = false; + + lineData.clear(); + + while(!endSequence) { + int ins = sec.readElf8(); + if (DEBUG) System.out.print(Utils.hex8(ins) + " "); + switch(ins) { + case DW_LNS_EXT: + /* extended instruction */ + int len = sec.readElf8(); + int extIns = sec.readElf8(); + switch(extIns) { + case DW_LNE_end_sequence: + endSequence = true; + if (DEBUG) System.out.println("Line: End sequence executed!!!"); + break; + case DW_LNE_define_file: + if (DEBUG) System.out.println("Line: Should define a file!!!!"); + break; + case DW_LNE_set_address: + if (len == 2) + lineAddress = sec.readElf8(); + if (len == 3) + lineAddress = sec.readElf16(); + if (len == 5) + lineAddress = sec.readElf32(); + if (DEBUG) System.out.println("Line: Set address to: " + Utils.hex16(lineAddress) + + " (len: " + len + ")"); + break; + } + break; + case DW_LNS_copy: + /* copy data to matrix... */ + lineData.add(new LineEntry(lineLine, lineAddress)); + isBasicBlock = false; + break; + case DW_LNS_advance_pc: + long add = sec.readLEB128(); + lineAddress += add * minOpLen; + if (DEBUG) System.out.println("Line: Increased address to: " + Utils.hex16(lineAddress)); + break; + case DW_LNS_advance_line: + long addLine = sec.readLEB128S(); + lineLine += addLine; + if (DEBUG) System.out.println("Line: Increased line to: " + lineLine + + " (incr: " + addLine + ")"); + break; + case DW_LNS_set_file: + lineFile = (int) sec.readLEB128(); + if (DEBUG) System.out.println("Line: Set file to: " + lineFile); break; - case DW_LNE_define_file: - if (DEBUG) System.out.println("Line: Should define a file!!!!"); + case DW_LNS_set_column: + lineColumn = (int) sec.readLEB128(); + if (DEBUG) System.out.println("Line: set column to: " + lineColumn); break; - case DW_LNE_set_address: - if (len == 2) - lineAddress = sec.readElf8(); - if (len == 3) - lineAddress = sec.readElf16(); - if (len == 5) - lineAddress = sec.readElf32(); - if (DEBUG) System.out.println("Line: Set address to: " + Utils.hex16(lineAddress) + - " (len: " + len + ")"); + case DW_LNS_negate_stmt: + isStatement = !isStatement; + if (DEBUG) System.out.println("Line: Negated is statement"); break; + case DW_LNS_set_basic_block: + isBasicBlock = true; + if (DEBUG) System.out.println("Line: Set basic block to true"); + break; + case DW_LNS_const_add_pc: + if (DEBUG) System.out.println("Line: *** Should add const to PC - but how much - same as FF??"); + break; + case DW_LNS_fixed_advance_pc: + int incr = sec.readElf16(); + lineAddress += incr; + if (DEBUG) System.out.println("Line: *** Increased address to: " + Utils.hex16(lineAddress)); + break; + default: + int lineInc = lineBase + ((ins - opcodeBase) % lineRange); + int addrInc = (ins - opcodeBase) / lineRange; + lineAddress += addrInc * minOpLen; + lineLine += lineInc; + lineData.add(new LineEntry(lineLine, lineAddress)); + isBasicBlock = false; + + if (DEBUG) System.out.println("Line: *** Special operation => addr: " + + Utils.hex16(lineAddress) + " Line: " + lineLine + " lineInc: " + lineInc); } - break; - case DW_LNS_copy: - /* copy data to matrix... */ - lineData.add(new LineEntry(lineLine, lineAddress)); - isBasicBlock = false; - break; - case DW_LNS_advance_pc: - long add = sec.readLEB128(); - lineAddress += add * minOpLen; - if (DEBUG) System.out.println("Line: Increased address to: " + Utils.hex16(lineAddress)); - break; - case DW_LNS_advance_line: - long addLine = sec.readLEB128S(); - lineLine += addLine; - if (DEBUG) System.out.println("Line: Increased line to: " + lineLine + - " (incr: " + addLine + ")"); - break; - case DW_LNS_set_file: - lineFile = (int) sec.readLEB128(); - if (DEBUG) System.out.println("Line: Set file to: " + lineFile); - break; - case DW_LNS_set_column: - lineColumn = (int) sec.readLEB128(); - if (DEBUG) System.out.println("Line: set column to: " + lineColumn); - break; - case DW_LNS_negate_stmt: - isStatement = !isStatement; - if (DEBUG) System.out.println("Line: Negated is statement"); - break; - case DW_LNS_set_basic_block: - isBasicBlock = true; - if (DEBUG) System.out.println("Line: Set basic block to true"); - break; - case DW_LNS_const_add_pc: - if (DEBUG) System.out.println("Line: *** Should add const to PC - but how much - same as FF??"); - break; - case DW_LNS_fixed_advance_pc: - int incr = sec.readElf16(); - lineAddress += incr; - if (DEBUG) System.out.println("Line: *** Increased address to: " + Utils.hex16(lineAddress)); - break; - default: - int lineInc = lineBase + ((ins - opcodeBase) % lineRange); - int addrInc = (ins - opcodeBase) / lineRange; - lineAddress += addrInc * minOpLen; - lineLine += lineInc; - lineData.add(new LineEntry(lineLine, lineAddress)); - isBasicBlock = false; - - if (DEBUG) System.out.println("Line: *** Special operation => addr: " + - Utils.hex16(lineAddress) + " Line: " + lineLine + " lineInc: " + lineInc); } - } - if (DEBUG) System.out.println("Line - Position " + sec.getPosition() + " totLen: " + totLen); + if (DEBUG) System.out.println("Line - Position " + sec.getPosition() + " totLen: " + totLen); - if (lineData.size() > 0) { - /* create a block of line-address data that can be used for lookup later.*/ - LineData lineTable = new LineData(); - lineTable.lineEntries = lineData.toArray(new LineEntry[0]); - lineTable.includeDirs = directories.toArray(new String[0]); - lineTable.sourceFiles = files.toArray(new String[0]); - lineInfo.add(lineTable); + if (lineData.size() > 0) { + /* create a block of line-address data that can be used for lookup later.*/ + LineData lineTable = new LineData(); + lineTable.lineEntries = lineData.toArray(new LineEntry[0]); + lineTable.includeDirs = directories.toArray(new String[0]); + lineTable.sourceFiles = files.toArray(new String[0]); + lineInfo.add(lineTable); + } } } ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/debug/DwarfReader.java | 192 ++++++++++++++++---------------- 1 files changed, 96 insertions(+), 96 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-04-08 21:47:48
|
The branch "master" has been updated via 4ab3bc993f1f929bbc7703f1f8c31d03ce414140 (commit) from 6ab1eadb97515b3d589061cbb8bfff988aaeed8a (commit) Changed paths: A firmware/z1/blink.firmware - Log ----------------------------------------------------------------- commit 4ab3bc993f1f929bbc7703f1f8c31d03ce414140 Author: Joakim Eriksson <jo...@si...> Date: Fri Apr 8 23:46:57 2011 +0200 added z1 firmware diff --git a/firmware/z1/blink.firmware b/firmware/z1/blink.firmware new file mode 100644 index 0000000..ef86e5f Binary files /dev/null and b/firmware/z1/blink.firmware differ ----------------------------------------------------------------------- Summary of changes: firmware/z1/blink.firmware | Bin 0 -> 465002 bytes 1 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 firmware/z1/blink.firmware hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-04-08 20:22:18
|
The branch "master" has been updated via 6ab1eadb97515b3d589061cbb8bfff988aaeed8a (commit) from d7a36abbfb8a12fcf68c54f1ffbeb0b86793ca33 (commit) Changed paths: A .gitignore M se/sics/mspsim/chip/AT45DB.java M se/sics/mspsim/chip/CC2420.java M se/sics/mspsim/chip/M25P80.java M se/sics/mspsim/chip/TR1001.java M se/sics/mspsim/config/MSP430f1611Config.java M se/sics/mspsim/config/MSP430f2617Config.java M se/sics/mspsim/core/MSP430Config.java M se/sics/mspsim/core/MSP430Core.java M se/sics/mspsim/core/SFR.java M se/sics/mspsim/core/USART.java M se/sics/mspsim/core/USARTListener.java A se/sics/mspsim/core/USARTSource.java C069 se/sics/mspsim/core/USART.java se/sics/mspsim/core/USCI.java M se/sics/mspsim/platform/jcreate/JCreateNode.java M se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java M se/sics/mspsim/platform/sky/CC2420Node.java M se/sics/mspsim/platform/sky/SkyNode.java M se/sics/mspsim/platform/sky/TelosNode.java M se/sics/mspsim/platform/z1/Z1Node.java M se/sics/mspsim/ui/SerialMon.java M se/sics/mspsim/util/Test.java - Log ----------------------------------------------------------------- commit 6ab1eadb97515b3d589061cbb8bfff988aaeed8a Author: Joakim Eriksson <jo...@si...> Date: Fri Apr 8 22:21:36 2011 +0200 added improved support for Z1/2xxx platform diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..73a6866 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.class +.DS_Store diff --git a/se/sics/mspsim/chip/AT45DB.java b/se/sics/mspsim/chip/AT45DB.java index 5c8c355..5d07695 100644 --- a/se/sics/mspsim/chip/AT45DB.java +++ b/se/sics/mspsim/chip/AT45DB.java @@ -141,7 +141,7 @@ private void setReady(boolean ready) { status &= ~STATUS_RDY; } - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { int buf_num = 1; if (chipSelect) { diff --git a/se/sics/mspsim/chip/CC2420.java b/se/sics/mspsim/chip/CC2420.java index b8ea453..3c53d65 100644 --- a/se/sics/mspsim/chip/CC2420.java +++ b/se/sics/mspsim/chip/CC2420.java @@ -715,7 +715,7 @@ private void setReg(int address, int data) { configurationChanged(address, oldValue, data); } - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { int oldStatus = status; if (DEBUG) { log("byte received: " + Utils.hex8(data) + @@ -880,6 +880,10 @@ public void dataReceived(USART source, int data) { break; } source.byteReceived(oldStatus); + } else { + /* No VREG but chip select */ + if (chipSelect) source.byteReceived(0); + System.out.println("**** Warning - writing to CC2420 when VREG is off!!!"); } } @@ -1268,7 +1272,8 @@ public void setVRegOn(boolean newOn) { if(newOn) { // 0.6ms maximum vreg startup from datasheet pg 13 - cpu.scheduleTimeEventMillis(vregEvent, 0.1); + // but Z1 platform does not work with 0.1 so trying with lower... + cpu.scheduleTimeEventMillis(vregEvent, 0.05); if (DEBUG) log("Scheduling vregEvent at: cyc = " + cpu.cycles + " target: " + vregEvent.getTime() + " current: " + cpu.getTime()); } else { diff --git a/se/sics/mspsim/chip/M25P80.java b/se/sics/mspsim/chip/M25P80.java index b9e98fc..0a36e8d 100644 --- a/se/sics/mspsim/chip/M25P80.java +++ b/se/sics/mspsim/chip/M25P80.java @@ -109,7 +109,7 @@ public int getStatus() { public void stateChanged(int state) { } - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { if (chipSelect) { if (DEBUG) { log("byte received: " + data); diff --git a/se/sics/mspsim/chip/TR1001.java b/se/sics/mspsim/chip/TR1001.java index e115a39..93c25be 100644 --- a/se/sics/mspsim/chip/TR1001.java +++ b/se/sics/mspsim/chip/TR1001.java @@ -43,6 +43,7 @@ import se.sics.mspsim.core.MSP430Core; import se.sics.mspsim.core.USART; import se.sics.mspsim.core.USARTListener; +import se.sics.mspsim.core.USARTSource; /** * @@ -66,7 +67,7 @@ public TR1001(MSP430Core cpu, USART usart) { setMode(MODE_TXRX_OFF); usart.setUSARTListener(new USARTListener() { - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { RFListener listener = rfListener; if (getMode() != MODE_TXRX_ON) { // Radio is turned off during transmission diff --git a/se/sics/mspsim/config/MSP430f1611Config.java b/se/sics/mspsim/config/MSP430f1611Config.java index 4ae748c..b1e5dce 100755 --- a/se/sics/mspsim/config/MSP430f1611Config.java +++ b/se/sics/mspsim/config/MSP430f1611Config.java @@ -35,6 +35,7 @@ package se.sics.mspsim.config; +import java.util.ArrayList; import se.sics.mspsim.core.DMA; import se.sics.mspsim.core.IOUnit; import se.sics.mspsim.core.InterruptMultiplexer; @@ -56,7 +57,7 @@ public MSP430f1611Config() { } - public int setup(MSP430Core cpu, IOUnit[] ioUnits, int ioPos) { + public int setup(MSP430Core cpu, ArrayList<IOUnit> ioUnits) { System.out.println("*** Setting up f1611 IO!"); USART usart0 = new USART(cpu, 0, cpu.memory, 0x70); @@ -71,8 +72,8 @@ public int setup(MSP430Core cpu, IOUnit[] ioUnits, int ioPos) { } // Usarts - ioUnits[ioPos] = usart0; - ioUnits[ioPos + 1] = usart1; + ioUnits.add(usart0); + ioUnits.add(usart1); DMA dma = new DMA("dma", cpu.memory, 0, cpu); for (int i = 0, n = 24; i < n; i++) { @@ -91,7 +92,7 @@ public int setup(MSP430Core cpu, IOUnit[] ioUnits, int ioPos) { dma.setDMATrigger(DMA.UTXIFG1, usart1, 1); dma.setInterruptMultiplexer(new InterruptMultiplexer(cpu, 0)); - ioUnits[ioPos + 2] = dma; + ioUnits.add(dma); return 3; } } diff --git a/se/sics/mspsim/config/MSP430f2617Config.java b/se/sics/mspsim/config/MSP430f2617Config.java index f727d36..14aa51b 100755 --- a/se/sics/mspsim/config/MSP430f2617Config.java +++ b/se/sics/mspsim/config/MSP430f2617Config.java @@ -35,10 +35,12 @@ package se.sics.mspsim.config; +import java.util.ArrayList; import se.sics.mspsim.core.IOUnit; import se.sics.mspsim.core.MSP430Config; import se.sics.mspsim.core.MSP430Core; import se.sics.mspsim.core.Timer; +import se.sics.mspsim.core.USCI; public class MSP430f2617Config extends MSP430Config { @@ -52,10 +54,46 @@ public MSP430f2617Config() { TimerConfig timerA = new TimerConfig(25, 24, 3, 0x160, Timer.TIMER_Ax149, "TimerA"); TimerConfig timerB = new TimerConfig(29, 28, 7, 0x180, Timer.TIMER_Bx149, "TimerB"); timerConfig = new TimerConfig[] {timerA, timerB}; + + /* TX Vec, RX Vec, TX Bit, RX Bit, SFR-reg, Offset, Name, A?*/ + UARTConfig uA0 = new UARTConfig(22, 23, 1, 0, 1, 0x60, "USCI A0", true); + UARTConfig uB0 = new UARTConfig(22, 23, 3, 2, 1, 0x60, "USCI B0", false); + UARTConfig uA1 = new UARTConfig(16, 17, 1, 0, 6, 0xD0, "USCI A1", true); + UARTConfig uB1 = new UARTConfig(16, 17, 3, 2, 6, 0xD0, "USCI B1", false); + uartConfig = new UARTConfig[] {uA0, uB0, uA1, uB1}; } - public int setup(MSP430Core cpu, IOUnit[] ioUnits, int ioPos) { - return 0; + public int setup(MSP430Core cpu, ArrayList<IOUnit> ioUnits) { + USCI usciA0 = new USCI(cpu, 0, cpu.memory, this); + USCI usciB0 = new USCI(cpu, 1, cpu.memory, this); + USCI usciA1 = new USCI(cpu, 2, cpu.memory, this); + USCI usciB1 = new USCI(cpu, 3, cpu.memory, this); + + for (int i = 0, n = 8; i < n; i++) { + cpu.memOut[0x60 + i] = usciA0; + cpu.memIn[0x60 + i] = usciA0; + cpu.memOut[0x68 + i] = usciB0; + cpu.memIn[0x68 + i] = usciB0; + + cpu.memOut[0xd0 + i] = usciA1; + cpu.memIn[0xd0 + i] = usciA1; + cpu.memOut[0xd8 + i] = usciB1; + cpu.memIn[0xd8 + i] = usciB1; + } + + ioUnits.add(usciA0); + ioUnits.add(usciB0); + ioUnits.add(usciA1); + ioUnits.add(usciB1); + + /* usciA1 handles interrupts for both usciA1 and B1 */ + cpu.memOut[6] = usciA1; + cpu.memIn[6] = usciA1; + cpu.memOut[7] = usciA1; + cpu.memIn[7] = usciA1; + + /* 4 usci units */ + return 4; } } \ No newline at end of file diff --git a/se/sics/mspsim/core/MSP430Config.java b/se/sics/mspsim/core/MSP430Config.java index b9107e8..b92d30e 100644 --- a/se/sics/mspsim/core/MSP430Config.java +++ b/se/sics/mspsim/core/MSP430Config.java @@ -1,5 +1,7 @@ package se.sics.mspsim.core; +import java.util.ArrayList; + public abstract class MSP430Config { public class TimerConfig { @@ -21,13 +23,40 @@ public TimerConfig(int ccr0Vec, int ccrXVec, int ccrCount, int offset, } } + public class UARTConfig { + int txVector; + int rxVector; + int offset; + String name; + int txBit; + int rxBit; + int sfrAddr; + boolean usciA; + + public UARTConfig(int txVector, int rxVector, int txBit, int rxBit, int sftAddr, int offset, + String name, boolean usciA) { + this.txVector = txVector; + this.rxVector = rxVector; + this.txBit = txBit; + this.rxBit = rxBit; + this.offset = offset; + this.name = name; + this.usciA = usciA; + this.sfrAddr = sftAddr; + } + } + + public UARTConfig[] uartConfig; + /* default for the 149/1611 */ public TimerConfig[] timerConfig = { new TimerConfig(6, 5, 3, 0x160, Timer.TIMER_Ax149, "TimerA"), new TimerConfig(13, 12, 7, 0x180, Timer.TIMER_Bx149, "TimerB") }; + + public int maxMemIO = 0x200; public int maxInterruptVector = 15; public boolean MSP430XArch = false; - public abstract int setup(MSP430Core cpu, IOUnit[] ioUnits, int ioPos); + public abstract int setup(MSP430Core cpu, ArrayList<IOUnit> ioUnits); } diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index da16329..d476b69 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -61,7 +61,7 @@ // Try it out with 64 k memory public static final int MAX_MEM = 64*1024; - public static final int MAX_MEM_IO = 0x200; + public final int MAX_MEM_IO; public static final int PORTS = 6; // 16 registers of which some are "special" - PC, SP, etc. @@ -86,11 +86,11 @@ // Most HW needs only notify write and clocking, others need also read... // For notify write... - public IOUnit[] memOut = new IOUnit[MAX_MEM_IO]; + public IOUnit[] memOut; // For notify read... -> which will happen before actual read! - public IOUnit[] memIn = new IOUnit[MAX_MEM_IO]; + public IOUnit[] memIn; - private IOUnit[] ioUnits; + private ArrayList<IOUnit> ioUnits; private SFR sfr; private Watchdog watchdog; @@ -142,6 +142,9 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { super("MSP430", "MSP430 Core", null); MAX_INTERRUPT = config.maxInterruptVector; + MAX_MEM_IO = config.maxMemIO; + memOut = new IOUnit[MAX_MEM_IO]; + memIn = new IOUnit[MAX_MEM_IO]; this.registry = registry; this.config = config; // The CPU need to register itself as chip @@ -149,10 +152,9 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { // Ignore type for now... setModeNames(MODE_NAMES); - int passIO = 0; // IOUnits should likely be placed in a hashtable? // Maybe for debugging purposes... - ioUnits = new IOUnit[PORTS + 9]; + ioUnits = new ArrayList<IOUnit>(); // first step towards making core configurable Timer ta = new Timer(this, memory, config.timerConfig[0]); @@ -201,44 +203,45 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { // Add port 1,2 with interrupt capability! - ioUnits[0] = new IOPort(this, 1, 4, memory, 0x20); - ioUnits[1] = new IOPort(this, 2, 1, memory, 0x28); + ioUnits.add(new IOPort(this, 1, 4, memory, 0x20)); + ioUnits.add(new IOPort(this, 2, 1, memory, 0x28)); for (int i = 0, n = 8; i < n; i++) { - memOut[0x20 + i] = ioUnits[0]; - memOut[0x28 + i] = ioUnits[1]; + memOut[0x20 + i] = ioUnits.get(0); + memOut[0x28 + i] = ioUnits.get(1); } // Add port 3,4 & 5,6 for (int i = 0, n = 2; i < n; i++) { - ioUnits[i + 2] = new IOPort(this, (3 + i), 0, memory, 0x18 + i * 4); - memOut[0x18 + i * 4] = ioUnits[i + 2]; - memOut[0x19 + i * 4] = ioUnits[i + 2]; - memOut[0x1a + i * 4] = ioUnits[i + 2]; - memOut[0x1b + i * 4] = ioUnits[i + 2]; - - ioUnits[i + 4] = new IOPort(this, (5 + i), 0, memory, 0x30 + i * 4); - - memOut[0x30 + i * 4] = ioUnits[i + 4]; - memOut[0x31 + i * 4] = ioUnits[i + 4]; - memOut[0x32 + i * 4] = ioUnits[i + 4]; - memOut[0x33 + i * 4] = ioUnits[i + 4]; + ioUnits.add(new IOPort(this, (3 + i), 0, memory, 0x18 + i * 4)); + memOut[0x18 + i * 4] = ioUnits.get(i + 2); + memOut[0x19 + i * 4] = ioUnits.get(i + 2); + memOut[0x1a + i * 4] = ioUnits.get(i + 2); + memOut[0x1b + i * 4] = ioUnits.get(i + 2); + } + + for (int i = 0, n = 2; i < n; i++) { + ioUnits.add(new IOPort(this, (5 + i), 0, memory, 0x30 + i * 4)); + + memOut[0x30 + i * 4] = ioUnits.get(i + 4); + memOut[0x31 + i * 4] = ioUnits.get(i + 4); + memOut[0x32 + i * 4] = ioUnits.get(i + 4); + memOut[0x33 + i * 4] = ioUnits.get(i + 4); } - passIO = 6; // SFR and Basic clock system. - ioUnits[passIO++] = sfr; - ioUnits[passIO++] = bcs; + ioUnits.add(sfr); + ioUnits.add(bcs); - passIO += config.setup(this, ioUnits, passIO); + config.setup(this, ioUnits); // Add the timers - ioUnits[passIO++] = ta; - ioUnits[passIO++] = tb; + ioUnits.add(ta); + ioUnits.add(tb); ADC12 adc12 = new ADC12(this); - ioUnits[passIO++] = adc12; + ioUnits.add(adc12); - ioUnits[passIO++] = watchdog; + ioUnits.add(watchdog); for (int i = 0, n = 16; i < n; i++) { memOut[0x80 + i] = adc12; @@ -252,9 +255,8 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { memOut[0x1A0 + i] = adc12; memIn[0x1A0 + i] = adc12; } - - - if (DEBUG) System.out.println("Number of passive: " + passIO); + + if (DEBUG) System.out.println("Number of passive: " + ioUnits.size()); } public Profiler getProfiler() { @@ -278,7 +280,7 @@ public ComponentRegistry getRegistry() { /* returns port 1 ... 6 */ public IOPort getIOPort(int portID) { if (portID > 0 && portID < 7) { - return (IOPort) ioUnits[portID - 1]; + return (IOPort) ioUnits.get(portID - 1); } return null; } @@ -311,12 +313,12 @@ public Chip getChip(Class<? extends Chip> type) { } public Loggable[] getLoggables() { - Loggable[] ls = new Loggable[ioUnits.length + chips.size()]; - for (int i = 0; i < ioUnits.length; i++) { - ls[i] = ioUnits[i]; + Loggable[] ls = new Loggable[ioUnits.size() + chips.size()]; + for (int i = 0; i < ioUnits.size(); i++) { + ls[i] = ioUnits.get(i); } for (int i = 0; i < chips.size(); i++) { - ls[i + ioUnits.length] = chips.get(i); + ls[i + ioUnits.size()] = chips.get(i); } return ls; } @@ -580,17 +582,19 @@ public void printEventQueues(PrintStream out) { // Should also return active units... public IOUnit getIOUnit(String name) { - for (int i = 0, n = ioUnits.length; i < n; i++) { - if (name.equalsIgnoreCase(ioUnits[i].getID()) || name.equalsIgnoreCase(ioUnits[i].getName())) { - return ioUnits[i]; + for (int i = 0, n = ioUnits.size(); i < n; i++) { + IOUnit ioUnit = ioUnits.get(i); + if (ioUnit != null && name.equalsIgnoreCase(ioUnit.getID()) || + name.equalsIgnoreCase(ioUnit.getName())) { + return ioUnit; } } return null; } private void resetIOUnits() { - for (int i = 0, n = ioUnits.length; i < n; i++) { - ioUnits[i].reset(RESET_POR); + for (int i = 0, n = ioUnits.size(); i < n; i++) { + ioUnits.get(i).reset(RESET_POR); } } diff --git a/se/sics/mspsim/core/SFR.java b/se/sics/mspsim/core/SFR.java index 6feb197..2a88702 100644 --- a/se/sics/mspsim/core/SFR.java +++ b/se/sics/mspsim/core/SFR.java @@ -65,11 +65,12 @@ private int[] memory; private MSP430Core cpu; - private SFRModule[] sfrModule = new SFRModule[16]; - private int[] irqVector = new int[16]; - private boolean[] irqTriggered = new boolean[16]; - private boolean[] autoclear = new boolean[16]; - private int[] irqTriggeredPos = new int[16]; + /* 64 = max number of interrupts */ + private SFRModule[] sfrModule = new SFRModule[64]; + private int[] irqVector = new int[64]; + private boolean[] irqTriggered = new boolean[64]; + private boolean[] autoclear = new boolean[64]; + private int[] irqTriggeredPos = new int[64]; public SFR(MSP430Core cpu, int[] memory) { super("SFR", "Special Function Register", memory, 0); @@ -223,6 +224,7 @@ public void setBitIFG(int index, int bits) { int change = value ^ after; if (index == 0) ifg1 = after; else ifg2 = after; + updateIRQ(index, change); } diff --git a/se/sics/mspsim/core/USART.java b/se/sics/mspsim/core/USART.java index 4a70a4f..9b6238a 100644 --- a/se/sics/mspsim/core/USART.java +++ b/se/sics/mspsim/core/USART.java @@ -41,7 +41,7 @@ package se.sics.mspsim.core; -public class USART extends IOUnit implements SFRModule, DMATrigger { +public class USART extends IOUnit implements SFRModule, DMATrigger, USARTSource { // USART 0/1 register offset (0x70 / 0x78) public static final int UCTL = 0; diff --git a/se/sics/mspsim/core/USARTListener.java b/se/sics/mspsim/core/USARTListener.java index e22d306..a8e16cb 100644 --- a/se/sics/mspsim/core/USARTListener.java +++ b/se/sics/mspsim/core/USARTListener.java @@ -43,5 +43,5 @@ public interface USARTListener { public static int RXFLAG_CLEARED = 1; - public void dataReceived(USART source, int data); + public void dataReceived(USARTSource source, int data); } diff --git a/se/sics/mspsim/core/USARTSource.java b/se/sics/mspsim/core/USARTSource.java new file mode 100755 index 0000000..a84e8f8 --- /dev/null +++ b/se/sics/mspsim/core/USARTSource.java @@ -0,0 +1,11 @@ +package se.sics.mspsim.core; + +public interface USARTSource { + + public void setUSARTListener(USARTListener listener); + + /* for input into this UART */ + public boolean isReceiveFlagCleared(); + public void byteReceived(int b); + +} diff --git a/se/sics/mspsim/core/USART.java b/se/sics/mspsim/core/USCI.java old mode 100644 new mode 100755 similarity index 69% copy from se/sics/mspsim/core/USART.java copy to se/sics/mspsim/core/USCI.java index 4a70a4f..36be095 --- a/se/sics/mspsim/core/USART.java +++ b/se/sics/mspsim/core/USCI.java @@ -41,18 +41,34 @@ package se.sics.mspsim.core; -public class USART extends IOUnit implements SFRModule, DMATrigger { - - // USART 0/1 register offset (0x70 / 0x78) - public static final int UCTL = 0; - public static final int UTCTL = 1; - public static final int URCTL = 2; - public static final int UMCTL = 3; - public static final int UBR0 = 4; - public static final int UBR1 = 5; - public static final int URXBUF = 6; - public static final int UTXBUF = 7; +public class USCI extends IOUnit implements SFRModule, DMATrigger, USARTSource { + + // USART 0/1 register offset (0x60 / 0xD0) + public static final int UAxCTL0 = 0; + public static final int UAxCTL1 = 1; + public static final int UAxBR0 = 2; + public static final int UAxBR1 = 3; + public static final int UAxMCTL = 4; + public static final int UAxSTAT = 5; + public static final int UAxRXBUF = 6; + public static final int UAxTXBUF = 7; + + // SPI related registers + public static final int UBxCTL0 = 8; + public static final int UBxCTL1 = 9; + public static final int UBxBR0 = 0xa; + public static final int UBxBR1 = 0xb; + public static final int UBxSTAT = 0xd; + public static final int UBxRXBUF = 0xe; + public static final int UBxTXBUF = 0xf; + + // IrDA related (negative offset ??) + public static final int UABCTL = -3; /* very odd... */ + public static final int UIRTCTL = -2; + public static final int UIRRCTL = -1; + + // Interrupt flags... public static final int UTXIFG0 = 0x80; public static final int URXIFG0 = 0x40; @@ -66,22 +82,11 @@ private final int uartID; - public static final int USART0_RX_VEC = 9; - public static final int USART0_TX_VEC = 8; - public static final int USART0_RX_BIT = 6; - public static final int USART0_TX_BIT = 7; - - public static final int USART1_RX_VEC = 3; - public static final int USART1_TX_VEC = 2; - public static final int USART1_RX_BIT = 4; - public static final int USART1_TX_BIT = 5; - - - // Flags. public static final int UTCTL_TXEMPTY = 0x01; public static final int UTCTL_URXSE = 0x08; - + public static final int USCI_BUSY = 0x01; + private USARTListener listener; private int utxifg; @@ -98,15 +103,20 @@ private MSP430Core cpu; private SFR sfr; + private int sfrAddress; + + /* ifg and ie if not in sfr... - assume IE in sfraddr and IFG in addr + 1*/ + private int ifgAddress = 0; + private int ieAddress = 0; - private int uctl; - private int utctl; - private int urctl; + private int uctl0; + private int uctl1; private int umctl; private int ubr0; private int ubr1; private int urxbuf; private int utxbuf; + private int ustat; private int txbit; private boolean txEnabled = false; @@ -117,6 +127,8 @@ private DMA dma; private int dmaIndex; + private boolean usciA = true; /* if this is an USCI A or B */ + private TimeEvent txTrigger = new TimeEvent(0) { public void execute(long t) { // Ready to transmit new byte! @@ -128,29 +140,29 @@ public void execute(long t) { * Creates a new <code>USART</code> instance. * */ - public USART(MSP430Core cpu, int uartID, int[] memory, int offset) { - super("USART" + uartID, "USART " + uartID, memory, offset); + public USCI(MSP430Core cpu, int uartID, int[] memory, MSP430Config config) { + super(config.uartConfig[uartID].name, config.uartConfig[uartID].name, memory, config.uartConfig[uartID].offset); + System.out.println("NAME: " + config.uartConfig[uartID].name); this.cpu = cpu; this.uartID = uartID; - sfr = cpu.getSFR(); + MSP430Config.UARTConfig uartConfig = config.uartConfig[uartID]; // Initialize - transmit = ok... // and set which interrupts are used - if (uartID == 0) { - sfr.registerSFDModule(0, USART0_RX_BIT, this, USART0_RX_VEC); - sfr.registerSFDModule(0, USART0_TX_BIT, this, USART0_TX_VEC); - utxifg = UTXIFG0; - urxifg = URXIFG0; - txbit = USART0_TX_BIT; - rxVector = USART0_RX_VEC; + if (uartConfig.sfrAddr < 2) { + sfr = cpu.getSFR(); + sfrAddress = uartConfig.sfrAddr; + sfr.registerSFDModule(uartConfig.sfrAddr, uartConfig.rxBit, this, uartConfig.rxVector); + sfr.registerSFDModule(uartConfig.sfrAddr, uartConfig.txBit, this, uartConfig.txVector); } else { - sfr.registerSFDModule(1, USART1_RX_BIT, this, USART1_RX_VEC); - sfr.registerSFDModule(1, USART1_TX_BIT, this, USART1_TX_VEC); - utxifg = UTXIFG1; - urxifg = URXIFG1; - txbit = USART1_TX_BIT; - rxVector = USART1_RX_VEC; + ieAddress = uartConfig.sfrAddr; + ifgAddress = uartConfig.sfrAddr + 1; } + utxifg = 1 << uartConfig.txBit; + urxifg = 1 << uartConfig.rxBit; + txbit = uartConfig.txBit; + rxVector = uartConfig.rxVector; + usciA = uartConfig.usciA; reset(0); } @@ -165,9 +177,9 @@ public void reset(int type) { transmitting = false; clrBitIFG(urxifg); setBitIFG(utxifg); /* empty at start! */ - utctl |= UTCTL_TXEMPTY; - txEnabled = false; - rxEnabled = false; + ustat &= ~USCI_BUSY; + txEnabled = true; //false; + rxEnabled = true; //false; } public void enableChanged(int reg, int bit, boolean enabled) { @@ -181,11 +193,17 @@ public void enableChanged(int reg, int bit, boolean enabled) { } private void setBitIFG(int bits) { -// if ((bits & utxifg) > 0) { -// System.out.println(getName() + " Set utxifg"); -// } + if ((bits) > 0) { + System.out.println(getName() + " Set utxifg = " + utxifg + + " sfrA: " + sfrAddress + " bits: " + bits); + } + if (sfr != null) { + sfr.setBitIFG(sfrAddress, bits); + System.out.println("SFR =>" + sfr.getIFG(sfrAddress)); + } else { + memory[ifgAddress] |= bits; + } if (dma != null) { - sfr.setBitIFG(uartID, bits); /* set bit first, then trigger DMA transfer - this should * be made via a 1 cycle or so delayed action */ if ((bits & urxifg) > 0) dma.trigger(this, 0); @@ -197,42 +215,56 @@ private void clrBitIFG(int bits) { // if ((bits & utxifg) > 0) { // System.out.println(getName() + " Clear utxifg"); // } - sfr.clrBitIFG(uartID, bits); + if (sfr != null) { + sfr.clrBitIFG(sfrAddress, bits); + } else { + memory[ifgAddress] &= ~bits; + } } private int getIFG() { - return sfr.getIFG(uartID); + if (sfr != null) + return sfr.getIFG(sfrAddress); + return memory[ifgAddress]; } private boolean isIEBitsSet(int bits) { - return sfr.isIEBitsSet(uartID, bits); + if (sfr != null) + return sfr.isIEBitsSet(sfrAddress, bits); + return (memory[ieAddress] & bits) > 0; } + /* reuse USART listener API for USCI */ public void setUSARTListener(USARTListener listener) { this.listener = listener; } // Only 8 bits / read! public void write(int address, int data, boolean word, long cycles) { + if (address == ieAddress || address == ifgAddress) { + memory[address] = data; + } address = address - offset; // Indicate ready to write!!! - this should not be done here... -// if (uartID == 0) memory[IFG1] |= 0x82; -// else memory[IFG1 + 1] |= 0x20; - -// System.out.println(">>>> Write to " + getName() + " at " + -// address + " = " + data); +// System.out.println(">>>> Write to " + getName() + " at " + +// address + " = " + data); switch (address) { - case UCTL: - uctl = data; - spiMode = (data & 0x04) > 0; - if (DEBUG) log(" write to UCTL " + data); + case UAxCTL0: + case UBxCTL0: + uctl0 = data; + spiMode = (data & 0x01) > 0; + if (DEBUG) log(" write to UAxCTL0 " + data); break; - case UTCTL: - utctl = data; - if (DEBUG) log(" write to UTCTL " + data); - - if (((data >> 4) & 3) == 1) { + case UAxCTL1: + case UBxCTL1: + /* emulate the reset */ + if ((uctl1 & 1) == 1 && (data & 1) == 0) + reset(0); + uctl1 = data; + if (DEBUG) log(" write to UAxCTL1 " + data); + + if (((data >> 6) & 3) == 1) { clockSource = MSP430Constants.CLK_ACLK; if (DEBUG) { log(" Selected ACLK as source"); @@ -243,35 +275,34 @@ public void write(int address, int data, boolean word, long cycles) { log(" Selected SMCLK as source"); } } - if ((data & UTCTL_URXSE) == UTCTL_URXSE) { - sfr.setAutoclear(rxVector, false); - } else { - sfr.setAutoclear(rxVector, true); - } updateBaudRate(); break; - case URCTL: - urctl = data; - break; - case UMCTL: + case UAxMCTL: umctl = data; if (DEBUG) log(" write to UMCTL " + data); break; - case UBR0: + case UAxBR0: + case UBxBR0: ubr0 = data; updateBaudRate(); break; - case UBR1: + case UAxBR1: + case UBxBR1: ubr1 = data; updateBaudRate(); break; - case UTXBUF: + case UAxSTAT: + case UBxSTAT: + //ustat = data; + break; + case UAxTXBUF: + case UBxTXBUF: if (DEBUG) log(": USART_UTXBUF:" + (char) data + " = " + data + "\n"); if (txEnabled || (spiMode && rxEnabled)) { // Interruptflag not set! clrBitIFG(utxifg); /* the TX is no longer empty ! */ - utctl &= ~UTCTL_TXEMPTY; + ustat |= USCI_BUSY; /* should the interrupt be flagged off here ? - or only the flags */ if (DEBUG) log(" flagging off transmit interrupt"); // cpu.flagInterrupt(transmitInterrupt, this, false); @@ -296,31 +327,43 @@ public void write(int address, int data, boolean word, long cycles) { } public int read(int address, boolean word, long cycles) { + if (address == ieAddress || address == ifgAddress) { + return memory[address]; + } address = address - offset; -// System.out.println(">>>>> Read from " + getName() + " at " + -// address + " = " + memory[address]); +// System.out.println(">>>>> Read from " + getName() + " at " + +// address); switch (address) { - case UCTL: + case UAxCTL0: + case UBxCTL0: if (DEBUG) log(" read from UCTL"); - return uctl; - case UTCTL: - if (DEBUG) log(" read from UTCTL: " + utctl); - return utctl; - case URCTL: - return urctl; - case UMCTL: + return uctl0; + case UAxCTL1: + case UBxCTL1: + if (DEBUG) log(" read from UTCTL: " + uctl1); + return uctl1; + case UAxMCTL: return umctl; - case UBR0: + case UAxBR0: + case UBxBR0: return ubr0; - case UBR1: + case UAxBR1: + case UBxBR1: return ubr1; - case UTXBUF: + case UAxTXBUF: + case UBxTXBUF: return utxbuf; - case URXBUF: + case UAxSTAT: + case UBxSTAT: +// System.out.println(getName() + " Reading STAT: " + ustat); + return ustat; + case UAxRXBUF: + case UBxRXBUF: int tmp = urxbuf; // When byte is read - the interruptflag is cleared! // and error status should also be cleared later... + // is this cleared also on the MSP430x2xx series??? if (MSP430Constants.DEBUGGING_LEVEL > 0) { log(" clearing rx interrupt flag " + cpu.getPC() + " byte: " + tmp); } @@ -376,8 +419,8 @@ private void handleTransmit(long cycles) { } /* nothing more to transmit after this - stop transmission */ if (nextTXByte == -1) { - /* TXEMPTY means both TXBUF and shiftreg empty */ - utctl |= UTCTL_TXEMPTY; + /* ~BUSY - nothing more to send - and last data already in RX */ + ustat &= ~USCI_BUSY; transmitting = false; txShiftReg = -1; } @@ -411,9 +454,10 @@ public boolean isReceiveFlagCleared() { // This needs to be complemented with a method for checking if the USART // is ready for next byte (readyForReceive) that respects the current speed public void byteReceived(int b) { - if (!rxEnabled) return; + System.out.println(getName() + " byte received: " + b + " enabled:" + rxEnabled); + if (!rxEnabled) return; - if (DEBUG) { + if (DEBUG || true) { log(" byteReceived: " + b + " " + (char) b); } urxbuf = b & 0xff; diff --git a/se/sics/mspsim/platform/jcreate/JCreateNode.java b/se/sics/mspsim/platform/jcreate/JCreateNode.java index a470636..9297a2d 100644 --- a/se/sics/mspsim/platform/jcreate/JCreateNode.java +++ b/se/sics/mspsim/platform/jcreate/JCreateNode.java @@ -51,6 +51,7 @@ import se.sics.mspsim.core.IOPort; import se.sics.mspsim.core.IOUnit; import se.sics.mspsim.core.USART; +import se.sics.mspsim.core.USARTSource; import se.sics.mspsim.platform.sky.CC2420Node; import se.sics.mspsim.util.ArgumentManager; @@ -97,7 +98,7 @@ public void setFlash(M25P80 flash) { // USART Listener @Override - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { radio.dataReceived(source, data); flash.dataReceived(source, data); /* if nothing selected, just write back a random byte to this device */ diff --git a/se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java b/se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java index e2e81ce..3a47929 100644 --- a/se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java +++ b/se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java @@ -47,6 +47,7 @@ import se.sics.mspsim.chip.M25P80; import se.sics.mspsim.core.IOPort; import se.sics.mspsim.core.USART; +import se.sics.mspsim.core.USARTSource; import se.sics.mspsim.platform.sky.CC2420Node; import se.sics.mspsim.util.ArgumentManager; @@ -91,7 +92,7 @@ public void setFlash(M25P80 flash) { // USART Listener @Override - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { radio.dataReceived(source, data); flash.dataReceived(source, data); /* if nothing selected, just write back a random byte to this device */ diff --git a/se/sics/mspsim/platform/sky/CC2420Node.java b/se/sics/mspsim/platform/sky/CC2420Node.java index adca94b..b989a71 100644 --- a/se/sics/mspsim/platform/sky/CC2420Node.java +++ b/se/sics/mspsim/platform/sky/CC2420Node.java @@ -10,6 +10,7 @@ import se.sics.mspsim.core.PortListener; import se.sics.mspsim.core.USART; import se.sics.mspsim.core.USARTListener; +import se.sics.mspsim.core.USARTSource; import se.sics.mspsim.extutil.jfreechart.DataChart; import se.sics.mspsim.extutil.jfreechart.DataSourceSampler; import se.sics.mspsim.platform.GenericNode; @@ -200,7 +201,7 @@ public void portWrite(IOPort source, int data) { protected abstract void flashWrite(IOPort source, int data); - public abstract void dataReceived(USART source, int data); + public abstract void dataReceived(USARTSource source, int data); public void stateChanged(int state) { // Ignore UART state changes by default diff --git a/se/sics/mspsim/platform/sky/SkyNode.java b/se/sics/mspsim/platform/sky/SkyNode.java index 77f5a02..3e88f87 100644 --- a/se/sics/mspsim/platform/sky/SkyNode.java +++ b/se/sics/mspsim/platform/sky/SkyNode.java @@ -45,6 +45,7 @@ import se.sics.mspsim.chip.M25P80; import se.sics.mspsim.core.IOPort; import se.sics.mspsim.core.USART; +import se.sics.mspsim.core.USARTSource; import se.sics.mspsim.util.ArgumentManager; /** @@ -74,7 +75,7 @@ public void setFlash(M25P80 flash) { } // USART Listener - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { radio.dataReceived(source, data); flash.dataReceived(source, data); /* if nothing selected, just write back a random byte to these devs */ diff --git a/se/sics/mspsim/platform/sky/TelosNode.java b/se/sics/mspsim/platform/sky/TelosNode.java index c388701..a8362df 100644 --- a/se/sics/mspsim/platform/sky/TelosNode.java +++ b/se/sics/mspsim/platform/sky/TelosNode.java @@ -45,6 +45,7 @@ import se.sics.mspsim.chip.FileAT45DB; import se.sics.mspsim.core.IOPort; import se.sics.mspsim.core.USART; +import se.sics.mspsim.core.USARTSource; import se.sics.mspsim.util.ArgumentManager; /** @@ -84,7 +85,7 @@ protected void flashWrite(IOPort source, int data) { } // USART Listener - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { radio.dataReceived(source, data); flash.dataReceived(source, data); } diff --git a/se/sics/mspsim/platform/z1/Z1Node.java b/se/sics/mspsim/platform/z1/Z1Node.java index 9ffe36d..7ebe9c6 100644 --- a/se/sics/mspsim/platform/z1/Z1Node.java +++ b/se/sics/mspsim/platform/z1/Z1Node.java @@ -11,6 +11,8 @@ import se.sics.mspsim.core.PortListener; import se.sics.mspsim.core.USART; import se.sics.mspsim.core.USARTListener; +import se.sics.mspsim.core.USARTSource; +import se.sics.mspsim.core.USCI; import se.sics.mspsim.platform.GenericNode; import se.sics.mspsim.ui.SerialMon; import se.sics.mspsim.util.ArgumentManager; @@ -59,7 +61,8 @@ public void setFlash(M25P80 flash) { registry.registerComponent("xmem", flash); } - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { + USCI s = (USCI) source; radio.dataReceived(source, data); flash.dataReceived(source, data); /* if nothing selected, just write back a random byte to these devs */ @@ -69,17 +72,16 @@ public void dataReceived(USART source, int data) { } public void portWrite(IOPort source, int data) { - System.out.println("Write to port: " + source + " => " + data); if (source == port5) { System.out.println("LEDS GREEN = " + ((data & LEDS_CONF_GREEN) > 0)); System.out.println("LEDS RED = " + ((data & LEDS_CONF_RED) > 0)); System.out.println("LEDS YELLOW = " + ((data & LEDS_CONF_YELLOW) > 0)); } if (source == port3) { + // Chip select = active low... radio.setChipSelect((data & CC2420_CHIP_SELECT) == 0); } if (source == port4) { - // Chip select = active low... radio.setVRegOn((data & CC2420_VREG) != 0); //radio.portWrite(source, data); flash.portWrite(source, data); @@ -112,18 +114,17 @@ private void setupNodePorts() { port5.setPortListener(this); } - IOUnit usart0 = cpu.getIOUnit("USART0"); - if (usart0 instanceof USART) { + IOUnit usart0 = cpu.getIOUnit("USCI B0"); + if (usart0 instanceof USCI) { radio = new CC2420(cpu); radio.setCCAPort(port1, CC2420_CCA); radio.setFIFOPPort(port1, CC2420_FIFOP); radio.setFIFOPort(port1, CC2420_FIFO); - ((USART) usart0).setUSARTListener(this); + ((USARTSource) usart0).setUSARTListener(this); if (port4 != null) { radio.setSFDPort(port4, CC2420_SFD); } - } } @@ -151,9 +152,9 @@ public void setupNode() { setupGUI(); // Add some windows for listening to serial output - IOUnit usart = cpu.getIOUnit("USART1"); - if (usart instanceof USART) { - SerialMon serial = new SerialMon((USART)usart, "USART1 Port Output"); + IOUnit usart = cpu.getIOUnit("USCI A0"); + if (usart instanceof USARTSource) { + SerialMon serial = new SerialMon((USARTSource)usart, "USART1 Port Output"); registry.registerComponent("serialgui", serial); } } @@ -175,4 +176,5 @@ public static void main(String[] args) throws IOException { config.handleArguments(args); node.setupArgs(config); } + } diff --git a/se/sics/mspsim/ui/SerialMon.java b/se/sics/mspsim/ui/SerialMon.java index cd675ff..eba9e24 100644 --- a/se/sics/mspsim/ui/SerialMon.java +++ b/se/sics/mspsim/ui/SerialMon.java @@ -54,9 +54,10 @@ import javax.swing.JTextField; import javax.swing.SwingUtilities; +import se.sics.mspsim.core.IOUnit; import se.sics.mspsim.core.StateChangeListener; -import se.sics.mspsim.core.USART; import se.sics.mspsim.core.USARTListener; +import se.sics.mspsim.core.USARTSource; import se.sics.mspsim.util.ComponentRegistry; import se.sics.mspsim.util.ServiceComponent; @@ -67,7 +68,7 @@ private String name; private ServiceComponent.Status status = Status.STOPPED; - private final USART usart; + private final USARTSource usart; private final String title; private JFrame window; @@ -86,7 +87,7 @@ private int lines = 1; private boolean isUpdatePending = false; - public SerialMon(USART usart, String title) { + public SerialMon(USARTSource usart, String title) { this.usart = usart; this.title = title; } @@ -199,7 +200,7 @@ public void start() { if (window == null) { initGUI(); usart.setUSARTListener(this); - usart.addStateChangeListener(this); + ((IOUnit) usart).addStateChangeListener(this); } window.setVisible(true); status = Status.STARTED; @@ -212,7 +213,7 @@ public final void stop() { } } - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { if (data == '\n') { if (lines >= MAX_LINES) { int index = text.indexOf('\n'); diff --git a/se/sics/mspsim/util/Test.java b/se/sics/mspsim/util/Test.java index e005703..eeaffb5 100644 --- a/se/sics/mspsim/util/Test.java +++ b/se/sics/mspsim/util/Test.java @@ -61,7 +61,7 @@ public Test(MSP430 cpu) { } } - public void dataReceived(USART source, int data) { + public void dataReceived(USARTSource source, int data) { if (data == '\n') { String line = lineBuffer.toString(); lineBuffer.setLength(0); ----------------------------------------------------------------------- Summary of changes: .gitignore | 2 + se/sics/mspsim/chip/AT45DB.java | 2 +- se/sics/mspsim/chip/CC2420.java | 9 +- se/sics/mspsim/chip/M25P80.java | 2 +- se/sics/mspsim/chip/TR1001.java | 3 +- se/sics/mspsim/config/MSP430f1611Config.java | 9 +- se/sics/mspsim/config/MSP430f2617Config.java | 42 ++++- se/sics/mspsim/core/MSP430Config.java | 31 +++- se/sics/mspsim/core/MSP430Core.java | 90 ++++---- se/sics/mspsim/core/SFR.java | 12 +- se/sics/mspsim/core/USART.java | 2 +- se/sics/mspsim/core/USARTListener.java | 2 +- se/sics/mspsim/core/USARTSource.java | 11 + se/sics/mspsim/core/{USART.java => USCI.java} | 240 ++++++++++++-------- se/sics/mspsim/platform/jcreate/JCreateNode.java | 3 +- .../platform/sentillausb/SentillaUSBNode.java | 3 +- se/sics/mspsim/platform/sky/CC2420Node.java | 3 +- se/sics/mspsim/platform/sky/SkyNode.java | 3 +- se/sics/mspsim/platform/sky/TelosNode.java | 3 +- se/sics/mspsim/platform/z1/Z1Node.java | 22 +- se/sics/mspsim/ui/SerialMon.java | 11 +- se/sics/mspsim/util/Test.java | 2 +- 22 files changed, 326 insertions(+), 181 deletions(-) create mode 100755 .gitignore create mode 100755 se/sics/mspsim/core/USARTSource.java copy se/sics/mspsim/core/{USART.java => USCI.java} (69%) mode change 100644 => 100755 hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-03-21 21:18:45
|
The branch "master" has been updated via d7a36abbfb8a12fcf68c54f1ffbeb0b86793ca33 (commit) from 487880797a179ad8a938d0b2df42e0782e7a2c44 (commit) Changed paths: M se/sics/mspsim/config/MSP430f1611Config.java M se/sics/mspsim/config/MSP430f2617Config.java M se/sics/mspsim/core/MSP430Config.java M se/sics/mspsim/core/MSP430Core.java M se/sics/mspsim/platform/esb/ESBNode.java M se/sics/mspsim/platform/sky/CC2420Node.java M se/sics/mspsim/platform/z1/Z1Node.java M se/sics/mspsim/util/IHexReader.java M se/sics/mspsim/util/Test.java - Log ----------------------------------------------------------------- commit d7a36abbfb8a12fcf68c54f1ffbeb0b86793ca33 Author: Joakim Eriksson <jo...@si...> Date: Mon Mar 21 22:18:12 2011 +0100 made CPU more configurable diff --git a/se/sics/mspsim/config/MSP430f1611Config.java b/se/sics/mspsim/config/MSP430f1611Config.java index c48c45f..4ae748c 100755 --- a/se/sics/mspsim/config/MSP430f1611Config.java +++ b/se/sics/mspsim/config/MSP430f1611Config.java @@ -35,8 +35,13 @@ package se.sics.mspsim.config; +import se.sics.mspsim.core.DMA; +import se.sics.mspsim.core.IOUnit; +import se.sics.mspsim.core.InterruptMultiplexer; import se.sics.mspsim.core.MSP430Config; +import se.sics.mspsim.core.MSP430Core; import se.sics.mspsim.core.Timer; +import se.sics.mspsim.core.USART; public class MSP430f1611Config extends MSP430Config { @@ -49,4 +54,44 @@ public MSP430f1611Config() { TimerConfig timerB = new TimerConfig(13, 12, 7, 0x180, Timer.TIMER_Bx149, "TimerB"); timerConfig = new TimerConfig[] {timerA, timerB}; } + + + public int setup(MSP430Core cpu, IOUnit[] ioUnits, int ioPos) { + System.out.println("*** Setting up f1611 IO!"); + + USART usart0 = new USART(cpu, 0, cpu.memory, 0x70); + USART usart1 = new USART(cpu, 1, cpu.memory, 0x78); + + for (int i = 0, n = 8; i < n; i++) { + cpu.memOut[0x70 + i] = usart0; + cpu.memIn[0x70 + i] = usart0; + + cpu.memOut[0x78 + i] = usart1; + cpu.memIn[0x78 + i] = usart1; + } + + // Usarts + ioUnits[ioPos] = usart0; + ioUnits[ioPos + 1] = usart1; + + DMA dma = new DMA("dma", cpu.memory, 0, cpu); + for (int i = 0, n = 24; i < n; i++) { + cpu.memOut[0x1E0 + i] = dma; + cpu.memIn[0x1E0 + i] = dma; + } + + /* DMA Ctl */ + cpu.memOut[0x122] = dma; + cpu.memIn[0x124] = dma; + + /* configure the DMA */ + dma.setDMATrigger(DMA.URXIFG0, usart0, 0); + dma.setDMATrigger(DMA.UTXIFG0, usart0, 1); + dma.setDMATrigger(DMA.URXIFG1, usart1, 0); + dma.setDMATrigger(DMA.UTXIFG1, usart1, 1); + dma.setInterruptMultiplexer(new InterruptMultiplexer(cpu, 0)); + + ioUnits[ioPos + 2] = dma; + return 3; + } } diff --git a/se/sics/mspsim/config/MSP430f2617Config.java b/se/sics/mspsim/config/MSP430f2617Config.java index dc94704..f727d36 100755 --- a/se/sics/mspsim/config/MSP430f2617Config.java +++ b/se/sics/mspsim/config/MSP430f2617Config.java @@ -35,7 +35,9 @@ package se.sics.mspsim.config; +import se.sics.mspsim.core.IOUnit; import se.sics.mspsim.core.MSP430Config; +import se.sics.mspsim.core.MSP430Core; import se.sics.mspsim.core.Timer; public class MSP430f2617Config extends MSP430Config { @@ -51,4 +53,9 @@ public MSP430f2617Config() { TimerConfig timerB = new TimerConfig(29, 28, 7, 0x180, Timer.TIMER_Bx149, "TimerB"); timerConfig = new TimerConfig[] {timerA, timerB}; } + + public int setup(MSP430Core cpu, IOUnit[] ioUnits, int ioPos) { + return 0; + } + } \ No newline at end of file diff --git a/se/sics/mspsim/core/MSP430Config.java b/se/sics/mspsim/core/MSP430Config.java index 1a5654f..b9107e8 100644 --- a/se/sics/mspsim/core/MSP430Config.java +++ b/se/sics/mspsim/core/MSP430Config.java @@ -1,6 +1,6 @@ package se.sics.mspsim.core; -public class MSP430Config { +public abstract class MSP430Config { public class TimerConfig { int ccr0Vector; @@ -29,6 +29,5 @@ public TimerConfig(int ccr0Vec, int ccrXVec, int ccrCount, int offset, public int maxInterruptVector = 15; public boolean MSP430XArch = false; - public void setup() { - } + public abstract int setup(MSP430Core cpu, IOUnit[] ioUnits, int ioPos); } diff --git a/se/sics/mspsim/core/MSP430Core.java b/se/sics/mspsim/core/MSP430Core.java index 6836b03..da16329 100644 --- a/se/sics/mspsim/core/MSP430Core.java +++ b/se/sics/mspsim/core/MSP430Core.java @@ -199,17 +199,6 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { memIn[i] = mp; } - USART usart0 = new USART(this, 0, memory, 0x70); - USART usart1 = new USART(this, 1, memory, 0x78); - - for (int i = 0, n = 8; i < n; i++) { - memOut[0x70 + i] = usart0; - memIn[0x70 + i] = usart0; - - memOut[0x78 + i] = usart1; - memIn[0x78 + i] = usart1; - } - // Add port 1,2 with interrupt capability! ioUnits[0] = new IOPort(this, 1, 4, memory, 0x20); @@ -240,9 +229,7 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { ioUnits[passIO++] = sfr; ioUnits[passIO++] = bcs; - // Usarts - ioUnits[passIO++] = usart0; - ioUnits[passIO++] = usart1; + passIO += config.setup(this, ioUnits, passIO); // Add the timers ioUnits[passIO++] = ta; @@ -266,26 +253,7 @@ public MSP430Core(int type, ComponentRegistry registry, MSP430Config config) { memIn[0x1A0 + i] = adc12; } - - DMA dma = new DMA("dma", memory, 0, this); - for (int i = 0, n = 24; i < n; i++) { - memOut[0x1E0 + i] = dma; - memIn[0x1E0 + i] = dma; - } - /* DMA Ctl */ - memOut[0x122] = dma; - memIn[0x124] = dma; - - /* configure the DMA */ - dma.setDMATrigger(DMA.URXIFG0, usart0, 0); - dma.setDMATrigger(DMA.UTXIFG0, usart0, 1); - dma.setDMATrigger(DMA.URXIFG1, usart1, 0); - dma.setDMATrigger(DMA.UTXIFG1, usart1, 1); - - dma.setInterruptMultiplexer(new InterruptMultiplexer(this, 0)); - - ioUnits[passIO++] = dma; - + if (DEBUG) System.out.println("Number of passive: " + passIO); } diff --git a/se/sics/mspsim/platform/esb/ESBNode.java b/se/sics/mspsim/platform/esb/ESBNode.java index 1d04a91..1cb1a6f 100644 --- a/se/sics/mspsim/platform/esb/ESBNode.java +++ b/se/sics/mspsim/platform/esb/ESBNode.java @@ -45,6 +45,7 @@ import se.sics.mspsim.chip.Beeper; import se.sics.mspsim.chip.Leds; import se.sics.mspsim.chip.TR1001; +import se.sics.mspsim.config.MSP430f1611Config; import se.sics.mspsim.core.IOPort; import se.sics.mspsim.core.IOUnit; import se.sics.mspsim.core.MSP430; @@ -92,7 +93,7 @@ */ public ESBNode() { /* this should be a config for the MSP430f149 */ - super("ESB", new MSP430Config()); + super("ESB", new MSP430f1611Config()); } public Leds getLeds() { diff --git a/se/sics/mspsim/platform/sky/CC2420Node.java b/se/sics/mspsim/platform/sky/CC2420Node.java index 09fcb19..adca94b 100644 --- a/se/sics/mspsim/platform/sky/CC2420Node.java +++ b/se/sics/mspsim/platform/sky/CC2420Node.java @@ -2,6 +2,7 @@ import se.sics.mspsim.chip.CC2420; import se.sics.mspsim.chip.DS2411; import se.sics.mspsim.chip.PacketListener; +import se.sics.mspsim.config.MSP430f1611Config; import se.sics.mspsim.core.IOPort; import se.sics.mspsim.core.IOUnit; import se.sics.mspsim.core.MSP430; @@ -49,7 +50,7 @@ public CC2420Node(String id) { /* this should be a config for the MSP430x1611 */ - super(id, new MSP430Config()); + super(id, new MSP430f1611Config()); } public void setDebug(boolean debug) { diff --git a/se/sics/mspsim/platform/z1/Z1Node.java b/se/sics/mspsim/platform/z1/Z1Node.java index 016307d..9ffe36d 100644 --- a/se/sics/mspsim/platform/z1/Z1Node.java +++ b/se/sics/mspsim/platform/z1/Z1Node.java @@ -2,27 +2,72 @@ import java.io.IOException; +import se.sics.mspsim.chip.CC2420; +import se.sics.mspsim.chip.FileM25P80; +import se.sics.mspsim.chip.M25P80; import se.sics.mspsim.config.MSP430f2617Config; import se.sics.mspsim.core.IOPort; import se.sics.mspsim.core.IOUnit; import se.sics.mspsim.core.PortListener; +import se.sics.mspsim.core.USART; +import se.sics.mspsim.core.USARTListener; import se.sics.mspsim.platform.GenericNode; +import se.sics.mspsim.ui.SerialMon; import se.sics.mspsim.util.ArgumentManager; -public class Z1Node extends GenericNode implements PortListener { +public class Z1Node extends GenericNode implements PortListener, USARTListener { + + /* P1.2 - Input: FIFOP from CC2420 */ + /* P1.3 - Input: FIFO from CC2420 */ + /* P1.4 - Input: CCA from CC2420 */ + public static final int CC2420_FIFOP = 2; + public static final int CC2420_FIFO = 3; + public static final int CC2420_CCA = 4; + + /* P4.1 - Input: SFD from CC2420 */ + /* P4.5 - Output: VREG_EN to CC2420 */ + /* P3.0 - Output: SPI Chip Select (CS_N) */ + public static final int CC2420_SFD = 1; + public static final int CC2420_VREG = (1 << 5); + public static final int CC2420_CHIP_SELECT = 0x01; + IOPort port1; + IOPort port3; + IOPort port4; IOPort port5; - + public static final int LEDS_CONF_RED = 0x10; public static final int LEDS_CONF_GREEN = 0x40; public static final int LEDS_CONF_YELLOW = 0x20; + private M25P80 flash; + private String flashFile; + public CC2420 radio; + public Z1Node() { super("Z1", new MSP430f2617Config()); } + public M25P80 getFlash() { + return flash; + } + + public void setFlash(M25P80 flash) { + this.flash = flash; + registry.registerComponent("xmem", flash); + } + + public void dataReceived(USART source, int data) { + radio.dataReceived(source, data); + flash.dataReceived(source, data); + /* if nothing selected, just write back a random byte to these devs */ + if (!radio.getChipSelect() && !flash.getChipSelect()) { + source.byteReceived(0); + } + } + public void portWrite(IOPort source, int data) { System.out.println("Write to port: " + source + " => " + data); if (source == port5) { @@ -30,23 +75,94 @@ public void portWrite(IOPort source, int data) { System.out.println("LEDS RED = " + ((data & LEDS_CONF_RED) > 0)); System.out.println("LEDS YELLOW = " + ((data & LEDS_CONF_YELLOW) > 0)); } + if (source == port3) { + radio.setChipSelect((data & CC2420_CHIP_SELECT) == 0); + } + if (source == port4) { + // Chip select = active low... + radio.setVRegOn((data & CC2420_VREG) != 0); + //radio.portWrite(source, data); + flash.portWrite(source, data); + } } private void setupNodePorts() { + if (flashFile != null) { + setFlash(new FileM25P80(cpu, flashFile)); + } + IOUnit unit = cpu.getIOUnit("P1"); if (unit instanceof IOPort) { port1 = (IOPort) unit; port1.setPortListener(this); } + unit = cpu.getIOUnit("P3"); + if (unit instanceof IOPort) { + port3 = (IOPort) unit; + port3.setPortListener(this); + } + unit = cpu.getIOUnit("P4"); + if (unit instanceof IOPort) { + port4 = (IOPort) unit; + port4.setPortListener(this); + } unit = cpu.getIOUnit("P5"); if (unit instanceof IOPort) { port5 = (IOPort) unit; port5.setPortListener(this); } + + IOUnit usart0 = cpu.getIOUnit("USART0"); + if (usart0 instanceof USART) { + radio = new CC2420(cpu); + radio.setCCAPort(port1, CC2420_CCA); + radio.setFIFOPPort(port1, CC2420_FIFOP); + radio.setFIFOPort(port1, CC2420_FIFO); + + ((USART) usart0).setUSARTListener(this); + if (port4 != null) { + radio.setSFDPort(port4, CC2420_SFD); + } + + } } public void setupNode() { + // create a filename for the flash file + // This should be possible to take from a config file later! + String fileName = config.getProperty("flashfile"); + if (fileName == null) { + fileName = firmwareFile; + if (fileName != null) { + int ix = fileName.lastIndexOf('.'); + if (ix > 0) { + fileName = fileName.substring(0, ix); + } + fileName = fileName + ".flash"; + } + } + if (DEBUG) System.out.println("Using flash file: " + (fileName == null ? "no file" : fileName)); + + this.flashFile = fileName; + setupNodePorts(); + + if (!config.getPropertyAsBoolean("nogui", true)) { + setupGUI(); + + // Add some windows for listening to serial output + IOUnit usart = cpu.getIOUnit("USART1"); + if (usart instanceof USART) { + SerialMon serial = new SerialMon((USART)usart, "USART1 Port Output"); + registry.registerComponent("serialgui", serial); + } + } + + + } + + public void setupGUI() { + System.out.println("No gui for Z1 yet..."); } public int getModeMax() { diff --git a/se/sics/mspsim/util/IHexReader.java b/se/sics/mspsim/util/IHexReader.java index 90be0c2..3998934 100644 --- a/se/sics/mspsim/util/IHexReader.java +++ b/se/sics/mspsim/util/IHexReader.java @@ -41,6 +41,8 @@ package se.sics.mspsim.util; import java.io.*; + +import se.sics.mspsim.config.MSP430f1611Config; import se.sics.mspsim.core.MSP430; import se.sics.mspsim.core.MSP430Config; @@ -139,7 +141,7 @@ public static void main(String[] args) throws Exception { // System.out.println("T ^ T => " + (true ^ true) + // " T ^ F => " + (false ^ true)); - MSP430 cpu = new MSP430(0, new ComponentRegistry(), new MSP430Config()); + MSP430 cpu = new MSP430(0, new ComponentRegistry(), new MSP430f1611Config()); int[] memory = cpu.getMemory(); reader.readFile(memory, args[0]); cpu.reset(); diff --git a/se/sics/mspsim/util/Test.java b/se/sics/mspsim/util/Test.java index e3854c5..e005703 100644 --- a/se/sics/mspsim/util/Test.java +++ b/se/sics/mspsim/util/Test.java @@ -41,6 +41,7 @@ package se.sics.mspsim.util; import java.io.IOException; +import se.sics.mspsim.config.MSP430f1611Config; import se.sics.mspsim.core.*; /** @@ -83,7 +84,7 @@ public void dataReceived(USART source, int data) { } public static void main(String[] args) { - MSP430 cpu = new MSP430(0, new ComponentRegistry(), new MSP430Config()); + MSP430 cpu = new MSP430(0, new ComponentRegistry(), new MSP430f1611Config()); int index = 0; if (args[index].startsWith("-")) { // Flag ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/config/MSP430f1611Config.java | 45 ++++++++++ se/sics/mspsim/config/MSP430f2617Config.java | 7 ++ se/sics/mspsim/core/MSP430Config.java | 5 +- se/sics/mspsim/core/MSP430Core.java | 36 +------- se/sics/mspsim/platform/esb/ESBNode.java | 3 +- se/sics/mspsim/platform/sky/CC2420Node.java | 3 +- se/sics/mspsim/platform/z1/Z1Node.java | 120 +++++++++++++++++++++++++- se/sics/mspsim/util/IHexReader.java | 4 +- se/sics/mspsim/util/Test.java | 3 +- 9 files changed, 183 insertions(+), 43 deletions(-) hooks/post-receive -- mspsim |
From: Joakim E. <jo...@us...> - 2011-03-21 19:07:47
|
The branch "master" has been updated via 487880797a179ad8a938d0b2df42e0782e7a2c44 (commit) via d978202030f4e782f44c9bffd10e777e47e2ce67 (commit) from 1478e487624b1e1d7961b632894c0b0a2c183f2c (commit) Changed paths: M se/sics/mspsim/cli/ProfilerCommands.java M se/sics/mspsim/platform/GenericNode.java M se/sics/mspsim/util/SimpleProfiler.java M se/sics/mspsim/util/StackMonitor.java - Log ----------------------------------------------------------------- commit 487880797a179ad8a938d0b2df42e0782e7a2c44 Merge: d978202 1478e48 Author: Joakim Eriksson <jo...@si...> Date: Mon Mar 21 20:07:04 2011 +0100 Merge branch 'master' of ssh://mspsim.git.sourceforge.net/gitroot/mspsim/mspsim commit d978202030f4e782f44c9bffd10e777e47e2ce67 Author: Joakim Eriksson <jo...@si...> Date: Mon Mar 21 20:06:43 2011 +0100 added initial support for stack profiling diff --git a/se/sics/mspsim/cli/ProfilerCommands.java b/se/sics/mspsim/cli/ProfilerCommands.java index e1fd767..c53f7b3 100644 --- a/se/sics/mspsim/cli/ProfilerCommands.java +++ b/se/sics/mspsim/cli/ProfilerCommands.java @@ -50,6 +50,7 @@ import se.sics.mspsim.ui.WindowManager; import se.sics.mspsim.util.ComponentRegistry; import se.sics.mspsim.util.SimpleProfiler; +import se.sics.mspsim.util.StackMonitor; /** * @@ -119,9 +120,15 @@ public int executeCommand(CommandContext context) { profiler.printStackTrace(context.out); return 0; } - }); + ch.registerCommand("stackprof", new BasicCommand("Start stack profiler", "") { + public int executeCommand(CommandContext context) { + new StackMonitor(cpu); + return 0; + } + }); + // ch.registerCommand("irqprofile", new BasicCommand("show interrupt profile", "") { // public int executeCommand(CommandContext context) { // long[] time = cpu.getInterruptTime(); diff --git a/se/sics/mspsim/platform/GenericNode.java b/se/sics/mspsim/platform/GenericNode.java index f69e537..ed7a817 100644 --- a/se/sics/mspsim/platform/GenericNode.java +++ b/se/sics/mspsim/platform/GenericNode.java @@ -41,8 +41,12 @@ import java.io.DataInputStream; import java.io.File; import java.io.IOException; +import java.io.PrintStream; import java.net.URISyntaxException; import java.net.URL; + +import javax.swing.JFrame; + import se.sics.mspsim.cli.CommandHandler; import se.sics.mspsim.cli.DebugCommands; import se.sics.mspsim.cli.FileCommands; @@ -58,6 +62,7 @@ import se.sics.mspsim.core.MSP430Config; import se.sics.mspsim.core.MSP430Constants; import se.sics.mspsim.extutil.highlight.HighlightSourceViewer; +import se.sics.mspsim.ui.ConsoleUI; import se.sics.mspsim.ui.ControlUI; import se.sics.mspsim.ui.JFrameWindowManager; import se.sics.mspsim.ui.StackUI; @@ -207,10 +212,25 @@ public void setup(ConfigManager config) throws IOException { cpu.setEmulationLogger(logger); CommandHandler ch = (CommandHandler) registry.getComponent("commandHandler"); + if (ch == null) { - ch = new StreamCommandHandler(System.in, System.out, System.err, PROMPT); - registry.registerComponent("commandHandler", ch); + if (!config.getPropertyAsBoolean("nogui", false)) { + ConsoleUI console = new ConsoleUI(); + PrintStream consoleStream = new PrintStream(console.getOutputStream()); + ch = new CommandHandler(consoleStream, consoleStream); + JFrame w = new JFrame("ConsoleUI"); + w.add(console); + w.setBounds(20, 20, 520, 400); + w.setLocationByPlatform(true); + w.setVisible(true); + console.setCommandHandler(ch); + registry.registerComponent("commandHandler", ch); + } else { + ch = new StreamCommandHandler(System.in, System.out, System.err, PROMPT); + registry.registerComponent("commandHandler", ch); + } } + stats = new OperatingModeStatistics(cpu); registry.registerComponent("pluginRepository", new PluginRepository()); diff --git a/se/sics/mspsim/util/SimpleProfiler.java b/se/sics/mspsim/util/SimpleProfiler.java index 9ce4779..2eb7f4b 100644 --- a/se/sics/mspsim/util/SimpleProfiler.java +++ b/se/sics/mspsim/util/SimpleProfiler.java @@ -81,6 +81,8 @@ private int interruptLevel; private int interruptFrom; private boolean newIRQ; + + private StackMonitor stackMonitor; public SimpleProfiler() { profileData = new HashMap<MapEntry, CallEntry>(); @@ -140,7 +142,17 @@ public void profileCall(MapEntry entry, long cycles, int from) { ce.hide = hide; ce.fromPC = from; newIRQ = false; + + if (stackMonitor != null) { + /* get the current stack MAX for previous function */ + if (cSP > 1) { + callStack[cSP - 2].currentStackMax = stackMonitor.getProfStackMax(); + } + /* start stack here! */ + ce.stackStart = stackMonitor.getStack(); + stackMonitor.setProfStackMax(stackMonitor.getStack()); + } CallListener[] listeners = callListeners; if (listeners != null) { @@ -164,12 +176,14 @@ public void profileReturn(long cycles) { CallEntry cspEntry = callStack[--cSP]; MapEntry fkn = cspEntry.function; // System.out.println("Profiler: return / call stack: " + cSP + ", " + fkn); - + long elapsed = cycles - cspEntry.cycles; long exElapsed = cycles - cspEntry.exclusiveCycles; if (cSP != 0) { callStack[cSP-1].exclusiveCycles += elapsed; } + int maxUsage = 0; + if (cspEntry.calls >= 0) { CallEntry ce = profileData.get(fkn); if (ce == null) { @@ -179,6 +193,21 @@ public void profileReturn(long cycles) { ce.cycles += elapsed; ce.exclusiveCycles += exElapsed; ce.calls++; + + if (stackMonitor != null) { + maxUsage = stackMonitor.getProfStackMax() - cspEntry.stackStart; + ce.stackStart = cspEntry.stackStart; + if (maxUsage > ce.currentStackMax) { + ce.currentStackMax = maxUsage; + } + if (cSP != 0) { + /* put the max for previous function back into the max profiler */ + stackMonitor.setProfStackMax(callStack[cSP-1].currentStackMax); + } + } + + + if (cSP != 0) { MapEntry caller = callStack[cSP-1].function; HashMap<MapEntry,CallCounter> callers = ce.callers; @@ -195,7 +224,7 @@ public void profileReturn(long cycles) { if ((cspEntry.hide <= 1) && (!hideIRQ || servicedInterrupt == -1)) { if (servicedInterrupt >= 0) logger.printf("[%2d] ",servicedInterrupt); printSpace(logger, (cSP - interruptLevel) * 2); - logger.println("return from " + ce.function.getInfo() + " elapsed: " + elapsed); + logger.println("return from " + ce.function.getInfo() + " elapsed: " + elapsed + " maxStackUsage: " + maxUsage); } } @@ -408,6 +437,9 @@ public int compare(CallEntry o1, CallEntry o2) { long exclusiveCycles; int calls; int hide; + int stackStart; + int currentStackMax; + HashMap<MapEntry,CallCounter> callers; public CallEntry() { @@ -521,4 +553,9 @@ public synchronized void removeCallListener(CallListener listener) { public String getCall(int i) { return callStack[cSP - i].function.getInfo(); } + + public void setStackMonitor(StackMonitor stackMonitor) { + System.out.println("Setting Stack monitor to: " + stackMonitor); + this.stackMonitor = stackMonitor; + } } diff --git a/se/sics/mspsim/util/StackMonitor.java b/se/sics/mspsim/util/StackMonitor.java index 91229e8..49c523e 100644 --- a/se/sics/mspsim/util/StackMonitor.java +++ b/se/sics/mspsim/util/StackMonitor.java @@ -13,6 +13,7 @@ private int stackMin = 0; private int stackMax = 0; private int stack = 0; + private int profStackMax = 0; private DataSource maxDataSource = new DataSource() { public int getValue() { @@ -48,7 +49,13 @@ public double getDoubleValue() { public StackMonitor(MSP430 cpu) { this.cpu = cpu; this.cpu.setRegisterWriteMonitor(MSP430.SP, this); - + Object p = cpu.getRegistry().getComponent("profiler"); + if (p instanceof SimpleProfiler) { + ((SimpleProfiler) p).setStackMonitor(this); + System.out.println("Found simple profiler!!!: " + p); + } else { + System.out.println("Could not find simple profiler: " + p); + } if (cpu.getDisAsm() != null) { MapTable mapTable = cpu.getDisAsm().getMap(); if (mapTable != null) { @@ -79,13 +86,31 @@ public DataSource getSource() { return dataSource; } + /* specialized profiler support for the stack */ + /* set current profiler Stack max to this value */ + public void setProfStackMax(int max) { + profStackMax = max; + } + + /* get profiler stack max */ + public int getProfStackMax() { + return profStackMax; + } + + public int getStack() { + return stack; + } + public void cpuAction(int type, int adr, int data) { - stack = ((stackStartAddress - data) + 0xffff) % 0xffff; + stack = ((stackStartAddress - data) + 0xffff) & 0xffff; if (stack > stackMax) { stackMax = stack; } if (stack < stackMin) { stackMin = stack; } + if (stack > profStackMax) { + profStackMax = stack; + } } -} +} \ No newline at end of file ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/cli/ProfilerCommands.java | 9 ++++++- se/sics/mspsim/platform/GenericNode.java | 24 ++++++++++++++++- se/sics/mspsim/util/SimpleProfiler.java | 41 ++++++++++++++++++++++++++++- se/sics/mspsim/util/StackMonitor.java | 31 ++++++++++++++++++++-- 4 files changed, 97 insertions(+), 8 deletions(-) hooks/post-receive -- mspsim |
From: Niclas F. <ni...@us...> - 2011-03-14 20:48:25
|
The branch "master" has been updated via 1478e487624b1e1d7961b632894c0b0a2c183f2c (commit) from d3a795173ddd8f5a056c4d3c3a630faf26c20ef5 (commit) Changed paths: M se/sics/mspsim/debug/DwarfReader.java - Log ----------------------------------------------------------------- commit 1478e487624b1e1d7961b632894c0b0a2c183f2c Author: Niclas Finne <nf...@si...> Date: Mon Mar 14 21:48:01 2011 +0100 Disabled debug output by default diff --git a/se/sics/mspsim/debug/DwarfReader.java b/se/sics/mspsim/debug/DwarfReader.java index c3d6215..e1655c1 100755 --- a/se/sics/mspsim/debug/DwarfReader.java +++ b/se/sics/mspsim/debug/DwarfReader.java @@ -116,7 +116,7 @@ public void read() { for (int i = 0; i < elfFile.getSectionCount(); i++) { ELFSection sec = elfFile.getSection(i); String name = sec.getSectionName(); - System.out.println("DWARF Section: " + name); + if (DEBUG) System.out.println("DWARF Section: " + name); if (".debug_aranges".equals(name)) { readAranges(sec); } else if (".debug_line".equals(name)) { @@ -126,10 +126,12 @@ public void read() { } private void readLines(ELFSection sec) { - System.out.println("DWARF Line - ELF Section length: " + sec.getSize()); + if (DEBUG) { + System.out.println("DWARF Line - ELF Section length: " + sec.getSize()); + } sec.reset(); int endPos = 0; - ArrayList<LineEntry> lineData = new ArrayList(); + ArrayList<LineEntry> lineData = new ArrayList<LineEntry>(); while (sec.getPosition() < sec.getSize()) { /* here starts the reading of one file's (?) debug info */ int totLen = sec.readElf32(); @@ -143,16 +145,20 @@ private void readLines(ELFSection sec) { int opcodeBase = sec.readElf8(); endPos += 4 + totLen; - System.out.println("Line total length: " + totLen + " endPos: " + endPos); - System.out.println("Line pro length: " + proLen); - System.out.println("Line version: " + version); + if (DEBUG) { + System.out.println("Line total length: " + totLen + " endPos: " + endPos); + System.out.println("Line pro length: " + proLen); + System.out.println("Line version: " + version); + } if (lineBase > 127) { lineBase = lineBase - 256; } - System.out.println("Line base : " + lineBase); - System.out.println("Line range : " + lineRange); - System.out.println("Line - Opcode base: " + opcodeBase); + if (DEBUG) { + System.out.println("Line base : " + lineBase); + System.out.println("Line range : " + lineRange); + System.out.println("Line - Opcode base: " + opcodeBase); + } /* first char of includes (skip opcode lens)... */ for (int i = 0; i < opcodeBase - 1; i++) { @@ -196,10 +202,11 @@ private void readLines(ELFSection sec) { /* Now we should have entered the position of the "code" for generating the * line <=> address table */ - System.out.println("Line: position: " + sec.getPosition()); - System.out.println("Line: first bytes of the machine: "); - System.out.print("Line: "); - + if (DEBUG) { + System.out.println("Line: position: " + sec.getPosition()); + System.out.println("Line: first bytes of the machine: "); + System.out.print("Line: "); + } /* reset the "state" of the state machine (6.2.2 spec) */ lineAddress = 0; lineFile = 1; @@ -216,7 +223,7 @@ private void readLines(ELFSection sec) { while(!endSequence) { int ins = sec.readElf8(); - System.out.print(Utils.hex8(ins) + " "); + if (DEBUG) System.out.print(Utils.hex8(ins) + " "); switch(ins) { case DW_LNS_EXT: /* extended instruction */ @@ -225,10 +232,10 @@ private void readLines(ELFSection sec) { switch(extIns) { case DW_LNE_end_sequence: endSequence = true; - System.out.println("Line: End sequence executed!!!"); + if (DEBUG) System.out.println("Line: End sequence executed!!!"); break; case DW_LNE_define_file: - System.out.println("Line: Should define a file!!!!"); + if (DEBUG) System.out.println("Line: Should define a file!!!!"); break; case DW_LNE_set_address: if (len == 2) @@ -250,7 +257,7 @@ private void readLines(ELFSection sec) { case DW_LNS_advance_pc: long add = sec.readLEB128(); lineAddress += add * minOpLen; - System.out.println("Line: Increased address to: " + Utils.hex16(lineAddress)); + if (DEBUG) System.out.println("Line: Increased address to: " + Utils.hex16(lineAddress)); break; case DW_LNS_advance_line: long addLine = sec.readLEB128S(); @@ -275,12 +282,12 @@ private void readLines(ELFSection sec) { if (DEBUG) System.out.println("Line: Set basic block to true"); break; case DW_LNS_const_add_pc: - System.out.println("Line: *** Should add const to PC - but how much - same as FF??"); + if (DEBUG) System.out.println("Line: *** Should add const to PC - but how much - same as FF??"); break; case DW_LNS_fixed_advance_pc: int incr = sec.readElf16(); lineAddress += incr; - System.out.println("Line: *** Increased address to: " + Utils.hex16(lineAddress)); + if (DEBUG) System.out.println("Line: *** Increased address to: " + Utils.hex16(lineAddress)); break; default: int lineInc = lineBase + ((ins - opcodeBase) % lineRange); @@ -311,22 +318,22 @@ private void readLines(ELFSection sec) { */ - for (int i = 0; i < lineInfo.size(); i++) { - LineData data = lineInfo.get(i); - System.out.println("Compiled file: " + data.sourceFiles[0]); - System.out.println("Start address: " + - Utils.hex16(data.lineEntries[0].address)); - System.out.println("End address: " + - Utils.hex16(data.lineEntries[data.lineEntries.length - 1].address)); - System.out.println("Size: " + - Utils.hex16(data.lineEntries[data.lineEntries.length - 1].address - data.lineEntries[0].address)); - + if (DEBUG) { + for (LineData data : lineInfo) { + System.out.println("Compiled file: " + data.sourceFiles[0]); + System.out.println("Start address: " + + Utils.hex16(data.lineEntries[0].address)); + System.out.println("End address: " + + Utils.hex16(data.lineEntries[data.lineEntries.length - 1].address)); + System.out.println("Size: " + + Utils.hex16(data.lineEntries[data.lineEntries.length - 1].address - data.lineEntries[0].address)); + } } } /* DWARF - address ranges information */ private void readAranges(ELFSection sec) { - System.out.println("DWARF Aranges - ELF Section length: " + sec.getSize()); + if (DEBUG) System.out.println("DWARF Aranges - ELF Section length: " + sec.getSize()); int pos = 0; int index = 0; do { @@ -337,11 +344,13 @@ private void readAranges(ELFSection sec) { arange.offset = sec.readElf32(pos + 6); /* 4 byte offset into debug_info section (?)*/ arange.addressSize = sec.readElf8(pos + 10); /* size of address */ arange.segmentSize = sec.readElf8(pos + 11); /* size of segment descriptor */ - System.out.println("DWARF: aranges no " + index); - System.out.println("DWARF: Length: " + arange.length); - System.out.println("DWARF: Version: " + arange.version); - System.out.println("DWARF: Offset: " + arange.offset); - System.out.println("DWARF: Address size: " + arange.addressSize); + if (DEBUG) { + System.out.println("DWARF: aranges no " + index); + System.out.println("DWARF: Length: " + arange.length); + System.out.println("DWARF: Version: " + arange.version); + System.out.println("DWARF: Offset: " + arange.offset); + System.out.println("DWARF: Address size: " + arange.addressSize); + } index++; pos += 12; @@ -352,7 +361,7 @@ private void readAranges(ELFSection sec) { addr = sec.readElf16(pos); len = sec.readElf16(pos + 2); pos += 4; - System.out.println("DWARF: ($" + Utils.hex16(addr) + "," + len + ")"); + if (DEBUG) System.out.println("DWARF: ($" + Utils.hex16(addr) + "," + len + ")"); } while (addr != 0 || len != 0); } } while (pos < sec.getSize()); ----------------------------------------------------------------------- Summary of changes: se/sics/mspsim/debug/DwarfReader.java | 81 ++++++++++++++++++--------------- 1 files changed, 45 insertions(+), 36 deletions(-) hooks/post-receive -- mspsim |
From: <ni...@us...> - 2011-02-25 16:36:10
|
Revision: 790 http://mspsim.svn.sourceforge.net/mspsim/?rev=790&view=rev Author: nifi Date: 2011-02-25 16:36:03 +0000 (Fri, 25 Feb 2011) Log Message: ----------- Changed SerialMon to be a service component that can be started/stopped. Modified Paths: -------------- mspsim/scripts/autorun.sc mspsim/se/sics/mspsim/platform/esb/ESBNode.java mspsim/se/sics/mspsim/platform/sky/CC2420Node.java mspsim/se/sics/mspsim/ui/SerialMon.java Modified: mspsim/scripts/autorun.sc =================================================================== --- mspsim/scripts/autorun.sc 2011-02-23 17:12:45 UTC (rev 789) +++ mspsim/scripts/autorun.sc 2011-02-25 16:36:03 UTC (rev 790) @@ -10,6 +10,7 @@ #start the nodegui service service controlgui start service nodegui start +service serialgui start #service stackchart start #rflistener output CC2420 >> rfdata.txt stop Modified: mspsim/se/sics/mspsim/platform/esb/ESBNode.java =================================================================== --- mspsim/se/sics/mspsim/platform/esb/ESBNode.java 2011-02-23 17:12:45 UTC (rev 789) +++ mspsim/se/sics/mspsim/platform/esb/ESBNode.java 2011-02-25 16:36:03 UTC (rev 790) @@ -186,8 +186,8 @@ // Add some windows for listening to serial output IOUnit usart = cpu.getIOUnit("USART 1"); if (usart instanceof USART) { - SerialMon serial = new SerialMon((USART)usart, "RS232 Port Output"); - ((USART) usart).setUSARTListener(serial); + SerialMon serial = new SerialMon((USART)usart, "USART1 Port Output"); + registry.registerComponent("serialgui", serial); } if (stats != null) { Modified: mspsim/se/sics/mspsim/platform/sky/CC2420Node.java =================================================================== --- mspsim/se/sics/mspsim/platform/sky/CC2420Node.java 2011-02-23 17:12:45 UTC (rev 789) +++ mspsim/se/sics/mspsim/platform/sky/CC2420Node.java 2011-02-25 16:36:03 UTC (rev 790) @@ -142,7 +142,7 @@ IOUnit usart = cpu.getIOUnit("USART1"); if (usart instanceof USART) { SerialMon serial = new SerialMon((USART)usart, "USART1 Port Output"); - ((USART) usart).setUSARTListener(serial); + registry.registerComponent("serialgui", serial); } if (stats != null) { // A HACK for some "graphs"!!! Modified: mspsim/se/sics/mspsim/ui/SerialMon.java =================================================================== --- mspsim/se/sics/mspsim/ui/SerialMon.java 2011-02-23 17:12:45 UTC (rev 789) +++ mspsim/se/sics/mspsim/ui/SerialMon.java 2011-02-25 16:36:03 UTC (rev 790) @@ -41,44 +41,70 @@ package se.sics.mspsim.ui; import java.awt.BorderLayout; -import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; import javax.swing.JFrame; -import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTextArea; +import javax.swing.JTextField; import javax.swing.SwingUtilities; -import se.sics.mspsim.core.*; +import se.sics.mspsim.core.StateChangeListener; +import se.sics.mspsim.core.USART; +import se.sics.mspsim.core.USARTListener; +import se.sics.mspsim.util.ComponentRegistry; +import se.sics.mspsim.util.ServiceComponent; -public class SerialMon implements KeyListener, USARTListener, - StateChangeListener { +public class SerialMon implements USARTListener, StateChangeListener, ServiceComponent { - private static final String PREFIX = " > "; private static final int MAX_LINES = 200; + private String name; + private ServiceComponent.Status status = Status.STOPPED; + + private final USART usart; + private final String title; + private JFrame window; - private USART usart; private JTextArea textArea; - private JLabel statusLabel; + private JTextField commandField; + private String[] history = new String[50]; + private int historyPos = 0; + private int historyCount = 0; private String text = "*** Serial mon for MSPsim ***\n"; - private final static int BUFFER_SIZE = 20; - private byte[] buffer = new byte[BUFFER_SIZE]; - private int wPos = 0; - private int rPos = 0; - private int bsize = 0; - + private final static int QUEUE_SIZE = 5; + private String[] queue = new String[QUEUE_SIZE]; + private int wPos = 0, rPos = 0, rIndex = 0; + private boolean isSending = false; + private int lines = 1; private boolean isUpdatePending = false; - private StringBuilder keyBuffer = new StringBuilder(); - public SerialMon(USART usart, String name) { + public SerialMon(USART usart, String title) { + this.usart = usart; + this.title = title; + } + + public Status getStatus() { + return status; + } + + public String getName() { + return name; + } + + public final void init(String name, ComponentRegistry registry) { this.name = name; - this.usart = usart; - window = new JFrame(name); + } + + private void initGUI() { + window = new JFrame(title); // window.setBounds(100, 100, 400,340); window.add(new JScrollPane(textArea = new JTextArea(20, 40), JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, @@ -86,22 +112,104 @@ BorderLayout.CENTER); textArea.setText(text); textArea.setEditable(false); - statusLabel = new JLabel(PREFIX); - keyBuffer.append(PREFIX); - statusLabel.setOpaque(true); - statusLabel.setBackground(Color.lightGray); - window.add(statusLabel, BorderLayout.SOUTH); + + JPopupMenu popupMenu = new JPopupMenu(); + JMenuItem clearItem = new JMenuItem("Clear"); + clearItem.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + textArea.setText(""); + lines = 0; + } + + }); + popupMenu.add(clearItem); + textArea.setComponentPopupMenu(popupMenu); + + commandField = new JTextField(); + commandField.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + String command = commandField.getText().trim(); + if (command.length() > 0) { + if (sendCommand(command)) { + int previous = historyCount - 1; + if (previous < 0) previous += history.length; + if (!command.equals(history[previous])) { + history[historyCount] = command; + historyCount = (historyCount + 1) % history.length; + } + historyPos = historyCount; + commandField.setText(""); + } else { + commandField.getToolkit().beep(); + } + } + } + + }); + commandField.addKeyListener(new KeyAdapter() { + + @Override + public void keyPressed(KeyEvent e) { + switch (e.getKeyCode()) { + case KeyEvent.VK_UP: { + int nextPos = (historyPos + history.length - 1) % history.length; + if (nextPos == historyCount || history[nextPos] == null) { + commandField.getToolkit().beep(); + } else { + String cmd = commandField.getText().trim(); + if (cmd.length() > 0) { + history[historyPos] = cmd; + } + historyPos = nextPos; + commandField.setText(history[historyPos]); + } + break; + } + case KeyEvent.VK_DOWN: { + int nextPos = (historyPos + 1) % history.length; + if (nextPos == historyCount) { + historyPos = nextPos; + commandField.setText(""); + } else if (historyPos == historyCount || history[nextPos] == null) { + commandField.getToolkit().beep(); + } else { + String cmd = commandField.getText().trim(); + if (cmd.length() > 0) { + history[historyPos] = cmd; + } + historyPos = nextPos; + commandField.setText(history[historyPos]); + } + break; + } + } + } + + }); + window.add(commandField, BorderLayout.SOUTH); + String key = "usart." + name; WindowUtils.restoreWindowBounds(key, window); WindowUtils.addSaveOnShutdown(key, window); + } + + public void start() { + if (window == null) { + initGUI(); + usart.setUSARTListener(this); + usart.addStateChangeListener(this); + } window.setVisible(true); - - usart.addStateChangeListener(this); - textArea.addKeyListener(this); + status = Status.STARTED; } - public void saveWindowBounds() { - WindowUtils.saveWindowBounds("usart." + name, window); + public final void stop() { + status = Status.STOPPED; + if (window != null) { + window.setVisible(false); + } } public void dataReceived(USART source, int data) { @@ -136,50 +244,49 @@ // KeyListener // ------------------------------------------------------------------- - public void keyPressed(KeyEvent key) { + protected boolean sendCommand(String command) { + int next = (wPos + 1) % QUEUE_SIZE; + if (next == rPos) { + /* Queue full */ + commandField.setEnabled(false); + return false; + } + queue[wPos] = command + '\n'; + wPos = next; + if (!isSending) { + isSending = true; + sendNext(); + } + return true; } - public void keyReleased(KeyEvent key) { - } - - public void keyTyped(KeyEvent key) { - char c = key.getKeyChar(); - - // Send it to the usart if possible! - if (usart.isReceiveFlagCleared() && bsize == 0) { - usart.byteReceived(c & 0xff); - } else if (bsize < BUFFER_SIZE){ - buffer[wPos] = (byte) (c & 0xff); - wPos = (wPos + 1) % BUFFER_SIZE; - bsize++; + public void stateChanged(Object source, int old, int state) { + if (state == USARTListener.RXFLAG_CLEARED && isSending) { + sendNext(); } - - if (bsize < BUFFER_SIZE) { - // Visualize the input - if (c == '\n') { - statusLabel.setText(PREFIX); - keyBuffer = new StringBuilder(); - keyBuffer.append(PREFIX); - } else { - keyBuffer.append(c); - statusLabel.setText(keyBuffer.toString()); - } - } else { - statusLabel.getToolkit().beep(); - statusLabel.setText("*** input buffer full ***"); - } } - public void stateChanged(Object source, int old, int state) { - if (state == USARTListener.RXFLAG_CLEARED && bsize > 0) { - if (usart.isReceiveFlagCleared()) { - usart.byteReceived(buffer[rPos]); - rPos = (rPos + 1) % BUFFER_SIZE; - if (bsize == 20) { - statusLabel.setText(keyBuffer.toString()); + private void sendNext() { + boolean updateCommand = false; + while (isSending && usart.isReceiveFlagCleared()) { + char c = queue[rPos].charAt(rIndex++); + usart.byteReceived((byte)c); + dataReceived(usart, c); + if (rIndex >= queue[rPos].length()) { + rIndex = 0; + rPos = (rPos + 1) % QUEUE_SIZE; + if (rPos == wPos) { + isSending = false; } - bsize--; + updateCommand = true; } } + if (updateCommand && !commandField.isEnabled()) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + commandField.setEnabled(true); + } + }); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2011-02-23 17:12:51
|
Revision: 789 http://mspsim.svn.sourceforge.net/mspsim/?rev=789&view=rev Author: nifi Date: 2011-02-23 17:12:45 +0000 (Wed, 23 Feb 2011) Log Message: ----------- Fixed typo Modified Paths: -------------- mspsim/Makefile Modified: mspsim/Makefile =================================================================== --- mspsim/Makefile 2011-02-10 13:05:45 UTC (rev 788) +++ mspsim/Makefile 2011-02-23 17:12:45 UTC (rev 789) @@ -73,7 +73,7 @@ SCRIPTS := ${addprefix scripts/,autorun.sc duty.sc} BINARY := README.txt license.txt CHANGE_LOG.txt images/*.jpg firmware/*/*.firmware ${SCRIPTS} -PACKAGES := se/sics/mspsim ${addprefix se/sics/mspsim/,core chip cli debug platform ${addprefix platform/,esb sky jcreate sentillausb, z1} plugin profiler net ui util extutil/highlight extutil/jfreechart} +PACKAGES := se/sics/mspsim ${addprefix se/sics/mspsim/,core chip cli debug platform ${addprefix platform/,esb sky jcreate sentillausb z1} plugin profiler net ui util extutil/highlight extutil/jfreechart} SOURCES := ${wildcard *.java $(addsuffix /*.java,$(PACKAGES))} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2011-02-10 13:05:51
|
Revision: 788 http://mspsim.svn.sourceforge.net/mspsim/?rev=788&view=rev Author: nifi Date: 2011-02-10 13:05:45 +0000 (Thu, 10 Feb 2011) Log Message: ----------- Only show IRQ profile when no function names have been specified Modified Paths: -------------- mspsim/se/sics/mspsim/util/SimpleProfiler.java Modified: mspsim/se/sics/mspsim/util/SimpleProfiler.java =================================================================== --- mspsim/se/sics/mspsim/util/SimpleProfiler.java 2011-02-08 18:03:28 UTC (rev 787) +++ mspsim/se/sics/mspsim/util/SimpleProfiler.java 2011-02-10 13:05:45 UTC (rev 788) @@ -308,13 +308,15 @@ } } } - out.println("********** Profile IRQ **************************"); - out.println("Vector Average Calls Tot.Cycles"); - for (int i = 0; i < cpu.config.maxInterruptVector + 1; i++) { + if (pattern == null) { + out.println("********** Profile IRQ **************************"); + out.println("Vector Average Calls Tot.Cycles"); + for (int i = 0; i <= cpu.config.maxInterruptVector; i++) { out.print((i < 10 ? "0" : "") + i + " "); out.printf("%4d ",(interruptCount[i] > 0 ? (interruptTime[i] / interruptCount[i]):0)); out.printf("%8d %8d",interruptCount[i],interruptTime[i]); out.println(); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |