#include #include "MemoryBus.h" MemoryBus::MemoryBus() { UINT32 size = 1 << (sizeof(UINT16) << 3); UINT64 i; writeableMemoryCounts = new UINT8[size]; memset(writeableMemoryCounts, 0, sizeof(UINT8) * size); writeableMemorySpace = new Memory**[size]; for (i = 0; i < size; i++) writeableMemorySpace[i] = new Memory*[MAX_OVERLAPPED_MEMORIES]; readableMemoryCounts = new UINT8[size]; memset(readableMemoryCounts, 0, sizeof(UINT8) * size); readableMemorySpace = new Memory**[size]; for (i = 0; i < size; i++) readableMemorySpace[i] = new Memory*[MAX_OVERLAPPED_MEMORIES]; mappedMemoryCount = 0; } MemoryBus::~MemoryBus() { UINT64 size = 1 << (sizeof(UINT16) << 3); UINT64 i; delete[] writeableMemoryCounts; for (i = 0; i < size; i++) delete[] writeableMemorySpace[i]; delete[] writeableMemorySpace; delete[] readableMemoryCounts; for (i = 0; i < size; i++) delete[] readableMemorySpace[i]; delete[] readableMemorySpace; } void MemoryBus::reset() { for (UINT8 i = 0; i < mappedMemoryCount; i++) mappedMemories[i]->reset(); } void MemoryBus::addMemory(Memory* m) { UINT8 bitCount = sizeof(UINT16)<<3; UINT8 bitShifts[sizeof(UINT16)<<3]; UINT8 i; //get the important info UINT16 readSize = m->getReadSize(); UINT16 readAddress = m->getReadAddress(); UINT16 readAddressMask = m->getReadAddressMask(); UINT16 writeSize = m->getWriteSize(); UINT16 writeAddress = m->getWriteAddress(); UINT16 writeAddressMask = m->getWriteAddressMask(); //add all of the readable locations, if any if (readAddressMask != 0) { UINT8 zeroCount = 0; for (i = 0; i < bitCount; i++) { if (!(readAddressMask & (1<getReadSize(); UINT16 readAddress = m->getReadAddress(); UINT16 readAddressMask = m->getReadAddressMask(); UINT16 writeSize = m->getWriteSize(); UINT16 writeAddress = m->getWriteAddress(); UINT16 writeAddressMask = m->getWriteAddressMask(); //add all of the readable locations, if any if (readAddressMask != 0) { UINT8 zeroCount = 0; for (i = 0; i < bitCount; i++) { if (!(readAddressMask & (1<peek(location); return value; } void MemoryBus::poke(UINT16 location, UINT16 value) { UINT8 numMemories = writeableMemoryCounts[location]; for (UINT16 i = 0; i < numMemories; i++) writeableMemorySpace[location][i]->poke(location, value); }