// Copyright 2011-2012 Paulo Augusto Peccin. See licence.txt distributed with this file. package org.javatari.atari.pia; import java.io.Serializable; import org.javatari.general.board.BUS16Bits; import org.javatari.parameters.Parameters; import org.javatari.utils.Debugger; import org.javatari.utils.Randomizer; public final class RAM implements BUS16Bits { public RAM() { // RAM comes totally random at creation Randomizer.instance.nextBytes(bytes); } public void powerOn() { // Nothing } public void powerOff() { // Nothing } @Override public byte readByte(int address) { return bytes[(address & ADDRESS_MASK)]; } @Override public void writeByte(int address, byte b) { bytes[(address & ADDRESS_MASK)] = b; } public void dump() { System.out.println("RAM DUMP:"); Debugger.dumpBytes(bytes, 0, bytes.length); } public RAMState saveState() { RAMState state = new RAMState(); state.bytes = bytes.clone(); return state; } public void loadState(RAMState state) { System.arraycopy(state.bytes, 0, bytes, 0, bytes.length); } public void powerFry() { final float var = 1 - FRY_VARIANCE + 2 * Randomizer.instance.nextFloat() * FRY_VARIANCE; // Randomly put "0" in bits on the ram final int fryZeroBits = (int)(var * FRY_ZERO_BITS); for (int i = fryZeroBits; i > 0; i--) bytes[Randomizer.instance.nextInt(128)] &= (byte)Randomizer.instance.nextInt(256); // Randomly put "1" in bits on the ram final int fryOneBits = (int)(var * FRY_ONE_BITS); for (int i = fryOneBits; i > 0; i--) bytes[Randomizer.instance.nextInt(128)] |= (byte)(0x01 << Randomizer.instance.nextInt(8)); } // State Variables -------------------------------------- private final byte[] bytes = new byte[128]; // Constants ------------------------------------------- public static final int CHIP_MASK = 0x1280; public static final int CHIP_SELECT = 0x0080; private static final int ADDRESS_MASK = 0x007f; private static final int FRY_ZERO_BITS = Parameters.RAM_FRY_ZERO_BITS; private static final int FRY_ONE_BITS = Parameters.RAM_FRY_ONE_BITS; private static final float FRY_VARIANCE = Parameters.RAM_FRY_VARIANCE; // Used to save/load states public static class RAMState implements Serializable { byte[] bytes; public static final long serialVersionUID = 2L; } }