summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Lee <me@nwlee.tech>2026-06-03 20:50:08 -0500
committerNathan Lee <me@nwlee.tech>2026-06-03 20:50:08 -0500
commit966eb6833451371ffe42cf77d6e08ac778abf34b (patch)
tree9b11e7759dd8de2e94a0212d9dd1db2bb73a4ae7
parentc14dd3e17fc41669b95d6cda80ff028f319420b7 (diff)
finish I set instructions
-rw-r--r--src/main.rs27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs
index 8974330..ad3043d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -241,8 +241,25 @@ fn handle_instruction(memory: &mut [u8], registers: &mut [u32], pc: &mut u32) {
_ => panic!("Illegal instruction: {:x}", word)
}
},
- 0b1101111 => println!("J-type (todo)"),
- 0b1100111 => println!("jalr"),
+ 0b1101111 => {
+ let rd = (word >> 7) & 0b11111;
+ let imm = word >> 12;
+ registers[rd as usize] = *pc + 4;
+ *pc += imm;
+ }, // jal
+ 0b1100111 => {
+ let rs1 = (word >> 15) & 0b11111;
+ let rd = (word >> 7) & 0b11111;
+ let imm = word >> 20;
+
+ let sentinel = (word >> 12) & 0b111;
+ if (sentinel != 0) {
+ panic!("Illegal instruction: {:x}", word);
+ }
+
+ registers[rd as usize] = *pc + 4;
+ *pc = registers[rs1 as usize] + imm;
+ },
0b0110111 => {
let imm = word >> 12;
let rd = ((word >> 7) & 0b11111) as usize;
@@ -251,7 +268,7 @@ fn handle_instruction(memory: &mut [u8], registers: &mut [u32], pc: &mut u32) {
0b0010111 => {
let imm = word >> 12;
let rd = (word >> 7) & 0b11111;
- registers[rd as usize] = pc + (imm << 12); // auipc
+ registers[rd as usize] = *pc + (imm << 12); // auipc
}
0b1110011 => {
// ecall
@@ -259,7 +276,7 @@ fn handle_instruction(memory: &mut [u8], registers: &mut [u32], pc: &mut u32) {
"TRAP! syscall {} with gp registers {:?} calling instruction {:x}",
registers[17],
&registers[10..17],
- pc
+ *pc
);
if registers[17] == 0 {
// sys_write: just a debug
@@ -268,7 +285,7 @@ fn handle_instruction(memory: &mut [u8], registers: &mut [u32], pc: &mut u32) {
let total_bytes = &memory[buf..buf + len];
io::stdout().write(&total_bytes).unwrap();
}
- }
+ } // ecall (ebreak not implemented)
_ => panic!("Illegal instruction or todo: {:x}", word),
}