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; + } + } + } +}