package org.jpc.debugger; import java.lang.reflect.*; import java.util.*; import org.jpc.emulator.processor.*; import org.jpc.emulator.processor.fpu64.FpuState64; public class FPUAccess { private FpuState64 fpu; private Map<String, Field> lookup; public FPUAccess(FpuState64 proc) { fpu = proc; try { lookup = new HashMap<String, Field>(); addField("statusWord"); } catch (Throwable t) {t.printStackTrace();} } private void addField(String fieldName) throws Exception { Field targetField = FpuState64.class.getDeclaredField(fieldName); targetField.setAccessible(true); lookup.put(fieldName, targetField); } public long getLongValue(String name, int defaultValue) { if (name.startsWith("ST")) return Double.doubleToRawLongBits(fpu.ST(Integer.parseInt(name.substring(2)))); Field f = lookup.get(name); if (f == null) { return defaultValue; } if (f.getType().isPrimitive()) try { return f.getInt(fpu); } catch (IllegalAccessException e) { return defaultValue; } return defaultValue; } public boolean setLongValue(String name, long value) { if (name.startsWith("ST")) { fpu.setST(Integer.parseInt(name.substring(2)), Double.longBitsToDouble(value)); return true; } Field f = lookup.get(name); if (f == null) return false; try { f.setInt(fpu, (int)value); return true; } catch (IllegalAccessException e) { return false; } } }