diff --git a/Emulator_Pom1/apple1/Memory.java b/Emulator_Pom1/apple1/Memory.java
new file mode 100644
index 0000000..42b7eaa
--- /dev/null
+++ b/Emulator_Pom1/apple1/Memory.java
@@ -0,0 +1,223 @@
+/*
+ * Memory.java - memory v 0.1
+ * Copyright (C) 2000 VERHILLE Arnaud
+ * gist@wanadoo.fr
+ * http://www.chez.com/apple1/
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+package apple1;
+
+import java.net.URL;
+import java.io.FileInputStream;
+import java.io.DataInputStream;
+
+/**
+ *
+ * This is a simple Memory int[0x10000] object.
+ *
+ * @author VERHILLE Arnaud
+ * @created 21 octobre 2000
+ */
+public class Memory {
+ private boolean ram8k;
+ private boolean writeInRom;
+ private boolean appletMode = false;
+ private int[] mem = new int[0x10000];
+ private Pia6820 pia;
+ private URL appletCodeBase;
+
+ /**
+ * constructor for an Executable
Initialise the Memory by filling it with zero
+ *
+ * @param pia Pia Interface Object
+ */
+ public Memory(Pia6820 pia) {
+ reset();
+ this.pia = pia;
+ ram8k = false;
+ writeInRom = true;
+ }
+ /**
+ * constructor for an Applet
Initialise the Memory by filling it with zero
+ *
+ * @param pia Pia Interface Object
+ * @param appletCodeBase Your Applet URL
+ * @param appletMode Must be true
+ */
+ public Memory(Pia6820 pia,URL appletCodeBase,boolean appletMode) {
+ this.appletMode = appletMode;
+ this.appletCodeBase = appletCodeBase;
+ reset();
+ this.pia = pia;
+ ram8k = false;
+ writeInRom = true;
+ }
+ /**
+ * Sets the Ram8k attribute of the Memory object
+ *
+ * @param b The new Ram8k value
+ */
+ public void setRam8k(boolean b) {
+ ram8k = b;
+ }
+ /**
+ * Sets the WriteInRom attribute of the Memory object
+ *
+ * @param b The new WriteInRom value
+ */
+ public void setWriteInRom(boolean b) {
+ writeInRom = b;
+ }
+ /**
+ * Read a memory Address
+ *
+ * @param address Range 0 to 0xFFFF
+ * @return It must be a byte (0 - 0xFF)
+ */
+ public int read(int address) {
+ if (address == 0xD013) {
+ // Video I/O DSPCR
+ return pia.readDspCr();
+ }
+ if (address == 0xD012) {
+ return pia.readDsp();
+ }
+ if (address == 0xD011) {
+ // Keyboard I/O KBDCR
+ return pia.readKbdCr();
+ }
+ if (address == 0xD010) {
+ return pia.readKbd();
+ }
+ return mem[address];
+ }
+ /**
+ * Write a value in a memory address
+ *
+ * @param address Range 0 to 0xFFFF
+ * @param value It must be a byte (0 - OxFF)
+ */
+ public void write(int address, int value) {
+ // I/O memory Address
+ if (address == 0xD013) {
+ // Video I/O DSPCR
+ mem[address] = value;
+ pia.writeDspCr(value);
+ return;
+ }
+ if (address == 0xD012) {
+ mem[address] = value;
+ pia.writeDsp(value);
+ return;
+ }
+ if (address == 0xD011) {
+ // Keyboard I/O KBDCR
+ mem[address] = value;
+ pia.writeKbdCr(value);
+ return;
+ }
+ if (address == 0xD010) {
+ mem[address] = value;
+ pia.writeKbd(value);
+ return;
+ }
+ // RAM and ROM Address
+ if (address >= 0xFF00) {
+ // Do not write in Rom ?
+ if (!writeInRom) {
+ return;
+ }
+ }
+ if (ram8k) {
+ // only 8kb of Ram
+ if (address >= 0x2000) {
+ if (address < 0xFF00) {
+ return;
+ }
+ }
+ }
+ mem[address] = value;
+ }
+
+ // **********************************************
+ // ************ Utility Methods ****************
+ // **********************************************
+ /**
+ * Reset the Memory
Fill it with zero then load the bios
+ */
+ public void reset() {
+ int i;
+ for (i = 0; i < 0x10000; i++) {
+ mem[i] = 0x00;
+ }
+ loadRom();
+ }
+ /**
+ * Dump the Memory from start to end
+ *
+ * @param start int value [0x00, OxFFFF]
+ * @param end int value [0x00, OxFFFF]
+ * @return Int[]
+ */
+ public int[] dumpMemory(int start, int end) {
+ int i;
+ int[] fbrut = new int[end - start + 1];
+ for (i = 0; i < (end - start + 1); i++) {
+ fbrut[i] = (mem[start + i] & 0xFF);
+ }
+ return fbrut;
+ }
+ /**
+ * Load the Wozniak Monitor BIOS in Memory
Use Executable or Applet Functions
+ */
+ public void loadRom() {
+
+ if (appletMode == false){ // Normal File Access
+ String filename = System.getProperty("user.dir") + "/bios/apple1.rom";
+ int startingAddress = 0xFF00;
+ FileInputStream fis = null;
+ try {
+ fis = new FileInputStream(filename);
+ int i;
+ for (i = startingAddress; i < 0x10000; i++) {
+ mem[i] = fis.read();
+ }
+ fis.close();
+ }
+ catch (Exception e) {
+ System.out.println(e);
+ }
+ } else { // URL Applet File Access Mode
+
+ DataInputStream fis = null;
+ try{
+ URL u = new URL(appletCodeBase,"apple1.rom");
+ int startingAddress = 0xFF00;
+
+ fis = new DataInputStream (u.openStream());
+ int i;
+ for (i = startingAddress; i < 0x10000; i++) {
+ mem[i] = fis.read();
+ }
+ fis.close();
+ } catch (Exception e) {
+ System.out.println(e);
+ System.out.println("URL Error Access in Memory.class");
+ return;
+ }
+ }
+ }
+}