package elw.dp.mips; import java.util.*; public class Instructions { private SortedMap<Integer, Instruction> addressToInstruction = new TreeMap<Integer, Instruction>(); private Set<Integer> readAddresses = new HashSet<Integer>(); private final Random random = new Random(); private int codeBase; private int stackBase; private int minStackBase; public void resetAccess() { readAddresses.clear(); } public Instruction get(int address) { readAddresses.add(address); return getInternal(address); } public boolean hasInstruction(int address) { return addressToInstruction.containsKey(address); } public Instruction getInternal(final int address) { if (addressToInstruction.containsKey(address)) { return addressToInstruction.get(address); } return null; } public int getSize() { return addressToInstruction.size(); } public int getAddressAt(int index) { // LATER this is memory drain final List<Integer> addrs = new ArrayList<Integer>(addressToInstruction.keySet()); Collections.sort(addrs); return addrs.get(index); } public Set<Integer> getReadAddresses() { return Collections.unmodifiableSet(readAddresses); } public void setInstructions(final List<Instruction> instructions, HashMap<String, Integer> labelIndex) { resetAccess(); codeBase = (Math.abs(random.nextInt()) % 0x1000) * 0x10; stackBase = 0x800000 - (Math.abs(random.nextInt()) % 0x1000) * 0x10; minStackBase = stackBase; int address = codeBase; addressToInstruction.clear(); for (Instruction instruction : instructions) { instruction.resolve(codeBase, labelIndex); // update the abs. addresses, if any addressToInstruction.put(address, instruction); address += 4; } } public int getCodeBase() { return codeBase; } public int getStackBase() { return stackBase; } public int getMinStackBase() { return minStackBase; } protected void updateMinStack(int spValue) { minStackBase = Math.min(minStackBase, spValue); } }