コード例 #1
0
ファイル: Mapper97.java プロジェクト: Fellowzdoomer/halfnes
  @Override
  public final void cartWrite(final int addr, final int data) {
    if (addr < 0x8000 || addr > 0xffff) {
      super.cartWrite(addr, data);
      return;
    }
    int prgselect = (byte) (data & 0xF);

    // remap PRG bank
    for (int i = 0; i < 16; ++i) {
      prg_map[16 + i] = (1024 * (i + 16 * prgselect)) & (prgsize - 1);
    }

    int mirroring = data >> 6;
    switch (mirroring) {
      case 0:
        setmirroring(MirrorType.SS_MIRROR0);
        break;
      case 1:
        setmirroring(MirrorType.H_MIRROR);
        break;
      case 2:
        setmirroring(MirrorType.V_MIRROR);
        break;
      case 3:
        setmirroring(MirrorType.SS_MIRROR1);
        break;
    }
  }
コード例 #2
0
ファイル: Mapper78.java プロジェクト: Buzov/halfnes
  @Override
  public final void cartWrite(final int addr, final int data) {
    // System.out.println(data);
    if (addr < 0x8000 || addr > 0xffff) {
      super.cartWrite(addr, data);
      return;
    }
    int prgselect = data & 7;
    int chrselect = (data >> 4) & 0xf;
    if (crc == 0x42392440) // Cosmo Carrier
    {
      setmirroring(((data & (utils.BIT3)) != 0) ? MirrorType.SS_MIRROR1 : MirrorType.SS_MIRROR0);
    } else {
      setmirroring(((data & (utils.BIT3)) != 0) ? MirrorType.V_MIRROR : MirrorType.H_MIRROR);
    }

    // remap CHR bank
    for (int i = 0; i < 8; ++i) {
      chr_map[i] = (1024 * (i + 8 * chrselect)) & (chrsize - 1);
    }
    // remap PRG bank
    for (int i = 0; i < 16; ++i) {
      prg_map[i] = (1024 * (i + 16 * prgselect)) & (prgsize - 1);
    }
  }
コード例 #3
0
ファイル: AnromMapper.java プロジェクト: Buzov/halfnes
 @Override
 public final void cartWrite(final int addr, final int data) {
   if (addr < 0x8000 || addr > 0xffff) {
     super.cartWrite(addr, data);
     return;
   }
   // remap all 32k of PRG to 32 x bank #
   for (int i = 0; i < 32; ++i) {
     prg_map[i] = (1024 * (i + (32 * (data & 15)))) & (prgsize - 1);
   }
   setmirroring(((data & (utils.BIT4)) != 0) ? MirrorType.SS_MIRROR1 : MirrorType.SS_MIRROR0);
 }
コード例 #4
0
  @Override
  public final void cartWrite(final int addr, final int data) {
    if (addr < 0x8000 || addr > 0xffff) {
      super.cartWrite(addr, data);
      return;
    }

    final boolean bit0 = utils.getbit(addr, registers[0]);
    final boolean bit1 = utils.getbit(addr, registers[1]);
    switch (addr >> 12) {
      case 0x8:
        // 8000-8003: prg bank 0 select
        prgbank0 = data;
        setbanks();
        break;
      case 0x9:
      case 0xa:
        // sound registers here
        sndchip.write((addr & 0xf000) + (bit1 ? 2 : 0) + (bit0 ? 1 : 0), data);
        break;
      case 0xc:
        // c000-c003: prg bank 1 select
        prgbank1 = data;
        setbanks();
        break;
      case 0xb:
        if (bit0 && bit1) {
          // mirroring select
          switch ((data >> 2) & 3) {
            case 0:
              setmirroring(Mapper.MirrorType.V_MIRROR);
              break;
            case 1:
              setmirroring(Mapper.MirrorType.H_MIRROR);
              break;
            case 2:
              setmirroring(Mapper.MirrorType.SS_MIRROR0);
              break;
            case 3:
              setmirroring(Mapper.MirrorType.SS_MIRROR1);
              break;
          }
        } else {
          // expansion sound register here as well
          sndchip.write((addr & 0xf000) + (bit1 ? 2 : 0) + (bit0 ? 1 : 0), data);
        }
        break;
      case 0xd:
        // character bank selects
        chrbank[(bit1 ? 2 : 0) + (bit0 ? 1 : 0)] = data;
        setbanks();
        break;
      case 0xe:
        chrbank[(bit1 ? 2 : 0) + (bit0 ? 1 : 0) + 4] = data;
        setbanks();
        break;
      case 0xf:
        // irq control
        if (!bit1) {
          if (!bit0) {
            irqreload = data;
          } else {
            irqack = utils.getbit(data, 0);
            irqenable = utils.getbit(data, 1);
            irqmode = utils.getbit(data, 2);
            if (irqenable) {
              irqcounter = irqreload;
              prescaler = 341;
            }
            if (firedinterrupt) {
              --cpu.interrupt;
            }
            firedinterrupt = false;
          }
        } else {
          if (!bit0) {
            irqenable = irqack;
            if (firedinterrupt) {
              --cpu.interrupt;
            }
            firedinterrupt = false;
          }
        }
    }
  }
コード例 #5
0
ファイル: Mapper48.java プロジェクト: egyptiankarim/GAP
 @Override
 public final void cartWrite(final int addr, final int data) {
   if (addr < 0x8000 || addr > 0xFFFF) {
     super.cartWrite(addr, data);
     return;
   } else if (addr <= 0x9FFF) {
     switch (addr & 3) {
       case 0:
         prgbank0 = data;
         setbanks();
         break;
       case 1:
         prgbank1 = data;
         setbanks();
         break;
       case 2:
         chrbank[0] = data;
         setbanks();
         break;
       case 3:
         chrbank[1] = data;
         setbanks();
         break;
     }
   } else if (addr <= 0xBFFF) {
     switch (addr & 3) {
       case 0:
         chrbank[2] = data;
         setbanks();
         break;
       case 1:
         chrbank[3] = data;
         setbanks();
         break;
       case 2:
         chrbank[4] = data;
         setbanks();
         break;
       case 3:
         chrbank[5] = data;
         setbanks();
         break;
     }
   } else if (addr <= 0xDFFF) {
     switch (addr & 3) {
       case 0:
         // value written here used to reload irq counter _@ end of scanline_
         irqctrreload = data & 0xFF;
         irqreload = true;
         break;
       case 1:
         // any value here reloads irq counter
         irqctr = data;
         irqreload = true;
         break;
       case 2:
         // any value here enables interrupts
         irqenable = true;
         break;
       case 3:
         // any value here disables IRQ and acknowledges
         if (interrupted) {
           --cpu.interrupt;
         }
         interrupted = false;
         irqenable = false;
         irqctr = irqctrreload;
         break;
     }
   } else if (addr <= 0xFFFF) {
     switch (addr & 3) {
       case 0:
         setmirroring(utils.getbit(data, 6) ? MirrorType.H_MIRROR : MirrorType.V_MIRROR);
         break;
     }
   }
 }