src/mess/machine/nes_unif.c
| r7421 | r7422 | |
| 990 | 990 | { "KONAMI-VRC-2", NULL, NULL, NULL, konami_vrc2a_w, NULL, NULL, NULL, 8, 32, 0, 0, CHRRAM_0, NT_VERT, KONAMI_VRC2}, |
| 991 | 991 | // variant 2b (mapper 23) exists! how to distinguish?!? NULL, NULL, NULL, konami_vrc2b_w, NULL, NULL, konami_irq |
| 992 | 992 | { "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 |
| 994 | 995 | // exist also variants with 2 & 8 NVWRAM! |
| 995 | 996 | { "KONAMI-VRC-6", NULL, NULL, NULL, konami_vrc6a_w, NULL, NULL, konami_irq, 16, 32, 0, 0, CHRRAM_0, NT_VERT, KONAMI_VRC6}, |
| 996 | 997 | // variant 6b (mapper 26) exists! how to distinguish?!? NULL, NULL, NULL, konami_vrc6b_w, NULL, NULL, konami_irq |
src/mess/machine/nes_ines.c
| r7421 | r7422 | |
| 1969 | 1969 | |
| 1970 | 1970 | *************************************************************/ |
| 1971 | 1971 | |
| 1972 | static 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 | |
| 1972 | 1986 | static void konami_irq( running_device *device, int scanline, int vblank, int blanked ) |
| 1973 | 1987 | { |
| 1974 | 1988 | /* Increment & check the IRQ scanline counter */ |
| r7421 | r7422 | |
| 1980 | 1994 | } |
| 1981 | 1995 | } |
| 1982 | 1996 | |
| 1983 | | static WRITE8_HANDLER( konami_vrc4_w ) |
| 1997 | static WRITE8_HANDLER( konami_vrc4a_w ) |
| 1984 | 1998 | { |
| 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)); |
| 1986 | 2000 | |
| 1987 | | switch (offset & 0x7007) |
| 2001 | switch (offset & 0x7fff) |
| 1988 | 2002 | { |
| 1989 | 2003 | 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); |
| 1991 | 2012 | break; |
| 2013 | |
| 1992 | 2014 | case 0x1000: |
| 2015 | case 0x1002: |
| 2016 | case 0x1040: |
| 1993 | 2017 | switch (data & 0x03) |
| 1994 | 2018 | { |
| 1995 | 2019 | case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break; |
| r7421 | r7422 | |
| 1999 | 2023 | } |
| 2000 | 2024 | break; |
| 2001 | 2025 | |
| 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; |
| 2003 | 2033 | |
| 2004 | 2034 | case 0x2000: |
| 2035 | case 0x2002: |
| 2036 | case 0x2004: |
| 2037 | case 0x2006: |
| 2038 | case 0x2040: |
| 2039 | case 0x2080: |
| 2040 | case 0x20c0: |
| 2005 | 2041 | prg8_ab(space->machine, data); |
| 2006 | 2042 | break; |
| 2043 | |
| 2007 | 2044 | case 0x3000: |
| 2008 | 2045 | vrom_bank[0] = (vrom_bank[0] & 0xf0) | (data & 0x0f); |
| 2009 | 2046 | chr1_0(space->machine, vrom_bank[0], CHRROM); |
| 2010 | 2047 | break; |
| 2011 | 2048 | case 0x3002: |
| 2049 | case 0x3040: |
| 2012 | 2050 | vrom_bank[0] = (vrom_bank[0] & 0x0f) | (data << 4); |
| 2013 | 2051 | chr1_0(space->machine, vrom_bank[0], CHRROM); |
| 2014 | 2052 | 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 | |
| 2146 | static 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; |
| 2015 | 2202 | case 0x3001: |
| 2016 | 2203 | case 0x3004: |
| 2017 | 2204 | vrom_bank[1] = (vrom_bank[1] & 0xf0) | (data & 0x0f); |
| 2018 | 2205 | chr1_1(space->machine, vrom_bank[1], CHRROM); |
| 2019 | 2206 | break; |
| 2020 | 2207 | case 0x3003: |
| 2021 | | case 0x3006: |
| 2208 | case 0x300c: |
| 2022 | 2209 | vrom_bank[1] = (vrom_bank[1] & 0x0f) | (data << 4); |
| 2023 | 2210 | chr1_1(space->machine, vrom_bank[1], CHRROM); |
| 2024 | 2211 | break; |
| r7421 | r7422 | |
| 2027 | 2214 | chr1_2(space->machine, vrom_bank[2], CHRROM); |
| 2028 | 2215 | break; |
| 2029 | 2216 | case 0x4002: |
| 2217 | case 0x4008: |
| 2030 | 2218 | vrom_bank[2] = (vrom_bank[2] & 0x0f) | (data << 4); |
| 2031 | 2219 | chr1_2(space->machine, vrom_bank[2], CHRROM); |
| 2032 | 2220 | break; |
| r7421 | r7422 | |
| 2036 | 2224 | chr1_3(space->machine, vrom_bank[3], CHRROM); |
| 2037 | 2225 | break; |
| 2038 | 2226 | case 0x4003: |
| 2039 | | case 0x4006: |
| 2227 | case 0x400c: |
| 2040 | 2228 | vrom_bank[3] = (vrom_bank[3] & 0x0f) | (data << 4); |
| 2041 | 2229 | chr1_3(space->machine, vrom_bank[3], CHRROM); |
| 2042 | 2230 | break; |
| r7421 | r7422 | |
| 2045 | 2233 | chr1_4(space->machine, vrom_bank[4], CHRROM); |
| 2046 | 2234 | break; |
| 2047 | 2235 | case 0x5002: |
| 2236 | case 0x5008: |
| 2048 | 2237 | vrom_bank[4] = (vrom_bank[4] & 0x0f) | (data << 4); |
| 2049 | 2238 | chr1_4(space->machine, vrom_bank[4], CHRROM); |
| 2050 | 2239 | break; |
| r7421 | r7422 | |
| 2054 | 2243 | chr1_5(space->machine, vrom_bank[5], CHRROM); |
| 2055 | 2244 | break; |
| 2056 | 2245 | case 0x5003: |
| 2057 | | case 0x5006: |
| 2246 | case 0x500c: |
| 2058 | 2247 | vrom_bank[5] = (vrom_bank[5] & 0x0f) | (data << 4); |
| 2059 | 2248 | chr1_5(space->machine, vrom_bank[5], CHRROM); |
| 2060 | 2249 | break; |
| r7421 | r7422 | |
| 2063 | 2252 | chr1_6(space->machine, vrom_bank[6], CHRROM); |
| 2064 | 2253 | break; |
| 2065 | 2254 | case 0x6002: |
| 2255 | case 0x6008: |
| 2066 | 2256 | vrom_bank[6] = (vrom_bank[6] & 0x0f) | (data << 4); |
| 2067 | 2257 | chr1_6(space->machine, vrom_bank[6], CHRROM); |
| 2068 | 2258 | break; |
| r7421 | r7422 | |
| 2072 | 2262 | chr1_7(space->machine, vrom_bank[7], CHRROM); |
| 2073 | 2263 | break; |
| 2074 | 2264 | case 0x6003: |
| 2075 | | case 0x6006: |
| 2265 | case 0x600c: |
| 2076 | 2266 | vrom_bank[7] = (vrom_bank[7] & 0x0f) | (data << 4); |
| 2077 | 2267 | chr1_7(space->machine, vrom_bank[7], CHRROM); |
| 2078 | 2268 | break; |
| r7421 | r7422 | |
| 2081 | 2271 | IRQ_count_latch = (IRQ_count_latch & 0xf0) | (data & 0x0f); |
| 2082 | 2272 | break; |
| 2083 | 2273 | case 0x7002: |
| 2274 | case 0x7008: |
| 2084 | 2275 | IRQ_count_latch = (IRQ_count_latch & 0x0f) | ((data & 0x0f) << 4 ); |
| 2085 | 2276 | break; |
| 2277 | case 0x7001: |
| 2086 | 2278 | case 0x7004: |
| 2087 | | case 0x7001: |
| 2088 | 2279 | IRQ_mode = data & 0x04; // currently not implemented: 0 = prescaler mode / 1 = CPU mode |
| 2089 | 2280 | IRQ_enable = data & 0x02; |
| 2090 | 2281 | IRQ_enable_latch = data & 0x01; |
| 2091 | 2282 | if (data & 0x02) |
| 2092 | 2283 | IRQ_count = IRQ_count_latch; |
| 2093 | 2284 | break; |
| 2094 | | case 0x7006: |
| 2095 | 2285 | case 0x7003: |
| 2286 | case 0x700c: |
| 2096 | 2287 | IRQ_enable = IRQ_enable_latch; |
| 2097 | 2288 | break; |
| 2098 | 2289 | 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)); |
| 2100 | 2291 | break; |
| 2101 | 2292 | } |
| 2102 | 2293 | } |
| r7421 | r7422 | |
| 10434 | 10625 | { 18, "Jaleco SS88006", NULL, NULL, NULL, mapper18_w, NULL, NULL, jaleco_irq }, |
| 10435 | 10626 | { 19, "Namcot 106 + N106", mapper19_l_w, mapper19_l_r, NULL, mapper19_w, NULL, NULL, namcot_irq }, |
| 10436 | 10627 | { 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 }, |
| 10438 | 10629 | { 22, "Konami VRC 2a", NULL, NULL, NULL, konami_vrc2a_w, NULL, NULL, NULL }, |
| 10439 | 10630 | { 23, "Konami VRC 2b", NULL, NULL, NULL, konami_vrc2b_w, NULL, NULL, konami_irq }, |
| 10440 | 10631 | { 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 }, |
| 10442 | 10633 | { 26, "Konami VRC 6b", NULL, NULL, NULL, konami_vrc6b_w, NULL, NULL, konami_irq }, |
| 10443 | 10634 | // 27 World Hero |
| 10444 | 10635 | // 28, 29, 30, 31 Unused |