Previous 15994 Revisions Next

r7422 Thursday 18th February, 2010 at 19:21:40 UTC by Fabio Priuli
[NES] slightly improved mapper 21 & 25 emulation to match docs. this fixes Ganbare Goemon Gaiden 2 graphics
[src/mess/machine]nes_ines.c nes_unif.c

src/mess/machine/nes_unif.c
r7421r7422
990990   { "KONAMI-VRC-2",               NULL, NULL, NULL, konami_vrc2a_w, NULL, NULL, NULL,                 8,   32,   0,    0, CHRRAM_0,  NT_VERT,  KONAMI_VRC2},
991991   // variant 2b (mapper 23) exists! how to distinguish?!? NULL, NULL, NULL, konami_vrc2b_w, NULL, NULL, konami_irq
992992   { "KONAMI-VRC-3",               NULL, NULL, NULL, mapper73_w, NULL, NULL, konami_irq,               8,    0,   8,    0, CHRRAM_8,  NT_X,  KONAMI_VRC3},
993   { "KONAMI-VRC-4",               NULL, NULL, NULL, konami_vrc4_w, NULL, NULL, konami_irq,           16,   32,   0,    0, CHRRAM_0,  NT_VERT,  KONAMI_VRC4},
993   { "KONAMI-VRC-4",               NULL, NULL, NULL, konami_vrc4a_w, NULL, NULL, konami_irq,           16,   32,   0,    0, CHRRAM_0,  NT_VERT,  KONAMI_VRC4},
994   // variant 4b (mapper 23) exists! how to distinguish?!? NULL, NULL, NULL, konami_vrc4b_w, NULL, NULL, konami_irq
994995   // exist also variants with 2 & 8 NVWRAM!
995996   { "KONAMI-VRC-6",               NULL, NULL, NULL, konami_vrc6a_w, NULL, NULL, konami_irq,          16,   32,   0,    0, CHRRAM_0,  NT_VERT,  KONAMI_VRC6},
996997   // variant 6b (mapper 26) exists! how to distinguish?!? NULL, NULL, NULL, konami_vrc6b_w, NULL, NULL, konami_irq
src/mess/machine/nes_ines.c
r7421r7422
19691969
19701970*************************************************************/
19711971
1972static void vrc4_set_prg( running_machine *machine )
1973{
1974   if (mmc_cmd1 & 0x02)
1975   {
1976      prg8_89(machine, 0xfe);
1977      prg8_cd(machine, prg_bank[0]);
1978   }
1979   else
1980   {
1981      prg8_89(machine, prg_bank[0]);
1982      prg8_cd(machine, 0xfe);
1983   }
1984}
1985
19721986static void konami_irq( running_device *device, int scanline, int vblank, int blanked )
19731987{
19741988   /* Increment & check the IRQ scanline counter */
r7421r7422
19801994   }
19811995}
19821996
1983static WRITE8_HANDLER( konami_vrc4_w )
1997static WRITE8_HANDLER( konami_vrc4a_w )
19841998{
1985   LOG_MMC(("konami_vrc4_w, offset: %04x, data: %02x\n", offset, data));
1999   LOG_MMC(("konami_vrc4a_w, offset: %04x, data: %02x\n", offset, data));
19862000
1987   switch (offset & 0x7007)
2001   switch (offset & 0x7fff)
19882002   {
19892003      case 0x0000:
1990         prg8_89(space->machine, data);
2004      case 0x0002:
2005      case 0x0004:
2006      case 0x0006:
2007      case 0x0040:
2008      case 0x0080:
2009      case 0x00c0:
2010         prg_bank[0] = data;
2011         vrc4_set_prg(space->machine);
19912012         break;
2013
19922014      case 0x1000:
2015      case 0x1002:
2016      case 0x1040:
19932017         switch (data & 0x03)
19942018         {
19952019            case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
r7421r7422
19992023         }
20002024         break;
20012025
2002      /* $1001 is uncaught */
2026      case 0x1004:
2027      case 0x1006:
2028      case 0x1080:
2029      case 0x10c0:
2030         mmc_cmd1 = data & 0x02;
2031         vrc4_set_prg(space->machine);
2032         break;
20032033
20042034      case 0x2000:
2035      case 0x2002:
2036      case 0x2004:
2037      case 0x2006:
2038      case 0x2040:
2039      case 0x2080:
2040      case 0x20c0:
20052041         prg8_ab(space->machine, data);
20062042         break;
2043
20072044      case 0x3000:
20082045         vrom_bank[0] = (vrom_bank[0] & 0xf0) | (data & 0x0f);
20092046         chr1_0(space->machine, vrom_bank[0], CHRROM);
20102047         break;
20112048      case 0x3002:
2049      case 0x3040:
20122050         vrom_bank[0] = (vrom_bank[0] & 0x0f) | (data << 4);
20132051         chr1_0(space->machine, vrom_bank[0], CHRROM);
20142052         break;
2053      case 0x3004:
2054      case 0x3080:
2055         vrom_bank[1] = (vrom_bank[1] & 0xf0) | (data & 0x0f);
2056         chr1_1(space->machine, vrom_bank[1], CHRROM);
2057         break;
2058      case 0x3006:
2059      case 0x30c0:
2060         vrom_bank[1] = (vrom_bank[1] & 0x0f) | (data << 4);
2061         chr1_1(space->machine, vrom_bank[1], CHRROM);
2062         break;
2063      case 0x4000:
2064         vrom_bank[2] = (vrom_bank[2] & 0xf0) | (data & 0x0f);
2065         chr1_2(space->machine, vrom_bank[2], CHRROM);
2066         break;
2067      case 0x4002:
2068      case 0x4040:
2069         vrom_bank[2] = (vrom_bank[2] & 0x0f) | (data << 4);
2070         chr1_2(space->machine, vrom_bank[2], CHRROM);
2071         break;
2072      case 0x4004:
2073      case 0x4080:
2074         vrom_bank[3] = (vrom_bank[3] & 0xf0) | (data & 0x0f);
2075         chr1_3(space->machine, vrom_bank[3], CHRROM);
2076         break;
2077      case 0x4006:
2078      case 0x40c0:
2079         vrom_bank[3] = (vrom_bank[3] & 0x0f) | (data << 4);
2080         chr1_3(space->machine, vrom_bank[3], CHRROM);
2081         break;
2082      case 0x5000:
2083         vrom_bank[4] = (vrom_bank[4] & 0xf0) | (data & 0x0f);
2084         chr1_4(space->machine, vrom_bank[4], CHRROM);
2085         break;
2086      case 0x5002:
2087      case 0x5040:
2088         vrom_bank[4] = (vrom_bank[4] & 0x0f) | (data << 4);
2089         chr1_4(space->machine, vrom_bank[4], CHRROM);
2090         break;
2091      case 0x5004:
2092      case 0x5080:
2093         vrom_bank[5] = (vrom_bank[5] & 0xf0) | (data & 0x0f);
2094         chr1_5(space->machine, vrom_bank[5], CHRROM);
2095         break;
2096      case 0x5006:
2097      case 0x50c0:
2098         vrom_bank[5] = (vrom_bank[5] & 0x0f) | (data << 4);
2099         chr1_5(space->machine, vrom_bank[5], CHRROM);
2100         break;
2101      case 0x6000:
2102         vrom_bank[6] = (vrom_bank[6] & 0xf0) | (data & 0x0f);
2103         chr1_6(space->machine, vrom_bank[6], CHRROM);
2104         break;
2105      case 0x6002:
2106      case 0x6040:
2107         vrom_bank[6] = (vrom_bank[6] & 0x0f) | (data << 4);
2108         chr1_6(space->machine, vrom_bank[6], CHRROM);
2109         break;
2110      case 0x6004:
2111      case 0x6080:
2112         vrom_bank[7] = (vrom_bank[7] & 0xf0) | (data & 0x0f);
2113         chr1_7(space->machine, vrom_bank[7], CHRROM);
2114         break;
2115      case 0x6006:
2116      case 0x60c0:
2117         vrom_bank[7] = (vrom_bank[7] & 0x0f) | (data << 4);
2118         chr1_7(space->machine, vrom_bank[7], CHRROM);
2119         break;
2120
2121      case 0x7000:
2122         IRQ_count_latch = (IRQ_count_latch & 0xf0) | (data & 0x0f);
2123         break;
2124      case 0x7002:
2125      case 0x7040:
2126         IRQ_count_latch = (IRQ_count_latch & 0x0f) | ((data & 0x0f) << 4 );
2127         break;
2128      case 0x7004:
2129      case 0x7080:
2130         IRQ_mode = data & 0x04;   // currently not implemented: 0 = prescaler mode / 1 = CPU mode
2131         IRQ_enable = data & 0x02;
2132         IRQ_enable_latch = data & 0x01;
2133         if (data & 0x02)
2134            IRQ_count = IRQ_count_latch;
2135         break;
2136      case 0x7006:
2137      case 0x70c0:
2138         IRQ_enable = IRQ_enable_latch;
2139         break;
2140      default:
2141         LOG_MMC(("konami_vrc4a_w uncaught offset: %04x value: %02x\n", offset, data));
2142         break;
2143   }
2144}
2145
2146static WRITE8_HANDLER( konami_vrc4b_w )
2147{
2148   LOG_MMC(("konami_vrc4b_w, offset: %04x, data: %02x\n", offset, data));
2149
2150   switch (offset & 0x7fff)
2151   {
2152      case 0x0000:
2153      case 0x0001:
2154      case 0x0002:
2155      case 0x0003:
2156      case 0x0004:
2157      case 0x0008:
2158      case 0x000c:
2159         prg_bank[0] = data;
2160         vrc4_set_prg(space->machine);
2161         break;
2162
2163      case 0x1000:
2164      case 0x1002:
2165      case 0x1008:
2166         switch (data & 0x03)
2167         {
2168            case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
2169            case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
2170            case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
2171            case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
2172         }
2173         break;
2174
2175      case 0x1001:
2176      case 0x1003:
2177      case 0x1004:
2178      case 0x100c:
2179         mmc_cmd1 = data & 0x02;
2180         vrc4_set_prg(space->machine);
2181         break;
2182
2183      case 0x2000:
2184      case 0x2001:
2185      case 0x2002:
2186      case 0x2003:
2187      case 0x2004:
2188      case 0x2008:
2189      case 0x200c:
2190         prg8_ab(space->machine, data);
2191         break;
2192
2193      case 0x3000:
2194         vrom_bank[0] = (vrom_bank[0] & 0xf0) | (data & 0x0f);
2195         chr1_0(space->machine, vrom_bank[0], CHRROM);
2196         break;
2197      case 0x3002:
2198      case 0x3008:
2199         vrom_bank[0] = (vrom_bank[0] & 0x0f) | (data << 4);
2200         chr1_0(space->machine, vrom_bank[0], CHRROM);
2201         break;
20152202      case 0x3001:
20162203      case 0x3004:
20172204         vrom_bank[1] = (vrom_bank[1] & 0xf0) | (data & 0x0f);
20182205         chr1_1(space->machine, vrom_bank[1], CHRROM);
20192206         break;
20202207      case 0x3003:
2021      case 0x3006:
2208      case 0x300c:
20222209         vrom_bank[1] = (vrom_bank[1] & 0x0f) | (data << 4);
20232210         chr1_1(space->machine, vrom_bank[1], CHRROM);
20242211         break;
r7421r7422
20272214         chr1_2(space->machine, vrom_bank[2], CHRROM);
20282215         break;
20292216      case 0x4002:
2217      case 0x4008:
20302218         vrom_bank[2] = (vrom_bank[2] & 0x0f) | (data << 4);
20312219         chr1_2(space->machine, vrom_bank[2], CHRROM);
20322220         break;
r7421r7422
20362224         chr1_3(space->machine, vrom_bank[3], CHRROM);
20372225         break;
20382226      case 0x4003:
2039      case 0x4006:
2227      case 0x400c:
20402228         vrom_bank[3] = (vrom_bank[3] & 0x0f) | (data << 4);
20412229         chr1_3(space->machine, vrom_bank[3], CHRROM);
20422230         break;
r7421r7422
20452233         chr1_4(space->machine, vrom_bank[4], CHRROM);
20462234         break;
20472235      case 0x5002:
2236      case 0x5008:
20482237         vrom_bank[4] = (vrom_bank[4] & 0x0f) | (data << 4);
20492238         chr1_4(space->machine, vrom_bank[4], CHRROM);
20502239         break;
r7421r7422
20542243         chr1_5(space->machine, vrom_bank[5], CHRROM);
20552244         break;
20562245      case 0x5003:
2057      case 0x5006:
2246      case 0x500c:
20582247         vrom_bank[5] = (vrom_bank[5] & 0x0f) | (data << 4);
20592248         chr1_5(space->machine, vrom_bank[5], CHRROM);
20602249         break;
r7421r7422
20632252         chr1_6(space->machine, vrom_bank[6], CHRROM);
20642253         break;
20652254      case 0x6002:
2255      case 0x6008:
20662256         vrom_bank[6] = (vrom_bank[6] & 0x0f) | (data << 4);
20672257         chr1_6(space->machine, vrom_bank[6], CHRROM);
20682258         break;
r7421r7422
20722262         chr1_7(space->machine, vrom_bank[7], CHRROM);
20732263         break;
20742264      case 0x6003:
2075      case 0x6006:
2265      case 0x600c:
20762266         vrom_bank[7] = (vrom_bank[7] & 0x0f) | (data << 4);
20772267         chr1_7(space->machine, vrom_bank[7], CHRROM);
20782268         break;
r7421r7422
20812271         IRQ_count_latch = (IRQ_count_latch & 0xf0) | (data & 0x0f);
20822272         break;
20832273      case 0x7002:
2274      case 0x7008:
20842275         IRQ_count_latch = (IRQ_count_latch & 0x0f) | ((data & 0x0f) << 4 );
20852276         break;
2277      case 0x7001:
20862278      case 0x7004:
2087      case 0x7001:
20882279         IRQ_mode = data & 0x04;   // currently not implemented: 0 = prescaler mode / 1 = CPU mode
20892280         IRQ_enable = data & 0x02;
20902281         IRQ_enable_latch = data & 0x01;
20912282         if (data & 0x02)
20922283            IRQ_count = IRQ_count_latch;
20932284         break;
2094      case 0x7006:
20952285      case 0x7003:
2286      case 0x700c:
20962287         IRQ_enable = IRQ_enable_latch;
20972288         break;
20982289      default:
2099         LOG_MMC(("konami_vrc4_w uncaught offset: %04x value: %02x\n", offset, data));
2290         LOG_MMC(("konami_vrc4b_w uncaught offset: %04x value: %02x\n", offset, data));
21002291         break;
21012292   }
21022293}
r7421r7422
1043410625   { 18, "Jaleco SS88006",            NULL, NULL, NULL, mapper18_w, NULL, NULL, jaleco_irq },
1043510626   { 19, "Namcot 106 + N106",         mapper19_l_w, mapper19_l_r, NULL, mapper19_w, NULL, NULL, namcot_irq },
1043610627   { 20, "Famicom Disk System",       NULL, NULL, NULL, NULL, NULL, NULL, fds_irq },
10437   { 21, "Konami VRC 4",              NULL, NULL, NULL, konami_vrc4_w, NULL, NULL, konami_irq },
10628   { 21, "Konami VRC 4a",             NULL, NULL, NULL, konami_vrc4a_w, NULL, NULL, konami_irq },
1043810629   { 22, "Konami VRC 2a",             NULL, NULL, NULL, konami_vrc2a_w, NULL, NULL, NULL },
1043910630   { 23, "Konami VRC 2b",             NULL, NULL, NULL, konami_vrc2b_w, NULL, NULL, konami_irq },
1044010631   { 24, "Konami VRC 6a",             NULL, NULL, NULL, konami_vrc6a_w, NULL, NULL, konami_irq },
10441   { 25, "Konami VRC 4",              NULL, NULL, NULL, konami_vrc4_w, NULL, NULL, konami_irq },
10632   { 25, "Konami VRC 4b",             NULL, NULL, NULL, konami_vrc4b_w, NULL, NULL, konami_irq },
1044210633   { 26, "Konami VRC 6b",             NULL, NULL, NULL, konami_vrc6b_w, NULL, NULL, konami_irq },
1044310634// 27 World Hero
1044410635// 28, 29, 30, 31 Unused

Previous 15994 Revisions Next


© 1998-2018 The MESS Team