From 966eb6833451371ffe42cf77d6e08ac778abf34b Mon Sep 17 00:00:00 2001 From: Nathan Lee Date: Wed, 3 Jun 2026 20:50:08 -0500 Subject: finish I set instructions --- src/main.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'src') 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], ®isters[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), } -- cgit v1.2.3