Replaced card array with Optional<Card> array

This commit is contained in:
Brendan Robert
2014-09-20 11:10:49 -05:00
parent f3245a4245
commit 776dbafbdc
10 changed files with 60 additions and 100 deletions

View File

@@ -40,6 +40,7 @@ import java.io.IOException;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -133,10 +134,8 @@ public class Apple2e extends Computer {
getMemory().configureActiveMemory(); getMemory().configureActiveMemory();
getVideo().configureVideoMode(); getVideo().configureVideoMode();
getCpu().reset(); getCpu().reset();
for (Card c : getMemory().getAllCards()) { for (Optional<Card> c : getMemory().getAllCards()) {
if (c != null) { c.ifPresent(Card::reset);
c.reset();
}
} }
resume(); resume();
@@ -163,10 +162,8 @@ public class Apple2e extends Computer {
getMemory().configureActiveMemory(); getMemory().configureActiveMemory();
getVideo().configureVideoMode(); getVideo().configureVideoMode();
getCpu().reset(); getCpu().reset();
for (Card c : getMemory().getAllCards()) { for (Optional<Card> c : getMemory().getAllCards()) {
if (c != null) { c.ifPresent(Card::reset);
c.reset();
}
} }
getCpu().resume(); getCpu().resume();
resume(); resume();

View File

@@ -160,22 +160,15 @@ abstract public class RAM128k extends RAM {
} else { } else {
// Enable C1-CF to point to slots // Enable C1-CF to point to slots
for (int slot = 1; slot <= 7; slot++) { for (int slot = 1; slot <= 7; slot++) {
Card c = getCard(slot); PagedMemory page = getCard(slot).map(Card::getCxRom).orElse(blank);
if (c != null) { activeRead.setBanks(0, 1, 0x0c0 + slot, page);
// Enable card slot ROM
activeRead.setBanks(0, 1, 0x0C0 + slot, c.getCxRom());
if (getActiveSlot() == slot) {
activeRead.setBanks(0, 8, 0x0C8, c.getC8Rom());
}
} else {
// Disable card slot ROM (TODO: floating bus)
activeRead.set(0x0C0 + slot, blank.get(0));
}
} }
if (getActiveSlot() == 0) { if (getActiveSlot() == 0) {
for (int i = 0x0C8; i < 0x0D0; i++) { for (int i = 0x0C8; i < 0x0D0; i++) {
activeRead.set(i, blank.get(0)); activeRead.set(i, blank.get(0));
} }
} else {
getCard(getActiveSlot()).ifPresent(c -> activeRead.setBanks(0,8,0x0c8, c.getC8Rom()));
} }
if (SoftSwitches.SLOTC3ROM.isOff()) { if (SoftSwitches.SLOTC3ROM.isOff()) {
// Enable C3 to point to internal ROM // Enable C3 to point to internal ROM

View File

@@ -24,6 +24,7 @@ import jace.config.Reconfigurable;
import jace.library.MediaLibrary; import jace.library.MediaLibrary;
import jace.state.StateManager; import jace.state.StateManager;
import java.io.IOException; import java.io.IOException;
import java.util.Optional;
/** /**
* This is a very generic stub of a Computer and provides a generic set of * This is a very generic stub of a Computer and provides a generic set of
@@ -61,11 +62,8 @@ public abstract class Computer implements Reconfigurable {
} }
public void notifyVBLStateChanged(boolean state) { public void notifyVBLStateChanged(boolean state) {
for (Card c : getMemory().cards) { for (Optional<Card> c : getMemory().cards) {
if (c == null) { c.ifPresent(card -> card.notifyVBLStateChanged(state));
continue;
}
c.notifyVBLStateChanged(state);
} }
if (state && stateManager != null) { if (state && stateManager != null) {
stateManager.notifyVBLActive(); stateManager.notifyVBLActive();

View File

@@ -21,10 +21,9 @@ package jace.core;
import jace.apple2e.SoftSwitches; import jace.apple2e.SoftSwitches;
import jace.apple2e.Speaker; import jace.apple2e.Speaker;
import jace.config.ConfigurableField; import jace.config.ConfigurableField;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Map; import java.util.Optional;
import java.util.Set; import java.util.Set;
/** /**
@@ -78,7 +77,7 @@ public class Motherboard extends TimedDevice {
@Override @Override
public void tick() { public void tick() {
Card[] cards = computer.getMemory().getAllCards(); Optional<Card>[] cards = computer.getMemory().getAllCards();
try { try {
clockCounter--; clockCounter--;
computer.getCpu().doTick(); computer.getCpu().doTick();
@@ -88,26 +87,8 @@ public class Motherboard extends TimedDevice {
clockCounter = cpuPerClock; clockCounter = cpuPerClock;
computer.getVideo().doTick(); computer.getVideo().doTick();
// Unrolled loop since this happens so often // Unrolled loop since this happens so often
if (cards[0] != null) { for (Optional<Card> card : cards) {
cards[0].doTick(); card.ifPresent(Card::doTick);
}
if (cards[1] != null) {
cards[1].doTick();
}
if (cards[2] != null) {
cards[2].doTick();
}
if (cards[3] != null) {
cards[3].doTick();
}
if (cards[4] != null) {
cards[4].doTick();
}
if (cards[5] != null) {
cards[5].doTick();
}
if (cards[6] != null) {
cards[6].doTick();
} }
miscDevices.stream().forEach((m) -> { miscDevices.stream().forEach((m) -> {
m.doTick(); m.doTick();
@@ -186,12 +167,13 @@ public class Motherboard extends TimedDevice {
public boolean suspend() { public boolean suspend() {
synchronized (resume) { synchronized (resume) {
resume.clear(); resume.clear();
for (Card c : computer.getMemory().getAllCards()) { for (Optional<Card> c : computer.getMemory().getAllCards()) {
if (c == null || !c.suspendWithCPU() || !c.isRunning()) { if (!c.isPresent()) continue;
if (!c.get().suspendWithCPU() || !c.get().isRunning()) {
continue; continue;
} }
if (c.suspend()) { if (c.get().suspend()) {
resume.add(c); resume.add(c.get());
} }
} }
} }

View File

@@ -23,6 +23,7 @@ import jace.config.Reconfigurable;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
/** /**
* RAM is a 64K address space of paged memory. It also manages sets of memory * RAM is a 64K address space of paged memory. It also manages sets of memory
@@ -38,7 +39,7 @@ public abstract class RAM implements Reconfigurable {
public List<RAMListener> listeners; public List<RAMListener> listeners;
public List<RAMListener>[] listenerMap; public List<RAMListener>[] listenerMap;
public List<RAMListener>[] ioListenerMap; public List<RAMListener>[] ioListenerMap;
protected Card[] cards; protected Optional<Card>[] cards;
// card 0 = 80 column card firmware / system rom // card 0 = 80 column card firmware / system rom
public int activeSlot = 0; public int activeSlot = 0;
protected final Computer computer; protected final Computer computer;
@@ -49,7 +50,10 @@ public abstract class RAM implements Reconfigurable {
public RAM(Computer computer) { public RAM(Computer computer) {
this.computer = computer; this.computer = computer;
listeners = new ArrayList<>(); listeners = new ArrayList<>();
cards = new Card[8]; cards = new Optional[8];
for (int i=0; i < 8; i ++) {
cards[i] = Optional.empty();
}
refreshListenerMap(); refreshListenerMap();
} }
@@ -66,19 +70,19 @@ public abstract class RAM implements Reconfigurable {
return activeSlot; return activeSlot;
} }
public Card[] getAllCards() { public Optional<Card>[] getAllCards() {
return cards; return cards;
} }
public Card getCard(int slot) { public Optional<Card> getCard(int slot) {
if (slot >= 1 && slot <= 7) { if (slot >= 1 && slot <= 7) {
return cards[slot]; return cards[slot];
} }
return null; return Optional.empty();
} }
public void addCard(Card c, int slot) { public void addCard(Card c, int slot) {
cards[slot] = c; cards[slot] = Optional.of(c);
c.setSlot(slot); c.setSlot(slot);
c.attach(); c.attach();
} }
@@ -90,11 +94,9 @@ public abstract class RAM implements Reconfigurable {
} }
public void removeCard(int slot) { public void removeCard(int slot) {
if (cards[slot] != null) { cards[slot].ifPresent(Card::suspend);
cards[slot].suspend(); cards[slot].ifPresent(Card::detach);
cards[slot].detach(); cards[slot] = Optional.empty();
}
cards[slot] = null;
} }
abstract public void configureActiveMemory(); abstract public void configureActiveMemory();

View File

@@ -31,6 +31,7 @@ import jace.hardware.SmartportDriver;
import jace.library.MediaConsumer; import jace.library.MediaConsumer;
import jace.library.MediaConsumerParent; import jace.library.MediaConsumerParent;
import java.io.IOException; import java.io.IOException;
import java.util.Optional;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
@@ -135,8 +136,8 @@ public class CardMassStorage extends Card implements MediaConsumerParent {
// This is a convenience to boot a hard-drive if the emulator has started waiting for a currentDisk // This is a convenience to boot a hard-drive if the emulator has started waiting for a currentDisk
currentDrive = drive1; currentDrive = drive1;
getCurrentDisk().boot0(getSlot(), computer); getCurrentDisk().boot0(getSlot(), computer);
Card[] cards = computer.getMemory().getAllCards(); Optional<Card>[] cards = computer.getMemory().getAllCards();
computer.getMotherboard().cancelSpeedRequest(cards[6]); cards[6].ifPresent(card->computer.getMotherboard().cancelSpeedRequest(card));
} }
attach(); attach();
} catch (IOException ex) { } catch (IOException ex) {

View File

@@ -25,6 +25,7 @@ import jace.core.Card;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.GridBagConstraints; import java.awt.GridBagConstraints;
import java.awt.GridBagLayout; import java.awt.GridBagLayout;
import java.util.Optional;
import javax.swing.JPanel; import javax.swing.JPanel;
/** /**
@@ -79,21 +80,19 @@ public class MediaLibrary implements Reconfigurable {
return; return;
} }
userInterface.Drives.removeAll(); userInterface.Drives.removeAll();
for (Card card : Emulator.computer.memory.getAllCards()) { for (Optional<Card> card : Emulator.computer.memory.getAllCards()) {
if (card == null || !(card instanceof MediaConsumerParent)) { card.filter(c -> c instanceof MediaConsumerParent).ifPresent(parent -> {
continue; GridBagLayout layout = (GridBagLayout) userInterface.Drives.getLayout();
} GridBagConstraints c = new GridBagConstraints();
MediaConsumerParent parent = (MediaConsumerParent) card; for (MediaConsumer consumer : ((MediaConsumerParent) parent).getConsumers()) {
GridBagLayout layout = (GridBagLayout) userInterface.Drives.getLayout(); DriveIcon drive = new DriveIcon(consumer);
GridBagConstraints c = new GridBagConstraints(); drive.setSize(100, 70);
for (MediaConsumer consumer : parent.getConsumers()) { drive.setPreferredSize(new Dimension(100, 70));
DriveIcon drive = new DriveIcon(consumer); c.gridwidth = GridBagConstraints.REMAINDER;
drive.setSize(100, 70); layout.setConstraints(drive, c);
drive.setPreferredSize(new Dimension(100, 70)); userInterface.Drives.add(drive);
c.gridwidth = GridBagConstraints.REMAINDER; }
layout.setConstraints(drive, c); });
userInterface.Drives.add(drive);
}
} }
userInterface.Drives.revalidate(); userInterface.Drives.revalidate();
} }
@@ -119,7 +118,7 @@ public class MediaLibrary implements Reconfigurable {
form.setCreate(false); form.setCreate(false);
form.populate(entry); form.populate(entry);
} }
form.setParentLibary(library); form.setParentLibary(library);
return form; return form;
} }
} }

View File

@@ -24,6 +24,7 @@ import jace.core.Computer;
import jace.core.Motherboard; import jace.core.Motherboard;
import jace.hardware.CardExt80Col; import jace.hardware.CardExt80Col;
import jace.hardware.CardMockingboard; import jace.hardware.CardMockingboard;
import java.util.Optional;
/** /**
* *
@@ -79,19 +80,15 @@ public class PlaybackEngine extends Computer {
@Override @Override
public void coldStart() { public void coldStart() {
for (Card c : getMemory().getAllCards()) { for (Optional<Card> c : getMemory().getAllCards()) {
if (c != null) { c.ifPresent(Card::reset);
c.reset();
}
} }
} }
@Override @Override
public void warmStart() { public void warmStart() {
for (Card c : getMemory().getAllCards()) { for (Optional<Card> c : getMemory().getAllCards()) {
if (c != null) { c.ifPresent(Card::reset);
c.reset();
}
} }
} }

View File

@@ -1,5 +1,5 @@
#Generated by Maven #Generated by Maven
#Wed Sep 17 00:59:53 CDT 2014 #Sat Sep 20 01:41:50 CDT 2014
version=2.0-SNAPSHOT version=2.0-SNAPSHOT
groupId=org.badvision groupId=org.badvision
artifactId=jace artifactId=jace

View File

@@ -114,6 +114,7 @@ jace/hardware/massStorage/DirectoryNode.class
jace/cheat/MetaCheatForm$2.class jace/cheat/MetaCheatForm$2.class
jace/hardware/ConsoleProbe$KeyReader.class jace/hardware/ConsoleProbe$KeyReader.class
jace/hardware/massStorage/FreespaceBitmap.class jace/hardware/massStorage/FreespaceBitmap.class
jace/tracker/PlaybackEngine$1.class
jace/apple2e/MOS65C02$SMBCommand.class jace/apple2e/MOS65C02$SMBCommand.class
jace/hardware/massStorage/DiskNode.class jace/hardware/massStorage/DiskNode.class
jace/hardware/mockingboard/TimedGenerator.class jace/hardware/mockingboard/TimedGenerator.class
@@ -145,7 +146,6 @@ jace/library/MediaLibraryUI$tocOptions$3.class
jace/apple2e/Apple2e.class jace/apple2e/Apple2e.class
jace/cheat/MemorySpy$6.class jace/cheat/MemorySpy$6.class
jace/hardware/PassportMidiInterface$PTMTimer.class jace/hardware/PassportMidiInterface$PTMTimer.class
jace/hardware/DiskIIDrive$1.class
jace/library/DriveIcon.class jace/library/DriveIcon.class
jace/EmulatorUILogic$2.class jace/EmulatorUILogic$2.class
jace/cheat/MetaCheatForm$11.class jace/cheat/MetaCheatForm$11.class
@@ -157,7 +157,6 @@ jace/cheat/MetaCheatForm$4.class
jace/apple2e/SoftSwitches$1.class jace/apple2e/SoftSwitches$1.class
jace/config/ClassSelection$1.class jace/config/ClassSelection$1.class
jace/hardware/CardExt80Col.class jace/hardware/CardExt80Col.class
jace/ui/EmulatorFrame$2.class
jace/library/MediaLibraryUI$tocOptions$4.class jace/library/MediaLibraryUI$tocOptions$4.class
jace/hardware/ConsoleProbe$ScreenReader.class jace/hardware/ConsoleProbe$ScreenReader.class
jace/config/FileComponent$2.class jace/config/FileComponent$2.class
@@ -167,8 +166,6 @@ jace/hardware/Joystick$1.class
jace/library/MediaEditUI$5.class jace/library/MediaEditUI$5.class
jace/tracker/EditableLabel.class jace/tracker/EditableLabel.class
jace/apple2e/VideoDHGR.class jace/apple2e/VideoDHGR.class
jace/ui/MainFrame$1.class
jace/ui/AbstractEmulatorFrame$4.class
jace/hardware/CardRamworks$1.class jace/hardware/CardRamworks$1.class
jace/apple2e/VideoDHGR$1.class jace/apple2e/VideoDHGR$1.class
jace/cheat/MetaCheatForm$10.class jace/cheat/MetaCheatForm$10.class
@@ -178,7 +175,6 @@ jace/core/SoundMixer$1.class
jace/JaceApplication.class jace/JaceApplication.class
jace/tracker/EditableLabel$2$1.class jace/tracker/EditableLabel$2$1.class
jace/applesoft/Command$ByteOrToken.class jace/applesoft/Command$ByteOrToken.class
jace/cheat/MemorySpyGrid$7.class
jace/config/Configuration$ConfigNode.class jace/config/Configuration$ConfigNode.class
jace/state/Stateful.class jace/state/Stateful.class
jace/cheat/MetaCheatForm$6.class jace/cheat/MetaCheatForm$6.class
@@ -196,7 +192,6 @@ jace/apple2e/MOS65C02$BBRCommand.class
jace/apple2e/VideoDHGR$7.class jace/apple2e/VideoDHGR$7.class
jace/library/TocTreeModel$1.class jace/library/TocTreeModel$1.class
jace/ui/DebuggerPanel$11.class jace/ui/DebuggerPanel$11.class
jace/cheat/MetaCheats$2$1.class
jace/state/ObjectGraphNode.class jace/state/ObjectGraphNode.class
jace/hardware/massStorage/DirectoryNode$1.class jace/hardware/massStorage/DirectoryNode$1.class
jace/JaceUIController.class jace/JaceUIController.class
@@ -219,7 +214,6 @@ jace/hardware/Joystick$3.class
jace/cheat/MemorySpy$2.class jace/cheat/MemorySpy$2.class
jace/cheat/MemorySpy$9.class jace/cheat/MemorySpy$9.class
jace/hardware/CardSSC$2.class jace/hardware/CardSSC$2.class
jace/cheat/MemorySpyGrid$8.class
jace/core/Computer.class jace/core/Computer.class
jace/hardware/massStorage/FileNode$1.class jace/hardware/massStorage/FileNode$1.class
jace/apple2e/softswitch/IntC8SoftSwitch$1.class jace/apple2e/softswitch/IntC8SoftSwitch$1.class
@@ -292,7 +286,6 @@ jace/hardware/mockingboard/PSG$1.class
jace/hardware/CardRamworks$BankType.class jace/hardware/CardRamworks$BankType.class
jace/tracker/PlaybackEngine.class jace/tracker/PlaybackEngine.class
jace/apple2e/VideoNTSC$2.class jace/apple2e/VideoNTSC$2.class
jace/cheat/MemorySpyGrid$6.class
jace/apple2e/Speaker.class jace/apple2e/Speaker.class
jace/ui/ScreenCanvas.class jace/ui/ScreenCanvas.class
jace/config/IntegerComponent.class jace/config/IntegerComponent.class
@@ -323,7 +316,6 @@ jace/apple2e/VideoNTSC$3.class
jace/library/MediaLibraryUI$tocOptions.class jace/library/MediaLibraryUI$tocOptions.class
jace/hardware/ConsoleProbe$1.class jace/hardware/ConsoleProbe$1.class
jace/hardware/ProdosDriver$MLI_RETURN.class jace/hardware/ProdosDriver$MLI_RETURN.class
jace/cheat/MemorySpyGrid$5.class
jace/cheat/MetaCheats.class jace/cheat/MetaCheats.class
jace/hardware/massStorage/FileNode$FileType.class jace/hardware/massStorage/FileNode$FileType.class
jace/config/DynamicSelectComponent.class jace/config/DynamicSelectComponent.class
@@ -331,7 +323,6 @@ jace/core/SoftSwitch$1.class
jace/hardware/CardRamworks.class jace/hardware/CardRamworks.class
jace/library/MediaLibraryUI$8.class jace/library/MediaLibraryUI$8.class
jace/ui/DebuggerPanel$7.class jace/ui/DebuggerPanel$7.class
jace/cheat/MemorySpyGrid$4.class
jace/config/ISelection.class jace/config/ISelection.class
jace/apple2e/MOS65C02$AddressCalculator.class jace/apple2e/MOS65C02$AddressCalculator.class
jace/library/MediaLibraryUI$9.class jace/library/MediaLibraryUI$9.class