summaryrefslogtreecommitdiff
path: root/j_type_handler.c
diff options
context:
space:
mode:
Diffstat (limited to 'j_type_handler.c')
-rw-r--r--j_type_handler.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/j_type_handler.c b/j_type_handler.c
new file mode 100644
index 0000000..648e882
--- /dev/null
+++ b/j_type_handler.c
@@ -0,0 +1,46 @@
+/*
+ Nios-sim - one simple NIOSII simulator only for personal interest and fun.
+ Copyright (C) 2010 chysun2000@gmail.com
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+*/
+
+#include <stdio.h>
+#include "public.h"
+#include "niosii.h"
+#include "instruction.h"
+
+static uint32_t call(struct NIOS_CPU * cpu, uint32_t code)
+{
+ def_j_type_code;
+ uint32_t imm26 = (uint32_t)instr->imm26;
+
+ cpu->gp_regs[ra] = cpu->pc + 4;
+ cpu->pc = (imm26 * 4) | (cpu->pc & 0xF0000000);
+ return PC_INC_BY_INSTR;
+}
+
+static uint32_t jmpi(struct NIOS_CPU * cpu, uint32_t code)
+{
+ def_j_type_code;
+ cpu->pc = (((uint32_t)(instr->imm26) * 4) & 0xFFFFFFF)| (cpu->pc & 0xF0000000);
+ return PC_INC_BY_INSTR;
+}
+
+#define J_TYPE_HANDLER_COUNT (0x40)
+struct j_type_handler j_type_handlers[J_TYPE_HANDLER_COUNT] = {
+ [CALL] = handler_item(call),
+ [JMPI] = handler_item(jmpi)
+};