Fix read_memory and implemented write_memory
This commit is contained in:
parent
547abd001b
commit
89cc9423bd
@ -37,43 +37,45 @@ impl Machine {
|
|||||||
|
|
||||||
/// Read from main memory of the machine
|
/// Read from main memory of the machine
|
||||||
///
|
///
|
||||||
|
/// `panic!` when size is not 1, 2, 4 or 8
|
||||||
|
///
|
||||||
/// ### Parameters
|
/// ### Parameters
|
||||||
///
|
///
|
||||||
/// - **machine** which contains the main memory
|
/// - **machine** which contains the main memory
|
||||||
/// - **size** the number of bytes to read (1, 2, 4, 8)
|
/// - **size** the number of bytes to read (1, 2, 4, 8)
|
||||||
/// - **address** in the memory to read
|
/// - **address** in the memory to read
|
||||||
pub fn read_memory(machine : &mut Machine, size : i32, address : usize) -> u64 {
|
pub fn read_memory(machine : &mut Machine, size : i32, address : usize) -> u64 {
|
||||||
if size != 1 && size != 2 && size != 4 && size != 8 {
|
if ![1, 2, 4, 8].contains(&size) {
|
||||||
panic!("ERROR read_memory : wrong size parameter {}, must be (1, 2, 4 or 8)", size);
|
panic!("ERROR read_memory : wrong size parameter {}, must be (1, 2, 4 or 8)", size);
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut ret : u64 = machine.main_memory[address] as u64;
|
let mut ret: u64 = 0;
|
||||||
if size == 2 || size == 4 || size == 8 {
|
for i in 0..size {
|
||||||
ret <<= 8;
|
ret <<= 8;
|
||||||
ret += machine.main_memory[address + 1] as u64;
|
ret += machine.main_memory[address + i as usize] as u64;
|
||||||
}
|
|
||||||
if size == 4 || size == 8 {
|
|
||||||
ret <<= 8;
|
|
||||||
ret += machine.main_memory[address + 2] as u64;
|
|
||||||
}
|
|
||||||
if size == 8 {
|
|
||||||
ret <<= 8;
|
|
||||||
ret += machine.main_memory[address + 3] as u64;
|
|
||||||
}
|
}
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write to the main memory of the machine
|
/// Write to the main memory of the machine
|
||||||
///
|
///
|
||||||
/// **machine** contains the memory
|
/// `panic!` when size is not 1, 2, 4 or 8
|
||||||
/// **size** the number of bytes to write (1, 2, 4 or 8)
|
///
|
||||||
/// **address** the address to write to
|
/// ### Parameters
|
||||||
/// **value** data to be written
|
///
|
||||||
pub fn write_memory(machine: &mut Machine, size: i32, address: usize, value: i64) {
|
/// - **machine** contains the memory
|
||||||
if ![1, 2, 3, 4].contains(&size) {
|
/// - **size** the number of bytes to write (1, 2, 4 or 8)
|
||||||
|
/// - **address** the address to write to
|
||||||
|
/// - **value** data to be written
|
||||||
|
pub fn write_memory(machine: &mut Machine, size: i32, address: usize, value: u64) {
|
||||||
|
if ![1, 2, 4, 8].contains(&size) {
|
||||||
panic!("ERROR write_memory: WRONG `size` PARAMETER ({}), must be 1, 2, 4 or 8", size)
|
panic!("ERROR write_memory: WRONG `size` PARAMETER ({}), must be 1, 2, 4 or 8", size)
|
||||||
}
|
}
|
||||||
todo!("Write memory not implemented yet");
|
let map: [u64; 8] = [0xff000000_00000000, 0x00ff0000_00000000, 0x0000ff00_00000000, 0x000000ff_00000000,
|
||||||
|
0x00000000_ff00000000, 0x00000000_00ff0000, 0x00000000_0000ff00, 0x00000000_000000ff];
|
||||||
|
for i in 0..size as usize {
|
||||||
|
machine.main_memory[address + i as usize] = (value & map[i]) as u8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Execute the instructions table of a machine putted in param
|
/// Execute the instructions table of a machine putted in param
|
||||||
@ -209,6 +211,7 @@ impl Machine {
|
|||||||
RISCV_ST => {
|
RISCV_ST => {
|
||||||
match inst.funct3 {
|
match inst.funct3 {
|
||||||
RISCV_ST_STB => {
|
RISCV_ST_STB => {
|
||||||
|
|
||||||
todo!("Write memory here");
|
todo!("Write memory here");
|
||||||
},
|
},
|
||||||
RISCV_ST_STH => {
|
RISCV_ST_STH => {
|
||||||
|
Loading…
Reference in New Issue
Block a user