// Path: src/name/bizna/ocarmsim/ROMRegion.java
// public class ROMRegion extends ByteBackedRegion {
// 
// 	// cribbed from JARMArchitecture
// 	private static final int ROM_MIN_BIT_DEPTH = 12; // 4K ROM
// 	
// 	private final byte[] array;
// 	private final int arrayMask;
// 
// 	ROMRegion(File inpath) throws IOException {
// 		int arraySizeBits = ROM_MIN_BIT_DEPTH;
// 		long len = inpath.length();
// 		if(len > 0x40000000) throw new IOException("That EEPROM image is WAY too big!");
// 		while((1L << arraySizeBits) < len) ++arraySizeBits;
// 		FileInputStream fis = new FileInputStream(inpath);
// 		try {
// 			array = new byte[1 << arraySizeBits];
// 			arrayMask = (1 << arraySizeBits) - 1;
// 			if(fis.read(array) < 0) throw new IOException();
// 		}
// 		finally {
// 			fis.close();
// 		}
// 		if(array[0] == '-' && array[1] == '-' && array[2] == '[') {
// 			int n = 3;
// 			while(n < array.length && array[n] == '=') ++ n;
// 			if(n < array.length-1 && array[n] == '[') {
// 				// it's Lua-compatible, trim that part of it
// 				++n;
// 				int amt = array.length - n;
// 				for(int m = 0; m < amt; ++m, ++n) {
// 					array[m] = array[n];
// 				}
// 			}
// 		}
// 	}
// 
// 	@Override
// 	public byte backingReadByte(int address) throws BusErrorException,
// 			EscapeRetryException {
// 		return array[address & arrayMask];
// 	}
// 
// 	@Override
// 	public void backingWriteByte(int address, byte v) throws BusErrorException,
// 			EscapeRetryException {
// 		throw new BusErrorException("ROM is readonly", address, BusErrorException.AccessType.WRITE);
// 	}
// 
// 	@Override
// 	public long getRegionSize() {
// 		return 0x40000000;
// 	}
// 
// 	public byte[] getArray() {
// 		return array;
// 	}
// 
// 	public int getArrayMask() {
// 		return arrayMask;
// 	}
// }
// 
// Path: src/name/bizna/ocarmsim/SRAMRegion.java
// public class SRAMRegion extends ByteBackedRegion {
// 	
// 	private final File path;
// 	private final boolean writable;
// 	private final byte[] sramArray;
// 	private final byte[] nvramArray;
// 
// 	SRAMRegion(File inpath, int arraySize, boolean writable) throws IOException {
// 		path = inpath;
// 		this.writable = writable;
// 		if(path == null || !path.exists()) {
// 			if(arraySize < 0) arraySize = -arraySize;
// 			sramArray = new byte[arraySize];
// 			nvramArray = new byte[arraySize];
// 		}
// 		else {
// 			long len = path.length();
// 			if(len > 0x40000000) throw new IOException("That SRAM image is WAY too big!");
// 			if(arraySize > 0)
// 				sramArray = new byte[arraySize];
// 			else {
// 				int fileSizeBits = 0;
// 				while((1L << fileSizeBits) < len) ++fileSizeBits;
// 				sramArray = new byte[1 << fileSizeBits];
// 			}
// 			FileInputStream fis = new FileInputStream(path);
// 			try {
// 				if(fis.read(sramArray) < 0) throw new IOException();
// 			}
// 			finally {
// 				fis.close();
// 			}
// 			nvramArray = Arrays.copyOf(sramArray, sramArray.length);
// 		}
// 	}
// 
// 	@Override
// 	public byte backingReadByte(int address) throws BusErrorException,
// 			EscapeRetryException {
// 		return sramArray[address];
// 	}
// 
// 	@Override
// 	public void backingWriteByte(int address, byte v) throws BusErrorException,
// 			EscapeRetryException {
// 		sramArray[address] = v;
// 	}
// 
// 	@Override
// 	public long getRegionSize() {
// 		return sramArray.length;
// 	}
// 	
// 	public void flushToNVRAM() throws IOException {
// 		System.arraycopy(sramArray, 0, nvramArray, 0, sramArray.length);
// 		maybeWriteNVRAM();
// 	}
// 	
// 	public void maybeWriteNVRAM() throws IOException {
// 		if(path != null && writable) {
// 			FileOutputStream fos = new FileOutputStream(path);
// 			try {
// 				fos.write(sramArray);
// 			}
// 			finally {
// 				fos.close();
// 			}
// 		}
// 	}
// 
// 	public byte[] getSramArray() {
// 		return sramArray;
// 	}
// 
// 	public byte[] getNvramArray() {
// 		return nvramArray;
// 	}
// }


