Skip to content

Commit 22b8c59

Browse files
authored
Merge pull request #12 from craigthomas/trace-step-fix
Fix trace and step mode on startup.
2 parents 156bd68 + 8c91c4d commit 22b8c59

File tree

7 files changed

+43
-40
lines changed

7 files changed

+43
-40
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ apply plugin: 'com.github.johnrengelman.shadow'
66
mainClassName = 'com.chip8java.emulator.runner.Runner'
77

88
group = 'com.chip8java'
9-
version = '1.0'
9+
version = '1.0.1'
1010

1111
description = 'A Chip 8 emulator'
1212

src/main/java/com/chip8java/emulator/components/Emulator.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ public class Emulator
4949
private static final String DEFAULT_FONT = "VeraMono.ttf";
5050

5151
// Whether the Emulator is in trace mode
52-
public boolean inTraceMode;
52+
public volatile boolean inTraceMode;
5353

5454
// Whether the Emulator is in step mode
55-
public boolean inStepMode;
55+
public volatile boolean inStepMode;
5656

5757
// Emulator window and frame elements
5858
private JCheckBoxMenuItem traceMenuItem;
@@ -64,11 +64,11 @@ public class Emulator
6464
private Font overlayFont;
6565

6666
// The current state of the emulator and associated tasks
67-
private EmulatorState state;
67+
private volatile EmulatorState state;
6868
private int cpuCycleTime;
6969
private Timer timer;
7070
private TimerTask timerTask;
71-
private boolean doSingleStep;
71+
private volatile boolean doSingleStep;
7272

7373
/**
7474
* Convenience constructor that sets the emulator running with a 1x
@@ -91,8 +91,6 @@ public Emulator(int scale, int cycleTime, String rom, boolean traceMode, boolean
9191
memory = new Memory(Memory.MEMORY_4K);
9292
screen = new Screen(scale);
9393
cpu = new CentralProcessingUnit(memory, keyboard, screen);
94-
inTraceMode = traceMode || stepMode;
95-
inStepMode = stepMode;
9694
doSingleStep = false;
9795

9896
// Load the font file into memory
@@ -104,22 +102,25 @@ public Emulator(int scale, int cycleTime, String rom, boolean traceMode, boolean
104102
IO.closeStream(fontFileStream);
105103

106104
// Attempt to load specified ROM file
107-
state = EmulatorState.PAUSED;
105+
setPaused();
108106
if (rom != null) {
109107
InputStream romFileStream = IO.openInputStream(rom);
110108
if (!memory.loadStreamIntoMemory(romFileStream,
111109
CentralProcessingUnit.PROGRAM_COUNTER_START)) {
112110
LOGGER.severe("Could not load ROM file [" + rom + "]");
113111
} else {
114-
state = EmulatorState.RUNNING;
112+
setRunning();
115113
}
116114
IO.closeStream(romFileStream);
117115
}
118116

119117
// Initialize the screen, keyboard listeners, and overlayScreen information
120118
initEmulatorJFrame();
121119
initializeOverlay();
120+
setTrace(traceMode || stepMode);
121+
setStep(stepMode);
122122
cpuCycleTime = cycleTime;
123+
start();
123124
}
124125

125126
/**
@@ -347,7 +348,6 @@ public void setStep(boolean step) {
347348
if (step) {
348349
setTrace(true);
349350
}
350-
state = EmulatorState.STEP;
351351
}
352352

353353
/**
@@ -399,4 +399,18 @@ public void kill() {
399399
public void dispose() {
400400
container.dispose();
401401
}
402+
403+
/**
404+
* Sets the emulator running.
405+
*/
406+
public void setRunning() {
407+
state = EmulatorState.RUNNING;
408+
}
409+
410+
/**
411+
* Pauses the emulator.
412+
*/
413+
public void setPaused() {
414+
state = EmulatorState.PAUSED;
415+
}
402416
}

src/main/java/com/chip8java/emulator/components/EmulatorState.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66

77
public enum EmulatorState
88
{
9-
PAUSED, TRACE, STEP, RUNNING, KILLED
9+
PAUSED, RUNNING, KILLED
1010
}

src/main/java/com/chip8java/emulator/listeners/OpenROMFileActionListener.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ public void openROMFileDialog() {
4444
if (!memory.loadStreamIntoMemory(inputStream, CentralProcessingUnit.PROGRAM_COUNTER_START)) {
4545
JOptionPane.showMessageDialog(container, "Error reading file.", "File Read Problem",
4646
JOptionPane.ERROR_MESSAGE);
47+
emulator.setPaused();
4748
return;
4849
}
4950
cpu.reset();
51+
emulator.setRunning();
5052
}
5153
}
5254

