Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.machine / src / net / mograsim / machine / mi / MicroInstructionMemoryParser.java
index 44d0098..d049e37 100644 (file)
@@ -6,59 +6,57 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
 
-import net.mograsim.logic.core.types.BitVector;
 import net.mograsim.machine.MemoryDefinition;
-import net.mograsim.machine.mi.parameters.BooleanClassification;
-import net.mograsim.machine.mi.parameters.IntegerClassification;
-import net.mograsim.machine.mi.parameters.IntegerImmediate;
 import net.mograsim.machine.mi.parameters.MicroInstructionParameter;
-import net.mograsim.machine.mi.parameters.MnemonicFamily;
-import net.mograsim.machine.mi.parameters.MnemonicFamily.MnemonicPair;
 import net.mograsim.machine.mi.parameters.ParameterClassification;
 
 public class MicroInstructionMemoryParser
 {
-       public static MicroInstructionMemory parseMemory(MicroInstructionDefinition definition, String input) throws IOException
+       public static void parseMemory(final MicroInstructionMemory memory, String inputPath) throws IOException
        {
-               try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(input))))
+               try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath))))
                {
-                       return parseMemory(definition, reader);
+                       parseMemory(memory, reader);
                }
        }
 
-       public static MicroInstructionMemory parseMemory(MicroInstructionDefinition definition, BufferedReader input)
+       public static void parseMemory(final MicroInstructionMemory memory, BufferedReader input)
        {
-               List<MicroInstruction> instructions = new ArrayList<>();
+               MicroInstructionMemoryDefinition def = memory.getDefinition();
+               MicroInstructionDefinition miDef = def.getMicroInstructionDefinition();
+
+               long minAddr = def.getMinimalAddress();
+               long maxAddr = def.getMaximalAddress();
+
+               String line;
+               long i = minAddr;
                try
                {
-                       String line;
-                       while (input.ready() && !"".equals((line = input.readLine())))
-                               instructions.add(parse(definition, line));
-               } catch (IOException e)
+                       for (; i <= maxAddr && input.ready() && !"".equals((line = input.readLine())); i++)
+                       {
+                               long iFinal = i;
+                               memory.setCell(i, parse(() -> memory.notifyObservers(iFinal), miDef, line));
+                       }
+               }
+               catch (IOException e)
                {
                        e.printStackTrace();
                }
 
-               int maxAddress = instructions.size() - 1;
-               MicroInstructionMemory memory = MicroInstructionMemory
-                               .create(MemoryDefinition.create((int) Math.ceil(Math.log(maxAddress)), 0, maxAddress));
-               int i = 0;
-               for (MicroInstruction inst : instructions)
-                       memory.setCell(i++, inst);
-               return memory;
+               for (; i <= maxAddr; i++)
+               {
+                       long iFinal = i;
+                       memory.setCell(i, miDef.createDefaultInstruction(() -> memory.notifyObservers(iFinal)));
+               }
        }
 
-       public static MicroInstruction parse(MicroInstructionDefinition definition, String toParse)
+       public static MicroInstruction parse(Runnable updateCallback, MicroInstructionDefinition definition, String toParse)
        {
                int size = definition.size();
                String[] strings = toParse.split(",");
                if (size != strings.length)
-                       throw new MicroInstructionMemoryParseException(
-                                       "String does not match definition! The number of parameters does not match.");
+                       throw new MicroInstructionMemoryParseException("String does not match definition! The number of parameters does not match.");
                MicroInstructionParameter[] params = new MicroInstructionParameter[size];
                ParameterClassification[] classes = definition.getParameterClassifications();
                try
@@ -67,16 +65,17 @@ public class MicroInstructionMemoryParser
                        {
                                params[i] = classes[i].parse(strings[i]);
                        }
-                       return new StandardMicroInstruction(params);
-               } catch (Exception e)
+                       return new StandardMicroInstruction(updateCallback, params);
+               }
+               catch (Exception e)
                {
                        throw new MicroInstructionMemoryParseException(e.getCause());
                }
        }
 
-       public static void write(MicroInstructionMemory memory, String output) throws IOException
+       public static void write(MicroInstructionMemory memory, String outputPath) throws IOException
        {
-               try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(output)))
+               try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(outputPath)))
                {
                        write(memory, writer);
                }