diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-06-03 20:50:08 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-06-03 20:50:08 -0500 |
| commit | 966eb6833451371ffe42cf77d6e08ac778abf34b (patch) | |
| tree | 9b11e7759dd8de2e94a0212d9dd1db2bb73a4ae7 /src | |
| parent | c14dd3e17fc41669b95d6cda80ff028f319420b7 (diff) | |
finish I set instructions
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 27 |
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], ®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), } |
