diff --git a/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/Cdm8CircuitAdapter.java b/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/Cdm8CircuitAdapter.java new file mode 100644 index 00000000..b0ab7f47 --- /dev/null +++ b/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/Cdm8CircuitAdapter.java @@ -0,0 +1,128 @@ +package org.cdm.logisim.debugger.adapters; + +import com.cburch.logisim.circuit.Circuit; +import com.cburch.logisim.circuit.CircuitState; +import com.cburch.logisim.circuit.SubcircuitFactory; +import com.cburch.logisim.comp.Component; +import com.cburch.logisim.data.Value; +import com.cburch.logisim.instance.InstanceState; +import org.cdm.logisim.debugger.DebuggerComponent; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.cdm.logisim.debugger.logisim.TunnelAdapter.getTunnelValue; + +public class Cdm8CircuitAdapter implements ProcessorAdapter { + private Component processorComponent = null; + + @Override + public String getDisplayName() { + return "CdM-8 (Circuit)"; + } + + @Override + public int getMemorySize() { + return 256; + } + + @Override + public List getRegisterNames() { + return Arrays.asList("r0", "r1", "r2", "r3", "pc", "sp", "ps"); + } + + @Override + public List getRegisterSizes() { + return Arrays.asList(8, 8, 8, 8, 8, 8, 8); + } + + @Override + public boolean supportsExceptions() { + return false; + } + + @Override + public Component locateComponent(Circuit circuit) { + return circuit + .getNonWires() + .stream() + .filter(x -> x.getFactory() instanceof SubcircuitFactory && x.getFactory().getName().equals("CdM_8_mark5")) + .findAny() + .orElse(null); + } + + @Override + public ProcessorState getState(CircuitState circuitState) { + Circuit currentCircuit = DebuggerComponent.getDebuggerCircuit(); + + if (processorComponent == null) { + processorComponent = locateComponent(currentCircuit); + } + + if (processorComponent == null) { + return null; + } + + InstanceState processorState = circuitState.getInstanceState(processorComponent); + + List registerPinNumbers = Arrays.asList( + PinNumbers.R0, PinNumbers.R1, PinNumbers.R2, PinNumbers.R3, + PinNumbers.PC, PinNumbers.SP, PinNumbers.PS + ); + + List registerValues = registerPinNumbers.stream() + .map(processorState::getPort) + .map(Value::toIntValue) + .collect(Collectors.toList()); + + Circuit processorSubcircuit = + ((SubcircuitFactory) processorComponent.getFactory()).getSubcircuit(); + + CircuitState processorSubcircuitState = + processorSubcircuit.getSubcircuitFactory().getSubstate(circuitState, processorComponent); + + Integer fetchTunnel = + getTunnelValue("fetch", processorSubcircuit, processorSubcircuitState); + + Integer stopTunnel = + getTunnelValue("stop", processorSubcircuit, processorSubcircuitState); + + if (fetchTunnel == null || stopTunnel == null) { + return null; + } + + return new ProcessorState() { + @Override + public boolean isFetching() { + return fetchTunnel == 1; + } + + @Override + public boolean isHalted() { + return stopTunnel == 1; + } + + @Override + public int getProgramCounter() { + return registerValues.get(4); + } + + @Override + public List getRegisters() { + return registerValues; + } + }; + } + + private static class PinNumbers { + private static final int R0 = 3; + private static final int R1 = 4; + private static final int R2 = 6; + private static final int R3 = 7; + private static final int PC = 8; + private static final int SP = 9; + private static final int PS = 10; + } + +} diff --git a/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/Cdm8eCircuitAdapter.java b/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/Cdm8eCircuitAdapter.java new file mode 100644 index 00000000..1b675cd2 --- /dev/null +++ b/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/Cdm8eCircuitAdapter.java @@ -0,0 +1,128 @@ +package org.cdm.logisim.debugger.adapters; + +import com.cburch.logisim.circuit.Circuit; +import com.cburch.logisim.circuit.CircuitState; +import com.cburch.logisim.circuit.SubcircuitFactory; +import com.cburch.logisim.comp.Component; +import com.cburch.logisim.data.Value; +import com.cburch.logisim.instance.InstanceState; +import org.cdm.logisim.debugger.DebuggerComponent; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import static org.cdm.logisim.debugger.logisim.TunnelAdapter.getTunnelValue; + +public class Cdm8eCircuitAdapter implements ProcessorAdapter { + private Component processorComponent = null; + + @Override + public String getDisplayName() { + return "CdM-8e (Circuit)"; + } + + @Override + public int getMemorySize() { + return 256; + } + + @Override + public List getRegisterNames() { + return Arrays.asList("r0", "r1", "r2", "r3", "pc", "sp", "ps"); + } + + @Override + public List getRegisterSizes() { + return Arrays.asList(8, 8, 8, 8, 16, 8, 8); + } + + @Override + public boolean supportsExceptions() { + return false; + } + + @Override + public Component locateComponent(Circuit circuit) { + return circuit + .getNonWires() + .stream() + .filter(x -> x.getFactory() instanceof SubcircuitFactory && x.getFactory().getName().equals("CdM_8_mark5")) + .findAny() + .orElse(null); + } + + @Override + public ProcessorState getState(CircuitState circuitState) { + Circuit currentCircuit = DebuggerComponent.getDebuggerCircuit(); + + if (processorComponent == null) { + processorComponent = locateComponent(currentCircuit); + } + + if (processorComponent == null) { + return null; + } + + InstanceState processorState = circuitState.getInstanceState(processorComponent); + + List registerPinNumbers = Arrays.asList( + PinNumbers.R0, PinNumbers.R1, PinNumbers.R2, PinNumbers.R3, + PinNumbers.PC, PinNumbers.SP, PinNumbers.PS + ); + + List registerValues = registerPinNumbers.stream() + .map(processorState::getPort) + .map(Value::toIntValue) + .collect(Collectors.toList()); + + Circuit processorSubcircuit = + ((SubcircuitFactory) processorComponent.getFactory()).getSubcircuit(); + + CircuitState processorSubcircuitState = + processorSubcircuit.getSubcircuitFactory().getSubstate(circuitState, processorComponent); + + Integer fetchTunnel = + getTunnelValue("fetch", processorSubcircuit, processorSubcircuitState); + + Integer stopTunnel = + getTunnelValue("stop", processorSubcircuit, processorSubcircuitState); + + if (fetchTunnel == null || stopTunnel == null) { + return null; + } + + return new ProcessorState() { + @Override + public boolean isFetching() { + return fetchTunnel == 1; + } + + @Override + public boolean isHalted() { + return stopTunnel == 1; + } + + @Override + public int getProgramCounter() { + return registerValues.get(4); + } + + @Override + public List getRegisters() { + return registerValues; + } + }; + } + + private static class PinNumbers { + private static final int R0 = 3; + private static final int R1 = 4; + private static final int R2 = 6; + private static final int R3 = 7; + private static final int PC = 9; + private static final int SP = 10; + private static final int PS = 11; + } + +} diff --git a/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/ProcessorAdapterFactory.java b/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/ProcessorAdapterFactory.java index 29316954..c9393b81 100644 --- a/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/ProcessorAdapterFactory.java +++ b/logisim/logisim-debugger/src/main/java/org/cdm/logisim/debugger/adapters/ProcessorAdapterFactory.java @@ -4,6 +4,7 @@ import org.cdm.logisim.debugger.DebuggerComponent; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -13,6 +14,16 @@ public class ProcessorAdapterFactory { private static final Map> supportedTargets = new HashMap<>(); static { + supportedTargets.put( + "cdm8", + Collections.singletonList(ProcessorType.CDM8) + ); + + supportedTargets.put( + "cdm8e", + Collections.singletonList(ProcessorType.CDM8E) + ); + supportedTargets.put( "cdm16", Arrays.asList(ProcessorType.CDM16_CIRCUIT, ProcessorType.CDM16_EMU) @@ -22,9 +33,9 @@ public class ProcessorAdapterFactory { public static ProcessorAdapter getProcessorAdapter(ProcessorType processorType) { switch (processorType) { case CDM8: - throw new UnsupportedOperationException(); + return new Cdm8CircuitAdapter(); case CDM8E: - throw new UnsupportedOperationException(); + return new Cdm8eCircuitAdapter(); case CDM16_CIRCUIT: return new Cdm16CircuitAdapter(); case CDM16_EMU: