#include #include #include #include #include "cpu.h" #include "mem.h" #include "log.h" uint8_t *MEM; uint64_t mem_size = 64 * 1024 * 1024; void store(size_t addr, uint32_t value) { if (addr & 0x2) trap(TRP_UNALIGNED); if (addr >= mem_size) trap(TRP_SEGV); memcpy(&MEM[addr], &value, 4); } uint32_t load(size_t addr) { uint32_t tmp32; if (addr & 0x2) trap(TRP_UNALIGNED); if (addr >= mem_size) trap(TRP_SEGV); memcpy(&tmp32, &MEM[addr], 4); return tmp32; } void push(uint32_t value) { //debug("push(%"PRIu32")", value); GPR[StP] -= 4; store(GPR[StP], value); } uint32_t pop(void) { uint32_t tmp32 = load(GPR[StP]); //debug("pop(%"PRIu32")", tmp32); GPR[StP] += 4; return tmp32; }