import java.io.IOException;
import javax.swing.JComponent;
import li.cil.oc.api.machine.Callback;
import li.cil.oc.api.machine.Context;
import li.cil.oc.api.machine.Machine;
import name.bizna.ocarmsim.ROMRegion;
import name.bizna.ocarmsim.SRAMRegion;
	@Callback
	public Object[] getLabel(Context ctx, Object[] args) {
		return new Object[]{"EEPROM"};
	}

	@Callback
	public Object[] setLabel(Context ctx, Object[] args) {
		return new Object[]{null, "storage is readonly"};
	}

	@Callback
	public Object[] getSize(Context ctx, Object[] args) {
		return new Object[]{4096};
	}

	@Callback
	public Object[] getDataSize(Context ctx, Object[] args) {
		return new Object[]{sram.getSramArray().length < 256 ? 256 : sram.getSramArray().length};
	}

	@Callback
	public Object[] getData(Context ctx, Object[] args) {
		return new Object[]{sram.getNvramArray()};
	}

	@Callback
	public Object[] setData(Context ctx, Object[] args) {
		byte[] array;
		if (args.length == 0) {
			array = new byte[0];
// Path: src/name/bizna/ocarmsim/ROMRegion.java
// public class ROMRegion extends ByteBackedRegion {
// 
// 	// cribbed from JARMArchitecture
// 	private static final int ROM_MIN_BIT_DEPTH = 12; // 4K ROM
// 	
// 	private final byte[] array;
// 	private final int arrayMask;
// 
// 	ROMRegion(File inpath) throws IOException {
// 		int arraySizeBits = ROM_MIN_BIT_DEPTH;
// 		long len = inpath.length();
// 		if(len > 0x40000000) throw new IOException("That EEPROM image is WAY too big!");
// 		while((1L << arraySizeBits) < len) ++arraySizeBits;
// 		FileInputStream fis = new FileInputStream(inpath);
// 		try {
// 			array = new byte[1 << arraySizeBits];
// 			arrayMask = (1 << arraySizeBits) - 1;
// 			if(fis.read(array) < 0) throw new IOException();
// 		}
// 		finally {
// 			fis.close();
// 		}
// 		if(array[0] == '-' && array[1] == '-' && array[2] == '[') {
// 			int n = 3;
// 			while(n < array.length && array[n] == '=') ++ n;
// 			if(n < array.length-1 && array[n] == '[') {
// 				// it's Lua-compatible, trim that part of it
// 				++n;
// 				int amt = array.length - n;
// 				for(int m = 0; m < amt; ++m, ++n) {
// 					array[m] = array[n];
// 				}
// 			}
// 		}
// 	}
// 
// 	@Override
// 	public byte backingReadByte(int address) throws BusErrorException,
// 			EscapeRetryException {
// 		return array[address & arrayMask];
// 	}
// 
// 	@Override
// 	public void backingWriteByte(int address, byte v) throws BusErrorException,
// 			EscapeRetryException {
// 		throw new BusErrorException("ROM is readonly", address, BusErrorException.AccessType.WRITE);
// 	}
// 
// 	@Override
// 	public long getRegionSize() {
// 		return 0x40000000;
// 	}
// 
// 	public byte[] getArray() {
// 		return array;
// 	}
// 
// 	public int getArrayMask() {
// 		return arrayMask;
// 	}
// }
// 
// Path: src/name/bizna/ocarmsim/SRAMRegion.java
// public class SRAMRegion extends ByteBackedRegion {
// 	
// 	private final File path;
// 	private final boolean writable;
// 	private final byte[] sramArray;
// 	private final byte[] nvramArray;
// 
// 	SRAMRegion(File inpath, int arraySize, boolean writable) throws IOException {
// 		path = inpath;
// 		this.writable = writable;
// 		if(path == null || !path.exists()) {
// 			if(arraySize < 0) arraySize = -arraySize;
// 			sramArray = new byte[arraySize];
// 			nvramArray = new byte[arraySize];
// 		}
// 		else {
// 			long len = path.length();
// 			if(len > 0x40000000) throw new IOException("That SRAM image is WAY too big!");
// 			if(arraySize > 0)
// 				sramArray = new byte[arraySize];
// 			else {
// 				int fileSizeBits = 0;
// 				while((1L << fileSizeBits) < len) ++fileSizeBits;
// 				sramArray = new byte[1 << fileSizeBits];
// 			}
// 			FileInputStream fis = new FileInputStream(path);
// 			try {
// 				if(fis.read(sramArray) < 0) throw new IOException();
// 			}
// 			finally {
// 				fis.close();
// 			}
// 			nvramArray = Arrays.copyOf(sramArray, sramArray.length);
// 		}
// 	}
// 
// 	@Override
// 	public byte backingReadByte(int address) throws BusErrorException,
// 			EscapeRetryException {
// 		return sramArray[address];
// 	}
// 
// 	@Override
// 	public void backingWriteByte(int address, byte v) throws BusErrorException,
// 			EscapeRetryException {
// 		sramArray[address] = v;
// 	}
// 
// 	@Override
// 	public long getRegionSize() {
// 		return sramArray.length;
// 	}
// 	
// 	public void flushToNVRAM() throws IOException {
// 		System.arraycopy(sramArray, 0, nvramArray, 0, sramArray.length);
// 		maybeWriteNVRAM();
// 	}
// 	
// 	public void maybeWriteNVRAM() throws IOException {
// 		if(path != null && writable) {
// 			FileOutputStream fos = new FileOutputStream(path);
// 			try {
// 				fos.write(sramArray);
// 			}
// 			finally {
// 				fos.close();
// 			}
// 		}
// 	}
// 
// 	public byte[] getSramArray() {
// 		return sramArray;
// 	}
// 
// 	public byte[] getNvramArray() {
// 		return nvramArray;
// 	}
// }


// Path: src/name/bizna/ocarmsim/components/SimEEPROM.java
import java.io.IOException;
import javax.swing.JComponent;
import li.cil.oc.api.machine.Callback;
import li.cil.oc.api.machine.Context;
import li.cil.oc.api.machine.Machine;
import name.bizna.ocarmsim.ROMRegion;
import name.bizna.ocarmsim.SRAMRegion;

	@Callback
	public Object[] getLabel(Context ctx, Object[] args) {
		return new Object[]{"EEPROM"};
	}

	@Callback
	public Object[] setLabel(Context ctx, Object[] args) {
		return new Object[]{null, "storage is readonly"};
	}

	@Callback
	public Object[] getSize(Context ctx, Object[] args) {
		return new Object[]{4096};
	}

	@Callback
	public Object[] getDataSize(Context ctx, Object[] args) {
		return new Object[]{sram.getSramArray().length < 256 ? 256 : sram.getSramArray().length};
	}

	@Callback
	public Object[] getData(Context ctx, Object[] args) {
		return new Object[]{sram.getNvramArray()};
	}

	@Callback
	public Object[] setData(Context ctx, Object[] args) {
		byte[] array;
		if (args.length == 0) {
			array = new byte[0];
		} else {