rlm@43: package com.aurellem.gb; rlm@43: rlm@43: import java.nio.ByteBuffer; rlm@60: import java.nio.IntBuffer; rlm@56: import java.nio.ByteOrder; rlm@43: rlm@43: public class Gb { rlm@43: rlm@43: rlm@43: public Gb(){} rlm@43: rlm@43: rlm@43: /** rlm@43: * Hello World! This is just to test the native interface. rlm@43: */ rlm@48: public static native void sayHello(); rlm@43: rlm@43: /** rlm@43: * Run the emulator on a given rom rlm@43: * @param rom - the name of the rom. rlm@43: */ rlm@48: public static native void startEmulator(String rom); rlm@48: rlm@48: rlm@48: public static void loadVBA(){ rlm@48: System.loadLibrary("vba"); rlm@48: } rlm@43: rlm@53: public static native void step(); rlm@53: rlm@55: public static native void step(int keymask); rlm@55: rlm@53: public static native void shutdown(); rlm@50: rlm@76: public static native long saveState(ByteBuffer buffer, int size); rlm@56: rlm@56: public static native void loadState(ByteBuffer buffer, int size); rlm@56: rlm@76: public static final int MAX_SAVE_SIZE = 90000; rlm@56: rlm@76: public static ByteBuffer createDirectByteBuffer(int capacity){ rlm@76: byte[] zeros = new byte[capacity]; rlm@56: ByteBuffer buf = rlm@76: ByteBuffer.allocateDirect(capacity) rlm@56: .order(ByteOrder.nativeOrder()); rlm@76: buf.put(zeros); rlm@56: buf.clear(); rlm@56: return buf; rlm@56: } rlm@56: rlm@76: public static ByteBuffer saveBuffer(){ rlm@76: return createDirectByteBuffer(MAX_SAVE_SIZE); rlm@76: } rlm@76: rlm@76: public static ByteBuffer saveState(){ rlm@76: ByteBuffer buf = saveBuffer(); rlm@76: rlm@76: saveState(buf, buf.capacity()); rlm@76: rlm@76: // determine the extent of the saved data rlm@76: int position = buf.capacity() - 1; rlm@76: for (int i = position; i > 0; i--){ rlm@76: if (0 != buf.get(i)){ rlm@76: position = i; rlm@76: break; rlm@76: }} rlm@76: System.out.println("Position: " + position); rlm@76: byte[] saveArray = new byte[position]; rlm@76: ByteBuffer save = createDirectByteBuffer(position); rlm@76: buf.get(saveArray, 0 , position); rlm@76: save.put(saveArray); rlm@76: save.rewind(); rlm@76: return save; rlm@76: } rlm@76: rlm@56: public static void loadState(ByteBuffer saveState){ rlm@76: loadState(saveState, MAX_SAVE_SIZE); rlm@56: } rlm@56: rlm@59: public static native int getROMSize(); rlm@59: public static native int getRAMSize(); rlm@59: rlm@59: rlm@59: public static final int WRAM_SIZE = 0x8000; rlm@59: rlm@59: public static final int VRAM_SIZE = 0x4000; rlm@59: rlm@62: public static final int NUM_REGISTERS = 27; rlm@62: rlm@60: public static native void getRAM(int[] store); rlm@59: rlm@60: public static native void getROM(int[] store); rlm@59: rlm@60: public static native void getWRAM(int[] store); rlm@60: rlm@60: public static native void getVRAM(int[] store); rlm@62: rlm@62: public static native void getRegisters(int[] store); rlm@43: }