vodanes用mapper019.java公開

適当にこぴぺしてコンパイルすれば動くかもね
mapper019.javaソース公開しておきます


/**
* @author wang-zhi
*
* Namcot 106 Mapper ?
*/

public final class Mapper019 extends Mapper
{
private int[] regs = new int[8];
private int irq_enabled;
private int irq_counter;
private int irq_latch;

// 拡張設定フラグ
private int patch;
// bankNo
private int bankNo;

public final void reset() {
// 拡張設定
patch = 0;
if (getCRC32() == 0x761ccfb5) { // Digital Devil Story - Megami Tensei 2
patch = 1;
}
if (getCRC32() == 0x96533999 || // Dokuganryuu Masamune
getCRC32() == 0x429fd177 || // Famista '90
getCRC32() == 0xdd454208 || // Hydlide 3 - Yami Kara no Houmonsha (J).nes
getCRC32() == 0xb1b9e187 || // Kaijuu Monogatari
getCRC32() == 0xaf15338f) { // Mindseeker
patch = 2;
}

// CPUのBankの初期化
setCPUBanks(0, 1, getNum8KRomBanks() - 2, getNum8KRomBanks() - 1) ;
// PPUのBankの設定
if (getNum1KVROMBanks() > 0)
setPPUBanks(0,1,2,3,4,5,6,7);
// Mapper19用レジスタ
for (int i = 0; i < 8; i++)
regs[i] = 0x00;

irq_enabled = 0;
irq_counter = 0;
irq_latch = 0;
}

public final int syncH(int scanline) {
if (irq_enabled!=0) {
if(irq_counter >= (0x7FFF - ((patch == 1) ? 112 : 113))) {
irq_counter = 0x7FFF;
// 0でない場合はIRQ()発生
return 1;
} else {
irq_counter += ((patch == 1) ? 112 : 113);
}
}
return 0;
}

//read_memory 0x4018〜0x5FFF
public int accesslowread(int addr) {
// $4800 Expand I/O Data Register
if (addr == 0x4800) {
if (patch == 2) {
// WRAMのアクセス用として使用(マインドシーカー貝獣物語など)
// 需要があったらfixして、saveRAMへのスコープがない
//int retval = super.nes.saveRAM[regs[2] & 0x7F] & 0xFF;
//if((regs[2] & 0x80)!=0) regs[2] = ((regs[2] & 0x7F)+1) | 0x80;
//return retval;

return 0;
} else {
// 拡張サウンドの制御用に使用
// (三国志2・女神転生2・キングオブキングスなど)
// サウンドテーブル移植したらfixしてください

return 0;
}
}
// addr $5000-$57FF
if((addr & 0xF800) == 0x5000) {
return (irq_counter & 0x00FF);
}
// addr $5800-$5FFF
if ((addr & 0xF800) == 0x5800) {
return ((irq_counter & 0x7F00) >> 8);
}

return (addr >> 8) & 0xFF;
}

//write_memory 0x4000〜0x5FFF
public void access_low(int addr, int value) {
switch (addr & 0xF800) {
case 0x4800:
if (addr == 0x4800) {
if (patch == 2) {
// WRAMのアクセス用として使用(マインドシーカー貝獣物語など)
// 需要があったらfixして、saveRAMへのスコープがない
//nes.SRAM[regs[2] & 0x7F] = (byte)data;
//if((regs[2] & 0x80)!=0) regs[2] = ((regs[2] & 0x7F)+1) | 0x80;

} else {
// 拡張サウンドの制御用に使用
// (三国志2・女神転生2・キングオブキングスなど)
// サウンドテーブル移植したらfixしてください

}
}
break;
case 0x5000: // addr $5000-$57FF
irq_counter = (irq_counter & 0xFF00) | value;
break;
case 0x5800: // addr $5000-$57FF
irq_counter = (irq_counter & 0x00FF) | ((value & 0x7F) << 8);
irq_enabled = (value & 0x80) >> 7;
if (patch != 0) {
irq_counter++;
}
break;
}
}

//write_memory 0x8000〜
public final void access_hi(int addr, int value) {
bankNo = (((addr & 0xF800) - 0x8000) >> 11);
switch (addr & 0xF800) {
case 0x8000: // addr $8000-$87FF
case 0x8800: // addr $8800-$8FFF
case 0x9000: // addr $9000-$97FF
case 0x9800: // addr $9800-$9FFF
if (value < 0xE0 || regs[0] == 1) {
setPPUBank(bankNo, value);
} else {
setVRAMBank(bankNo, bankNo);
}
break;

case 0xA000: // addr $A000-$A7FF
case 0xA800: // addr $A800-$AFFF
case 0xB000: // addr $B000-$B7FF
case 0xB800: // addr $B800-$BFFF
if (value < 0xE0 || regs[1] == 1) {
setPPUBank(bankNo, value);
} else {
setVRAMBank(bankNo, bankNo);
}
break;

case 0xC000: // addr $C000-$C7FF
case 0xC800: // addr $C800-$CFFF
case 0xD000: // addr $D000-$D7FF
case 0xD800: // addr $D800-$DFFF
if (value <= 0xDF) {
setPPUBank(bankNo, value);
} else {
setVRAMBank(bankNo, value & 0x01);
}
break;

case 0xE000: // addr $E000-$E7FF
setCPUBank(4, ((value & 0x3F) % getNum8KRomBanks()));
break;
case 0xE800: // addr $E800-$EFFF
setCPUBank(5, ((value & 0x3F) % getNum8KRomBanks()));
// 考察
// CHR-ROMが2メガの容量を持つものは総Page数が#$E0を超えるので、
// $E800番地に#$E0以上を書き込んでおいてからCHR-ROMを吸い出さないと
// ページ番号#$E0以上のデータが吸い出しできない。

regs[0] = (value & 0x40) >> 6;
regs[1] = (value & 0x80) >> 7;
break;
case 0xF000: // addr $F000-$F7FF
setCPUBank(6, ((value & 0x3F) % getNum8KRomBanks()));
break;

case 0xF800:
if (addr == 0xF800 && patch == 2) {
regs[2] = value;
}
break;

default:
System.out.println("MAP19: UNKNOWN: 0x" +
Integer.toHexString(addr) +
" = 0x" +
Integer.toHexString(value) +
" bankNo:" +
Integer.toString(bankNo));
break;
}
}
}