diff --git a/src/main/java/de/neemann/digital/core/element/Element.java b/src/main/java/de/neemann/digital/core/element/Element.java index e863dcd1e..add9767d9 100644 --- a/src/main/java/de/neemann/digital/core/element/Element.java +++ b/src/main/java/de/neemann/digital/core/element/Element.java @@ -40,7 +40,7 @@ public interface Element { /** * Is called after registerNodes is called on all Elements. */ - default void init(Model model) { + default void init(Model model) throws NodeException { } } diff --git a/src/main/java/de/neemann/digital/core/element/Keys.java b/src/main/java/de/neemann/digital/core/element/Keys.java index 198ff927e..e9c0b7b19 100644 --- a/src/main/java/de/neemann/digital/core/element/Keys.java +++ b/src/main/java/de/neemann/digital/core/element/Keys.java @@ -151,6 +151,12 @@ public final class Keys { public static final Key SHOW_LISTING = new Key<>("showList", false); + /** + * flag to enable the ROMs auto load function + */ + public static final Key AUTO_RELOAD_ROM + = new Key<>("autoReload", false); + /** * flag to show the data table window */ diff --git a/src/main/java/de/neemann/digital/core/memory/ROM.java b/src/main/java/de/neemann/digital/core/memory/ROM.java index 54ff79623..b466a04f2 100644 --- a/src/main/java/de/neemann/digital/core/memory/ROM.java +++ b/src/main/java/de/neemann/digital/core/memory/ROM.java @@ -8,6 +8,7 @@ import de.neemann.digital.core.element.Keys; import de.neemann.digital.lang.Lang; import java.io.File; +import java.io.IOException; import static de.neemann.digital.core.element.PinInfo.input; @@ -32,15 +33,17 @@ public class ROM extends Node implements Element { .addAttribute(Keys.BITS) .addAttribute(Keys.ADDR_BITS) .addAttribute(Keys.LABEL) - .addAttribute(Keys.SHOW_LISTING) - .addAttribute(Keys.DATA); + .addAttribute(Keys.DATA) + .addAttribute(Keys.AUTO_RELOAD_ROM) + .addAttribute(Keys.SHOW_LISTING); - private final DataField data; + private DataField data; private final ObservableValue output; private final int addrBits; private final boolean showList; - private final File listFile; + private final File hexFile; private final Observable romObservable = new Observable(); + private final boolean autoLoad; private ObservableValue addrIn; private ObservableValue selIn; private int addr; @@ -58,10 +61,11 @@ public class ROM extends Node implements Element { data = attr.get(Keys.DATA); addrBits = attr.get(Keys.ADDR_BITS); showList = attr.get(Keys.SHOW_LISTING); - if (showList) { - listFile = attr.getFile(LAST_DATA_FILE_KEY); + autoLoad = attr.get(Keys.AUTO_RELOAD_ROM); + if (showList || autoLoad) { + hexFile = attr.getFile(LAST_DATA_FILE_KEY); } else - listFile = null; + hexFile = null; } @Override @@ -102,15 +106,26 @@ public class ROM extends Node implements Element { * * @return the file */ - public File getListFile() { - return listFile; + public File getHexFile() { + return hexFile; + } + + @Override + public void init(Model model) throws NodeException { + if (autoLoad) { + try { + data = new DataField(hexFile); + } catch (IOException e) { + throw new NodeException(e.getMessage(), this, null); + } + } } /** * @return true if there is a listing to show */ public boolean showListing() { - return showList && listFile != null; + return showList && hexFile != null; } /** diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index e71dcc24a..1b29ec7e2 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -64,7 +64,6 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E ATTR_LIST.add(Keys.SHOW_DATA_TABLE); ATTR_LIST.add(Keys.SHOW_DATA_GRAPH); ATTR_LIST.add(Keys.SHOW_DATA_GRAPH_MICRO); - ATTR_LIST.add(Keys.SHOW_LISTING); } private static final String MESSAGE = Lang.get("message"); @@ -648,17 +647,14 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E if (settings.get(Keys.SHOW_DATA_GRAPH_MICRO)) windowPosManager.register("datasetMicro", new DataSetDialog(this, model, true, ordering)).setVisible(true); - if (settings.get(Keys.SHOW_LISTING)) { - int i = 0; - for (ROM rom : model.findNode(ROM.class)) - if (rom.showListing()) - try { - windowPosManager.register("rom" + (i++), new ROMListingDialog(this, rom)).setVisible(true); - } catch (IOException e) { - new ErrorMessage(Lang.get("msg_errorReadingListing_N0", rom.getListFile().toString())).addCause(e).show(this); - } - } - + int i = 0; + for (ROM rom : model.findNode(ROM.class)) + if (rom.showListing()) + try { + windowPosManager.register("rom" + (i++), new ROMListingDialog(this, rom)).setVisible(true); + } catch (IOException e) { + new ErrorMessage(Lang.get("msg_errorReadingListing_N0", rom.getHexFile().toString())).addCause(e).show(this); + } model.init(); diff --git a/src/main/java/de/neemann/digital/gui/components/listing/ROMListingDialog.java b/src/main/java/de/neemann/digital/gui/components/listing/ROMListingDialog.java index bed6c3017..82e32cfb7 100644 --- a/src/main/java/de/neemann/digital/gui/components/listing/ROMListingDialog.java +++ b/src/main/java/de/neemann/digital/gui/components/listing/ROMListingDialog.java @@ -39,7 +39,7 @@ public class ROMListingDialog extends JDialog implements Observer { setDefaultCloseOperation(DISPOSE_ON_CLOSE); setAlwaysOnTop(true); - File filename = rom.getListFile(); + File filename = rom.getHexFile(); String name = filename.getName(); int p = name.lastIndexOf('.'); if (p >= 0) { diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 5d98cdc76..995f798b8 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -183,6 +183,8 @@ Zur Analyse können Sie die Schaltung im Gatterschrittmodus ausführen. Wert Breite Breite des Symbols wenn diese Schaltung in eine andere eingefügt wird. + Bei jedem Start neu Laden. + Lädt das HEX-File bei jedem Modelstart neu. Tausche Position des Selectors Zahlenformat ASCII diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 6b49ff39b..cf5798763 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -183,6 +183,8 @@ To analyse you can run the circuit in single gate step mode. Value Width With of symbol if this circuit is used in an element ins an other circuit. + Reload at model start + Reloads the hex file every time the model is started. Flip selector position Number Format ascii