Actually most of the emulator emulate mapping adress with a switch case redirecting the memory operation to the correct chip.
For example to access ROM/RAM :
Code: Select all
u32 Genesis::c68kReadByte(u32 adr)
{
u32 data;
switch((adr >> 21) & 7)
{
case 7: /* RAM */
adr &= 0xFFFF;
READ_BYTE(work_ram, adr, data)
return data;
case 0: /* ROM */
case 1:
adr &= 0xFFFFFF;
READ_BYTE(cart->rom, adr, data)
return data;
...
In my emulator all chips are implementing interface depending their bus capability.
ByteReader : able to read byte
WordReader : '' word
ByteWriter : able to write Byte
WordWriter " Word
So it will be easy to create a 16MB function table for each type of access in wich each entry is a direct link to the Chip connected at this adress.
The code for my 68KBus could be (simplified) :
Code: Select all
public Class 68KBus {
private :
ByteReader* byteReaderMapping[0x1000000];
WordReader* wordReaderMapping[0x1000000];
ByteWriter* byteWriterMapping[0x1000000];
WordWriter* wordWriterMapping[0x1000000];
public :
void init();
}
public void 68KBus::init()
{
u32 i;
/* Mapping ROM Cartridge */
for(i=0;i<0x400000;i++)
{
/* Cartridge implement my ByteReader, WordReader, ByteWriter and WordWriter Interface */
byteReaderMapping[i] = cartridge;
wordReaderMapping[i] = cartridge;
byteWriterMapping[i] = cartridge;
wordWriterMapping[i] = cartridge;
...
}
}
Code: Select all
u32 Genesis::c68kReadByte(u32 adr)
{
u32 data;
data = byteReaderMapping[adr]->readByte(adr);
return (data);
}
Thanks !