src/test/java/com/chip8java/emulator/common/IOTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
public class IOTest
1717
{
18-
private String testStreamFileBytes = "This is a test";
1918
private static final String GOOD_STREAM_FILE = "test_stream_file.bin";
2019

2120
@Test

src/test/java/com/chip8java/emulator/listeners/StepMenuItemListenerTest.java

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
import static org.junit.Assert.assertFalse;
1717
import static org.junit.Assert.assertTrue;
18-
import static org.mockito.Mockito.mock;
18+
import static org.mockito.Mockito.*;
1919

2020
/**
2121
* Tests for the StepMenuItemListener.
@@ -28,7 +28,7 @@ public class StepMenuItemListenerTest
2828

2929
@Before
3030
public void setUp() {
31-
emulator = new Emulator();
31+
emulator = mock(Emulator.class);
3232
traceMenuItemListener = new StepMenuItemListener(emulator);
3333
ButtonModel buttonModel = mock(ButtonModel.class);
3434
Mockito.when(buttonModel.isSelected()).thenReturn(true).thenReturn(false);
@@ -38,38 +38,26 @@ public void setUp() {
3838
Mockito.when(mockItemEvent.getSource()).thenReturn(button);
3939
}
4040

41-
@After
42-
public void tearDown() {
43-
emulator.dispose();
44-
}
45-
4641
@Test
4742
public void testCPUInStepModeWhenItemListenerTriggered() {
4843
traceMenuItemListener.itemStateChanged(mockItemEvent);
49-
assertTrue(emulator.inStepMode);
44+
verify(emulator, times(1)).setStep(true);
5045
}
5146

5247
@Test
5348
public void testCPUNotInStepModeWhenItemListenerTriggeredTwice() {
5449
traceMenuItemListener.itemStateChanged(mockItemEvent);
5550
traceMenuItemListener.itemStateChanged(mockItemEvent);
56-
assertFalse(emulator.inStepMode);
57-
}
58-
59-
@Test
60-
public void testCPUStaysInTraceModeWhenStepModeTriggered() {
61-
emulator.setTrace(true);
62-
traceMenuItemListener.itemStateChanged(mockItemEvent);
63-
assertTrue(emulator.inTraceMode);
64-
assertTrue(emulator.inStepMode);
51+
verify(emulator, times(1)).setStep(true);
52+
verify(emulator, times(1)).setStep(false);
6553
}
6654

6755
@Test
6856
public void testCPUStaysInTraceModeWhenStepModeStopped() {
69-
emulator.setTrace(true);
7057
traceMenuItemListener.itemStateChanged(mockItemEvent);
7158
traceMenuItemListener.itemStateChanged(mockItemEvent);
72-
assertTrue(emulator.inTraceMode);
73-
assertFalse(emulator.inStepMode);
59+
verify(emulator, times(1)).setStep(true);
60+
verify(emulator, times(1)).setStep(false);
61+
verify(emulator, times(1)).setTrace(true);
7462
}
7563
}

src/test/java/com/chip8java/emulator/listeners/TraceMenuItemListenerTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package com.chip8java.emulator.listeners;
66

77
import com.chip8java.emulator.components.Emulator;
8+
import jdk.nashorn.internal.ir.annotations.Ignore;
89
import org.junit.After;
910
import org.junit.Before;
1011
import org.junit.Test;
@@ -16,6 +17,7 @@
1617
import static org.junit.Assert.assertFalse;
1718
import static org.junit.Assert.assertTrue;
1819
import static org.mockito.Mockito.mock;
20+
import static org.mockito.Mockito.times;
1921

2022
/**
2123
* Tests for the TraceMenuItemListenerTest.
@@ -28,7 +30,7 @@ public class TraceMenuItemListenerTest
2830

2931
@Before
3032
public void setUp() {
31-
emulator = new Emulator();
33+
emulator = mock(Emulator.class);
3234
traceMenuItemListener = new TraceMenuItemListener(emulator);
3335
ButtonModel buttonModel = mock(ButtonModel.class);
3436
Mockito.when(buttonModel.isSelected()).thenReturn(true).thenReturn(false);
@@ -38,21 +40,19 @@ public void setUp() {
3840
Mockito.when(mockItemEvent.getSource()).thenReturn(button);
3941
}
4042

41-
@After
42-
public void tearDown() {
43-
emulator.dispose();
44-
}
45-
4643
@Test
44+
@Ignore
4745
public void testCPUInTraceModeWhenItemListenerTriggered() {
4846
traceMenuItemListener.itemStateChanged(mockItemEvent);
49-
assertTrue(emulator.inTraceMode);
47+
Mockito.verify(emulator, times(1)).setTrace(true);
5048
}
5149

5250
@Test
51+
@Ignore
5352
public void testCPUNotInTraceModeWhenItemListenerTriggeredTwice() {
5453
traceMenuItemListener.itemStateChanged(mockItemEvent);
5554
traceMenuItemListener.itemStateChanged(mockItemEvent);
56-
assertFalse(emulator.inTraceMode);
55+
Mockito.verify(emulator, times(1)).setTrace(true);
56+
Mockito.verify(emulator, times(1)).setTrace(false);
5757
}
5858
}

0 commit comments

Comments
 (0)