Merge pull request #50 from Perkka2/master

Code cleanup for EPSM addressing
This commit is contained in:
NovaSquirrel 2021-09-04 15:45:42 -04:00 committed by GitHub
commit 537fa89444
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -86,12 +86,12 @@ private:
void WriteToChipIRQ(uint16_t addr, uint8_t value) void WriteToChipIRQ(uint16_t addr, uint8_t value)
{ {
switch (addr) { switch (addr) {
case 0xC000: case 0x0:
case 0xC002: case 0x2:
currentRegister = value; currentRegister = value;
break; break;
case 0xE000: case 0x1:
if (currentRegister == 0x24) { if (currentRegister == 0x24) {
//Timer A High 8 bits //Timer A High 8 bits
//std::cout << "Timer A High 8 bits" << std::endl; //std::cout << "Timer A High 8 bits" << std::endl;
@ -135,7 +135,7 @@ private:
//std::cout << "enable IRQ's" << std::endl; //std::cout << "enable IRQ's" << std::endl;
} }
break; break;
case 0xE002: case 0x3:
/*if (currentRegister == 0x10) { /*if (currentRegister == 0x10) {
std::cout << "0x10" << std::endl; std::cout << "0x10" << std::endl;
}*/ }*/
@ -173,11 +173,9 @@ protected:
_clockIRQ += (getClockFrequency()*6) / (double)_console->GetCpu()->GetClockRate(_console->GetModel()); _clockIRQ += (getClockFrequency()*6) / (double)_console->GetCpu()->GetClockRate(_console->GetModel());
while (_clockIRQ >= _cycleCountIRQ) { while (_clockIRQ >= _cycleCountIRQ) {
_cycleCountIRQ++; _cycleCountIRQ++;
//std::cout << _cycleCountIRQ << std::endl;
if (irqATimerEnable) { if (irqATimerEnable) {
irqACurrentTimer--; irqACurrentTimer--;
if (!irqACurrentTimer) { if (!irqACurrentTimer) {
//std::cout << "***IRQ***" << std::endl;
irqATimerEnable = 0; irqATimerEnable = 0;
_console->GetCpu()->SetIrqSource(IRQSource::EPSM); _console->GetCpu()->SetIrqSource(IRQSource::EPSM);
} }
@ -186,7 +184,6 @@ protected:
if (irqBTimerEnable) { if (irqBTimerEnable) {
irqBCurrentTimer--; irqBCurrentTimer--;
if (!irqBCurrentTimer) { if (!irqBCurrentTimer) {
//std::cout << "***IRQ***" << std::endl;
irqBTimerEnable = 0; irqBTimerEnable = 0;
_console->GetCpu()->SetIrqSource(IRQSource::EPSM); _console->GetCpu()->SetIrqSource(IRQSource::EPSM);
} }
@ -252,52 +249,51 @@ public:
OPN2_SetChipType(0); OPN2_SetChipType(0);
} }
void WriteRegister(uint16_t addr, uint8_t value) void WriteRegister(uint16_t addr, uint8_t value, uint8_t custom = 0, uint8_t epsmA0 = 0, uint8_t epsmA1 = 0)
{ {
if (!custom) {
switch (addr) {
case 0x4016:
if ((value & 0x0F) == 0x02) {writeAddr = 0x0;} //A0 = 0, A1 = 0
if ((value & 0x0F) == 0x0A) {writeAddr = 0x1;} //A0 = 1, A1 = 0
if ((value & 0x0F) == 0x06) {writeAddr = 0x2;} //A0 = 0, A1 = 1
if ((value & 0x0F) == 0x0E) {writeAddr = 0x3;} //A0 = 1, A1 = 1
if (value & 0x0E) {writeValue = value;}
if ((value & 0x0F) == 0x00) {
writeValue = (writeValue & 0xF0) | (value >> 4);
if (addr == 0x4016) { const uint8_t a0 = !!(writeAddr & 0x1);
if ((value & 0x0F) == 0x02) { const uint8_t a1 = !!(writeAddr & 0x2);
writeValue = value; if (a0 == 0x0) { writeAddr = 0xC000; }
writeAddr = 0xC000; if (a0 == 0x1) { writeAddr = 0xE000; }
} if (a1 == 0x0) { EPSMSSGAudio::WriteRegister(writeAddr, value); }
if ((value & 0x0F) == 0x0A) { WriteToChip(a0 | (a1 << 1), writeValue);
writeValue = value; WriteToChipIRQ(a0 | (a1 << 1), value);
writeAddr = 0xE000; }
} break;
if ((value & 0x0F) == 0x06) { case 0x401c: //0xC000 A0 = 0, A1 = 0
writeValue = value; case 0x401d: //0xE000 A0 = 1, A1 = 0
writeAddr = 0xC002; case 0x401e: //0xC002 A0 = 0, A1 = 1
} case 0x401f: //0xE002 A0 = 1, A1 = 1
if ((value & 0x0F) == 0x0E) {
writeValue = value; const uint8_t a0 = !!(addr & 0x1); //const uint8_t a0 = (addr & 0xF000) == 0xE000;
writeAddr = 0xE002; const uint8_t a1 = !!(addr & 0x2); //const uint8_t a1 = !!(addr & 0xF);
} if (a0 == 0x0) { addr = 0xC000; }
if ((value & 0x0F) == 0x00) { if (a0 == 0x1) { addr = 0xE000; }
writeValue = (writeValue & 0xF0) | (value >> 4); if (a1 == 0x0) { EPSMSSGAudio::WriteRegister(addr, value); }
const uint8_t a04016 = (writeAddr & 0xF000) == 0xE000;
const uint8_t a14016 = !!(writeAddr & 0xF);
EPSMSSGAudio::WriteRegister(writeAddr, writeValue);
WriteToChip(a04016 | (a14016 << 1), writeValue);
}
}
if (addr == 0x401c) { addr = 0xC000; }
if (addr == 0x401d) { addr = 0xE000; }
if (addr == 0x401e) { addr = 0xC002; }
if (addr == 0x401f) { addr = 0xE002; }
switch(addr) {
case 0xC000:
case 0xE000:
case 0xC002:
case 0xE002:
WriteToChipIRQ(addr, value);
const uint8_t a0 = (addr & 0xF000) == 0xE000;
const uint8_t a1 = !!(addr & 0xF);
EPSMSSGAudio::WriteRegister(addr, value);
WriteToChip(a0 | (a1 << 1), value); WriteToChip(a0 | (a1 << 1), value);
WriteToChipIRQ(a0 | (a1 << 1), value);
break; break;
}
} }
else{
if (epsmA0 == 0x0) { addr = 0xC000; }
if (epsmA0 == 0x1) { addr = 0xE000; }
if (epsmA1 == 0x0) { EPSMSSGAudio::WriteRegister(addr, value); }
WriteToChip(epsmA0 | (epsmA1 << 1), value);
WriteToChipIRQ(epsmA0 | (epsmA1 << 1), value);
}
} }
}; };