diff --git a/locale/en-US.txt b/locale/en-US.txt index e53b626..0178e3d 100644 --- a/locale/en-US.txt +++ b/locale/en-US.txt @@ -39,12 +39,13 @@ console { # CPU window cpu { - float Float - hex Hex - last_pc Last PC - signed Signed - title CPU - unsigned Unsigned + float Float + hex Hex + jump_from From + jump_to To + signed Signed + title CPU + unsigned Unsigned } # Memory window diff --git a/src/core/bus.c b/src/core/bus.c index d50aa2b..7abe224 100644 --- a/src/core/bus.c +++ b/src/core/bus.c @@ -62,9 +62,9 @@ static int32_t busReadValue(VUE *vue, uint32_t address, int type) { case 5: /* System WRAM */ return busReadMemory(vue->bus.wram, address & 0xFFFF, type); case 6: return busReadMemory(vue->bus.sram, /* Cartridge RAM */ - address & (vue->bus.sram_size - 1), type); + address & (vue->bus.sramSize - 1), type); case 7: return busReadMemory(vue->bus.rom , /* Cartridge ROM */ - address & (vue->bus.rom_size - 1), type); + address & (vue->bus.romSize - 1), type); } return 0; /* Unreachable */ } @@ -128,11 +128,11 @@ static void busWriteValue(VUE *vue, uint32_t address, int type, int32_t value){ break; case 6: /* Cartridge RAM */ busWriteMemory(vue->bus.sram, - address & (vue->bus.sram_size - 1), type, value); + address & (vue->bus.sramSize - 1), type, value); break; case 7: /* Cartridge ROM */ busWriteMemory(vue->bus.rom , - address & (vue->bus.rom_size - 1), type, value); + address & (vue->bus.romSize - 1), type, value); break; } } diff --git a/src/core/cpu.c b/src/core/cpu.c index 7c26baf..48f51ee 100644 --- a/src/core/cpu.c +++ b/src/core/cpu.c @@ -142,7 +142,8 @@ static void cpuReset(VUE *vue) { /* Configure registers */ vue->cpu.ecr_eicc = 0xFFF0; - vue->cpu.lastPC = 0xFFFFFFF0; + vue->cpu.jumpFrom = 0xFFFFFFF0; + vue->cpu.jumpTo = 0xFFFFFFF0; vue->cpu.pc = 0xFFFFFFF0; vue->cpu.psw_np = 1; } diff --git a/src/core/include/vue.h b/src/core/include/vue.h index aa5bfd8..b462497 100644 --- a/src/core/include/vue.h +++ b/src/core/include/vue.h @@ -38,11 +38,15 @@ extern "C" { #define VUE_EIPSW 1 #define VUE_FEPC 2 #define VUE_FEPSW 3 -#define VUE_PC -1 #define VUE_PIR 6 #define VUE_PSW 5 #define VUE_TKCW 7 +/* Non-standard register indexes */ +#define VUE_PC -1 +#define VUE_JUMP_FROM -2 +#define VUE_JUMP_TO -3 + /* Program register indexes */ #define VUE_GP 4 #define VUE_HP 2 @@ -65,18 +69,19 @@ typedef struct { /* Memory bus */ struct { uint8_t *rom; /* Cartridge ROM */ - uint32_t rom_size; /* Number of bytes in cartridge ROM */ + uint32_t romSize; /* Number of bytes in cartridge ROM */ uint8_t *sram; /* Cartridge RAM */ - uint32_t sram_size; /* Number of bytes in cartridge RAM */ + uint32_t sramSize; /* Number of bytes in cartridge RAM */ uint8_t wram[0x10000]; /* System memory */ } bus; /* CPU state */ struct { - uint32_t cycles; /* Cycles until next stage */ - int fetch; /* Fetch unit index */ - int32_t lastPC; /* Previous value of PC */ - int stage; /* Current processing stage */ + uint32_t cycles; /* Cycles until next stage */ + int fetch; /* Fetch unit index */ + int32_t jumpFrom; /* Source PC of most recent jump */ + int32_t jumpTo; /* Destination PC of most recent jump */ + int stage; /* Current processing stage */ /* Program registers */ int32_t program[32]; diff --git a/src/core/vue.c b/src/core/vue.c index 62ee09d..c5444dc 100644 --- a/src/core/vue.c +++ b/src/core/vue.c @@ -26,8 +26,20 @@ static const int TYPE_SIZES[] = { 1, 1, 2, 2, 4 }; /* Retrieve the value of a register */ int32_t vueGetRegister(VUE *vue, int index, vbool system) { - return vue == NULL ? 0 : - index == VUE_PC && system ? vue->cpu.pc : + + /* Error checking */ + if (vue == NULL) + return 0; + + /* Non-indexed registers */ + if (system) switch (index) { + case VUE_PC : return vue->cpu.pc; + case VUE_JUMP_FROM: return vue->cpu.jumpFrom; + case VUE_JUMP_TO : return vue->cpu.jumpTo; + } + + /* Indexed registers */ + return index < 0 || index > 31 ? 0 : system ? cpuGetSystemRegister(vue, index) : vue->cpu.program[index] @@ -66,13 +78,13 @@ vbool vueRead(VUE *vue, uint32_t address, uint8_t *dest, uint32_t length) { busReadBytes(NULL, dest, address, 0, count); break; case 5: busReadBytes(vue->bus.wram, dest, /* System WRAM */ - address, 0x10000 , count); + address, 0x10000 , count); break; case 6: busReadBytes(vue->bus.sram, dest, /* Cartridge RAM */ - address, vue->bus.sram_size, count); + address, vue->bus.sramSize, count); break; case 7: busReadBytes(vue->bus.rom , dest, /* Cartridge ROM */ - address, vue->bus.rom_size , count); + address, vue->bus.romSize , count); break; } @@ -110,8 +122,8 @@ vbool vueSetROM(VUE *vue, uint8_t *rom, uint32_t size) { ) return VUE_FALSE; /* Accept the new ROM buffer */ - vue->bus.rom = rom; - vue->bus.rom_size = size; + vue->bus.rom = rom; + vue->bus.romSize = size; return VUE_TRUE; } @@ -137,10 +149,10 @@ vbool vueWrite(VUE *vue, uint32_t address, uint8_t *src, uint32_t length) { busWriteBytes(vue->bus.wram, src, address, 0x10000, count); break; case 6: busWriteBytes(vue->bus.sram, src, /* Cartridge RAM */ - address, vue->bus.sram_size, count); + address, vue->bus.sramSize, count); break; case 7: busWriteBytes(vue->bus.rom , src, /* Cartridge ROM */ - address, vue->bus.rom_size , count); + address, vue->bus.romSize , count); break; } diff --git a/src/desktop/app/App.java b/src/desktop/app/App.java index a39f8a4..021495a 100644 --- a/src/desktop/app/App.java +++ b/src/desktop/app/App.java @@ -11,11 +11,13 @@ import vue.*; public class App { // Instance fields - private Localizer localizer; // UI localization manager private boolean useNative; // Produce native core contexts private Localizer.Locale[] locales; // Language translations private ArrayList windows; // Application windows + // Configuration fields + Localizer localizer; // UI localization manager + /////////////////////////////////////////////////////////////////////////// @@ -47,21 +49,11 @@ public class App { windowsChanged(); } - // Retrieve the currently active locale - Localizer.Locale getLocale() { - return localizer.getLocale(); - } - // Determine whether the native module is in use boolean getUseNative() { return useNative; } - // Retrieve the localization manager - Localizer getLocalizer() { - return localizer; - } - // Retrieve a list of registered locales Localizer.Locale[] listLocales() { var ret = new Localizer.Locale[locales.length]; @@ -80,11 +72,6 @@ public class App { windowsChanged(); } - // Specify a new locale - void setLocale(Localizer.Locale locale) { - localizer.setLocale(locale); - } - // Specify whether using the native module boolean setUseNative(boolean useNative) { return this.useNative = useNative && VUE.isNativeLoaded(); diff --git a/src/desktop/app/CPU.java b/src/desktop/app/CPU.java index 7a4ad10..77d3fea 100644 --- a/src/desktop/app/CPU.java +++ b/src/desktop/app/CPU.java @@ -56,7 +56,7 @@ class CPU extends ChildWindow { outer.setResizeWeight(1); client.add(outer); - client.setPreferredSize(new Dimension(640, 480)); + client.setPreferredSize(new Dimension(480, 300)); setFont2(font); pack(); } @@ -102,7 +102,8 @@ class CPU extends ChildWindow { case VUE.SP: name = "sp"; break; case VUE.TP: name = "tp"; break; } - registers.add(new Register(parent,lst,name,x,Register.PROGRAM)); + registers.add(new Register( + parent, lst, name, x, Register.PROGRAM)); } endList(lst); } @@ -142,7 +143,8 @@ class CPU extends ChildWindow { system.putClientProperty("shown", true); // Add the first two system registers and expand PSW - registers.add(new Register(parent, lst, "PC" , VUE.PC , VUE.PC )); + int plain = Register.PLAIN; + registers.add(new Register(parent, lst, "PC" , VUE.PC , plain )); Register psw =new Register(parent, lst, "PSW" , VUE.PSW , VUE.PSW ); psw.setExpanded(true); registers.add(psw); @@ -151,18 +153,18 @@ class CPU extends ChildWindow { shown = false; // Add the remaining system registers - registers.add(new Register(parent, lst, "EIPC" , VUE.EIPC , VUE.PC )); + registers.add(new Register(parent, lst, "EIPC" , VUE.EIPC , plain )); registers.add(new Register(parent, lst, "EIPSW", VUE.EIPSW, VUE.PSW )); - registers.add(new Register(parent, lst, "FEPC" , VUE.FEPC , VUE.PC )); + registers.add(new Register(parent, lst, "FEPC" , VUE.FEPC , plain )); registers.add(new Register(parent, lst, "FEPSW", VUE.FEPSW, VUE.PSW )); registers.add(new Register(parent, lst, "ECR" , VUE.ECR , VUE.ECR )); - registers.add(new Register(parent, lst, "ADTRE", VUE.ADTRE, VUE.PC )); + registers.add(new Register(parent, lst, "ADTRE", VUE.ADTRE, plain )); registers.add(new Register(parent, lst, "CHCW" , VUE.CHCW , VUE.CHCW)); registers.add(new Register(parent, lst, "PIR" , VUE.PIR , VUE.PIR )); registers.add(new Register(parent, lst, "TKCW" , VUE.TKCW , VUE.TKCW)); - registers.add(new Register(parent, lst, "29" , 29, VUE.PC )); - registers.add(new Register(parent, lst, "30" , 30, VUE.PC )); - registers.add(new Register(parent, lst, "31" , 31, VUE.PC )); + registers.add(new Register(parent, lst, "29" , 29, plain )); + registers.add(new Register(parent, lst, "30" , 30, plain )); + registers.add(new Register(parent, lst, "31" , 31, plain )); endList(lst); } diff --git a/src/desktop/app/ChildWindow.java b/src/desktop/app/ChildWindow.java index 9f90a8d..c7ffe50 100644 --- a/src/desktop/app/ChildWindow.java +++ b/src/desktop/app/ChildWindow.java @@ -27,7 +27,7 @@ class ChildWindow extends JInternalFrame { this.parent = parent; // Configure component - parent.app.getLocalizer().add(this, key); + parent.app.localizer.add(this, key); addInternalFrameListener(Util.onClose2(e->setVisible(false))); setClosable(true); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); diff --git a/src/desktop/app/MainWindow.java b/src/desktop/app/MainWindow.java index b0e6ab9..bfacae1 100644 --- a/src/desktop/app/MainWindow.java +++ b/src/desktop/app/MainWindow.java @@ -87,7 +87,7 @@ class MainWindow extends JFrame { setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); setIconImage(APPICON); setJMenuBar(initMenus()); - app.getLocalizer().add(this, "app.title.default"); + app.localizer.add(this, "app.title.default"); // Configure child windows desktop = new JDesktopPane(); @@ -112,7 +112,7 @@ class MainWindow extends JFrame { // Produce the window's menu bar private JMenuBar initMenus() { var bar = new JMenuBar(); - var loc = app.getLocalizer(); + var loc = app.localizer; bar.add(initMenuFile (loc)); bar.add(initMenuDebug(loc)); return bar; @@ -194,7 +194,7 @@ class MainWindow extends JFrame { void windowsChanged(int number, boolean only) { this.number = number; this.only = only; - app.getLocalizer().put(this, "ctrl.number", "" + number); + app.localizer.put(this, "ctrl.number", "" + number); updateTitle(); } @@ -239,7 +239,7 @@ class MainWindow extends JFrame { // File -> Load ROM private void onLoadROM() { - var loc = app.getLocalizer(); + var loc = app.localizer; // Prompt the user to select a file var dlgFile = new JFileChooser(pwd); @@ -324,7 +324,7 @@ class MainWindow extends JFrame { // Update the window title private void updateTitle() { - app.getLocalizer().add(this, + app.localizer.add(this, only ? romFile != null ? "app.title.rom" : "app.title.default" diff --git a/src/desktop/app/Memory.java b/src/desktop/app/Memory.java index 00bd9c7..97380c3 100644 --- a/src/desktop/app/Memory.java +++ b/src/desktop/app/Memory.java @@ -57,7 +57,7 @@ class Memory extends ChildWindow { client.addMouseWheelListener(e->onWheel(e)); client.setBackground(SystemColor.window); client.setFocusable(true); - client.setPreferredSize(new Dimension(640, 480)); + client.setPreferredSize(new Dimension(480, 360)); // Configure component var content = new JPanel(new BorderLayout()); diff --git a/src/desktop/app/Register.java b/src/desktop/app/Register.java index 2c40eb4..639c66e 100644 --- a/src/desktop/app/Register.java +++ b/src/desktop/app/Register.java @@ -14,21 +14,25 @@ import vue.*; class Register { // Instance fields - boolean expanded; // The expanded area is being shown - Font font; // Hexadecimal font - int index; // Register index - int mode; // Display mode for program registers - MainWindow parent; // Containing window - int type; // Expansion controls type - int value; // Current register value + boolean expandable; // The expansion area can be shown + boolean expanded; // The expanded area is being shown + Font font; // Hexadecimal font + int index; // Register index + int mode; // Display mode for program registers + MainWindow parent; // Containing window + int type; // Expansion controls type + int value; // Current register value // UI components - private JPanel expansion; // Expansion area - private JLabel btnExpand; // Expand button - private JLabel lblName; // Register name - private JPanel list; // Containing element - private JPanel spacer; // Expansion area spacer - private JTextField txtValue; // Register value + private JPanel expansion; // Expansion area + private JLabel btnExpand; // Expand button + private JLabel lblLastPC; // Last PC name + private JLabel lblName; // Register name + private JPanel list; // Containing element + private JPanel spacer; // Expansion area spacer + private JTextField txtJumpFrom; // Jump-from value + private JTextField txtJumpTo; // Jump-to value + private JTextField txtValue; // Register value private ArrayList controls; // Expansion controls @@ -44,6 +48,7 @@ class Register { static final int UNSIGNED = 2; // Types + static final int PLAIN = -1; static final int PROGRAM = -2; @@ -57,6 +62,7 @@ class Register { // Configure instance fields controls = new ArrayList(); + expandable = type != PLAIN && index != 0 || index == VUE.PC; this.index = index; this.list = list; this.mode = HEX; @@ -64,13 +70,13 @@ class Register { this.type = type; // Click handler for expand and name controls - MouseListener expand = type == VUE.PC ? null : Util.onMouse( - e->{ if (e.getButton() == 1) setExpanded(!expanded); }, null); + MouseListener expand = !expandable ? null : Util.onMouse(e->{ + if (e.getButton() == 1) setExpanded(!expanded); }, null); // Expand button - btnExpand = new JLabel(expand != null ? "+" : " "); + btnExpand = new JLabel(expandable ? "+" : " "); btnExpand.setHorizontalAlignment(SwingConstants.CENTER); - if (expand != null) + if (expandable) btnExpand.addMouseListener(expand); var gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTH; @@ -79,7 +85,7 @@ class Register { // Name label lblName = new JLabel(name); - if (expand != null) + if (expandable) lblName.addMouseListener(expand); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTH; @@ -94,7 +100,7 @@ class Register { txtValue.setText("00000000"); gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; - gbc.insets = new Insets(0, 4, 0, 0); + gbc.insets = new Insets(0, 4, 0, 0); list.add(txtValue, gbc); // Value changed @@ -116,6 +122,7 @@ class Register { case PROGRAM : initProgram(); break; case VUE.CHCW: initCHCW (); break; case VUE.ECR : initECR (); break; + case VUE.PC : initPC (); break; case VUE.PIR : initPIR (); break; case VUE.PSW : initPSW (); break; case VUE.TKCW: initTKCW (); break; @@ -123,19 +130,25 @@ class Register { } // Expansion spacer - spacer = new JPanel(null); - spacer.setOpaque(false); - spacer.setPreferredSize(new Dimension(0, 0)); - spacer.setVisible(false); - list.add(spacer, new GridBagConstraints()); + if (index != VUE.PC) { + spacer = new JPanel(null); + spacer.setOpaque(false); + spacer.setPreferredSize(new Dimension(0, 0)); + spacer.setVisible(false); + gbc = new GridBagConstraints(); + list.add(spacer, gbc); + } // Expansion area expansion.setOpaque(false); expansion.setVisible(false); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.WEST; + if (index == VUE.PC) + gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.insets = new Insets(0, 4, 0, 0); + gbc.weightx = 1; list.add(expansion, gbc); } @@ -168,6 +181,50 @@ class Register { group.add(addRadioButton("cpu.float" , FLOAT )); } + // Expansion controls for PC + private void initPC() { + expansion = new JPanel(new GridBagLayout()); + + // Configure controls + for (int x = 0; x < 2; x++) { + + // Indentation + var spacer = new JPanel(null); + spacer.setOpaque(false); + spacer.setPreferredSize(new Dimension(0, 0)); + var gbc = new GridBagConstraints(); + gbc.weightx = 1; + expansion.add(spacer, gbc); + + // Name label + var label = new JLabel(); + parent.app.localizer.add(label, + x == 0 ? "cpu.jump_from" : "cpu.jump_to" ); + gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.NORTHWEST; + expansion.add(label, gbc); + + // Value text box + var txt = new JTextField(); + txt.addActionListener(e->{ + txt.setText((String) txt.getClientProperty("text")); + list.requestFocus(); + }); + txt.setBorder(null); + txt.setOpaque(false); + gbc = new GridBagConstraints(); + gbc.gridwidth = GridBagConstraints.REMAINDER; + gbc.insets = new Insets(0, 4, 0, 0); + expansion.add(txt, gbc); + + // Initialize the corresponding component field + if (x == 0) + txtJumpFrom = txt; + else txtJumpTo = txt; + } + + } + // Expansion controls for PSW private void initPSW() { expansion = new JPanel(new GridBagLayout()); @@ -221,13 +278,23 @@ class Register { txtValue.setText( type != PROGRAM || mode == HEX ? String.format("%08X", value) : - mode == SIGNED ? Integer.toString(value) : + mode == SIGNED ? Integer.toString(value) : mode == UNSIGNED ? Long.toString(value & 0xFFFFFFFFL) : Float.toString(Float.intBitsToFloat(value)) ); - // Expansion controls - for (var control : controls) { + // PC expansion controls + if (index == VUE.PC) for (int x = 0; x < 2; x++) { + JTextField txt = x == 0 ? txtJumpFrom : txtJumpTo; + int index = x == 0 ? VUE.JUMP_FROM : VUE.JUMP_TO; + int value = parent.vue.getRegister(index, true); + String text = String.format("%08X", value); + txt.putClientProperty("text", text); + txt.setText(text); + } + + // Other expansion controls + else for (var control : controls) { // Check box if (control instanceof JCheckBox) { @@ -256,16 +323,16 @@ class Register { void setExpanded(boolean expanded) { // Error checking - if (type == VUE.PC) + if (!expandable) return; // Update controls this.expanded = expanded; - btnExpand.setText (expanded ? "-" : "+"); + btnExpand.setText(expanded ? "-" : "+"); + if (index != VUE.PC) + spacer.setVisible(expanded); expansion.setVisible(expanded); - spacer .setVisible(expanded); list.revalidate(); - list.repaint(); } // Specify the width of the expand button @@ -280,9 +347,15 @@ class Register { this.font = font; // Value text box + var size = new Dimension(8 * fontWidth + 4, fontHeight); txtValue.setFont(font); - txtValue.setPreferredSize( - new Dimension(8 * fontWidth + 4, fontHeight)); + txtValue.setPreferredSize(size); + if (index == VUE.PC) { + txtJumpFrom.setFont(font); + txtJumpFrom.setPreferredSize(size); + txtJumpTo .setFont(font); + txtJumpTo .setPreferredSize(size); + } // Expansion controls for (var ctrl : controls) { @@ -291,7 +364,7 @@ class Register { if ((Boolean) ctrl.getClientProperty("hex")) ((JTextField) ctrl).setFont(font); int digits = (Integer) ctrl.getClientProperty("digits"); - var size = ctrl.getPreferredSize(); + size = ctrl.getPreferredSize(); size.width = digits * fontWidth + 4; ctrl.setPreferredSize(size); } @@ -334,7 +407,7 @@ class Register { var gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.gridwidth = 2; - gbc.insets = new Insets(0, 4, 0, 0); + gbc.insets = new Insets(0, 4, 0, 4); expansion.add(ctrl, gbc); } @@ -343,7 +416,7 @@ class Register { // Configure control var ctrl = new JRadioButton(); - parent.app.getLocalizer().add(ctrl, key); + parent.app.localizer.add(ctrl, key); ctrl.setBorder(null); ctrl.setFocusable(false); ctrl.setOpaque(false); diff --git a/src/desktop/util/Localizer.java b/src/desktop/util/Localizer.java index 3a40faf..789ec6e 100644 --- a/src/desktop/util/Localizer.java +++ b/src/desktop/util/Localizer.java @@ -314,6 +314,7 @@ public class Localizer { control instanceof AbstractButton || control instanceof JFrame || control instanceof JInternalFrame || + control instanceof JLabel || control instanceof JPanel || // TitledBorder control instanceof JTextComponent )) return false; @@ -490,6 +491,8 @@ public class Localizer { ((JFrame ) control).setTitle(values[0]); if (control instanceof JInternalFrame) ((JInternalFrame) control).setTitle(values[0]); + if (control instanceof JLabel ) + ((JLabel ) control).setText (values[0]); if (control instanceof JTextComponent) ((JTextComponent) control).setText (values[0]); diff --git a/src/desktop/vue/CPU.java b/src/desktop/vue/CPU.java index 5250aad..5ec8bd9 100644 --- a/src/desktop/vue/CPU.java +++ b/src/desktop/vue/CPU.java @@ -7,10 +7,11 @@ class CPU { private JavaVUE vue; // Emulation state // Package fields - int cycles; // Cycles until next stage - int fetch; // Fetch unit index - int lastPC; // Previous value of PC - int stage; // Current processing stage + int cycles; // Cycles until next stage + int fetch; // Fetch unit index + int jumpFrom; // Source PC of most recent jump + int jumpTo; // Destination PC of most recent jump + int stage; // Current processing stage // Program registers int[] program; @@ -149,7 +150,8 @@ class CPU { // Configure registers ecr_eicc = 0xFFF0; - lastPC = 0xFFFFFFF0; + jumpFrom = 0xFFFFFFF0; + jumpTo = 0xFFFFFFF0; pc = 0xFFFFFFF0; psw_np = 1; } diff --git a/src/desktop/vue/JavaVUE.java b/src/desktop/vue/JavaVUE.java index 73fe217..903eb2a 100644 --- a/src/desktop/vue/JavaVUE.java +++ b/src/desktop/vue/JavaVUE.java @@ -40,8 +40,16 @@ class JavaVUE extends VUE { // Retrieve a register value public int getRegister(int index, boolean system) { + + // Non-indexed registers + if (system) switch (index) { + case VUE.PC : return cpu.pc; + case VUE.JUMP_FROM: return cpu.jumpFrom; + case VUE.JUMP_TO : return cpu.jumpTo; + } + + // Indexed registers return - index == VUE.PC && system ? cpu.pc : index < 0 || index > 31 ? 0 : system ? cpu.getSystemRegister(index) : cpu.program[index] diff --git a/src/desktop/vue/NativeVUE.c b/src/desktop/vue/NativeVUE.c index e87f5cb..6f67948 100644 --- a/src/desktop/vue/NativeVUE.c +++ b/src/desktop/vue/NativeVUE.c @@ -99,9 +99,9 @@ JNIEXPORT jbyteArray JNICALL Java_vue_NativeVUE_getROM return NULL; // Copy the ROM data - jbyteArray ret = (*env)->NewByteArray(env, (jint)core->vue.bus.rom_size); + jbyteArray ret = (*env)->NewByteArray(env, (jint)core->vue.bus.romSize); jbyte *elems = (*env)->GetByteArrayElements(env, ret, NULL); - memcpy(elems, core->vue.bus.rom, core->vue.bus.rom_size); + memcpy(elems, core->vue.bus.rom, core->vue.bus.romSize); (*env)->ReleaseByteArrayElements(env, ret, elems, 0); return ret; } diff --git a/src/desktop/vue/VUE.java b/src/desktop/vue/VUE.java index ae52705..72076ae 100644 --- a/src/desktop/vue/VUE.java +++ b/src/desktop/vue/VUE.java @@ -20,17 +20,21 @@ public abstract class VUE { public static final int S32 = 4; // 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 PC = -1; - public static final int PIR = 6; - public static final int PSW = 5; - public static final int TKCW = 7; + 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;