Exemplo n.º 1
0
void Map4_Set_PPU_Banks()
{
  if ( S.NesHeader.VROMSize > 0 )
  {
    if ( Map4_Chr_Swap() )
    { 
      W.PPUBANK[0] = VROMPAGE(MS4.PPU[2] % (Map4_Vsz));
      W.PPUBANK[1] = VROMPAGE(MS4.PPU[3] % (Map4_Vsz));
      W.PPUBANK[2] = VROMPAGE(MS4.PPU[4] % (Map4_Vsz));
      W.PPUBANK[3] = VROMPAGE(MS4.PPU[5] % (Map4_Vsz));
      W.PPUBANK[4] = VROMPAGE((MS4.PPU[0]  ) % (Map4_Vsz));
      W.PPUBANK[5] = VROMPAGE((MS4.PPU[0]+1) % (Map4_Vsz));
      W.PPUBANK[6] = VROMPAGE((MS4.PPU[1]  ) % (Map4_Vsz));
      W.PPUBANK[7] = VROMPAGE((MS4.PPU[1]+1) % (Map4_Vsz));
    } else {
      W.PPUBANK[4] = VROMPAGE(MS4.PPU[2] % (Map4_Vsz));
      W.PPUBANK[5] = VROMPAGE(MS4.PPU[3] % (Map4_Vsz));
      W.PPUBANK[6] = VROMPAGE(MS4.PPU[4] % (Map4_Vsz));
      W.PPUBANK[7] = VROMPAGE(MS4.PPU[5] % (Map4_Vsz));
      W.PPUBANK[0] = VROMPAGE((MS4.PPU[0]  ) % (Map4_Vsz));
      W.PPUBANK[1] = VROMPAGE((MS4.PPU[0]+1) % (Map4_Vsz));
      W.PPUBANK[2] = VROMPAGE((MS4.PPU[1]  ) % (Map4_Vsz));
      W.PPUBANK[3] = VROMPAGE((MS4.PPU[1]+1) % (Map4_Vsz));
    }
    NESCore_Develop_Character_Data();
  }
  else 
  {
      W.PPUBANK[ 0 ] = CRAMPAGE( 0 );
      W.PPUBANK[ 1 ] = CRAMPAGE( 1 );
      W.PPUBANK[ 2 ] = CRAMPAGE( 2 );
      W.PPUBANK[ 3 ] = CRAMPAGE( 3 );
      W.PPUBANK[ 4 ] = CRAMPAGE( 4 );
      W.PPUBANK[ 5 ] = CRAMPAGE( 5 );
      W.PPUBANK[ 6 ] = CRAMPAGE( 6 );
      W.PPUBANK[ 7 ] = CRAMPAGE( 7 );
      NESCore_Develop_Character_Data();
  }    
}
Exemplo n.º 2
0
void Map4_Write( word wAddr, byte bData )
{
  dword dwBankNum;

  switch ( wAddr & 0xe001 )
  {
    case 0x8000:
      MS4.Regs[ 0 ] = bData;

      Map4_Set_CPU_Banks();

      break;

    case 0x8001:
      MS4.Regs[ 1 ] = bData;
      dwBankNum = MS4.Regs[ 1 ];

      switch ( MS4.Regs[ 0 ] & 0x07 )
      {
        /* Set PPU Banks */
        case 0x00:
          if ( S.NesHeader.VROMSize > 0 )
          {
              dwBankNum &= 0xfe;
              MS4.PPU[0] = dwBankNum;
              if ( Map4_Chr_Swap() )
              {
                  W.PPUBANK[4] = VROMPAGE((MS4.PPU[0]  ) % (Map4_Vsz));
                  W.PPUBANK[5] = VROMPAGE((MS4.PPU[0]+1) % (Map4_Vsz));
              } else {
                  W.PPUBANK[0] = VROMPAGE((MS4.PPU[0]  ) % (Map4_Vsz));
                  W.PPUBANK[1] = VROMPAGE((MS4.PPU[0]+1) % (Map4_Vsz));
              }
              NESCore_Develop_Character_Data();
          }
          break;

        case 0x01:
          if ( S.NesHeader.VROMSize > 0 )
          {
              dwBankNum &= 0xfe;
              MS4.PPU[1] = dwBankNum;
              if ( Map4_Chr_Swap() )
              {
                  W.PPUBANK[6] = VROMPAGE((MS4.PPU[1]  ) % (Map4_Vsz));
                  W.PPUBANK[7] = VROMPAGE((MS4.PPU[1]+1) % (Map4_Vsz));
              } else {
                  W.PPUBANK[2] = VROMPAGE((MS4.PPU[1]  ) % (Map4_Vsz));
                  W.PPUBANK[3] = VROMPAGE((MS4.PPU[1]+1) % (Map4_Vsz));
              }
              NESCore_Develop_Character_Data();
          }
          break;

        case 0x02:
          if ( S.NesHeader.VROMSize > 0 )
          {
              MS4.PPU[2] = dwBankNum;
              if ( Map4_Chr_Swap() )
                  W.PPUBANK[0] = VROMPAGE( MS4.PPU[2] % ( Map4_Vsz ) );
              else
                  W.PPUBANK[4] = VROMPAGE( MS4.PPU[2] % ( Map4_Vsz ) );
              NESCore_Develop_Character_Data();
          }
          break;

        case 0x03:
          if ( S.NesHeader.VROMSize > 0 )
          {
              MS4.PPU[3] = dwBankNum;
              if ( Map4_Chr_Swap() )
                 W.PPUBANK[1] = VROMPAGE( MS4.PPU[3] % ( Map4_Vsz ) );
              else
                 W.PPUBANK[5] = VROMPAGE( MS4.PPU[3] % ( Map4_Vsz ) );
              NESCore_Develop_Character_Data();
          }
          break;

        case 0x04:
          if ( S.NesHeader.VROMSize > 0 )
          {
              MS4.PPU[4] = dwBankNum;
              if ( Map4_Chr_Swap() )
                  W.PPUBANK[2] = VROMPAGE( MS4.PPU[4] % ( Map4_Vsz ) );
              else
                  W.PPUBANK[6] = VROMPAGE( MS4.PPU[4] % ( Map4_Vsz ) );
              NESCore_Develop_Character_Data();
          }
          break;

        case 0x05:
          if ( S.NesHeader.VROMSize > 0 )
          {
              MS4.PPU[5] = dwBankNum;
              if ( Map4_Chr_Swap() )
                  W.PPUBANK[3] = VROMPAGE( MS4.PPU[5] % ( Map4_Vsz ) );
              else
                  W.PPUBANK[7] = VROMPAGE( MS4.PPU[5] % ( Map4_Vsz ) );
              NESCore_Develop_Character_Data();
          }
          break;

        /* Set ROM Banks */
        case 0x06:
          MS4.Prg0 = dwBankNum;
          Map4_Set_CPU_Banks();
          break;

        case 0x07:
          MS4.Prg1 = dwBankNum;
          Map4_Set_CPU_Banks();
          break;
      }
      break;

    case 0xa000:
      MS4.Regs[ 2 ] = bData & 1;
      if (!S.ROM_FourScr)
      {
        if ( bData & 0x01 )
        {
            NESCore_Mirroring( 0 );
        } else {
            NESCore_Mirroring( 1 );
        }
      }
      break;

    case 0xa001:
      MS4.Regs[ 3 ] = bData;
      break;
 
    case 0xe000: /* ACK IRQ */
      MS4.IRQ_Enabled = 0;
      break;

    case 0xe001: /* Enable IRQ */
      MS4.IRQ_Enabled = 1;
      break;
  }
  
  /* Old IRQ Technique */ 
  /*
  if (wAddr >= 0xc000 && wAddr <= 0xdfff) {
     if (wAddr % 2 == 0) {
         MS4.IRQ_Counter = bData;
     }
     else {
         MS4.IRQ_Latch = bData;
     }
  }
  */

  if (wAddr >= 0xc000 && wAddr <= 0xdfff) {
     if (wAddr % 2 == 0) {
         MS4.IRQ_Latch = bData;
     }
     else {
         MS4.IRQ_Counter = MS4.IRQ_Latch;
     }
  }
}
Exemplo n.º 3
0
/*-------------------------------------------------------------------*/
void Map4_Set_PPU_Banks()
{
  if ( NesHeader.byVRomSize > 0 )
  {
    if ( Map4_Chr_Swap() )
    { 
      PPUBANK[ 0 ] = VROMPAGE( Map4_Chr4 % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 1 ] = VROMPAGE( Map4_Chr5 % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 2 ] = VROMPAGE( Map4_Chr6 % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 3 ] = VROMPAGE( Map4_Chr7 % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 4 ] = VROMPAGE( ( Map4_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 5 ] = VROMPAGE( ( Map4_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 6 ] = VROMPAGE( ( Map4_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 7 ] = VROMPAGE( ( Map4_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) );
      InfoNES_SetupChr();
    } else {
      PPUBANK[ 0 ] = VROMPAGE( ( Map4_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 1 ] = VROMPAGE( ( Map4_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 2 ] = VROMPAGE( ( Map4_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 3 ] = VROMPAGE( ( Map4_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 4 ] = VROMPAGE( Map4_Chr4 % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 5 ] = VROMPAGE( Map4_Chr5 % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 6 ] = VROMPAGE( Map4_Chr6 % ( NesHeader.byVRomSize << 3 ) );
      PPUBANK[ 7 ] = VROMPAGE( Map4_Chr7 % ( NesHeader.byVRomSize << 3 ) );
      InfoNES_SetupChr();
    }
  }
  else
  {
    if ( Map4_Chr_Swap() )
    { 
#if 0
      PPUBANK[ 0 ] = VRAMPAGE0( 0 );
      PPUBANK[ 1 ] = VRAMPAGE0( 1 );
      PPUBANK[ 2 ] = VRAMPAGE0( 2 );
      PPUBANK[ 3 ] = VRAMPAGE0( 3 );
      PPUBANK[ 4 ] = VRAMPAGE1( 0 );
      PPUBANK[ 5 ] = VRAMPAGE1( 1 );
      PPUBANK[ 6 ] = VRAMPAGE1( 2 );
      PPUBANK[ 7 ] = VRAMPAGE1( 3 );
#else
      PPUBANK[ 0 ] = CRAMPAGE( 0 );
      PPUBANK[ 1 ] = CRAMPAGE( 1 );
      PPUBANK[ 2 ] = CRAMPAGE( 2 );
      PPUBANK[ 3 ] = CRAMPAGE( 3 );
      PPUBANK[ 4 ] = CRAMPAGE( 4 );
      PPUBANK[ 5 ] = CRAMPAGE( 5 );
      PPUBANK[ 6 ] = CRAMPAGE( 6 );
      PPUBANK[ 7 ] = CRAMPAGE( 7 );
#endif
      InfoNES_SetupChr();
    } else {
#if 0
      PPUBANK[ 0 ] = VRAMPAGE1( 0 );
      PPUBANK[ 1 ] = VRAMPAGE1( 1 );
      PPUBANK[ 2 ] = VRAMPAGE1( 2 );
      PPUBANK[ 3 ] = VRAMPAGE1( 3 );
      PPUBANK[ 4 ] = VRAMPAGE0( 0 );
      PPUBANK[ 5 ] = VRAMPAGE0( 1 );
      PPUBANK[ 6 ] = VRAMPAGE0( 2 );
      PPUBANK[ 7 ] = VRAMPAGE0( 3 );
#else
      PPUBANK[ 0 ] = CRAMPAGE( 0 );
      PPUBANK[ 1 ] = CRAMPAGE( 1 );
      PPUBANK[ 2 ] = CRAMPAGE( 2 );
      PPUBANK[ 3 ] = CRAMPAGE( 3 );
      PPUBANK[ 4 ] = CRAMPAGE( 4 );
      PPUBANK[ 5 ] = CRAMPAGE( 5 );
      PPUBANK[ 6 ] = CRAMPAGE( 6 );
      PPUBANK[ 7 ] = CRAMPAGE( 7 );
#endif
      InfoNES_SetupChr();
    }
  }    
}