instruction fetch and decode

This commit is contained in:
inixyz
2023-10-06 20:31:49 +03:00
parent 41cacd9ae5
commit 55cf6929c3

View File

@@ -5,32 +5,33 @@ typedef struct{
uint8_t* memory; uint8_t* memory;
}tinyrv_cpu; }tinyrv_cpu;
uint32_t tinyrv_ram_load(const tinyrv_cpu* cpu, const uint32_t addr, const uint32_t MEMORY_OFFSET = 0x80000000;
const uint8_t size){
uint32_t val = 0; static inline uint32_t load32(const uint8_t* memory, const uint32_t addr){
return *(uint32_t*)(memory + addr - MEMORY_OFFSET);
for(uint8_t i = 0; i < size; i++){
val |= (uint32_t)cpu->memory[addr + i] << (i * 8);
} }
return val; static inline uint32_t select_bits(const uint32_t val, const uint8_t end,
const uint8_t start){
const uint8_t len = end - start + 1;
return val >> start & (1 << len - 1);
} }
#include <stdio.h> void tinyrv_step(tinyrv_cpu* cpu){
//instruction fetch
const uint32_t inst = load32(cpu->memory, cpu->pc);
cpu->pc += 4;
//instruction decoding
#define rd select_bits(inst, 11, 7)
#define rs1 select_bits(inst, 19, 15)
#define rs2 select_bits(inst, 24, 20)
const uint8_t opcode = select_bits(inst, 6, 0);
}
int main(){ int main(){
uint8_t memory[100];
tinyrv_cpu cpu; tinyrv_cpu cpu;
cpu.memory = memory; cpu.pc = MEMORY_OFFSET;
memory[0] = 0xAA;
memory[1] = 0xBB;
memory[2] = 0xCC;
memory[3] = 0xDD;
printf("%x\n", tinyrv_ram_load(&cpu, 0, 1));
printf("%x\n", tinyrv_ram_load(&cpu, 0, 2));
printf("%x\n", tinyrv_ram_load(&cpu, 0, 3));
printf("%x\n", tinyrv_ram_load(&cpu, 0, 4));
} }