in atari_py/ale_interface/src/emucore/CartDPC.cxx [327:429]
void CartridgeDPC::poke(uInt16 address, uInt8 value)
{
address = address & 0x0FFF;
// Clock the random number generator. This should be done for every
// cartridge access, however, we're only doing it for the DPC and
// hot-spot accesses to save time.
clockRandomNumberGenerator();
if((address >= 0x0040) && (address < 0x0080))
{
// Get the index of the data fetcher that's being accessed
uInt32 index = address & 0x07;
uInt32 function = (address >> 3) & 0x07;
switch(function)
{
// DFx top count
case 0x00:
{
myTops[index] = value;
myFlags[index] = 0x00;
break;
}
// DFx bottom count
case 0x01:
{
myBottoms[index] = value;
break;
}
// DFx counter low
case 0x02:
{
if((index >= 5) && myMusicMode[index - 5])
{
// Data fecther is in music mode so its low counter value
// should be loaded from the top register not the poked value
myCounters[index] = (myCounters[index] & 0x0700) |
(uInt16)myTops[index];
}
else
{
// Data fecther is either not a music mode data fecther or it
// isn't in music mode so it's low counter value should be loaded
// with the poked value
myCounters[index] = (myCounters[index] & 0x0700) | (uInt16)value;
}
break;
}
// DFx counter high
case 0x03:
{
myCounters[index] = (((uInt16)value & 0x07) << 8) |
(myCounters[index] & 0x00ff);
// Execute special code for music mode data fetchers
if(index >= 5)
{
myMusicMode[index - 5] = (value & 0x10);
// NOTE: We are not handling the clock source input for
// the music mode data fetchers. We're going to assume
// they always use the OSC input.
}
break;
}
// Random Number Generator Reset
case 0x06:
{
myRandomNumber = 1;
break;
}
default:
{
break;
}
}
}
else
{
// Switch banks if necessary
switch(address)
{
case 0x0FF8:
// Set the current bank to the lower 4k bank
bank(0);
break;
case 0x0FF9:
// Set the current bank to the upper 4k bank
bank(1);
break;
default:
break;
}
}
}