Files
RISC-B/cpu/memory.c
2025-02-05 14:08:20 +01:00

95 lines
1.9 KiB
C

//
// Created by bruno on 2.2.2025.
//
#include "memory.h"
uint8_t write_mem(CPU *cpu, uint32_t addr, uint8_t value) {
if (addr >= MEM_SIZE) {
return 1;
}
switch (addr) {
default:
cpu->memory[addr] = value;
}
return 0;
}
uint8_t read_mem(CPU *cpu, uint32_t addr) {
if (addr >= MEM_SIZE) {
return 0;
}
switch (addr) {
default:
return cpu->memory[addr];
}
}
uint16_t read_mem16(CPU *cpu, uint32_t addr) {
return read_mem(cpu, addr) | (read_mem(cpu, addr + 1) << 8);
}
uint32_t read_mem32(CPU *cpu, uint32_t addr) {
return read_mem16(cpu, addr) | (read_mem16(cpu, addr + 2) << 16);
}
uint32_t read_address(CPU *cpu) {
uint32_t out = read_mem16(cpu, cpu->pc) | (read_mem16(cpu, cpu->pc + 2) << 16);
cpu->pc += 4;
if (out >= MEM_SIZE) {
out = MEM_SIZE - 1;
}
return out;
}
uint8_t read_reg_number(CPU *cpu) {
uint8_t out = read_mem(cpu, cpu->pc++);
if (out >= REG_COUNT) {
return 0;
}
return out;
}
uint8_t read_reg(CPU *cpu, uint8_t number) {
if (number >= REG_COUNT) {
return 0;
}
return cpu->regs[number];
}
uint8_t write_reg(CPU *cpu, uint8_t number, uint8_t value) {
if (number >= REG_COUNT) {
return 1;
}
cpu->regs[number] = value;
return 0;
}
uint8_t write_mem16(CPU *cpu, uint32_t addr, uint16_t value) {
uint8_t status = write_mem(cpu, addr, value & 0xFF);
if (status) {
return status;
}
status = write_mem(cpu, addr + 1, (value >> 8) & 0xFF);
if (status) {
return status;
}
return 0;
}
uint8_t write_mem32(CPU *cpu, uint32_t addr, uint32_t value) {
uint8_t status = write_mem16(cpu, addr, value & 0xFFFF);
if (status) {
return status;
}
status = write_mem16(cpu, addr + 2, (value >> 16) & 0xFFFF);
if (status) {
return status;
}
return 0;
}