#include #include "MemoryBus.h" // ---------------------------------------------------------------------------------------------- // We use this class and single object to fill all unused memory locations in the memory map. // Returns 0xFFFF on all access as a real intellivision would with unused memory regions. // ---------------------------------------------------------------------------------------------- class UnusedMemory : public Memory { public: UnusedMemory() {}; virtual ~UnusedMemory() {} virtual void reset() {} UINT8 getByteWidth() {return 2;} UINT16 getReadSize() {return 2;} UINT16 getReadAddress() {return 0;} UINT16 getReadAddressMask() {return 0xFFFF;} inline virtual UINT16 peek(UINT16 location) {return 0xFFFF;} UINT16 getWriteSize() {return 2;} UINT16 getWriteAddress() {return 0;} UINT16 getWriteAddressMask() {return 0xFFFF;} virtual void poke(UINT16 location, UINT16 value) {} } MyUnusedMemory; MemoryBus::MemoryBus() { UINT32 size = 1 << (sizeof(UINT16) << 3); UINT64 i; writeableMemoryCounts = new UINT8[65536]; memset(writeableMemoryCounts, 0, sizeof(UINT8) * size); writeableMemorySpace = new Memory**[size]; for (i = 0; i < size; i++) { writeableMemorySpace[i] = new Memory*[MAX_OVERLAPPED_MEMORIES]; for (int j=0; jreset(); } 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); } }