commit a0ff1cf91a3192b6591a95507a5ad8c88a6fd639 Author: aieque Date: Wed Dec 23 19:29:59 2020 +0100 Initial Commit diff --git a/.metadata/.lock b/.metadata/.lock new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.log b/.metadata/.log new file mode 100644 index 0000000..bad659c --- /dev/null +++ b/.metadata/.log @@ -0,0 +1,125 @@ +!SESSION 2020-12-23 07:02:50.204 ----------------------------------------------- +eclipse.buildId=4.13.0.I20190916-1045 +java.version=1.8.0_91 +java.vendor=Oracle Corporation +BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_GB +Framework arguments: -product org.eclipse.epp.package.java.product +Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.java.product + +!ENTRY org.eclipse.jface 2 0 2020-12-23 07:03:40.945 +!MESSAGE Keybinding conflicts occurred. They may interfere with normal accelerator operation. +!SUBENTRY 1 org.eclipse.jface 2 0 2020-12-23 07:03:40.946 +!MESSAGE A conflict occurred for ALT+T: +Binding(ALT+T, + ParameterizedCommand(Command(org.synthclipse.ide.command.TimelineShowView,Timeline / Show View, + , + Category(org.synthclipse.category,Synthclipse,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@4b4228cf, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.ui.contexts.window,,,system) +Binding(ALT+T, + ParameterizedCommand(Command(org.synthclipse.ide.command.GraphShowView,Graph / Show View, + , + Category(org.synthclipse.category,Synthclipse,null,true), + org.eclipse.ui.internal.WorkbenchHandlerServiceHandler@7d216ee8, + ,,true),null), + org.eclipse.ui.defaultAcceleratorConfiguration, + org.eclipse.ui.contexts.window,,,system) + +!ENTRY org.eclipse.equinox.p2.metadata.repository 4 1000 2020-12-23 07:39:51.272 +!MESSAGE No repository found at jar:file:/E:/pdf/jd-eclipse-2.0.0.zip!/. + +!ENTRY org.synthclipse.ide 4 0 2020-12-23 18:07:12.040 +!MESSAGE java.lang.UnsatisfiedLinkError: no JSyphon in java.library.path +!STACK 0 +java.lang.UnsatisfiedLinkError: no JSyphon in java.library.path + at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867) + at java.lang.Runtime.loadLibrary0(Runtime.java:870) + at java.lang.System.loadLibrary(System.java:1122) + at jsyphon.JSyphonServer.(JSyphonServer.java:40) + at org.synthclipse.ide.controllers.SharingController.(SharingController.java:54) + at org.synthclipse.ide.controllers.SynthclipseController.(SynthclipseController.java:125) + at org.synthclipse.ide.controllers.SynthclipseController.(SynthclipseController.java:153) + at org.synthclipse.ide.controllers.SynthclipseController$SingletonHolder.(SynthclipseController.java:157) + at org.synthclipse.ide.controllers.SynthclipseController.getInstance(SynthclipseController.java:161) + at org.synthclipse.ide.Activator.start(Activator.java:87) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:842) + at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1) + at java.security.AccessController.doPrivileged(Native Method) + at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:834) + at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:791) + at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1015) + at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:365) + at org.eclipse.osgi.container.Module.doStart(Module.java:603) + at org.eclipse.osgi.container.Module.start(Module.java:467) + at org.eclipse.osgi.framework.util.SecureAction$23.run(SecureAction.java:500) + at org.eclipse.osgi.framework.util.SecureAction$23.run(SecureAction.java:1) + at java.security.AccessController.doPrivileged(Native Method) + at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:497) + at org.eclipse.osgi.internal.hooks.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:117) + at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalClass(ClasspathManager.java:571) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalClass(ModuleClassLoader.java:330) + at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:398) + at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:425) + at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417) + at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:155) + at java.lang.ClassLoader.loadClass(ClassLoader.java:357) + at org.eclipse.osgi.internal.framework.EquinoxBundle.loadClass(EquinoxBundle.java:620) + at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:196) + at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:934) + at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:246) + at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:63) + at org.eclipse.ui.internal.handlers.HandlerProxy.loadHandler(HandlerProxy.java:342) + at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:277) + at org.eclipse.ui.internal.handlers.E4HandlerProxy.execute(E4HandlerProxy.java:95) + at sun.reflect.GeneratedMethodAccessor54.invoke(Unknown Source) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58) + at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:318) + at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:252) + at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:173) + at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:156) + at org.eclipse.core.commands.Command.executeWithChecks(Command.java:498) + at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:487) + at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:213) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:308) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:584) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:653) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:443) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$2(KeyBindingDispatcher.java:386) + at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:96) + at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) + at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1199) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1056) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1081) + at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1066) + at org.eclipse.swt.widgets.Control.traverse(Control.java:4270) + at org.eclipse.swt.widgets.Control.translateTraversal(Control.java:4252) + at org.eclipse.swt.widgets.Composite.translateTraversal(Composite.java:1299) + at org.eclipse.swt.widgets.Display.translateTraversal(Display.java:4729) + at org.eclipse.swt.widgets.Display.filterMessage(Display.java:1217) + at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3581) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1160) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) + at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1049) + at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155) + at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:633) + at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338) + at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:557) + at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) + at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:150) + at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137) + at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400) + at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.lang.reflect.Method.invoke(Method.java:498) + at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:660) + at org.eclipse.equinox.launcher.Main.basicRun(Main.java:597) + at org.eclipse.equinox.launcher.Main.run(Main.java:1468) diff --git a/.metadata/.mylyn/.taskListIndex/segments_1 b/.metadata/.mylyn/.taskListIndex/segments_1 new file mode 100644 index 0000000..bd42ed4 Binary files /dev/null and b/.metadata/.mylyn/.taskListIndex/segments_1 differ diff --git a/.metadata/.mylyn/.taskListIndex/write.lock b/.metadata/.mylyn/.taskListIndex/write.lock new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.mylyn/.tasks.xml.zip b/.metadata/.mylyn/.tasks.xml.zip new file mode 100644 index 0000000..9dfb345 Binary files /dev/null and b/.metadata/.mylyn/.tasks.xml.zip differ diff --git a/.metadata/.mylyn/repositories.xml.zip b/.metadata/.mylyn/repositories.xml.zip new file mode 100644 index 0000000..ef15dd9 Binary files /dev/null and b/.metadata/.mylyn/repositories.xml.zip differ diff --git a/.metadata/.mylyn/tasks.xml.zip b/.metadata/.mylyn/tasks.xml.zip new file mode 100644 index 0000000..c241247 Binary files /dev/null and b/.metadata/.mylyn/tasks.xml.zip differ diff --git a/.metadata/.plugins/org.eclipse.cdt.core/.log b/.metadata/.plugins/org.eclipse.cdt.core/.log new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c b/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c @@ -0,0 +1 @@ + diff --git a/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp b/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.cdt.make.core/specs.cpp @@ -0,0 +1 @@ + diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/0/d00d635f4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/0/d00d635f4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ebcfad8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/0/d00d635f4145001b1e64e5c7226e70c6 @@ -0,0 +1,43 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/0/e0d074810d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/0/e0d074810d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..87c03e9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/0/e0d074810d45001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class Registers { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1/b0db06483e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/1/b0db06483e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..68e4053 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1/b0db06483e45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/10/30b1d5bde544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/10/30b1d5bde544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9aecaed --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/10/30b1d5bde544001b1e64e5c7226e70c6 @@ -0,0 +1,12 @@ +package playingcoffee.core; + +public class CPU { + + public CPU() { + + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/10/50536124f044001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/10/50536124f044001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d215621 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/10/50536124f044001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core.cpu; + +public class MicroOps { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/10/c0d831d73a45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/10/c0d831d73a45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d35caf6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/10/c0d831d73a45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data; + try { + data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + for (int i = 0; i < data.length; i++) { + ram[i] = Byte.toUnsignedInt(data[i]); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/10/e02206873d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/10/e02206873d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9c3961d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/10/e02206873d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + new JOptionPane(String.format("Unknown opcode: 0x%2x", opcode), JOptionPane.OK_OPTION).show();; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/11/308e836a0d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/11/308e836a0d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..76f9088 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/11/308e836a0d45001b1e64e5c7226e70c6 @@ -0,0 +1,112 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private CPU cpu; + private MMU mmu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + cpu = new CPU(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/11/507921584945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/11/507921584945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..120ec32 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/11/507921584945001b1e64e5c7226e70c6 @@ -0,0 +1,108 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static final int[] INSTRUCTION_CYCLE_COUNT = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public static final int[] PREFIXED_CYCLE_COUNT = { + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += INSTRUCTION_CYCLE_COUNT[opcode & 0xF]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/11/a0f480c3e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/11/a0f480c3e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1482520 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/11/a0f480c3e544001b1e64e5c7226e70c6 @@ -0,0 +1,14 @@ +package playingcoffee.core; + +public class CPU { + + private final Memory memory; + + public CPU() { + + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/006c4a3f0f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/13/006c4a3f0f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..003784d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/13/006c4a3f0f45001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class CPU { + + private Registers registers; + + public Registers getRegisters() { + return registers; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/13/409819354245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/13/409819354245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..af4476c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/13/409819354245001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int af; + private int bc; + private int de; + private int hl; + + public int pc; + public int sp; + + public int readAF() { + return af; + } + + public int readBC() { + return bc; + } + + public int readDE() { + return de; + } + + public int readHL() { + return hl; + } + + public int readA() { + return af & 0xff; + } + + public void writeA(int a) { + this.af = a & 0xff; + } + + public int readF() { + return (af >> 8) & 0xff; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/14/20058340e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/14/20058340e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7ab5d64 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/14/20058340e544001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class Memory { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/15/30a433814445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/15/30a433814445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b310e4c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/15/30a433814445001b1e64e5c7226e70c6 @@ -0,0 +1,123 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public static final int FLAG_Z = 1 << 7; + public static final int FLAG_N = 1 << 6; + public static final int FLAG_H = 1 << 5; + public static final int FLAG_C = 1 << 4; + + public void setFlag(int flag, boolean value) { + if (value) + + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/20be6fcc4445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/16/20be6fcc4445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d4fc1a5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/16/20be6fcc4445001b1e64e5c7226e70c6 @@ -0,0 +1,68 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() != 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/7010c142f444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/16/7010c142f444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..fdfa089 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/16/7010c142f444001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core.cpu; + +import java.util.ArrayList; +import java.util.List; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + List microOps; + + public Opcode(MicroOp... ops) { + microOps = new ArrayList(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/801e5ead3245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/16/801e5ead3245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..10c906a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/16/801e5ead3245001b1e64e5c7226e70c6 @@ -0,0 +1,23 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/907921094945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/16/907921094945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..502eaf7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/16/907921094945001b1e64e5c7226e70c6 @@ -0,0 +1,103 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += instructionCycle[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += instructionCycle[opcode]; + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/16/90bc356e1445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/16/90bc356e1445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..73f1119 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/16/90bc356e1445001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core; + +public class MMU { + + private int ram[]; + + + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/17/b0d1f2c90c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/17/b0d1f2c90c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..52e83fe --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/17/b0d1f2c90c45001b1e64e5c7226e70c6 @@ -0,0 +1,110 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE) + .addComponent(lblMemoryView)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/18/40dca2bc4245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/18/40dca2bc4245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..56f55e4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/18/40dca2bc4245001b1e64e5c7226e70c6 @@ -0,0 +1,50 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + + System.out.println(registers.readL()); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/18/a011c32d4945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/18/a011c32d4945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..10dda6d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/18/a011c32d4945001b1e64e5c7226e70c6 @@ -0,0 +1,106 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += instructionCycle[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += instructionCycle[opcode]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/18/e099dfc84145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/18/e099dfc84145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..bfd8185 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/18/e099dfc84145001b1e64e5c7226e70c6 @@ -0,0 +1,46 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/19/40bbfe1bf444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/19/40bbfe1bf444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d6871e2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/19/40bbfe1bf444001b1e64e5c7226e70c6 @@ -0,0 +1,9 @@ +package playingcoffee.core.cpu; + +public class Opcode { + + public Opcode(MicroOp ops...) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/19/80f51b0cf444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/19/80f51b0cf444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..228a1ba --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/19/80f51b0cf444001b1e64e5c7226e70c6 @@ -0,0 +1,12 @@ +package playingcoffee.core.cpu; + +public abstract class MicroOp { + + private int cycles; + + public int getLength() { + return cycles; + } + + public abstract void execute(); +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1d/00f3fb644745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/00f3fb644745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2efad95 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/00f3fb644745001b1e64e5c7226e70c6 @@ -0,0 +1,80 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1d/606e95daf344001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/606e95daf344001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b711d3b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1d/606e95daf344001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core.cpu; + +public class Opcode { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1e/709197160f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/709197160f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c831f10 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/709197160f45001b1e64e5c7226e70c6 @@ -0,0 +1,113 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readA() { + return a; + } + + public void writeA(int a) { + verify(a); + + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + verify(a); + + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + verify(a); + + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + verify(a); + + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + verify(a); + + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + verify(a); + + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + verify(a); + + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + verify(a); + + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + verify(a); + + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + verify(a); + + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1e/805493134345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/805493134345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d36ffd2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1e/805493134345001b1e64e5c7226e70c6 @@ -0,0 +1,53 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d0146e4b3945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d0146e4b3945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..cfd577d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/1f/d0146e4b3945001b1e64e5c7226e70c6 @@ -0,0 +1,118 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().readPC())); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().readSP())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2/70b846121045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2/70b846121045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..67572dd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2/70b846121045001b1e64e5c7226e70c6 @@ -0,0 +1,120 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model. + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/21/00bac9751045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/21/00bac9751045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..333577c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/21/00bac9751045001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/21/903a1513e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/21/903a1513e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..bc3945b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/21/903a1513e544001b1e64e5c7226e70c6 @@ -0,0 +1,13 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU m_CPU; + + public Gameboy() { + m_CPU = new CPU(); + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/22/109dafc44745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/22/109dafc44745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b3bbf27 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/22/109dafc44745001b1e64e5c7226e70c6 @@ -0,0 +1,87 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/22/4044b0ee0e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/22/4044b0ee0e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..90907cd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/22/4044b0ee0e45001b1e64e5c7226e70c6 @@ -0,0 +1,94 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readA() { + return a; + } + + public void writeA(int a) { + + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/23/50c186d40b45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/23/50c186d40b45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a042f8c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/23/50c186d40b45001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + MicroOp microOps[]; + + public Opcode(MicroOp... ops) { + microOps = ops; + } + + public void execute() { + for(MicroOp op : microOps) + op.execute(); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/25/109bdab03245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/25/109bdab03245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6b3729f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/25/109bdab03245001b1e64e5c7226e70c6 @@ -0,0 +1,23 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.readPC()); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/25/d04906e73e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/25/d04906e73e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..72e0f56 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/25/d04906e73e45001b1e64e5c7226e70c6 @@ -0,0 +1,25 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/26/a08487d40b45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/26/a08487d40b45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..300635e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/26/a08487d40b45001b1e64e5c7226e70c6 @@ -0,0 +1,21 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.Memory; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void registerOpcodes() { + // Example: instructions[0x01] = new OpcodeBuilder().read(OpcodeArgument.C, OpcodeArgument.PC_INC).read(OpcodeArgument.B, OpcodeArgument.PC_INC); + + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/26/e0a9638d3e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/26/e0a9638d3e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a655e20 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/26/e0a9638d3e45001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute() { + for (Op op : ops) + op.execute(); + } + + public class Op { + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/101bf44bf444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/28/101bf44bf444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9db1ea8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/101bf44bf444001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core.cpu; + +import java.util.ArrayList; +import java.util.List; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + List microOps; + + public Opcode(MicroOp... ops) { + microOps = new ArrayList(); + microOps.add(ops); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/30c6388a3245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/28/30c6388a3245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2b1eb70 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/30c6388a3245001b1e64e5c7226e70c6 @@ -0,0 +1,118 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().readPC())); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().readSP())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/403385130d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/28/403385130d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..eaa1bf9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/403385130d45001b1e64e5c7226e70c6 @@ -0,0 +1,106 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/90d802d43d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/28/90d802d43d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c2b4ff2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/90d802d43d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + JOptionPane.showMessageDialog(null, String.format("Unknown opcode: 0x%2x", opcode)); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/28/a087cb6b4645001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/28/a087cb6b4645001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3058245 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/28/a087cb6b4645001b1e64e5c7226e70c6 @@ -0,0 +1,68 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/29/30c342eb0b45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/29/30c342eb0b45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2a/10b87e1fe544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/10b87e1fe544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d5faa52 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/10b87e1fe544001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core; + +public class CPU { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2a/60bea2364445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/60bea2364445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d8849f5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/60bea2364445001b1e64e5c7226e70c6 @@ -0,0 +1,119 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public static final int FLAG_Z = 1 << 7; + + public void setFlag(int flag, boolean value) { + + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2a/807908913f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/807908913f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..cd46db1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/807908913f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + stored = (mmu.read(registers.pc++) << 8) | mmu.read(registers.pc); + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2a/9023da3cf444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/9023da3cf444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a469f4a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/9023da3cf444001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core.cpu; + +import java.util.ArrayList; +import java.util.List; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + List microOps; + + public Opcode(MicroOp... ops) { + microOps = new ArrayList(ops); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2b/30f0a3884445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/30f0a3884445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..aa7a873 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2b/30f0a3884445001b1e64e5c7226e70c6 @@ -0,0 +1,123 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public static final int FLAG_Z = 1 << 7; + public static final int FLAG_N = 1 << 6; + public static final int FLAG_H = 1 << 5; + public static final int FLAG_C = 1 << 4; + + public void setFlag(int flag, boolean value) { + if (value) + f |= flag; + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2c/400daa513e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/400daa513e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d52ae74 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/400daa513e45001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class Op { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2c/905de3b04645001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/905de3b04645001b1e64e5c7226e70c6 new file mode 100644 index 0000000..da7cab4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2c/905de3b04645001b1e64e5c7226e70c6 @@ -0,0 +1,72 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2e/d00b6f584345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/d00b6f584345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b186a1f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2e/d00b6f584345001b1e64e5c7226e70c6 @@ -0,0 +1,60 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + default: + System.err.printf("Unknown opcode: 0x%fx\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2f/901952dbf144001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/901952dbf144001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4e9cbe8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2f/901952dbf144001b1e64e5c7226e70c6 @@ -0,0 +1,20 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.Memory; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void registerOpcodes() { + // Example: instructions[0x01] = new OpcodeBuilder().read(OpcodeArgument.C, OpcodeArgument.PC_INC).read(OpcodeArgument.B, OpcodeArgument.PC_INC); + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/20cd63fc3e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3/20cd63fc3e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b6a514f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/20cd63fc3e45001b1e64e5c7226e70c6 @@ -0,0 +1,30 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3/d08083e23e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3/d08083e23e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f64a91b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3/d08083e23e45001b1e64e5c7226e70c6 @@ -0,0 +1,25 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOp implements { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/30/70ebd00ce544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/30/70ebd00ce544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ae137af --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/30/70ebd00ce544001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU m_CPU; + + public Gameboy() { + m_CPU = new CPU(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/30/e07a2a473d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/30/e07a2a473d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2e0739d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/30/e07a2a473d45001b1e64e5c7226e70c6 @@ -0,0 +1,30 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/20f8c0974845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/31/20f8c0974845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c2b5e85 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/31/20f8c0974845001b1e64e5c7226e70c6 @@ -0,0 +1,100 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/31/4095621ae544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/31/4095621ae544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..beed326 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/31/4095621ae544001b1e64e5c7226e70c6 @@ -0,0 +1,15 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU m_CPU; + + public Gameboy() { + m_CPU = new CPU(); + + while (true) { + m_CPU.clock(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/32/30ae7feaf344001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/32/30ae7feaf344001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3b0f06b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/32/30ae7feaf344001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core.cpu; + +public abstract class MicroOp { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/c03844c54345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/34/c03844c54345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3ff508b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/34/c03844c54345001b1e64e5c7226e70c6 @@ -0,0 +1,64 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/34/c08d166d1045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/34/c08d166d1045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8de09f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/34/c08d166d1045001b1e64e5c7226e70c6 @@ -0,0 +1,120 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement(""); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/35/106ee8abe844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/35/106ee8abe844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5cf2189 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/35/106ee8abe844001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core; + +import playingcoffee.core.Memory; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/36/b07200863d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/36/b07200863d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..22e57e2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/36/b07200863d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + new JOptionPane(String.format("Unknown opcode: 0x%2x", opcode), JOptionPane.OK_OPTION); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/37/50e80b463945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/37/50e80b463945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..cfca291 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/37/50e80b463945001b1e64e5c7226e70c6 @@ -0,0 +1,25 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.readPC()); + registers.writePC(registers.readPC() + 1); + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/37/e02b524c3c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/37/e02b524c3c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6dfc621 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/37/e02b524c3c45001b1e64e5c7226e70c6 @@ -0,0 +1,24 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/38/b02dc2663f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/38/b02dc2663f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..980fcab --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/38/b02dc2663f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(this); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Opcode opcode) { + opcode.stored = + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/39/c05b67333f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/39/c05b67333f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2455217 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/39/c05b67333f45001b1e64e5c7226e70c6 @@ -0,0 +1,36 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Opcode opcode) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/39/e05be70b3f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/39/e05be70b3f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b6a514f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/39/e05be70b3f45001b1e64e5c7226e70c6 @@ -0,0 +1,30 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/40d7382a3a45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/40d7382a3a45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7ae8910 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/40d7382a3a45001b1e64e5c7226e70c6 @@ -0,0 +1,24 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3a/a095a3ea0e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/a095a3ea0e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..333577c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3a/a095a3ea0e45001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3b/107c5f861045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/107c5f861045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4852423 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/107c5f861045001b1e64e5c7226e70c6 @@ -0,0 +1,97 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readAF() { + return a << 8 | F; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3b/508bec9b4645001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/508bec9b4645001b1e64e5c7226e70c6 new file mode 100644 index 0000000..78e4e33 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3b/508bec9b4645001b1e64e5c7226e70c6 @@ -0,0 +1,72 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/402d58e7e444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/402d58e7e444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b046e02 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/402d58e7e444001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class CPU { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3c/4092c22b3f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/4092c22b3f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6cd92e5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3c/4092c22b3f45001b1e64e5c7226e70c6 @@ -0,0 +1,36 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3e/7005e2abe844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/7005e2abe844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ecdcf62 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3e/7005e2abe844001b1e64e5c7226e70c6 @@ -0,0 +1,14 @@ +package playingcoffee.core; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/00c76d9f3f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/00c76d9f3f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..767af27 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/00c76d9f3f45001b1e64e5c7226e70c6 @@ -0,0 +1,37 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + stored = (mmu.read(registers.pc++) << 8) | mmu.read(registers.pc); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/40c11acf4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/40c11acf4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7712d72 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/40c11acf4145001b1e64e5c7226e70c6 @@ -0,0 +1,48 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: + + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/3f/80ae5a794845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/80ae5a794845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..541f870 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/3f/80ae5a794845001b1e64e5c7226e70c6 @@ -0,0 +1,100 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4/9068ea671445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4/9068ea671445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..493692e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4/9068ea671445001b1e64e5c7226e70c6 @@ -0,0 +1,15 @@ +package playingcoffee.core; + +public class MMU { + + private int ram[]; + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/200054160c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/40/200054160c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a8dc5ad --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/40/200054160c45001b1e64e5c7226e70c6 @@ -0,0 +1,43 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; + +public class CPUDebugger { + + private JFrame frame; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 450, 300); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/801177670d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/40/801177670d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d9d1652 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/40/801177670d45001b1e64e5c7226e70c6 @@ -0,0 +1,110 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private CPU cpu; + private MMU mmu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/40/d081bcc94045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/40/d081bcc94045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c4790c5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/40/d081bcc94045001b1e64e5c7226e70c6 @@ -0,0 +1,33 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/41/3021803f3f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/41/3021803f3f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..94aa758 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/41/3021803f3f45001b1e64e5c7226e70c6 @@ -0,0 +1,36 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(this); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Opcode opcode) { + opcode.registers.pc = 0x00; + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/41/601ef56d4645001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/41/601ef56d4645001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ea79221 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/41/601ef56d4645001b1e64e5c7226e70c6 @@ -0,0 +1,70 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + break; + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/3050ee914045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/42/3050ee914045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..34bcaa1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/42/3050ee914045001b1e64e5c7226e70c6 @@ -0,0 +1,39 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int operand; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + operand = (mmu.read(registers.pc++) << 8) | mmu.read(registers.pc); + } + } + + public class +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/42/b0fab9584745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/42/b0fab9584745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..91bdda8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/42/b0fab9584745001b1e64e5c7226e70c6 @@ -0,0 +1,79 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/43/d052dcdd3145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/43/d052dcdd3145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e898d41 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/43/d052dcdd3145001b1e64e5c7226e70c6 @@ -0,0 +1,109 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/44/10901fd23145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/44/10901fd23145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..349fb92 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/44/10901fd23145001b1e64e5c7226e70c6 @@ -0,0 +1,113 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + + int data[][] = { + {}, + }; + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/46/70cb5e314845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/46/70cb5e314845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7c4bfa9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/46/70cb5e314845001b1e64e5c7226e70c6 @@ -0,0 +1,90 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/47/10a037064945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/47/10a037064945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..74538fb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/47/10a037064945001b1e64e5c7226e70c6 @@ -0,0 +1,102 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += instructionCycle[opcode] + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/47/e08ced914045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/47/e08ced914045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..56cb9c9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/47/e08ced914045001b1e64e5c7226e70c6 @@ -0,0 +1,39 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int operand; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + operand = (mmu.read(registers.pc++) << 8) | mmu.read(registers.pc); + } + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/40dd77ce0f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/40dd77ce0f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d51e3cc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/40dd77ce0f45001b1e64e5c7226e70c6 @@ -0,0 +1,118 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + ListModel model = new + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/704e42b34145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/704e42b34145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6c6a260 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/704e42b34145001b1e64e5c7226e70c6 @@ -0,0 +1,44 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4a/80c063321545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/80c063321545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..dab1ce0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4a/80c063321545001b1e64e5c7226e70c6 @@ -0,0 +1,131 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + + int data[][] = { + + }; + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/207d060b1045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/207d060b1045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f56f6ac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/207d060b1045001b1e64e5c7226e70c6 @@ -0,0 +1,120 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + ListModel model = new DefaultListModel(); + model. + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/9010ae263f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/9010ae263f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..bb957c6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/9010ae263f45001b1e64e5c7226e70c6 @@ -0,0 +1,33 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/907062b93d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/907062b93d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..aa72dcf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/907062b93d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + JOptionPane.showConfirmDialog(null, String.format("Unknown opcode: 0x%2x", opcode)); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/a0c199041445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/a0c199041445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..98bc4ec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/a0c199041445001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class MMU { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4b/b0cd6da04645001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/b0cd6da04645001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6024fc7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4b/b0cd6da04645001b1e64e5c7226e70c6 @@ -0,0 +1,72 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, registers.readH() & (1 << 7)); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0ad74730d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0ad74730d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..74e76b2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0ad74730d45001b1e64e5c7226e70c6 @@ -0,0 +1,115 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0f3ef113a45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0f3ef113a45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..72d1ef3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4c/d0f3ef113a45001b1e64e5c7226e70c6 @@ -0,0 +1,118 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4d/700e23364145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/700e23364145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f967068 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4d/700e23364145001b1e64e5c7226e70c6 @@ -0,0 +1,37 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0xAF: + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/1015b8f9f144001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/1015b8f9f144001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8160e37 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/1015b8f9f144001b1e64e5c7226e70c6 @@ -0,0 +1,21 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.Memory; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void registerOpcodes() { + // Example: instructions[0x01] = new OpcodeBuilder().read(OpcodeArgument.C, OpcodeArgument.PC_INC).read(OpcodeArgument.B, OpcodeArgument.PC_INC); + // Alternative: instructions[0x01] = () -> { }; + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/30d23ae83e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/30d23ae83e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f1d6c87 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/30d23ae83e45001b1e64e5c7226e70c6 @@ -0,0 +1,31 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + // TODO Auto-generated method stub + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/4f/e0bb0add3a45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/e0bb0add3a45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1a54d05 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/4f/e0bb0add3a45001b1e64e5c7226e70c6 @@ -0,0 +1,36 @@ +package playingcoffee.core; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data; + try { + data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + for (int i = 0; i < data.length; i++) { + ram[i] = Byte.toUnsignedInt(data[i]); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5/c07880f7ea44001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5/c07880f7ea44001b1e64e5c7226e70c6 new file mode 100644 index 0000000..884f871 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5/c07880f7ea44001b1e64e5c7226e70c6 @@ -0,0 +1,20 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.Memory; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void registerOpcodes() { + + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/50/00e5d74e3f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/50/00e5d74e3f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f4324db --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/50/00e5d74e3f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(this); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Opcode opcode) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/50/5087aeaa1045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/50/5087aeaa1045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..003784d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/50/5087aeaa1045001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class CPU { + + private Registers registers; + + public Registers getRegisters() { + return registers; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/50/d048a70b4345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/50/d048a70b4345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c8d83e1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/50/d048a70b4345001b1e64e5c7226e70c6 @@ -0,0 +1,49 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/52/20a9193f3d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/52/20a9193f3d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..bb78dc7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/52/20a9193f3d45001b1e64e5c7226e70c6 @@ -0,0 +1,28 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + switch (opcode) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/52/90b162f04245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/52/90b162f04245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f5c3af0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/52/90b162f04245001b1e64e5c7226e70c6 @@ -0,0 +1,48 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/52/90d4641f3f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/52/90d4641f3f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..49a39e6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/52/90d4641f3f45001b1e64e5c7226e70c6 @@ -0,0 +1,33 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/52/a01ec5563e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/52/a01ec5563e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4042fac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/52/a01ec5563e45001b1e64e5c7226e70c6 @@ -0,0 +1,9 @@ +package playingcoffee.core; + +public class Opcode { + + public class Op { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/54/908b600b3245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/54/908b600b3245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ef9bedf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/54/908b600b3245001b1e64e5c7226e70c6 @@ -0,0 +1,15 @@ +package playingcoffee.core; + +public class CPU { + + private Registers registers; + + public CPU() { + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/509e347a4945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/55/509e347a4945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ba6a3be --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/55/509e347a4945001b1e64e5c7226e70c6 @@ -0,0 +1,158 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import playingcoffee.core.Registers; + +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCarry; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + chckbxZero.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_Z)); + chckbxNegative.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_N)); + chckbxHalfCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_H)); + chckbxCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_C)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + while (cpu.getCycles() != 0) cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + chckbxZero = new JCheckBox("Zero"); + chckbxNegative = new JCheckBox("Negative"); + chckbxHalfCarry = new JCheckBox("Half Carry"); + chckbxCarry = new JCheckBox("Carry"); + + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/b07a333fe544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/55/b07a333fe544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/55/d02fe13e4445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/55/d02fe13e4445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..859372b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/55/d02fe13e4445001b1e64e5c7226e70c6 @@ -0,0 +1,121 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public static final int FLAG_Z = 1 << 7; + public static final int FLAG_N = 1 << 6; + public static final int FLAG_H = 1 << 5; + + public void setFlag(int flag, boolean value) { + + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/10993a920c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/56/10993a920c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e7e0d9e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/10993a920c45001b1e64e5c7226e70c6 @@ -0,0 +1,92 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 450, 300); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers"); + + JList list = new JList(); + + table = new JTable(); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING, false) + .addComponent(list, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(Alignment.LEADING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters, Alignment.LEADING)) + .addGap(18) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 185, Short.MAX_VALUE) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 219, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(0)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/a00e00943f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/56/a00e00943f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..92e08ee --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/a00e00943f45001b1e64e5c7226e70c6 @@ -0,0 +1,36 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + @Override + public void execute() { + stored = (mmu.read(registers.pc++) << 8) | mmu.read(registers.pc); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/56/f042ec823f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/56/f042ec823f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2a96624 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/56/f042ec823f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/57/0046445a0c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/57/0046445a0c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2563286 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/57/0046445a0c45001b1e64e5c7226e70c6 @@ -0,0 +1,78 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; + +public class CPUDebugger { + + private JFrame frame; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 450, 300); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters)) + .addContainerGap(302, Short.MAX_VALUE)) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED, 202, Short.MAX_VALUE) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addContainerGap()) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/58/c008f381e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/58/c008f381e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..253eca1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/58/c008f381e544001b1e64e5c7226e70c6 @@ -0,0 +1,18 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be made into a more complicated class. + // This is just temporary. + + private int memory[]; + + public Memory() { + memory = new int[0x10000]; + } + + public int read(int address) { + return memory[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/58/f0b57b084445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/58/f0b57b084445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f9118fb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/58/f0b57b084445001b1e64e5c7226e70c6 @@ -0,0 +1,113 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/59/200eb4400f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/59/200eb4400f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2ffbd2b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/59/200eb4400f45001b1e64e5c7226e70c6 @@ -0,0 +1,119 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/59/802263081045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/59/802263081045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..af94fc2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/59/802263081045001b1e64e5c7226e70c6 @@ -0,0 +1,119 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + ListModel model = new DefaultListModel(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/0050ae584945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/0050ae584945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..66aa605 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/0050ae584945001b1e64e5c7226e70c6 @@ -0,0 +1,112 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static final int[] INSTRUCTION_CYCLE_COUNT = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public static final int[] PREFIXED_CYCLE_COUNT = { + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public int getCycles() { + return cycles;; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += INSTRUCTION_CYCLE_COUNT[opcode & 0xF]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/b0ab948b3d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/b0ab948b3d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6b5e51a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/b0ab948b3d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + new JOptionPane(String.format("Unknown opcode: 0x%2x", opcode), JOptionPane.OK_OPTION).show(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/d0f40d500f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/d0f40d500f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c8437d5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/d0f40d500f45001b1e64e5c7226e70c6 @@ -0,0 +1,117 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/e0b693c80c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/e0b693c80c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5faf853 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/e0b693c80c45001b1e64e5c7226e70c6 @@ -0,0 +1,103 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE) + .addComponent(lblMemoryView)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5b/703e64470f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5b/703e64470f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69a7af --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5b/703e64470f45001b1e64e5c7226e70c6 @@ -0,0 +1,118 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.JTextField; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5b/80c684fb3845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5b/80c684fb3845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..94b841c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5b/80c684fb3845001b1e64e5c7226e70c6 @@ -0,0 +1,25 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.readPC()); + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5c/d09bade3e444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5c/d09bade3e444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/202b694a3d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/202b694a3d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..fd05b97 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/202b694a3d45001b1e64e5c7226e70c6 @@ -0,0 +1,31 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/e0331aa44645001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/e0331aa44645001b1e64e5c7226e70c6 new file mode 100644 index 0000000..179bc72 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/e0331aa44645001b1e64e5c7226e70c6 @@ -0,0 +1,72 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) != 0); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/108edaa53145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/108edaa53145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..fd9697a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/108edaa53145001b1e64e5c7226e70c6 @@ -0,0 +1,113 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + + int data[][] = { + {}, + }; + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 164, 315); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addContainerGap(602, Short.MAX_VALUE)) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/10e1c9f63945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/10e1c9f63945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8af182f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/10e1c9f63945001b1e64e5c7226e70c6 @@ -0,0 +1,29 @@ +package playingcoffee.core; + +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + for (int i = 0; i < data.length; i++) { + + } + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/30dfd5354945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/30dfd5354945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e606bfa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/30dfd5354945001b1e64e5c7226e70c6 @@ -0,0 +1,123 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static final int[] INSTRUCTION_CYCLE_COUNT = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public static final int[] PREFIXED_CYCLE_COUNT = { + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + } + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5e/b00d47174345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/b00d47174345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1396064 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5e/b00d47174345001b1e64e5c7226e70c6 @@ -0,0 +1,53 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/1024c4590d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/6/1024c4590d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b1241d1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/1024c4590d45001b1e64e5c7226e70c6 @@ -0,0 +1,106 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private CPU cpu; + private MMU mmu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/e036f3d53d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/6/e036f3d53d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..168f94e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/e036f3d53d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + default: + JOptionPane.showMessageDialog(null, String.format("Unknown opcode: 0x%2x", opcode)); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/e0bd197d3e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/6/e0bd197d3e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..24069bf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/e0bd197d3e45001b1e64e5c7226e70c6 @@ -0,0 +1,15 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + + + public class Op { + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/f0343f7f4945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/6/f0343f7f4945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..658c30b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/f0343f7f4945001b1e64e5c7226e70c6 @@ -0,0 +1,158 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import playingcoffee.core.Registers; + +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCarry; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + chckbxZero.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_Z)); + chckbxNegative.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_N)); + chckbxHalfCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_H)); + chckbxCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_C)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + do cpu.cycle() while (cpu.getCycles() != 0); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + chckbxZero = new JCheckBox("Zero"); + chckbxNegative = new JCheckBox("Negative"); + chckbxHalfCarry = new JCheckBox("Half Carry"); + chckbxCarry = new JCheckBox("Carry"); + + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/5000ea144245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/5000ea144245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..05115a3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/5000ea144245001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int af; + private int bc; + private int de; + private int hl; + + public int pc; + public int sp; + + public int readAF() { + return af; + } + + public int readBC() { + return bc; + } + + public int readDE() { + return de; + } + + public int readHL() { + return hl; + } + + public int readA() { + return af & 0xff; + } + + public void writeA(int a) { + this.af = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/60c614580d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/60c614580d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/80e90f464545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/80e90f464545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..cb2eb2d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/80e90f464545001b1e64e5c7226e70c6 @@ -0,0 +1,135 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + JLabel lblFlags = new JLabel("Flags:"); + + JCheckBox chckbxZero = new JCheckBox("Zero"); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGap(11) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 94, Short.MAX_VALUE) + .addComponent(btnReset)) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addGap(108)) + .addComponent(lblFlags)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblFlags)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addComponent(chckbxZero)) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/f07af7bf4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/f07af7bf4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..63e1bab --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/f07af7bf4145001b1e64e5c7226e70c6 @@ -0,0 +1,46 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/61/50f644281545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/61/50f644281545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..af6230d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/61/50f644281545001b1e64e5c7226e70c6 @@ -0,0 +1,125 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/61/80f9e6a03f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/61/80f9e6a03f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d1c172b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/61/80f9e6a03f45001b1e64e5c7226e70c6 @@ -0,0 +1,37 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int operand; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + operand = (mmu.read(registers.pc++) << 8) | mmu.read(registers.pc); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/62/70d9dd9fe844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/62/70d9dd9fe844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f2f06f7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/62/70d9dd9fe844001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core; + +public class CPU { + + private final Memory memory; + + + + public CPU(Memory memory) { + this.memory = memory; + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/63/0072a7dee444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/63/0072a7dee444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..baf32aa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/63/0072a7dee444001b1e64e5c7226e70c6 @@ -0,0 +1,9 @@ +package playingcoffee.core; + +public class Gameboy { + + public Gameboy() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/63/503289d40b45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/63/503289d40b45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..bd91524 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/63/503289d40b45001b1e64e5c7226e70c6 @@ -0,0 +1,19 @@ +package playingcoffee.core; + +import playingcoffee.core.cpu.CPU; + +public class Gameboy { + + private CPU cpu; + private Memory memory; + + public Gameboy() { + memory = new Memory(); + cpu = new CPU(memory); + + while (true) { + cpu.clock(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/204b56fe3a45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/204b56fe3a45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8bfe732 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/204b56fe3a45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data; + try { + data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + for (int i = 0; i < data.length; i++) { + ram[i] = Byte.toUnsignedInt(data[i]); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + + public void dissasemble() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/30c047c50c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/30c047c50c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c962253 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/30c047c50c45001b1e64e5c7226e70c6 @@ -0,0 +1,100 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE) + .addComponent(lblMemoryView)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/6042a1684945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/6042a1684945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b4606ca --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/6042a1684945001b1e64e5c7226e70c6 @@ -0,0 +1,158 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import playingcoffee.core.Registers; + +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCarry; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + chckbxZero.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_Z)); + chckbxNegative.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_N)); + chckbxHalfCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_H)); + chckbxCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_C)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + chckbxZero = new JCheckBox("Zero"); + chckbxNegative = new JCheckBox("Negative"); + chckbxHalfCarry = new JCheckBox("Half Carry"); + chckbxCarry = new JCheckBox("Carry"); + + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/b053cee11445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/b053cee11445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..58b1086 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/b053cee11445001b1e64e5c7226e70c6 @@ -0,0 +1,127 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/64/e06341e13e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/64/e06341e13e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2751730 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/64/e06341e13e45001b1e64e5c7226e70c6 @@ -0,0 +1,25 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16 { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/65/1095d6a74545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/65/1095d6a74545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..117341b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/65/1095d6a74545001b1e64e5c7226e70c6 @@ -0,0 +1,153 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCaryy; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + JCheckBox chckbxZero = new JCheckBox("Zero"); + + JCheckBox chckbxNegative = new JCheckBox("Negative"); + + JCheckBox chckbxHalfCarry = new JCheckBox("Half Carry"); + + JCheckBox chckbxCarry = new JCheckBox("Carry"); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/65/301767fe3e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/65/301767fe3e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7832653 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/65/301767fe3e45001b1e64e5c7226e70c6 @@ -0,0 +1,32 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + int stored; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/65/7030ddd4e444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/65/7030ddd4e444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/65/70e7e6abe844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/65/70e7e6abe844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5cf2189 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/65/70e7e6abe844001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core; + +import playingcoffee.core.Memory; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/66/006f88d40b45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/66/006f88d40b45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1b02258 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/66/006f88d40b45001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be made into a more complicated class. + // This is just temporary. + + private int memory[]; + + public Memory() { + memory = new int[0x10000]; + } + + public int read(int address) { + return memory[address]; + } + + public void write(int value, int address) { + memory[address] = value; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/66/f09f05baf144001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/66/f09f05baf144001b1e64e5c7226e70c6 new file mode 100644 index 0000000..bd1d114 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/66/f09f05baf144001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core.cpu; + +public interface MicroOp { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/67/e002c1523b45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/67/e002c1523b45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d44f0fd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/67/e002c1523b45001b1e64e5c7226e70c6 @@ -0,0 +1,24 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.println("Fetched opcode: 0x" + Integer.toHexString(opcode)); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/68/f0d685d40b45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/68/f0d685d40b45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a67d994 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/68/f0d685d40b45001b1e64e5c7226e70c6 @@ -0,0 +1,12 @@ +package playingcoffee.core.cpu.microop; + +public abstract class MicroOp { + + private int cycles; + + public int getLength() { + return cycles; + } + + public abstract void execute(); +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/69/c0bb793f4345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/69/c0bb793f4345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3554c81 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/69/c0bb793f4345001b1e64e5c7226e70c6 @@ -0,0 +1,59 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + default: + + } + } + + public void decodePrefixedOpcode(int opcode) { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6a/00f98e5b0d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/00f98e5b0d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5842541 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/00f98e5b0d45001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.coer; + +public class CPU { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6a/70d72c97e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/70d72c97e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..edce72a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6a/70d72c97e544001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be made into a more complicated class. + // This is just temporary. + + private int memory[]; + + public Memory() { + memory = new int[0x10000]; + } + + public int read(int address) { + return memory[address]; + } + + public void write(int value, int address) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6d/20745b4c0f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/20745b4c0f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5b554dd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6d/20745b4c0f45001b1e64e5c7226e70c6 @@ -0,0 +1,119 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.JTextField; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/6060ff434245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/6060ff434245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..49b5ebd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/6060ff434245001b1e64e5c7226e70c6 @@ -0,0 +1,97 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int value) { + + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/70/d0de6d5b4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/70/d0de6d5b4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a2bbffe --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/70/d0de6d5b4145001b1e64e5c7226e70c6 @@ -0,0 +1,39 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/503191dbe444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/71/503191dbe444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3768269 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/503191dbe444001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class Gameboy { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/6030cd03f444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/71/6030cd03f444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7f1017f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/6030cd03f444001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core.cpu; + +public abstract class MicroOp { + + private int cycles; + + public int getLength() { + return cycles; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/90c461c03845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/71/90c461c03845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..94b841c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/90c461c03845001b1e64e5c7226e70c6 @@ -0,0 +1,25 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.readPC()); + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/71/f01572a83e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/71/f01572a83e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d9bfd73 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/71/f01572a83e45001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/72/f02fc1ae3d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/72/f02fc1ae3d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..71839d1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/72/f02fc1ae3d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + JOptionPane.showConfirmDialog(nullString.format("Unknown opcode: 0x%2x", opcode), JOptionPane.OK_OPTION); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/301cdccd4045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/73/301cdccd4045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c4790c5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/301cdccd4045001b1e64e5c7226e70c6 @@ -0,0 +1,33 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/3022c5620d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/73/3022c5620d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ac2d6ec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/3022c5620d45001b1e64e5c7226e70c6 @@ -0,0 +1,109 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private CPU cpu; + private MMU mmu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/74/a06ef3fd0e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/74/a06ef3fd0e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..daeadc0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/74/a06ef3fd0e45001b1e64e5c7226e70c6 @@ -0,0 +1,94 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readA() { + return a; + } + + public void writeA(int a) { + verify(a); + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/003af70d4845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/75/003af70d4845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7b672ed --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/003af70d4845001b1e64e5c7226e70c6 @@ -0,0 +1,90 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/407a09603145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/75/407a09603145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6f6b64c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/407a09603145001b1e64e5c7226e70c6 @@ -0,0 +1,131 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + + int data[][] = { + {}, + }; + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/60bc74393f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/75/60bc74393f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6a58113 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/60bc74393f45001b1e64e5c7226e70c6 @@ -0,0 +1,36 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(this); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Opcode opcode) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/b01195973e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/75/b01195973e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..30c2f80 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/b01195973e45001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute() { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/75/c0c24c2e4345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/75/c0c24c2e4345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4539d71 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/75/c0c24c2e4345001b1e64e5c7226e70c6 @@ -0,0 +1,56 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + } + } + + public void decodePrefixedOpcode(int opcode) { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/78/709a09684245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/78/709a09684245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2cdb865 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/78/709a09684245001b1e64e5c7226e70c6 @@ -0,0 +1,50 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + + System.out.println(registers.readA()); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/78/e0e9c8f24745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/78/e0e9c8f24745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..20526be --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/78/e0e9c8f24745001b1e64e5c7226e70c6 @@ -0,0 +1,88 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/0057b6e0f344001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/0057b6e0f344001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/40ff6d504845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/40ff6d504845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b2842da --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/40ff6d504845001b1e64e5c7226e70c6 @@ -0,0 +1,94 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7a/9054c43a4445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/9054c43a4445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d055025 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7a/9054c43a4445001b1e64e5c7226e70c6 @@ -0,0 +1,120 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public static final int FLAG_Z = 1 << 7; + public static final int FLAG_N = 1 << 6; + + public void setFlag(int flag, boolean value) { + + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c044dd100d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c044dd100d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3e662a6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7b/c044dd100d45001b1e64e5c7226e70c6 @@ -0,0 +1,111 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 384, GroupLayout.PREFERRED_SIZE) + .addGroup(groupLayout.createSequentialGroup() + .addGap(2) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7c/3077574b4745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/3077574b4745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..87faaac --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/3077574b4745001b1e64e5c7226e70c6 @@ -0,0 +1,74 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7c/b053cae80c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/b053cae80c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ad94936 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/b053cae80c45001b1e64e5c7226e70c6 @@ -0,0 +1,109 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE) + .addComponent(lblMemoryView)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7c/c0b07a3c3c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/c0b07a3c3c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..29f5dd6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7c/c0b07a3c3c45001b1e64e5c7226e70c6 @@ -0,0 +1,90 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + public int readBC() { + return b << 8 | c; + } + public int readDE() { + return d << 8 | e; + } + public int readHL() { + return h << 8 | l; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/20b3dc600d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/20b3dc600d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/30bd8e0de544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/30bd8e0de544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ae137af --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/30bd8e0de544001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU m_CPU; + + public Gameboy() { + m_CPU = new CPU(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7d/90a9a46c4645001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/90a9a46c4645001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1c7e185 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7d/90a9a46c4645001b1e64e5c7226e70c6 @@ -0,0 +1,70 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/20be77e33945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/20be77e33945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..0974908 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/20be77e33945001b1e64e5c7226e70c6 @@ -0,0 +1,23 @@ +package playingcoffee.core; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/60fe3a204145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/60fe3a204145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9d24411 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/60fe3a204145001b1e64e5c7226e70c6 @@ -0,0 +1,33 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + case 0xAF: + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/a0a4511d4245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/a0a4511d4245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f4a967b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/a0a4511d4245001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int af; + private int bc; + private int de; + private int hl; + + public int pc; + public int sp; + + public int readAF() { + return af; + } + + public int readBC() { + return bc; + } + + public int readDE() { + return de; + } + + public int readHL() { + return hl; + } + + public int readA() { + return af & 0xff; + } + + public void writeA(int a) { + this.af = a & 0xff; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7e/c0b6ad513e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/c0b6ad513e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d52ae74 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7e/c0b6ad513e45001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class Op { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7f/10b5d2db0e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/10b5d2db0e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..333577c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/10b5d2db0e45001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7f/706c58b40c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/706c58b40c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d087b06 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/706c58b40c45001b1e64e5c7226e70c6 @@ -0,0 +1,100 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE) + .addComponent(lblMemoryView)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/7f/b0a5f8303f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/b0a5f8303f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8b1b9f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/7f/b0a5f8303f45001b1e64e5c7226e70c6 @@ -0,0 +1,36 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/80/60a831f0f344001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/80/60a831f0f344001b1e64e5c7226e70c6 new file mode 100644 index 0000000..438aca8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/80/60a831f0f344001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core.cpu; + +public abstract class MicroOp { + + private int length; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/80/909e38ba3845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/80/909e38ba3845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..94b841c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/80/909e38ba3845001b1e64e5c7226e70c6 @@ -0,0 +1,25 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.readPC()); + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/80/90ebdcae0c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/80/90ebdcae0c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..29cd925 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/80/90ebdcae0c45001b1e64e5c7226e70c6 @@ -0,0 +1,100 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE) + .addComponent(lblMemoryView)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/81/a0e885bb4445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/81/a0e885bb4445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a83d292 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/81/a0e885bb4445001b1e64e5c7226e70c6 @@ -0,0 +1,67 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/82/f0ad31e94145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/82/f0ad31e94145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e812674 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/82/f0ad31e94145001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/84/2011506d0c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/84/2011506d0c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a22e1ba --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/84/2011506d0c45001b1e64e5c7226e70c6 @@ -0,0 +1,92 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 450, 300); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers"); + + JList list = new JList(); + + table = new JTable(); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING, false) + .addComponent(list, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(Alignment.LEADING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters, Alignment.LEADING)) + .addGap(18) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 185, Short.MAX_VALUE) + .addComponent(table, GroupLayout.PREFERRED_SIZE, 219, GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addContainerGap()) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/84/b007e9764745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/84/b007e9764745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3058732 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/84/b007e9764745001b1e64e5c7226e70c6 @@ -0,0 +1,83 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/85/404e61f90c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/85/404e61f90c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3feb759 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/85/404e61f90c45001b1e64e5c7226e70c6 @@ -0,0 +1,111 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 384, Short.MAX_VALUE) + .addGroup(groupLayout.createSequentialGroup() + .addGap(2) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/85/80bb1e75e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/85/80bb1e75e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..281b5fd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/85/80bb1e75e544001b1e64e5c7226e70c6 @@ -0,0 +1,14 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be made into a more complicated class. + // This is just temporary. + + private int memory[]; + + public Memory() { + memory = new int[0x10000]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/86/507e80fe0c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/86/507e80fe0c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..cd91108 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/86/507e80fe0c45001b1e64e5c7226e70c6 @@ -0,0 +1,111 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 384, Short.MAX_VALUE) + .addGroup(groupLayout.createSequentialGroup() + .addGap(2) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/87/80fa0b9d4545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/87/80fa0b9d4545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..58eb0c5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/87/80fa0b9d4545001b1e64e5c7226e70c6 @@ -0,0 +1,144 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + JCheckBox chckbxZero = new JCheckBox("Zero"); + + JCheckBox chckbxNegative = new JCheckBox("Negative"); + + JCheckBox chckbxHalfCarry = new JCheckBox("Half Carry"); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 74, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addGap(30) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry)) + .addGap(49)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addGap(33) + .addComponent(chckbxHalfCarry))) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + .addGroup(Alignment.LEADING, groupLayout.createSequentialGroup() + .addGap(58) + .addComponent(chckbxNegative) + .addContainerGap(230, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/87/b0da170d4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/87/b0da170d4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9cd9b69 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/87/b0da170d4145001b1e64e5c7226e70c6 @@ -0,0 +1,32 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + registers.sp = (mmu.read(registers.pc++) << 8) | mmu.read(registers.pc++); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/88/206d91fd3d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/88/206d91fd3d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6af29fd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/88/206d91fd3d45001b1e64e5c7226e70c6 @@ -0,0 +1,34 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/89/e07b934ee544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/89/e07b934ee544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..54d4a69 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/89/e07b934ee544001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core; + +public class Memory { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8a/201fd4d04345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/201fd4d04345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6c25acc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/201fd4d04345001b1e64e5c7226e70c6 @@ -0,0 +1,67 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8a/a07328943e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/a07328943e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2a28bb4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8a/a07328943e45001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute() { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8b/30273b684145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/30273b684145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6a0ee17 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8b/30273b684145001b1e64e5c7226e70c6 @@ -0,0 +1,44 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: + registers.writeH(mmu.read(registers.pc++)); + registers.writeL(mmu.read(registers.pc++)); + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8c/a0051df64145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/a0051df64145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e5e2554 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8c/a0051df64145001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int af; + private int bc; + private int de; + private int hl; + + public int pc; + public int sp; + + public int readAF() { + return af; + } + + public int readBC() { + return bc; + } + + public int readDE() { + return de; + } + + public int readHL() { + return hl; + } + + public int readA() { + return af; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8f/d061b3dcf244001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/8f/d061b3dcf244001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9/e0483b2ae544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9/e0483b2ae544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..33fa9ff --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9/e0483b2ae544001b1e64e5c7226e70c6 @@ -0,0 +1,12 @@ +package playingcoffee.core; + +public class CPU { + + public void clock() { + // TODO Auto-generated method stub + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9/f0e804224145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9/f0e804224145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d23c019 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9/f0e804224145001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + case 0xAF: + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/90/b06ff7fc4045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/90/b06ff7fc4045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6da729f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/90/b06ff7fc4045001b1e64e5c7226e70c6 @@ -0,0 +1,32 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + registers.sp = mmu.read(registers.pc++) << 8 | mmu.read(registers.pc++); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/91/d019602be544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/91/d019602be544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d9814f6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/91/d019602be544001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class CPU { + + public void clock() { + + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/92/303f6d16e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/92/303f6d16e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2be62ed --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/92/303f6d16e544001b1e64e5c7226e70c6 @@ -0,0 +1,15 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU m_CPU; + + public Gameboy() { + m_CPU = new CPU(); + + while (true) { + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/92/70e56118f444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/92/70e56118f444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..558431e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/92/70e56118f444001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core.cpu; + +public class Opcode { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/92/f0159e3b4845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/92/f0159e3b4845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..66ab5c7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/92/f0159e3b4845001b1e64e5c7226e70c6 @@ -0,0 +1,91 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/93/30fe1ca64545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/93/30fe1ca64545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..aa84d90 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/93/30fe1ca64545001b1e64e5c7226e70c6 @@ -0,0 +1,150 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + JCheckBox chckbxZero = new JCheckBox("Zero"); + + JCheckBox chckbxNegative = new JCheckBox("Negative"); + + JCheckBox chckbxHalfCarry = new JCheckBox("Half Carry"); + + JCheckBox chckbxCarry = new JCheckBox("Carry"); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/93/f0f4463a4945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/93/f0f4463a4945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ac0009f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/93/f0f4463a4945001b1e64e5c7226e70c6 @@ -0,0 +1,108 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static final int[] INSTRUCTION_CYCLE_COUNT = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public static final int[] PREFIXED_CYCLE_COUNT = { + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/94/90b72f224345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/94/90b72f224345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5cee910 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/94/90b72f224345001b1e64e5c7226e70c6 @@ -0,0 +1,52 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/95/801e07174345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/95/801e07174345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8de9cd4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/95/801e07174345001b1e64e5c7226e70c6 @@ -0,0 +1,53 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/96/102bfb670c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/96/102bfb670c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..749e5b0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/96/102bfb670c45001b1e64e5c7226e70c6 @@ -0,0 +1,92 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 450, 300); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers"); + + JList list = new JList(); + + table = new JTable(); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING, false) + .addComponent(list, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(Alignment.LEADING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters, Alignment.LEADING)) + .addGap(18) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 185, Short.MAX_VALUE) + .addComponent(table, GroupLayout.PREFERRED_SIZE, 185, GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addContainerGap()) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/97/501accf8e444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/97/501accf8e444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b046e02 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/97/501accf8e444001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class CPU { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/97/a092bd110d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/97/a092bd110d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..0386efa --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/97/a092bd110d45001b1e64e5c7226e70c6 @@ -0,0 +1,109 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/97/b00eb453e944001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/97/b00eb453e944001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d8525ff --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/97/b00eb453e944001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.Memory; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/98/e0bc544d3e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/98/e0bc544d3e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/99/806a373d0f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/99/806a373d0f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b046e02 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/99/806a373d0f45001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class CPU { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9a/a0c45a3d4945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/a0c45a3d4945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..516c72e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/a0c45a3d4945001b1e64e5c7226e70c6 @@ -0,0 +1,108 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static final int[] INSTRUCTION_CYCLE_COUNT = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public static final int[] PREFIXED_CYCLE_COUNT = { + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += INSTRUCTION_CYCLE_COUNT[opcode & 0x10]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9a/b07335384145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/b07335384145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f494556 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9a/b07335384145001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9b/10bfbd3f4245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/10bfbd3f4245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e812674 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9b/10bfbd3f4245001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9c/8000ca000a45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/8000ca000a45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d52d90e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9c/8000ca000a45001b1e64e5c7226e70c6 @@ -0,0 +1,13 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + MicroOp microOps[]; + + public Opcode(MicroOp... ops) { + microOps = ops; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9d/8092d5123245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/8092d5123245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..22d6872 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/8092d5123245001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9d/a0f8c9c54545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/a0f8c9c54545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e72d798 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9d/a0f8c9c54545001b1e64e5c7226e70c6 @@ -0,0 +1,125 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public static final int FLAG_Z = 1 << 7; + public static final int FLAG_N = 1 << 6; + public static final int FLAG_H = 1 << 5; + public static final int FLAG_C = 1 << 4; + + public void setFlag(int flag, boolean value) { + if (value) + f |= flag; + else + f &= ~flag; + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9e/40785f583f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/40785f583f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f4324db --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9e/40785f583f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(this); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Opcode opcode) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9f/a0c8dbe5f344001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/a0c8dbe5f344001b1e64e5c7226e70c6 new file mode 100644 index 0000000..53c162d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/a0c8dbe5f344001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core.cpu; + +public class MicroOp { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a/70d2e6114245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a/70d2e6114245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..08aca69 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a/70d2e6114245001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int af; + private int bc; + private int de; + private int hl; + + public int pc; + public int sp; + + public int readAF() { + return af; + } + + public int readBC() { + return bc; + } + + public int readDE() { + return de; + } + + public int readHL() { + return hl; + } + + public int readA() { + return af & 0xff; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a/b0ad2ed64745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a/b0ad2ed64745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..46710c4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a/b0ad2ed64745001b1e64e5c7226e70c6 @@ -0,0 +1,87 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a/d082c2d94745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a/d082c2d94745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..085d50d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a/d082c2d94745001b1e64e5c7226e70c6 @@ -0,0 +1,87 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4,4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/005e80054945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/005e80054945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3dc5ce7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/005e80054945001b1e64e5c7226e70c6 @@ -0,0 +1,102 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/6088e8e0e444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/6088e8e0e444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..53c34f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/6088e8e0e444001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU cpu; + + public Gameboy() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/b03b6bf94045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/b03b6bf94045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..030ebbd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/b03b6bf94045001b1e64e5c7226e70c6 @@ -0,0 +1,32 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/c06b4d353d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/c06b4d353d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..cd18e61 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/c06b4d353d45001b1e64e5c7226e70c6 @@ -0,0 +1,26 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a1/1066c12e0d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/1066c12e0d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5092c55 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/1066c12e0d45001b1e64e5c7226e70c6 @@ -0,0 +1,103 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a1/a06d4abb4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/a06d4abb4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9edb300 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/a06d4abb4145001b1e64e5c7226e70c6 @@ -0,0 +1,46 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a1/c035ff43f444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/c035ff43f444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..bedb91f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a1/c035ff43f444001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core.cpu; + +import java.util.ArrayList; +import java.util.List; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + List microOps; + + public Opcode(MicroOp... ops) { + microOps = new ArrayList(); + microOps.add(ops), + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a3/60014e0c4945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a3/60014e0c4945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d07b21c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a3/60014e0c4945001b1e64e5c7226e70c6 @@ -0,0 +1,104 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += instructionCycle[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += instructionCycle[opcode]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a3/f077863c3945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a3/f077863c3945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a6083ec --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a3/f077863c3945001b1e64e5c7226e70c6 @@ -0,0 +1,106 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + private int sp; + + public int readAF() { + return a << 8 | f; + } + public int readBC() { + return b << 8 | c; + } + public int readDE() { + return d << 8 | e; + } + public int readHL() { + return h << 8 | l; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a7/e0fd90983e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/e0fd90983e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..af3fc6c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a7/e0fd90983e45001b1e64e5c7226e70c6 @@ -0,0 +1,20 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute() { + for (Op op : ops) + op.execute(); + } + + public interface Op { + public void execute(); + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a8/308d2caf4345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/308d2caf4345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8a07804 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/308d2caf4345001b1e64e5c7226e70c6 @@ -0,0 +1,60 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a8/808ecf1ef444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/808ecf1ef444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2330a1c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a8/808ecf1ef444001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + public Opcode(MicroOp ops) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a9/60c031bc4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/60c031bc4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1cb94d0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/60c031bc4145001b1e64e5c7226e70c6 @@ -0,0 +1,46 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d17 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c02b34b13d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c02b34b13d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..acaad0b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/aa/c02b34b13d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + JOptionPane.showConfirmDialog(null, String.format("Unknown opcode: 0x%2x", opcode), JOptionPane.OK_OPTION); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/aa/d01dcc2ef444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/aa/d01dcc2ef444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d882961 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/aa/d01dcc2ef444001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + public Opcode(MicroOp... ops) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ac/40be662df044001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ac/40be662df044001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6461cdd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ac/40be662df044001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core.cpu; + +public class MicroOp { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ac/60f7e8073a45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ac/60f7e8073a45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5ec02f1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ac/60f7e8073a45001b1e64e5c7226e70c6 @@ -0,0 +1,36 @@ +package playingcoffee.core; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data; + try { + data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + for (int i = 0; i < data.length; i++) { + ram[i] = Byte.toUnsignedInt(data[i]); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/30a5abc04045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/30a5abc04045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..40589f0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/30a5abc04045001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/606d9df1f344001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/606d9df1f344001b1e64e5c7226e70c6 new file mode 100644 index 0000000..da8ec9a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/606d9df1f344001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core.cpu; + +public abstract class MicroOp { + + private int length; + + public int getLength() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/c03a275fe844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/c03a275fe844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ddf34ce --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/c03a275fe844001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU cpu; + private Memory memory; + + public Gameboy() { + cpu = new CPU(memory); + + while (true) { + cpu.clock(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/00fd99cf3945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/00fd99cf3945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5744a3c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/00fd99cf3945001b1e64e5c7226e70c6 @@ -0,0 +1,19 @@ +package playingcoffee.core; + +public class MMU { + + private int ram[]; + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/90cd2b824945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/90cd2b824945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..87c78bd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/90cd2b824945001b1e64e5c7226e70c6 @@ -0,0 +1,158 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import playingcoffee.core.Registers; + +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCarry; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + chckbxZero.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_Z)); + chckbxNegative.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_N)); + chckbxHalfCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_H)); + chckbxCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_C)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + do { cpu.cycle() } while (cpu.getCycles() != 0); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + chckbxZero = new JCheckBox("Zero"); + chckbxNegative = new JCheckBox("Negative"); + chckbxHalfCarry = new JCheckBox("Half Carry"); + chckbxCarry = new JCheckBox("Carry"); + + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ae/e04a93b31045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/e04a93b31045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a70f519 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ae/e04a93b31045001b1e64e5c7226e70c6 @@ -0,0 +1,123 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/af/80c1f5ed4845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/af/80c1f5ed4845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e94cee6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/af/80c1f5ed4845001b1e64e5c7226e70c6 @@ -0,0 +1,101 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/10551d0cf444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/10551d0cf444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..228a1ba --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/10551d0cf444001b1e64e5c7226e70c6 @@ -0,0 +1,12 @@ +package playingcoffee.core.cpu; + +public abstract class MicroOp { + + private int cycles; + + public int getLength() { + return cycles; + } + + public abstract void execute(); +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/90f3aa0f3f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/90f3aa0f3f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d8c54cd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/90f3aa0f3f45001b1e64e5c7226e70c6 @@ -0,0 +1,32 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Register registers; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Registers regs, MMU mmu) { + + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a04426783145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a04426783145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..59ddb68 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b0/a04426783145001b1e64e5c7226e70c6 @@ -0,0 +1,130 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + + int data[][] = { + {}, + }; + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b1/10e65b234445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b1/10e65b234445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..514b6a4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b1/10e65b234445001b1e64e5c7226e70c6 @@ -0,0 +1,117 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public void setFlag(int flag, boolean value) { + + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b1/801a3b09e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b1/801a3b09e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..991139e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b1/801a3b09e544001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU m_CPU; + + public Gameboy() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/8088f2743f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/8088f2743f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1c3ada0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/8088f2743f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(this); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + stored = 5; + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/a0f1e93d0f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/a0f1e93d0f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6f1b2bf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/a0f1e93d0f45001b1e64e5c7226e70c6 @@ -0,0 +1,13 @@ +package playingcoffee.core; + +public class CPU { + + private Registers registers; + + public Registers getRegisters() { + return registers; + } + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b3/d04733ae3d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/d04733ae3d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..22e57e2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b3/d04733ae3d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + new JOptionPane(String.format("Unknown opcode: 0x%2x", opcode), JOptionPane.OK_OPTION); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b4/d053baa63e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/d053baa63e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7ec570f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/d053baa63e45001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute() { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b4/e087e5abe844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/e087e5abe844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8d2f0f3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/e087e5abe844001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU cpu; + private Memory memory; + + public Gameboy() { + memory = new Memory(); + cpu = new CPU(memory); + + while (true) { + cpu.clock(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b5/0016350fec44001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/0016350fec44001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4e9cbe8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/0016350fec44001b1e64e5c7226e70c6 @@ -0,0 +1,20 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.Memory; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void registerOpcodes() { + // Example: instructions[0x01] = new OpcodeBuilder().read(OpcodeArgument.C, OpcodeArgument.PC_INC).read(OpcodeArgument.B, OpcodeArgument.PC_INC); + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b5/20f16fe14245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/20f16fe14245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f7a0e65 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b5/20f16fe14245001b1e64e5c7226e70c6 @@ -0,0 +1,98 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b7/204d16e8e444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b7/204d16e8e444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6182a4c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b7/204d16e8e444001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class CPU { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b8/6090885b0d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b8/6090885b0d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b8f2fa9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b8/6090885b0d45001b1e64e5c7226e70c6 @@ -0,0 +1,109 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.coer.CPU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private CPU cpu; + private MMU mmu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b9/5029a97a0d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/5029a97a0d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b9/50de470c3245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/50de470c3245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..803641a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b9/50de470c3245001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core; + +public class CPU { + + private Registers registers; + + private final MMU mmu; + + public CPU() { + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bc/30dcbf764445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/30dcbf764445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..41c539f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bc/30dcbf764445001b1e64e5c7226e70c6 @@ -0,0 +1,122 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public static final int FLAG_Z = 1 << 7; + public static final int FLAG_N = 1 << 6; + public static final int FLAG_H = 1 << 5; + public static final int FLAG_C = 1 << 4; + + public void setFlag(int flag, boolean value) { + + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bd/20b2eba64045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/20b2eba64045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5660023 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/20b2eba64045001b1e64e5c7226e70c6 @@ -0,0 +1,33 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bd/70386a371545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/70386a371545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7c6ee99 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/70386a371545001b1e64e5c7226e70c6 @@ -0,0 +1,131 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + + int data[][] = { + {} + }; + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bd/801627634845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/801627634845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8d42a8b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bd/801627634845001b1e64e5c7226e70c6 @@ -0,0 +1,98 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/be/001cfc29f044001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/be/001cfc29f044001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ff7238d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/be/001cfc29f044001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core.cpu; + +public class MicroOps { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/be/300fca740e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/be/300fca740e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1200dae --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/be/300fca740e45001b1e64e5c7226e70c6 @@ -0,0 +1,10 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/bf/600bdbed3945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/600bdbed3945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..28f536b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/bf/600bdbed3945001b1e64e5c7226e70c6 @@ -0,0 +1,27 @@ +package playingcoffee.core; + +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c/708685b14545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c/708685b14545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7dceb61 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c/708685b14545001b1e64e5c7226e70c6 @@ -0,0 +1,153 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCarry; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + JCheckBox chckbxZero = new JCheckBox("Zero"); + + JCheckBox chckbxNegative = new JCheckBox("Negative"); + + JCheckBox chckbxHalfCarry = new JCheckBox("Half Carry"); + + JCheckBox chckbxCarry = new JCheckBox("Carry"); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c/b0cadc5be844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c/b0cadc5be844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..797fb58 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c/b0cadc5be844001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU cpu; + private Memory memory; + + public Gameboy() { + cpu = new CPU(); + + while (true) { + cpu.clock(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c/d0b01a2fe544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c/d0b01a2fe544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e7ef551 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c/d0b01a2fe544001b1e64e5c7226e70c6 @@ -0,0 +1,8 @@ +package playingcoffee.core; + +public class CPU { + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/10908759e844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/10908759e844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..bb49049 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/10908759e844001b1e64e5c7226e70c6 @@ -0,0 +1,15 @@ +package playingcoffee.core; + +public class Gameboy { + + private CPU cpu; + + public Gameboy() { + cpu = new CPU(); + + while (true) { + cpu.clock(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/9010db043945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/9010db043945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c62bc9b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/9010db043945001b1e64e5c7226e70c6 @@ -0,0 +1,117 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().readPC())); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().readSP())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/90df75750e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/90df75750e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1fe1896 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/90df75750e45001b1e64e5c7226e70c6 @@ -0,0 +1,13 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b06699bd4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b06699bd4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e3f55a1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b06699bd4145001b1e64e5c7226e70c6 @@ -0,0 +1,46 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b0a87e4b0f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b0a87e4b0f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8f13fe3 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c0/b0a87e4b0f45001b1e64e5c7226e70c6 @@ -0,0 +1,118 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.JTextField; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/60319a883245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/60319a883245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..eb964d0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/60319a883245001b1e64e5c7226e70c6 @@ -0,0 +1,111 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().readPC())); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().readSP())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c1/c0ef21d43145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/c0ef21d43145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2c21d05 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c1/c0ef21d43145001b1e64e5c7226e70c6 @@ -0,0 +1,113 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + + int data[][] = { + {}, + }; + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c2/80bb4eec3845001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c2/80bb4eec3845001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9a3b47d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c2/80bb4eec3845001b1e64e5c7226e70c6 @@ -0,0 +1,118 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().readPC())); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().readSP())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c3/a0e7960f4545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/a0e7960f4545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c8dcae6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c3/a0e7960f4545001b1e64e5c7226e70c6 @@ -0,0 +1,120 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c5/0043bc5d3e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c5/0043bc5d3e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9d35c6d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c5/0043bc5d3e45001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class Opcode { + + public class Op { + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c5/b0e124104345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c5/b0e124104345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6ffafd7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c5/b0e124104345001b1e64e5c7226e70c6 @@ -0,0 +1,53 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } + + public void decodeOpcode(int opcode) { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c7/b0d69d4c4345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c7/b0d69d4c4345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ae39cbd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c7/b0d69d4c4345001b1e64e5c7226e70c6 @@ -0,0 +1,59 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + default: + System.err.printf("Unknown opcode: 0x%fx\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c8/302c20930e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/302c20930e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3b513c7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/302c20930e45001b1e64e5c7226e70c6 @@ -0,0 +1,15 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c8/6019a46b0d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/6019a46b0d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c1b0072 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c8/6019a46b0d45001b1e64e5c7226e70c6 @@ -0,0 +1,113 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private CPU cpu; + private MMU mmu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/4061e8743d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/4061e8743d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..51ca76c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/4061e8743d45001b1e64e5c7226e70c6 @@ -0,0 +1,32 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ca/f0103af54745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/f0103af54745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..696c484 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ca/f0103af54745001b1e64e5c7226e70c6 @@ -0,0 +1,89 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cc/90ff635f3e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/cc/90ff635f3e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..30dbc96 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cc/90ff635f3e45001b1e64e5c7226e70c6 @@ -0,0 +1,13 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public class Op { + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/104d47c44145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/104d47c44145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4942109 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/104d47c44145001b1e64e5c7226e70c6 @@ -0,0 +1,46 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/40a8835f0c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/40a8835f0c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..3838e1f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/40a8835f0c45001b1e64e5c7226e70c6 @@ -0,0 +1,92 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 450, 300); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers"); + + JList list = new JList(); + + table = new JTable(); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING, false) + .addComponent(list, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(Alignment.LEADING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters, Alignment.LEADING)) + .addGap(18) + .addComponent(table, GroupLayout.PREFERRED_SIZE, 279, GroupLayout.PREFERRED_SIZE) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 185, Short.MAX_VALUE) + .addComponent(table, GroupLayout.PREFERRED_SIZE, 185, GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addContainerGap()) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ce/e0fd0eef4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/e0fd0eef4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..d0be4f6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ce/e0fd0eef4145001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int af; + private int bc; + private int de; + private int hl; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cf/30e27e43f444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/30e27e43f444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c3aeb5d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/30e27e43f444001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core.cpu; + +import java.util.ArrayList; +import java.util.List; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + List microOps; + + public Opcode(MicroOp... ops) { + microOps = new ArrayList(); + microOps.add(ops) + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cf/e00ba94b4245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/e00ba94b4245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5eb1587 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cf/e00ba94b4245001b1e64e5c7226e70c6 @@ -0,0 +1,97 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = af & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d0/f0a300f00c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d0/f0a300f00c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..970bc04 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d0/f0a300f00c45001b1e64e5c7226e70c6 @@ -0,0 +1,109 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 384, Short.MAX_VALUE) + .addComponent(table, GroupLayout.PREFERRED_SIZE, 382, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d1/50825b5e1445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/50825b5e1445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..12be8de --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/50825b5e1445001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core; + +public class MMU { + + private int ram[]; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d1/80fdb73a0d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/80fdb73a0d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..184b870 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/80fdb73a0d45001b1e64e5c7226e70c6 @@ -0,0 +1,103 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(list, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d1/f0ad8d67e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/f0ad8d67e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..796d283 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d1/f0ad8d67e544001b1e64e5c7226e70c6 @@ -0,0 +1,14 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be made into a more complicated class. + // This is just temporary. + + private int memory[]; + + public Memory() { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/10e135084945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/10e135084945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c42c170 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/10e135084945001b1e64e5c7226e70c6 @@ -0,0 +1,102 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += instructionCycle[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/60f0f51d4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/60f0f51d4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9eb9602 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/60f0f51d4145001b1e64e5c7226e70c6 @@ -0,0 +1,32 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d2/e056a8fd4545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/e056a8fd4545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e8d6b0f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d2/e056a8fd4545001b1e64e5c7226e70c6 @@ -0,0 +1,153 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCarry; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + chckbxZero = new JCheckBox("Zero"); + chckbxNegative = new JCheckBox("Negative"); + chckbxHalfCarry = new JCheckBox("Half Carry"); + chckbxCarry = new JCheckBox("Carry"); + + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d3/502296c33d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/502296c33d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..275e1cd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d3/502296c33d45001b1e64e5c7226e70c6 @@ -0,0 +1,35 @@ +package playingcoffee.core; + +import javax.swing.JOptionPane; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // Is subject to change. + switch (opcode) { + case 0x00: // NOP + break; + default: + JOptionPane.showInputDialog(null, String.format("Unknown opcode: 0x%2x", opcode)); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d4/009d43710d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/009d43710d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9d887ad --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/009d43710d45001b1e64e5c7226e70c6 @@ -0,0 +1,113 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d4/203ef5961045001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/203ef5961045001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4382e75 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/203ef5961045001b1e64e5c7226e70c6 @@ -0,0 +1,120 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d4/c0f61c923f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/c0f61c923f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..0c92f7f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d4/c0f61c923f45001b1e64e5c7226e70c6 @@ -0,0 +1,37 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + stored = (mmu.read(registers.pc++) << 8) | mmu.read(registers.pc); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d5/70235a664745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/70235a664745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5231f0b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d5/70235a664745001b1e64e5c7226e70c6 @@ -0,0 +1,82 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d9/30cf82ce0e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/30cf82ce0e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..2119153 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/30cf82ce0e45001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int getA() { + return a; + } + + public void setA(int a) { + this.a = a; + } + + public int getF() { + return f; + } + + public void setF(int f) { + this.f = f; + } + + public int getB() { + return b; + } + + public void setB(int b) { + this.b = b; + } + + public int getC() { + return c; + } + + public void setC(int c) { + this.c = c; + } + + public int getD() { + return d; + } + + public void setD(int d) { + this.d = d; + } + + public int getE() { + return e; + } + + public void setE(int e) { + this.e = e; + } + + public int getH() { + return h; + } + + public void setH(int h) { + this.h = h; + } + + public int getL() { + return l; + } + + public void setL(int l) { + this.l = l; + } + + public int getPC() { + return pc; + } + + public void setPC(int pc) { + this.pc = pc; + } + + public int getSP() { + return sp; + } + + public void setSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d9/7037b2970e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/7037b2970e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4d2bef2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d9/7037b2970e45001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int getA() { + return a; + } + + public void setA(int a) { + this.a = a; + } + + public int getF() { + return f; + } + + public void setF(int f) { + this.f = f; + } + + public int getB() { + return b; + } + + public void setB(int b) { + this.b = b; + } + + public int getC() { + return c; + } + + public void setC(int c) { + this.c = c; + } + + public int getD() { + return d; + } + + public void setD(int d) { + this.d = d; + } + + public int getE() { + return e; + } + + public void setE(int e) { + this.e = e; + } + + public int getH() { + return h; + } + + public void setH(int h) { + this.h = h; + } + + public int getL() { + return l; + } + + public void setL(int l) { + this.l = l; + } + + public int getPc() { + return pc; + } + + public void setPc(int pc) { + this.pc = pc; + } + + public int getSp() { + return sp; + } + + public void setSp(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/db/909d1ef44145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/db/909d1ef44145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7d31d41 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/db/909d1ef44145001b1e64e5c7226e70c6 @@ -0,0 +1,93 @@ +package playingcoffee.core; + +public class Registers { + + private int af; + private int bc; + private int de; + private int hl; + + public int pc; + public int sp; + + public int readAF() { + return af; + } + + public int readBC() { + return bc; + } + + public int readDE() { + return de; + } + + public int readHL() { + return hl; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0c721f7f344001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0c721f7f344001b1e64e5c7226e70c6 new file mode 100644 index 0000000..97e3dd6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0c721f7f344001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core.cpu; + +public abstract class MicroOp { + + private int length; + + public int getLength() { + return length; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50c10ba40c45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50c10ba40c45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..070e9ba --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/50c10ba40c45001b1e64e5c7226e70c6 @@ -0,0 +1,94 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable table; + + /** + * Launch the application. + */ + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + /** + * Create the application. + */ + public CPUDebugger() { + initialize(); + } + + /** + * Initialize the contents of the frame. + */ + private void initialize() { + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList list = new JList(); + + table = new JTable(); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING, false) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(list, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGap(18) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(list, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE) + .addComponent(table, GroupLayout.DEFAULT_SIZE, 396, Short.MAX_VALUE)) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dc/b0e8e53f0f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/b0e8e53f0f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..11e24c1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dc/b0e8e53f0f45001b1e64e5c7226e70c6 @@ -0,0 +1,10 @@ +package playingcoffee.core; + +public class CPU { + + private Registers registers; + + public Registers getRegisters() { + return registers; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dd/90dc1e0b0f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/90dc1e0b0f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..369ed2a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/90dc1e0b0f45001b1e64e5c7226e70c6 @@ -0,0 +1,109 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readA() { + return a; + } + + public void writeA(int a) { + verify(a); + + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + verify(a); + + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + verify(a); + + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + verify(a); + + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + verify(a); + + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + verify(a); + + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + verify(a); + + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + verify(a); + + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a031fb29f044001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a031fb29f044001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ff7238d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/dd/a031fb29f044001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core.cpu; + +public class MicroOps { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/de/9070a2553e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/de/9070a2553e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..eb2277d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/de/9070a2553e45001b1e64e5c7226e70c6 @@ -0,0 +1,5 @@ +package playingcoffee.core; + +public class Opcode { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e5/80a13534ed44001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e5/80a13534ed44001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e6/0041df751445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/0041df751445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..af6230d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/0041df751445001b1e64e5c7226e70c6 @@ -0,0 +1,125 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.ListModel; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e6/6015f861e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/6015f861e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..731b952 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e6/6015f861e544001b1e64e5c7226e70c6 @@ -0,0 +1,10 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be made into a more complicated class. + // This is just temporary. + + private int memory[0x10000]; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e8/80e163783f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/80e163783f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..74fc17d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e8/80e163783f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + stored = 5; + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/004ca079e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/004ca079e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..da8eb07 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/004ca079e544001b1e64e5c7226e70c6 @@ -0,0 +1,18 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be made into a more complicated class. + // This is just temporary. + + private int memory[]; + + public Memory() { + memory = new int[0x10000]; + } + + public int read(int address) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/6040fa053245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/6040fa053245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8989f52 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/6040fa053245001b1e64e5c7226e70c6 @@ -0,0 +1,111 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().readPC())); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().readSP())); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(registerList, GroupLayout.DEFAULT_SIZE, 314, Short.MAX_VALUE) + .addComponent(lblRegisters) + .addGroup(Alignment.TRAILING, groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED, 198, Short.MAX_VALUE) + .addComponent(btnReset))) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep)) + .addContainerGap()) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/6065b7bce444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/6065b7bce444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..0c68a61 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/6065b7bce444001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/60ed31043b45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/60ed31043b45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e7b98a8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/60ed31043b45001b1e64e5c7226e70c6 @@ -0,0 +1,34 @@ +package playingcoffee.core; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data; + try { + data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + for (int i = 0; i < data.length; i++) { + ram[i] = Byte.toUnsignedInt(data[i]); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/e9/b0bc380f3245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/b0bc380f3245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ec2a71f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/e9/b0bc380f3245001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU() { + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ea/10a966324945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/10a966324945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6bdc209 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/10a966324945001b1e64e5c7226e70c6 @@ -0,0 +1,108 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static final int[] INSTRUCTION_CYCLE_COUNT = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public static final int[] PREFIXED_CYCLE_COUNT = { + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + } + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ea/3022c7893e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/3022c7893e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..fd065e6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/3022c7893e45001b1e64e5c7226e70c6 @@ -0,0 +1,17 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public class Op { + + + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ea/c02820530d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/c02820530d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f274190 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/c02820530d45001b1e64e5c7226e70c6 @@ -0,0 +1,103 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/eb/e0dcc0740d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/e0dcc0740d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..6bfce6c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/eb/e0dcc0740d45001b1e64e5c7226e70c6 @@ -0,0 +1,120 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + // TODO Auto-generated method stub + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ec/30b47e403945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/30b47e403945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..9542d9e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ec/30b47e403945001b1e64e5c7226e70c6 @@ -0,0 +1,106 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + public int readBC() { + return b << 8 | c; + } + public int readDE() { + return d << 8 | e; + } + public int readHL() { + return h << 8 | l; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ed/f0f5d1554745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/f0f5d1554745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..791bf60 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ed/f0f5d1554745001b1e64e5c7226e70c6 @@ -0,0 +1,76 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/00fa52df4145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/00fa52df4145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..e724d59 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/00fa52df4145001b1e64e5c7226e70c6 @@ -0,0 +1,48 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/b04c49e43e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/b04c49e43e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..71d8cf8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/b04c49e43e45001b1e64e5c7226e70c6 @@ -0,0 +1,25 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + + public class Read16BitOperand implements { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0d7e5b94545001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0d7e5b94545001b1e64e5c7226e70c6 new file mode 100644 index 0000000..05f5f14 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ee/c0d7e5b94545001b1e64e5c7226e70c6 @@ -0,0 +1,151 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCarry; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpu.cycle(); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + chckbxZero = new JCheckBox("Zero"); + chckbxNegative = new JCheckBox("Negative"); + chckbxHalfCarry = new JCheckBox("Half Carry"); + chckbxCarry = new JCheckBox("Carry"); + + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ef/70cef7374145001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/70cef7374145001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a2cf3d0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/70cef7374145001b1e64e5c7226e70c6 @@ -0,0 +1,37 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x31: + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0xAF: + registers.writeA(registers.readA() ^ registers.readA()); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ef/e0d519550d45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/e0d519550d45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..1d08049 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ef/e0d519550d45001b1e64e5c7226e70c6 @@ -0,0 +1,105 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + JList registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(lblRegisters) + .addGap(18)) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f/402ac3d20945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f/402ac3d20945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5c03a9f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f/402ac3d20945001b1e64e5c7226e70c6 @@ -0,0 +1,16 @@ +package playingcoffee.core.cpu; + +import java.util.ArrayList; +import java.util.List; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + MicroOp microOps[]; + + public Opcode(MicroOp... ops) { + microOps = ops; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f/a0b9dd013a45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f/a0b9dd013a45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..23c4bc5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f/a0b9dd013a45001b1e64e5c7226e70c6 @@ -0,0 +1,29 @@ +package playingcoffee.core; + +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + for (int i = 0; i < data.length; i++) { + ram[i] = Byte.toUnsignedInt(data[i]); + } + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f0/809f6d8d3f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f0/809f6d8d3f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8757fc0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f0/809f6d8d3f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute() { + stored = mmu.read(registers.pc); + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f2/9063b3b54345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/9063b3b54345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ba50997 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f2/9063b3b54345001b1e64e5c7226e70c6 @@ -0,0 +1,64 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + case 0xCB: // CB - prefix + + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f3/30ed4157e544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/30ed4157e544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..69b73b0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/30ed4157e544001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be split into a more complicated class. + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f3/401480664245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/401480664245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f5c3af0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/401480664245001b1e64e5c7226e70c6 @@ -0,0 +1,48 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + // Basic CPU implementation. + // This will be changed in the future. + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f4/b0cde8483245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f4/b0cde8483245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a0f8391 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f4/b0cde8483245001b1e64e5c7226e70c6 @@ -0,0 +1,19 @@ +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f6/30d804474245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/30d804474245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..f7db952 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/30d804474245001b1e64e5c7226e70c6 @@ -0,0 +1,97 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = va + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f6/a0f4b03a3945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/a0f4b03a3945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a3f6162 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/a0f4b03a3945001b1e64e5c7226e70c6 @@ -0,0 +1,106 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + private int pc; + private int sp; + + public int readAF() { + return a << 8 | f; + } + public int readBC() { + return b << 8 | c; + } + public int readDE() { + return d << 8 | e; + } + public int readHL() { + return h << 8 | l; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + + public int readPC() { + return pc; + } + + public void writePC(int pc) { + this.pc = pc; + } + + public int readSP() { + return sp; + } + + public void writeSP(int sp) { + this.sp = sp; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f6/e02cdc661445001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/e02cdc661445001b1e64e5c7226e70c6 new file mode 100644 index 0000000..7d47399 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f6/e02cdc661445001b1e64e5c7226e70c6 @@ -0,0 +1,11 @@ +package playingcoffee.core; + +public class MMU { + + private int ram[]; + + public void write(int value, int address) { + ram[address] = value; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f7/008f94c70f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/008f94c70f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..c8437d5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f7/008f94c70f45001b1e64e5c7226e70c6 @@ -0,0 +1,117 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f8/00dd2a723f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/00dd2a723f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..5469073 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/00dd2a723f45001b1e64e5c7226e70c6 @@ -0,0 +1,38 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + private final Registers registers; + private final MMU mmu; + + private int stored; + + public Opcode(Registers registers, MMU mmu, Op... ops) { + this.registers = registers; + this.mmu = mmu; + + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(this); + } + + public interface Op { + + public void execute(Opcode opcode); + + } + + public class Read16BitOperand implements Op { + + @Override + public void execute(Opcode opcode) { + stored = 5; + } + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f8/30dbd9510f45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/30dbd9510f45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..74e1093 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/30dbd9510f45001b1e64e5c7226e70c6 @@ -0,0 +1,115 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; + +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JTable; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; + +public class CPUDebugger { + + private JFrame frame; + private JTable memoryViewTable; + private JList registerList; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frame.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(); + + updateValues(); + } + + private void updateValues() { + + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frame = new JFrame(); + frame.setBounds(100, 100, 750, 500); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + JButton btnReset = new JButton("Reset"); + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + memoryViewTable = new JTable(); + + JLabel lblMemoryView = new JLabel("Memory View:"); + GroupLayout groupLayout = new GroupLayout(frame.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(btnStep) + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(btnReset)) + .addComponent(lblRegisters) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 122, GroupLayout.PREFERRED_SIZE)) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblMemoryView) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 574, Short.MAX_VALUE)) + .addContainerGap()) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.TRAILING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(lblRegisters) + .addComponent(lblMemoryView)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addGap(8) + .addComponent(memoryViewTable, GroupLayout.DEFAULT_SIZE, 382, Short.MAX_VALUE)) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE))) + .addGap(18) + .addGroup(groupLayout.createParallelGroup(Alignment.TRAILING) + .addComponent(btnStep) + .addComponent(btnReset)) + .addGap(5)) + ); + frame.getContentPane().setLayout(groupLayout); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f8/802bf5c53e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/802bf5c53e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..a326b5e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f8/802bf5c53e45001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute(Registers regs, MMU mmu) { + for (Op op : ops) + op.execute(regs, mmu); + } + + public interface Op { + + public void execute(Registers regs, MMU mmu); + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fa/702443e43945001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/702443e43945001b1e64e5c7226e70c6 new file mode 100644 index 0000000..fbd7b2a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fa/702443e43945001b1e64e5c7226e70c6 @@ -0,0 +1,26 @@ +package playingcoffee.core; + +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b00c1ec84345001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b00c1ec84345001b1e64e5c7226e70c6 new file mode 100644 index 0000000..8b802f6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b00c1ec84345001b1e64e5c7226e70c6 @@ -0,0 +1,66 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + + public void decodeOpcode(int opcode) { + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b0bc91700e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b0bc91700e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..cbb7dd6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/b0bc91700e45001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fd/c07f1f6a0e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/c07f1f6a0e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..4f6a347 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fd/c07f1f6a0e45001b1e64e5c7226e70c6 @@ -0,0 +1,7 @@ +package playingcoffee.core; + +public class Registers { + + + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fe/206b20c64745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/fe/206b20c64745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..45c3ae8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fe/206b20c64745001b1e64e5c7226e70c6 @@ -0,0 +1,87 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fe/c009d8c54245001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/fe/c009d8c54245001b1e64e5c7226e70c6 new file mode 100644 index 0000000..db33d03 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fe/c009d8c54245001b1e64e5c7226e70c6 @@ -0,0 +1,98 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = af & 0xFF; + f = (af >> 8) & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/fe/e0cb8ca13e45001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/fe/e0cb8ca13e45001b1e64e5c7226e70c6 new file mode 100644 index 0000000..235dedf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/fe/e0cb8ca13e45001b1e64e5c7226e70c6 @@ -0,0 +1,22 @@ +package playingcoffee.core; + +public class Opcode { + + private Op[] ops; + + public Opcode(Op... ops) { + this.ops = ops; + } + + public void execute() { + for (Op op : ops) + op.execute(); + } + + public interface Op { + + public void execute(); + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/90c9469fe844001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/90c9469fe844001b1e64e5c7226e70c6 new file mode 100644 index 0000000..ecdcf62 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/90c9469fe844001b1e64e5c7226e70c6 @@ -0,0 +1,14 @@ +package playingcoffee.core; + +public class CPU { + + private final Memory memory; + + public CPU(Memory memory) { + this.memory = memory; + } + + public void clock() { + + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0050f5ce544001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0050f5ce544001b1e64e5c7226e70c6 new file mode 100644 index 0000000..b95ce0c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0050f5ce544001b1e64e5c7226e70c6 @@ -0,0 +1,8 @@ +package playingcoffee.core; + +public class Memory { + + // Note: Memory will be made into a more complicated class. + // This is just temporary. + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0e32ec94745001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0e32ec94745001b1e64e5c7226e70c6 new file mode 100644 index 0000000..46710c4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/a0e32ec94745001b1e64e5c7226e70c6 @@ -0,0 +1,87 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static int[] instructionCycle = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4 + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ff/c0756638f444001b1e64e5c7226e70c6 b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/c0756638f444001b1e64e5c7226e70c6 new file mode 100644 index 0000000..51f13c1 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ff/c0756638f444001b1e64e5c7226e70c6 @@ -0,0 +1,13 @@ +package playingcoffee.core.cpu; + +import playingcoffee.core.cpu.microop.MicroOp; + +public class Opcode { + + List microOps; + + public Opcode(MicroOp... ops) { + + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/af/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/af/history.index new file mode 100644 index 0000000..c605494 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/af/history.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/19/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/19/history.index new file mode 100644 index 0000000..c264a11 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/19/history.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/94/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/94/history.index new file mode 100644 index 0000000..b47c25c Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/94/history.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/94/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/94/properties.index new file mode 100644 index 0000000..fbf3e5e Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/94/properties.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/a8/a5/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/a8/a5/history.index new file mode 100644 index 0000000..9d4489f Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/a8/a5/history.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/a8/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/a8/history.index new file mode 100644 index 0000000..77b8314 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/a8/history.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/history.index new file mode 100644 index 0000000..3621e16 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.indexes/e4/86/9f/history.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.markers.snap new file mode 100644 index 0000000..635c098 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.markers.snap differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.syncinfo.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.syncinfo.snap new file mode 100644 index 0000000..5213c44 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.projects/playing-coffee/.syncinfo.snap differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index new file mode 100644 index 0000000..cedb844 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.root/.indexes/properties.index differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap new file mode 100644 index 0000000..fc1e660 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources new file mode 100644 index 0000000..3dd06f6 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ diff --git a/.metadata/.plugins/org.eclipse.core.resources/0.snap b/.metadata/.plugins/org.eclipse.core.resources/0.snap new file mode 100644 index 0000000..9157fe8 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.core.resources/0.snap differ diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs new file mode 100644 index 0000000..aa2411d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.debug.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.debug.core.cDebug.default_source_containers=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..dffc6b5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs new file mode 100644 index 0000000..03da32b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.core.prefs @@ -0,0 +1,4 @@ +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.applicationLaunchType=org.eclipse.cdt.dsf.gdb.launch.localCLaunch,debug,;org.eclipse.cdt.cdi.launch.localCLaunch,run,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.attachLaunchType=org.eclipse.cdt.dsf.gdb.launch.attachCLaunch,debug,; +//org.eclipse.debug.core.PREFERRED_DELEGATES/org.eclipse.cdt.launch.postmortemLaunchType=org.eclipse.cdt.dsf.gdb.launch.coreCLaunch,debug,; +eclipse.preferences.version=1 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs new file mode 100644 index 0000000..9dd00d6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.debug.ui.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=\r\n\r\n +preferredTargets=default\:default| diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.e4.ui.css.swt.theme.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.e4.ui.css.swt.theme.prefs new file mode 100644 index 0000000..ef52540 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.e4.ui.css.swt.theme.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +themeid=org.eclipse.e4.ui.css.theme.e4_classic diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.e4.ui.workbench.renderers.swt.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.e4.ui.workbench.renderers.swt.prefs new file mode 100644 index 0000000..1cea19f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.e4.ui.workbench.renderers.swt.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +enableMRU=true +themeEnabled=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..c24a64f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.codeComplete.visibilityCheck=enabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.junit.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.junit.prefs new file mode 100644 index 0000000..31df02c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.junit.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.junit.content_assist_favorite_static_members_migrated=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs new file mode 100644 index 0000000..7476fa2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.launching.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.launching.PREF_VM_XML=\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000..46f23cd --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,9 @@ +content_assist_number_of_computers=19 +content_assist_proposals_background=255,255,255 +content_assist_proposals_foreground=0,0,0 +eclipse.preferences.version=1 +org.eclipse.jdt.ui.formatterprofiles.version=17 +spelling_locale=en_GB +spelling_locale_initialized=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jsch.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jsch.core.prefs new file mode 100644 index 0000000..d56c53f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jsch.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jsch.core.hasChangedDefaultWin32SshHome=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs new file mode 100644 index 0000000..d3bb789 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.launchbar.core.prefs @@ -0,0 +1,7 @@ +LaunchTargetManager/org.eclipse.launchbar.core.launchTargetType.local,Local/arch=x86_64 +LaunchTargetManager/org.eclipse.launchbar.core.launchTargetType.local,Local/name=Local +LaunchTargetManager/org.eclipse.launchbar.core.launchTargetType.local,Local/os=win32 +configDescList=org.eclipse.launchbar.core.descriptorType.default\:CPUDebugger +eclipse.preferences.version=1 +org.eclipse.launchbar.core.descriptorType.default\:CPUDebugger/activeLaunchMode=run +org.eclipse.launchbar.core.descriptorType.default\:CPUDebugger/activeLaunchTarget=org.eclipse.launchbar.core.launchTargetType.local\:Local diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs new file mode 100644 index 0000000..43e97e4 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +mylyn.attention.migrated=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs new file mode 100644 index 0000000..8d462a6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.mylyn.monitor.activity.tracking.enabled.checked=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs new file mode 100644 index 0000000..484e028 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.mylyn.tasks.ui.filters.nonmatching=true +org.eclipse.mylyn.tasks.ui.filters.nonmatching.encouraged=true +org.eclipse.mylyn.tasks.ui.welcome.message=true diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.pde.api.tools.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.pde.api.tools.prefs new file mode 100644 index 0000000..d2ed603 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.pde.api.tools.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +knownEEFragments= diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs new file mode 100644 index 0000000..08076f2 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +showIntro=false diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs new file mode 100644 index 0000000..6257a17 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs @@ -0,0 +1,4 @@ +PLUGINS_NOT_ACTIVATED_ON_STARTUP=;org.eclipse.m2e.discovery; +eclipse.preferences.version=1 +editors=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n +resourcetypes=\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n diff --git a/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.jsdt.ui.prefs b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.jsdt.ui.prefs new file mode 100644 index 0000000..8a77ab0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.jsdt.ui.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +fontPropagated=true +org.eclipse.jface.textfont=1|Consolas|10.0|0|WINDOWS|1|0|0|0|0|0|0|0|0|1|0|0|0|0|Consolas; +org.eclipse.wst.jsdt.ui.editor.tab.width= +org.eclipse.wst.jsdt.ui.formatterprofiles.version=11 +org.eclipse.wst.jsdt.ui.javadoclocations.migrated=true +tabWidthPropagated=true +useAnnotationsPrefPage=true +useQuickDiffPrefPage=true diff --git a/.metadata/.plugins/org.eclipse.debug.core/.launches/CPUDebugger.launch b/.metadata/.plugins/org.eclipse.debug.core/.launches/CPUDebugger.launch new file mode 100644 index 0000000..435b9b0 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.core/.launches/CPUDebugger.launch @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml b/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml new file mode 100644 index 0000000..e8204ad --- /dev/null +++ b/.metadata/.plugins/org.eclipse.debug.ui/launchConfigurationHistory.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi new file mode 100644 index 0000000..fd212ff --- /dev/null +++ b/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi @@ -0,0 +1,3772 @@ + + + + activeSchemeId:org.eclipse.ui.defaultAcceleratorConfiguration + ModelMigrationProcessor.001 + + + + + topLevel + + + + + persp.actionSet:org.eclipse.mylyn.doc.actionSet + persp.actionSet:org.eclipse.mylyn.tasks.ui.navigation + persp.actionSet:org.eclipse.ui.cheatsheets.actionSet + persp.actionSet:org.eclipse.search.searchActionSet + persp.actionSet:org.eclipse.text.quicksearch.actionSet + persp.actionSet:org.eclipse.ui.edit.text.actionSet.annotationNavigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.navigation + persp.actionSet:org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo + persp.actionSet:org.eclipse.ui.externaltools.ExternalToolsSet + persp.actionSet:org.eclipse.ui.actionSet.keyBindings + persp.actionSet:org.eclipse.ui.actionSet.openFiles + persp.actionSet:org.eclipse.wb.core.ui.actionset + persp.actionSet:org.eclipse.debug.ui.launchActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaActionSet + persp.actionSet:org.eclipse.jdt.ui.JavaElementCreationActionSet + persp.actionSet:org.eclipse.ui.NavigateActionSet + persp.viewSC:org.eclipse.jdt.ui.PackageExplorer + persp.viewSC:org.eclipse.jdt.ui.TypeHierarchy + persp.viewSC:org.eclipse.jdt.ui.SourceView + persp.viewSC:org.eclipse.jdt.ui.JavadocView + persp.viewSC:org.eclipse.search.ui.views.SearchView + persp.viewSC:org.eclipse.ui.console.ConsoleView + persp.viewSC:org.eclipse.ui.views.ContentOutline + persp.viewSC:org.eclipse.ui.views.ProblemView + persp.viewSC:org.eclipse.ui.views.ResourceNavigator + persp.viewSC:org.eclipse.ui.views.TaskList + persp.viewSC:org.eclipse.ui.views.ProgressView + persp.viewSC:org.eclipse.ui.navigator.ProjectExplorer + persp.viewSC:org.eclipse.ui.texteditor.TemplatesView + persp.viewSC:org.eclipse.pde.runtime.LogView + persp.newWizSC:org.eclipse.jdt.ui.wizards.JavaProjectWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewPackageCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewClassCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewInterfaceCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewEnumCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewAnnotationCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSourceFolderCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewSnippetFileCreationWizard + persp.newWizSC:org.eclipse.jdt.ui.wizards.NewJavaWorkingSetWizard + persp.newWizSC:org.eclipse.ui.wizards.new.folder + persp.newWizSC:org.eclipse.ui.wizards.new.file + persp.newWizSC:org.eclipse.ui.editors.wizards.UntitledTextFileWizard + persp.perspSC:org.eclipse.jdt.ui.JavaBrowsingPerspective + persp.perspSC:org.eclipse.debug.ui.DebugPerspective + persp.showIn:org.eclipse.jdt.ui.PackageExplorer + persp.showIn:org.eclipse.team.ui.GenericHistoryView + persp.showIn:org.eclipse.ui.views.ResourceNavigator + persp.showIn:org.eclipse.ui.navigator.ProjectExplorer + persp.perspSC:org.eclipse.wst.jsdt.ui.JavaPerspective + persp.viewSC:org.eclipse.mylyn.tasks.ui.views.tasks + persp.newWizSC:org.eclipse.mylyn.tasks.ui.wizards.new.repository.task + persp.actionSet:org.eclipse.debug.ui.breakpointActionSet + persp.actionSet:org.eclipse.jdt.debug.ui.JDTDebugActionSet + persp.actionSet:org.eclipse.eclemma.ui.CoverageActionSet + persp.showIn:org.eclipse.eclemma.ui.CoverageView + persp.viewSC:org.eclipse.wb.core.StructureView + persp.viewSC:org.eclipse.wb.core.PaletteView + persp.showIn:org.eclipse.egit.ui.RepositoriesView + persp.newWizSC:org.eclipse.jdt.junit.wizards.NewTestCaseCreationWizard + persp.actionSet:org.eclipse.jdt.junit.JUnitActionSet + persp.viewSC:org.eclipse.ant.ui.views.AntView + persp.newWizSC:org.eclipse.xtend.ide.wizards.NewXtendClassWizard + persp.newWizSC:org.eclipse.xtend.ide.wizards.NewXtendInterfaceWizard + persp.newWizSC:org.eclipse.xtend.ide.wizards.NewXtendEnumWizard + persp.newWizSC:org.eclipse.xtend.ide.wizards.NewXtendAnnotationWizard + + + + org.eclipse.e4.primaryNavigationStack + Minimized + MinimizedByZoom + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:WindowBuilder + + + View + categoryTag:WindowBuilder + + + View + categoryTag:Java + + + + + View + categoryTag:Git + + + + + + + Maximized + + + + Minimized + MinimizedByZoom + + View + categoryTag:Mylyn + + + + org.eclipse.e4.secondaryNavigationStack + Minimized + MinimizedByZoom + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:Ant + + + + + + org.eclipse.e4.secondaryDataStack + Synthclipse + Minimized + MinimizedByZoom + active + noFocus + + View + categoryTag:General + + + View + categoryTag:Java + + + View + categoryTag:Java + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:General + + + View + categoryTag:Synthclipse + + + + + + + + + View + categoryTag:Help + + + View + categoryTag:General + + + View + categoryTag:Help + + + + + + + View + categoryTag:Help + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Help + + + + org.eclipse.e4.primaryDataStack + EditorStack + + + Editor + removeOnHide + org.eclipse.wb.core.guiEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + Editor + removeOnHide + org.eclipse.jdt.ui.CompilationUnitEditor + + + + + + + + View + categoryTag:Java + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Java + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + + View + categoryTag:Java + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:Java + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + active + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + + View + categoryTag:General + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + + View + categoryTag:Mylyn + + ViewMenu + menuContribution:menu + + + + + + + View + categoryTag:WindowBuilder + + + + + View + categoryTag:WindowBuilder + + + + + View + categoryTag:Git + + + + + View + categoryTag:Java + + + + + View + categoryTag:Ant + + + + + + View + categoryTag:Synthclipse + + ViewMenu + menuContribution:menu + + + + + + toolbarSeparator + + + + Draggable + + + + toolbarSeparator + + + + Draggable + + + toolbarSeparator + + + + Draggable + + + Draggable + + + Draggable + + + Draggable + + + toolbarSeparator + + + + Draggable + + + + Draggable + + + Draggable + + + toolbarSeparator + + + + toolbarSeparator + + + + Draggable + + + stretch + SHOW_RESTORE_MENU + + + Draggable + HIDEABLE + SHOW_RESTORE_MENU + + + + + stretch + + + Draggable + + + Draggable + + + + + TrimStack + Draggable + + + TrimStack + Draggable + + + + + TrimStack + Draggable + + + TrimStack + Draggable + + + TrimStack + Draggable + MinimizedAndShowing + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + platform:win32 + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + platform:win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Editor + removeOnHide + + + + + View + categoryTag:Ant + + + + + View + categoryTag:Gradle + + + + + View + categoryTag:Gradle + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Java + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + + + + + View + categoryTag:Git + NoRestore + + + + + View + categoryTag:Git + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java Browsing + + + + + View + categoryTag:Java + + + + + View + categoryTag:General + + + + + View + categoryTag:Java + + + + + View + categoryTag:Java + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Mylyn + + + + + View + categoryTag:Oomph + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Team + + + + + View + categoryTag:Team + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:Help + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:General + + + + + View + categoryTag:XML + + + + + View + categoryTag:XML + + + + + View + categoryTag:API Tools + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:Plug-in Development + + + + + View + categoryTag:WindowBuilder + + + + + View + categoryTag:WindowBuilder + + + + + View + categoryTag:PyDev + + + + + View + categoryTag:PyDev + + + + + View + categoryTag:PyDev + + + + + View + categoryTag:PyDev + + + + + View + categoryTag:PyDev + + + + + View + categoryTag:PyDev + + + + + View + categoryTag:PyDev + + + + + View + categoryTag:PyDev + + + + + View + categoryTag:Maven + + + + + View + categoryTag:Maven + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Debug + + + + + View + categoryTag:Make + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:C/C++ + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:JavaScript + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:Synthclipse + + + + + View + categoryTag:JavaFX + + + + + View + categoryTag:Xtend + + + + + View + categoryTag:Xtext + + + + + View + categoryTag:Xtext + + + + glue + move_after:PerspectiveSpacer + SHOW_RESTORE_MENU + + + move_after:Spacer Glue + HIDEABLE + SHOW_RESTORE_MENU + + + glue + move_after:SearchField + SHOW_RESTORE_MENU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.core/12417758.index b/.metadata/.plugins/org.eclipse.jdt.core/12417758.index new file mode 100644 index 0000000..60989e0 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/12417758.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1583749204.index b/.metadata/.plugins/org.eclipse.jdt.core/1583749204.index new file mode 100644 index 0000000..f551ad2 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/1583749204.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1593673412.index b/.metadata/.plugins/org.eclipse.jdt.core/1593673412.index new file mode 100644 index 0000000..5b2dcf6 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/1593673412.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1630848587.index b/.metadata/.plugins/org.eclipse.jdt.core/1630848587.index new file mode 100644 index 0000000..0be248b Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/1630848587.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1851668056.index b/.metadata/.plugins/org.eclipse.jdt.core/1851668056.index new file mode 100644 index 0000000..58bfb54 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/1851668056.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2068962978.index b/.metadata/.plugins/org.eclipse.jdt.core/2068962978.index new file mode 100644 index 0000000..e70c150 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/2068962978.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/21486501.index b/.metadata/.plugins/org.eclipse.jdt.core/21486501.index new file mode 100644 index 0000000..9fff482 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/21486501.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2173726253.index b/.metadata/.plugins/org.eclipse.jdt.core/2173726253.index new file mode 100644 index 0000000..6578a25 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/2173726253.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/2709655776.index b/.metadata/.plugins/org.eclipse.jdt.core/2709655776.index new file mode 100644 index 0000000..cc290ae Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/2709655776.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3179953034.index b/.metadata/.plugins/org.eclipse.jdt.core/3179953034.index new file mode 100644 index 0000000..8608fae Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/3179953034.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3550930481.index b/.metadata/.plugins/org.eclipse.jdt.core/3550930481.index new file mode 100644 index 0000000..97ebf3a Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/3550930481.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3608884278.index b/.metadata/.plugins/org.eclipse.jdt.core/3608884278.index new file mode 100644 index 0000000..ef22ca3 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/3608884278.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3618832045.index b/.metadata/.plugins/org.eclipse.jdt.core/3618832045.index new file mode 100644 index 0000000..c612b50 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/3618832045.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3964923001.index b/.metadata/.plugins/org.eclipse.jdt.core/3964923001.index new file mode 100644 index 0000000..9132a1b Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/3964923001.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/3992513546.index b/.metadata/.plugins/org.eclipse.jdt.core/3992513546.index new file mode 100644 index 0000000..46d9f7e Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/3992513546.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/4163494320.index b/.metadata/.plugins/org.eclipse.jdt.core/4163494320.index new file mode 100644 index 0000000..f2457be Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/4163494320.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/424447496.index b/.metadata/.plugins/org.eclipse.jdt.core/424447496.index new file mode 100644 index 0000000..dbb5520 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/424447496.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/699245563.index b/.metadata/.plugins/org.eclipse.jdt.core/699245563.index new file mode 100644 index 0000000..6a3ba7a Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/699245563.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/854353447.index b/.metadata/.plugins/org.eclipse.jdt.core/854353447.index new file mode 100644 index 0000000..ca53310 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/854353447.index differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps b/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps new file mode 100644 index 0000000..5a4497c Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/externalLibsTimeStamps differ diff --git a/.metadata/.plugins/org.eclipse.jdt.core/javaLikeNames.txt b/.metadata/.plugins/org.eclipse.jdt.core/javaLikeNames.txt new file mode 100644 index 0000000..8586397 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.core/javaLikeNames.txt @@ -0,0 +1 @@ +java \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt b/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt new file mode 100644 index 0000000..458ef68 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.core/savedIndexNames.txt @@ -0,0 +1,20 @@ +INDEX VERSION 1.131+C:\dev\playing-coffee\.metadata\.plugins\org.eclipse.jdt.core +3964923001.index +3618832045.index +699245563.index +1583749204.index +1593673412.index +424447496.index +2173726253.index +854353447.index +3608884278.index +3992513546.index +1630848587.index +1851668056.index +3550930481.index +12417758.index +21486501.index +4163494320.index +2709655776.index +2068962978.index +3179953034.index diff --git a/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat b/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat new file mode 100644 index 0000000..2f99a9a Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.core/variablesAndContainers.dat differ diff --git a/.metadata/.plugins/org.eclipse.jdt.launching/.install.xml b/.metadata/.plugins/org.eclipse.jdt.launching/.install.xml new file mode 100644 index 0000000..3c853b9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.launching/.install.xml @@ -0,0 +1,4 @@ + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml b/.metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml new file mode 100644 index 0000000..44928b8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.jdt.launching/libraryInfos.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/0.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/0.png new file mode 100644 index 0000000..5a8a6f0 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/0.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/1.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/1.png new file mode 100644 index 0000000..7b019ba Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/1.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/10.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/10.png new file mode 100644 index 0000000..8bb97ce Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/10.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/11.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/11.png new file mode 100644 index 0000000..4e7488e Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/11.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/12.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/12.png new file mode 100644 index 0000000..0e98817 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/12.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/13.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/13.png new file mode 100644 index 0000000..be086d7 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/13.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/2.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/2.png new file mode 100644 index 0000000..bb8d9a1 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/2.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/3.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/3.png new file mode 100644 index 0000000..7d15d50 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/3.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/4.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/4.png new file mode 100644 index 0000000..4191b7c Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/4.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/5.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/5.png new file mode 100644 index 0000000..a839ceb Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/5.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/6.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/6.png new file mode 100644 index 0000000..18ebdd1 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/6.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/7.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/7.png new file mode 100644 index 0000000..d4022ec Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/7.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/8.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/8.png new file mode 100644 index 0000000..ba2d4d6 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/8.png differ diff --git a/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/9.png b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/9.png new file mode 100644 index 0000000..e77796b Binary files /dev/null and b/.metadata/.plugins/org.eclipse.jdt.ui/jdt-images/9.png differ diff --git a/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/playing-coffee/2020/12/52/refactorings.history b/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/playing-coffee/2020/12/52/refactorings.history new file mode 100644 index 0000000..c3d9495 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/playing-coffee/2020/12/52/refactorings.history @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/playing-coffee/2020/12/52/refactorings.index b/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/playing-coffee/2020/12/52/refactorings.index new file mode 100644 index 0000000..01c3a98 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/playing-coffee/2020/12/52/refactorings.index @@ -0,0 +1,14 @@ +1608703634619 Rename field 'm_CPU' +1608705162910 Rename package 'playingcoffee.core.cpi' +1608705167244 Move compilation unit +1608708385274 Rename type 'MicroOps' +1608709056373 Delete element +1608710053096 Move compilation unit +1608720267816 Delete elements +1608720848634 Rename field 'table' +1608720868704 Rename local variable 'list' +1608720923801 Rename package 'playingcoffee.coer' +1608741952793 Rename type 'Op' +1608742512523 Rename field 'stored' +1608742919599 Delete element +1608746579753 Rename field 'instructionCycle' diff --git a/.metadata/.plugins/org.eclipse.m2e.logback.configuration/0.log b/.metadata/.plugins/org.eclipse.m2e.logback.configuration/0.log new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.m2e.logback.configuration/logback.1.14.0.20191209-1925.xml b/.metadata/.plugins/org.eclipse.m2e.logback.configuration/logback.1.14.0.20191209-1925.xml new file mode 100644 index 0000000..e33758c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.m2e.logback.configuration/logback.1.14.0.20191209-1925.xml @@ -0,0 +1,43 @@ + + + + %date [%thread] %-5level %logger{35} - %msg%n + + + OFF + + + + + ${org.eclipse.m2e.log.dir}/0.log + + ${org.eclipse.m2e.log.dir}/%i.log + 1 + 10 + + + 100MB + + + %date [%thread] %-5level %logger{35} - %msg%n + + + + + + WARN + + + + + + + + + + + + + + + diff --git a/.metadata/.plugins/org.eclipse.oomph.setup/workspace.setup b/.metadata/.plugins/org.eclipse.oomph.setup/workspace.setup new file mode 100644 index 0000000..1f73e14 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.oomph.setup/workspace.setup @@ -0,0 +1,6 @@ + + diff --git a/.metadata/.plugins/org.eclipse.pde.core/.local_targets/1608720315762.target b/.metadata/.plugins/org.eclipse.pde.core/.local_targets/1608720315762.target new file mode 100644 index 0000000..dda708a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.pde.core/.local_targets/1608720315762.target @@ -0,0 +1,13 @@ + + + + + + + + x86_64 + win32 + win32 + en_GB + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.pde.core/SavedExternalPluginList.txt b/.metadata/.plugins/org.eclipse.pde.core/SavedExternalPluginList.txt new file mode 100644 index 0000000..196db7d --- /dev/null +++ b/.metadata/.plugins/org.eclipse.pde.core/SavedExternalPluginList.txt @@ -0,0 +1,817 @@ +# List of external plug-in models previously loaded. Timestamp: 1608720318363 +file:/C:/Users/Sixten/.p2/pool/plugins/ch.qos.logback.classic_1.0.7.v20121108-1250.jar +file:/C:/Users/Sixten/.p2/pool/plugins/ch.qos.logback.core_1.0.7.v20121108-1250.jar +file:/C:/Users/Sixten/.p2/pool/plugins/ch.qos.logback.slf4j_1.0.7.v201505121915.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.google.gson_2.8.2.v20180104-1110.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.google.guava_27.1.0.v20190517-1946.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.google.guava_21.0.0.v20170206-1425.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.google.inject_3.0.0.v201605172100.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.google.javascript_0.0.20160315.v20161124-1903.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.google.protobuf_2.4.0.v201105131100.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.ibm.icu_64.2.0.v20190507-1337.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.jcraft.jsch_0.1.55.v20190404-1902.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.jcraft.jzlib_1.1.1.v201205102305.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.python.pydev.analysis_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/com.python.pydev.debug_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/com.python.pydev.refactoring_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/com.sun.el_2.2.0.v201303151357.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.sun.jna_4.5.1.v20180403-1933.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.sun.jna.platform_4.5.1.v20180403-1933.jar +file:/C:/Users/Sixten/.p2/pool/plugins/com.sun.xml.bind_2.2.0.v201505121915.jar +file:/C:/Users/Sixten/.p2/pool/plugins/io.github.classgraph_4.8.35.v20190528-1517.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javaewah_1.1.6.v20160919-1400.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.activation_1.1.0.v201211130549.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.annotation_1.2.0.v201602091430.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.el_2.2.0.v201303151357.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.inject_1.0.0.v20091030.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.servlet_3.1.0.v201410161800.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.servlet.jsp_2.2.0.v201112011158.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.xml_1.3.4.v201005080400.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.xml.bind_2.2.0.v201105210648.jar +file:/C:/Users/Sixten/.p2/pool/plugins/javax.xml.stream_1.0.1.v201004272200.jar +file:/C:/Users/Sixten/.p2/pool/plugins/jsonedit-core_1.1.3.jar +file:/C:/Users/Sixten/.p2/pool/plugins/jsonedit-editor_1.1.3.jar +file:/C:/Users/Sixten/.p2/pool/plugins/jsonedit-folding_1.1.3.jar +file:/C:/Users/Sixten/.p2/pool/plugins/jsonedit-model_1.1.3.jar +file:/C:/Users/Sixten/.p2/pool/plugins/jsonedit-outline_1.1.3.jar +file:/C:/Users/Sixten/.p2/pool/plugins/jsonedit-preferences_1.1.3.jar +file:/C:/Users/Sixten/.p2/pool/plugins/jsonedit-text_1.1.3.jar +file:/C:/Users/Sixten/.p2/pool/plugins/net.i2p.crypto.eddsa_0.3.0.v20181102-1323.jar +file:/C:/Users/Sixten/.p2/pool/plugins/net.sourceforge.javahexeditor_0.5.1.201901120339.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.antlr.antlr4-runtime_4.7.1.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.antlr.runtime_3.2.0.v201101311130.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.ant_1.10.5.v20190526-1402/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.batik.constants_1.11.0.v20190515-0436.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.batik.css_1.11.0.v20190515-0436.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.batik.i18n_1.11.0.v20190515-0436.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.batik.util_1.11.0.v20190515-0436.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.cli_1.2.0.v201404270220.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.codec_1.10.0.v20180409-1845.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.compress_1.18.0.v20181121-2221.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.httpclient_3.1.0.v201012070820.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.io_2.6.0.v20190123-2029.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.jxpath_1.3.0.v200911051830.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.lang_2.6.0.v201404270220.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.lang3_3.1.0.v201403281430.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.commons.logging_1.2.0.v20180409-1502.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.felix.gogo.command_1.0.2.v20170914-1324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.felix.gogo.runtime_1.1.0.v20180713-1646.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.felix.gogo.shell_1.1.0.v20180713-1646.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.felix.scr_2.1.14.v20190123-1619.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.httpcomponents.httpclient_4.5.6.v20190213-1430.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.httpcomponents.httpclient.win_4.5.6.v20190213-1947.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.httpcomponents.httpcore_4.4.10.v20190123-2214.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.jasper.glassfish_2.2.2.v201501141630.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.log4j_1.2.15.v201012070815.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.lucene.analyzers-common_8.0.0.v20190404-1858.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.lucene.analyzers-common_7.5.0.v20181003-1532.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.lucene.analyzers-common_6.1.0.v20161115-1612.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.lucene.analyzers-smartcn_8.0.0.v20190404-1858.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.lucene.core_8.0.0.v20190404-1858.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.lucene.core_7.5.0.v20181003-1532.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.lucene.core_6.1.0.v20170814-1820.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.lucene.queryparser_6.1.0.v20161115-1612.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.sshd.osgi_2.2.0.v20190425-2127.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.sshd.sftp_2.2.0.v20190425-2127.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.ws.commons.util_1.0.1.v20100518-1140.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.xerces_2.9.0.v201101211617.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.xml.resolver_1.2.0.v201005080400.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.xml.serializer_2.7.1.v201005080400.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.xmlgraphics_2.3.0.v20190515-0436.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apache.xmlrpc_3.0.0.v20100427-1100.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.apiguardian_1.1.0.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.bouncycastle.bcpg_1.61.0.v20190602-1335.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.bouncycastle.bcpkix_1.61.0.v20190602-1335.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.bouncycastle.bcprov_1.61.0.v20190602-1335.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ant.core_3.5.500.v20190701-1953.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ant.launching_1.2.600.v20190701-1953.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ant.ui_3.7.500.v20190518-1030.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.buildship.branding_3.1.2.v20190903-1802.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.buildship.core_3.1.2.v20190903-1802.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.buildship.stsmigration_3.1.2.v20190903-1802.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.buildship.ui_3.1.2.v20190903-1802.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt_9.9.0.201906111633.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.autotools.core_2.0.2.201811241055.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.autotools.docs_2.0.200.201909091953.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.autotools.ui_2.0.200.201906071757.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.build.gcc.core_1.0.100.201909091956.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.build.gcc.ui_1.0.1.201811241055.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.cmake.core_1.2.200.201908222044.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.cmake.ui_1.2.100.201907152030.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.codan.checkers_3.3.200.201908101428.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.codan.checkers.ui_3.2.100.201905301541.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.codan.core_4.0.100.201908101428.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.codan.core.cxx_3.4.200.201908101428.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.codan.ui_3.3.300.201908121111.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.codan.ui.cxx_3.5.100.201908121111.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.core_6.9.0.201909091953.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.core.native_5.10.100.201906192010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.core.win32_5.4.2.201811241055.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.core.win32.x86_64_5.4.2.201811241055/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.debug.core_8.4.0.201908101428.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.debug.ui_8.3.200.201908121111.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.doc.user_5.4.200.201909091956.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.dsf_2.8.100.201908121111.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.dsf.gdb_5.7.200.201908172017.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.dsf.gdb.ui_2.6.300.201908121111.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.dsf.ui_2.5.200.201908121111.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.gdb_7.0.1.201811241055.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.gdb.ui_7.0.1.201811241055.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.launch_9.3.0.201908121431.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.make.core_7.4.100.201905311644.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.make.ui_7.3.100.201908121431.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.managedbuilder.core_8.7.200.201909091956.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.managedbuilder.gnu.ui_8.3.100.201909091956.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.managedbuilder.ui_9.1.300.201908090550.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.meson.core_1.0.100.201905311644.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.meson.docs_1.0.200.201909091953.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.meson.ui_1.0.100.201905311644.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.meson.ui.editor_1.0.1.201811241055.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.native.serial_1.1.200.201909051303.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.remote.core_1.0.2.201811241055.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.cdt.ui_6.6.0.201909091956.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.compare_3.7.700.v20190802-1838.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.compare.core_3.6.600.v20190615-1517.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.compare.win32_1.2.600.v20190615-1517.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.commands_3.9.500.v20190805-1157.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.contenttype_3.7.400.v20190624-1144.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.databinding_1.7.500.v20190624-2109.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.databinding.beans_1.5.100.v20190624-2109.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.databinding.observable_1.8.0.v20190805-1157.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.databinding.property_1.7.100.v20190805-1157.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.expressions_3.6.500.v20190617-1926.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.externaltools_1.1.400.v20190705-1530.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.filebuffers_3.6.700.v20190614-0928.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.filesystem_1.7.500.v20190620-1312.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.filesystem.win32.x86_64_1.4.200.v20190812-0909.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.jobs_3.10.500.v20190620-1426.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.net_1.3.600.v20190619-1613.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.net.win32.x86_64_1.1.400.v20190812-0847.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.resources_3.13.500.v20190819-0800.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.resources.win32.x86_64_3.5.400.v20190812-0909.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.runtime_3.16.0.v20190823-1314.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.core.variables_3.4.600.v20190614-1239.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.debug.core_3.14.0.v20190812-1404.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.debug.ui_3.14.200.v20190822-2125.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.draw2d_3.10.100.201606061308.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.core.commands_0.12.700.v20190621-1412.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.core.contexts_1.8.200.v20190620-0649.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.core.di_1.7.400.v20190903-1311.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.core.di.annotations_1.6.400.v20190518-1217.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.core.di.extensions_0.15.300.v20190213-1308.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.core.di.extensions.supplier_0.15.400.v20190709-0707.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.core.services_2.2.0.v20190630-2019.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.emf.xpath_0.2.400.v20190621-1946.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.bindings_0.12.600.v20190625-0735.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.css.core_0.12.800.v20190805-1157.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.css.swt_0.13.600.v20190805-1157.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.css.swt.theme_0.12.400.v20190812-0413.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.di_1.2.600.v20190510-1100.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.dialogs_1.1.600.v20190814-0636.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.model.workbench_2.1.500.v20190824-1021.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.services_1.3.600.v20190716-1245.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.widgets_1.2.500.v20190624-0808.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.workbench_1.10.100.v20190810-0814.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.workbench.addons.swt_1.3.600.v20190716-1245.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.workbench.renderers.swt_0.14.800.v20190716-1245.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.workbench.swt_0.14.700.v20190807-1716.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.e4.ui.workbench3_0.15.200.v20190621-1448.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ecf_3.9.3.v20190423-0625.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ecf.filetransfer_5.0.100.v20180301-0132.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ecf.identity_3.9.1.v20181107-1749.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ecf.provider.filetransfer_3.2.400.v20180306-0429.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ecf.provider.filetransfer.httpclient45_1.0.0.v20190530-1947.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ecf.provider.filetransfer.httpclient45.win32_1.0.0.v20190502-2116.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ecf.provider.filetransfer.ssl_1.0.100.v20180301-0132.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ecf.ssl_1.2.200.v20190502-0212.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.eclemma.core_3.1.2.201903112331.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.eclemma.doc_3.1.2.201903112331.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.eclemma.ui_3.1.2.201903112331.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.egit_5.5.0.201909110433-r.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.egit.core_5.5.0.201909110433-r.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.egit.doc_5.5.0.201909110433-r.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.egit.mylyn.ui_5.5.0.201909110433-r.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.egit.ui_5.5.0.201909110433-r.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.codegen_2.19.0.v20190821-1536.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.codegen.ecore_2.19.0.v20190822-1451.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.common_2.16.0.v20190625-1131.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.common.ui_2.18.0.v20190507-0402.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.databinding_1.5.0.v20180706-1146.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.databinding.edit_1.6.0.v20190323-1031.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.ecore_2.19.0.v20190822-1451.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.ecore.change_2.14.0.v20190528-0725.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.ecore.edit_2.13.0.v20190822-1451.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.ecore.editor_2.17.0.v20190528-0725.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.ecore.xmi_2.16.0.v20190528-0725.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.edit_2.15.0.v20190528-0725.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.edit.ui_2.16.0.v20181104-0733.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe.core_1.5.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe.utils_1.5.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.language_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.language.ide_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.language.ui_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.launch_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.launch.ui_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.lib_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.runtime_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.logging.aeri.core_2.0.7.v20180504-0806.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.logging.aeri.ide_2.0.7.v20180504-0806.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.mpc.core_1.8.0.v20190725-1807.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.mpc.core.win32_1.8.0.v20190725-1803.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.mpc.help.ui_1.8.0.v20190725-1803.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.mpc.ui_1.8.0.v20190725-1807.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.mpc.ui.css_1.8.0.v20190725-1803.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.package.common_4.13.0.20190917-0000/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.epp.package.java_4.13.0.20190917-0000/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.app_1.4.300.v20190815-1535.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.bidi_1.2.100.v20190815-1535.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.common_3.10.500.v20190815-1535.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.concurrent_1.1.400.v20190621-0852.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.console_1.4.0.v20190819-1430.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.event_1.5.200.v20190814-0953.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.frameworkadmin_2.1.300.v20190318-1320.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.frameworkadmin.equinox_1.1.100.v20180822-1258.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.http.jetty_3.7.200.v20190714-1849.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.http.registry_1.1.700.v20190214-1948.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.http.servlet_1.6.200.v20190823-1423.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.jsp.jasper_1.1.300.v20190714-1850.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.jsp.jasper.registry_1.1.300.v20190714-1850.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.launcher_1.5.500.v20190715-1310.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1100.v20190907-0426/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.artifact.repository_1.3.200.v20190815-1428.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.console_1.1.200.v20190701-1309.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.core_2.6.100.v20190705-1223.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.director_2.4.400.v20190701-1309.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.director.app_1.1.300.v20190716-0825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.directorywatcher_1.2.300.v20190611-1008.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.discovery_1.1.200.v20190611-1008.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.discovery.compatibility_1.1.200.v20190611-1008.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.engine_2.6.400.v20190716-0825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.extensionlocation_1.3.200.v20190716-0939.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.garbagecollector_1.1.200.v20190701-1826.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.jarprocessor_1.1.300.v20190621-1230.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.metadata_2.4.500.v20190807-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.metadata.repository_1.3.200.v20190808-0702.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.operations_2.5.500.v20190701-1826.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.publisher_1.5.200.v20190611-1040.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.publisher.eclipse_1.3.300.v20190716-0939.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.reconciler.dropins_1.3.100.v20190701-1826.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.repository_2.4.500.v20190716-0939.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.repository.tools_2.2.300.v20190621-1230.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.touchpoint.eclipse_2.2.400.v20190716-0947.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.touchpoint.natives_1.3.300.v20190716-0800.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.transport.ecf_1.2.200.v20190716-0800.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.ui_2.5.600.v20190814-1459.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.ui.discovery_1.1.200.v20190716-0825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.ui.importexport_1.2.200.v20190716-0825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.ui.sdk_1.1.300.v20190701-1309.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.ui.sdk.scheduler_1.4.300.v20190716-0825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.updatechecker_1.2.200.v20190701-1309.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.p2.updatesite_1.1.200.v20190716-0825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.preferences_3.7.500.v20190815-1535.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.registry_3.8.500.v20190714-1850.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.security_1.3.300.v20190714-1851.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.security.ui_1.2.400.v20190714-1851.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.security.win32.x86_64_1.1.200.v20190812-0919.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.simpleconfigurator_1.3.300.v20190716-0825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.simpleconfigurator.manipulator_2.1.300.v20190716-0825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.equinox.util_1.1.300.v20190714-1852.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.code.editor.configuration_3.6.0.201907240201.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.code.editor.ldef_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.code.editor.ldef.ui_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.core_3.6.0.201907240201.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.core.guice_3.6.0.201907240201.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.formats.svg_3.6.0.201907240201.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.converter_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.css_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.css.cssext_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.css.cssext.proposals_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.css.cssext.ui_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.css.jfx2_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.css.jfx8_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.css.ui_3.5.0.201907240300/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.fxgraph_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.fxgraph.ui_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.fxml_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.fxml.compiler_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.gmodel_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.gmodel.ui_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.jdt.core_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.jdt.ui_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.l10n_3.5.0.201907240300/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.l10n.ui_3.5.0.201907240300/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.m2e_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.model_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.mvnosgi.launching_3.5.0.201907240300/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.mvnosgi.launching.ui_3.5.0.201907240300/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.pde.core_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.pde.ui_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.pde.ui.e4_3.5.0.201907240300/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.rrobot_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.rrobot.dsl_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.rrobot.dsl.ui_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.rrobot.model_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.ui_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ide.ui.preview_3.5.0.201907240300.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.osgi_3.6.0.201907240103.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.osgi.util_3.6.0.201907240201.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ui.animation_3.6.0.201907240201.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ui.controls_3.6.0.201907240201.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ui.panes_3.6.0.201907240201.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.fx.ui.workbench3_3.6.0.201907240103.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.gef_3.11.0.201606061308.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.help_3.8.500.v20190624-2105.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.help.base_4.2.700.v20190916-1045.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.help.ui_4.1.600.v20190814-0936.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.help.webapp_3.9.600.v20190814-0635.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt_3.18.100.v20190916-1045.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.annotation_2.2.300.v20190328-1431.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.annotation_1.1.400.v20180921-1416.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.apt.core_3.6.500.v20190703-0914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.apt.pluggable.core_1.2.400.v20190626-1334.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.apt.ui_3.6.300.v20190727-1243.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.compiler.apt_1.3.700.v20190704-1731.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.compiler.tool_1.2.600.v20190322-0450.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.core_3.19.0.v20190903-0936.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.core.manipulation_1.12.100.v20190904-0645.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.debug_3.13.100.v20190902-1050/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.debug.ui_3.10.400.v20190815-2202.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.doc.user_3.15.400.v20190904-0724.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.junit_3.11.500.v20190809-1613.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.junit.core_3.10.400.v20190625-1910.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.junit.runtime_3.4.1000.v20190510-0840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.junit4.runtime_1.1.1000.v20190510-0840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.junit5.runtime_1.0.600.v20190610-0439.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.launching_3.15.0.v20190826-1639.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jdt.ui_3.19.0.v20190827-1733.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jem.util_2.1.201.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jetty.continuation_9.4.20.v20190813.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jetty.http_9.4.20.v20190813.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jetty.io_9.4.20.v20190813.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jetty.security_9.4.20.v20190813.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jetty.server_9.4.20.v20190813.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jetty.servlet_9.4.20.v20190813.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jetty.util_9.4.20.v20190813.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jface_3.17.0.v20190820-1444.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jface.databinding_1.9.100.v20190805-1255.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jface.text_3.15.300.v20190819-0725.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jgit_5.5.0.201909110433-r.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jgit.archive_5.5.0.201909110433-r.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jgit.ssh.apache_5.5.0.201909110433-r.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jsch.core_1.3.600.v20190615-1517.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.jsch.ui_1.3.600.v20190617-1017.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.launchbar.core_2.3.0.201907192018.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.launchbar.ui_2.3.0.201907192018.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ltk.core.refactoring_3.10.200.v20190814-1719.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ltk.ui.refactoring_3.10.0.v20190819-2110.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.archetype.common_1.14.0.20191209-1923/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.binaryproject_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.binaryproject.ui_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.core_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.core.ui_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.discovery_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.editor_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.editor.xml_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.importer_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.jdt_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.jdt.ui_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.launching_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.lifecyclemapping.defaults_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.logback.appender_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.logback.configuration_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.maven.indexer_1.14.0.20191209-1923/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.maven.runtime_1.14.0.20191209-1923/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.maven.runtime.slf4j.simple_1.14.0.20191209-1923/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.model.edit_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.profiles.core_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.profiles.ui_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.refactoring_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.scm_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.sourcelookup_1.14.0.20191209-1925/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.sourcelookup.ui_1.14.0.20191209-1925.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.m2e.workspace.cli_0.3.1.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.bugzilla.core_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.bugzilla.ide_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.bugzilla.ui_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.builds.core_1.16.0.v20170629-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.builds.ui_1.16.0.v20170629-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.core_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.identity.core_1.16.0.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.net_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.notifications.core_1.16.0.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.notifications.feed_1.16.0.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.notifications.ui_1.16.0.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.repositories.core_1.16.0.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.repositories.http.core_1.16.0.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.repositories.ui_1.16.0.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.screenshots_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.ui_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.workbench_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.commons.xmlrpc_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.context.core_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.context.tasks.ui_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.context.ui_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.debug.ui_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.discovery.core_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.discovery.ui_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.git.core_1.16.0.v20170629-1738.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.git.ui_1.16.0.v20170629-1738.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.help.ui_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.hudson.core_1.16.0.v20180403-2055.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.hudson.ui_1.16.0.v20170629-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.ide.ant_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.ide.ui_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.java.tasks_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.java.ui_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.monitor.core_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.monitor.ui_3.24.2.v20180904-2231.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.resources.ui_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.tasks.bugs_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.tasks.core_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.tasks.index.core_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.tasks.index.ui_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.tasks.search_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.tasks.ui_3.24.2.v20180905-0003.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.team.ui_3.24.2.v20180905-0014.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.versions.core_1.16.0.v20170629-1738.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.versions.ui_1.16.0.v20170629-1738.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.ant_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.asciidoc_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.asciidoc.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.confluence_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.confluence.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.context.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.help.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.html_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.markdown_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.markdown.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.mediawiki_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.mediawiki.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.osgi_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.tasks.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.textile_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.textile.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.tracwiki_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.tracwiki.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.twiki_3.0.33.20190711143914.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.twiki.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.mylyn.wikitext.ui_3.0.33.201907111840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.nebula.widgets.tablecombo_1.2.0.201909082034.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.base_1.12.0.v20190705-1018.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.base.edit_1.12.0.v20190702-1454.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.extractor.lib_1.6.0.v20190410-0601.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.jreinfo_1.11.0.v20190523-0419.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.jreinfo.ui_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.jreinfo.win32.x86_64_1.6.0.v20190823-0727.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.p2_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.p2.core_1.13.0.v20190903-1612.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.p2.doc_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.p2.edit_1.11.0.v20190323-1130.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.p2.ui_1.11.0.v20190829-0515.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.predicates_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.predicates.edit_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.preferences_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.resources_1.11.0.v20190828-0715.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.resources.edit_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup_1.14.0.v20190815-1111.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.core_1.14.0.v20190705-1542.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.doc_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.edit_1.14.0.v20190704-1252.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.editor_1.14.0.v20190827-1254.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.p2_1.12.0.v20190704-1252.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.p2.edit_1.11.0.v20190702-1454.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.sync_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.ui_1.14.0.v20190830-0600.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.setup.ui.questionnaire_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.ui_1.12.0.v20190823-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.util_1.12.0.v20190705-1135.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.workingsets_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.workingsets.edit_1.10.0.v20180706-1242.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.oomph.workingsets.editor_1.10.0.v20180904-1112.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.osgi_3.15.0.v20190830-1434.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.osgi.compatibility.state_1.1.600.v20190814-1451.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.osgi.services_3.8.0.v20190206-2147.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.osgi.util_3.5.300.v20190708-1141.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde_3.13.700.v20190916-1045.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.api.tools_1.1.900.v20190820-0846.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.api.tools.annotations_1.1.300.v20190513-1223.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.api.tools.ui_1.1.800.v20190813-1048.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.build_3.10.500.v20190620-0530/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.core_3.13.100.v20190830-1158.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.doc.user_3.14.500.v20190904-0700.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ds.annotations_1.1.500.v20190630-0918.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ds.core_1.1.600.v20190705-1135.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ds.lib_1.1.300.v20190417-0900/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ds.ui_1.1.700.v20190807-1130.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ds1_2.lib_1.0.300.v20190417-0900/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.genericeditor.extension_1.0.500.v20190513-1223.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.junit.runtime_3.5.500.v20190717-0631.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.launching_3.7.700.v20190814-1102.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.runtime_3.6.600.v20190807-1130.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ua.core_1.1.300.v20190513-1223.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ua.ui_1.1.600.v20190807-1130.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ui_3.11.100.v20190830-1158.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.pde.ui.templates_3.6.700.v20190815-1551.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.platform_4.13.0.v20190916-1045/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.platform.doc.user_4.13.0.v20190904-0724.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.rcp_4.13.0.v20190916-1045.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.remote.core_4.0.0.201909031456.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.search_3.11.700.v20190813-2210.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.swt_3.112.0.v20190904-0609.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.swt.win32.win32.x86_64_3.112.0.v20190904-0609.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.team.core_3.8.700.v20190619-1613.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.team.genericeditor.diff.extension_1.0.400.v20190626-0924.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.team.ui_3.8.600.v20190819-1553.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.text_3.9.0.v20190826-1019.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.text.quicksearch_1.0.0.v20190824-1202.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tips.core_0.1.500.v20190705-1046.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tips.ide_0.1.600.v20190703-1522.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tips.json_0.1.400.v20190402-1511.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tips.ui_0.1.700.v20190619-1218.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tm.terminal.control_4.5.102.201907171153.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tm4e.core_0.4.1.202006041920.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tm4e.registry_0.4.0.201911130739.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tm4e.ui_0.4.1.202006171722.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tools.layout.spy_1.0.400.v20190709-0901.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tools.templates.core_1.1.0.201812111206.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tools.templates.freemarker_1.0.0.201812111206.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tools.templates.freemarker.java11_1.0.0.201812111206.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.tools.templates.ui_1.1.1.201812111206.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui_3.114.0.v20190808-1317.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.browser_3.6.500.v20190813-2217.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.cheatsheets_3.5.500.v20190813-2246.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.console_3.8.600.v20190815-2020.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.editors_3.12.0.v20190730-1840.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.externaltools_3.4.400.v20190705-1219.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.forms_3.8.100.v20190625-1825.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.genericeditor_1.1.500.v20190823-1613.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.ide_3.16.0.v20190916-1323.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.ide.application_1.3.400.v20190818-1234.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.intro_3.5.700.v20190814-0635.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.intro.quicklinks_1.0.300.v20180821-0700.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.intro.universal_3.3.600.v20190624-2105.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.monitoring_1.1.500.v20190823-0929.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.navigator_3.9.0.v20190807-2204.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.navigator.resources_3.7.0.v20190820-1649.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.net_1.3.500.v20190615-1517.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.themes_1.2.700.v20190826-0816/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.trace_1.1.600.v20190830-1158.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.views_3.10.0.v20190805-1157.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.views.log_1.2.700.v20190819-1015.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.views.properties.tabbed_3.8.600.v20190713-1021.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.win32_3.4.200.v20190513-2118.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.workbench_3.116.0.v20190826-1428.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.ui.workbench.texteditor_3.13.0.v20190903-0631.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.update.configurator_3.4.300.v20190518-1030.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.urischeme_1.0.400.v20190621-1448.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.userstorage_1.2.0.v20190307-0457.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.userstorage.oauth_1.1.0.v20190307-0457.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.userstorage.ui_1.1.0.v20190307-0457.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.core_1.10.0.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.core.databinding_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.core.databinding.xml_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.core.java_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.core.lib_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.core.ui_1.10.0.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.core.xml_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.doc.user_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.layout.group_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.os_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.os.win32_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.rcp_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.rcp.SWT_AWT_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.rcp.databinding_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.rcp.databinding.emf_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.rcp.databinding.xwt_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.rcp.doc.user_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.rcp.nebula_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.rcp.swing2swt_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.runtime_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.runtime.lib_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing.FormLayout_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing.FormLayout.lib_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing.MigLayout_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing.MigLayout.lib_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing.databinding_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing.doc.user_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing.java6_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swing.jsr296_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swt_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.swt.widgets.baseline_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wb.xwt_1.9.1.201812270937.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.core_1.3.0.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.emf_1.2.600.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.emfworkbench.integration_1.2.101.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.environment_1.0.400.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.frameworks_1.2.201.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.frameworks.ui_1.2.400.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.infopop_1.0.300.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.modulecore_1.3.100.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.modulecore.ui_1.0.301.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.project.facet.core_1.4.400.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.snippets_1.2.500.v201811170421.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.ui_1.1.700.v201905071717.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.common.uriresolver_1.2.300.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.dtd.core_1.2.0.v201903222120.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.dtd.ui_1.1.200.v201904272112.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.dtd.ui.infopop_1.0.400.v201903222120.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.dtdeditor.doc.user_1.1.0.v201903222120.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.internet.cache_1.0.800.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.jsdt.core_2.0.302.v201903222047.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.jsdt.manipulation_1.0.601.v201903222047.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.jsdt.ui_2.0.400.v201908150108.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.sse.core_1.2.100.v201901310548.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.sse.doc.user_1.2.0.v201903222120.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.sse.ui_1.6.0.v201905291408.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.sse.ui.infopop_1.0.300.v201903222120.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.standard.schemas_1.0.800.v201901071922.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.validation_1.2.800.v201904082137.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.validation.infopop_1.0.300.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.validation.ui_1.2.600.v201903222010.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.xml.core_1.2.200.v201901071922.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.xml.ui_1.2.300.v201904272112.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.xml.ui.infopop_1.0.400.v201903222120.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.xmleditor.doc.user_1.1.0.v201903222120.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.xsd.core_1.2.0.v201901071922.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.xsd.ui_1.3.300.v201904272112.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.wst.xsdeditor.doc.user_1.0.800.v201903222120.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xpand_2.2.0.v201605260315.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xsd_2.16.0.v20190625-1130.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xsd.edit_2.10.0.v20180706-1143.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend_2.2.0.v201605260315.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.core_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.doc_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.examples_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.ide_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.ide.common_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.lib_2.19.0.v20190902-0728.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.lib.macro_2.19.0.v20190902-0728.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.m2e_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.standalone_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.typesystem.emf_2.2.0.v201605260315.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.activities_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.builder_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.builder.standalone_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.edit_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.shared_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.shared.jdt38_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.ui_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.doc_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ecore_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.generator_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ide_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.java_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.junit4_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.logging_1.2.15.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.m2e_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.purexbase_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.purexbase.ide_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.purexbase.ui_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.smap_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.testing_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.codemining_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.codetemplates_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.codetemplates.ide_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.codetemplates.ui_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.ecore_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.shared_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.testing_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.util_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.ide_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.junit_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.lib_2.19.0.v20190902-0728.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.testing_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.ui_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.ui.testing_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.generator_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.ide_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.ui_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.ui.examples_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.ui.graph_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.wizard_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.freemarker_2.3.22.v20160210-1233.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.gradle.toolingapi_5.6.1.v20190903-1802.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.hamcrest.core_1.3.0.v20180420-1519.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.jacoco.agent_0.8.3.v20190219-1601.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.jacoco.core_0.8.3.v20190219-1601.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.jacoco.report_0.8.3.v20190219-1601.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.jcodings_1.0.18.v20170306-1742.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.jd.ide.eclipse.plugin_2.0.0.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.jogamp.jogl_2.1.0.201902262324/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.jogamp.jogl-windows-amd64_2.1.0.201902262324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.joni_2.1.11.v20170306-1742.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.jsoup_1.8.3.v20181012-1713.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit_4.12.0.v201504281640/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.jupiter.api_5.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.jupiter.engine_5.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.jupiter.migrationsupport_5.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.jupiter.params_5.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.platform.commons_1.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.platform.engine_1.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.platform.launcher_1.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.platform.runner_1.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.platform.suite.api_1.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.junit.vintage.engine_5.5.1.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.objectweb.asm_7.1.0.v20190412-2143.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.objectweb.asm_7.0.0.v20181030-2244.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.objectweb.asm.commons_7.0.0.v20181030-2244.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.objectweb.asm.tree_7.1.0.v20190412-2143.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.objectweb.asm.tree_7.0.0.v20181030-2244.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.opentest4j_1.2.0.v20190826-0900.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.ast_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.core_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.customizations_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.debug_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.django_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.help_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.jython_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.mylyn_0.6.0/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.parser_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.refactoring_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.shared_core_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.shared_interactive_console_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.python.pydev.shared_ui_7.3.0.201908161924/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.sat4j.core_2.3.5.v201308161310.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.sat4j.pb_2.3.5.v201404071733.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.slf4j.api_1.7.2.v20121108-1250.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.slf4j.impl.log4j12_1.7.2.v20131105-2200.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.core_2.2.3.201902262324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.core.ui_2.2.3.201902262324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.examples_1.1.1.201902262324/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.ide_2.2.3.201902262324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.include_1.0.0/ +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.logback_1.0.0.201902262324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.media_2.0.1.201902262324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.media-windows-amd64_2.0.1.201902262324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.synthclipse.scripting_2.2.3.201902262324.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.tukaani.xz_1.8.0.v20180207-1613.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.w3c.css.sac_1.3.1.v200903091627.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.w3c.dom.events_3.0.0.draft20060413_v201105210656.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.w3c.dom.smil_1.0.1.v200903091627.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.w3c.dom.svg_1.1.0.v201011041433.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.antlr.antlr4-runtime.source_4.7.1.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.common.source_2.16.0.v20190625-1131.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.ecore.source_2.19.0.v20190822-1451.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.language.ide.source_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.language.source_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.language.ui.source_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.launch.source_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.launch.ui.source_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.lib.source_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.emf.mwe2.runtime.source_2.11.0.201906111547.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.core.source_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.ide.common.source_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.ide.source_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.lib.macro.source_2.19.0.v20190902-0728.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.lib.source_2.19.0.v20190902-0728.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.m2e.source_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtend.standalone.source_2.19.0.v20190902-1150.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.activities.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.builder.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.builder.standalone.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.edit.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.shared.jdt38.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.shared.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.common.types.ui.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ecore.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.generator.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ide.source_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.java.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.junit4.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.logging.source_1.2.15.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.m2e.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.purexbase.ide.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.purexbase.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.purexbase.ui.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.smap.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.source_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.testing.source_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.codemining.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.codetemplates.ide.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.codetemplates.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.codetemplates.ui.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.ecore.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.shared.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.ui.testing.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.util.source_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.ide.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.junit.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.lib.source_2.19.0.v20190902-0728.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.testing.source_2.19.0.v20190902-0952.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.ui.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xbase.ui.testing.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.generator.source_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.ide.source_2.19.0.v20190902-0737.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.ui.graph.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.ui.source_2.19.0.v20190902-1023.jar +file:/C:/Users/Sixten/.p2/pool/plugins/org.eclipse.xtext.xtext.wizard.source_2.19.0.v20190902-0737.jar diff --git a/.metadata/.plugins/org.eclipse.ui.intro/introstate b/.metadata/.plugins/org.eclipse.ui.intro/introstate new file mode 100644 index 0000000..02f134f --- /dev/null +++ b/.metadata/.plugins/org.eclipse.ui.intro/introstate @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml new file mode 100644 index 0000000..aef53dc --- /dev/null +++ b/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.metadata/.plugins/org.eclipse.wb.core/descriptions/org.eclipse.wb.swing.cached-presentations.dat b/.metadata/.plugins/org.eclipse.wb.core/descriptions/org.eclipse.wb.swing.cached-presentations.dat new file mode 100644 index 0000000..b9aa937 Binary files /dev/null and b/.metadata/.plugins/org.eclipse.wb.core/descriptions/org.eclipse.wb.swing.cached-presentations.dat differ diff --git a/.metadata/.plugins/org.eclipse.wst.jsdt.core/variablesAndContainers.dat b/.metadata/.plugins/org.eclipse.wst.jsdt.core/variablesAndContainers.dat new file mode 100644 index 0000000..3f8e74c Binary files /dev/null and b/.metadata/.plugins/org.eclipse.wst.jsdt.core/variablesAndContainers.dat differ diff --git a/.metadata/.plugins/org.eclipse.xtend.ide/resource.change.registry b/.metadata/.plugins/org.eclipse.xtend.ide/resource.change.registry new file mode 100644 index 0000000..01d633b Binary files /dev/null and b/.metadata/.plugins/org.eclipse.xtend.ide/resource.change.registry differ diff --git a/.metadata/version.ini b/.metadata/version.ini new file mode 100644 index 0000000..7c2ca7c --- /dev/null +++ b/.metadata/version.ini @@ -0,0 +1,3 @@ +#Wed Dec 23 07:03:38 CET 2020 +org.eclipse.core.runtime=2 +org.eclipse.platform=4.13.0.v20190916-1045 diff --git a/playing-coffee/.classpath b/playing-coffee/.classpath new file mode 100644 index 0000000..51a8bba --- /dev/null +++ b/playing-coffee/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/playing-coffee/.project b/playing-coffee/.project new file mode 100644 index 0000000..e526655 --- /dev/null +++ b/playing-coffee/.project @@ -0,0 +1,17 @@ + + + playing-coffee + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/playing-coffee/.settings/org.eclipse.jdt.core.prefs b/playing-coffee/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3a21537 --- /dev/null +++ b/playing-coffee/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/playing-coffee/DMG_ROM.bin b/playing-coffee/DMG_ROM.bin new file mode 100644 index 0000000..afa0ee4 Binary files /dev/null and b/playing-coffee/DMG_ROM.bin differ diff --git a/playing-coffee/bin/playingcoffee/core/CPU.class b/playing-coffee/bin/playingcoffee/core/CPU.class new file mode 100644 index 0000000..b006975 Binary files /dev/null and b/playing-coffee/bin/playingcoffee/core/CPU.class differ diff --git a/playing-coffee/bin/playingcoffee/core/MMU.class b/playing-coffee/bin/playingcoffee/core/MMU.class new file mode 100644 index 0000000..1df082d Binary files /dev/null and b/playing-coffee/bin/playingcoffee/core/MMU.class differ diff --git a/playing-coffee/bin/playingcoffee/core/Registers.class b/playing-coffee/bin/playingcoffee/core/Registers.class new file mode 100644 index 0000000..60292d5 Binary files /dev/null and b/playing-coffee/bin/playingcoffee/core/Registers.class differ diff --git a/playing-coffee/bin/playingcoffee/ui/CPUDebugger$1.class b/playing-coffee/bin/playingcoffee/ui/CPUDebugger$1.class new file mode 100644 index 0000000..431e33d Binary files /dev/null and b/playing-coffee/bin/playingcoffee/ui/CPUDebugger$1.class differ diff --git a/playing-coffee/bin/playingcoffee/ui/CPUDebugger$2.class b/playing-coffee/bin/playingcoffee/ui/CPUDebugger$2.class new file mode 100644 index 0000000..de14b9a Binary files /dev/null and b/playing-coffee/bin/playingcoffee/ui/CPUDebugger$2.class differ diff --git a/playing-coffee/bin/playingcoffee/ui/CPUDebugger.class b/playing-coffee/bin/playingcoffee/ui/CPUDebugger.class new file mode 100644 index 0000000..db6a71a Binary files /dev/null and b/playing-coffee/bin/playingcoffee/ui/CPUDebugger.class differ diff --git a/playing-coffee/src/playingcoffee/core/CPU.java b/playing-coffee/src/playingcoffee/core/CPU.java new file mode 100644 index 0000000..ac2ab94 --- /dev/null +++ b/playing-coffee/src/playingcoffee/core/CPU.java @@ -0,0 +1,112 @@ +// Basic CPU implementation. +// This will be changed in the future. + +package playingcoffee.core; + +public class CPU { + + private final MMU mmu; + + private Registers registers; + + private int cycles = 0; + + public static final int[] INSTRUCTION_CYCLE_COUNT = { + 4, 12, 8, 8, 4, 4, 8, 4, 20, 8, 8, 8, 4, 4, 8, 4, + 4, 12, 8, 8, 4, 4, 8, 4, 12, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 8, 12, 8, 8, 12, 12, 12, 4, 8, 8, 8, 8, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, + 8, 12, 12, 16, 12, 16, 8, 16, 8, 16, 12, 4, 12, 24, 8, 16, + 8, 12, 12, -1, 12, 16, 8, 16, 8, 16, 12, -1, 12, -1, 8, 16, + 12, 12, 8, -1, -1, 16, 8, 16, 16, 4, 16, -1, -1, -1, 8, 16, + 12, 12, 8, 4, -1, 16, 8, 16, 12, 8, 16, 4, -1, -1, 8, 16 + }; + + public static final int[] PREFIXED_CYCLE_COUNT = { + 8, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 8, 8, 16, 8, + }; + + public CPU(final MMU mmu) { + this.mmu = mmu; + + registers = new Registers(); + } + + public Registers getRegisters() { + return registers; + } + + public int getCycles() { + return cycles; + } + + public void cycle() { + if (cycles == 0) { + + int opcode = mmu.read(registers.pc++); + System.out.printf("Fetched opcode: 0x%02x\n", opcode); + + decodeOpcode(opcode); + } + cycles--; + } + + public void decodeOpcode(int opcode) { + // Apply cycle count + cycles += INSTRUCTION_CYCLE_COUNT[opcode]; + + switch (opcode) { + case 0x00: // NOP + break; + + case 0x21: // LD HL, d16 + registers.writeL(mmu.read(registers.pc++)); + registers.writeH(mmu.read(registers.pc++)); + break; + + case 0x31: // LD SP, d16 + registers.sp = mmu.read(registers.pc++) | (mmu.read(registers.pc++) << 8); + break; + + case 0x32: // LD (HL-), A + mmu.write(registers.readA(), registers.readHL()); + registers.writeHL(registers.readHL() - 1); + break; + + case 0xAF: // XOR A + registers.writeA(registers.readA() ^ registers.readA()); + registers.setFlag(Registers.FLAG_Z, registers.readA() == 0); + break; + + case 0xCB: // CB - prefix + decodePrefixedOpcode(mmu.read(registers.pc++)); + break; + + default: + System.err.printf("Unknown opcode: 0x%2x\n", opcode); + } + } + + public void decodePrefixedOpcode(int opcode) { + cycles += INSTRUCTION_CYCLE_COUNT[opcode & 0xF]; + + switch (opcode) { + case 0x7C: + registers.setFlag(Registers.FLAG_Z, (registers.readH() & (1 << 7)) == 0); + registers.setFlag(Registers.FLAG_N, false); + registers.setFlag(Registers.FLAG_H, true); + break; + + default: + System.err.printf("Unknown opcode: 0xcb%2x\n", opcode); + } + } +} diff --git a/playing-coffee/src/playingcoffee/core/MMU.java b/playing-coffee/src/playingcoffee/core/MMU.java new file mode 100644 index 0000000..e7b98a8 --- /dev/null +++ b/playing-coffee/src/playingcoffee/core/MMU.java @@ -0,0 +1,34 @@ +package playingcoffee.core; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MMU { + + private int ram[]; + + public void loadBootRom() { + byte[] data; + try { + data = Files.readAllBytes(Paths.get("DMG_ROM.bin")); + for (int i = 0; i < data.length; i++) { + ram[i] = Byte.toUnsignedInt(data[i]); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public MMU() { + ram = new int[0x10000]; + } + + public void write(int value, int address) { + ram[address] = value; + } + + public int read(int address) { + return ram[address]; + } +} diff --git a/playing-coffee/src/playingcoffee/core/Registers.java b/playing-coffee/src/playingcoffee/core/Registers.java new file mode 100644 index 0000000..1554b58 --- /dev/null +++ b/playing-coffee/src/playingcoffee/core/Registers.java @@ -0,0 +1,129 @@ +package playingcoffee.core; + +public class Registers { + + private int a, f; + private int b, c; + private int d, e; + private int h, l; + + public int pc; + public int sp; + + public static final int FLAG_Z = 1 << 7; + public static final int FLAG_N = 1 << 6; + public static final int FLAG_H = 1 << 5; + public static final int FLAG_C = 1 << 4; + + public void setFlag(int flag, boolean value) { + if (value) + f |= flag; + else + f &= ~flag; + } + + public boolean getFlag(int flag) { + return (f & flag) != 0; + } + + public int readAF() { + return a << 8 | f; + } + + public int readBC() { + return b << 8 | c; + } + + public int readDE() { + return d << 8 | e; + } + + public int readHL() { + return h << 8 | l; + } + + public void writeAF(int af) { + a = (af >> 8) & 0xFF; + f = af & 0xFF; + } + + public void writeBC(int bc) { + b = (bc >> 8) & 0xFF; + c = bc & 0xFF; + } + + public void writeDE(int de) { + d = (de >> 8) & 0xFF; + e = de & 0xFF; + } + + public void writeHL(int hl) { + h = (hl >> 8) & 0xFF; + l = hl & 0xFF; + } + + public int readA() { + return a; + } + + public void writeA(int a) { + this.a = a; + } + + public int readF() { + return f; + } + + public void writeF(int f) { + this.f = f; + } + + public int readB() { + return b; + } + + public void writeB(int b) { + this.b = b; + } + + public int readC() { + return c; + } + + public void writeC(int c) { + this.c = c; + } + + public int readD() { + return d; + } + + public void writeD(int d) { + this.d = d; + } + + public int readE() { + return e; + } + + public void writeE(int e) { + this.e = e; + } + + public int readH() { + return h; + } + + public void writeH(int h) { + this.h = h; + } + + public int readL() { + return l; + } + + public void writeL(int l) { + this.l = l; + } + +} diff --git a/playing-coffee/src/playingcoffee/ui/CPUDebugger.java b/playing-coffee/src/playingcoffee/ui/CPUDebugger.java new file mode 100644 index 0000000..c9a71da --- /dev/null +++ b/playing-coffee/src/playingcoffee/ui/CPUDebugger.java @@ -0,0 +1,158 @@ +package playingcoffee.ui; + +import java.awt.EventQueue; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.DefaultListModel; +import javax.swing.GroupLayout; +import javax.swing.GroupLayout.Alignment; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.LayoutStyle.ComponentPlacement; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import playingcoffee.core.CPU; +import playingcoffee.core.MMU; +import playingcoffee.core.Registers; + +import javax.swing.JCheckBox; + +public class CPUDebugger { + + private JFrame frmCpuDebugger; + private JList registerList; + + private JCheckBox chckbxZero; + private JCheckBox chckbxNegative; + private JCheckBox chckbxHalfCarry; + private JCheckBox chckbxCarry; + + private MMU mmu; + private CPU cpu; + + public static void main(String[] args) { + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + CPUDebugger window = new CPUDebugger(); + window.frmCpuDebugger.setVisible(true); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + + public CPUDebugger() { + initialize(); + + mmu = new MMU(); + cpu = new CPU(mmu); + + mmu.loadBootRom(); + + updateValues(); + } + + private void updateValues() { + DefaultListModel model = new DefaultListModel(); + model.addElement("AF: 0x" + Integer.toHexString(cpu.getRegisters().readAF())); + model.addElement("BC: 0x" + Integer.toHexString(cpu.getRegisters().readBC())); + model.addElement("DE: 0x" + Integer.toHexString(cpu.getRegisters().readDE())); + model.addElement("HL: 0x" + Integer.toHexString(cpu.getRegisters().readHL())); + model.addElement("PC: 0x" + Integer.toHexString(cpu.getRegisters().pc)); + model.addElement("SP: 0x" + Integer.toHexString(cpu.getRegisters().sp)); + + chckbxZero.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_Z)); + chckbxNegative.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_N)); + chckbxHalfCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_H)); + chckbxCarry.setSelected(cpu.getRegisters().getFlag(Registers.FLAG_C)); + + registerList.setModel(model); + } + + private void initialize() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + frmCpuDebugger = new JFrame(); + frmCpuDebugger.setTitle("CPU Debugger"); + frmCpuDebugger.setBounds(100, 100, 350, 350); + frmCpuDebugger.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JButton btnStep = new JButton("Step"); + btnStep.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + do { cpu.cycle(); } while (cpu.getCycles() != 0); + updateValues(); + } + }); + + JButton btnReset = new JButton("Reset"); + + JLabel lblRegisters = new JLabel("Registers:"); + + registerList = new JList(); + + chckbxZero = new JCheckBox("Zero"); + chckbxNegative = new JCheckBox("Negative"); + chckbxHalfCarry = new JCheckBox("Half Carry"); + chckbxCarry = new JCheckBox("Carry"); + + GroupLayout groupLayout = new GroupLayout(frmCpuDebugger.getContentPane()); + groupLayout.setHorizontalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(lblRegisters) + .addComponent(btnStep) + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 148, GroupLayout.PREFERRED_SIZE)) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.RELATED, 52, Short.MAX_VALUE) + .addComponent(btnReset) + .addContainerGap()) + .addGroup(groupLayout.createSequentialGroup() + .addPreferredGap(ComponentPlacement.UNRELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addComponent(chckbxZero) + .addComponent(chckbxNegative) + .addComponent(chckbxHalfCarry) + .addComponent(chckbxCarry)) + .addGap(73)))) + ); + groupLayout.setVerticalGroup( + groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addContainerGap() + .addComponent(lblRegisters) + .addPreferredGap(ComponentPlacement.RELATED) + .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(registerList, GroupLayout.PREFERRED_SIZE, 195, GroupLayout.PREFERRED_SIZE) + .addGap(51) + .addGroup(groupLayout.createParallelGroup(Alignment.BASELINE) + .addComponent(btnReset) + .addComponent(btnStep))) + .addGroup(groupLayout.createSequentialGroup() + .addComponent(chckbxZero) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxNegative) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxHalfCarry) + .addPreferredGap(ComponentPlacement.UNRELATED) + .addComponent(chckbxCarry))) + .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + frmCpuDebugger.getContentPane().setLayout(groupLayout); + } +}