pvbemu/src/desktop/vue/Vue.java

267 lines
9.0 KiB
Java

package vue;
// Java imports
import java.util.*;
// Template for emulation core implementations
public abstract class Vue {
// Instance fields
ArrayList<Breakpoint> 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<Breakpoint>();
}
///////////////////////////////////////////////////////////////////////////
// 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) { }
}