package vue; // Java imports import java.util.*; // Template for emulation core implementations public abstract class Vue { // Instance fields ArrayList breakpoints; // Current breakpoints // Static fields private static String nativeID = null; // ID of loaded native library /////////////////////////////////////////////////////////////////////////// // Constants // /////////////////////////////////////////////////////////////////////////// // Memory access types public static final int S8 = 0; public static final int U8 = 1; public static final int S16 = 2; public static final int U16 = 3; public static final int S32 = 4; public static final int CANCEL = 5; // System register indexes public static final int ADTRE = 25; public static final int CHCW = 24; public static final int ECR = 4; public static final int EIPC = 0; public static final int EIPSW = 1; public static final int FEPC = 2; public static final int FEPSW = 3; public static final int PIR = 6; public static final int PSW = 5; public static final int TKCW = 7; // Non-standard register indexes public static final int PC = -1; public static final int JUMP_FROM = -2; public static final int JUMP_TO = -3; // Program register indexes public static final int GP = 4; public static final int HP = 2; public static final int LP = 31; public static final int SP = 3; public static final int TP = 5; // Instruction IDs public static final int ILLEGAL = -1; public static final int ADD_IMM = 0; public static final int ADD_REG = 1; public static final int ADDF_S = 2; public static final int ADDI = 3; public static final int AND = 4; public static final int ANDBSU = 5; public static final int ANDI = 6; public static final int ANDNBSU = 7; public static final int BCOND = 8; public static final int CAXI = 9; public static final int CLI = 10; public static final int CMP_IMM = 11; public static final int CMP_REG = 12; public static final int CMPF_S = 13; public static final int CVT_SW = 14; public static final int CVT_WS = 15; public static final int DIV = 16; public static final int DIVF_S = 17; public static final int DIVU = 18; public static final int HALT = 19; public static final int IN_B = 20; public static final int IN_H = 21; public static final int IN_W = 22; public static final int JAL = 23; public static final int JMP = 24; public static final int JR = 25; public static final int LD_B = 26; public static final int LD_H = 27; public static final int LD_W = 28; public static final int LDSR = 29; public static final int MOV_IMM = 30; public static final int MOV_REG = 31; public static final int MOVBSU = 32; public static final int MOVEA = 33; public static final int MOVHI = 34; public static final int MPYHW = 35; public static final int MUL = 36; public static final int MULF_S = 37; public static final int MULU = 38; public static final int NOT = 39; public static final int NOTBSU = 40; public static final int OR = 41; public static final int ORBSU = 42; public static final int ORI = 43; public static final int ORNBSU = 44; public static final int OUT_B = 45; public static final int OUT_H = 46; public static final int OUT_W = 47; public static final int RETI = 48; public static final int REV = 49; public static final int SAR_IMM = 50; public static final int SAR_REG = 51; public static final int SCH0BSD = 52; public static final int SCH0BSU = 53; public static final int SCH1BSD = 54; public static final int SCH1BSU = 55; public static final int SEI = 56; public static final int SETF = 57; public static final int SHL_IMM = 58; public static final int SHL_REG = 59; public static final int SHR_IMM = 60; public static final int SHR_REG = 61; public static final int ST_B = 62; public static final int ST_H = 63; public static final int ST_W = 64; public static final int STSR = 65; public static final int SUB = 66; public static final int SUBF_S = 67; public static final int TRAP = 68; public static final int TRNC_SW = 69; public static final int XB = 70; public static final int XH = 71; public static final int XOR = 72; public static final int XORBSU = 73; public static final int XORI = 74; public static final int XORNBSU = 75; /////////////////////////////////////////////////////////////////////////// // Static Methods // /////////////////////////////////////////////////////////////////////////// // Produce an emulation core context public static Vue create(boolean useNative) { return !useNative ? new JavaVue() : nativeID != null ? new NativeVue() : null; } // Retrieve the ID of the loaded native library, if any public static String getNativeID() { return nativeID; } // Specify the ID of the loaded native library public static void setNativeID(String nativeID) { Vue.nativeID = nativeID; } /////////////////////////////////////////////////////////////////////////// // Constructors // /////////////////////////////////////////////////////////////////////////// // Default constructor Vue() { breakpoints = new ArrayList(); } /////////////////////////////////////////////////////////////////////////// // Public Methods // /////////////////////////////////////////////////////////////////////////// // Produce a new breakpoint and add it to the collection public Breakpoint breakpoint() { var brk = new Breakpoint(this); breakpoints.add(brk); return brk; } // Release any used resources public abstract void dispose(); // Process the simulation public abstract int emulate(int maxCycles); // Evaluate an expression public Object evaluate(String expression) { var inst = new Instruction(read(getRegister(PC, true), S32)); var brk = new Breakpoint(this); brk.setCondition(expression); brk.setEnabled (true); return brk.evaluateTyped( new int[brk.getDepth()], 0, inst, inst.access(this)); } // Retrieve the most recent applicaiton break code public abstract int getBreakCode(); // Retrieve the most recent exception code public abstract int getExceptionCode(); // Retrieve a register value public abstract int getRegister(int index, boolean system); // Retrieve a copy of the ROM data public abstract byte[] getROM(); // Determine whether the context is native-backed public abstract boolean isNative(); // Produce an array of the current breakpoint collection public Breakpoint[] listBreakpoints() { return breakpoints.toArray(new Breakpoint[breakpoints.size()]); } // Read a value from the CPU bus public abstract int read(int address, int type); // Read bytes from the CPU bus public abstract boolean readBytes(int address, byte[] dest, int offset, int length); // Remove a breakpoint from the collection public boolean remove(Breakpoint brk) { if (!breakpoints.remove(brk)) return false; brk.remove(); return true; } // Initialize all system components public abstract void reset(); // Specify a register value public abstract int setRegister(int index, boolean system, int value); // Provide new ROM data public abstract boolean setROM(byte[] data, int offset, int length); // Write a value to the CPU bus public abstract void write(int address, int type, int value); // Write bytes to the CPU bus public abstract boolean writeBytes(int address, byte[] src, int offset, int length); /////////////////////////////////////////////////////////////////////////// // Package Methods // /////////////////////////////////////////////////////////////////////////// // Retrieve the current state's breakpoint scenario abstract int getBreakType(); // Retrieve the current instruction fetch index abstract int getFetch(); // A breakpoint's address ranges have changed void updateRanges(Breakpoint brk) { } // A breakpoint's enabled/hook state has changed void updateState(Breakpoint brk) { } // A breakpoint's condition tokens have changed void updateTokens(Breakpoint brk) { } }