From 519e1e0f76b8fcf3fcefa84a15bfd904c087c273 Mon Sep 17 00:00:00 2001 From: Paul Oliver Date: Sun, 9 Feb 2025 13:07:55 -0800 Subject: Adds support for non-looping memory --- src/salis.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'src/salis.c') diff --git a/src/salis.c b/src/salis.c index 814dd0d..6714038 100644 --- a/src/salis.c +++ b/src/salis.c @@ -73,51 +73,93 @@ const Proc g_dead_proc; char g_mnemo_table[0x100][MNEMONIC_BUFF_SIZE]; #endif +#ifdef MVEC_LOOP u64 mvec_loop(u64 addr) { return addr % MVEC_SIZE; } +#endif bool mvec_is_alloc(const Core *core, u64 addr) { assert(core); +#ifdef MVEC_LOOP return core->mvec[mvec_loop(addr)] & MALL_FLAG ? true : false; +#else + if (addr < MVEC_SIZE) { + return core->mvec[addr] & MALL_FLAG ? true : false; + } else { + return true; + } +#endif } void mvec_alloc(Core *core, u64 addr) { assert(core); assert(!mvec_is_alloc(core, addr)); +#ifdef MVEC_LOOP core->mvec[mvec_loop(addr)] |= MALL_FLAG; +#else + assert(addr < MVEC_SIZE); + core->mvec[addr] |= MALL_FLAG; +#endif core->mall++; } void mvec_free(Core *core, u64 addr) { assert(core); assert(mvec_is_alloc(core, addr)); +#ifdef MVEC_LOOP core->mvec[mvec_loop(addr)] ^= MALL_FLAG; +#else + assert(addr < MVEC_SIZE); + core->mvec[addr] ^= MALL_FLAG; +#endif core->mall--; } u8 mvec_get_byte(const Core *core, u64 addr) { assert(core); +#ifdef MVEC_LOOP return core->mvec[mvec_loop(addr)]; +#else + if (addr < MVEC_SIZE) { + return core->mvec[addr]; + } else { + return 0; + } +#endif } u8 mvec_get_inst(const Core *core, u64 addr) { assert(core); +#ifdef MVEC_LOOP return core->mvec[mvec_loop(addr)] & INST_MASK; +#else + if (addr < MVEC_SIZE) { + return core->mvec[addr] & INST_MASK; + } else { + return 0; + } +#endif } void mvec_set_inst(Core *core, u64 addr, u8 inst) { assert(core); assert(inst < INST_CAPS); +#ifdef MVEC_LOOP core->mvec[mvec_loop(addr)] &= MALL_FLAG; core->mvec[mvec_loop(addr)] |= inst; +#else + assert(addr < MVEC_SIZE); + core->mvec[addr] &= MALL_FLAG; + core->mvec[addr] |= inst; +#endif } #if MUTA_FLIP_BIT == 1 void mvec_flip_bit(Core *core, u64 addr, int bit) { assert(core); assert(bit < 8); - core->mvec[mvec_loop(addr)] ^= (1 << bit) & INST_MASK; + core->mvec[addr] ^= (1 << bit) & INST_MASK; } #endif -- cgit v1.2.1