|
@@ -355,116 +355,8 @@ byte Page40[256];
|
|
|
|
|
|
void WrHook4000Multiplexer(byte addr, byte value)
|
|
|
{
|
|
|
- static byte SQ1V = 0;
|
|
|
- static byte SQ2V = 0;
|
|
|
- static byte NOIV = 0;
|
|
|
-
|
|
|
- static unsigned short SQ1P = 0;
|
|
|
- static unsigned short SQ2P = 0;
|
|
|
- static unsigned short TRIP = 0;
|
|
|
- static unsigned short NOIP = 0;
|
|
|
-
|
|
|
- static byte Sq1_reg0 = 0;
|
|
|
- static byte Sq1_reg1 = 0;
|
|
|
- static byte Sq1_reg2 = 0;
|
|
|
- static byte Sq1_reg3 = 0;
|
|
|
-
|
|
|
- static byte Sq2_reg0 = 0;
|
|
|
- static byte Sq2_reg1 = 0;
|
|
|
- static byte Sq2_reg2 = 0;
|
|
|
- static byte Sq2_reg3 = 0;
|
|
|
-
|
|
|
- double SQ = 0.0;
|
|
|
-
|
|
|
-
|
|
|
switch(addr)
|
|
|
{
|
|
|
- case 0x00: /* DDLE NNNN */
|
|
|
- Sq1_reg0 = value;
|
|
|
- if (Sq1_reg0 & 0x10)
|
|
|
- {
|
|
|
- SQ1V = (0x04+(value&0x0F))& 0x0F;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- SQ1V = value&0x0F;
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x01: /* EPPP NSSS */
|
|
|
- Sq1_reg1 = value;
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x02:
|
|
|
- SQ1P = value | ((Sq1_reg3&0x7) << 8);
|
|
|
- SQ = APU_BASEFREQ * 1000 * 1000 / (SQ1P+1);
|
|
|
- Sq1_reg2 = value;
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x03:
|
|
|
- Sq1_reg3 = value;
|
|
|
- SQ1P = Sq1_reg2 | ((value&0x7) << 8);
|
|
|
- SQ = APU_BASEFREQ * 1000 * 1000 / (SQ1P+1);
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x04:
|
|
|
- Sq2_reg0 = value;
|
|
|
- if (Sq2_reg0 & 0x10)
|
|
|
- {
|
|
|
- SQ2V = (0x04+(value&0x0F))& 0x0F;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- SQ2V = value&0x0F;
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- case 0x05:
|
|
|
- Sq2_reg1 = value;
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x06:
|
|
|
- Sq2_reg2 = value;
|
|
|
- SQ2P = Sq2_reg2 | ((Sq2_reg3&0x7) << 8);
|
|
|
- SQ = APU_BASEFREQ * 1000 * 1000 / (SQ2P+1);
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x07:
|
|
|
- Sq2_reg3 = value;
|
|
|
-
|
|
|
- SQ2P = Sq2_reg2 | ((Sq2_reg3&0x7) << 8);
|
|
|
-
|
|
|
- SQ = APU_BASEFREQ * 1000 * 1000 / (SQ2P+1);
|
|
|
-
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x0A:
|
|
|
- TRIP = (TRIP & 0xFF00) | value;
|
|
|
- SQ = APU_BASEFREQ * 1000 * 1000 / TRIP;
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x0B:
|
|
|
- TRIP = (TRIP & 0x00FF) | ((value&0x7) << 8);;
|
|
|
- SQ = APU_BASEFREQ * 1000 * 1000 / TRIP;
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x0C:
|
|
|
- NOIV = value & 0x0F;
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x0E:
|
|
|
- NOIP = value & 0x0F;
|
|
|
- SQ = APU_BASEFREQ * 1000 * 1000 / NOIP;
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x0F:
|
|
|
- break;
|
|
|
-
|
|
|
- case 0x15:
|
|
|
- /* DMC, Noise, Triangle, Sq 2, Sq 1 */
|
|
|
- break;
|
|
|
-
|
|
|
case 0x14:
|
|
|
ppu_fillSprRamDMA(value);
|
|
|
break;
|