// // 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_addr(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(CPU *cpu) { uint8_t out = read_mem(cpu, cpu->pc++); if (out >= REG_COUNT) { out = REG_COUNT - 1; } return out; } 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; }