From c41ddbc09420b9a79257429ab6e4a4c3c48d4b64 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Wed, 6 Feb 2013 20:05:47 -0500 Subject: [PATCH] new memory code --- cpu/fellow.h | 0 cpu/memory.c | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 cpu/fellow.h create mode 100644 cpu/memory.c diff --git a/cpu/fellow.h b/cpu/fellow.h new file mode 100644 index 0000000..e69de29 diff --git a/cpu/memory.c b/cpu/memory.c new file mode 100644 index 0000000..c6752d7 --- /dev/null +++ b/cpu/memory.c @@ -0,0 +1,120 @@ +#include "defs.h" +#include "fmem.h" +#include "CpuModule.h" + + +/*============================================================================*/ +/* Illegal read / write fault information */ +/*============================================================================*/ + +BOOLE memory_fault_read = FALSE; /* TRUE - read / FALSE - write */ +ULO memory_fault_address = 0; + +/*============================================================================== +Raises exception 3 when a word or long is accessing an odd address +and the CPU is < 020 +==============================================================================*/ + +static void memoryOddRead(ULO address) +{ + if (address & 1) + { + if (cpuGetModelMajor() < 2) + { + memory_fault_read = TRUE; + memory_fault_address = address; + cpuThrowAddressErrorException(); + } + } +} + +static void memoryOddWrite(ULO address) +{ + if (address & 1) + { + if (cpuGetModelMajor() < 2) + { + memory_fault_read = FALSE; + memory_fault_address = address; + cpuThrowAddressErrorException(); + } + } +} + + +// new memory functions. + +static uint8_t *Memory = NULL; +static uint32_t MemorySize = 0; + +void memorySetMemory(uint8_t *memory, uint32_t size) +{ + Memory = memory; + MemorySize = size; +} + +UBY memoryReadByte(ULO address) +{ + // hmmm... 32-bit clean addresses? + if (address < MemorySize) + return Memory[address]; + return 0; +} + +UWO memoryReadWord(ULO address) +{ + if (address & 0x01) memoryOddRead(address); + + if (address + 1 < MemorySize) + return (Memory[address++] << 8) + | (Memory[address++] << 0); + + return 0; +} + +ULO memoryReadLong(ULO address) +{ + if (address & 0x01) memoryOddRead(address); + + if (address + 1 < MemorySize) + return (Memory[address++] << 24) + | (Memory[address++] << 16) + | (Memory[address++] << 8) + | (Memory[address++] << 0); + + return 0; + +} +void memoryWriteByte(UBY data, ULO address) +{ + if (address < MemorySize) + { + Memory[address] = data; + } +} + +void memoryWriteWord(UWO data, ULO address) +{ + if (address & 0x01) memoryOddWrite(address); + + if (address + 1 < MemorySize) + { + Memory[address++] = data >> 8; + Memory[address++] = data >> 0; + } +} + +void memoryWriteLong(ULO data, ULO address) +{ + if (address & 0x01) memoryOddWrite(address); + + if (address + 3 < MemorySize) + { + Memory[address++] = data >> 24; + Memory[address++] = data >> 16; + Memory[address++] = data >> 8; + Memory[address++] = data >> 0; + } +} + +