diff --git a/TODO.md b/TODO.md index 1c6b99e8..dafe2873 100644 --- a/TODO.md +++ b/TODO.md @@ -1,9 +1,8 @@ # to-do for 0.6pre2 -- POKEY - Pokémon Mini - register layout - confirm emulation - (maybe) YM2612 CSM (no DualPCM) - port op macro code to all other OPN chips -- bug fixes \ No newline at end of file +- bug fixes diff --git a/src/engine/sysDef.cpp b/src/engine/sysDef.cpp index 1da237df..bfade1f0 100644 --- a/src/engine/sysDef.cpp +++ b/src/engine/sysDef.cpp @@ -1119,7 +1119,7 @@ void DivEngine::registerSystems() { ); sysDefs[DIV_SYSTEM_POKEY]=new DivSysDef( - "POKEY", NULL, 0x94, 0, 4, false, true, 0, false, 0, + "POKEY", NULL, 0x94, 0, 4, false, true, 0x161, false, 0, "TIA, but better and more flexible.\nused in the Atari 8-bit family of computers (400/800/XL/XE).", {"Channel 1", "Channel 2", "Channel 3", "Channel 4"}, {"CH1", "CH2", "CH3", "CH4"}, diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index 75953a19..f7c891c2 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -333,6 +333,13 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC(0); } break; + case DIV_SYSTEM_POKEY: + for (int i=0; i<9; i++) { + w->writeC(0xbb); + w->writeC(i|baseAddr2); + w->writeC(0); + } + break; case DIV_SYSTEM_LYNX: w->writeC(0x4e); w->writeC(0x44); @@ -698,6 +705,11 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC(baseAddr2|(write.addr&0xff)); w->writeC(write.val); break; + case DIV_SYSTEM_POKEY: + w->writeC(0xbb); + w->writeC(baseAddr2|(write.addr&0x0f)); + w->writeC(write.val&0xff); + break; case DIV_SYSTEM_LYNX: w->writeC(0x4e); w->writeC(write.addr&0xff); @@ -1246,6 +1258,17 @@ SafeWriter* DivEngine::saveVGM(bool* sysToExport, bool loop, int version, bool p howManyChips++; } break; + case DIV_SYSTEM_POKEY: + if (!hasPOKEY) { + hasPOKEY=disCont[i].dispatch->chipClock; + willExport[i]=true; + } else if (!(hasPOKEY&0x40000000)) { + isSecond[i]=true; + willExport[i]=true; + hasPOKEY|=0x40000000; + howManyChips++; + } + break; case DIV_SYSTEM_LYNX: if (!hasLynx) { hasLynx=disCont[i].dispatch->chipClock;