Previous 199869 Revisions Next

r18085 Sunday 23rd September, 2012 at 09:18:37 UTC by Fabio Priuli
(MESS) nes.c: moved bankswitch functions into nes_carts_state. no whatsnew.

among other things, this  allowed to remove around a thousand of machine() parameters
passed to re-get the state class at each bankswitch operation. readability says thanks.
[src/mess/includes]nes.h nes_mmc.h
[src/mess/machine]nes.c nes_ines.c nes_mmc.c nes_pcb.c

trunk/src/mess/machine/nes_ines.c
r18084r18085
5353   {
5454      case 0x1fe:
5555         m_mmc_latch1 = data & 0x80;
56         set_nt_mirroring(machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
56         set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
5757         break;
5858      case 0x1ff:
59         set_nt_mirroring(machine(), BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
59         set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
6060         break;
6161
6262      case 0x401:
r18084r18085
7878
7979   if (!m_mmc_latch1)   // when in "FFE mode" we are forced to use CHRRAM/EXRAM bank?
8080   {
81      prg16_89ab(machine(), data >> 2);
82      // chr8(machine(), data & 0x03, ???);
81      prg16_89ab(data >> 2);
82      // chr8(data & 0x03, ???);
8383      // due to lack of info on the exact behavior, we simply act as if mmc_latch1=1
8484      if (m_mmc_chr_source == CHRROM)
85         chr8(machine(), data & 0x03, CHRROM);
85         chr8(data & 0x03, CHRROM);
8686   }
8787   else if (m_mmc_chr_source == CHRROM)         // otherwise, we can use CHRROM (when present)
88      chr8(machine(), data, CHRROM);
88      chr8(data, CHRROM);
8989}
9090
9191/*************************************************************
r18084r18085
103103{
104104   LOG_MMC(("mapper8_w, offset: %04x, data: %02x\n", offset, data));
105105
106   chr8(machine(), data & 0x07, CHRROM);
107   prg16_89ab(machine(), data >> 3);
106   chr8(data & 0x07, CHRROM);
107   prg16_89ab(data >> 3);
108108}
109109
110110/*************************************************************
r18084r18085
126126   switch (offset)
127127   {
128128      case 0x1fe:
129         set_nt_mirroring(machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
129         set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
130130         break;
131131      case 0x1ff:
132         set_nt_mirroring(machine(), BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
132         set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
133133         break;
134134
135135      case 0x401:
r18084r18085
144144         break;
145145
146146      case 0x404:
147         prg8_89(machine(), data);
147         prg8_89(data);
148148         break;
149149      case 0x405:
150         prg8_ab(machine(), data);
150         prg8_ab(data);
151151         break;
152152      case 0x406:
153         prg8_cd(machine(), data);
153         prg8_cd(data);
154154         break;
155155      case 0x407:
156         prg8_ef(machine(), data);
156         prg8_ef(data);
157157         break;
158158
159159      case 0x410:
r18084r18085
164164      case 0x415:
165165      case 0x416:
166166      case 0x417:
167         chr1_x(machine(), offset & 7, data, CHRROM);
167         chr1_x(offset & 7, data, CHRROM);
168168         break;
169169   }
170170}
trunk/src/mess/machine/nes_pcb.c
r18084r18085
718718{
719719   LOG_MMC(("uxrom_w, offset: %04x, data: %02x\n", offset, data));
720720
721   prg16_89ab(machine(), data);
721   prg16_89ab(data);
722722}
723723
724724/*************************************************************
r18084r18085
741741{
742742   LOG_MMC(("uxrom_cc_w, offset: %04x, data: %02x\n", offset, data));
743743
744   prg16_cdef(machine(), data);
744   prg16_cdef(data);
745745}
746746
747747/*************************************************************
r18084r18085
764764{
765765   LOG_MMC(("un1rom_w, offset: %04x, data: %02x\n", offset, data));
766766
767   prg16_89ab(machine(), data >> 2);
767   prg16_89ab(data >> 2);
768768}
769769
770770/*************************************************************
r18084r18085
797797
798798   if (m_ce_mask)
799799   {
800      chr8(machine(), data & ~m_ce_mask, CHRROM);
800      chr8(data & ~m_ce_mask, CHRROM);
801801
802802      if ((data & m_ce_mask) == m_ce_state)
803803         m_chr_open_bus = 0;
r18084r18085
805805         m_chr_open_bus = 1;
806806   }
807807   else
808      chr8(machine(), data, CHRROM);
808      chr8(data, CHRROM);
809809}
810810
811811/*************************************************************
r18084r18085
848848WRITE8_MEMBER(nes_carts_state::cprom_w)
849849{
850850   LOG_MMC(("cprom_w, offset: %04x, data: %02x\n", offset, data));
851   chr4_4(machine(), data, CHRRAM);
851   chr4_4(data, CHRRAM);
852852}
853853
854854/*************************************************************
r18084r18085
871871{
872872   LOG_MMC(("axrom_w, offset: %04x, data: %02x\n", offset, data));
873873
874   set_nt_mirroring(machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
875   prg32(machine(), data);
874   set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
875   prg32(data);
876876}
877877
878878/*************************************************************
r18084r18085
893893   /* Deadly Towers is really a BxROM game - the demo screens look wrong using mapper 7. */
894894   LOG_MMC(("bxrom_w, offset: %04x, data: %02x\n", offset, data));
895895
896   prg32(machine(), data);
896   prg32(data);
897897}
898898
899899/*************************************************************
r18084r18085
912912{
913913   LOG_MMC(("gxrom_w, offset %04x, data: %02x\n", offset, data));
914914
915   prg32(machine(), (data & 0xf0) >> 4);
916   chr8(machine(), data & 0x0f, CHRROM);
915   prg32((data & 0xf0) >> 4);
916   chr8(data & 0x0f, CHRROM);
917917}
918918
919919/*************************************************************
r18084r18085
950950         }
951951      case STD_SXROM_A:   // ignore WRAM enable bit
952952         if (state->m_battery_size > 0x2000)
953            wram_bank(machine, ((state->m_mmc_reg[1] & 3) >> 2), NES_BATTERY);
953            state->wram_bank(((state->m_mmc_reg[1] & 3) >> 2), NES_BATTERY);
954954         else if (state->m_battery_size)
955            wram_bank(machine, 0, NES_BATTERY);
955            state->wram_bank(0, NES_BATTERY);
956956         break;
957957      case STD_SOROM:      // there are 2 WRAM banks only and battery is bank 2 for the cart (hence, we invert bank, because we have battery first)
958958         if (!BIT(state->m_mmc_reg[3], 4))
r18084r18085
963963            break;
964964         }
965965      case STD_SOROM_A:   // ignore WRAM enable bit
966         wram_bank(machine, 0, bank ? NES_BATTERY : NES_WRAM);
966         state->wram_bank(0, bank ? NES_BATTERY : NES_WRAM);
967967         break;
968968   }
969969}
r18084r18085
989989      case 0x00:
990990      case 0x04:
991991//          printf("PRG 32 bank %d \n", (prg_offset + state->m_mmc_reg[3]) >> 1);
992         prg32(machine, (prg_offset + state->m_mmc_reg[3]) >> 1);
992         state->prg32((prg_offset + state->m_mmc_reg[3]) >> 1);
993993         break;
994994      case 0x08:
995995//          printf("PRG 16 bank %d (high) \n", prg_offset + state->m_mmc_reg[3]);
996         prg16_89ab(machine, prg_offset + 0);
997         prg16_cdef(machine, prg_offset + state->m_mmc_reg[3]);
996         state->prg16_89ab(prg_offset + 0);
997         state->prg16_cdef(prg_offset + state->m_mmc_reg[3]);
998998         break;
999999      case 0x0c:
10001000//          printf("PRG 16 bank %d (low) \n", prg_offset + state->m_mmc_reg[3]);
1001         prg16_89ab(machine, prg_offset + state->m_mmc_reg[3]);
1002         prg16_cdef(machine, prg_offset + 0x0f);
1001         state->prg16_89ab(prg_offset + state->m_mmc_reg[3]);
1002         state->prg16_cdef(prg_offset + 0x0f);
10031003         break;
10041004   }
10051005}
r18084r18085
10171017
10181018   if (chr_mode)
10191019   {
1020      chr4_0(machine, state->m_mmc_reg[1] & 0x1f, state->m_mmc_chr_source);
1021      chr4_4(machine, state->m_mmc_reg[2] & 0x1f, state->m_mmc_chr_source);
1020      state->chr4_0(state->m_mmc_reg[1] & 0x1f, state->m_mmc_chr_source);
1021      state->chr4_4(state->m_mmc_reg[2] & 0x1f, state->m_mmc_chr_source);
10221022   }
10231023   else
1024      chr8(machine, (state->m_mmc_reg[1] & 0x1f) >> 1, state->m_mmc_chr_source);
1024      state->chr8((state->m_mmc_reg[1] & 0x1f) >> 1, state->m_mmc_chr_source);
10251025}
10261026
10271027static void common_sxrom_write_handler( address_space &space, offs_t offset, UINT8 data, int board )
r18084r18085
10431043   else
10441044   {
10451045      state->m_mmc1_reg_write_enable = 0;
1046      space.machine().scheduler().synchronize(FUNC(mmc1_resync_callback));
1046      machine.scheduler().synchronize(FUNC(mmc1_resync_callback));
10471047   }
10481048
10491049   if (data & 0x80)
r18084r18085
10741074
10751075            switch (state->m_mmc_reg[0] & 0x03)
10761076            {
1077            case 0: set_nt_mirroring(machine, PPU_MIRROR_LOW); break;
1078            case 1: set_nt_mirroring(machine, PPU_MIRROR_HIGH); break;
1079            case 2: set_nt_mirroring(machine, PPU_MIRROR_VERT); break;
1080            case 3: set_nt_mirroring(machine, PPU_MIRROR_HORZ); break;
1077            case 0: state->set_nt_mirroring(PPU_MIRROR_LOW); break;
1078            case 1: state->set_nt_mirroring(PPU_MIRROR_HIGH); break;
1079            case 2: state->set_nt_mirroring(PPU_MIRROR_VERT); break;
1080            case 3: state->set_nt_mirroring(PPU_MIRROR_HORZ); break;
10811081            }
10821082            mmc1_set_chr(machine);
10831083            mmc1_set_prg_wram(space, board);
r18084r18085
11251125   {
11261126      LOG_MMC(("mmc2 vrom latch switch (bank 0 low): %02x\n", state->m_mmc_reg[0]));
11271127      state->m_mmc_latch1 = 0xfd;
1128      chr4_0(device->machine(), state->m_mmc_reg[0], CHRROM);
1128      state->chr4_0(state->m_mmc_reg[0], CHRROM);
11291129   }
11301130   else if ((offset & 0x3ff0) == 0x0fe0)
11311131   {
11321132      LOG_MMC(("mmc2 vrom latch switch (bank 0 high): %02x\n", state->m_mmc_reg[1]));
11331133      state->m_mmc_latch1 = 0xfe;
1134      chr4_0(device->machine(), state->m_mmc_reg[1], CHRROM);
1134      state->chr4_0(state->m_mmc_reg[1], CHRROM);
11351135   }
11361136   else if ((offset & 0x3ff0) == 0x1fd0)
11371137   {
11381138      LOG_MMC(("mmc2 vrom latch switch (bank 1 low): %02x\n", state->m_mmc_reg[2]));
11391139      state->m_mmc_latch2 = 0xfd;
1140      chr4_4(device->machine(), state->m_mmc_reg[2], CHRROM);
1140      state->chr4_4(state->m_mmc_reg[2], CHRROM);
11411141   }
11421142   else if ((offset & 0x3ff0) == 0x1fe0)
11431143   {
11441144      LOG_MMC(("mmc2 vrom latch switch (bank 0 high): %02x\n", state->m_mmc_reg[3]));
11451145      state->m_mmc_latch2 = 0xfe;
1146      chr4_4(device->machine(), state->m_mmc_reg[3], CHRROM);
1146      state->chr4_4(state->m_mmc_reg[3], CHRROM);
11471147   }
11481148}
11491149
r18084r18085
11531153   switch (offset & 0x7000)
11541154   {
11551155      case 0x2000:
1156         prg8_89(machine(), data);
1156         prg8_89(data);
11571157         break;
11581158      case 0x3000:
11591159         m_mmc_reg[0] = data;
11601160         if (m_mmc_latch1 == 0xfd)
1161            chr4_0(machine(), m_mmc_reg[0], CHRROM);
1161            chr4_0(m_mmc_reg[0], CHRROM);
11621162         break;
11631163      case 0x4000:
11641164         m_mmc_reg[1] = data;
11651165         if (m_mmc_latch1 == 0xfe)
1166            chr4_0(machine(), m_mmc_reg[1], CHRROM);
1166            chr4_0(m_mmc_reg[1], CHRROM);
11671167         break;
11681168      case 0x5000:
11691169         m_mmc_reg[2] = data;
11701170         if (m_mmc_latch2 == 0xfd)
1171            chr4_4(machine(), m_mmc_reg[2], CHRROM);
1171            chr4_4(m_mmc_reg[2], CHRROM);
11721172         break;
11731173      case 0x6000:
11741174         m_mmc_reg[3] = data;
11751175         if (m_mmc_latch2 == 0xfe)
1176            chr4_4(machine(), m_mmc_reg[3], CHRROM);
1176            chr4_4(m_mmc_reg[3], CHRROM);
11771177         break;
11781178      case 0x7000:
1179         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1179         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
11801180         break;
11811181      default:
11821182         LOG_MMC(("MMC2 uncaught w: %04x:%02x\n", offset, data));
r18084r18085
12021202   switch (offset & 0x7000)
12031203   {
12041204      case 0x2000:
1205         prg16_89ab(machine(), data);
1205         prg16_89ab(data);
12061206         break;
12071207      default:
12081208         pxrom_w(space, offset, data, mem_mask);
r18084r18085
12441244   }
12451245}
12461246
1247// base MMC3 simply calls prg8_x
1248static void mmc3_base_prg_cb( running_machine &machine, int start, int bank )
1249{
1250   nes_state *state = machine.driver_data<nes_state>();
1251   state->prg8_x(start, bank);
1252}
1253
1254// base MMC3 simply calls chr1_x
1255static void mmc3_base_chr_cb( running_machine &machine, int start, int bank, int source )
1256{
1257   nes_state *state = machine.driver_data<nes_state>();
1258   state->chr1_x(start, bank, source);
1259}
1260
1261
12471262static void mmc3_set_prg( running_machine &machine, int prg_base, int prg_mask )
12481263{
12491264   nes_state *state = machine.driver_data<nes_state>();
r18084r18085
13321347         break;
13331348
13341349      case 0x2000:
1335         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1350         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
13361351         break;
13371352
13381353      case 0x2001:
r18084r18085
14661481   nes_state *state = machine.driver_data<nes_state>();
14671482   if (state->m_mmc3_latch & 0x80)
14681483   {
1469      set_nt_page(machine, 0, CIRAM, (state->m_mmc_vrom_bank[2] & 0x80) >> 7, 1);
1470      set_nt_page(machine, 1, CIRAM, (state->m_mmc_vrom_bank[3] & 0x80) >> 7, 1);
1471      set_nt_page(machine, 2, CIRAM, (state->m_mmc_vrom_bank[4] & 0x80) >> 7, 1);
1472      set_nt_page(machine, 3, CIRAM, (state->m_mmc_vrom_bank[5] & 0x80) >> 7, 1);
1484      state->set_nt_page(0, CIRAM, (state->m_mmc_vrom_bank[2] & 0x80) >> 7, 1);
1485      state->set_nt_page(1, CIRAM, (state->m_mmc_vrom_bank[3] & 0x80) >> 7, 1);
1486      state->set_nt_page(2, CIRAM, (state->m_mmc_vrom_bank[4] & 0x80) >> 7, 1);
1487      state->set_nt_page(3, CIRAM, (state->m_mmc_vrom_bank[5] & 0x80) >> 7, 1);
14731488   }
14741489   else
14751490   {
1476      set_nt_page(machine, 0, CIRAM, (state->m_mmc_vrom_bank[0] & 0x80) >> 7, 1);
1477      set_nt_page(machine, 1, CIRAM, (state->m_mmc_vrom_bank[0] & 0x80) >> 7, 1);
1478      set_nt_page(machine, 2, CIRAM, (state->m_mmc_vrom_bank[1] & 0x80) >> 7, 1);
1479      set_nt_page(machine, 3, CIRAM, (state->m_mmc_vrom_bank[1] & 0x80) >> 7, 1);
1491      state->set_nt_page(0, CIRAM, (state->m_mmc_vrom_bank[0] & 0x80) >> 7, 1);
1492      state->set_nt_page(1, CIRAM, (state->m_mmc_vrom_bank[0] & 0x80) >> 7, 1);
1493      state->set_nt_page(2, CIRAM, (state->m_mmc_vrom_bank[1] & 0x80) >> 7, 1);
1494      state->set_nt_page(3, CIRAM, (state->m_mmc_vrom_bank[1] & 0x80) >> 7, 1);
14801495   }
14811496}
14821497
14831498static void txsrom_chr_cb( running_machine &machine, int start, int bank, int source )
14841499{
1500   nes_state *state = machine.driver_data<nes_state>();
14851501   txsrom_set_mirror(machine);   // we could probably update only for one (e.g. the first) call, to slightly optimize the code
1486   chr1_x(machine, start, bank, source);
1502   state->chr1_x(start, bank, source);
14871503}
14881504
14891505WRITE8_MEMBER(nes_carts_state::txsrom_w)
r18084r18085
15261542      chr_mask[i] =  (state->m_mmc_vrom_bank[i] & 0x40) ? 0x07 : 0x3f;
15271543   }
15281544
1529   chr1_x(machine, chr_page ^ 0, ((state->m_mmc_vrom_bank[0] & ~0x01) & chr_mask[0]), chr_src[0]);
1530   chr1_x(machine, chr_page ^ 1, ((state->m_mmc_vrom_bank[0] |  0x01) & chr_mask[0]), chr_src[0]);
1531   chr1_x(machine, chr_page ^ 2, ((state->m_mmc_vrom_bank[1] & ~0x01) & chr_mask[1]), chr_src[1]);
1532   chr1_x(machine, chr_page ^ 3, ((state->m_mmc_vrom_bank[1] |  0x01) & chr_mask[1]), chr_src[1]);
1533   chr1_x(machine, chr_page ^ 4, (state->m_mmc_vrom_bank[2] & chr_mask[2]), chr_src[2]);
1534   chr1_x(machine, chr_page ^ 5, (state->m_mmc_vrom_bank[3] & chr_mask[3]), chr_src[3]);
1535   chr1_x(machine, chr_page ^ 6, (state->m_mmc_vrom_bank[4] & chr_mask[4]), chr_src[4]);
1536   chr1_x(machine, chr_page ^ 7, (state->m_mmc_vrom_bank[5] & chr_mask[5]), chr_src[5]);
1545   state->chr1_x(chr_page ^ 0, ((state->m_mmc_vrom_bank[0] & ~0x01) & chr_mask[0]), chr_src[0]);
1546   state->chr1_x(chr_page ^ 1, ((state->m_mmc_vrom_bank[0] |  0x01) & chr_mask[0]), chr_src[0]);
1547   state->chr1_x(chr_page ^ 2, ((state->m_mmc_vrom_bank[1] & ~0x01) & chr_mask[1]), chr_src[1]);
1548   state->chr1_x(chr_page ^ 3, ((state->m_mmc_vrom_bank[1] |  0x01) & chr_mask[1]), chr_src[1]);
1549   state->chr1_x(chr_page ^ 4, (state->m_mmc_vrom_bank[2] & chr_mask[2]), chr_src[2]);
1550   state->chr1_x(chr_page ^ 5, (state->m_mmc_vrom_bank[3] & chr_mask[3]), chr_src[3]);
1551   state->chr1_x(chr_page ^ 6, (state->m_mmc_vrom_bank[4] & chr_mask[4]), chr_src[4]);
1552   state->chr1_x(chr_page ^ 7, (state->m_mmc_vrom_bank[5] & chr_mask[5]), chr_src[5]);
15371553}
15381554
15391555WRITE8_MEMBER(nes_carts_state::tqrom_w)
r18084r18085
16401656   switch (state->m_mmc5_chr_mode)
16411657   {
16421658      case 0:   // 8k banks
1643         chr8(machine, state->m_mmc5_vrom_regA[7] & 0xff, CHRROM);
1659         state->chr8(state->m_mmc5_vrom_regA[7] & 0xff, CHRROM);
16441660         break;
16451661
16461662      case 1:   // 4k banks
1647         chr4_0(machine, state->m_mmc5_vrom_regA[3] & 0xff, CHRROM);
1648         chr4_4(machine, state->m_mmc5_vrom_regA[7] & 0xff, CHRROM);
1663         state->chr4_0(state->m_mmc5_vrom_regA[3] & 0xff, CHRROM);
1664         state->chr4_4(state->m_mmc5_vrom_regA[7] & 0xff, CHRROM);
16491665         break;
16501666
16511667      case 2:   // 2k banks
1652         chr2_0(machine, state->m_mmc5_vrom_regA[1], CHRROM);
1653         chr2_2(machine, state->m_mmc5_vrom_regA[3], CHRROM);
1654         chr2_4(machine, state->m_mmc5_vrom_regA[5], CHRROM);
1655         chr2_6(machine, state->m_mmc5_vrom_regA[7], CHRROM);
1668         state->chr2_0(state->m_mmc5_vrom_regA[1], CHRROM);
1669         state->chr2_2(state->m_mmc5_vrom_regA[3], CHRROM);
1670         state->chr2_4(state->m_mmc5_vrom_regA[5], CHRROM);
1671         state->chr2_6(state->m_mmc5_vrom_regA[7], CHRROM);
16561672         break;
16571673
16581674      case 3:   // 1k banks
1659         chr1_0(machine, state->m_mmc5_vrom_regA[0], CHRROM);
1660         chr1_1(machine, state->m_mmc5_vrom_regA[1], CHRROM);
1661         chr1_2(machine, state->m_mmc5_vrom_regA[2], CHRROM);
1662         chr1_3(machine, state->m_mmc5_vrom_regA[3], CHRROM);
1663         chr1_4(machine, state->m_mmc5_vrom_regA[4], CHRROM);
1664         chr1_5(machine, state->m_mmc5_vrom_regA[5], CHRROM);
1665         chr1_6(machine, state->m_mmc5_vrom_regA[6], CHRROM);
1666         chr1_7(machine, state->m_mmc5_vrom_regA[7], CHRROM);
1675         state->chr1_0(state->m_mmc5_vrom_regA[0], CHRROM);
1676         state->chr1_1(state->m_mmc5_vrom_regA[1], CHRROM);
1677         state->chr1_2(state->m_mmc5_vrom_regA[2], CHRROM);
1678         state->chr1_3(state->m_mmc5_vrom_regA[3], CHRROM);
1679         state->chr1_4(state->m_mmc5_vrom_regA[4], CHRROM);
1680         state->chr1_5(state->m_mmc5_vrom_regA[5], CHRROM);
1681         state->chr1_6(state->m_mmc5_vrom_regA[6], CHRROM);
1682         state->chr1_7(state->m_mmc5_vrom_regA[7], CHRROM);
16671683         break;
16681684   }
16691685}
r18084r18085
16741690   switch (state->m_mmc5_chr_mode)
16751691   {
16761692      case 0:   // 8k banks
1677         chr8(machine, state->m_mmc5_vrom_regB[3] & 0xff, CHRROM);
1693         state->chr8(state->m_mmc5_vrom_regB[3] & 0xff, CHRROM);
16781694         break;
16791695
16801696      case 1:   // 4k banks
1681         chr4_0(machine, state->m_mmc5_vrom_regB[3] & 0xff, CHRROM);
1682         chr4_4(machine, state->m_mmc5_vrom_regB[3] & 0xff, CHRROM);
1697         state->chr4_0(state->m_mmc5_vrom_regB[3] & 0xff, CHRROM);
1698         state->chr4_4(state->m_mmc5_vrom_regB[3] & 0xff, CHRROM);
16831699         break;
16841700
16851701      case 2:   // 2k banks
1686         chr2_0(machine, state->m_mmc5_vrom_regB[1], CHRROM);
1687         chr2_2(machine, state->m_mmc5_vrom_regB[3], CHRROM);
1688         chr2_4(machine, state->m_mmc5_vrom_regB[1], CHRROM);
1689         chr2_6(machine, state->m_mmc5_vrom_regB[3], CHRROM);
1702         state->chr2_0(state->m_mmc5_vrom_regB[1], CHRROM);
1703         state->chr2_2(state->m_mmc5_vrom_regB[3], CHRROM);
1704         state->chr2_4(state->m_mmc5_vrom_regB[1], CHRROM);
1705         state->chr2_6(state->m_mmc5_vrom_regB[3], CHRROM);
16901706         break;
16911707
16921708      case 3:   // 1k banks
1693         chr1_0(machine, state->m_mmc5_vrom_regB[0], CHRROM);
1694         chr1_1(machine, state->m_mmc5_vrom_regB[1], CHRROM);
1695         chr1_2(machine, state->m_mmc5_vrom_regB[2], CHRROM);
1696         chr1_3(machine, state->m_mmc5_vrom_regB[3], CHRROM);
1697         chr1_4(machine, state->m_mmc5_vrom_regB[0], CHRROM);
1698         chr1_5(machine, state->m_mmc5_vrom_regB[1], CHRROM);
1699         chr1_6(machine, state->m_mmc5_vrom_regB[2], CHRROM);
1700         chr1_7(machine, state->m_mmc5_vrom_regB[3], CHRROM);
1709         state->chr1_0(state->m_mmc5_vrom_regB[0], CHRROM);
1710         state->chr1_1(state->m_mmc5_vrom_regB[1], CHRROM);
1711         state->chr1_2(state->m_mmc5_vrom_regB[2], CHRROM);
1712         state->chr1_3(state->m_mmc5_vrom_regB[3], CHRROM);
1713         state->chr1_4(state->m_mmc5_vrom_regB[0], CHRROM);
1714         state->chr1_5(state->m_mmc5_vrom_regB[1], CHRROM);
1715         state->chr1_6(state->m_mmc5_vrom_regB[2], CHRROM);
1716         state->chr1_7(state->m_mmc5_vrom_regB[3], CHRROM);
17011717         break;
17021718   }
17031719}
r18084r18085
17111727   switch (state->m_mmc5_prg_mode)
17121728   {
17131729      case 0:   // 32k banks
1714         prg32(machine, state->m_mmc5_prg_regs[3] >> 2);
1730         state->prg32(state->m_mmc5_prg_regs[3] >> 2);
17151731         break;
17161732
17171733      case 1:   // 16k banks
r18084r18085
17261742            state->membank("bank2")->set_entry(state->m_prg_bank[1]);
17271743         }
17281744         else
1729            prg16_89ab(machine, bank1 >> 1);
1745            state->prg16_89ab(bank1 >> 1);
17301746
1731         prg16_cdef(machine, state->m_mmc5_prg_regs[3] >> 1);
1747         state->prg16_cdef(state->m_mmc5_prg_regs[3] >> 1);
17321748         break;
17331749
17341750      case 2:   // 16k-8k banks
r18084r18085
17441760            state->membank("bank2")->set_entry(state->m_prg_bank[1]);
17451761         }
17461762         else
1747            prg16_89ab(machine, (bank1 & 0x7f) >> 1);
1763            state->prg16_89ab((bank1 & 0x7f) >> 1);
17481764
17491765         if (!BIT(bank3, 7))
17501766         {
r18084r18085
17521768            state->membank("bank3")->set_entry(state->m_prg_bank[2]);
17531769         }
17541770         else
1755            prg8_cd(machine, bank3 & 0x7f);
1771            state->prg8_cd(bank3 & 0x7f);
17561772
1757         prg8_ef(machine, state->m_mmc5_prg_regs[3]);
1773         state->prg8_ef(state->m_mmc5_prg_regs[3]);
17581774         break;
17591775
17601776      case 3:   // 8k banks
r18084r18085
17691785            state->membank("bank1")->set_entry(state->m_prg_bank[0]);
17701786         }
17711787         else
1772            prg8_89(machine, bank1 & 0x7f);
1788            state->prg8_89(bank1 & 0x7f);
17731789
17741790         if (!BIT(bank2, 7))
17751791         {
r18084r18085
17771793            state->membank("bank2")->set_entry(state->m_prg_bank[1]);
17781794         }
17791795         else
1780            prg8_ab(machine, bank2 & 0x7f);
1796            state->prg8_ab(bank2 & 0x7f);
17811797
17821798         if (!BIT(bank3, 7))
17831799         {
r18084r18085
17851801            state->membank("bank3")->set_entry(state->m_prg_bank[2]);
17861802         }
17871803         else
1788            prg8_cd(machine, bank3 & 0x7f);
1804            state->prg8_cd(bank3 & 0x7f);
17891805
1790         prg8_ef(machine, state->m_mmc5_prg_regs[3]);
1806         state->prg8_ef(state->m_mmc5_prg_regs[3]);
17911807         break;
17921808   }
17931809}
r18084r18085
18251841
18261842static void mmc5_ppu_mirror( running_machine &machine, int page, int src )
18271843{
1844   nes_state *state = machine.driver_data<nes_state>();
18281845   switch (src)
18291846   {
18301847      case 0:   /* CIRAM0 */
1831         set_nt_page(machine, page, CIRAM, 0, 1);
1848         state->set_nt_page(page, CIRAM, 0, 1);
18321849         break;
18331850      case 1:   /* CIRAM1 */
1834         set_nt_page(machine, page, CIRAM, 1, 1);
1851         state->set_nt_page(page, CIRAM, 1, 1);
18351852         break;
18361853      case 2:   /* ExRAM */
1837         set_nt_page(machine, page, EXRAM, 0, 1);   // actually only works during rendering.
1854         state->set_nt_page(page, EXRAM, 0, 1);   // actually only works during rendering.
18381855         break;
18391856      case 3: /* Fill Registers */
1840         set_nt_page(machine, page, MMC5FILL, 0, 0);
1857         state->set_nt_page(page, MMC5FILL, 0, 0);
18411858         break;
18421859      default:
18431860         fatalerror("This should never happen\n");
r18084r18085
19661983         LOG_MMC(("MMC5 mid RAM bank select: %02x\n", data & 0x07));
19671984         // FIXME: a few Koei games have both WRAM & BWRAM but here we don't support this (yet)
19681985         if (m_battery)
1969            wram_bank(machine(), data, NES_BATTERY);
1986            wram_bank(data, NES_BATTERY);
19701987         else
1971            wram_bank(machine(), data, NES_WRAM);
1988            wram_bank(data, NES_WRAM);
19721989         break;
19731990
19741991
r18084r18085
20312048            /* 1k switch */
20322049            m_MMC5_vrom_bank[0] = data | (m_mmc5_high_chr << 8);
20332050            //                  mapper5_sync_vrom(0);
2034            chr1_0(machine(), m_MMC5_vrom_bank[0], CHRROM);
2051            chr1_0(m_MMC5_vrom_bank[0], CHRROM);
20352052            //                  m_nes_vram_sprite[0] = m_MMC5_vrom_bank[0] * 64;
20362053            //                  vrom_next[0] = 4;
20372054            //                  vrom_page_a = 1;
r18084r18085
20452062      {
20462063         case 0x02:
20472064            /* 2k switch */
2048            chr2_0(machine(), data | (m_mmc5_high_chr << 8), CHRROM);
2065            chr2_0(data | (m_mmc5_high_chr << 8), CHRROM);
20492066            break;
20502067         case 0x03:
20512068            /* 1k switch */
20522069            m_MMC5_vrom_bank[1] = data | (m_mmc5_high_chr << 8);
20532070            //                  mapper5_sync_vrom(0);
2054            chr1_1(machine(), m_MMC5_vrom_bank[1], CHRROM);
2071            chr1_1(m_MMC5_vrom_bank[1], CHRROM);
20552072            //                  m_nes_vram_sprite[1] = m_MMC5_vrom_bank[0] * 64;
20562073            //                  vrom_next[1] = 5;
20572074            //                  vrom_page_a = 1;
r18084r18085
20672084            /* 1k switch */
20682085            m_MMC5_vrom_bank[2] = data | (m_mmc5_high_chr << 8);
20692086            //                  mapper5_sync_vrom(0);
2070            chr1_2(machine(), m_MMC5_vrom_bank[2], CHRROM);
2087            chr1_2(m_MMC5_vrom_bank[2], CHRROM);
20712088            //                  m_nes_vram_sprite[2] = m_MMC5_vrom_bank[0] * 64;
20722089            //                  vrom_next[2] = 6;
20732090            //                  vrom_page_a = 1;
r18084r18085
20802097         switch (m_mmc5_chr_mode)
20812098      {
20822099         case 0x01:
2083            chr4_0(machine(), data, CHRROM);
2100            chr4_0(data, CHRROM);
20842101            break;
20852102         case 0x02:
20862103            /* 2k switch */
2087            chr2_2(machine(), data | (m_mmc5_high_chr << 8), CHRROM);
2104            chr2_2(data | (m_mmc5_high_chr << 8), CHRROM);
20882105            break;
20892106         case 0x03:
20902107            /* 1k switch */
20912108            m_MMC5_vrom_bank[3] = data | (m_mmc5_high_chr << 8);
20922109            //                  mapper5_sync_vrom(0);
2093            chr1_3(machine(), m_MMC5_vrom_bank[3], CHRROM);
2110            chr1_3(m_MMC5_vrom_bank[3], CHRROM);
20942111            //                  m_nes_vram_sprite[3] = m_MMC5_vrom_bank[0] * 64;
20952112            //                  vrom_next[3] = 7;
20962113            //                  vrom_page_a = 1;
r18084r18085
21062123            /* 1k switch */
21072124            m_MMC5_vrom_bank[4] = data | (m_mmc5_high_chr << 8);
21082125            //                  mapper5_sync_vrom(0);
2109            chr1_4(machine(), m_MMC5_vrom_bank[4], CHRROM);
2126            chr1_4(m_MMC5_vrom_bank[4], CHRROM);
21102127            //                  m_nes_vram_sprite[4] = m_MMC5_vrom_bank[0] * 64;
21112128            //                  vrom_next[0] = 0;
21122129            //                  vrom_page_a = 0;
r18084r18085
21202137      {
21212138         case 0x02:
21222139            /* 2k switch */
2123            chr2_4(machine(), data | (m_mmc5_high_chr << 8), CHRROM);
2140            chr2_4(data | (m_mmc5_high_chr << 8), CHRROM);
21242141            break;
21252142         case 0x03:
21262143            /* 1k switch */
21272144            m_MMC5_vrom_bank[5] = data | (m_mmc5_high_chr << 8);
21282145            //                  mapper5_sync_vrom(0);
2129            chr1_5(machine(), m_MMC5_vrom_bank[5], CHRROM);
2146            chr1_5(m_MMC5_vrom_bank[5], CHRROM);
21302147            //                  m_nes_vram_sprite[5] = m_MMC5_vrom_bank[0] * 64;
21312148            //                  vrom_next[1] = 1;
21322149            //                  vrom_page_a = 0;
r18084r18085
21422159            /* 1k switch */
21432160            m_MMC5_vrom_bank[6] = data | (m_mmc5_high_chr << 8);
21442161            //                  mapper5_sync_vrom(0);
2145            chr1_6(machine(), m_MMC5_vrom_bank[6], CHRROM);
2162            chr1_6(m_MMC5_vrom_bank[6], CHRROM);
21462163            //                  m_nes_vram_sprite[6] = m_MMC5_vrom_bank[0] * 64;
21472164            //                  vrom_next[2] = 2;
21482165            //                  vrom_page_a = 0;
r18084r18085
21562173      {
21572174         case 0x00:
21582175            /* 8k switch */
2159            chr8(machine(), data, CHRROM);
2176            chr8(data, CHRROM);
21602177            break;
21612178         case 0x01:
21622179            /* 4k switch */
2163            chr4_4(machine(), data, CHRROM);
2180            chr4_4(data, CHRROM);
21642181            break;
21652182         case 0x02:
21662183            /* 2k switch */
2167            chr2_6(machine(), data | (m_mmc5_high_chr << 8), CHRROM);
2184            chr2_6(data | (m_mmc5_high_chr << 8), CHRROM);
21682185            break;
21692186         case 0x03:
21702187            /* 1k switch */
21712188            m_MMC5_vrom_bank[7] = data | (m_mmc5_high_chr << 8);
21722189            //                  mapper5_sync_vrom(0);
2173            chr1_7(machine(), m_MMC5_vrom_bank[7], CHRROM);
2190            chr1_7(m_MMC5_vrom_bank[7], CHRROM);
21742191            //                  m_nes_vram_sprite[7] = m_MMC5_vrom_bank[0] * 64;
21752192            //                  vrom_next[3] = 3;
21762193            //                  vrom_page_a = 0;
r18084r18085
21882205            //                  nes_vram[vrom_next[0]] = data * 64;
21892206            //                  nes_vram[0 + (vrom_page_a*4)] = data * 64;
21902207            //                  nes_vram[0] = data * 64;
2191            chr1_4(machine(), m_MMC5_vrom_bank[8], CHRROM);
2208            chr1_4(m_MMC5_vrom_bank[8], CHRROM);
21922209            //                  mapper5_sync_vrom(1);
21932210            if (!m_vrom_page_b)
21942211            {
r18084r18085
22042221      {
22052222         case 0x02:
22062223            /* 2k switch */
2207            chr2_0(machine(), data | (m_mmc5_high_chr << 8), CHRROM);
2208            chr2_4(machine(), data | (m_mmc5_high_chr << 8), CHRROM);
2224            chr2_0(data | (m_mmc5_high_chr << 8), CHRROM);
2225            chr2_4(data | (m_mmc5_high_chr << 8), CHRROM);
22092226            break;
22102227         case 0x03:
22112228            /* 1k switch */
r18084r18085
22132230            //                  nes_vram[vrom_next[1]] = data * 64;
22142231            //                  nes_vram[1 + (vrom_page_a*4)] = data * 64;
22152232            //                  nes_vram[1] = data * 64;
2216            chr1_5(machine(), m_MMC5_vrom_bank[9], CHRROM);
2233            chr1_5(m_MMC5_vrom_bank[9], CHRROM);
22172234            //                  mapper5_sync_vrom(1);
22182235            if (!m_vrom_page_b)
22192236            {
r18084r18085
22332250            //                  nes_vram[vrom_next[2]] = data * 64;
22342251            //                  nes_vram[2 + (vrom_page_a*4)] = data * 64;
22352252            //                  nes_vram[2] = data * 64;
2236            chr1_6(machine(), m_MMC5_vrom_bank[10], CHRROM);
2253            chr1_6(m_MMC5_vrom_bank[10], CHRROM);
22372254            //                  mapper5_sync_vrom(1);
22382255            if (!m_vrom_page_b)
22392256            {
r18084r18085
22502267         case 0x00:
22512268            /* 8k switch */
22522269            /* switches in first half of an 8K bank!) */
2253            chr4_0(machine(), data << 1, CHRROM);
2254            chr4_4(machine(), data << 1, CHRROM);
2270            chr4_0(data << 1, CHRROM);
2271            chr4_4(data << 1, CHRROM);
22552272            break;
22562273         case 0x01:
22572274            /* 4k switch */
2258            chr4_0(machine(), data, CHRROM);
2259            chr4_4(machine(), data, CHRROM);
2275            chr4_0(data, CHRROM);
2276            chr4_4(data, CHRROM);
22602277            break;
22612278         case 0x02:
22622279            /* 2k switch */
2263            chr2_2(machine(), data | (m_mmc5_high_chr << 8), CHRROM);
2264            chr2_6(machine(), data | (m_mmc5_high_chr << 8), CHRROM);
2280            chr2_2(data | (m_mmc5_high_chr << 8), CHRROM);
2281            chr2_6(data | (m_mmc5_high_chr << 8), CHRROM);
22652282            break;
22662283         case 0x03:
22672284            /* 1k switch */
r18084r18085
22692286            //                  nes_vram[vrom_next[3]] = data * 64;
22702287            //                  nes_vram[3 + (vrom_page_a*4)] = data * 64;
22712288            //                  nes_vram[3] = data * 64;
2272            chr1_7(machine(), m_MMC5_vrom_bank[11], CHRROM);
2289            chr1_7(m_MMC5_vrom_bank[11], CHRROM);
22732290            //                  mapper5_sync_vrom(1);
22742291            if (!m_vrom_page_b)
22752292            {
r18084r18085
23412358
23422359static void ntbrom_mirror( running_machine &machine, int mirror, int mirr0, int mirr1 )
23432360{
2361   nes_state *state = machine.driver_data<nes_state>();
23442362   switch (mirror)
23452363   {
23462364      case 0x00:
2347         set_nt_mirroring(machine, PPU_MIRROR_HORZ);
2365         state->set_nt_mirroring(PPU_MIRROR_HORZ);
23482366         break;
23492367      case 0x01:
2350         set_nt_mirroring(machine, PPU_MIRROR_VERT);
2368         state->set_nt_mirroring(PPU_MIRROR_VERT);
23512369         break;
23522370      case 0x02:
2353         set_nt_mirroring(machine, PPU_MIRROR_LOW);
2371         state->set_nt_mirroring(PPU_MIRROR_LOW);
23542372         break;
23552373      case 0x03:
2356         set_nt_mirroring(machine, PPU_MIRROR_HIGH);
2374         state->set_nt_mirroring(PPU_MIRROR_HIGH);
23572375         break;
23582376      case 0x10:
2359         set_nt_page(machine, 0, ROM, mirr0 | 0x80, 0);
2360         set_nt_page(machine, 1, ROM, mirr1 | 0x80, 0);
2361         set_nt_page(machine, 2, ROM, mirr0 | 0x80, 0);
2362         set_nt_page(machine, 3, ROM, mirr1 | 0x80, 0);
2377         state->set_nt_page(0, ROM, mirr0 | 0x80, 0);
2378         state->set_nt_page(1, ROM, mirr1 | 0x80, 0);
2379         state->set_nt_page(2, ROM, mirr0 | 0x80, 0);
2380         state->set_nt_page(3, ROM, mirr1 | 0x80, 0);
23632381         break;
23642382      case 0x11:
2365         set_nt_page(machine, 0, ROM, mirr0 | 0x80, 0);
2366         set_nt_page(machine, 1, ROM, mirr0 | 0x80, 0);
2367         set_nt_page(machine, 2, ROM, mirr1 | 0x80, 0);
2368         set_nt_page(machine, 3, ROM, mirr1 | 0x80, 0);
2383         state->set_nt_page(0, ROM, mirr0 | 0x80, 0);
2384         state->set_nt_page(1, ROM, mirr0 | 0x80, 0);
2385         state->set_nt_page(2, ROM, mirr1 | 0x80, 0);
2386         state->set_nt_page(3, ROM, mirr1 | 0x80, 0);
23692387         break;
23702388      case 0x12:
2371         set_nt_page(machine, 0, ROM, mirr0 | 0x80, 0);
2372         set_nt_page(machine, 1, ROM, mirr0 | 0x80, 0);
2373         set_nt_page(machine, 2, ROM, mirr0 | 0x80, 0);
2374         set_nt_page(machine, 3, ROM, mirr0 | 0x80, 0);
2389         state->set_nt_page(0, ROM, mirr0 | 0x80, 0);
2390         state->set_nt_page(1, ROM, mirr0 | 0x80, 0);
2391         state->set_nt_page(2, ROM, mirr0 | 0x80, 0);
2392         state->set_nt_page(3, ROM, mirr0 | 0x80, 0);
23752393         break;
23762394      case 0x13:
2377         set_nt_page(machine, 0, ROM, mirr1 | 0x80, 0);
2378         set_nt_page(machine, 1, ROM, mirr1 | 0x80, 0);
2379         set_nt_page(machine, 2, ROM, mirr1 | 0x80, 0);
2380         set_nt_page(machine, 3, ROM, mirr1 | 0x80, 0);
2395         state->set_nt_page(0, ROM, mirr1 | 0x80, 0);
2396         state->set_nt_page(1, ROM, mirr1 | 0x80, 0);
2397         state->set_nt_page(2, ROM, mirr1 | 0x80, 0);
2398         state->set_nt_page(3, ROM, mirr1 | 0x80, 0);
23812399         break;
23822400   }
23832401}
r18084r18085
23902408   switch (offset & 0x7000)
23912409   {
23922410      case 0x0000:
2393         chr2_0(machine(), data, CHRROM);
2411         chr2_0(data, CHRROM);
23942412         break;
23952413      case 0x1000:
2396         chr2_2(machine(), data, CHRROM);
2414         chr2_2(data, CHRROM);
23972415         break;
23982416      case 0x2000:
2399         chr2_4(machine(), data, CHRROM);
2417         chr2_4(data, CHRROM);
24002418         break;
24012419      case 0x3000:
2402         chr2_6(machine(), data, CHRROM);
2420         chr2_6(data, CHRROM);
24032421         break;
24042422      case 0x4000:
24052423         m_mmc_latch1 = data & 0x7f;
r18084r18085
24142432         ntbrom_mirror(machine(), m_mmc_reg[0], m_mmc_latch1, m_mmc_latch2);
24152433         break;
24162434      case 0x7000:
2417         prg16_89ab(machine(), data);
2435         prg16_89ab(data);
24182436         break;
24192437      default:
24202438         LOG_MMC(("ntbrom_w uncaught write, offset: %04x, data: %02x\n", offset, data));
r18084r18085
24742492         switch (m_mmc_latch1)
24752493         {
24762494         case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
2477            chr1_x(machine(), m_mmc_latch1, data, CHRROM);
2495            chr1_x(m_mmc_latch1, data, CHRROM);
24782496            break;
24792497
24802498         case 8:
r18084r18085
24822500            {
24832501               // is PRG ROM
24842502               space.unmap_write(0x6000, 0x7fff);
2485               prg8_67(machine(), data & 0x3f);
2503               prg8_67(data & 0x3f);
24862504            }
24872505            else if (data & 0x80)
24882506            {
r18084r18085
24942512            break;
24952513
24962514         case 9:
2497            prg8_89(machine(), data);
2515            prg8_89(data);
24982516            break;
24992517         case 0x0a:
2500            prg8_ab(machine(), data);
2518            prg8_ab(data);
25012519            break;
25022520         case 0x0b:
2503            prg8_cd(machine(), data);
2521            prg8_cd(data);
25042522            break;
25052523         case 0x0c:
25062524            switch (data & 0x03)
25072525            {
2508            case 0x00: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
2509            case 0x01: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
2510            case 0x02: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
2511            case 0x03: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
2526            case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
2527            case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
2528            case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
2529            case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
25122530            }
25132531            break;
25142532         case 0x0d:
r18084r18085
25642582      case 1:
25652583         switch (m_mmc_latch1 & 0x07)
25662584         {
2567         case 0: chr2_0(machine(), data >> 1, CHRROM); break;
2568         case 1: chr2_2(machine(), data >> 1, CHRROM); break;
2569         case 2: chr1_4(machine(), data | 0x40, CHRROM); break;
2570         case 3: chr1_5(machine(), data | 0x40, CHRROM); break;
2571         case 4: chr1_6(machine(), data | 0x40, CHRROM); break;
2572         case 5: chr1_7(machine(), data | 0x40, CHRROM); break;
2573         case 6: prg8_89(machine(), data); break;
2574         case 7: prg8_ab(machine(), data); break;
2585         case 0: chr2_0(data >> 1, CHRROM); break;
2586         case 1: chr2_2(data >> 1, CHRROM); break;
2587         case 2: chr1_4(data | 0x40, CHRROM); break;
2588         case 3: chr1_5(data | 0x40, CHRROM); break;
2589         case 4: chr1_6(data | 0x40, CHRROM); break;
2590         case 5: chr1_7(data | 0x40, CHRROM); break;
2591         case 6: prg8_89(data); break;
2592         case 7: prg8_ab(data); break;
25752593         }
25762594         break;
25772595      case 0:
r18084r18085
26002618
26012619   // additional mirroring control when writing to even addresses
26022620   if (!(offset & 1))
2603      set_nt_mirroring(machine(), BIT(data, 6) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
2621      set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
26042622
26052623   dxrom_w(space, offset, data, mem_mask);
26062624}
r18084r18085
26252643   if (offset >= 0x2000)
26262644   {
26272645      if (!(offset & 1))
2628         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
2646         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
26292647      return;
26302648   }
26312649
r18084r18085
26342652      case 1:
26352653         switch (m_mmc_latch1 & 0x07)
26362654         {
2637         case 2: chr2_0(machine(), data, CHRROM); break;
2638         case 3: chr2_2(machine(), data, CHRROM); break;
2639         case 4: chr2_4(machine(), data, CHRROM); break;
2640         case 5: chr2_6(machine(), data, CHRROM); break;
2641         case 6: BIT(m_mmc_latch1, 6) ? prg8_cd(machine(), data) : prg8_89(machine(), data); break;
2642         case 7: prg8_ab(machine(), data); break;
2655         case 2: chr2_0(data, CHRROM); break;
2656         case 3: chr2_2(data, CHRROM); break;
2657         case 4: chr2_4(data, CHRROM); break;
2658         case 5: chr2_6(data, CHRROM); break;
2659         case 6: BIT(m_mmc_latch1, 6) ? prg8_cd(data) : prg8_89(data); break;
2660         case 7: prg8_ab(data); break;
26432661         }
26442662         break;
26452663      case 0:
r18084r18085
26742692         mode = m_mmc_latch1 & 0x07;
26752693         switch (mode)
26762694         {
2677         case 0: chr2_0(machine(), data >> 1, CHRROM); break;
2678         case 1: chr2_2(machine(), data >> 1, CHRROM); break;
2695         case 0: chr2_0(data >> 1, CHRROM); break;
2696         case 1: chr2_2(data >> 1, CHRROM); break;
26792697         case 2:
26802698         case 3:
26812699         case 4:
26822700         case 5:
2683            chr1_x(machine(), 2 + mode, data, CHRROM);
2701            chr1_x(2 + mode, data, CHRROM);
26842702            m_mmc_reg[mode - 2] = BIT(data, 5);
26852703            if (!BIT(m_mmc_latch1, 7))
26862704            {
2687                  set_nt_page(machine(), 0, CIRAM, m_mmc_reg[0], 1);
2688                  set_nt_page(machine(), 1, CIRAM, m_mmc_reg[1], 1);
2689                  set_nt_page(machine(), 2, CIRAM, m_mmc_reg[2], 1);
2690                  set_nt_page(machine(), 3, CIRAM, m_mmc_reg[3], 1);
2705                  set_nt_page(0, CIRAM, m_mmc_reg[0], 1);
2706                  set_nt_page(1, CIRAM, m_mmc_reg[1], 1);
2707                  set_nt_page(2, CIRAM, m_mmc_reg[2], 1);
2708                  set_nt_page(3, CIRAM, m_mmc_reg[3], 1);
26912709            }
26922710            else
2693               set_nt_mirroring(machine(), PPU_MIRROR_HORZ);
2711               set_nt_mirroring(PPU_MIRROR_HORZ);
26942712            break;
2695         case 6: prg8_89(machine(), data); break;
2696         case 7: prg8_ab(machine(), data); break;
2713         case 6: prg8_89(data); break;
2714         case 7: prg8_ab(data); break;
26972715         }
26982716         break;
26992717      case 0:
r18084r18085
27182736{
27192737   LOG_MMC(("dis_74x377_w, offset: %04x, data: %02x\n", offset, data));
27202738
2721   chr8(machine(), data >> 4, m_mmc_chr_source);
2722   prg32(machine(), data & 0x0f);
2739   chr8(data >> 4, m_mmc_chr_source);
2740   prg32(data & 0x0f);
27232741}
27242742
27252743/*************************************************************
r18084r18085
27342752{
27352753   LOG_MMC(("dis_74x139x74_m_w, offset: %04x, data: %02x\n", offset, data));
27362754
2737   chr8(machine(), ((data & 0x02) >> 1) | ((data & 0x01) << 1), CHRROM);
2755   chr8(((data & 0x02) >> 1) | ((data & 0x01) << 1), CHRROM);
27382756}
27392757
27402758/*************************************************************
r18084r18085
27512769{
27522770   LOG_MMC(("dis_74x161x138_m_w, offset: %04x, data: %02x\n", offset, data));
27532771
2754   chr8(machine(), data >> 2, CHRROM);
2755   prg32(machine(), data);
2772   chr8(data >> 2, CHRROM);
2773   prg32(data);
27562774}
27572775
27582776/*************************************************************
r18084r18085
27722790   LOG_MMC(("dis_74x161x161x32_w, offset: %04x, data: %02x\n", offset, data));
27732791
27742792   if (!m_hard_mirroring)   // there are two 'variants' depending on hardwired or mapper ctrl mirroring
2775      set_nt_mirroring(machine(), BIT(data, 7) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
2776   chr8(machine(), data, CHRROM);
2777   prg16_89ab(machine(), data >> 4);
2793      set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
2794   chr8(data, CHRROM);
2795   prg16_89ab(data >> 4);
27782796}
27792797
27802798/*************************************************************
r18084r18085
28282846   {
28292847      case 0: case 1: case 2: case 3:
28302848      case 4: case 5: case 6: case 7:
2831         chr1_x(machine(), offset & 0x07, data, m_mmc_chr_source);
2849         chr1_x(offset & 0x07, data, m_mmc_chr_source);
28322850         break;
28332851      case 8:
2834         prg16_89ab(machine(), data);
2852         prg16_89ab(data);
28352853         break;
28362854      case 9:
28372855         switch (data & 0x03)
28382856         {
2839         case 0: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
2840         case 1: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
2841         case 2: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
2842         case 3: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
2857         case 0: set_nt_mirroring(PPU_MIRROR_VERT); break;
2858         case 1: set_nt_mirroring(PPU_MIRROR_HORZ); break;
2859         case 2: set_nt_mirroring(PPU_MIRROR_LOW); break;
2860         case 3: set_nt_mirroring(PPU_MIRROR_HIGH); break;
28432861         }
28442862         break;
28452863      case 0x0a:
r18084r18085
28782896   for (i = 0; i < 8; i++)
28792897      mmc_helper |= ((state->m_mmc_reg[i] & 0x01) << 4);
28802898
2881   prg16_89ab(machine, mmc_helper | state->m_mmc_latch1);
2882   prg16_cdef(machine, mmc_helper | 0x0f);
2899   state->prg16_89ab(mmc_helper | state->m_mmc_latch1);
2900   state->prg16_cdef(mmc_helper | 0x0f);
28832901}
28842902
28852903WRITE8_MEMBER(nes_carts_state::fjump2_w)
r18084r18085
29192937{
29202938   LOG_MMC(("bandai_ks_w, offset: %04x, data: %02x\n", offset, data));
29212939
2922   prg16_89ab(machine(), data ^ 0x08);
2940   prg16_89ab(data ^ 0x08);
29232941}
29242942
29252943/*************************************************************
r18084r18085
29402958   UINT8 mmc_helper;
29412959   LOG_MMC(("mapper96_w, offset: %04x, data: %02x\n", offset, data));
29422960
2943   prg32(machine(), data);
2961   prg32(data);
29442962
29452963   m_mmc_latch1 = data;
29462964   mmc_helper = (m_mmc_latch1 & 0x03) | (data & 0x04);
2947   chr4_0(machine(), mmc_helper, CHRRAM);
2948   chr4_4(machine(), 0x03 | (data & 0x04), CHRRAM);
2965   chr4_0(mmc_helper, CHRRAM);
2966   chr4_4(0x03 | (data & 0x04), CHRRAM);
29492967}
29502968
29512969/*************************************************************
r18084r18085
29622980{
29632981   LOG_MMC(("lrog017_w, offset: %04x, data: %02x\n", offset, data));
29642982
2965   prg32(machine(), data);
2966   chr2_0(machine(), (data >> 4), CHRROM);
2983   prg32(data);
2984   chr2_0((data >> 4), CHRROM);
29672985}
29682986
29692987/*************************************************************
r18084r18085
29782996{
29792997   LOG_MMC(("irem_hd_w, offset: %04x, data: %02x\n", offset, data));
29802998
2981   set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
2982   chr8(machine(), data >> 4, CHRROM);
2983   prg16_89ab(machine(), data);
2999   set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
3000   chr8(data >> 4, CHRROM);
3001   prg16_89ab(data);
29843002}
29853003
29863004/*************************************************************
r18084r18085
30013019
30023020   if (offset < 0x4000)
30033021   {
3004      set_nt_mirroring(machine(), BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
3005      prg16_cdef(machine(), data);
3022      set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
3023      prg16_cdef(data);
30063024   }
30073025}
30083026
r18084r18085
30243042   {
30253043      case 0x0000:
30263044         // NEStopia here differs a little bit
3027         m_mmc_latch1 ? prg8_cd(machine(), data) : prg8_89(machine(), data);
3045         m_mmc_latch1 ? prg8_cd(data) : prg8_89(data);
30283046         break;
30293047      case 0x1000:
30303048         m_mmc_latch1 = BIT(data, 1);
30313049         if (!m_hard_mirroring)   // there are two 'variants' depending on hardwired or mapper ctrl mirroring
3032            set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
3050            set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
30333051         break;
30343052      case 0x2000:
3035         prg8_ab(machine(), data);
3053         prg8_ab(data);
30363054         break;
30373055      case 0x3000:
3038         chr1_x(machine(), offset & 0x07, data, CHRROM);
3056         chr1_x(offset & 0x07, data, CHRROM);
30393057         break;
30403058   }
30413059}
r18084r18085
30783096   switch (offset & 0x7fff)
30793097   {
30803098      case 0x0000:
3081         prg8_89(machine(), data);
3099         prg8_89(data);
30823100         break;
30833101
30843102      case 0x1001:
3085         set_nt_mirroring(machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
3103         set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
30863104         break;
30873105
30883106      case 0x1003:
r18084r18085
31023120         break;
31033121
31043122      case 0x2000:
3105         prg8_ab(machine(), data);
3123         prg8_ab(data);
31063124         break;
31073125
31083126      case 0x3000: case 0x3001: case 0x3002: case 0x3003:
31093127      case 0x3004: case 0x3005: case 0x3006: case 0x3007:
3110         chr1_x(machine(), offset & 0x07, data, CHRROM);
3128         chr1_x(offset & 0x07, data, CHRROM);
31113129         break;
31123130
31133131      case 0x4000:
3114         prg8_cd(machine(), data);
3132         prg8_cd(data);
31153133         break;
31163134
31173135      default:
r18084r18085
31923210   {
31933211      case 0x0000:
31943212         m_mmc_prg_bank[0] = (m_mmc_prg_bank[0] & 0xf0) | (data & 0x0f);
3195         prg8_89(machine(), m_mmc_prg_bank[0]);
3213         prg8_89(m_mmc_prg_bank[0]);
31963214         break;
31973215      case 0x0001:
31983216         m_mmc_prg_bank[0] = (m_mmc_prg_bank[0] & 0x0f) | (data << 4);
3199         prg8_89(machine(), m_mmc_prg_bank[0]);
3217         prg8_89(m_mmc_prg_bank[0]);
32003218         break;
32013219      case 0x0002:
32023220         m_mmc_prg_bank[1] = (m_mmc_prg_bank[1] & 0xf0) | (data & 0x0f);
3203         prg8_ab(machine(), m_mmc_prg_bank[1]);
3221         prg8_ab(m_mmc_prg_bank[1]);
32043222         break;
32053223      case 0x0003:
32063224         m_mmc_prg_bank[1] = (m_mmc_prg_bank[1] & 0x0f) | (data << 4);
3207         prg8_ab(machine(), m_mmc_prg_bank[1]);
3225         prg8_ab(m_mmc_prg_bank[1]);
32083226         break;
32093227      case 0x1000:
32103228         m_mmc_prg_bank[2] = (m_mmc_prg_bank[2] & 0xf0) | (data & 0x0f);
3211         prg8_cd(machine(), m_mmc_prg_bank[2]);
3229         prg8_cd(m_mmc_prg_bank[2]);
32123230         break;
32133231      case 0x1001:
32143232         m_mmc_prg_bank[2] = (m_mmc_prg_bank[2] & 0x0f) | (data << 4);
3215         prg8_cd(machine(), m_mmc_prg_bank[2]);
3233         prg8_cd(m_mmc_prg_bank[2]);
32163234         break;
32173235
32183236         /* $9002, 3 (1002, 3) uncaught = Jaleco Baseball writes 0 */
r18084r18085
32283246         else
32293247            m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f);
32303248
3231         chr1_x(machine(), bank, m_mmc_vrom_bank[bank], CHRROM);
3249         chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
32323250         break;
32333251
32343252      case 0x6000:
r18084r18085
32553273      case 0x7002:
32563274         switch (data & 0x03)
32573275         {
3258         case 0: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
3259         case 1: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
3260         case 2: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
3261         case 3: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
3276         case 0: set_nt_mirroring(PPU_MIRROR_HORZ); break;
3277         case 1: set_nt_mirroring(PPU_MIRROR_VERT); break;
3278         case 2: set_nt_mirroring(PPU_MIRROR_LOW); break;
3279         case 3: set_nt_mirroring(PPU_MIRROR_HIGH); break;
32623280         }
32633281         break;
32643282
r18084r18085
32833301WRITE8_MEMBER(nes_carts_state::jf11_m_w)
32843302{
32853303   LOG_MMC(("jf11_m_w, offset: %04x, data: %02x\n", offset, data));
3286   chr8(machine(), data, CHRROM);
3287   prg32(machine(), data >> 4);
3304   chr8(data, CHRROM);
3305   prg32(data >> 4);
32883306}
32893307
32903308/*************************************************************
r18084r18085
33073325
33083326   if (offset == 0)
33093327   {
3310      prg32(machine(), (data >> 4) & 0x03);
3311      chr8(machine(), ((data >> 4) & 0x04) | (data & 0x03), CHRROM);
3328      prg32((data >> 4) & 0x03);
3329      chr8(((data >> 4) & 0x04) | (data & 0x03), CHRROM);
33123330   }
33133331
33143332   if (offset == 0x1000)
r18084r18085
33343352{
33353353   LOG_MMC(("jf16_w, offset: %04x, data: %02x\n", offset, data));
33363354
3337   set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
3338   chr8(machine(), data >> 4, CHRROM);
3339   prg16_89ab(machine(), data);
3355   set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
3356   chr8(data >> 4, CHRROM);
3357   prg16_89ab(data);
33403358}
33413359
33423360/*************************************************************
r18084r18085
33593377   LOG_MMC(("jf17_w, offset: %04x, data: %02x\n", offset, data));
33603378
33613379   if (BIT(data, 7))
3362      prg16_89ab(machine(), data & 0x0f);
3380      prg16_89ab(data & 0x0f);
33633381   if (BIT(data, 6))
3364      chr8(machine(), data & 0x0f, CHRROM);
3382      chr8(data & 0x0f, CHRROM);
33653383   if (BIT(data, 5) && !BIT(data,4))
33663384      LOG_MMC(("Jaleco JF-17 sound write, data: %02x\n", data & 0x1f));
33673385}
r18084r18085
33853403   LOG_MMC(("jf19_w, offset: %04x, data: %02x\n", offset, data));
33863404
33873405   if (BIT(data, 7))
3388      prg16_cdef(machine(), data & 0x0f);
3406      prg16_cdef(data & 0x0f);
33893407   if (BIT(data, 6))
3390      chr8(machine(), data & 0x0f, CHRROM);
3408      chr8(data & 0x0f, CHRROM);
33913409   if (BIT(data, 5) && !BIT(data,4))
33923410      LOG_MMC(("Jaleco JF-19 sound write, data: %02x\n", data & 0x1f));
33933411}
r18084r18085
34113429   switch (offset & 0x7000)
34123430   {
34133431      case 0x0000:
3414         prg8_89(machine(), data);
3432         prg8_89(data);
34153433         break;
34163434      case 0x1000:
3417         set_nt_mirroring(machine(), (data & 0x01) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
3435         set_nt_mirroring((data & 0x01) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
34183436         m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & 0x0f) | ((data & 0x02) << 3);
34193437         m_mmc_vrom_bank[1] = (m_mmc_vrom_bank[1] & 0x0f) | ((data & 0x04) << 2);
3420         chr4_0(machine(), m_mmc_vrom_bank[0], CHRROM);
3421         chr4_4(machine(), m_mmc_vrom_bank[1], CHRROM);
3438         chr4_0(m_mmc_vrom_bank[0], CHRROM);
3439         chr4_4(m_mmc_vrom_bank[1], CHRROM);
34223440         break;
34233441      case 0x2000:
3424         prg8_ab(machine(), data);
3442         prg8_ab(data);
34253443         break;
34263444      case 0x4000:
3427         prg8_cd(machine(), data);
3445         prg8_cd(data);
34283446         break;
34293447      case 0x6000:
34303448         m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & 0x10) | (data & 0x0f);
3431         chr4_0(machine(), m_mmc_vrom_bank[0], CHRROM);
3449         chr4_0(m_mmc_vrom_bank[0], CHRROM);
34323450         break;
34333451      case 0x7000:
34343452         m_mmc_vrom_bank[1] = (m_mmc_vrom_bank[1] & 0x10) | (data & 0x0f);
3435         chr4_4(machine(), m_mmc_vrom_bank[1], CHRROM);
3453         chr4_4(m_mmc_vrom_bank[1], CHRROM);
34363454         break;
34373455   }
34383456}
r18084r18085
34543472   LOG_MMC(("konami_vrc2_w, offset: %04x, data: %02x\n", offset, data));
34553473
34563474   if (offset < 0x1000)
3457      prg8_89(machine(), data);
3475      prg8_89(data);
34583476   else if (offset < 0x2000)
34593477   {
34603478      switch (data & 0x03)
34613479      {
3462         case 0x00: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
3463         case 0x01: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
3464         case 0x02: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
3465         case 0x03: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
3480         case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
3481         case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
3482         case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
3483         case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
34663484      }
34673485   }
34683486   else if (offset < 0x3000)
3469      prg8_ab(machine(), data);
3487      prg8_ab(data);
34703488   else if (offset < 0x7000)
34713489   {
34723490      bank = ((shifted_offs & 0x7000) - 0x3000) / 0x0800 + BIT(shifted_offs, 9);
r18084r18085
34743492      mask = (0xf0 >> shift);
34753493      m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & mask)
34763494                           | (((data >> m_vrc_ls_chr) & 0x0f) << shift);
3477      chr1_x(machine(), bank, m_mmc_vrom_bank[bank], CHRROM);
3495      chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
34783496   }
34793497   else
34803498      logerror("konami_vrc2_w uncaught write, addr: %04x value: %02x\n", offset + 0x8000, data);
r18084r18085
35163534         m_IRQ_count |= (data & 0x0f) << 4;
35173535         break;
35183536      case 0x7000:
3519         prg16_89ab(machine(), data);
3537         prg16_89ab(data);
35203538         break;
35213539      default:
35223540         logerror("konami_vrc3_w uncaught write, offset %04x, data: %02x\n", offset, data);
r18084r18085
35373555   nes_state *state = machine.driver_data<nes_state>();
35383556   if (state->m_mmc_latch1 & 0x02)
35393557   {
3540      prg8_89(machine, 0xfe);
3541      prg8_cd(machine, state->m_mmc_prg_bank[0]);
3558      state->prg8_89(0xfe);
3559      state->prg8_cd(state->m_mmc_prg_bank[0]);
35423560   }
35433561   else
35443562   {
3545      prg8_89(machine, state->m_mmc_prg_bank[0]);
3546      prg8_cd(machine, 0xfe);
3563      state->prg8_89(state->m_mmc_prg_bank[0]);
3564      state->prg8_cd(0xfe);
35473565   }
35483566}
35493567
r18084r18085
35733591      vrc4_set_prg(machine());
35743592   }
35753593   else if (offset >= 0x2000 && offset < 0x3000)
3576      prg8_ab(machine(), data);
3594      prg8_ab(data);
35773595   else
35783596   {
35793597      switch (shifted_offs & 0x7300)
r18084r18085
35823600         case 0x1100:
35833601            switch (data & 0x03)
35843602            {
3585            case 0x00: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
3586            case 0x01: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
3587            case 0x02: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
3588            case 0x03: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
3603            case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
3604            case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
3605            case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
3606            case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
35893607            }
35903608            break;
35913609         case 0x1200:
r18084r18085
36133631            shift = BIT(shifted_offs, 8) * 4;
36143632            mask = (0xf0 >> shift);
36153633            m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & mask) | ((data & 0x0f) << shift);
3616            chr1_x(machine(), bank, m_mmc_vrom_bank[bank], CHRROM);
3634            chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
36173635            break;
36183636         case 0x7000:
36193637            m_IRQ_count_latch = (m_IRQ_count_latch & 0xf0) | (data & 0x0f);
r18084r18085
36563674   LOG_MMC(("konami_vrc6_w, offset: %04x, data: %02x\n", offset, data));
36573675
36583676   if (offset < 0x1000)
3659      prg16_89ab(machine(), data);
3677      prg16_89ab(data);
36603678   else if (offset >= 0x4000 && offset < 0x5000)
3661      prg8_cd(machine(), data);
3679      prg8_cd(data);
36623680   else
36633681   {
36643682      switch (shifted_offs & 0x7300)
r18084r18085
36773695         case 0x3300:
36783696            switch (data & 0x0c)
36793697            {
3680            case 0x00: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
3681            case 0x04: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
3682            case 0x08: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
3683            case 0x0c: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
3698            case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
3699            case 0x04: set_nt_mirroring(PPU_MIRROR_HORZ); break;
3700            case 0x08: set_nt_mirroring(PPU_MIRROR_LOW); break;
3701            case 0x0c: set_nt_mirroring(PPU_MIRROR_HIGH); break;
36843702            }
36853703            break;
36863704         case 0x5000:
r18084r18085
36923710         case 0x6200:
36933711         case 0x6300:
36943712            bank = ((shifted_offs & 0x7000) - 0x5000) / 0x0400 + ((shifted_offs & 0x0300) >> 8);
3695            chr1_x(machine(), bank, data, CHRROM);
3713            chr1_x(bank, data, CHRROM);
36963714            break;
36973715         case 0x7000:
36983716            m_IRQ_count_latch = data;
r18084r18085
37343752   switch (offset & 0x7018)
37353753   {
37363754      case 0x0000:
3737         prg8_89(machine(), data);
3755         prg8_89(data);
37383756         break;
37393757      case 0x0008:
37403758      case 0x0010:
37413759      case 0x0018:
3742         prg8_ab(machine(), data);
3760         prg8_ab(data);
37433761         break;
37443762
37453763      case 0x1000:
3746         prg8_cd(machine(), data);
3764         prg8_cd(data);
37473765         break;
37483766
37493767         /* TODO: there are sound regs in here */
r18084r18085
37653783      case 0x5010:
37663784      case 0x5018:
37673785         bank = ((offset & 0x7000) - 0x2000) / 0x0800 + ((offset & 0x0018) ? 1 : 0);
3768         chr1_x(machine(), bank, data, m_mmc_chr_source);
3786         chr1_x(bank, data, m_mmc_chr_source);
37693787         break;
37703788
37713789      case 0x6000:
37723790         switch (data & 0x03)
37733791         {
3774         case 0x00: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
3775         case 0x01: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
3776         case 0x02: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
3777         case 0x03: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
3792         case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
3793         case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
3794         case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
3795         case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
37783796         }
37793797         break;
37803798      case 0x6008: case 0x6010: case 0x6018:
r18084r18085
38693887
38703888static void namcot163_set_mirror( running_machine &machine, UINT8 page, UINT8 data )
38713889{
3890   nes_state *state = machine.driver_data<nes_state>();
38723891   if (!(data < 0xe0))
3873      set_nt_page(machine, page, CIRAM, data & 0x01, 1);
3892      state->set_nt_page(page, CIRAM, data & 0x01, 1);
38743893   else
3875      set_nt_page(machine, page, ROM, data, 0);
3894      state->set_nt_page(page, ROM, data, 0);
38763895}
38773896
38783897WRITE8_MEMBER(nes_carts_state::namcot163_w)
r18084r18085
38843903      case 0x1000: case 0x1800:
38853904      case 0x2000: case 0x2800:
38863905      case 0x3000: case 0x3800:
3887         chr1_x(machine(), offset / 0x800, data, CHRROM);
3906         chr1_x(offset / 0x800, data, CHRROM);
38883907         break;
38893908      case 0x4000:
38903909         namcot163_set_mirror(machine(), 0, data);
r18084r18085
38993918         namcot163_set_mirror(machine(), 3, data);
39003919         break;
39013920      case 0x6000:
3902         prg8_89(machine(), data & 0x3f);
3921         prg8_89(data & 0x3f);
39033922         break;
39043923      case 0x6800:
39053924         m_mmc_latch1 = data & 0xc0;      // this should enable High CHRRAM, but we still have to properly implement it!
3906         prg8_ab(machine(), data & 0x3f);
3925         prg8_ab(data & 0x3f);
39073926         break;
39083927      case 0x7000:
3909         prg8_cd(machine(), data & 0x3f);
3928         prg8_cd(data & 0x3f);
39103929         break;
39113930      case 0x7800:
39123931         LOG_MMC(("Namcot-163 sound address write, data: %02x\n", data));
r18084r18085
39323951
39333952   if (m_chr_chunks)
39343953   {
3935      chr4_0(machine(), data & 0x0f, CHRROM);
3936      chr4_4(machine(), data >> 4, CHRROM);
3954      chr4_0(data & 0x0f, CHRROM);
3955      chr4_4(data >> 4, CHRROM);
39373956   }
39383957   else
3939      prg16_89ab(machine(), data & 0x0f);
3958      prg16_89ab(data & 0x0f);
39403959}
39413960
39423961/*************************************************************
r18084r18085
39563975   LOG_MMC(("sunsoft2_w, offset: %04x, data: %02x\n", offset, data));
39573976
39583977   if (!m_hard_mirroring)   // there are two 'variants' depending on hardwired or mapper ctrl mirroring
3959      set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
3978      set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
39603979   if (m_chr_chunks)
3961      chr8(machine(), sunsoft_helper, CHRROM);
3980      chr8(sunsoft_helper, CHRROM);
39623981
3963   prg16_89ab(machine(), data >> 4);
3982   prg16_89ab(data >> 4);
39643983}
39653984
39663985/*************************************************************
r18084r18085
40034022   switch (offset & 0x7800)
40044023   {
40054024      case 0x0800:
4006         chr2_0(machine(), data, CHRROM);
4025         chr2_0(data, CHRROM);
40074026         break;
40084027      case 0x1800:
4009         chr2_2(machine(), data, CHRROM);
4028         chr2_2(data, CHRROM);
40104029         break;
40114030      case 0x2800:
4012         chr2_4(machine(), data, CHRROM);
4031         chr2_4(data, CHRROM);
40134032         break;
40144033      case 0x3800:
4015         chr2_6(machine(), data, CHRROM);
4034         chr2_6(data, CHRROM);
40164035         break;
40174036      case 0x4000:
40184037      case 0x4800:
r18084r18085
40294048      case 0x6800:
40304049         switch (data & 3)
40314050         {
4032         case 0x00: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
4033         case 0x01: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
4034         case 0x02: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
4035         case 0x03: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
4051         case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
4052         case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
4053         case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
4054         case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
40364055         }
40374056         break;
40384057      case 0x7800:
4039         prg16_89ab(machine(), data);
4058         prg16_89ab(data);
40404059         break;
40414060      default:
40424061         LOG_MMC(("sunsoft3_w uncaught write, offset: %04x, data: %02x\n", offset, data));
r18084r18085
40654084   switch (offset & 0x7003)
40664085   {
40674086      case 0x0000:
4068         set_nt_mirroring(machine(), BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
4069         prg8_89(machine(), data);
4087         set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
4088         prg8_89(data);
40704089         break;
40714090      case 0x0001:
4072         prg8_ab(machine(), data);
4091         prg8_ab(data);
40734092         break;
40744093      case 0x0002:
4075         chr2_0(machine(), data, CHRROM);
4094         chr2_0(data, CHRROM);
40764095         break;
40774096      case 0x0003:
4078         chr2_2(machine(), data, CHRROM);
4097         chr2_2(data, CHRROM);
40794098         break;
40804099      case 0x2000:
4081         chr1_4(machine(), data, CHRROM);
4100         chr1_4(data, CHRROM);
40824101         break;
40834102      case 0x2001:
4084         chr1_5(machine(), data, CHRROM);
4103         chr1_5(data, CHRROM);
40854104         break;
40864105      case 0x2002:
4087         chr1_6(machine(), data, CHRROM);
4106         chr1_6(data, CHRROM);
40884107         break;
40894108      case 0x2003:
4090         chr1_7(machine(), data, CHRROM);
4109         chr1_7(data, CHRROM);
40914110         break;
40924111   }
40934112}
r18084r18085
41184137   switch (offset & 0x7003)
41194138   {
41204139      case 0x0000:
4121         prg8_89(machine(), data);
4140         prg8_89(data);
41224141         break;
41234142      case 0x0001:
41244143      case 0x0002:
r18084r18085
41424161         m_IRQ_enable = 0;
41434162         break;
41444163      case 0x6000:
4145         set_nt_mirroring(machine(), BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
4164         set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
41464165         break;
41474166   }
41484167}
r18084r18085
41684187   switch (offset)
41694188   {
41704189      case 0x1ef0:
4171         chr2_0(machine(), (data & 0x7f) >> 1, CHRROM);
4190         chr2_0((data & 0x7f) >> 1, CHRROM);
41724191         break;
41734192      case 0x1ef1:
4174         chr2_2(machine(), (data & 0x7f) >> 1, CHRROM);
4193         chr2_2((data & 0x7f) >> 1, CHRROM);
41754194         break;
41764195      case 0x1ef2:
4177         chr1_4(machine(), data, CHRROM);
4196         chr1_4(data, CHRROM);
41784197         break;
41794198      case 0x1ef3:
4180         chr1_5(machine(), data, CHRROM);
4199         chr1_5(data, CHRROM);
41814200         break;
41824201      case 0x1ef4:
4183         chr1_6(machine(), data, CHRROM);
4202         chr1_6(data, CHRROM);
41844203         break;
41854204      case 0x1ef5:
4186         chr1_7(machine(), data, CHRROM);
4205         chr1_7(data, CHRROM);
41874206         break;
41884207      case 0x1ef6:
41894208      case 0x1ef7:
4190         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
4209         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
41914210         break;
41924211      case 0x1ef8:
41934212      case 0x1ef9:
r18084r18085
41954214         break;
41964215      case 0x1efa:
41974216      case 0x1efb:
4198         prg8_89(machine(), data);
4217         prg8_89(data);
41994218         break;
42004219      case 0x1efc:
42014220      case 0x1efd:
4202         prg8_ab(machine(), data);
4221         prg8_ab(data);
42034222         break;
42044223      case 0x1efe:
42054224      case 0x1eff:
4206         prg8_cd(machine(), data);
4225         prg8_cd(data);
42074226         break;
42084227      default:
42094228         logerror("mapper80_m_w uncaught addr: %04x, value: %02x\n", offset + 0x6000, data);
r18084r18085
42394258   switch (offset)
42404259   {
42414260      case 0x1ef0:
4242         set_nt_page(machine(), 0, CIRAM, (data & 0x80) ? 1 : 0, 1);
4243         set_nt_page(machine(), 1, CIRAM, (data & 0x80) ? 1 : 0, 1);
4261         set_nt_page(0, CIRAM, (data & 0x80) ? 1 : 0, 1);
4262         set_nt_page(1, CIRAM, (data & 0x80) ? 1 : 0, 1);
42444263         break;
42454264      case 0x1ef1:
4246         set_nt_page(machine(), 2, CIRAM, (data & 0x80) ? 1 : 0, 1);
4247         set_nt_page(machine(), 3, CIRAM, (data & 0x80) ? 1 : 0, 1);
4265         set_nt_page(2, CIRAM, (data & 0x80) ? 1 : 0, 1);
4266         set_nt_page(3, CIRAM, (data & 0x80) ? 1 : 0, 1);
42484267         break;
42494268   }
42504269
r18084r18085
42724291   nes_state *state = machine.driver_data<nes_state>();
42734292   if (state->m_mmc_latch1)
42744293   {
4275      chr2_4(machine, state->m_mmc_vrom_bank[0] >> 1, CHRROM);
4276      chr2_6(machine, state->m_mmc_vrom_bank[1] >> 1, CHRROM);
4294      state->chr2_4(state->m_mmc_vrom_bank[0] >> 1, CHRROM);
4295      state->chr2_6(state->m_mmc_vrom_bank[1] >> 1, CHRROM);
42774296   }
42784297   else
42794298   {
4280      chr2_0(machine, state->m_mmc_vrom_bank[0] >> 1, CHRROM);
4281      chr2_2(machine, state->m_mmc_vrom_bank[1] >> 1, CHRROM);
4299      state->chr2_0(state->m_mmc_vrom_bank[0] >> 1, CHRROM);
4300      state->chr2_2(state->m_mmc_vrom_bank[1] >> 1, CHRROM);
42824301   }
4283   chr1_x(machine, 4 ^ state->m_mmc_latch1, state->m_mmc_vrom_bank[2], CHRROM);
4284   chr1_x(machine, 5 ^ state->m_mmc_latch1, state->m_mmc_vrom_bank[3], CHRROM);
4285   chr1_x(machine, 6 ^ state->m_mmc_latch1, state->m_mmc_vrom_bank[4], CHRROM);
4286   chr1_x(machine, 7 ^ state->m_mmc_latch1, state->m_mmc_vrom_bank[5], CHRROM);
4302   state->chr1_x(4 ^ state->m_mmc_latch1, state->m_mmc_vrom_bank[2], CHRROM);
4303   state->chr1_x(5 ^ state->m_mmc_latch1, state->m_mmc_vrom_bank[3], CHRROM);
4304   state->chr1_x(6 ^ state->m_mmc_latch1, state->m_mmc_vrom_bank[4], CHRROM);
4305   state->chr1_x(7 ^ state->m_mmc_latch1, state->m_mmc_vrom_bank[5], CHRROM);
42874306}
42884307
42894308WRITE8_MEMBER(nes_carts_state::x1017_m_w)
r18084r18085
43124331         }
43134332         break;
43144333      case 0x1ef6:
4315         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
4334         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
43164335         m_mmc_latch1 = ((data & 0x02) << 1);
43174336         x1017_set_chr(machine());
43184337         break;
r18084r18085
43224341         m_mmc_reg[(offset & 0x0f) - 7] = data;
43234342         break;
43244343      case 0x1efa:
4325         prg8_89(machine(), data >> 2);
4344         prg8_89(data >> 2);
43264345         break;
43274346      case 0x1efb:
4328         prg8_ab(machine(), data >> 2);
4347         prg8_ab(data >> 2);
43294348         break;
43304349      case 0x1efc:
4331         prg8_cd(machine(), data >> 2);
4350         prg8_cd(data >> 2);
43324351         break;
43334352      default:
43344353         logerror("x1017_m_w uncaught write, addr: %04x, value: %02x\n", offset + 0x6000, data);
r18084r18085
43764395   offset += 0x8000;
43774396   data |= (space.read_byte(offset) & 1);
43784397
4379   chr8(machine(), data >> 4, CHRROM);
4380   prg32(machine(), data);
4398   chr8(data >> 4, CHRROM);
4399   prg32(data);
43814400}
43824401
43834402/*************************************************************
r18084r18085
43954414   switch (offset)
43964415   {
43974416      case 0x1ffd:
4398         prg32(machine(), data);
4417         prg32(data);
43994418         break;
44004419      case 0x1ffe:
4401         chr4_0(machine(), data, CHRROM);
4420         chr4_0(data, CHRROM);
44024421         break;
44034422      case 0x1fff:
4404         chr4_4(machine(), data, CHRROM);
4423         chr4_4(data, CHRROM);
44054424         break;
44064425   }
44074426}
r18084r18085
44254444
44264445   if (!(offset & 0x0100))
44274446   {
4428      prg32(machine(), data >> 3);
4429      chr8(machine(), data, CHRROM);
4447      prg32(data >> 3);
4448      chr8(data, CHRROM);
44304449   }
44314450}
44324451
r18084r18085
44444463   UINT8 pmode;
44454464   LOG_MMC(("ae_act52_w, offset: %04x, data: %02x\n", offset, data));
44464465
4447   set_nt_mirroring(machine(), BIT(offset, 13) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
4466   set_nt_mirroring(BIT(offset, 13) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
44484467
44494468   cbank = (data & 0x03) | ((offset & 0x0f) << 2);
4450   chr8(machine(), cbank, CHRROM);
4469   chr8(cbank, CHRROM);
44514470
44524471   pmode = offset & 0x20;
44534472   pbank = (offset & 0x1fc0) >> 6;
44544473   if (pmode)
44554474   {
4456      prg16_89ab(machine(), pbank);
4457      prg16_cdef(machine(), pbank);
4475      prg16_89ab(pbank);
4476      prg16_cdef(pbank);
44584477   }
44594478   else
4460      prg32(machine(), pbank >> 1);
4479      prg32(pbank >> 1);
44614480}
44624481
44634482
r18084r18085
44844503      return;
44854504   if (offset < 0x00a5)
44864505   {
4487      prg32(machine(), (offset - 0x0065) & 0x03);
4506      prg32((offset - 0x0065) & 0x03);
44884507      return;
44894508   }
44904509   if (offset < 0x00e5)
44914510   {
4492      chr8(machine(), (offset - 0x00a5) & 0x07, CHRROM);
4511      chr8((offset - 0x00a5) & 0x07, CHRROM);
44934512   }
44944513}
44954514
r18084r18085
45194538      switch (offset & 0x0007)
45204539      {
45214540         case 0x0000:
4522            prg8_89(machine(), data);
4541            prg8_89(data);
45234542            break;
45244543         case 0x0001:
4525            prg8_ab(machine(), data);
4544            prg8_ab(data);
45264545            break;
45274546         case 0x0002:
4528            prg8_cd(machine(), data);
4547            prg8_cd(data);
45294548            break;
45304549         case 0x0003:
4531            prg8_ef(machine(), data);
4550            prg8_ef(data);
45324551            break;
45334552         case 0x0004:
4534            chr2_0(machine(), data, CHRROM);
4553            chr2_0(data, CHRROM);
45354554            break;
45364555         case 0x0005:
4537            chr2_2(machine(), data, CHRROM);
4556            chr2_2(data, CHRROM);
45384557            break;
45394558         case 0x0006:
4540            chr2_4(machine(), data, CHRROM);
4559            chr2_4(data, CHRROM);
45414560            break;
45424561         case 0x0007:
4543            chr2_6(machine(), data, CHRROM);
4562            chr2_6(data, CHRROM);
45444563            break;
45454564      }
45464565   }
r18084r18085
45694588{
45704589   LOG_MMC(("cne_shlz_l_w, offset: %04x, data: %02x\n", offset, data));
45714590
4572   prg32(machine(), data >> 4);
4573   chr8(machine(), data & 0x0f, CHRROM);
4591   prg32(data >> 4);
4592   chr8(data & 0x0f, CHRROM);
45744593}
45754594
45764595/*************************************************************
r18084r18085
45904609   LOG_MMC(("caltron6in1_m_w, offset: %04x, data: %02x\n", offset, data));
45914610
45924611   m_mmc_latch1 = offset & 0xff;
4593   set_nt_mirroring(machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
4594   prg32(machine(), offset & 0x07);
4612   set_nt_mirroring(BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
4613   prg32(offset & 0x07);
45954614}
45964615
45974616WRITE8_MEMBER(nes_carts_state::caltron6in1_w)
r18084r18085
45994618   LOG_MMC(("caltron6in1_w, offset: %04x, data: %02x\n", offset, data));
46004619
46014620   if (m_mmc_latch1 & 0x04)
4602      chr8(machine(), ((m_mmc_latch1 & 0x18) >> 1) | (data & 0x03), CHRROM);
4621      chr8(((m_mmc_latch1 & 0x18) >> 1) | (data & 0x03), CHRROM);
46034622}
46044623
46054624/*************************************************************
r18084r18085
46284647      case 0x0000:
46294648      case 0x1000:
46304649         if (!m_hard_mirroring)
4631            set_nt_mirroring(machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
4650            set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
46324651         break;
46334652      case 0x4000:
46344653      case 0x5000:
46354654      case 0x6000:
46364655      case 0x7000:
4637         prg16_89ab(machine(), data);
4656         prg16_89ab(data);
46384657         break;
46394658   }
46404659}
r18084r18085
46604679static void bf9096_set_prg( running_machine &machine )
46614680{
46624681   nes_state *state = machine.driver_data<nes_state>();
4663   prg16_89ab(machine, (state->m_mmc_latch2 & 0x03) | ((state->m_mmc_latch1 & 0x18) >> 1));
4664   prg16_cdef(machine, 0x03 | ((state->m_mmc_latch1 & 0x18) >> 1));
4682   state->prg16_89ab((state->m_mmc_latch2 & 0x03) | ((state->m_mmc_latch1 & 0x18) >> 1));
4683   state->prg16_cdef(0x03 | ((state->m_mmc_latch1 & 0x18) >> 1));
46654684}
46664685
46674686WRITE8_MEMBER(nes_carts_state::bf9096_w)
r18084r18085
46974716      if (data & 0x08)
46984717      {
46994718         m_mmc_prg_bank[0] = ((data & 0x07) << 4) | (m_mmc_prg_bank[0] & 0x0f);
4700         prg16_89ab(machine(), m_mmc_prg_bank[0]);
4701         prg16_cdef(machine(), ((data & 0x07) << 4) | 0x0f);
4719         prg16_89ab(m_mmc_prg_bank[0]);
4720         prg16_cdef(((data & 0x07) << 4) | 0x0f);
47024721      }
47034722
47044723   }
47054724   else
47064725   {
47074726      m_mmc_prg_bank[0] = (m_mmc_prg_bank[0] & 0x70) | (data & 0x0f);
4708      prg16_89ab(machine(), m_mmc_prg_bank[0]);
4727      prg16_89ab(m_mmc_prg_bank[0]);
47094728   }
47104729}
47114730
r18084r18085
47474766static void cony_set_prg( running_machine &machine )
47484767{
47494768   nes_state *state = machine.driver_data<nes_state>();
4750   prg16_89ab(machine, state->m_mapper83_reg[8] & 0x3f);
4751   prg16_cdef(machine, (state->m_mapper83_reg[8] & 0x30) | 0x0f);
4769   state->prg16_89ab(state->m_mapper83_reg[8] & 0x3f);
4770   state->prg16_cdef((state->m_mapper83_reg[8] & 0x30) | 0x0f);
47524771}
47534772
47544773static void cony_set_chr( running_machine &machine )
r18084r18085
47614780   // we should split them and possibly document the proper behavior of each variant
47624781   if (state->m_mmc_latch1 && !state->m_mmc_latch2)
47634782   {
4764      chr2_0(machine, state->m_mapper83_reg[0], CHRROM);
4765      chr2_2(machine, state->m_mapper83_reg[1], CHRROM);
4766      chr2_4(machine, state->m_mapper83_reg[6], CHRROM);
4767      chr2_6(machine, state->m_mapper83_reg[7], CHRROM);
4783      state->chr2_0(state->m_mapper83_reg[0], CHRROM);
4784      state->chr2_2(state->m_mapper83_reg[1], CHRROM);
4785      state->chr2_4(state->m_mapper83_reg[6], CHRROM);
4786      state->chr2_6(state->m_mapper83_reg[7], CHRROM);
47684787   }
47694788   else
47704789   {
4771      chr1_0(machine, state->m_mapper83_reg[0] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4772      chr1_1(machine, state->m_mapper83_reg[1] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4773      chr1_2(machine, state->m_mapper83_reg[2] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4774      chr1_3(machine, state->m_mapper83_reg[3] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4775      chr1_4(machine, state->m_mapper83_reg[4] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4776      chr1_5(machine, state->m_mapper83_reg[5] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4777      chr1_6(machine, state->m_mapper83_reg[6] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4778      chr1_7(machine, state->m_mapper83_reg[7] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4790      state->chr1_0(state->m_mapper83_reg[0] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4791      state->chr1_1(state->m_mapper83_reg[1] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4792      state->chr1_2(state->m_mapper83_reg[2] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4793      state->chr1_3(state->m_mapper83_reg[3] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4794      state->chr1_4(state->m_mapper83_reg[4] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4795      state->chr1_5(state->m_mapper83_reg[5] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4796      state->chr1_6(state->m_mapper83_reg[6] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
4797      state->chr1_7(state->m_mapper83_reg[7] | ((state->m_mapper83_reg[8] & 0x30) << 4), CHRROM);
47794798   }
47804799}
47814800
r18084r18085
47994818         switch (data & 0x03)
48004819         {
48014820         case 0:
4802            set_nt_mirroring(machine(), PPU_MIRROR_VERT);
4821            set_nt_mirroring(PPU_MIRROR_VERT);
48034822            break;
48044823         case 1:
4805            set_nt_mirroring(machine(), PPU_MIRROR_HORZ);
4824            set_nt_mirroring(PPU_MIRROR_HORZ);
48064825            break;
48074826         case 2:
4808            set_nt_mirroring(machine(), PPU_MIRROR_LOW);
4827            set_nt_mirroring(PPU_MIRROR_LOW);
48094828            break;
48104829         case 3:
4811            set_nt_mirroring(machine(), PPU_MIRROR_HIGH);
4830            set_nt_mirroring(PPU_MIRROR_HIGH);
48124831            break;
48134832         }
48144833         break;
r18084r18085
48204839         m_IRQ_count = (data << 8) | (m_IRQ_count & 0xff);
48214840         break;
48224841      case 0x0300:
4823         prg8_89(machine(), data);
4842         prg8_89(data);
48244843         break;
48254844      case 0x0301:
4826         prg8_ab(machine(), data);
4845         prg8_ab(data);
48274846         break;
48284847      case 0x0302:
4829         prg8_cd(machine(), data);
4848         prg8_cd(data);
48304849         break;
48314850      case 0x0312:
48324851      case 0x0313:
r18084r18085
48884907   if (state->m_mmc_reg[0] & 0x10)
48894908   {
48904909      int base = (state->m_mmc_reg[1] & 0x08) << 1;
4891      prg8_89(machine, base | (state->m_mapper83_reg[0] & 0x0f));
4892      prg8_ab(machine, base | (state->m_mapper83_reg[1] & 0x0f));
4893      prg8_cd(machine, base | (state->m_mapper83_reg[2] & 0x0f));
4894      prg8_ef(machine, base | 0x0f);
4910      state->prg8_89(base | (state->m_mapper83_reg[0] & 0x0f));
4911      state->prg8_ab(base | (state->m_mapper83_reg[1] & 0x0f));
4912      state->prg8_cd(base | (state->m_mapper83_reg[2] & 0x0f));
4913      state->prg8_ef(base | 0x0f);
48954914   }
48964915   else if (state->m_mmc_reg[0] & 0x08)
4897      prg32(machine, state->m_mmc_reg[1] >> 1);
4916      state->prg32(state->m_mmc_reg[1] >> 1);
48984917   else
48994918   {
4900      prg16_89ab(machine, state->m_mmc_reg[1]);
4901      prg16_cdef(machine, 0xff);
4919      state->prg16_89ab(state->m_mmc_reg[1]);
4920      state->prg16_cdef(0xff);
49024921   }
49034922}
49044923
49054924static void yoko_set_chr( running_machine &machine )
49064925{
49074926   nes_state *state = machine.driver_data<nes_state>();
4908   chr2_0(machine, state->m_mapper83_reg[4], CHRROM);
4909   chr2_2(machine, state->m_mapper83_reg[5], CHRROM);
4910   chr2_4(machine, state->m_mapper83_reg[6], CHRROM);
4911   chr2_6(machine, state->m_mapper83_reg[7], CHRROM);
4927   state->chr2_0(state->m_mapper83_reg[4], CHRROM);
4928   state->chr2_2(state->m_mapper83_reg[5], CHRROM);
4929   state->chr2_4(state->m_mapper83_reg[6], CHRROM);
4930   state->chr2_6(state->m_mapper83_reg[7], CHRROM);
49124931}
49134932
49144933WRITE8_MEMBER(nes_carts_state::yoko_w)
r18084r18085
49244943      case 0x400:
49254944         m_mmc_reg[0] = data;
49264945         if (data & 1)
4927            set_nt_mirroring(machine(), PPU_MIRROR_HORZ);
4946            set_nt_mirroring(PPU_MIRROR_HORZ);
49284947         else
4929            set_nt_mirroring(machine(), PPU_MIRROR_VERT);
4948            set_nt_mirroring(PPU_MIRROR_VERT);
49304949         yoko_set_prg(machine());
49314950         break;
49324951      case 0x0800:
r18084r18085
49684987   offset += 0x100;
49694988
49704989   if (offset == 0x1020)   /* 0x5020 */
4971      prg16_89ab(machine(), data);
4990      prg16_89ab(data);
49724991}
49734992
49744993/*************************************************************
r18084r18085
49925011   if (offset >= 0x200 && offset < 0x400)
49935012   {
49945013      if (offset & 1)
4995         prg16_89ab(machine(), data);
5014         prg16_89ab(data);
49965015      else
4997         wram_bank(machine(), data >> 6, NES_WRAM);
5016         wram_bank(data >> 6, NES_WRAM);
49985017   }
49995018   else if (offset >= 0x400 && offset < 0xf00)
50005019      m_mapper_ram[offset - 0x400] = data;
r18084r18085
50535072   switch (offset)
50545073   {
50555074      case 0x0000:
5056         prg8_89(machine(), data);
5075         prg8_89(data);
50575076         break;
50585077      case 0x0001:
5059         prg8_ab(machine(), data);
5078         prg8_ab(data);
50605079         break;
50615080      case 0x0002:
5062         prg8_cd(machine(), data);
5081         prg8_cd(data);
50635082         break;
50645083      case 0x0003:
5065         prg8_ef(machine(), data);
5084         prg8_ef(data);
50665085         break;
50675086      case 0x2000:
50685087      case 0x2001:
r18084r18085
50725091      case 0x2005:
50735092      case 0x2006:
50745093      case 0x2007:
5075         chr1_x(machine(), offset & 0x07, data, CHRROM);
5094         chr1_x(offset & 0x07, data, CHRROM);
50765095         break;
50775096
50785097      case 0x5000:
5079         set_nt_mirroring(machine(), BIT(data, 0) ?  PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
5098         set_nt_mirroring(BIT(data, 0) ?  PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
50805099         break;
50815100
50825101      case 0x4001:
r18084r18085
51375156   else if (!(offset < 0xf00))
51385157      m_mmc_reg[4] = data;
51395158   else if (!(offset < 0x700))
5140      prg32(machine(), ((data >> 3) & 0x02) | (data & 0x01));
5159      prg32(((data >> 3) & 0x02) | (data & 0x01));
51415160}
51425161
51435162READ8_MEMBER(nes_carts_state::gouder_sf4_l_r)
r18084r18085
51775196{
51785197   LOG_MMC(("henggedianzi_w, offset: %04x, data: %02x\n", offset, data));
51795198
5180   prg32(machine(), data);
5181   set_nt_mirroring(machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
5199   prg32(data);
5200   set_nt_mirroring(BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
51825201}
51835202
51845203/*************************************************************
r18084r18085
52025221   offset += 0x4100;
52035222
52045223   if (offset & 0x5000)
5205      prg32(machine(), data >> 1);
5224      prg32(data >> 1);
52065225}
52075226
52085227WRITE8_MEMBER(nes_carts_state::heng_xjzb_w)
52095228{
52105229   LOG_MMC(("heng_xjzb_w, offset: %04x, data: %02x\n", offset, data));
52115230
5212   set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
5231   set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
52135232}
52145233
52155234/*************************************************************
r18084r18085
52345253
52355254   if (!(offset & 0x100))
52365255   {
5237      prg32(machine(), (data & 0x38) >> 3);
5238      chr8(machine(), (data & 0x07) | ((data & 0x40) >> 3), CHRROM);
5239      set_nt_mirroring(machine(), BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
5256      prg32((data & 0x38) >> 3);
5257      chr8((data & 0x07) | ((data & 0x40) >> 3), CHRROM);
5258      set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
52405259   }
52415260}
52425261
r18084r18085
52465265
52475266   if (!(offset & 0x100))
52485267   {
5249      prg32(machine(), (data & 0x38) >> 3);
5250      chr8(machine(), (data & 0x07) | ((data & 0x40) >> 3), CHRROM);
5268      prg32((data & 0x38) >> 3);
5269      chr8((data & 0x07) | ((data & 0x40) >> 3), CHRROM);
52515270   }
52525271}
52535272
r18084r18085
52705289   switch (offset & 0x7003)
52715290   {
52725291      case 0x0001:
5273         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
5292         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
52745293         break;
52755294      case 0x2000:
52765295         m_mmc_latch1 = data;
r18084r18085
52795298         switch (m_mmc_latch1)
52805299      {
52815300         case 0:
5282            chr2_0(machine(), data >> 1, CHRROM);
5301            chr2_0(data >> 1, CHRROM);
52835302            break;
52845303         case 1:
5285            chr1_5(machine(), data, CHRROM);
5304            chr1_5(data, CHRROM);
52865305            break;
52875306         case 2:
5288            chr2_2(machine(), data >> 1, CHRROM);
5307            chr2_2(data >> 1, CHRROM);
52895308            break;
52905309         case 3:
5291            chr1_7(machine(), data, CHRROM);
5310            chr1_7(data, CHRROM);
52925311            break;
52935312         case 4:
5294            prg8_89(machine(), data);
5313            prg8_89(data);
52955314            break;
52965315         case 5:
5297            prg8_ab(machine(), data);
5316            prg8_ab(data);
52985317            break;
52995318         case 6:
5300            chr1_4(machine(), data, CHRROM);
5319            chr1_4(data, CHRROM);
53015320            break;
53025321         case 7:
5303            chr1_6(machine(), data, CHRROM);
5322            chr1_6(data, CHRROM);
53045323            break;
53055324      }
53065325         break;
r18084r18085
53395358   switch (offset & 0x7080)
53405359   {
53415360      case 0x7000:
5342         chr4_0(machine(), data, CHRROM);
5361         chr4_0(data, CHRROM);
53435362         break;
53445363      case 0x7080:
5345         chr4_4(machine(), data, CHRROM);
5364         chr4_4(data, CHRROM);
53465365         break;
53475366   }
53485367}
r18084r18085
53645383   LOG_MMC(("ks7022_w, offset: %04x, data: %02x\n", offset, data));
53655384
53665385   if (offset == 0)
5367      set_nt_mirroring(machine(), BIT(data, 2) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
5386      set_nt_mirroring(BIT(data, 2) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
53685387
53695388   if (offset == 0x2000)
53705389      m_mmc_latch1 = data & 0x0f;
r18084r18085
53765395
53775396   if (offset == 0x7ffc)
53785397   {
5379      chr8(machine(), m_mmc_latch1, CHRROM);
5380      prg16_89ab(machine(), m_mmc_latch1);
5381      prg16_cdef(machine(), m_mmc_latch1);
5398      chr8(m_mmc_latch1, CHRROM);
5399      prg16_89ab(m_mmc_latch1);
5400      prg16_cdef(m_mmc_latch1);
53825401   }
53835402
53845403   return mmc_hi_access_rom(machine(), offset);
r18084r18085
54005419{
54015420   nes_state *state = machine.driver_data<nes_state>();
54025421
5403   prg8_67(machine, state->m_mmc_reg[4]);
5404   prg8_89(machine, state->m_mmc_reg[1]);
5405   prg8_ab(machine, state->m_mmc_reg[2]);
5406   prg8_cd(machine, state->m_mmc_reg[3]);
5422   state->prg8_67(state->m_mmc_reg[4]);
5423   state->prg8_89(state->m_mmc_reg[1]);
5424   state->prg8_ab(state->m_mmc_reg[2]);
5425   state->prg8_cd(state->m_mmc_reg[3]);
54075426}
54085427
54095428static void ks7032_irq( device_t *device, int scanline, int vblank, int blanked )
r18084r18085
54975516         switch (offset & 0xc00)
54985517         {
54995518         case 0x800:
5500            set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
5519            set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
55015520            break;
55025521         case 0xc00:
5503            chr1_x(machine(), offset & 0x07, data, CHRROM);
5522            chr1_x(offset & 0x07, data, CHRROM);
55045523            break;
55055524         }
55065525         break;
r18084r18085
55465565      m_mmc_latch1 = ((offset >> 2) & 0x03) | ((offset >> 4) & 0x04);
55475566
55485567   if (offset >= 0x1000 && offset < 0x1100)
5549      prg16_89ab(machine(), m_mmc_latch1);
5568      prg16_89ab(m_mmc_latch1);
55505569}
55515570
55525571WRITE8_MEMBER(nes_carts_state::ks7017_extra_w)
r18084r18085
55625581      m_IRQ_count = (m_IRQ_count & 0x00ff) | (data << 8);
55635582
55645583   if (offset == 0x0025) /* 0x4025 */
5565      set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
5584      set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
55665585}
55675586
55685587READ8_MEMBER(nes_carts_state::ks7017_extra_r)
r18084r18085
56705689
56715690   if (state->m_mmc_reg[5] & 0x3f)
56725691   {
5673      prg8_x(machine, start, bank & 0x3f);
5674      prg8_ef(machine, state->m_mmc_reg[1]);
5675      prg8_cd(machine, state->m_mmc_reg[2]);
5676      prg8_ab(machine, state->m_mmc_reg[3]);
5692      state->prg8_x(start, bank & 0x3f);
5693      state->prg8_ef(state->m_mmc_reg[1]);
5694      state->prg8_cd(state->m_mmc_reg[2]);
5695      state->prg8_ab(state->m_mmc_reg[3]);
56775696   }
56785697   else
5679      prg8_x(machine, start, bank & 0x3f);
5698      state->prg8_x(start, bank & 0x3f);
56805699}
56815700
56825701static void kay_pp_chr_cb( running_machine &machine, int start, int bank, int source )
r18084r18085
56875706   if ((start & 0x04) == chr_page)
56885707      bank |= 0x100;
56895708
5690   chr1_x(machine, start, bank, source);
5709   state->chr1_x(start, bank, source);
56915710}
56925711
56935712WRITE8_MEMBER(nes_carts_state::kay_pp_w)
r18084r18085
57425761{
57435762   nes_state *state = machine.driver_data<nes_state>();
57445763   if (BIT(state->m_mmc_reg[0], 7))
5745      prg32(machine, state->m_mmc_reg[0] >> 1);
5764      state->prg32(state->m_mmc_reg[0] >> 1);
57465765   else
5747      prg8_x(machine, start, bank);
5766      state->prg8_x(start, bank);
57485767}
57495768
57505769WRITE8_MEMBER(nes_carts_state::kasing_m_w)
r18084r18085
57835802{
57845803   LOG_MMC(("magics_md_w, offset: %04x, data: %02x\n", offset, data));
57855804
5786   prg32(machine(), data >> 1);
5787   chr8(machine(), data, CHRROM);
5805   prg32(data >> 1);
5806   chr8(data, CHRROM);
57885807}
57895808
57905809/*************************************************************
r18084r18085
58075826   {
58085827      if (scanline == 127)
58095828      {
5810         chr4_0(device->machine(), 1, CHRRAM);
5811         chr4_4(device->machine(), 1, CHRRAM);
5829         state->chr4_0(1, CHRRAM);
5830         state->chr4_4(1, CHRRAM);
58125831      }
58135832
58145833      if (scanline == 239)
58155834      {
5816         chr4_0(device->machine(), 0, CHRRAM);
5817         chr4_4(device->machine(), 0, CHRRAM);
5835         state->chr4_0(0, CHRRAM);
5836         state->chr4_4(0, CHRRAM);
58185837      }
58195838   }
58205839
r18084r18085
58325851   if (offset == 0x1100)   // 0x5100
58335852   {
58345853      if (data == 6)
5835         prg32(machine(), 3);
5854         prg32(3);
58365855      return;
58375856   }
58385857
r18084r18085
58515870      case 0x200:
58525871         m_mmc_reg[BIT(offset, 9)] = data;
58535872         if (!BIT(m_mmc_reg[0], 7) && m_ppu->get_current_scanline() <= 127)
5854            chr8(machine(), 0, CHRRAM);
5873            chr8(0, CHRRAM);
58555874         break;
58565875      case 0x300:
58575876         m_mmc_latch1 = data;
58585877         break;
58595878   }
58605879
5861   prg32(machine(), (m_mmc_reg[0] & 0x0f) | ((m_mmc_reg[1] & 0x0f) << 4));
5880   prg32((m_mmc_reg[0] & 0x0f) | ((m_mmc_reg[1] & 0x0f) << 4));
58625881}
58635882
58645883READ8_MEMBER(nes_carts_state::nanjing_l_r)
r18084r18085
59395958         switch (m_mmc_latch1)
59405959      {
59415960         case 0:
5942            prg8_89(machine(), data);
5961            prg8_89(data);
59435962            break;
59445963         case 1:
5945            prg8_ab(machine(), data);
5964            prg8_ab(data);
59465965            break;
59475966         case 2:
59485967            data &= 0xfe;
5949            chr1_0(machine(), data, CHRROM);
5950            chr1_1(machine(), data + 1, CHRROM);
5968            chr1_0(data, CHRROM);
5969            chr1_1(data + 1, CHRROM);
59515970            break;
59525971         case 3:
59535972            data &= 0xfe;
5954            chr1_2(machine(), data, CHRROM);
5955            chr1_3(machine(), data + 1, CHRROM);
5973            chr1_2(data, CHRROM);
5974            chr1_3(data + 1, CHRROM);
59565975            break;
59575976         case 4:
5958            chr1_4(machine(), data, CHRROM);
5977            chr1_4(data, CHRROM);
59595978            break;
59605979         case 5:
5961            chr1_5(machine(), data, CHRROM);
5980            chr1_5(data, CHRROM);
59625981            break;
59635982         case 6:
5964            chr1_6(machine(), data, CHRROM);
5983            chr1_6(data, CHRROM);
59655984            break;
59665985         case 7:
5967            chr1_7(machine(), data, CHRROM);
5986            chr1_7(data, CHRROM);
59685987            break;
59695988      }
59705989         break;
59715990      case 0x6000:
5972         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
5991         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
59735992         break;
59745993   }
59755994}
r18084r18085
59966015   switch (offset & 0x03)
59976016   {
59986017      case 0:
5999         chr4_0(machine(), data >> 2, CHRROM);
6018         chr4_0(data >> 2, CHRROM);
60006019         break;
60016020      case 1:
6002         chr2_4(machine(), data >> 1, CHRROM);
6021         chr2_4(data >> 1, CHRROM);
60036022         break;
60046023      case 2:
6005         chr2_6(machine(), data >> 1 , CHRROM);
6024         chr2_6(data >> 1 , CHRROM);
60066025         break;
60076026      case 3:
6008         prg8_89(machine(), data);
6027         prg8_89(data);
60096028         break;
60106029   }
60116030}
r18084r18085
60356054      case 0x4000:
60366055      case 0x4004:
60376056         m_mmc_reg[reg + 0] = data;
6038         chr1_0(machine(), m_mmc_reg[0] | (m_mmc_reg[8] << 8), CHRROM);
6057         chr1_0(m_mmc_reg[0] | (m_mmc_reg[8] << 8), CHRROM);
60396058         break;
60406059      case 0x4001:
60416060      case 0x4005:
60426061         m_mmc_reg[reg + 1] = data;
6043         chr1_1(machine(), m_mmc_reg[1] | (m_mmc_reg[9] << 8), CHRROM);
6062         chr1_1(m_mmc_reg[1] | (m_mmc_reg[9] << 8), CHRROM);
60446063         break;
60456064      case 0x4002:
60466065      case 0x4006:
60476066         m_mmc_reg[reg + 2] = data;
6048         chr1_2(machine(), m_mmc_reg[2] | (m_mmc_reg[10] << 8), CHRROM);
6067         chr1_2(m_mmc_reg[2] | (m_mmc_reg[10] << 8), CHRROM);
60496068         break;
60506069      case 0x4003:
60516070      case 0x4007:
60526071         m_mmc_reg[reg + 3] = data;
6053         chr1_3(machine(), m_mmc_reg[3] | (m_mmc_reg[11] << 8), CHRROM);
6072         chr1_3(m_mmc_reg[3] | (m_mmc_reg[11] << 8), CHRROM);
60546073         break;
60556074      case 0x4008:
60566075      case 0x400c:
60576076         m_mmc_reg[reg + 4] = data;
6058         chr1_4(machine(), m_mmc_reg[4] | (m_mmc_reg[12] << 8), CHRROM);
6077         chr1_4(m_mmc_reg[4] | (m_mmc_reg[12] << 8), CHRROM);
60596078         break;
60606079      case 0x4009:
60616080      case 0x400d:
60626081         m_mmc_reg[reg + 5] = data;
6063         chr1_5(machine(), m_mmc_reg[5] | (m_mmc_reg[13] << 8), CHRROM);
6082         chr1_5(m_mmc_reg[5] | (m_mmc_reg[13] << 8), CHRROM);
60646083         break;
60656084      case 0x400a:
60666085      case 0x400e:
60676086         m_mmc_reg[reg + 6] = data;
6068         chr1_6(machine(), m_mmc_reg[6] | (m_mmc_reg[14] << 8), CHRROM);
6087         chr1_6(m_mmc_reg[6] | (m_mmc_reg[14] << 8), CHRROM);
60696088         break;
60706089      case 0x400b:
60716090      case 0x400f:
60726091         m_mmc_reg[reg + 7] = data;
6073         chr1_7(machine(), m_mmc_reg[7] | (m_mmc_reg[15] << 8), CHRROM);
6092         chr1_7(m_mmc_reg[7] | (m_mmc_reg[15] << 8), CHRROM);
60746093         break;
60756094      case 0x4010:
6076         prg16_89ab(machine(), data);
6095         prg16_89ab(data);
60776096         break;
60786097      case 0x4014:
60796098         if (data & 1)
6080            set_nt_mirroring(machine(), PPU_MIRROR_HORZ);
6099            set_nt_mirroring(PPU_MIRROR_HORZ);
60816100         else
6082            set_nt_mirroring(machine(), PPU_MIRROR_VERT);
6101            set_nt_mirroring(PPU_MIRROR_VERT);
60836102         break;
60846103   }
60856104}
r18084r18085
61036122{
61046123   LOG_MMC(("gs2015_w, offset: %04x, data: %02x\n", offset, data));
61056124
6106   prg32(machine(), offset);
6107   chr8(machine(), offset >> 1, m_mmc_chr_source);
6125   prg32(offset);
6126   chr8(offset >> 1, m_mmc_chr_source);
61086127}
61096128
61106129/*************************************************************
r18084r18085
61336152   {
61346153      case 0x00:
61356154      case 0x30:
6136         prg32(machine(), offset & 0x0f);
6155         prg32(offset & 0x0f);
61376156         break;
61386157      case 0x10:
61396158      case 0x20:
6140         prg16_89ab(machine(), ((offset & 0x0f) << 1) | ((offset & 0x20) >> 4));
6141         prg16_cdef(machine(), ((offset & 0x0f) << 1) | ((offset & 0x20) >> 4));
6159         prg16_89ab(((offset & 0x0f) << 1) | ((offset & 0x20) >> 4));
6160         prg16_cdef(((offset & 0x0f) << 1) | ((offset & 0x20) >> 4));
61426161         break;
61436162   }
6144   set_nt_mirroring(machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
6163   set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
61456164}
61466165
61476166/*************************************************************
r18084r18085
61796198   int shift = (start < 4) ? 8 : 4;
61806199
61816200   bank |= ((state->m_mmc_reg[0] << shift) & 0x100);
6182   chr1_x(machine, start, bank, source);
6201   state->chr1_x(start, bank, source);
61836202}
61846203
61856204/*************************************************************
r18084r18085
62066225   }
62076226   else
62086227   {
6209      prg8_89(machine, state->m_mmc_extra_bank[0]);
6210      prg8_ab(machine, state->m_mmc_extra_bank[1]);
6211      prg8_cd(machine, state->m_mmc_extra_bank[2]);
6212      prg8_ef(machine, state->m_mmc_extra_bank[3]);
6228      state->prg8_89(state->m_mmc_extra_bank[0]);
6229      state->prg8_ab(state->m_mmc_extra_bank[1]);
6230      state->prg8_cd(state->m_mmc_extra_bank[2]);
6231      state->prg8_ef(state->m_mmc_extra_bank[3]);
62136232   }
62146233}
62156234
r18084r18085
62396258      }
62406259   }
62416260
6242   chr1_x(machine, chr_page ^ 0, chr_base2[0] | (bank[0] & chr_mask), chr);
6243   chr1_x(machine, chr_page ^ 1, chr_base2[1] | (bank[1] & chr_mask), chr);
6244   chr1_x(machine, chr_page ^ 2, chr_base2[2] | (bank[2] & chr_mask), chr);
6245   chr1_x(machine, chr_page ^ 3, chr_base2[3] | (bank[3] & chr_mask), chr);
6246   chr1_x(machine, chr_page ^ 4, chr_base2[4] | (bank[4] & chr_mask), chr);
6247   chr1_x(machine, chr_page ^ 5, chr_base2[5] | (bank[5] & chr_mask), chr);
6248   chr1_x(machine, chr_page ^ 6, chr_base2[6] | (bank[6] & chr_mask), chr);
6249   chr1_x(machine, chr_page ^ 7, chr_base2[7] | (bank[7] & chr_mask), chr);
6261   state->chr1_x(chr_page ^ 0, chr_base2[0] | (bank[0] & chr_mask), chr);
6262   state->chr1_x(chr_page ^ 1, chr_base2[1] | (bank[1] & chr_mask), chr);
6263   state->chr1_x(chr_page ^ 2, chr_base2[2] | (bank[2] & chr_mask), chr);
6264   state->chr1_x(chr_page ^ 3, chr_base2[3] | (bank[3] & chr_mask), chr);
6265   state->chr1_x(chr_page ^ 4, chr_base2[4] | (bank[4] & chr_mask), chr);
6266   state->chr1_x(chr_page ^ 5, chr_base2[5] | (bank[5] & chr_mask), chr);
6267   state->chr1_x(chr_page ^ 6, chr_base2[6] | (bank[6] & chr_mask), chr);
6268   state->chr1_x(chr_page ^ 7, chr_base2[7] | (bank[7] & chr_mask), chr);
62506269}
62516270
62526271WRITE8_MEMBER(nes_carts_state::rex_sl1632_w)
r18084r18085
62616280      rex_sl1632_set_chr(machine(), m_mmc_chr_source, m_mmc_chr_base, m_mmc_chr_mask);
62626281
62636282      if (!(m_mmc_reg[0] & 0x02))
6264         set_nt_mirroring(machine(), BIT(m_mmc_reg[1], 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
6283         set_nt_mirroring(BIT(m_mmc_reg[1], 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
62656284   }
62666285
62676286   if (m_mmc_reg[0] & 0x02)
r18084r18085
63036322            break;
63046323
63056324         case 0x2000:
6306            set_nt_mirroring(machine(), BIT(m_mmc_reg[1], 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
6325            set_nt_mirroring(BIT(m_mmc_reg[1], 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
63076326            break;
63086327
63096328         default:
r18084r18085
63316350
63326351         case 0x1000:
63336352            m_mmc_reg[1] = data;
6334            set_nt_mirroring(machine(), BIT(m_mmc_reg[1], 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
6353            set_nt_mirroring(BIT(m_mmc_reg[1], 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
63356354            break;
63366355      }
63376356   }
r18084r18085
63556374
63566375   m_mmc_prg_bank[0] = (m_mmc_prg_bank[0] & 0x01) | ((data & 0x0f) << 1);
63576376   m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & 0x07) | ((data & 0xf0) >> 1);
6358   prg32(machine(), m_mmc_prg_bank[0]);
6359   chr8(machine(), m_mmc_vrom_bank[0], CHRROM);
6377   prg32(m_mmc_prg_bank[0]);
6378   chr8(m_mmc_vrom_bank[0], CHRROM);
63606379}
63616380
63626381WRITE8_MEMBER(nes_carts_state::rumblestation_w)
r18084r18085
63656384
63666385   m_mmc_prg_bank[0] = (m_mmc_prg_bank[0] & ~0x01) | (data & 0x01);
63676386   m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & ~0x07) | ((data & 0x70) >> 4);
6368   prg32(machine(), m_mmc_prg_bank[0]);
6369   chr8(machine(), m_mmc_vrom_bank[0], CHRROM);
6387   prg32(m_mmc_prg_bank[0]);
6388   chr8(m_mmc_vrom_bank[0], CHRROM);
63706389}
63716390
63726391/*************************************************************
r18084r18085
63826401
63836402static void sachen_set_mirror( running_machine &machine, UINT8 nt ) // used by mappers 137, 138, 139, 141
63846403{
6404   nes_state *state = machine.driver_data<nes_state>();
63856405   switch (nt)
63866406   {
63876407      case 0:
63886408      case 1:
6389         set_nt_mirroring(machine, nt ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
6409         state->set_nt_mirroring(nt ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
63906410         break;
63916411      case 2:
6392         set_nt_page(machine, 0, CIRAM, 0, 1);
6393         set_nt_page(machine, 1, CIRAM, 1, 1);
6394         set_nt_page(machine, 2, CIRAM, 1, 1);
6395         set_nt_page(machine, 3, CIRAM, 1, 1);
6412         state->set_nt_page(0, CIRAM, 0, 1);
6413         state->set_nt_page(1, CIRAM, 1, 1);
6414         state->set_nt_page(2, CIRAM, 1, 1);
6415         state->set_nt_page(3, CIRAM, 1, 1);
63966416         break;
63976417      case 3:
6398         set_nt_mirroring(machine, PPU_MIRROR_LOW);
6418         state->set_nt_mirroring(PPU_MIRROR_LOW);
63996419         break;
64006420      default:
64016421         LOG_MMC(("Mapper set NT to invalid value %02x", nt));
r18084r18085
64186438         {
64196439            case 0x02:
64206440               m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & ~0x08) | ((data << 3) & 0x08);
6421               chr8(machine(), m_mmc_vrom_bank[0], CHRROM);
6422               prg32(machine(), data & 0x01);
6441               chr8(m_mmc_vrom_bank[0], CHRROM);
6442               prg32(data & 0x01);
64236443               break;
64246444            case 0x04:
64256445               m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & ~0x04) | ((data << 2) & 0x04);
6426               chr8(machine(), m_mmc_vrom_bank[0], CHRROM);
6446               chr8(m_mmc_vrom_bank[0], CHRROM);
64276447               break;
64286448            case 0x05:
6429               prg32(machine(), data & 0x07);
6449               prg32(data & 0x07);
64306450               break;
64316451            case 0x06:
64326452               m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & ~0x03) | ((data << 0) & 0x03);
6433               chr8(machine(), m_mmc_vrom_bank[0], CHRROM);
6453               chr8(m_mmc_vrom_bank[0], CHRROM);
64346454               break;
64356455            case 0x07:
64366456               sachen_set_mirror(machine(), (data >> 1) & 0x03);
r18084r18085
64676487         switch (m_mmc_latch1 & 0x07)
64686488         {
64696489            case 0x00:
6470               prg32(machine(), 0);
6471               chr8(machine(), 3, CHRROM);
6490               prg32(0);
6491               chr8(3, CHRROM);
64726492               break;
64736493            case 0x02:
64746494               m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & ~0x08) | ((data << 3) & 0x08);
6475               chr8(machine(), m_mmc_vrom_bank[0], CHRROM);
6495               chr8(m_mmc_vrom_bank[0], CHRROM);
64766496               break;
64776497            case 0x04:
64786498               m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & ~0x01) | ((data << 0) & 0x01);
6479               chr8(machine(), m_mmc_vrom_bank[0], CHRROM);
6499               chr8(m_mmc_vrom_bank[0], CHRROM);
64806500               break;
64816501            case 0x05:
6482               prg32(machine(), data & 0x01);
6502               prg32(data & 0x01);
64836503               break;
64846504            case 0x06:
64856505               m_mmc_vrom_bank[0] = (m_mmc_vrom_bank[0] & ~0x06) | ((data << 1) & 0x06);
6486               chr8(machine(), m_mmc_vrom_bank[0], CHRROM);
6506               chr8(m_mmc_vrom_bank[0], CHRROM);
64876507               break;
64886508            case 0x07:
64896509               sachen_set_mirror(machine(), BIT(data, 0));
r18084r18085
65056525
65066526static void common_s8259_write_handler( address_space &space, offs_t offset, UINT8 data, int board )
65076527{
6508   nes_state *state = space.machine().driver_data<nes_state>();
6528   running_machine &machine = space.machine();
6529   nes_state *state = machine.driver_data<nes_state>();
65096530   UINT8 bank_helper1, bank_helper2, shift, add1, add2, add3;
65106531
65116532   /* write happens only if we are at 0x4100 + k * 0x200, but 0x4100 is offset = 0 */
r18084r18085
65206541         switch (state->m_mmc_latch1)
65216542         {
65226543            case 0x05:
6523               prg32(space.machine(), data);
6544               state->prg32(data);
65246545               break;
65256546            case 0x07:
6526               sachen_set_mirror(space.machine(), BIT(data, 0) ? 0 : (data >> 1) & 0x03);
6547               sachen_set_mirror(machine, BIT(data, 0) ? 0 : (data >> 1) & 0x03);
65276548               break;
65286549            default:
65296550               if (board == SACHEN_8259D)
65306551               {
65316552                  if (state->m_mmc_chr_source == CHRROM)
65326553                  {
6533                     chr1_0(space.machine(), (state->m_sachen_reg[0] & 0x07), CHRROM);
6534                     chr1_1(space.machine(), (state->m_sachen_reg[1] & 0x07) | (state->m_sachen_reg[4] << 4 & 0x10), CHRROM);
6535                     chr1_2(space.machine(), (state->m_sachen_reg[2] & 0x07) | (state->m_sachen_reg[4] << 3 & 0x10), CHRROM);
6536                     chr1_3(space.machine(), (state->m_sachen_reg[3] & 0x07) | (state->m_sachen_reg[4] << 2 & 0x10) | (state->m_sachen_reg[6] << 3 & 0x08), CHRROM);
6554                     state->chr1_0((state->m_sachen_reg[0] & 0x07), CHRROM);
6555                     state->chr1_1((state->m_sachen_reg[1] & 0x07) | (state->m_sachen_reg[4] << 4 & 0x10), CHRROM);
6556                     state->chr1_2((state->m_sachen_reg[2] & 0x07) | (state->m_sachen_reg[4] << 3 & 0x10), CHRROM);
6557                     state->chr1_3((state->m_sachen_reg[3] & 0x07) | (state->m_sachen_reg[4] << 2 & 0x10) | (state->m_sachen_reg[6] << 3 & 0x08), CHRROM);
65376558                  }
65386559               }
65396560               else
r18084r18085
65476568
65486569                  if (state->m_mmc_chr_source == CHRROM)
65496570                  {
6550                     chr2_0(space.machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 0] & 0x07) | bank_helper2) << shift, CHRROM);
6551                     chr2_2(space.machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 1] & 0x07) | bank_helper2) << shift | add1, CHRROM);
6552                     chr2_4(space.machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 2] & 0x07) | bank_helper2) << shift | add2, CHRROM);
6553                     chr2_6(space.machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 3] & 0x07) | bank_helper2) << shift | add3, CHRROM);
6571                     state->chr2_0(((state->m_sachen_reg[bank_helper1 ? 0 : 0] & 0x07) | bank_helper2) << shift, CHRROM);
6572                     state->chr2_2(((state->m_sachen_reg[bank_helper1 ? 0 : 1] & 0x07) | bank_helper2) << shift | add1, CHRROM);
6573                     state->chr2_4(((state->m_sachen_reg[bank_helper1 ? 0 : 2] & 0x07) | bank_helper2) << shift | add2, CHRROM);
6574                     state->chr2_6(((state->m_sachen_reg[bank_helper1 ? 0 : 3] & 0x07) | bank_helper2) << shift | add3, CHRROM);
65546575                  }
65556576               }
65566577               break;
r18084r18085
65906611{
65916612   LOG_MMC(("sa009_l_w, offset: %04x, data: %02x\n", offset, data));
65926613
6593   chr8(machine(), data, m_mmc_chr_source);
6614   chr8(data, m_mmc_chr_source);
65946615}
65956616
65966617/*************************************************************
r18084r18085
66096630{
66106631   LOG_MMC(("sa0036_w, offset: %04x, data: %02x\n", offset, data));
66116632
6612   chr8(machine(), data >> 7, CHRROM);
6633   chr8(data >> 7, CHRROM);
66136634}
66146635
66156636/*************************************************************
r18084r18085
66286649{
66296650   LOG_MMC(("sa0037_w, offset: %04x, data: %02x\n", offset, data));
66306651
6631   prg32(machine(), data >> 3);
6632   chr8(machine(), data, CHRROM);
6652   prg32(data >> 3);
6653   chr8(data, CHRROM);
66336654}
66346655
66356656/*************************************************************
r18084r18085
66506671
66516672   /* only if we are at 0x4100 + k * 0x200, but 0x4100 is offset = 0 */
66526673   if (!(offset & 0x100))
6653      chr8(machine(), data >> 7, CHRROM);
6674      chr8(data >> 7, CHRROM);
66546675}
66556676
66566677/*************************************************************
r18084r18085
66696690{
66706691   LOG_MMC(("sa72008_l_w, offset: %04x, data: %02x\n", offset, data));
66716692
6672   prg32(machine(), data >> 2);
6673   chr8(machine(), data, CHRROM);
6693   prg32(data >> 2);
6694   chr8(data, CHRROM);
66746695}
66756696
66766697/*************************************************************
r18084r18085
67146735
67156736   if ((offset & 0x103) == 0x002)
67166737   {
6717      prg32(machine(), ((data >> 6) & 0x02) | ((data >> 2) & 0x01));
6718      chr8(machine(), data >> 3, CHRROM);
6738      prg32(((data >> 6) & 0x02) | ((data >> 2) & 0x01));
6739      chr8(data >> 3, CHRROM);
67196740   }
67206741}
67216742
r18084r18085
67526773   if ((offset & 0x103) == 0x002)
67536774   {
67546775      m_mmc_latch1 = (data & 0x30) | ((data + 3) & 0x0f);
6755      chr8(machine(), m_mmc_latch1, CHRROM);
6776      chr8(m_mmc_latch1, CHRROM);
67566777   }
67576778}
67586779
r18084r18085
68016822      subor_helper2 = 0x20;
68026823   }
68036824
6804   prg16_89ab(machine(), subor_helper1);
6805   prg16_cdef(machine(), subor_helper2);
6825   prg16_89ab(subor_helper1);
6826   prg16_cdef(subor_helper2);
68066827}
68076828
68086829/*************************************************************
r18084r18085
68396860      subor_helper2 = 0x07;
68406861   }
68416862
6842   prg16_89ab(machine(), subor_helper1);
6843   prg16_cdef(machine(), subor_helper2);
6863   prg16_89ab(subor_helper1);
6864   prg16_cdef(subor_helper2);
68446865}
68456866
68466867/*************************************************************
r18084r18085
68686889      else
68696890         bank = (bank & 0x0f) | (state->m_mmc_reg[1] & 0x10);
68706891
6871      prg8_x(machine, start, bank);
6892      state->prg8_x(start, bank);
68726893   }
68736894}
68746895
r18084r18085
68816902   else
68826903      bank = (bank & 0x7f) | ((state->m_mmc_reg[1] & 0x10) << 3);
68836904
6884   chr1_x(machine, start, bank, source);
6905   state->chr1_x(start, bank, source);
68856906}
68866907
68876908static void sgame_boog_set_prg( running_machine &machine )
r18084r18085
68896910   nes_state *state = machine.driver_data<nes_state>();
68906911   if (state->m_mmc_reg[0] & 0x80)
68916912   {
6892      prg16_89ab(machine, (state->m_mmc_reg[0] & 0xf0) | (state->m_mmc_reg[1] & 0x10));
6893      prg16_cdef(machine, (state->m_mmc_reg[0] & 0xf0) | (state->m_mmc_reg[1] & 0x10));
6913      state->prg16_89ab((state->m_mmc_reg[0] & 0xf0) | (state->m_mmc_reg[1] & 0x10));
6914      state->prg16_cdef((state->m_mmc_reg[0] & 0xf0) | (state->m_mmc_reg[1] & 0x10));
68946915   }
68956916   else
68966917      mmc3_set_prg(machine, state->m_mmc_prg_base, state->m_mmc_prg_mask);
r18084r18085
69817002         if (!m_mmc_reg[2])
69827003            txrom_w(space, 0x4000, data, mem_mask);
69837004         else
6984            set_nt_mirroring(machine(), ((data >> 7) | data) & 0x01 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
7005            set_nt_mirroring(((data >> 7) | data) & 0x01 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
69857006         break;
69867007
69877008      case 0x4001:
r18084r18085
70297050
70307051   if (m_map114_reg & 0x80)
70317052   {
7032      prg16_89ab(machine(), data & 0x1f);
7033      prg16_cdef(machine(), data & 0x1f);
7053      prg16_89ab(data & 0x1f);
7054      prg16_cdef(data & 0x1f);
70347055   }
70357056   else
70367057      mmc3_set_prg(machine(), m_mmc_prg_base, m_mmc_prg_mask);
r18084r18085
70477068      switch (offset & 0x6000)
70487069      {
70497070         case 0x0000:
7050            set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
7071            set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
70517072            break;
70527073         case 0x2000:
70537074            m_map114_reg_enabled = 1;
r18084r18085
70937114{
70947115   LOG_MMC(("tengen_800008_w, offset: %04x, data: %02x\n", offset, data));
70957116
7096   prg32(machine(), data >> 3);
7097   chr8(machine(), data, CHRROM);
7117   prg32(data >> 3);
7118   chr8(data, CHRROM);
70987119}
70997120
71007121/*************************************************************
r18084r18085
71727193   nes_state *state = machine.driver_data<nes_state>();
71737194   UINT8 prg_mode = state->m_mmc_latch1 & 0x40;
71747195
7175   prg8_89(machine, state->m_mmc_prg_bank[prg_mode ? 2: 0]);
7176   prg8_ab(machine, state->m_mmc_prg_bank[prg_mode ? 0: 1]);
7177   prg8_cd(machine, state->m_mmc_prg_bank[prg_mode ? 1: 2]);
7196   state->prg8_89(state->m_mmc_prg_bank[prg_mode ? 2: 0]);
7197   state->prg8_ab(state->m_mmc_prg_bank[prg_mode ? 0: 1]);
7198   state->prg8_cd(state->m_mmc_prg_bank[prg_mode ? 1: 2]);
71787199}
71797200
71807201static void tengen_800032_set_chr( running_machine &machine )
r18084r18085
71847205
71857206   if (state->m_mmc_latch1 & 0x20)
71867207   {
7187      chr1_x(machine, 0 ^ chr_page, state->m_mmc_vrom_bank[0], CHRROM);
7188      chr1_x(machine, 1 ^ chr_page, state->m_mmc_vrom_bank[8], CHRROM);
7189      chr1_x(machine, 2 ^ chr_page, state->m_mmc_vrom_bank[1], CHRROM);
7190      chr1_x(machine, 3 ^ chr_page, state->m_mmc_vrom_bank[9], CHRROM);
7208      state->chr1_x(0 ^ chr_page, state->m_mmc_vrom_bank[0], CHRROM);
7209      state->chr1_x(1 ^ chr_page, state->m_mmc_vrom_bank[8], CHRROM);
7210      state->chr1_x(2 ^ chr_page, state->m_mmc_vrom_bank[1], CHRROM);
7211      state->chr1_x(3 ^ chr_page, state->m_mmc_vrom_bank[9], CHRROM);
71917212   }
71927213   else
71937214   {
7194      chr1_x(machine, 0 ^ chr_page, state->m_mmc_vrom_bank[0] & ~0x01, CHRROM);
7195      chr1_x(machine, 1 ^ chr_page, state->m_mmc_vrom_bank[0] |  0x01, CHRROM);
7196      chr1_x(machine, 2 ^ chr_page, state->m_mmc_vrom_bank[1] & ~0x01, CHRROM);
7197      chr1_x(machine, 3 ^ chr_page, state->m_mmc_vrom_bank[1] |  0x01, CHRROM);
7215      state->chr1_x(0 ^ chr_page, state->m_mmc_vrom_bank[0] & ~0x01, CHRROM);
7216      state->chr1_x(1 ^ chr_page, state->m_mmc_vrom_bank[0] |  0x01, CHRROM);
7217      state->chr1_x(2 ^ chr_page, state->m_mmc_vrom_bank[1] & ~0x01, CHRROM);
7218      state->chr1_x(3 ^ chr_page, state->m_mmc_vrom_bank[1] |  0x01, CHRROM);
71987219   }
71997220
7200   chr1_x(machine, 4 ^ chr_page, state->m_mmc_vrom_bank[2], CHRROM);
7201   chr1_x(machine, 5 ^ chr_page, state->m_mmc_vrom_bank[3], CHRROM);
7202   chr1_x(machine, 6 ^ chr_page, state->m_mmc_vrom_bank[4], CHRROM);
7203   chr1_x(machine, 7 ^ chr_page, state->m_mmc_vrom_bank[5], CHRROM);
7221   state->chr1_x(4 ^ chr_page, state->m_mmc_vrom_bank[2], CHRROM);
7222   state->chr1_x(5 ^ chr_page, state->m_mmc_vrom_bank[3], CHRROM);
7223   state->chr1_x(6 ^ chr_page, state->m_mmc_vrom_bank[4], CHRROM);
7224   state->chr1_x(7 ^ chr_page, state->m_mmc_vrom_bank[5], CHRROM);
72047225}
72057226
72067227WRITE8_MEMBER(nes_carts_state::tengen_800032_w)
r18084r18085
72497270         break;
72507271
72517272      case 0x2000:
7252         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
7273         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
72537274         break;
72547275
72557276      case 0x4000:
r18084r18085
72937314   nes_state *state = machine.driver_data<nes_state>();
72947315   UINT8 nt_mode = state->m_mmc_latch1 & 0x80;
72957316
7296   set_nt_page(machine, 0, ROM, state->m_mmc_vrom_bank[nt_mode ? 2 : 0], 0);
7297   set_nt_page(machine, 1, ROM, state->m_mmc_vrom_bank[nt_mode ? 3 : 0], 0);
7298   set_nt_page(machine, 2, ROM, state->m_mmc_vrom_bank[nt_mode ? 4 : 1], 0);
7299   set_nt_page(machine, 3, ROM, state->m_mmc_vrom_bank[nt_mode ? 5 : 1], 0);
7317   state->set_nt_page(0, ROM, state->m_mmc_vrom_bank[nt_mode ? 2 : 0], 0);
7318   state->set_nt_page(1, ROM, state->m_mmc_vrom_bank[nt_mode ? 3 : 0], 0);
7319   state->set_nt_page(2, ROM, state->m_mmc_vrom_bank[nt_mode ? 4 : 1], 0);
7320   state->set_nt_page(3, ROM, state->m_mmc_vrom_bank[nt_mode ? 5 : 1], 0);
73007321}
73017322
73027323WRITE8_MEMBER(nes_carts_state::tengen_800037_w)
r18084r18085
73967417{
73977418   LOG_MMC(("txc_22211_w, offset: %04x, data: %02x\n", offset, data));
73987419
7399   prg32(machine(), m_txc_reg[2] >> 2);
7400   chr8(machine(), m_txc_reg[2], CHRROM);
7420   prg32(m_txc_reg[2] >> 2);
7421   chr8(m_txc_reg[2], CHRROM);
74017422}
74027423
74037424/*************************************************************
r18084r18085
74197440{
74207441   LOG_MMC(("txc_22211b_w, offset: %04x, data: %02x\n", offset, data));
74217442
7422   prg32(machine(), m_txc_reg[2] >> 2);
7423   chr8(machine(), (((data ^ m_txc_reg[2]) >> 3) & 0x02) | (((data ^ m_txc_reg[2]) >> 5) & 0x01), CHRROM);
7443   prg32(m_txc_reg[2] >> 2);
7444   chr8((((data ^ m_txc_reg[2]) >> 3) & 0x02) | (((data ^ m_txc_reg[2]) >> 5) & 0x01), CHRROM);
74247445}
74257446
74267447/*************************************************************
r18084r18085
74667487{
74677488   LOG_MMC(("txctw_l_w, offset: %04x, data: %02x\n", offset, data));
74687489
7469   prg32(machine(), (data >> 4) | data);
7490   prg32((data >> 4) | data);
74707491}
74717492
74727493WRITE8_MEMBER(nes_carts_state::txc_tw_m_w)
r18084r18085
75027523
75037524   if ((offset >= 0x400) && (offset < 0x7fff))
75047525   {
7505      prg32(machine(), data >> 4);
7506      chr8(machine(), data & 0x0f, CHRROM);
7526      prg32(data >> 4);
7527      chr8(data & 0x0f, CHRROM);
75077528   }
75087529}
75097530
r18084r18085
75327553{
75337554   LOG_MMC(("txc_mxmdhtwo_w, offset: %04x, data: %02x\n", offset, data));
75347555
7535   prg32(machine(), data);
7556   prg32(data);
75367557}
75377558
75387559/*************************************************************
r18084r18085
75557576/* MIRROR_LOW and MIRROR_HIGH are swapped! */
75567577static void waixing_set_mirror( running_machine &machine, UINT8 nt )
75577578{
7579   nes_state *state = machine.driver_data<nes_state>();
75587580   switch (nt)
75597581   {
75607582      case 0:
75617583      case 1:
7562         set_nt_mirroring(machine, nt ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
7584         state->set_nt_mirroring(nt ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
75637585         break;
75647586      case 2:
7565         set_nt_mirroring(machine, PPU_MIRROR_LOW);
7587         state->set_nt_mirroring(PPU_MIRROR_LOW);
75667588         break;
75677589      case 3:
7568         set_nt_mirroring(machine, PPU_MIRROR_HIGH);
7590         state->set_nt_mirroring(PPU_MIRROR_HIGH);
75697591         break;
75707592      default:
75717593         LOG_MMC(("Mapper set NT to invalid value %02x", nt));
r18084r18085
75767598/* Luo Ke Ren X only works with this */
75777599static void waixing_a_chr_cb( running_machine &machine, int start, int bank, int source )
75787600{
7601   nes_state *state = machine.driver_data<nes_state>();
75797602   int chr_src = (bank <= 9) ? CHRRAM : CHRROM;
7580   chr1_x(machine, start, bank, chr_src);
7603   state->chr1_x(start, bank, chr_src);
75817604}
75827605
75837606/* Ji Jia Zhan Shi only works with this */
75847607static void waixing_a1_chr_cb( running_machine &machine, int start, int bank, int source )
75857608{
7609   nes_state *state = machine.driver_data<nes_state>();
75867610   int chr_src = ((bank == 8) || (bank == 9)) ? CHRRAM : CHRROM;
7587   chr1_x(machine, start, bank, chr_src);
7611   state->chr1_x(start, bank, chr_src);
75887612}
75897613
75907614WRITE8_MEMBER(nes_carts_state::waixing_a_w)
r18084r18085
76247648
76257649static void waixing_b_chr_cb( running_machine &machine, int start, int bank, int source )
76267650{
7651   nes_state *state = machine.driver_data<nes_state>();
76277652   int chr_src = BIT(bank, 7) ? CHRRAM : CHRROM;
7628   chr1_x(machine, start, bank, chr_src);
7653   state->chr1_x(start, bank, chr_src);
76297654}
76307655
76317656/*************************************************************
r18084r18085
76467671
76477672static void waixing_c_chr_cb( running_machine &machine, int start, int bank, int source )
76487673{
7674   nes_state *state = machine.driver_data<nes_state>();
76497675   int chr_src = ((bank == 0x08) || (bank == 0x09) || (bank == 0x0a) || (bank == 0x0b)) ? CHRRAM : CHRROM;
7650   chr1_x(machine, start, bank, chr_src);
7676   state->chr1_x(start, bank, chr_src);
76517677}
76527678
76537679/*************************************************************
r18084r18085
76687694
76697695static void waixing_d_chr_cb( running_machine &machine, int start, int bank, int source )
76707696{
7697   nes_state *state = machine.driver_data<nes_state>();
76717698   int chr_src = (bank < 0x02) ? CHRRAM : CHRROM;
7672   chr1_x(machine, start, bank, chr_src);
7699   state->chr1_x(start, bank, chr_src);
76737700}
76747701
76757702/*************************************************************
r18084r18085
76917718
76927719static void waixing_e_chr_cb( running_machine &machine, int start, int bank, int source )
76937720{
7721   nes_state *state = machine.driver_data<nes_state>();
76947722   int chr_src = (bank < 0x04) ? CHRRAM : CHRROM;
7695   chr1_x(machine, start, bank, chr_src);
7723   state->chr1_x(start, bank, chr_src);
76967724}
76977725
76987726/*************************************************************
r18084r18085
77507778
77517779static void waixing_g_chr_cb( running_machine &machine, int start, int bank, int source )
77527780{
7781   nes_state *state = machine.driver_data<nes_state>();
77537782   int chr_src = (bank < 0x08) ? CHRRAM : CHRROM;
7754   chr1_x(machine, start, bank, chr_src);
7783   state->chr1_x(start, bank, chr_src);
77557784}
77567785
77577786static void waixing_g_set_chr( running_machine &machine, int chr_base, int chr_mask )
r18084r18085
78357864
78367865static void waixing_h_chr_cb( running_machine &machine, int start, int bank, int source )
78377866{
7867   nes_state *state = machine.driver_data<nes_state>();
78387868   if (source == CHRROM)
7839      chr1_x(machine, start, bank, source);
7869      state->chr1_x(start, bank, source);
78407870}
78417871
78427872WRITE8_MEMBER(nes_carts_state::waixing_h_w)
r18084r18085
78927922   switch (offset & 0x7000)
78937923   {
78947924      case 0x0000:
7895         prg8_89(machine(), data);
7925         prg8_89(data);
78967926         break;
78977927      case 0x2000:
7898         prg8_ab(machine(), data);
7928         prg8_ab(data);
78997929         break;
79007930      case 0x3000:
79017931      case 0x4000:
r18084r18085
79077937            m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0x0f) | ((data & 0x0f) << 4);
79087938         else
79097939            m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f);
7910         chr1_x(machine(), bank, m_mmc_vrom_bank[bank], CHRROM);
7940         chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
79117941         break;
79127942      case 0x7000:
79137943         switch (offset & 0x0c)
r18084r18085
79537983   switch (offset)
79547984   {
79557985      case 0x700:
7956         set_nt_mirroring(machine(), data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
7986         set_nt_mirroring(data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
79577987         break;
79587988      case 0x701:
79597989         m_mmc_latch1 = (m_mmc_latch1 & 0x0c) | ((data >> 1) & 0x03);
7960         prg32(machine(), m_mmc_latch1);
7990         prg32(m_mmc_latch1);
79617991         break;
79627992      case 0x702:
79637993         m_mmc_latch1 = (m_mmc_latch1 & 0x03) | ((data << 2) & 0x0c);
r18084r18085
79948024         case 0x20:
79958025         case 0x40:
79968026         case 0x60:
7997            prg16_89ab(machine(), mmc_helper | ((m_mmc_reg[0] >> 1) & 0x10) | (m_mmc_reg[0] & 0x0f));
7998            prg16_cdef(machine(), mmc_helper & 0x1f);
8027            prg16_89ab(mmc_helper | ((m_mmc_reg[0] >> 1) & 0x10) | (m_mmc_reg[0] & 0x0f));
8028            prg16_cdef(mmc_helper & 0x1f);
79998029            break;
80008030         case 0x50:
8001            prg32(machine(), (mmc_helper >> 1) | (m_mmc_reg[0] & 0x0f));
8031            prg32((mmc_helper >> 1) | (m_mmc_reg[0] & 0x0f));
80028032            break;
80038033         case 0x70:
8004            prg16_89ab(machine(), mmc_helper | ((m_mmc_reg[0] << 1) & 0x10) | (m_mmc_reg[0] & 0x0f));
8005            prg16_cdef(machine(), mmc_helper & 0x1f);
8034            prg16_89ab(mmc_helper | ((m_mmc_reg[0] << 1) & 0x10) | (m_mmc_reg[0] & 0x0f));
8035            prg16_cdef(mmc_helper & 0x1f);
80068036            break;
80078037      }
80088038   }
r18084r18085
80318061{
80328062   LOG_MMC(("waixing_zs_w, offset: %04x, data: %02x\n", offset, data));
80338063
8034   prg32(machine(), offset >> 3);
8064   prg32(offset >> 3);
80358065
80368066   switch (data & 0x03)
80378067   {
8038      case 0: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
8039      case 1: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
8040      case 2: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
8041      case 3: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
8068      case 0: set_nt_mirroring(PPU_MIRROR_VERT); break;
8069      case 1: set_nt_mirroring(PPU_MIRROR_HORZ); break;
8070      case 2: set_nt_mirroring(PPU_MIRROR_LOW); break;
8071      case 3: set_nt_mirroring(PPU_MIRROR_HIGH); break;
80428072   }
80438073}
80448074
r18084r18085
80618091{
80628092   LOG_MMC(("waixing_dq8_w, offset: %04x, data: %02x\n", offset, data));
80638093
8064   prg32(machine(), offset >> 3);
8094   prg32(offset >> 3);
80658095}
80668096
80678097
r18084r18085
80848114
80858115   LOG_MMC(("waixing_ps2_w, offset: %04x, data: %02x\n", offset, data));
80868116
8087   set_nt_mirroring(machine(), BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
8117   set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
80888118
80898119   switch (offset & 0x0fff)
80908120   {
80918121      case 0x000:
8092         prg8_89(machine(), (map15_helper + 0) ^ map15_flip);
8093         prg8_ab(machine(), (map15_helper + 1) ^ map15_flip);
8094         prg8_cd(machine(), (map15_helper + 2) ^ map15_flip);
8095         prg8_ef(machine(), (map15_helper + 3) ^ map15_flip);
8122         prg8_89((map15_helper + 0) ^ map15_flip);
8123         prg8_ab((map15_helper + 1) ^ map15_flip);
8124         prg8_cd((map15_helper + 2) ^ map15_flip);
8125         prg8_ef((map15_helper + 3) ^ map15_flip);
80968126         break;
80978127      case 0x001:
80988128         map15_helper |= map15_flip;
8099         prg8_89(machine(), map15_helper);
8100         prg8_ab(machine(), map15_helper + 1);
8101         prg8_cd(machine(), map15_helper + 1);
8102         prg8_ef(machine(), map15_helper + 1);
8129         prg8_89(map15_helper);
8130         prg8_ab(map15_helper + 1);
8131         prg8_cd(map15_helper + 1);
8132         prg8_ef(map15_helper + 1);
81038133         break;
81048134      case 0x002:
81058135         map15_helper |= map15_flip;
8106         prg8_89(machine(), map15_helper);
8107         prg8_ab(machine(), map15_helper);
8108         prg8_cd(machine(), map15_helper);
8109         prg8_ef(machine(), map15_helper);
8136         prg8_89(map15_helper);
8137         prg8_ab(map15_helper);
8138         prg8_cd(map15_helper);
8139         prg8_ef(map15_helper);
81108140         break;
81118141      case 0x003:
81128142         map15_helper |= map15_flip;
8113         prg8_89(machine(), map15_helper);
8114         prg8_ab(machine(), map15_helper + 1);
8115         prg8_cd(machine(), map15_helper);
8116         prg8_ef(machine(), map15_helper + 1);
8143         prg8_89(map15_helper);
8144         prg8_ab(map15_helper + 1);
8145         prg8_cd(map15_helper);
8146         prg8_ef(map15_helper + 1);
81178147         break;
81188148   }
81198149}
r18084r18085
81408170   if (state->m_mmc_reg[0])
81418171      bank = ((bank & 0x01)) | ((bank >> 3) & 0x02) | ((bank >> 1) & 0x04) | ((bank << 2) & 0x18);
81428172
8143   prg8_x(machine, start, bank);
8173   state->prg8_x(start, bank);
81448174}
81458175
81468176static void waixing_sec_chr_cb( running_machine &machine, int start, int bank, int source )
r18084r18085
81518181      bank = ((bank & 0x03)) | ((bank >> 1) & 0x04) | ((bank >> 4) & 0x08) |
81528182            ((bank >> 2) & 0x10) | ((bank << 3) & 0x20) | ((bank << 2) & 0xc0);
81538183
8154   chr1_x(machine, start, bank, source);
8184   state->chr1_x(start, bank, source);
81558185}
81568186
81578187WRITE8_MEMBER(nes_carts_state::waixing_sec_l_w)
r18084r18085
81868216{
81878217   nes_state *state = machine.driver_data<nes_state>();
81888218
8189   chr4_0(machine, state->m_mmc_reg[0], state->m_mmc_reg[0] ? CHRRAM : CHRROM);
8190   chr4_4(machine, state->m_mmc_reg[1], state->m_mmc_reg[1] ? CHRRAM : CHRROM);
8219   state->chr4_0(state->m_mmc_reg[0], state->m_mmc_reg[0] ? CHRRAM : CHRROM);
8220   state->chr4_4(state->m_mmc_reg[1], state->m_mmc_reg[1] ? CHRRAM : CHRROM);
81918221}
81928222
81938223READ8_MEMBER(nes_carts_state::waixing_sh2_chr_r)
r18084r18085
82058235
82068236   m_mmc_reg[offset >> 12] = chr_helper;
82078237   if (offset & 0x1000)
8208      chr4_4(machine(), m_mmc_reg[1], m_mmc_reg[1] ? CHRRAM : CHRROM);
8238      chr4_4(m_mmc_reg[1], m_mmc_reg[1] ? CHRRAM : CHRROM);
82098239   else
8210      chr4_0(machine(), m_mmc_reg[0], m_mmc_reg[0] ? CHRRAM : CHRROM);
8240      chr4_0(m_mmc_reg[0], m_mmc_reg[0] ? CHRRAM : CHRROM);
82118241
82128242   return val;
82138243}
r18084r18085
82298259   nes_state *state = machine.driver_data<nes_state>();
82308260
82318261   if (!(state->m_mmc_reg[0] & 0x80))
8232      prg8_x(machine, start, bank);
8262      state->prg8_x(start, bank);
82338263}
82348264
82358265static void unl_8237_chr_cb( running_machine &machine, int start, int bank, int source )
r18084r18085
82378267   nes_state *state = machine.driver_data<nes_state>();
82388268   bank |= ((state->m_mmc_reg[1] << 6) & 0x100);
82398269
8240   chr1_x(machine, start, bank, source);
8270   state->chr1_x(start, bank, source);
82418271}
82428272
82438273WRITE8_MEMBER(nes_carts_state::unl_8237_l_w)
r18084r18085
82518281      if (m_mmc_reg[0] & 0x80)
82528282      {
82538283         if (m_mmc_reg[0] & 0x20)
8254            prg32(machine(), (m_mmc_reg[0] & 0x0f) >> 1);
8284            prg32((m_mmc_reg[0] & 0x0f) >> 1);
82558285         else
82568286         {
8257            prg16_89ab(machine(), m_mmc_reg[0] & 0x1f);
8258            prg16_cdef(machine(), m_mmc_reg[0] & 0x1f);
8287            prg16_89ab(m_mmc_reg[0] & 0x1f);
8288            prg16_cdef(m_mmc_reg[0] & 0x1f);
82598289         }
82608290      }
82618291      else
r18084r18085
82788308   {
82798309      case 0x0000:
82808310      case 0x1000:
8281         set_nt_mirroring(machine(), (data | (data >> 7)) & 0x01 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
8311         set_nt_mirroring((data | (data >> 7)) & 0x01 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
82828312         break;
82838313
82848314      case 0x2000:
r18084r18085
83218351static void unl_ax5705_set_prg( running_machine &machine )
83228352{
83238353   nes_state *state = machine.driver_data<nes_state>();
8324   prg8_89(machine, state->m_mmc_prg_bank[0]);
8325   prg8_ab(machine, state->m_mmc_prg_bank[1]);
8354   state->prg8_89(state->m_mmc_prg_bank[0]);
8355   state->prg8_ab(state->m_mmc_prg_bank[1]);
83268356}
83278357
83288358WRITE8_MEMBER(nes_carts_state::unl_ax5705_w)
r18084r18085
83378367         unl_ax5705_set_prg(machine());
83388368         break;
83398369      case 0x0008:
8340         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
8370         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
83418371         break;
83428372      case 0x2000:
83438373         m_mmc_prg_bank[1] = (data & 0x05) | ((data & 0x08) >> 2) | ((data & 0x02) << 2);
r18084r18085
83508380      case 0x400a:
83518381         bank = ((offset & 0x4000) ? 4 : 0) + ((offset & 0x0002) ? 1 : 0);
83528382         m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f);
8353         chr1_x(machine(), bank, m_mmc_vrom_bank[bank], CHRROM);
8383         chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
83548384         break;
83558385      case 0x2009:
83568386      case 0x200b:
r18084r18085
83588388      case 0x400b:
83598389         bank = ((offset & 0x4000) ? 4 : 0) + ((offset & 0x0002) ? 1 : 0);
83608390         m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0x0f) | ((data & 0x04) << 3) | ((data & 0x02) << 5) | ((data & 0x09) << 4);
8361         chr1_x(machine(), bank, m_mmc_vrom_bank[bank], CHRROM);
8391         chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
83628392         break;
83638393         /* CHR banks 2, 3, 6, 7 */
83648394      case 0x4000:
r18084r18085
83678397      case 0x6002:
83688398         bank = 2 + ((offset & 0x2000) ? 4 : 0) + ((offset & 0x0002) ? 1 : 0);
83698399         m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f);
8370         chr1_x(machine(), bank, m_mmc_vrom_bank[bank], CHRROM);
8400         chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
83718401         break;
83728402      case 0x4001:
83738403      case 0x4003:
r18084r18085
83758405      case 0x6003:
83768406         bank = 2 + ((offset & 0x2000) ? 4 : 0) + ((offset & 0x0002) ? 1 : 0);
83778407         m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0x0f) | ((data & 0x04) << 3) | ((data & 0x02) << 5) | ((data & 0x09) << 4);
8378         chr1_x(machine(), bank, m_mmc_vrom_bank[bank], CHRROM);
8408         chr1_x(bank, m_mmc_vrom_bank[bank], CHRROM);
83798409         break;
83808410   }
83818411}
r18084r18085
83948424{
83958425   LOG_MMC(("unl_cc21_w offset: %04x, data: %02x\n", offset, data));
83968426
8397   set_nt_mirroring(machine(), BIT(data, 1) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
8398   chr8(machine(), (offset & 0x01), CHRROM);
8427   set_nt_mirroring(BIT(data, 1) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
8428   chr8((offset & 0x01), CHRROM);
83998429}
84008430
84018431/*************************************************************
r18084r18085
84988528      case 0x0000:
84998529         break;
85008530      case 0x2000:
8501         prg16_89ab(machine(), data);
8531         prg16_89ab(data);
85028532         break;
85038533
85048534      // the part below works like VRC-2. how was the original board wired up?
r18084r18085
85098539      case 0x100c:
85108540         switch (data & 0x03)
85118541         {
8512         case 0x00: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
8513         case 0x01: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
8514         case 0x02: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
8515         case 0x03: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
8542         case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
8543         case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
8544         case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
8545         case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
85168546         }
85178547         break;
85188548
r18084r18085
85388568         else
85398569            m_mmc_vrom_bank[bank] = (m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f);
85408570
8541         chr1_x(machine(), bank, m_mmc_vrom_bank[bank], m_mmc_chr_source);
8571         chr1_x(bank, m_mmc_vrom_bank[bank], m_mmc_chr_source);
85428572         break;
85438573      case 0x7000:
85448574         m_IRQ_count_latch &= ~0x0f;
r18084r18085
85828612   nes_state *state = machine.driver_data<nes_state>();
85838613
85848614   if (!(state->m_mmc_reg[0] & 0x80))
8585      prg8_x(machine, start, bank);
8615      state->prg8_x(start, bank);
85868616}
85878617
85888618static void kof96_chr_cb( running_machine &machine, int start, int bank, int source )
r18084r18085
85938623   if ((start & 0x04) == chr_page)
85948624      bank |= 0x100;
85958625
8596   chr1_x(machine, start, bank, source);
8626   state->chr1_x(start, bank, source);
85978627}
85988628
85998629WRITE8_MEMBER(nes_carts_state::kof96_l_w)
r18084r18085
86118641         new_bank = (m_mmc_reg[0] & 0x1f);
86128642
86138643         if (m_mmc_reg[0] & 0x20)
8614            prg32(machine(), new_bank >> 2);
8644            prg32(new_bank >> 2);
86158645         else
86168646         {
8617            prg16_89ab(machine(), new_bank);
8618            prg16_cdef(machine(), new_bank);
8647            prg16_89ab(new_bank);
8648            prg16_cdef(new_bank);
86198649         }
86208650      }
86218651      else
r18084r18085
86818711         m_mmc_reg[2] = 0;
86828712
86838713         if (data == 0x28)
8684            prg8_cd(machine(), 0x17);
8714            prg8_cd(0x17);
86858715         else if (data == 0x2a)
8686            prg8_ab(machine(), 0x0f);
8716            prg8_ab(0x0f);
86878717         break;
86888718
86898719      default:
r18084r18085
87178747      case 0x0000:
87188748         switch (offset & 0x03)
87198749         {
8720         case 0x00: chr2_0(machine(), data, CHRROM); break;
8721         case 0x01: chr2_2(machine(), data, CHRROM); break;
8722         case 0x02: chr2_4(machine(), data, CHRROM); break;
8723         case 0x03: chr2_6(machine(), data, CHRROM); break;
8750         case 0x00: chr2_0(data, CHRROM); break;
8751         case 0x01: chr2_2(data, CHRROM); break;
8752         case 0x02: chr2_4(data, CHRROM); break;
8753         case 0x03: chr2_6(data, CHRROM); break;
87248754         }
87258755         break;
87268756      case 0x1000:
87278757         switch (offset & 0x03)
87288758         {
8729         case 0x00: prg8_89(machine(), data); break;
8730         case 0x01: prg8_ab(machine(), data); break;
8759         case 0x00: prg8_89(data); break;
8760         case 0x01: prg8_ab(data); break;
87318761         case 0x02: m_IRQ_enable = 0; m_IRQ_count = 0; break;
87328762         case 0x03: m_IRQ_enable = 1; m_IRQ_count = 7; break;
87338763         }
r18084r18085
87528782
87538783static void n625092_set_prg( running_machine &machine, UINT8 reg1, UINT8 reg2 )
87548784{
8785   nes_state *state = machine.driver_data<nes_state>();
87558786   UINT8 map221_helper1, map221_helper2;
87568787
87578788   map221_helper1 = !(reg1 & 0x01) ? reg2 :
r18084r18085
87598790   map221_helper2 = !(reg1 & 0x01) ? reg2 :
87608791   (reg1 & 0x80) ? 0x07 : (reg2 & 0x06) | 0x01;
87618792
8762   prg16_89ab(machine, map221_helper1 | ((reg1 & 0x70) >> 1));
8763   prg16_cdef(machine, map221_helper2 | ((reg1 & 0x70) >> 1));
8793   state->prg16_89ab(map221_helper1 | ((reg1 & 0x70) >> 1));
8794   state->prg16_cdef(map221_helper2 | ((reg1 & 0x70) >> 1));
87648795}
87658796
87668797WRITE8_MEMBER(nes_carts_state::n625092_w)
r18084r18085
87698800
87708801   if (offset < 0x4000)
87718802   {
8772      set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
8803      set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
87738804      offset = (offset >> 1) & 0xff;
87748805
87758806      if (m_mmc_latch1 != offset)
r18084r18085
88278858   switch (offset)
88288859   {
88298860      case 0x0000:
8830         prg8_89(machine(), data);
8861         prg8_89(data);
88318862         break;
88328863      case 0x0001:
8833         prg8_ab(machine(), data);
8864         prg8_ab(data);
88348865         break;
88358866      case 0x0002:
88368867         //      m_mmc_prg_bank[offset & 0x02] = data;
8837         prg8_cd(machine(), data);
8868         prg8_cd(data);
88388869         break;
88398870      case 0x1000:
88408871      case 0x1001:
r18084r18085
88458876      case 0x1006:
88468877      case 0x1007:
88478878         //      m_mmc_vrom_bank[offset & 0x07] = data;
8848         chr1_x(machine(), offset & 0x07, data, CHRROM);
8879         chr1_x(offset & 0x07, data, CHRROM);
88498880         break;
88508881      case 0x4002:
88518882         m_IRQ_enable = 0;
r18084r18085
88578888         m_IRQ_count = data;
88588889         break;
88598890      case 0x5001:
8860         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
8891         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
88618892         break;
88628893   }
88638894}
r18084r18085
88818912
88828913   LOG_MMC(("smb2j_w, offset: %04x, data: %02x\n", offset, data));
88838914
8884   set_nt_mirroring(machine(), (offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
8915   set_nt_mirroring((offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
88858916
88868917   if (offset & 0x0800)
88878918   {
r18084r18085
88958926         else
88968927         {
88978928            LOG_MMC(("smb2j_w, selecting upper 16KB bank of #%02x\n", bank));
8898            prg16_cdef(machine(), 2 * bank + 1);
8929            prg16_cdef(2 * bank + 1);
88998930         }
89008931      }
89018932      else
r18084r18085
89088939         else
89098940         {
89108941            LOG_MMC(("smb2j_w, selecting lower 16KB bank of #%02x\n", bank));
8911            prg16_89ab(machine(), 2 * bank);
8942            prg16_89ab(2 * bank);
89128943         }
89138944      }
89148945   }
r18084r18085
89248955      else
89258956      {
89268957         LOG_MMC(("smb2j_w, selecting 32KB bank #%02x\n", bank));
8927         prg32(machine(), bank);
8958         prg32(bank);
89288959      }
89298960   }
89308961}
r18084r18085
89729003   {
89739004      case 0x020:
89749005         prg = (data & 0x08) | ((data & 0x06) >> 1) | ((data & 0x01) << 2);
8975         prg8_cd(machine(), prg);
9006         prg8_cd(prg);
89769007         break;
89779008      case 0x120:
89789009         m_IRQ_enable = data & 0x01;
r18084r18085
89879018   LOG_MMC(("smb2jb_extra_w, offset: %04x, data: %02x\n", offset, data));
89889019
89899020   prg = (data & 0x08) | ((data & 0x06) >> 1) | ((data & 0x01) << 2);
8990   prg8_cd(machine(), prg);
9021   prg8_cd(prg);
89919022}
89929023
89939024/*************************************************************
r18084r18085
90059036static void unl_sf3_set_chr( running_machine &machine, UINT8 chr_source, int chr_base, int chr_mask )
90069037{
90079038   nes_state *state = machine.driver_data<nes_state>();
9008   chr4_0(machine, chr_base | ((state->m_mmc_vrom_bank[0] >> 1) & chr_mask), chr_source);
9009   chr2_4(machine, chr_base | (state->m_mmc_vrom_bank[1] & chr_mask), chr_source);
9010   chr2_6(machine, chr_base | (state->m_mmc_vrom_bank[2] & chr_mask), chr_source);
9039   state->chr4_0(chr_base | ((state->m_mmc_vrom_bank[0] >> 1) & chr_mask), chr_source);
9040   state->chr2_4(chr_base | (state->m_mmc_vrom_bank[1] & chr_mask), chr_source);
9041   state->chr2_6(chr_base | (state->m_mmc_vrom_bank[2] & chr_mask), chr_source);
90119042}
90129043
90139044WRITE8_MEMBER(nes_carts_state::unl_sf3_w)
r18084r18085
90749105   switch (offset)
90759106   {
90769107      case 0x1ef1:   /* 0x5ff1 */
9077         prg32(machine(), data >> 1);
9108         prg32(data >> 1);
90789109         break;
90799110      case 0x1ef2:   /* 0x5ff2 */
9080         chr8(machine(), data, CHRROM);
9111         chr8(data, CHRROM);
90819112         break;
90829113   }
90839114}
r18084r18085
90949125static void racmate_update_banks( running_machine &machine )
90959126{
90969127   nes_state *state = machine.driver_data<nes_state>();
9097   chr4_4(machine, state->m_mmc_latch1 & 0x0f, state->m_mmc_chr_source);
9098   prg16_89ab(machine, state->m_mmc_latch1 >> 1);
9128   state->chr4_4(state->m_mmc_latch1 & 0x0f, state->m_mmc_chr_source);
9129   state->prg16_89ab(state->m_mmc_latch1 >> 1);
90999130}
91009131
91019132WRITE8_MEMBER(nes_carts_state::unl_racmate_w)
r18084r18085
91329163   {
91339164      m_mmc_reg[(offset >> 8) & 3] = data;
91349165      bank = ((m_mmc_reg[2] & 0x0f) << 4) | BIT(m_mmc_reg[1], 1) | (m_mmc_reg[0] & 0x0e);
9135      prg32(machine(), bank);
9136      chr8(machine(), 0, CHRRAM);
9166      prg32(bank);
9167      chr8(0, CHRRAM);
91379168   }
91389169}
91399170
r18084r18085
91889219      switch (offset & 0x03)
91899220      {
91909221         case 0x00:
9191            prg8_67(machine(), data);
9222            prg8_67(data);
91929223            break;
91939224         case 0x01:
9194            set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9225            set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
91959226            break;
91969227         case 0x02:
91979228            /* Check if IRQ is being enabled */
r18084r18085
92539284         m_IRQ_enable = 1;
92549285         break;
92559286      case 0x6000:
9256         prg8_cd(machine(), data);
9287         prg8_cd(data);
92579288         break;
92589289   }
92599290}
r18084r18085
92739304WRITE8_MEMBER(nes_carts_state::whirl2706_w)
92749305{
92759306   LOG_MMC(("whirl2706_w, offset: %04x, data: %02x\n", offset, data));
9276   prg8_67(machine(), data);
9307   prg8_67(data);
92779308}
92789309
92799310/*************************************************************
r18084r18085
92949325   offset += 0x100;
92959326
92969327   if ((offset & 0x43c0) == 0x41c0)
9297      prg8_67(machine(), data & 0x07);
9328      prg8_67(data & 0x07);
92989329}
92999330
93009331/*************************************************************
r18084r18085
93329363   {
93339364      case 0x00:
93349365      case 0x02:
9335         chr1_x(machine(), offset & 0x07, data & 0xfe, CHRROM);
9366         chr1_x(offset & 0x07, data & 0xfe, CHRROM);
93369367         break;
93379368      case 0x01:
93389369      case 0x03:
9339         chr1_x(machine(), offset & 0x07, data | 0x01, CHRROM);
9370         chr1_x(offset & 0x07, data | 0x01, CHRROM);
93409371         break;
93419372      case 0x04: case 0x05:
93429373      case 0x06: case 0x07:
9343         chr1_x(machine(), offset & 0x07, data, CHRROM);
9374         chr1_x(offset & 0x07, data, CHRROM);
93449375         break;
93459376      case 0x08:
9346         prg8_89(machine(), data | 0x10);
9377         prg8_89(data | 0x10);
93479378         break;
93489379      case 0x09:
9349         prg8_ab(machine(), data);
9380         prg8_ab(data);
93509381         break;
93519382      case 0x0a:
9352         prg8_cd(machine(), data);
9383         prg8_cd(data);
93539384         break;
93549385      case 0x0b:
9355         prg8_ef(machine(), data | 0x10);
9386         prg8_ef(data | 0x10);
93569387         break;
93579388      case 0x0c:
9358         set_nt_mirroring(machine(), BIT(data, 0) ?  PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9389         set_nt_mirroring(BIT(data, 0) ?  PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
93599390         break;
93609391      case 0x0d:
93619392         m_IRQ_count = 0;
r18084r18085
94079438   switch (offset & 0x7003)
94089439   {
94099440      case 0x0000:
9410         prg8_89(machine(), data);
9441         prg8_89(data);
94119442         break;
94129443      case 0x1000:
9413         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9444         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
94149445         break;
94159446      case 0x2000:
9416         prg8_ab(machine(), data);
9447         prg8_ab(data);
94179448         break;
94189449      case 0x3000:
94199450      case 0x3002:
r18084r18085
94249455      case 0x6000:
94259456      case 0x6002:
94269457         bank = ((offset & 0x7000) - 0x3000) / 0x0800 + ((offset & 0x0002) >> 3);
9427         chr1_x(machine(), bank, data, CHRROM);
9458         chr1_x(bank, data, CHRROM);
94289459         break;
94299460      case 0x7000:
94309461         m_IRQ_count = data;
r18084r18085
95029533      if (state->m_mmc_reg[0] & 0x03)
95039534         bank = (bank & (0x3f >> (state->m_mmc_reg[0] & 0x03))) | (state->m_mmc_reg[1] << 1);
95049535
9505      prg8_x(machine, start, bank);
9536      state->prg8_x(start, bank);
95069537   }
95079538}
95089539
r18084r18085
95119542   nes_state *state = machine.driver_data<nes_state>();
95129543
95139544   if (!(state->m_mmc_reg[0] & 0x40) && (!(state->m_mmc_reg[3] & 0x02) || (start != 1 && start != 3)))
9514      chr1_x(machine, start, ((state->m_mmc_reg[2] & 0x7f) << 3) | bank, source);
9545      state->chr1_x(start, ((state->m_mmc_reg[2] & 0x7f) << 3) | bank, source);
95159546}
95169547
95179548#endif
r18084r18085
95269557      if (!(state->m_mmc_reg[0] & 0x03))
95279558         bank = (bank & mask) | ((state->m_mmc_reg[1]  & (0x7f ^ mask)) << 1);
95289559
9529      prg8_x(machine, start, bank);
9560      state->prg8_x(start, bank);
95309561   }
95319562}
95329563
r18084r18085
95359566   nes_state *state = machine.driver_data<nes_state>();
95369567
95379568   if (!(state->m_mmc_reg[0] & 0x40) && (!(state->m_mmc_reg[3] & 0x02) || (start != 1 && start != 3)))
9538      chr1_x(machine, start, ((state->m_mmc_reg[2] & 0x7f) << 3) | bank, source);
9569      state->chr1_x(start, ((state->m_mmc_reg[2] & 0x7f) << 3) | bank, source);
95399570}
95409571
95419572static void fk23c_set_prg( running_machine &machine )
r18084r18085
95439574   nes_state *state = machine.driver_data<nes_state>();
95449575
95459576   if ((state->m_mmc_reg[0] & 0x07) == 4)
9546      prg32(machine, (state->m_mmc_reg[1] & 0x7f) >> 1);
9577      state->prg32((state->m_mmc_reg[1] & 0x7f) >> 1);
95479578   else if ((state->m_mmc_reg[0] & 0x07) == 3)
95489579   {
9549      prg16_89ab(machine, state->m_mmc_reg[1] & 0x7f);
9550      prg16_cdef(machine, state->m_mmc_reg[1] & 0x7f);
9580      state->prg16_89ab(state->m_mmc_reg[1] & 0x7f);
9581      state->prg16_cdef(state->m_mmc_reg[1] & 0x7f);
95519582   }
95529583   else
95539584   {
95549585      if (state->m_mmc_reg[3] & 0x02)
95559586      {
9556         prg8_cd(machine, state->m_mmc_reg[4]);
9557         prg8_ef(machine, state->m_mmc_reg[5]);
9587         state->prg8_cd(state->m_mmc_reg[4]);
9588         state->prg8_ef(state->m_mmc_reg[5]);
95589589      }
95599590      else
95609591         mmc3_set_prg(machine, state->m_mmc_prg_base, state->m_mmc_prg_mask);
r18084r18085
95669597   nes_state *state = machine.driver_data<nes_state>();
95679598
95689599   if (state->m_mmc_reg[0] & 0x40)
9569      chr8(machine, state->m_mmc_reg[2] | state->m_mmc_cmd1, state->m_mmc_chr_source);
9600      state->chr8(state->m_mmc_reg[2] | state->m_mmc_cmd1, state->m_mmc_chr_source);
95709601   else
95719602   {
95729603      if (state->m_mmc_reg[3] & 0x02)
95739604      {
95749605         int base = (state->m_mmc_reg[2] & 0x7f) << 3;
9575         chr1_x(machine, 1, base | state->m_mmc_reg[6], state->m_mmc_chr_source);
9576         chr1_x(machine, 3, base | state->m_mmc_reg[7], state->m_mmc_chr_source);
9606         state->chr1_x(1, base | state->m_mmc_reg[6], state->m_mmc_chr_source);
9607         state->chr1_x(3, base | state->m_mmc_reg[7], state->m_mmc_chr_source);
95779608      }
95789609      else
95799610         mmc3_set_chr(machine, state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask);
r18084r18085
96279658            break;
96289659
96299660         case 0x2000:
9630            set_nt_mirroring(machine(), data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9661            set_nt_mirroring(data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
96319662            break;
96329663
96339664         default:
r18084r18085
96579688   if (state->m_mmc_reg[0] & 0x80)
96589689   {
96599690      if (state->m_mmc_reg[1] & 0x80)
9660         prg32(machine, helper1);
9691         state->prg32(helper1);
96619692      else
96629693      {
9663         prg16_89ab(machine, helper2);
9664         prg16_cdef(machine, helper2);
9694         state->prg16_89ab(helper2);
9695         state->prg16_cdef(helper2);
96659696      }
96669697   }
96679698   else
9668      prg16_cdef(machine, helper2);
9699      state->prg16_cdef(helper2);
96699700}
96709701
96719702WRITE8_MEMBER(nes_carts_state::bmc_64in1nr_l_w)
r18084r18085
96819712      case 0x1003:
96829713         m_mmc_reg[offset & 0x03] = data;
96839714         bmc_64in1nr_set_prg(machine());
9684         chr8(machine(), ((m_mmc_reg[0] >> 1) & 0x03) | (m_mmc_reg[2] << 2), CHRROM);
9715         chr8(((m_mmc_reg[0] >> 1) & 0x03) | (m_mmc_reg[2] << 2), CHRROM);
96859716         break;
96869717   }
96879718   if (offset == 0x1000)   /* reg[0] also sets mirroring */
9688      set_nt_mirroring(machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9719      set_nt_mirroring(BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
96899720}
96909721
96919722WRITE8_MEMBER(nes_carts_state::bmc_64in1nr_w)
r18084r18085
97099740{
97109741   LOG_MMC(("bmc_190in1_w offset: %04x, data: %02x\n", offset, data));
97119742
9712   set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9743   set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
97139744   offset >>= 2;
9714   prg16_89ab(machine(), offset);
9715   prg16_cdef(machine(), offset);
9716   chr8(machine(), offset, CHRROM);
9745   prg16_89ab(offset);
9746   prg16_cdef(offset);
9747   chr8(offset, CHRROM);
97179748}
97189749
97199750/*************************************************************
r18084r18085
97329763   LOG_MMC(("bmc_a65as_w offset: %04x, data: %02x\n", offset, data));
97339764
97349765   if (data & 0x80)
9735      set_nt_mirroring(machine(), BIT(data, 5) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
9766      set_nt_mirroring(BIT(data, 5) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
97369767   else
9737      set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9768      set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
97389769
97399770   if (data & 0x40)
9740      prg32(machine(), data >> 1);
9771      prg32(data >> 1);
97419772   else
97429773   {
9743      prg16_89ab(machine(), helper | (data & 0x07));
9744      prg16_cdef(machine(), helper | 0x07);
9774      prg16_89ab(helper | (data & 0x07));
9775      prg16_cdef(helper | 0x07);
97459776   }
97469777}
97479778
r18084r18085
97609791{
97619792   LOG_MMC(("bmc_gs2004_w offset: %04x, data: %02x\n", offset, data));
97629793
9763   prg32(machine(), data);
9794   prg32(data);
97649795}
97659796
97669797/*************************************************************
r18084r18085
97799810   LOG_MMC(("bmc_gs2013_w offset: %04x, data: %02x\n", offset, data));
97809811
97819812   if (data & 0x08)
9782      prg32(machine(), data & 0x09);
9813      prg32(data & 0x09);
97839814   else
9784      prg32(machine(), data & 0x07);
9815      prg32(data & 0x07);
97859816}
97869817
97879818/*************************************************************
r18084r18085
98029833   int prg_mask = masks[state->m_mmc_reg[0] & 0x07];
98039834
98049835   bank = prg_base | (bank & prg_mask);
9805   prg8_x(machine, start, bank);
9836   state->prg8_x(start, bank);
98069837}
98079838
98089839static void bmc_s24in1sc03_chr_cb( running_machine &machine, int start, int bank, int source )
r18084r18085
98119842   UINT8 chr = BIT(state->m_mmc_reg[0], 5) ? CHRRAM : CHRROM;
98129843   int chr_base = (state->m_mmc_reg[2] << 3) & 0xf00;
98139844
9814   chr1_x(machine, start, chr_base | bank, chr);
9845   state->chr1_x(start, chr_base | bank, chr);
98159846}
98169847
98179848WRITE8_MEMBER(nes_carts_state::bmc_s24in1sc03_l_w)
r18084r18085
98579888   if (m_mmc_latch2 || offset == 0)
98589889   {
98599890      m_mmc_latch1 = (m_mmc_latch1 & 0x38) | (data & 0x07);
9860      prg16_89ab(machine(), m_mmc_latch1);
9891      prg16_89ab(m_mmc_latch1);
98619892   }
98629893   else
98639894   {
98649895      m_mmc_latch2 = 1;
9865      set_nt_mirroring(machine(), BIT(data, 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9896      set_nt_mirroring(BIT(data, 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
98669897      mmc_helper = ((offset >> 3) & 0x20) | ((offset >> 2) & 0x18);
98679898      m_mmc_latch1 = mmc_helper | (m_mmc_latch1 & 0x07);
9868      prg16_89ab(machine(), m_mmc_latch1);
9869      prg16_cdef(machine(), mmc_helper | 0x07);
9899      prg16_89ab(m_mmc_latch1);
9900      prg16_cdef(mmc_helper | 0x07);
98709901   }
98719902}
98729903
r18084r18085
98949925            if (!m_mmc_latch1)
98959926            {
98969927               m_mmc_latch1 = data & 0x20;
9897               set_nt_mirroring(machine(), BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
9928               set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
98989929               mmc_helper = (~data & 0x08) >> 3;
9899               prg16_89ab(machine(), data & ~mmc_helper);
9900               prg16_cdef(machine(), data |  mmc_helper);
9930               prg16_89ab(data & ~mmc_helper);
9931               prg16_cdef(data |  mmc_helper);
99019932            }
99029933            break;
99039934         case 1:
99049935            if (!m_mmc_latch1)
99059936            {
9906               chr8(machine(), data, CHRROM);
9937               chr8(data, CHRROM);
99079938            }
99089939            break;
99099940      }
r18084r18085
99319962{
99329963   LOG_MMC(("novel1_w, offset: %04x, data: %02x\n", offset, data));
99339964
9934   prg32(machine(), offset & 0x03);
9935   chr8(machine(), offset & 0x07, CHRROM);
9965   prg32(offset & 0x03);
9966   chr8(offset & 0x07, CHRROM);
99369967}
99379968
99389969WRITE8_MEMBER(nes_carts_state::novel2_w)
99399970{
99409971   LOG_MMC(("novel2_w, offset: %04x, data: %02x\n", offset, data));
99419972
9942   prg32(machine(), offset >> 1);
9943   chr8(machine(), offset >> 3, CHRROM);
9973   prg32(offset >> 1);
9974   chr8(offset >> 3, CHRROM);
99449975}
99459976
99469977/*************************************************************
r18084r18085
99669997      m_mmc_latch1 = data;
99679998
99689999   if (m_mmc_latch2 & 0x80)
9969      prg32(machine(), 2 | (m_mmc_latch2 >> 6));
10000      prg32(2 | (m_mmc_latch2 >> 6));
997010001   else
997110002   {
9972      prg16_89ab(machine(), (m_mmc_latch2 >> 5) & 0x03);
9973      prg16_cdef(machine(), (m_mmc_latch2 >> 5) & 0x03);
10003      prg16_89ab((m_mmc_latch2 >> 5) & 0x03);
10004      prg16_cdef((m_mmc_latch2 >> 5) & 0x03);
997410005   }
997510006
9976   set_nt_mirroring(machine(), (m_mmc_latch2 & 0x08) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10007   set_nt_mirroring((m_mmc_latch2 & 0x08) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
997710008
9978   chr8(machine(), (m_mmc_latch1 & 0x03) | (m_mmc_latch2 & 0x07) | ((m_mmc_latch2 & 0x10) >> 1), CHRROM);
10009   chr8((m_mmc_latch1 & 0x03) | (m_mmc_latch2 & 0x07) | ((m_mmc_latch2 & 0x10) >> 1), CHRROM);
997910010}
998010011
998110012
r18084r18085
999510026WRITE8_MEMBER(nes_carts_state::sng32_w)
999610027{
999710028   LOG_MMC(("sng32_w, offset: %04x, data: %02x\n", offset, data));
9998   prg32(machine(), data);
10029   prg32(data);
999910030}
1000010031
1000110032/*************************************************************
r18084r18085
1001610047   UINT8 bank = (offset & 0x40) ? 0 : 1;
1001710048   LOG_MMC(("bmc_gkb_w, offset: %04x, data: %02x\n", offset, data));
1001810049
10019   prg16_89ab(machine(), offset & ~bank);
10020   prg16_cdef(machine(), offset | bank);
10021   chr8(machine(), offset >> 3, m_mmc_chr_source);
10022   set_nt_mirroring(machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10050   prg16_89ab(offset & ~bank);
10051   prg16_cdef(offset | bank);
10052   chr8(offset >> 3, m_mmc_chr_source);
10053   set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1002310054}
1002410055
1002510056/*************************************************************
r18084r18085
1003910070{
1004010071   LOG_MMC(("bmc_super700in1_w, offset :%04x, data: %02x\n", offset, data));
1004110072
10042   chr8(machine(), ((offset & 0x1f) << 2) | (data & 0x03), CHRROM);
10073   chr8(((offset & 0x1f) << 2) | (data & 0x03), CHRROM);
1004310074
1004410075   if (offset & 0x20)
1004510076   {
10046      prg16_89ab(machine(), (offset & 0x40) | ((offset >> 8) & 0x3f));
10047      prg16_cdef(machine(), (offset & 0x40) | ((offset >> 8) & 0x3f));
10077      prg16_89ab((offset & 0x40) | ((offset >> 8) & 0x3f));
10078      prg16_cdef((offset & 0x40) | ((offset >> 8) & 0x3f));
1004810079   }
1004910080   else
1005010081   {
10051      prg32(machine(), ((offset & 0x40) | ((offset >> 8) & 0x3f)) >> 1);
10082      prg32(((offset & 0x40) | ((offset >> 8) & 0x3f)) >> 1);
1005210083   }
1005310084
10054   set_nt_mirroring(machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10085   set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1005510086}
1005610087
1005710088/*************************************************************
r18084r18085
1007110102{
1007210103   LOG_MMC(("bmc_36in1_w, offset: %04x, data: %02x\n", offset, data));
1007310104
10074   prg16_89ab(machine(), offset & 0x07);
10075   prg16_cdef(machine(), offset & 0x07);
10076   chr8(machine(), offset & 0x07, CHRROM);
10105   prg16_89ab(offset & 0x07);
10106   prg16_cdef(offset & 0x07);
10107   chr8(offset & 0x07, CHRROM);
1007710108
10078   set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10109   set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1007910110}
1008010111
1008110112/*************************************************************
r18084r18085
1009510126{
1009610127   LOG_MMC(("bmc_21in1_w, offset: %04x, data: %02x\n", offset, data));
1009710128
10098   prg32(machine(), offset & 0x03);
10099   chr8(machine(), offset & 0x03, CHRROM);
10129   prg32(offset & 0x03);
10130   chr8(offset & 0x03, CHRROM);
1010010131}
1010110132
1010210133/*************************************************************
r18084r18085
1011810149
1011910150   LOG_MMC(("bmc_150in1_w, offset: %04x, data: %02x\n", offset, data));
1012010151
10121   prg16_89ab(machine(), bank);
10122   prg16_cdef(machine(), bank + (((bank & 0x06) == 0x06) ? 1 : 0));
10123   chr8(machine(), bank, CHRROM);
10152   prg16_89ab(bank);
10153   prg16_cdef(bank + (((bank & 0x06) == 0x06) ? 1 : 0));
10154   chr8(bank, CHRROM);
1012410155
10125   set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ: PPU_MIRROR_VERT);
10156   set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ: PPU_MIRROR_VERT);
1012610157}
1012710158
1012810159/*************************************************************
r18084r18085
1014210173{
1014310174   LOG_MMC(("bmc_35in1_w, offset: %04x, data: %02x\n", offset, data));
1014410175
10145   prg16_89ab(machine(), (data >> 2) & 0x03);
10146   prg16_cdef(machine(), (data >> 2) & 0x03);
10147   chr8(machine(), data & 0x03, CHRROM);
10176   prg16_89ab((data >> 2) & 0x03);
10177   prg16_cdef((data >> 2) & 0x03);
10178   chr8(data & 0x03, CHRROM);
1014810179}
1014910180
1015010181/*************************************************************
r18084r18085
1016610197
1016710198   LOG_MMC(("bmc_64in1_w, offset: %04x, data: %02x\n", offset, data));
1016810199
10169   prg16_89ab(machine(), offset & ~bank);
10170   prg16_cdef(machine(), offset | bank);
10171   chr8(machine(), offset & ~bank, CHRROM);
10200   prg16_89ab(offset & ~bank);
10201   prg16_cdef(offset | bank);
10202   chr8(offset & ~bank, CHRROM);
1017210203
10173   set_nt_mirroring(machine(), BIT(data, 4) ? PPU_MIRROR_HORZ: PPU_MIRROR_VERT);
10204   set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HORZ: PPU_MIRROR_VERT);
1017410205}
1017510206
1017610207/*************************************************************
r18084r18085
1021810249{
1021910250   LOG_MMC(("bmc_hik300_w, offset: %04x, data: %02x\n", offset, data));
1022010251
10221   set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10222   chr8(machine(), offset, CHRROM);
10252   set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10253   chr8(offset, CHRROM);
1022310254
1022410255   if (offset < 0x4000)
1022510256   {
10226      prg16_89ab(machine(), offset);
10227      prg16_cdef(machine(), offset);
10257      prg16_89ab(offset);
10258      prg16_cdef(offset);
1022810259   }
1022910260   else
10230      prg32(machine(), offset >> 1);
10261      prg32(offset >> 1);
1023110262}
1023210263
1023310264/*************************************************************
r18084r18085
1024710278{
1024810279   LOG_MMC(("supergun20in1_w, offset: %04x, data: %02x\n", offset, data));
1024910280
10250   prg16_89ab(machine(), offset >> 2);
10251   prg16_cdef(machine(), offset >> 2);
10252   chr8(machine(), offset, CHRROM);
10281   prg16_89ab(offset >> 2);
10282   prg16_cdef(offset >> 2);
10283   chr8(offset, CHRROM);
1025310284}
1025410285
1025510286/*************************************************************
r18084r18085
1027310304
1027410305   LOG_MMC(("bmc_72in1_w, offset: %04x, data: %02x\n", offset, data));
1027510306
10276   chr8(machine(), offset, CHRROM);
10277   set_nt_mirroring(machine(), (offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10307   chr8(offset, CHRROM);
10308   set_nt_mirroring((offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1027810309
1027910310   hi_bank = offset & 0x40;
1028010311   size_16 = offset & 0x1000;
r18084r18085
1028510316      if (hi_bank)
1028610317         bank ++;
1028710318
10288      prg16_89ab(machine(), bank);
10289      prg16_cdef(machine(), bank);
10319      prg16_89ab(bank);
10320      prg16_cdef(bank);
1029010321   }
1029110322   else
10292      prg32(machine(), bank);
10323      prg32(bank);
1029310324}
1029410325
1029510326/*************************************************************
r18084r18085
1031910350   else
1032010351      m_mmc_latch1 = data;
1032110352
10322   set_nt_mirroring(machine(), BIT(m_mmc_latch1, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10353   set_nt_mirroring(BIT(m_mmc_latch1, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1032310354
1032410355   hi_bank = m_mmc_latch1 & 0x01;
1032510356   size_16 = m_mmc_latch1 & 0x20;
r18084r18085
1033110362      if (hi_bank)
1033210363         bank ++;
1033310364
10334      prg16_89ab(machine(), bank);
10335      prg16_cdef(machine(), bank);
10365      prg16_89ab(bank);
10366      prg16_cdef(bank);
1033610367   }
1033710368   else
10338      prg32(machine(), bank);
10369      prg32(bank);
1033910370}
1034010371
1034110372/*************************************************************
r18084r18085
1036810399      if (hi_bank)
1036910400         bank ++;
1037010401
10371      prg16_89ab(machine(), bank);
10372      prg16_cdef(machine(), bank);
10402      prg16_89ab(bank);
10403      prg16_cdef(bank);
1037310404   }
1037410405   else
10375      prg32(machine(), bank);
10406      prg32(bank);
1037610407
1037710408   if (!(offset & 0x80))
1037810409   {
1037910410      if (offset & 0x200)
10380         prg16_cdef(machine(), ((bank << 1) & 0x38) + 7);
10411         prg16_cdef(((bank << 1) & 0x38) + 7);
1038110412      else
10382         prg16_cdef(machine(), ((bank << 1) & 0x38));
10413         prg16_cdef(((bank << 1) & 0x38));
1038310414   }
1038410415
10385   set_nt_mirroring(machine(), BIT(data, 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10416   set_nt_mirroring(BIT(data, 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1038610417}
1038710418
1038810419/*************************************************************
r18084r18085
1040210433{
1040310434   LOG_MMC(("bmc_31in1_w, offset: %04x, data: %02x\n", offset, data));
1040410435
10405   set_nt_mirroring(machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10406   chr8(machine(), offset, CHRROM);
10436   set_nt_mirroring(BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10437   chr8(offset, CHRROM);
1040710438
1040810439   if ((offset & 0x1e) == 0)
1040910440   {
10410      prg16_89ab(machine(), 0);
10411      prg16_89ab(machine(), 1);
10441      prg16_89ab(0);
10442      prg16_89ab(1);
1041210443   }
1041310444   else
1041410445   {
10415      prg16_89ab(machine(), offset & 0x1f);
10416      prg16_89ab(machine(), offset & 0x1f);
10446      prg16_89ab(offset & 0x1f);
10447      prg16_89ab(offset & 0x1f);
1041710448   }
1041810449}
1041910450
r18084r18085
1043710468
1043810469   if (1)   // this should flip at reset
1043910470   {
10440      prg16_89ab(machine(), data & 0x07);
10471      prg16_89ab(data & 0x07);
1044110472   }
1044210473   else
1044310474   {
1044410475      if (data & 0x20)
1044510476      {
10446         prg16_89ab(machine(), (data & 0x1f) + 8);
10447         prg16_cdef(machine(), (data & 0x1f) + 8);
10477         prg16_89ab((data & 0x1f) + 8);
10478         prg16_cdef((data & 0x1f) + 8);
1044810479      }
1044910480      else
1045010481      {
10451         prg16_89ab(machine(), (data & 0x1f) + 8);
10452         prg16_cdef(machine(), (data & 0x1f) + 9);
10482         prg16_89ab((data & 0x1f) + 8);
10483         prg16_cdef((data & 0x1f) + 9);
1045310484      }
10454      set_nt_mirroring(machine(), BIT(data, 6) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
10485      set_nt_mirroring(BIT(data, 6) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
1045510486   }
1045610487}
1045710488
r18084r18085
1047210503{
1047310504   LOG_MMC(("bmc_20in1_w, offset: %04x, data: %02x\n", offset, data));
1047410505
10475   set_nt_mirroring(machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10506   set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1047610507
10477   prg16_89ab(machine(), (offset & 0x1e));
10478   prg16_cdef(machine(), (offset & 0x1e) | ((offset & 0x20) ? 1 : 0));
10508   prg16_89ab((offset & 0x1e));
10509   prg16_cdef((offset & 0x1e) | ((offset & 0x20) ? 1 : 0));
1047910510}
1048010511
1048110512/*************************************************************
r18084r18085
1049810529
1049910530   LOG_MMC(("bmc_110in1_w, offset: %04x, data: %02x\n", offset, data));
1050010531
10501   set_nt_mirroring(machine(), (offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10502   prg16_89ab(machine(), map255_helper1 & ~map255_helper2);
10503   prg16_cdef(machine(), map255_helper1 | map255_helper2);
10504   chr8(machine(), ((offset >> 8) & 0x40) | (offset & 0x3f), CHRROM);
10532   set_nt_mirroring((offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10533   prg16_89ab(map255_helper1 & ~map255_helper2);
10534   prg16_cdef(map255_helper1 | map255_helper2);
10535   chr8(((offset >> 8) & 0x40) | (offset & 0x3f), CHRROM);
1050510536}
1050610537
1050710538/*************************************************************
r18084r18085
1061910650         mmc3_set_prg(machine(), m_mmc_prg_base, m_mmc_prg_mask);
1062010651      }
1062110652      else
10622         prg32(machine(), (data & 0x30) >> 4);
10653         prg32((data & 0x30) >> 4);
1062310654
1062410655      m_mmc_chr_base = (data & 0xc0) << 1;
1062510656      m_mmc_chr_mask = 0x7f;
r18084r18085
1064310674static void bmc_ball11_set_banks( running_machine &machine )
1064410675{
1064510676   nes_state *state = machine.driver_data<nes_state>();
10646   set_nt_mirroring(machine, (state->m_mmc_reg[0] == 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10677   state->set_nt_mirroring((state->m_mmc_reg[0] == 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1064710678
1064810679   if (state->m_mmc_reg[0] & 0x01)
1064910680   {
10650      prg32(machine, state->m_mmc_reg[1]);
10681      state->prg32(state->m_mmc_reg[1]);
1065110682   }
1065210683   else
1065310684   {
10654      prg16_89ab(machine, (state->m_mmc_reg[1] << 1) | (state->m_mmc_reg[0] >> 1));
10655      prg16_cdef(machine, (state->m_mmc_reg[1] << 1) | 0x07);
10685      state->prg16_89ab((state->m_mmc_reg[1] << 1) | (state->m_mmc_reg[0] >> 1));
10686      state->prg16_cdef((state->m_mmc_reg[1] << 1) | 0x07);
1065610687   }
1065710688}
1065810689
r18084r18085
1079910830
1080010831   chr_base |= ((state->m_mmc_reg[1] & 0x03) << 8);
1080110832
10802   chr1_x(machine, chr_page ^ 0, chr_base | ((state->m_mmc_vrom_bank[0] & ~0x01) & chr_mask), chr);
10803   chr1_x(machine, chr_page ^ 1, chr_base | ((state->m_mmc_vrom_bank[0] |  0x01) & chr_mask), chr);
10804   chr1_x(machine, chr_page ^ 2, chr_base | ((state->m_mmc_vrom_bank[1] & ~0x01) & chr_mask), chr);
10805   chr1_x(machine, chr_page ^ 3, chr_base | ((state->m_mmc_vrom_bank[1] |  0x01) & chr_mask), chr);
10806   chr1_x(machine, chr_page ^ 4, chr_base | (state->m_mmc_vrom_bank[2] & chr_mask), chr);
10807   chr1_x(machine, chr_page ^ 5, chr_base | (state->m_mmc_vrom_bank[3] & chr_mask), chr);
10808   chr1_x(machine, chr_page ^ 6, chr_base | (state->m_mmc_vrom_bank[4] & chr_mask), chr);
10809   chr1_x(machine, chr_page ^ 7, chr_base | (state->m_mmc_vrom_bank[5] & chr_mask), chr);
10833   state->chr1_x(chr_page ^ 0, chr_base | ((state->m_mmc_vrom_bank[0] & ~0x01) & chr_mask), chr);
10834   state->chr1_x(chr_page ^ 1, chr_base | ((state->m_mmc_vrom_bank[0] |  0x01) & chr_mask), chr);
10835   state->chr1_x(chr_page ^ 2, chr_base | ((state->m_mmc_vrom_bank[1] & ~0x01) & chr_mask), chr);
10836   state->chr1_x(chr_page ^ 3, chr_base | ((state->m_mmc_vrom_bank[1] |  0x01) & chr_mask), chr);
10837   state->chr1_x(chr_page ^ 4, chr_base | (state->m_mmc_vrom_bank[2] & chr_mask), chr);
10838   state->chr1_x(chr_page ^ 5, chr_base | (state->m_mmc_vrom_bank[3] & chr_mask), chr);
10839   state->chr1_x(chr_page ^ 6, chr_base | (state->m_mmc_vrom_bank[4] & chr_mask), chr);
10840   state->chr1_x(chr_page ^ 7, chr_base | (state->m_mmc_vrom_bank[5] & chr_mask), chr);
1081010841}
1081110842
1081210843WRITE8_MEMBER(nes_carts_state::bmc_gc6in1_l_w)
r18084r18085
1082110852      if (data & 0x80)
1082210853      {
1082310854         bank = (data & 0x0f) | ((m_mmc_reg[1] & 0x03) << 4);
10824         prg16_89ab(machine(), bank);
10825         prg16_cdef(machine(), bank);
10855         prg16_89ab(bank);
10856         prg16_cdef(bank);
1082610857      }
1082710858      else
1082810859         bmc_gc6in1_set_prg(machine(), m_mmc_prg_base, m_mmc_prg_mask);
r18084r18085
1093010961
1093110962
1093210963         case 0x2001:
10933            set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
10964            set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1093410965            break;
1093510966
1093610967         default:
r18084r18085
1098411015
1098511016   // not sure about this mirroring bit!!
1098611017   // without it TN 95 in 1 has glitches in Lunar Ball; with it TN 95 in 1 has glitches in Galaxian!
10987   set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
11018   set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1098811019   if (BIT(offset, 7))
1098911020   {
10990      prg16_89ab(machine(), (offset >> 4) & 0x07);
10991      prg16_cdef(machine(), (offset >> 4) & 0x07);
11021      prg16_89ab((offset >> 4) & 0x07);
11022      prg16_cdef((offset >> 4) & 0x07);
1099211023   }
1099311024   else
10994      prg32(machine(), (offset >> 5) & 0x03);
10995   chr8(machine(), offset, CHRROM);
11025      prg32((offset >> 5) & 0x03);
11026   chr8(offset, CHRROM);
1099611027}
1099711028
1099811029READ8_MEMBER(nes_carts_state::bmc_vt5201_r)
r18084r18085
1101811049{
1101911050   nes_state *state = machine.driver_data<nes_state>();
1102011051
11021   prg8_89(machine, state->m_mmc_prg_bank[0]);
11022   prg8_ab(machine, state->m_mmc_prg_bank[1]);
11023   prg8_cd(machine, state->m_mmc_prg_bank[2]);
11024   prg8_ef(machine, state->m_mmc_prg_bank[3]);
11025   chr2_0(machine, state->m_mmc_vrom_bank[0], CHRROM);
11026   chr2_2(machine, state->m_mmc_vrom_bank[1], CHRROM);
11027   chr2_4(machine, state->m_mmc_vrom_bank[2], CHRROM);
11028   chr2_6(machine, state->m_mmc_vrom_bank[3], CHRROM);
11052   state->prg8_89(state->m_mmc_prg_bank[0]);
11053   state->prg8_ab(state->m_mmc_prg_bank[1]);
11054   state->prg8_cd(state->m_mmc_prg_bank[2]);
11055   state->prg8_ef(state->m_mmc_prg_bank[3]);
11056   state->chr2_0(state->m_mmc_vrom_bank[0], CHRROM);
11057   state->chr2_2(state->m_mmc_vrom_bank[1], CHRROM);
11058   state->chr2_4(state->m_mmc_vrom_bank[2], CHRROM);
11059   state->chr2_6(state->m_mmc_vrom_bank[3], CHRROM);
1102911060}
1103011061
1103111062WRITE8_MEMBER(nes_carts_state::bmc_bs5_w)
r18084r18085
1106211093
1106311094   if (!BIT(offset, 6))
1106411095   {
11065      prg16_89ab(machine(), (bank << 1) | BIT(offset, 5));
11066      prg16_cdef(machine(), (bank << 1) | BIT(offset, 5));
11096      prg16_89ab((bank << 1) | BIT(offset, 5));
11097      prg16_cdef((bank << 1) | BIT(offset, 5));
1106711098   }
1106811099   else
11069      prg32(machine(), bank);
11100      prg32(bank);
1107011101
11071   set_nt_mirroring(machine(), BIT(offset, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
11102   set_nt_mirroring(BIT(offset, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1107211103
11073   chr8(machine(), offset & 0x0f, CHRROM);
11104   chr8(offset & 0x0f, CHRROM);
1107411105}
1107511106
1107611107/*************************************************************
r18084r18085
1108911120
1109011121   if (BIT(offset, 7))
1109111122   {
11092      prg16_89ab(machine(), pbank | BIT(offset, 6));
11093      prg16_cdef(machine(), pbank | BIT(offset, 6));
11123      prg16_89ab(pbank | BIT(offset, 6));
11124      prg16_cdef(pbank | BIT(offset, 6));
1109411125   }
1109511126   else
11096      prg32(machine(), pbank >> 1);
11127      prg32(pbank >> 1);
1109711128
11098   set_nt_mirroring(machine(), BIT(offset, 10) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
11129   set_nt_mirroring(BIT(offset, 10) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1109911130
11100   chr8(machine(), cbank, CHRROM);
11131   chr8(cbank, CHRROM);
1110111132}
1110211133
1110311134/*************************************************************
r18084r18085
1111211143{
1111311144   nes_state *state = machine.driver_data<nes_state>();
1111411145
11115   set_nt_mirroring(machine, BIT(state->m_mmc_reg[0], 6) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
11146   state->set_nt_mirroring(BIT(state->m_mmc_reg[0], 6) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
1111611147
1111711148   if (BIT(state->m_mmc_reg[0], 5))
1111811149   {
11119      prg16_89ab(machine, state->m_mmc_reg[0] & 0x1f);   // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1!
11120      prg16_cdef(machine, state->m_mmc_reg[0] & 0x1f);   // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1!
11150      state->prg16_89ab(state->m_mmc_reg[0] & 0x1f);   // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1!
11151      state->prg16_cdef(state->m_mmc_reg[0] & 0x1f);   // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1!
1112111152   }
1112211153   else
11123      prg32(machine, (state->m_mmc_reg[0] & 0x1f) >> 1);   // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1!
11154      state->prg32((state->m_mmc_reg[0] & 0x1f) >> 1);   // FIXME: here probably we could also have PRGRAM, depending on mmc_latch1!
1112411155
1112511156   if (BIT(state->m_mmc_reg[1], 2))
11126      chr8(machine, 0, CHRRAM);
11157      state->chr8(0, CHRRAM);
1112711158//  else
11128//      chr8(machine, 0, CHRROM);
11159//      state->chr8(0, CHRROM);
1112911160}
1113011161
1113111162WRITE8_MEMBER(nes_carts_state::bmc_gb63_w)
r18084r18085
1115811189{
1115911190   LOG_MMC(("edu2k_w, offset: %04x, data: %02x\n", offset, data));
1116011191
11161   prg32(machine(), data & 0x1f);
11162   wram_bank(machine(), (data & 0xc0) >> 6, NES_WRAM);
11192   prg32(data & 0x1f);
11193   wram_bank((data & 0xc0) >> 6, NES_WRAM);
1116311194}
1116411195
1116511196/*************************************************************
r18084r18085
1117311204   nes_state *state = machine.driver_data<nes_state>();
1117411205
1117511206   if (!(state->m_mmc_reg[0] & 0x40))
11176      prg8_x(machine, start, bank);
11207      state->prg8_x(start, bank);
1117711208}
1117811209
1117911210WRITE8_MEMBER(nes_carts_state::h2288_l_w)
r18084r18085
1118811219      {
1118911220         UINT8 helper1 = (m_mmc_reg[0] & 0x05) | ((m_mmc_reg[0] >> 2) & 0x0a);
1119011221         UINT8 helper2 = BIT(m_mmc_reg[0], 1);
11191         prg16_89ab(machine(), helper1 & ~helper2);
11192         prg16_cdef(machine(), helper1 |  helper2);
11222         prg16_89ab(helper1 & ~helper2);
11223         prg16_cdef(helper1 |  helper2);
1119311224      }
1119411225      else
1119511226         mmc3_set_prg(machine(), m_mmc_prg_base, m_mmc_prg_mask);
r18084r18085
1125811289   nes_state *state = machine.driver_data<nes_state>();
1125911290   int i;
1126011291
11261   prg8_89(machine, state->m_mmc_prg_bank[0]);
11262   prg8_ab(machine, state->m_mmc_prg_bank[1]);
11292   state->prg8_89(state->m_mmc_prg_bank[0]);
11293   state->prg8_ab(state->m_mmc_prg_bank[1]);
1126311294
1126411295   for (i = 0; i < 8; i++)
1126511296   {
r18084r18085
1127511306         continue;
1127611307      }
1127711308      if ((state->m_mmc_vrom_bank[i] == 4 || state->m_mmc_vrom_bank[i] == 5) && !state->m_mmc_latch1)
11278         chr1_x(machine, i, chr_bank & 1, CHRRAM);
11309         state->chr1_x(i, chr_bank & 1, CHRRAM);
1127911310      else
11280         chr1_x(machine, i, chr_bank, CHRROM);
11311         state->chr1_x(i, chr_bank, CHRROM);
1128111312   }
1128211313}
1128311314
r18084r18085
1131011341         case 0x1400:
1131111342            switch (data & 0x03)
1131211343            {
11313               case 0: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
11314               case 1: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
11315               case 2: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
11316               case 3: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
11344               case 0: set_nt_mirroring(PPU_MIRROR_VERT); break;
11345               case 1: set_nt_mirroring(PPU_MIRROR_HORZ); break;
11346               case 2: set_nt_mirroring(PPU_MIRROR_LOW); break;
11347               case 3: set_nt_mirroring(PPU_MIRROR_HIGH); break;
1131711348            }
1131811349            break;
1131911350         case 0x7000:
r18084r18085
1136911400   UINT8 flip = (state->m_mmc3_latch & 0x40) ? 2 : 0;
1137011401
1137111402   if (!(state->m_mmc_reg[3] & 0x03))
11372      prg8_x(machine, start, bank);
11403      state->prg8_x(start, bank);
1137311404   else if (start == flip)
1137411405   {
1137511406      if ((state->m_mmc_reg[3] & 0x03) == 0x03)
11376         prg32(machine, bank >> 2);
11407         state->prg32(bank >> 2);
1137711408      else
1137811409      {
11379         prg16_89ab(machine, bank >> 1);
11380         prg16_cdef(machine, bank >> 1);
11410         state->prg16_89ab(bank >> 1);
11411         state->prg16_cdef(bank >> 1);
1138111412      }
1138211413   }
1138311414}
r18084r18085
1138711418   nes_state *state = machine.driver_data<nes_state>();
1138811419
1138911420   if (!(state->m_mmc_reg[3] & 0x10))
11390      chr1_x(machine, start, bank, source);
11421      state->chr1_x(start, bank, source);
1139111422}
1139211423
1139311424INLINE void pjoy84_set_base_mask( running_machine &machine )
r18084r18085
1142111452         m_mmc_reg[offset & 0x03] = data;
1142211453         pjoy84_set_base_mask(machine());
1142311454         if (m_mmc_reg[3] & 0x10)
11424            chr8(machine(), (m_mmc_chr_base >> 3) | (m_mmc_reg[2] & 0x0f), m_mmc_chr_source);
11455            chr8((m_mmc_chr_base >> 3) | (m_mmc_reg[2] & 0x0f), m_mmc_chr_source);
1142511456         else
1142611457            mmc3_set_chr(machine(), m_mmc_chr_source, m_mmc_chr_base, m_mmc_chr_mask);
1142711458         mmc3_set_prg(machine(), m_mmc_prg_base, m_mmc_prg_mask);
r18084r18085
1145811489   {
1145911490      case 0x00:
1146011491      case 0x04:
11461         prg32(machine, (prg_offset + state->m_mmc_reg[3]) >> 1);
11492         state->prg32((prg_offset + state->m_mmc_reg[3]) >> 1);
1146211493         break;
1146311494      case 0x08:
11464         prg16_89ab(machine, prg_offset + 0);
11465         prg16_cdef(machine, prg_offset + state->m_mmc_reg[3]);
11495         state->prg16_89ab(prg_offset + 0);
11496         state->prg16_cdef(prg_offset + state->m_mmc_reg[3]);
1146611497         break;
1146711498      case 0x0c:
11468         prg16_89ab(machine, prg_offset + state->m_mmc_reg[3]);
11469         prg16_cdef(machine, prg_offset + 0x0f);
11499         state->prg16_89ab(prg_offset + state->m_mmc_reg[3]);
11500         state->prg16_cdef(prg_offset + 0x0f);
1147011501         break;
1147111502   }
1147211503}
r18084r18085
1147811509
1147911510   if (chr_mode)
1148011511   {
11481      chr4_0(machine, state->m_mmc_reg[1] & 0x1f, state->m_mmc_chr_source);
11482      chr4_4(machine, state->m_mmc_reg[2] & 0x1f, state->m_mmc_chr_source);
11512      state->chr4_0(state->m_mmc_reg[1] & 0x1f, state->m_mmc_chr_source);
11513      state->chr4_4(state->m_mmc_reg[2] & 0x1f, state->m_mmc_chr_source);
1148311514   }
1148411515   else
11485      chr8(machine, (state->m_mmc_reg[1] & 0x1f) >> 1, state->m_mmc_chr_source);
11516      state->chr8((state->m_mmc_reg[1] & 0x1f) >> 1, state->m_mmc_chr_source);
1148611517}
1148711518
1148811519WRITE8_MEMBER(nes_carts_state::someri_mmc1_w)
r18084r18085
1151611547            m_mmc_reg[0] = m_mmc1_latch;
1151711548            switch (m_mmc_reg[0] & 0x03)
1151811549            {
11519            case 0: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
11520            case 1: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
11521            case 2: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
11522            case 3: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
11550            case 0: set_nt_mirroring(PPU_MIRROR_LOW); break;
11551            case 1: set_nt_mirroring(PPU_MIRROR_HIGH); break;
11552            case 2: set_nt_mirroring(PPU_MIRROR_VERT); break;
11553            case 3: set_nt_mirroring(PPU_MIRROR_HORZ); break;
1152311554            }
1152411555            someri_mmc1_set_chr(machine());
1152511556            someri_mmc1_set_prg(machine());
r18084r18085
1158011611         break;
1158111612
1158211613      case 0x2000:
11583         set_nt_mirroring(machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
11614         set_nt_mirroring(BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1158411615         break;
1158511616      case 0x2001: break;
1158611617      case 0x4000: m_IRQ_count_latch = data; break;
r18084r18085
1160011631   if (offset < 0x1000)
1160111632   {
1160211633      m_mmc_prg_bank[4] = data;
11603      prg8_89(machine(), m_mmc_prg_bank[4]);
11634      prg8_89(m_mmc_prg_bank[4]);
1160411635   }
1160511636   else if (offset < 0x2000)
1160611637   {
1160711638      switch (data & 0x03)
1160811639      {
11609         case 0x00: set_nt_mirroring(machine(), PPU_MIRROR_VERT); break;
11610         case 0x01: set_nt_mirroring(machine(), PPU_MIRROR_HORZ); break;
11611         case 0x02: set_nt_mirroring(machine(), PPU_MIRROR_LOW); break;
11612         case 0x03: set_nt_mirroring(machine(), PPU_MIRROR_HIGH); break;
11640         case 0x00: set_nt_mirroring(PPU_MIRROR_VERT); break;
11641         case 0x01: set_nt_mirroring(PPU_MIRROR_HORZ); break;
11642         case 0x02: set_nt_mirroring(PPU_MIRROR_LOW); break;
11643         case 0x03: set_nt_mirroring(PPU_MIRROR_HIGH); break;
1161311644      }
1161411645   }
1161511646   else if (offset < 0x3000)
1161611647   {
1161711648      m_mmc_prg_bank[5] = data;
11618      prg8_ab(machine(), m_mmc_prg_bank[5]);
11649      prg8_ab(m_mmc_prg_bank[5]);
1161911650   }
1162011651   else if (offset < 0x7000)
1162111652   {
r18084r18085
1162311654      shift = BIT(offset, 2) * 4;
1162411655      data = (data & 0x0f) << shift;
1162511656      m_mmc_vrom_bank[6 + bank] = data | m_mmc_chr_base;
11626      chr1_x(machine(), bank, m_mmc_vrom_bank[6 + bank], CHRROM);
11657      chr1_x(bank, m_mmc_vrom_bank[6 + bank], CHRROM);
1162711658   }
1162811659}
1162911660
r18084r18085
1164711678   switch (state->m_mmc_cmd1)
1164811679   {
1164911680      case 0x00:
11650         prg8_89(machine, state->m_mmc_prg_bank[4]);
11651         prg8_ab(machine, state->m_mmc_prg_bank[5]);
11681         state->prg8_89(state->m_mmc_prg_bank[4]);
11682         state->prg8_ab(state->m_mmc_prg_bank[5]);
1165211683         for (i = 0; i < 8; i++)
11653            chr1_x(machine, i, state->m_mmc_vrom_bank[6 + i], CHRROM);
11684            state->chr1_x(i, state->m_mmc_vrom_bank[6 + i], CHRROM);
1165411685         break;
1165511686      case 0x01:
1165611687         mmc3_set_prg(machine, state->m_mmc_prg_base, state->m_mmc_prg_mask);
r18084r18085
1205012081      fatalerror("Missing PCB interface\n");
1205112082
1205212083   if (intf)
12053   {   
12084   {
1205412085      m_mmc_write_low = intf->mmc_l.write;
1205512086      if (!m_mmc_write_low.isnull()) m_mmc_write_low.late_bind(*this);
1205612087      m_mmc_write_mid = intf->mmc_m.write;
r18084r18085
1207712108      m_ppu->set_latch(NULL);
1207812109   }
1207912110
12080   m_mmc3_prg_cb = prg8_x;
12081   m_mmc3_chr_cb = chr1_x;
12111   m_mmc3_prg_cb = mmc3_base_prg_cb;
12112   m_mmc3_chr_cb = mmc3_base_chr_cb;
1208212113
1208312114   switch (m_pcb_id)
1208412115   {
r18084r18085
1219512226   int err = 0, i;
1219612227
1219712228   /* basic PRG config */
12198   prg32(machine(), 0);
12229   prg32(0);
1219912230
1220012231   /* some boards will not use this, but directly CHRROM (resp. CHRRAM) if the board only has VROM (resp. VRAM) */
1220112232   m_mmc_chr_source = m_chr_chunks ? CHRROM : CHRRAM;
12202   chr8(machine(), 0, m_mmc_chr_source);
12233   chr8(0, m_mmc_chr_source);
1220312234
1220412235   /* Here, we init a few helpers: 4 prg banks and 16 chr banks - some mappers use them */
1220512236   for (i = 0; i < 4; i++)
r18084r18085
1231712348      case KAISER_KS7017:
1231812349      case KAISER_KS7032:
1231912350      case KAISER_KS202:
12320         prg16_89ab(machine(), 0);
12321         prg16_cdef(machine(), m_prg_chunks - 1);
12351         prg16_89ab(0);
12352         prg16_cdef(m_prg_chunks - 1);
1232212353         break;
1232312354
1232412355      case STD_CPROM:   // mapper 13
12325         chr4_0(machine(), 0, CHRRAM);
12326         chr4_4(machine(), 0, CHRRAM);
12356         chr4_0(0, CHRRAM);
12357         chr4_4(0, CHRRAM);
1232712358         break;
1232812359      case STD_AXROM:   // mapper 7
12329         set_nt_mirroring(machine(), PPU_MIRROR_LOW);
12360         set_nt_mirroring(PPU_MIRROR_LOW);
1233012361         break;
1233112362      case STD_SXROM:   // mapper 1, 155
1233212363      case STD_SOROM:
r18084r18085
1233712368         m_mmc_reg[0] = 0x0f;
1233812369         m_mmc_reg[1] = m_mmc_reg[2] = m_mmc_reg[3] = 0;
1233912370         m_mmc1_reg_write_enable = 1;
12340         set_nt_mirroring(machine(), PPU_MIRROR_HORZ);
12371         set_nt_mirroring(PPU_MIRROR_HORZ);
1234112372         mmc1_set_chr(machine());
1234212373         mmc1_set_prg(machine());
1234312374         if (m_battery || m_wram)
12344            wram_bank(machine(), 0, (idx == STD_SOROM) ? NES_WRAM : NES_BATTERY);
12375            wram_bank(0, (idx == STD_SOROM) ? NES_WRAM : NES_BATTERY);
1234512376         break;
1234612377      case STD_PXROM:   // mapper 9
1234712378         m_mmc_reg[0] = m_mmc_reg[2] = 0;
1234812379         m_mmc_reg[1] = m_mmc_reg[3] = 0;
1234912380         m_mmc_latch1 = m_mmc_latch2 = 0xfe;
12350         prg8_89(machine(), 0);
12351         prg8_ab(machine(), (m_prg_chunks << 1) - 3);
12352         prg8_cd(machine(), (m_prg_chunks << 1) - 2);
12353         prg8_ef(machine(), (m_prg_chunks << 1) - 1);
12381         prg8_89(0);
12382         prg8_ab((m_prg_chunks << 1) - 3);
12383         prg8_cd((m_prg_chunks << 1) - 2);
12384         prg8_ef((m_prg_chunks << 1) - 1);
1235412385         break;
1235512386      case STD_FXROM: // mapper 10
1235612387         m_mmc_reg[0] = m_mmc_reg[2] = 0;
1235712388         m_mmc_reg[1] = m_mmc_reg[3] = 0;
1235812389         m_mmc_latch1 = m_mmc_latch2 = 0xfe;
12359         prg16_89ab(machine(), 0);
12360         prg16_cdef(machine(), m_prg_chunks - 1);
12390         prg16_89ab(0);
12391         prg16_cdef(m_prg_chunks - 1);
1236112392         break;
1236212393      case STD_TXROM:   // mapper 4
1236312394      case STD_TVROM:
r18084r18085
1238112412      case NITRA_TDA:   // mapper 250
1238212413         if (m_four_screen_vram)   // only TXROM and DXROM have 4-screen mirroring
1238312414         {
12384            set_nt_page(machine(), 0, CART_NTRAM, 0, 1);
12385            set_nt_page(machine(), 1, CART_NTRAM, 1, 1);
12386            set_nt_page(machine(), 2, CART_NTRAM, 2, 1);
12387            set_nt_page(machine(), 3, CART_NTRAM, 3, 1);
12415            set_nt_page(0, CART_NTRAM, 0, 1);
12416            set_nt_page(1, CART_NTRAM, 1, 1);
12417            set_nt_page(2, CART_NTRAM, 2, 1);
12418            set_nt_page(3, CART_NTRAM, 3, 1);
1238812419         }
1238912420         mmc3_common_initialize(machine(), 0xff, 0xff, 0);
1239012421         break;
r18084r18085
1241512446         m_mmc5_prg_regs[3] = 0xff;
1241612447         memset(m_mmc5_vrom_regA, ~0, ARRAY_LENGTH(m_mmc5_vrom_regA));
1241712448         memset(m_mmc5_vrom_regB, ~0, ARRAY_LENGTH(m_mmc5_vrom_regB));
12418         prg16_89ab(machine(), m_prg_chunks - 2);
12419         prg16_cdef(machine(), m_prg_chunks - 1);
12449         prg16_89ab(m_prg_chunks - 2);
12450         prg16_cdef(m_prg_chunks - 1);
1242012451         break;
1242112452      case STD_NXROM:      // mapper 68
1242212453      case SUNSOFT_DCS:      // mapper 68
1242312454         m_mmc_reg[0] = 0;
12424         prg16_89ab(machine(), 0);
12425         prg16_cdef(machine(), m_prg_chunks - 1);
12455         prg16_89ab(0);
12456         prg16_cdef(m_prg_chunks - 1);
1242612457         break;
1242712458      case NAMCOT_34X3:   // mapper 88
1242812459      case STD_DXROM:   // mapper 206
1242912460      case STD_DRROM:
1243012461         if (m_four_screen_vram)   // only TXROM and DXROM have 4-screen mirroring
1243112462         {
12432            set_nt_page(machine(), 0, CART_NTRAM, 0, 1);
12433            set_nt_page(machine(), 1, CART_NTRAM, 1, 1);
12434            set_nt_page(machine(), 2, CART_NTRAM, 2, 1);
12435            set_nt_page(machine(), 3, CART_NTRAM, 3, 1);
12463            set_nt_page(0, CART_NTRAM, 0, 1);
12464            set_nt_page(1, CART_NTRAM, 1, 1);
12465            set_nt_page(2, CART_NTRAM, 2, 1);
12466            set_nt_page(3, CART_NTRAM, 3, 1);
1243612467         }
1243712468      case NAMCOT_3453:   // mapper 154
12438         prg16_89ab(machine(), m_prg_chunks - 2);
12439         prg16_cdef(machine(), m_prg_chunks - 1);
12469         prg16_89ab(m_prg_chunks - 2);
12470         prg16_cdef(m_prg_chunks - 1);
1244012471         break;
1244112472      case NAMCOT_3446:   // mapper 76
12442         prg8_89(machine(), 0);
12443         prg8_ab(machine(), 1);
12444         prg16_cdef(machine(), m_prg_chunks - 1);
12445         chr2_0(machine(), 0, CHRROM);
12446         chr2_2(machine(), 1, CHRROM);
12447         chr2_4(machine(), 2, CHRROM);
12448         chr2_6(machine(), 3, CHRROM);
12473         prg8_89(0);
12474         prg8_ab(1);
12475         prg16_cdef(m_prg_chunks - 1);
12476         chr2_0(0, CHRROM);
12477         chr2_2(1, CHRROM);
12478         chr2_4(2, CHRROM);
12479         chr2_6(3, CHRROM);
1244912480         break;
1245012481      case BANDAI_JUMP2:   // mapper 153
1245112482         for (i = 0; i < 8; i++)
1245212483            m_mmc_reg[i] = 0;
12453         prg16_89ab(machine(), 0);
12454         prg16_cdef(machine(), m_prg_chunks - 1);
12484         prg16_89ab(0);
12485         prg16_cdef(m_prg_chunks - 1);
1245512486         fjump2_set_prg(machine());
1245612487         break;
1245712488      case BANDAI_KARAOKE:   // mapper 188
12458         prg16_89ab(machine(), 0);
12459         prg16_cdef(machine(), (m_prg_chunks - 1) ^ 0x08);
12489         prg16_89ab(0);
12490         prg16_cdef((m_prg_chunks - 1) ^ 0x08);
1246012491         break;
1246112492      case IREM_LROG017:   // mapper 77
12462         chr2_2(machine(), 0, CHRROM);
12463         chr2_4(machine(), 1, CHRROM);
12464         chr2_6(machine(), 2, CHRROM);
12493         chr2_2(0, CHRROM);
12494         chr2_4(1, CHRROM);
12495         chr2_6(2, CHRROM);
1246512496         break;
1246612497      case IREM_TAM_S1:   // mapper 97
12467         prg16_89ab(machine(), m_prg_chunks - 1);
12468         prg16_cdef(machine(), 0);
12498         prg16_89ab(m_prg_chunks - 1);
12499         prg16_cdef(0);
1246912500         break;
1247012501      case KONAMI_VRC7:   // mapper 85
12471         prg8_89(machine(), 0);
12472         prg8_ab(machine(), 0);
12473         prg8_cd(machine(), 0);
12474         prg8_ef(machine(), 0xff);
12502         prg8_89(0);
12503         prg8_ab(0);
12504         prg8_cd(0);
12505         prg8_ef(0xff);
1247512506         break;
1247612507      case NAMCOT_163:   // mapper 19
12477         prg16_89ab(machine(), 0);
12478         prg16_cdef(machine(), m_prg_chunks - 1);
12479         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12508         prg16_89ab(0);
12509         prg16_cdef(m_prg_chunks - 1);
12510         set_nt_mirroring(PPU_MIRROR_VERT);
1248012511         break;
1248112512      case SUNSOFT_1:   // mapper 184
1248212513      case SUNSOFT_2:   // mapper 89 & 93
12483         prg16_89ab(machine(), 0);
12484         prg16_cdef(machine(), m_prg_chunks - 1);
12514         prg16_89ab(0);
12515         prg16_cdef(m_prg_chunks - 1);
1248512516         if (!m_hard_mirroring)
12486            set_nt_mirroring(machine(), PPU_MIRROR_LOW);
12517            set_nt_mirroring(PPU_MIRROR_LOW);
1248712518         break;
1248812519
1248912520         // mapper 14
r18084r18085
1249712528         break;
1249812529         // mapper 15
1249912530      case WAIXING_PS2:
12500         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12531         set_nt_mirroring(PPU_MIRROR_VERT);
1250112532         break;
1250212533
1250312534         // mapper 35
r18084r18085
1250512536         // mapper 42
1250612537      case BTL_MARIOBABY:
1250712538      case BTL_AISENSHINICOL:
12508         prg32(machine(), 0xff);
12539         prg32(0xff);
1250912540         break;
1251012541
1251112542         // mapper 40
1251212543      case BTL_SMB2A:
12513         prg8_67(machine(), 0xfe);
12514         prg8_89(machine(), 0xfc);
12515         prg8_ab(machine(), 0xfd);
12516         prg8_cd(machine(), 0xfe);
12517         prg8_ef(machine(), 0xff);
12544         prg8_67(0xfe);
12545         prg8_89(0xfc);
12546         prg8_ab(0xfd);
12547         prg8_cd(0xfe);
12548         prg8_ef(0xff);
1251812549         break;
1251912550
1252012551         // mapper 43
r18084r18085
1253812569
1253912570         // mapper 50
1254012571      case BTL_SMB2B:
12541         prg8_67(machine(), 0x0f);
12542         prg8_89(machine(), 0x08);
12543         prg8_ab(machine(), 0x09);
12544         prg8_cd(machine(), 0);
12545         prg8_ef(machine(), 0x0b);
12572         prg8_67(0x0f);
12573         prg8_89(0x08);
12574         prg8_ab(0x09);
12575         prg8_cd(0);
12576         prg8_ef(0x0b);
1254612577         break;
1254712578         // mapper 51
1254812579      case BMC_BALLGAMES_11IN1:
r18084r18085
1255812589         break;
1255912590         // mapper 54
1256012591      case BMC_NOVELDIAMOND:
12561         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12592         set_nt_mirroring(PPU_MIRROR_VERT);
1256212593         break;
1256312594         // mapper 57
1256412595      case BMC_GKA:
12565         prg16_89ab(machine(), 0);
12566         prg16_cdef(machine(), 0);
12596         prg16_89ab(0);
12597         prg16_cdef(0);
1256712598         break;
1256812599
1256912600         // mapper 64
1257012601      case TENGEN_800032:
1257112602         // mapper 158
1257212603      case TENGEN_800037:
12573         prg16_89ab(machine(), m_prg_chunks - 1);
12574         prg16_cdef(machine(), m_prg_chunks - 1);
12604         prg16_89ab(m_prg_chunks - 1);
12605         prg16_cdef(m_prg_chunks - 1);
1257512606         break;
1257612607         // mapper 71
1257712608      case CAMERICA_BF9097:
12578         set_nt_mirroring(machine(), PPU_MIRROR_HORZ);
12609         set_nt_mirroring(PPU_MIRROR_HORZ);
1257912610      case CAMERICA_BF9093:
12580         prg32(machine(), 0xff);
12611         prg32(0xff);
1258112612         break;
1258212613
1258312614         // mapper 79 (& 146)
1258412615      case AVE_NINA06:
12585         set_nt_mirroring(machine(), PPU_MIRROR_HORZ);
12616         set_nt_mirroring(PPU_MIRROR_HORZ);
1258612617         break;
1258712618
1258812619         // mapper 83
1258912620      case CONY_BOARD:
1259012621      case YOKO_BOARD:
1259112622         m_mapper83_reg[9] = 0x0f;
12592         prg8_cd(machine(), 0x1e);
12593         prg8_ef(machine(), 0x1f);
12623         prg8_cd(0x1e);
12624         prg8_ef(0x1f);
1259412625         break;
1259512626
1259612627         // mapper 91
1259712628      case UNL_MK2:
12598         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12599         prg16_89ab(machine(), m_prg_chunks - 1);
12600         prg16_cdef(machine(), m_prg_chunks - 1);
12629         set_nt_mirroring(PPU_MIRROR_VERT);
12630         prg16_89ab(m_prg_chunks - 1);
12631         prg16_cdef(m_prg_chunks - 1);
1260112632         break;
1260212633
1260312634         // mapper 104
1260412635      case CAMERICA_GOLDENFIVE:
12605         prg16_89ab(machine(), 0x00);
12606         prg16_cdef(machine(), 0x0f);
12636         prg16_89ab(0x00);
12637         prg16_cdef(0x0f);
1260712638         break;
1260812639         // mapper 106
1260912640      case BTL_SMB3:
12610         prg8_89(machine(), (m_prg_chunks << 1) - 1);
12611         prg8_ab(machine(), 0);
12612         prg8_cd(machine(), 0);
12613         prg8_ef(machine(), (m_prg_chunks << 1) - 1);
12641         prg8_89((m_prg_chunks << 1) - 1);
12642         prg8_ab(0);
12643         prg8_cd(0);
12644         prg8_ef((m_prg_chunks << 1) - 1);
1261412645         break;
1261512646
1261612647         // mapper 108
1261712648      case WHIRLWIND_2706:
12618         prg32(machine(), 0xff);
12649         prg32(0xff);
1261912650         break;
1262012651
1262112652         // mapper 114
r18084r18085
1266312694
1266412695         // mapper 120
1266512696      case BTL_TOBIDASE:
12666         prg32(machine(), 2);
12697         prg32(2);
1266712698         break;
1266812699
1266912700         // mapper 121
r18084r18085
1269712728
1269812729         // mapper 137
1269912730      case SACHEN_8259D:
12700         chr8(machine(), m_chr_chunks - 1, CHRROM);
12701         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12731         chr8(m_chr_chunks - 1, CHRROM);
12732         set_nt_mirroring(PPU_MIRROR_VERT);
1270212733         break;
1270312734         // mapper 138
1270412735      case SACHEN_8259B:
r18084r18085
1270812739      case SACHEN_8259A:
1270912740         // mapper 150
1271012741      case SACHEN_74LS374:
12711         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12742         set_nt_mirroring(PPU_MIRROR_VERT);
1271212743         break;
1271312744         // mapper 143
1271412745      case SACHEN_TCA01:
12715         prg16_89ab(machine(), 0);
12716         prg16_cdef(machine(), 1);
12746         prg16_89ab(0);
12747         prg16_cdef(1);
1271712748         break;
1271812749
1271912750         // mapper 156
1272012751      case OPENCORP_DAOU306:
12721         prg16_89ab(machine(), m_prg_chunks - 2);
12722         prg16_cdef(machine(), m_prg_chunks - 1);
12723         set_nt_mirroring(machine(), PPU_MIRROR_LOW);
12752         prg16_89ab(m_prg_chunks - 2);
12753         prg16_cdef(m_prg_chunks - 1);
12754         set_nt_mirroring(PPU_MIRROR_LOW);
1272412755         break;
1272512756         // mapper 163
1272612757      case NANJING_BOARD:
1272712758         m_mmc_count = 0xff;
1272812759         m_mmc_reg[0] = 0xff;
1272912760         m_mmc_reg[1] = 0;
12730         prg16_89ab(machine(), m_prg_chunks - 2);
12731         prg16_cdef(machine(), m_prg_chunks - 1);
12761         prg16_89ab(m_prg_chunks - 2);
12762         prg16_cdef(m_prg_chunks - 1);
1273212763         break;
1273312764         // mapper 164
1273412765      case WAIXING_FFV:
12735         prg16_89ab(machine(), 0);
12736         prg16_cdef(machine(), 0x1f);
12766         prg16_89ab(0);
12767         prg16_cdef(0x1f);
1273712768         break;
1273812769         // mapper 166
1273912770      case SUBOR_TYPE1:
1274012771         m_subor_reg[0] = m_subor_reg[1] = m_subor_reg[2] = m_subor_reg[3] = 0;
12741         prg16_89ab(machine(), 0);
12742         prg16_cdef(machine(), 0x07);
12772         prg16_89ab(0);
12773         prg16_cdef(0x07);
1274312774         break;
1274412775         // mapper 167
1274512776      case SUBOR_TYPE0:
1274612777         m_subor_reg[0] = m_subor_reg[1] = m_subor_reg[2] = m_subor_reg[3] = 0;
12747         prg16_89ab(machine(), 0);
12748         prg16_cdef(machine(), 0x20);
12778         prg16_89ab(0);
12779         prg16_cdef(0x20);
1274912780         break;
1275012781
1275112782         // mapper 176
1275212783      case UNL_XZY:
1275312784         // mapper 182
1275412785      case HOSENKAN_BOARD:
12755         prg32(machine(), (m_prg_chunks - 1) >> 1);
12786         prg32((m_prg_chunks - 1) >> 1);
1275612787         break;
1275712788
1275812789      case FUKUTAKE_BOARD:   // mapper 186
12759         prg16_89ab(machine(), 0);
12760         prg16_cdef(machine(), 0);
12790         prg16_89ab(0);
12791         prg16_cdef(0);
1276112792         break;
1276212793
1276312794         // mapper 187
r18084r18085
1277512806         break;
1277612807         // mapper 193
1277712808      case NTDEC_FIGHTINGHERO:
12778         prg32(machine(), (m_prg_chunks - 1) >> 1);
12779         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12809         prg32((m_prg_chunks - 1) >> 1);
12810         set_nt_mirroring(PPU_MIRROR_VERT);
1278012811         break;
1278112812         // mapper 197
1278212813      case UNL_SUPERFIGHTER3:
r18084r18085
1281312844
1281412845         // mapper 200
1281512846      case BMC_36IN1:
12816         prg16_89ab(machine(), m_prg_chunks - 1);
12817         prg16_cdef(machine(), m_prg_chunks - 1);
12847         prg16_89ab(m_prg_chunks - 1);
12848         prg16_cdef(m_prg_chunks - 1);
1281812849         break;
1281912850
1282012851         // mapper 202
r18084r18085
1282512856      case BMC_64IN1:
1282612857         // mapper 214
1282712858      case BMC_SUPERGUN_20IN1:
12828         prg16_89ab(machine(), 0);
12829         prg16_cdef(machine(), 0);
12859         prg16_89ab(0);
12860         prg16_cdef(0);
1283012861         break;
1283112862         // mapper 205
1283212863      case BMC_15IN1:
r18084r18085
1284212873         break;
1284312874         // mapper 212
1284412875      case BMC_SUPERHIK_300IN1:
12845         chr8(machine(), 0xff, CHRROM);
12846         prg32(machine(), 0xff);
12876         chr8(0xff, CHRROM);
12877         prg32(0xff);
1284712878         break;
1284812879
1284912880         // mapper 215
r18084r18085
1286912900         break;
1287012901         // mapper 221
1287112902      case UNL_N625092:
12872         prg16_89ab(machine(), 0);
12873         prg16_cdef(machine(), 0);
12903         prg16_89ab(0);
12904         prg16_cdef(0);
1287412905         break;
1287512906
1287612907         // mapper 223?
r18084r18085
1289112922
1289212923         // mapper 227
1289312924      case BMC_1200IN1:
12894         prg16_89ab(machine(), 0);
12895         prg16_cdef(machine(), 0);
12925         prg16_89ab(0);
12926         prg16_cdef(0);
1289612927         break;
1289712928
1289812929         // mapper 229
1289912930      case BMC_31IN1:
12900         prg16_89ab(machine(), 0);
12901         prg16_cdef(machine(), 1);
12902         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12931         prg16_89ab(0);
12932         prg16_cdef(1);
12933         set_nt_mirroring(PPU_MIRROR_VERT);
1290312934         break;
1290412935         // mapper 230
1290512936      case BMC_22GAMES:
12906         prg16_89ab(machine(), 0);
12907         prg16_cdef(machine(), 7);
12937         prg16_89ab(0);
12938         prg16_cdef(7);
1290812939         break;
1290912940         // mapper 231
1291012941      case BMC_20IN1:
12911         prg16_89ab(machine(), 0);
12912         prg16_cdef(machine(), m_prg_chunks - 1);
12913         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12942         prg16_89ab(0);
12943         prg16_cdef(m_prg_chunks - 1);
12944         set_nt_mirroring(PPU_MIRROR_VERT);
1291412945         break;
1291512946         // mapper 232
1291612947      case CAMERICA_BF9096:
r18084r18085
1292212953         // mapper 243
1292312954      case SACHEN_74LS374_A:
1292412955         m_mmc_vrom_bank[0] = 3;
12925         chr8(machine(), 3, CHRROM);
12926         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12956         chr8(3, CHRROM);
12957         set_nt_mirroring(PPU_MIRROR_VERT);
1292712958         break;
1292812959
1292912960         // mapper 246
1293012961      case CNE_FSB:
12931         prg32(machine(), 0xff);
12962         prg32(0xff);
1293212963         break;
1293312964         // mapper 249
1293412965      case WAIXING_SECURITY:
r18084r18085
1294412975
1294512976         // mapper 255
1294612977      case BMC_110IN1:
12947         prg16_89ab(machine(), 0);
12948         prg16_cdef(machine(), 1);
12949         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12978         prg16_89ab(0);
12979         prg16_cdef(1);
12980         set_nt_mirroring(PPU_MIRROR_VERT);
1295012981         break;
1295112982
1295212983         // UNIF only
r18084r18085
1295512986         m_mmc_reg[1] = 0x43;
1295612987         m_mmc_reg[2] = m_mmc_reg[3] = 0;
1295712988         bmc_64in1nr_set_prg(machine());
12958         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12989         set_nt_mirroring(PPU_MIRROR_VERT);
1295912990         break;
1296012991      case BMC_190IN1:
12961         prg16_89ab(machine(), 0);
12962         prg16_cdef(machine(), 0);
12992         prg16_89ab(0);
12993         prg16_cdef(0);
1296312994         break;
1296412995      case BMC_A65AS:
12965         prg16_89ab(machine(), 0);
12966         prg16_cdef(machine(), 7);
12967         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
12996         prg16_89ab(0);
12997         prg16_cdef(7);
12998         set_nt_mirroring(PPU_MIRROR_VERT);
1296812999         break;
1296913000      case BMC_GS2004:
1297013001      case BMC_GS2013:
12971         prg32(machine(), 0xff);
13002         prg32(0xff);
1297213003         break;
1297313004      case BMC_S24IN1SC03:
1297413005         m_mmc_reg[0] = 0x24;
r18084r18085
1297913010      case BMC_T262:
1298013011         m_mmc_latch1 = 0;
1298113012         m_mmc_latch2 = 0;
12982         prg16_89ab(machine(), 0);
12983         prg16_cdef(machine(), 7);
13013         prg16_89ab(0);
13014         prg16_cdef(7);
1298413015         break;
1298513016      case DREAMTECH_BOARD:
12986         prg16_89ab(machine(), 0);
12987         prg16_cdef(machine(), 8);
13017         prg16_89ab(0);
13018         prg16_cdef(8);
1298813019         break;
1298913020      case UNL_8237:
1299013021         m_mmc_reg[0] = m_mmc_reg[1] = m_mmc_reg[2] = 0;
r18084r18085
1299313024      case UNL_AX5705:
1299413025         m_mmc_prg_bank[0] = 0;
1299513026         m_mmc_prg_bank[1] = 1;
12996         prg8_89(machine(), m_mmc_prg_bank[0]);
12997         prg8_ab(machine(), m_mmc_prg_bank[1]);
12998         prg8_cd(machine(), 0xfe);
12999         prg8_ef(machine(), 0xff);
13027         prg8_89(m_mmc_prg_bank[0]);
13028         prg8_ab(m_mmc_prg_bank[1]);
13029         prg8_cd(0xfe);
13030         prg8_ef(0xff);
1300013031         break;
1300113032      case UNL_RACERMATE:
13002         chr4_0(machine(), 0, m_mmc_chr_source);
13003         chr4_4(machine(), 0, m_mmc_chr_source);
13004         prg16_89ab(machine(), 0);
13005         prg16_cdef(machine(), m_prg_chunks - 1);
13033         chr4_0(0, m_mmc_chr_source);
13034         chr4_4(0, m_mmc_chr_source);
13035         prg16_89ab(0);
13036         prg16_cdef(m_prg_chunks - 1);
1300613037         break;
1300713038
1300813039      case BMC_BENSHENG_BS5:
r18084r18085
1301413045         break;
1301513046
1301613047      case BMC_810544:
13017         prg16_89ab(machine(), 0);
13018         prg16_cdef(machine(), 0);
13019         set_nt_mirroring(machine(), PPU_MIRROR_VERT);
13048         prg16_89ab(0);
13049         prg16_cdef(0);
13050         set_nt_mirroring(PPU_MIRROR_VERT);
1302013051         break;
1302113052
1302213053      case BMC_G63IN1:
r18084r18085
1304313074
1304413075
1304513076      case FFE_MAPPER6:
13046         prg16_89ab(machine(), 0);
13047         prg16_cdef(machine(), 7);
13077         prg16_89ab(0);
13078         prg16_cdef(7);
1304813079         break;
1304913080      case FFE_MAPPER8:
13050         prg32(machine(), 0);
13081         prg32(0);
1305113082         break;
1305213083      case FFE_MAPPER17:
13053         prg16_89ab(machine(), 0);
13054         prg16_cdef(machine(), m_prg_chunks - 1);
13084         prg16_89ab(0);
13085         prg16_cdef(m_prg_chunks - 1);
1305513086         break;
1305613087
1305713088      case UNSUPPORTED_BOARD:
trunk/src/mess/machine/nes_mmc.c
r18084r18085
235235
236236*************************************************************/
237237
238static void wram_bank( running_machine &machine, int bank, int source )
238void nes_carts_state::wram_bank(int bank, int source)
239239{
240   nes_state *state = machine.driver_data<nes_state>();
241
242   assert(state->m_battery || state->m_prg_ram);
240   assert(m_battery || m_prg_ram);
243241   if (source == NES_BATTERY)
244242   {
245      bank &= (state->m_battery_size / 0x2000) - 1;
246      state->m_prg_bank[4] = state->m_battery_bank5_start + bank;
243      bank &= (m_battery_size / 0x2000) - 1;
244      m_prg_bank[4] = m_battery_bank5_start + bank;
247245   }
248246   else
249247   {
250      bank &= (state->m_wram_size / 0x2000) - 1;
251      state->m_prg_bank[4] = state->m_prgram_bank5_start + bank;
248      bank &= (m_wram_size / 0x2000) - 1;
249      m_prg_bank[4] = m_prgram_bank5_start + bank;
252250   }
253   state->membank("bank5")->set_entry(state->m_prg_bank[4]);
251   membank("bank5")->set_entry(m_prg_bank[4]);
254252}
255253
256254INLINE void prg_bank_refresh( running_machine &machine )
r18084r18085
264262
265263/* PRG ROM in 8K, 16K or 32K blocks */
266264
267static void prg32( running_machine &machine, int bank )
265void nes_carts_state::prg32(int bank)
268266{
269   nes_state *state = machine.driver_data<nes_state>();
270
271267   /* if there is only 16k PRG, return */
272   if (!(state->m_prg_chunks >> 1))
268   if (!(m_prg_chunks >> 1))
273269      return;
274270
275271   /* assumes that bank references a 32k chunk */
276   bank &= ((state->m_prg_chunks >> 1) - 1);
272   bank &= ((m_prg_chunks >> 1) - 1);
277273
278   state->m_prg_bank[0] = bank * 4 + 0;
279   state->m_prg_bank[1] = bank * 4 + 1;
280   state->m_prg_bank[2] = bank * 4 + 2;
281   state->m_prg_bank[3] = bank * 4 + 3;
282   prg_bank_refresh(machine);
274   m_prg_bank[0] = bank * 4 + 0;
275   m_prg_bank[1] = bank * 4 + 1;
276   m_prg_bank[2] = bank * 4 + 2;
277   m_prg_bank[3] = bank * 4 + 3;
278   prg_bank_refresh(machine());
283279}
284280
285static void prg16_89ab( running_machine &machine, int bank )
281void nes_carts_state::prg16_89ab(int bank)
286282{
287   nes_state *state = machine.driver_data<nes_state>();
288
289283   /* assumes that bank references a 16k chunk */
290   bank &= (state->m_prg_chunks - 1);
284   bank &= (m_prg_chunks - 1);
291285
292   state->m_prg_bank[0] = bank * 2 + 0;
293   state->m_prg_bank[1] = bank * 2 + 1;
294   prg_bank_refresh(machine);
286   m_prg_bank[0] = bank * 2 + 0;
287   m_prg_bank[1] = bank * 2 + 1;
288   prg_bank_refresh(machine());
295289}
296290
297static void prg16_cdef( running_machine &machine, int bank )
291void nes_carts_state::prg16_cdef(int bank)
298292{
299   nes_state *state = machine.driver_data<nes_state>();
300
301293   /* assumes that bank references a 16k chunk */
302   bank &= (state->m_prg_chunks - 1);
294   bank &= (m_prg_chunks - 1);
303295
304   state->m_prg_bank[2] = bank * 2 + 0;
305   state->m_prg_bank[3] = bank * 2 + 1;
306   prg_bank_refresh(machine);
296   m_prg_bank[2] = bank * 2 + 0;
297   m_prg_bank[3] = bank * 2 + 1;
298   prg_bank_refresh(machine());
307299}
308300
309static void prg8_89( running_machine &machine, int bank )
301void nes_carts_state::prg8_89(int bank)
310302{
311   nes_state *state = machine.driver_data<nes_state>();
312
313303   /* assumes that bank references an 8k chunk */
314   bank &= ((state->m_prg_chunks << 1) - 1);
304   bank &= ((m_prg_chunks << 1) - 1);
315305
316   state->m_prg_bank[0] = bank;
317   prg_bank_refresh(machine);
306   m_prg_bank[0] = bank;
307   prg_bank_refresh(machine());
318308}
319309
320static void prg8_ab( running_machine &machine, int bank )
310void nes_carts_state::prg8_ab(int bank)
321311{
322   nes_state *state = machine.driver_data<nes_state>();
323
324312   /* assumes that bank references an 8k chunk */
325   bank &= ((state->m_prg_chunks << 1) - 1);
313   bank &= ((m_prg_chunks << 1) - 1);
326314
327   state->m_prg_bank[1] = bank;
328   prg_bank_refresh(machine);
315   m_prg_bank[1] = bank;
316   prg_bank_refresh(machine());
329317}
330318
331static void prg8_cd( running_machine &machine, int bank )
319void nes_carts_state::prg8_cd(int bank)
332320{
333   nes_state *state = machine.driver_data<nes_state>();
334
335321   /* assumes that bank references an 8k chunk */
336   bank &= ((state->m_prg_chunks << 1) - 1);
322   bank &= ((m_prg_chunks << 1) - 1);
337323
338   state->m_prg_bank[2] = bank;
339   prg_bank_refresh(machine);
324   m_prg_bank[2] = bank;
325   prg_bank_refresh(machine());
340326}
341327
342static void prg8_ef( running_machine &machine, int bank )
328void nes_carts_state::prg8_ef(int bank)
343329{
344   nes_state *state = machine.driver_data<nes_state>();
345
346330   /* assumes that bank references an 8k chunk */
347   bank &= ((state->m_prg_chunks << 1) - 1);
331   bank &= ((m_prg_chunks << 1) - 1);
348332
349   state->m_prg_bank[3] = bank;
350   prg_bank_refresh(machine);
333   m_prg_bank[3] = bank;
334   prg_bank_refresh(machine());
351335}
352336
353337/* We define an additional helper to map PRG-ROM to 0x6000-0x7000 */
354338// TODO: are we implementing this correctly in the mappers which uses it? check!
355339
356static void prg8_67( running_machine &machine, int bank )
340void nes_carts_state::prg8_67(int bank)
357341{
358   nes_state *state = machine.driver_data<nes_state>();
359
360342   /* assumes that bank references an 8k chunk */
361   bank &= ((state->m_prg_chunks << 1) - 1);
343   bank &= ((m_prg_chunks << 1) - 1);
362344
363   state->m_prg_bank[4] = bank;
364   state->membank("bank5")->set_entry(state->m_prg_bank[4]);
345   m_prg_bank[4] = bank;
346   membank("bank5")->set_entry(m_prg_bank[4]);
365347}
366348
367349/* We also define an additional helper to map 8k PRG-ROM to one of the banks (passed as parameter) */
368static void prg8_x( running_machine &machine, int start, int bank )
350void nes_carts_state::prg8_x(int start, int bank)
369351{
370   nes_state *state = machine.driver_data<nes_state>();
371
372352   assert(start < 4);
373353
374354   /* assumes that bank references an 8k chunk */
375   bank &= ((state->m_prg_chunks << 1) - 1);
355   bank &= ((m_prg_chunks << 1) - 1);
376356
377   state->m_prg_bank[start] = bank;
378   prg_bank_refresh(machine);
357   m_prg_bank[start] = bank;
358   prg_bank_refresh(machine());
379359}
380360
381361/* CHR ROM in 1K, 2K, 4K or 8K blocks */
r18084r18085
392372      fatalerror("CHRROM bankswitch with no VROM\n");
393373}
394374
395static void chr8( running_machine &machine, int bank, int source )
375void nes_carts_state::chr8(int bank, int source)
396376{
397   nes_state *state = machine.driver_data<nes_state>();
398   int i;
377   chr_sanity_check(machine(), source);
399378
400   chr_sanity_check(machine, source);
401
402379   if (source == CHRRAM)
403380   {
404      bank &= (state->m_vram_chunks - 1);
405      for (i = 0; i < 8; i++)
381      bank &= (m_vram_chunks - 1);
382      for (int i = 0; i < 8; i++)
406383      {
407         state->m_chr_map[i].source = source;
408         state->m_chr_map[i].origin = (bank * 0x2000) + (i * 0x400); // for save state uses!
409         state->m_chr_map[i].access = &state->m_vram[state->m_chr_map[i].origin];
384         m_chr_map[i].source = source;
385         m_chr_map[i].origin = (bank * 0x2000) + (i * 0x400); // for save state uses!
386         m_chr_map[i].access = &m_vram[m_chr_map[i].origin];
410387      }
411388   }
412389   else
413390   {
414      bank &= (state->m_chr_chunks - 1);
415      for (i = 0; i < 8; i++)
391      bank &= (m_chr_chunks - 1);
392      for (int i = 0; i < 8; i++)
416393      {
417         state->m_chr_map[i].source = source;
418         state->m_chr_map[i].origin = (bank * 0x2000) + (i * 0x400); // for save state uses!
419         state->m_chr_map[i].access = &state->m_vrom[state->m_chr_map[i].origin];
394         m_chr_map[i].source = source;
395         m_chr_map[i].origin = (bank * 0x2000) + (i * 0x400); // for save state uses!
396         m_chr_map[i].access = &m_vrom[m_chr_map[i].origin];
420397      }
421398   }
422399}
423400
424static void chr4_x( running_machine &machine, int start, int bank, int source )
401void nes_carts_state::chr4_x(int start, int bank, int source)
425402{
426   nes_state *state = machine.driver_data<nes_state>();
427   int i;
403   chr_sanity_check(machine(), source);
428404
429   chr_sanity_check(machine, source);
430
431405   if (source == CHRRAM)
432406   {
433      bank &= ((state->m_vram_chunks << 1) - 1);
434      for (i = 0; i < 4; i++)
407      bank &= ((m_vram_chunks << 1) - 1);
408      for (int i = 0; i < 4; i++)
435409      {
436         state->m_chr_map[i + start].source = source;
437         state->m_chr_map[i + start].origin = (bank * 0x1000) + (i * 0x400); // for save state uses!
438         state->m_chr_map[i + start].access = &state->m_vram[state->m_chr_map[i + start].origin];
410         m_chr_map[i + start].source = source;
411         m_chr_map[i + start].origin = (bank * 0x1000) + (i * 0x400); // for save state uses!
412         m_chr_map[i + start].access = &m_vram[m_chr_map[i + start].origin];
439413      }
440414   }
441415   else
442416   {
443      bank &= ((state->m_chr_chunks << 1) - 1);
444      for (i = 0; i < 4; i++)
417      bank &= ((m_chr_chunks << 1) - 1);
418      for (int i = 0; i < 4; i++)
445419      {
446         state->m_chr_map[i + start].source = source;
447         state->m_chr_map[i + start].origin = (bank * 0x1000) + (i * 0x400); // for save state uses!
448         state->m_chr_map[i + start].access = &state->m_vrom[state->m_chr_map[i + start].origin];
420         m_chr_map[i + start].source = source;
421         m_chr_map[i + start].origin = (bank * 0x1000) + (i * 0x400); // for save state uses!
422         m_chr_map[i + start].access = &m_vrom[m_chr_map[i + start].origin];
449423      }
450424   }
451425}
452426
453static void chr4_0( running_machine &machine, int bank, int source )
427void nes_carts_state::chr2_x(int start, int bank, int source)
454428{
455   chr4_x(machine, 0, bank, source);
456}
429   chr_sanity_check(machine(), source);
457430
458static void chr4_4( running_machine &machine, int bank, int source )
459{
460   chr4_x(machine, 4, bank, source);
461}
462
463static void chr2_x( running_machine &machine, int start, int bank, int source )
464{
465   nes_state *state = machine.driver_data<nes_state>();
466   int i;
467
468   chr_sanity_check(machine, source);
469
470431   if (source == CHRRAM)
471432   {
472      bank &= ((state->m_vram_chunks << 2) - 1);
473      for (i = 0; i < 2; i++)
433      bank &= ((m_vram_chunks << 2) - 1);
434      for (int i = 0; i < 2; i++)
474435      {
475         state->m_chr_map[i + start].source = source;
476         state->m_chr_map[i + start].origin = (bank * 0x800) + (i * 0x400); // for save state uses!
477         state->m_chr_map[i + start].access = &state->m_vram[state->m_chr_map[i + start].origin];
436         m_chr_map[i + start].source = source;
437         m_chr_map[i + start].origin = (bank * 0x800) + (i * 0x400); // for save state uses!
438         m_chr_map[i + start].access = &m_vram[m_chr_map[i + start].origin];
478439      }
479440   }
480441   else
481442   {
482      bank &= ((state->m_chr_chunks << 2) - 1);
483      for (i = 0; i < 2; i++)
443      bank &= ((m_chr_chunks << 2) - 1);
444      for (int i = 0; i < 2; i++)
484445      {
485         state->m_chr_map[i + start].source = source;
486         state->m_chr_map[i + start].origin = (bank * 0x800) + (i * 0x400); // for save state uses!
487         state->m_chr_map[i + start].access = &state->m_vrom[state->m_chr_map[i + start].origin];
446         m_chr_map[i + start].source = source;
447         m_chr_map[i + start].origin = (bank * 0x800) + (i * 0x400); // for save state uses!
448         m_chr_map[i + start].access = &m_vrom[m_chr_map[i + start].origin];
488449      }
489450   }
490451}
491452
492static void chr2_0( running_machine &machine, int bank, int source )
453void nes_carts_state::chr1_x(int start, int bank, int source)
493454{
494   chr2_x(machine, 0, bank, source);
495}
455   chr_sanity_check(machine(), source);
496456
497static void chr2_2( running_machine &machine, int bank, int source )
498{
499   chr2_x(machine, 2, bank, source);
500}
501
502static void chr2_4( running_machine &machine, int bank, int source )
503{
504   chr2_x(machine, 4, bank, source);
505}
506
507static void chr2_6( running_machine &machine, int bank, int source )
508{
509   chr2_x(machine, 6, bank, source);
510}
511
512static void chr1_x( running_machine &machine, int start, int bank, int source )
513{
514   nes_state *state = machine.driver_data<nes_state>();
515
516   chr_sanity_check(machine, source);
517
518457   if (source == CHRRAM)
519458   {
520      bank &= ((state->m_vram_chunks << 3) - 1);
521      state->m_chr_map[start].source = source;
522      state->m_chr_map[start].origin = (bank * 0x400); // for save state uses!
523      state->m_chr_map[start].access = &state->m_vram[state->m_chr_map[start].origin];
459      bank &= ((m_vram_chunks << 3) - 1);
460      m_chr_map[start].source = source;
461      m_chr_map[start].origin = (bank * 0x400); // for save state uses!
462      m_chr_map[start].access = &m_vram[m_chr_map[start].origin];
524463   }
525464   else
526465   {
527      bank &= ((state->m_chr_chunks << 3) - 1);
528      state->m_chr_map[start].source = source;
529      state->m_chr_map[start].origin = (bank * 0x400); // for save state uses!
530      state->m_chr_map[start].access = &state->m_vrom[state->m_chr_map[start].origin];
466      bank &= ((m_chr_chunks << 3) - 1);
467      m_chr_map[start].source = source;
468      m_chr_map[start].origin = (bank * 0x400); // for save state uses!
469      m_chr_map[start].access = &m_vrom[m_chr_map[start].origin];
531470   }
532471}
533472
534static void chr1_0 (running_machine &machine, int bank, int source)
535{
536   chr1_x(machine, 0, bank, source);
537}
538473
539static void chr1_1( running_machine &machine, int bank, int source )
540{
541   chr1_x(machine, 1, bank, source);
542}
543
544static void chr1_2( running_machine &machine, int bank, int source )
545{
546   chr1_x(machine, 2, bank, source);
547}
548
549static void chr1_3( running_machine &machine, int bank, int source )
550{
551   chr1_x(machine, 3, bank, source);
552}
553
554static void chr1_4( running_machine &machine, int bank, int source )
555{
556   chr1_x(machine, 4, bank, source);
557}
558
559static void chr1_5( running_machine &machine, int bank, int source )
560{
561   chr1_x(machine, 5, bank, source);
562}
563
564static void chr1_6( running_machine &machine, int bank, int source )
565{
566   chr1_x(machine, 6, bank, source);
567}
568
569static void chr1_7( running_machine &machine, int bank, int source )
570{
571   chr1_x(machine, 7, bank, source);
572}
573
574
575474/* NameTable paging and mirroring */
576475
577static void set_nt_page( running_machine &machine, int page, int source, int bank, int writable )
476void nes_carts_state::set_nt_page(int page, int source, int bank, int writable)
578477{
579   nes_state *state = machine.driver_data<nes_state>();
580478   UINT8* base_ptr;
581479
582480   switch (source)
583481   {
584482      case CART_NTRAM:
585         base_ptr = state->m_extended_ntram;
483         base_ptr = m_extended_ntram;
586484         break;
587485      case MMC5FILL:
588486         base_ptr = NULL;
589487         break;
590488      case ROM:
591         base_ptr = state->m_vrom;
489         base_ptr = m_vrom;
592490         break;
593491      case EXRAM:
594         base_ptr = state->m_mapper_ram;
492         base_ptr = m_mapper_ram;
595493         break;
596494      case CIRAM:
597495      default:
598         base_ptr = state->m_ciram;
496         base_ptr = m_ciram;
599497         break;
600498   }
601499
602500   page &= 3; /* mask down to the 4 logical pages */
603   state->m_nt_page[page].source = source;
501   m_nt_page[page].source = source;
604502
605503   if (base_ptr != NULL)
606504   {
607      state->m_nt_page[page].origin = bank * 0x400;
608      state->m_nt_page[page].access = base_ptr + state->m_nt_page[page].origin;
505      m_nt_page[page].origin = bank * 0x400;
506      m_nt_page[page].access = base_ptr + m_nt_page[page].origin;
609507   }
610508
611   state->m_nt_page[page].writable = writable;
509   m_nt_page[page].writable = writable;
612510}
613511
614void set_nt_mirroring( running_machine &machine, int mirroring )
512void nes_carts_state::set_nt_mirroring(int mirroring)
615513{
616514   /* setup our videomem handlers based on mirroring */
617515   switch (mirroring)
618516   {
619517      case PPU_MIRROR_VERT:
620         set_nt_page(machine, 0, CIRAM, 0, 1);
621         set_nt_page(machine, 1, CIRAM, 1, 1);
622         set_nt_page(machine, 2, CIRAM, 0, 1);
623         set_nt_page(machine, 3, CIRAM, 1, 1);
518         set_nt_page(0, CIRAM, 0, 1);
519         set_nt_page(1, CIRAM, 1, 1);
520         set_nt_page(2, CIRAM, 0, 1);
521         set_nt_page(3, CIRAM, 1, 1);
624522         break;
625523
626524      case PPU_MIRROR_HORZ:
627         set_nt_page(machine, 0, CIRAM, 0, 1);
628         set_nt_page(machine, 1, CIRAM, 0, 1);
629         set_nt_page(machine, 2, CIRAM, 1, 1);
630         set_nt_page(machine, 3, CIRAM, 1, 1);
525         set_nt_page(0, CIRAM, 0, 1);
526         set_nt_page(1, CIRAM, 0, 1);
527         set_nt_page(2, CIRAM, 1, 1);
528         set_nt_page(3, CIRAM, 1, 1);
631529         break;
632530
633531      case PPU_MIRROR_HIGH:
634         set_nt_page(machine, 0, CIRAM, 1, 1);
635         set_nt_page(machine, 1, CIRAM, 1, 1);
636         set_nt_page(machine, 2, CIRAM, 1, 1);
637         set_nt_page(machine, 3, CIRAM, 1, 1);
532         set_nt_page(0, CIRAM, 1, 1);
533         set_nt_page(1, CIRAM, 1, 1);
534         set_nt_page(2, CIRAM, 1, 1);
535         set_nt_page(3, CIRAM, 1, 1);
638536         break;
639537
640538      case PPU_MIRROR_LOW:
641         set_nt_page(machine, 0, CIRAM, 0, 1);
642         set_nt_page(machine, 1, CIRAM, 0, 1);
643         set_nt_page(machine, 2, CIRAM, 0, 1);
644         set_nt_page(machine, 3, CIRAM, 0, 1);
539         set_nt_page(0, CIRAM, 0, 1);
540         set_nt_page(1, CIRAM, 0, 1);
541         set_nt_page(2, CIRAM, 0, 1);
542         set_nt_page(3, CIRAM, 0, 1);
645543         break;
646544
647545      case PPU_MIRROR_NONE:
r18084r18085
653551
654552         logerror("Mapper set 4-screen mirroring without supplying external nametable memory!\n");
655553
656         set_nt_page(machine, 0, CIRAM, 0, 1);
657         set_nt_page(machine, 1, CIRAM, 0, 1);
658         set_nt_page(machine, 2, CIRAM, 1, 1);
659         set_nt_page(machine, 3, CIRAM, 1, 1);
554         set_nt_page(0, CIRAM, 0, 1);
555         set_nt_page(1, CIRAM, 0, 1);
556         set_nt_page(2, CIRAM, 1, 1);
557         set_nt_page(3, CIRAM, 1, 1);
660558         break;
661559   }
662560}
trunk/src/mess/machine/nes.c
r18084r18085
140140   }
141141
142142   if (m_four_screen_vram)
143      set_nt_mirroring(machine(), PPU_MIRROR_4SCREEN);
143      set_nt_mirroring(PPU_MIRROR_4SCREEN);
144144   else
145145   {
146146      switch (m_hard_mirroring)
r18084r18085
149149         case PPU_MIRROR_VERT:
150150         case PPU_MIRROR_HIGH:
151151         case PPU_MIRROR_LOW:
152            set_nt_mirroring(machine(), m_hard_mirroring);
152            set_nt_mirroring(m_hard_mirroring);
153153            break;
154154         default:
155            set_nt_mirroring(machine(), PPU_MIRROR_NONE);
155            set_nt_mirroring(PPU_MIRROR_NONE);
156156            break;
157157      }
158158   }
r18084r18085
16331633            m_fds_head_position = 0;
16341634
16351635         m_fds_read_mode = BIT(data, 2);
1636         set_nt_mirroring(machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
1636         set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
16371637
16381638         if ((!(data & 0x40)) && (m_fds_write_reg & 0x40))
16391639            m_fds_head_position -= 2; // ???
trunk/src/mess/includes/nes.h
r18084r18085
6767   void init_nes_core();
6868   void pcb_handlers_setup();
6969   int pcb_initialize(int idx);
70   
70
7171   DECLARE_WRITE8_MEMBER(nes_chr_w);
7272   DECLARE_READ8_MEMBER(nes_chr_r);
7373   DECLARE_WRITE8_MEMBER(nes_nt_w);
r18084r18085
8282   read8_delegate    m_mmc_read_low;
8383   read8_delegate    m_mmc_read_mid;
8484   read8_delegate    m_mmc_read;
85   
85
8686   /* devices */
87//   cpu_device        *m_maincpu;
88//   ppu2c0x_device    *m_ppu;
89//   device_t          *m_sound;
87//  cpu_device        *m_maincpu;
88//  ppu2c0x_device    *m_ppu;
89//  device_t          *m_sound;
9090   device_t          *m_cart;
91//   emu_timer         *m_irq_timer;
92   
93   /* misc region to be allocated at init */
94   // variables which don't change at run-time
95   UINT8      *m_rom;
96   UINT8      *m_prg;
97   UINT8      *m_vrom;
98   UINT8      *m_vram;
99   UINT8      *m_ciram; //PPU nametable RAM - external to PPU!   
100   
91//  emu_timer         *m_irq_timer;
92
10193   /***** FDS-floppy related *****/
10294
10395   int     m_disk_expansion;
trunk/src/mess/includes/nes_mmc.h
r18084r18085
152152public:
153153   nes_carts_state(const machine_config &mconfig, device_type type, const char *tag)
154154   : driver_device(mconfig, type, tag) { }
155   
155
156156   int           m_prg_bank[5];
157157   chr_bank      m_chr_map[8];  //quick banking structure, because some of this changes multiple times per scanline!
158158   name_table    m_nt_page[4];  //quick banking structure for a maximum of 4K of RAM/ROM/ExRAM
159   
159
160160   nes_prg_callback    m_mmc3_prg_cb;   // these are used to simplify a lot emulation of some MMC3 pirate clones
161161   nes_chr_callback    m_mmc3_chr_cb;
162   
162
163   // mapper variables (to be sorted out at some point, to split more complex mappers as separate devices)
163164   int m_chr_open_bus;
164165   int m_prgram_bank5_start, m_battery_bank5_start, m_empty_bank5_start;
165   
166
166167   UINT8 m_ce_mask, m_ce_state;
167168   UINT8 m_vrc_ls_prg_a, m_vrc_ls_prg_b, m_vrc_ls_chr;
168   
169
169170   int m_MMC5_floodtile;
170171   int m_MMC5_floodattr;
171172   int m_mmc5_vram_control;
172173   UINT8 m_mmc5_high_chr;
173174   UINT8 m_mmc5_split_scr;
174175   UINT8 *m_extended_ntram;
175   
176
176177   UINT8 m_mmc5_last_chr_a;
177178   UINT16 m_mmc5_vrom_regA[8];
178179   UINT16 m_mmc5_vrom_regB[4];
r18084r18085
184185   UINT8 m_mmc5_split_ctrl;
185186   UINT8 m_mmc5_split_yst;
186187   UINT8 m_mmc5_split_bank;
187   
188
188189   /***** Mapper-related variables *****/
189   
190
190191   // common ones
191192   int        m_IRQ_enable, m_IRQ_enable_latch;
192193   UINT16     m_IRQ_count, m_IRQ_count_latch;
r18084r18085
196197   UINT8      m_IRQ_mode;
197198   UINT8      m_IRQ_clear;
198199   int        m_mult1, m_mult2;
199   
200
200201   UINT8 m_mmc_chr_source;         // This is set at init to CHRROM or CHRRAM. a few mappers can swap between
201202   // the two (this is done in the specific handlers).
202   
203
203204   UINT8 m_mmc_cmd1, m_mmc_cmd2;      // These represent registers where the mapper writes important values
204205   UINT8 m_mmc_count;            // This is used as counter in mappers like 1 and 45
205   
206
206207   int m_mmc_prg_base, m_mmc_prg_mask;   // MMC3 based multigame carts select a block of banks by using these (and then act like normal MMC3),
207208   int m_mmc_chr_base, m_mmc_chr_mask;   // while MMC3 and clones (mapper 118 & 119) simply set them as 0 and 0xff resp.
208   
209
209210   UINT8 m_mmc_prg_bank[6];            // Many mappers writes only some bits of the selected bank (for both PRG and CHR),
210211   UINT8 m_mmc_vrom_bank[16];         // hence these are handy to latch bank values.
211   
212
212213   UINT16 m_MMC5_vrom_bank[12];         // MMC5 has 10bit wide VROM regs!
213214   UINT8 m_mmc_extra_bank[16];         // some MMC3 clone have 2 series of PRG/CHR banks...
214215   // we collect them all here: first 4 elements PRG banks, then 6/8 CHR banks
215   
216
216217   UINT8 m_mmc_latch1, m_mmc_latch2;
217218   UINT8 m_mmc_reg[16];
218   
219
219220   UINT8 m_mmc_dipsetting;
220   
221
221222   // misc mapper related variables which should be merged with the above one, where possible
222223   int m_mmc1_reg_write_enable;
223224   int m_mmc1_latch;
224225   int m_mmc1_count;
225   
226
226227   int m_mmc3_latch;
227228   int m_mmc3_wram_protect;
228229   int m_mmc3_alt_irq;
229   
230
230231   int m_MMC5_rom_bank_mode;
231232   int m_MMC5_vrom_bank_mode;
232233   int m_MMC5_vram_protect;
r18084r18085
234235   int m_vrom_page_a;
235236   int m_vrom_page_b;
236237   // int vrom_next[4];
237   
238
238239   UINT8 m_mmc6_reg;
239   
240
240241   // these might be unified in single mmc_reg[] array, together with state->m_mmc_cmd1 & state->m_mmc_cmd2
241242   // but be careful that MMC3 clones often use state->m_mmc_cmd1/state->m_mmc_cmd2 (from base MMC3) AND additional regs below!
242243   UINT8 m_mapper83_reg[10];
r18084r18085
246247   UINT8 m_sachen_reg[8];   // used by mappers 137, 138, 139 & 141
247248   UINT8 m_map52_reg_written;
248249   UINT8 m_map114_reg, m_map114_reg_enabled;
249   
250
250251   // i/o handlers
251252   DECLARE_WRITE8_MEMBER(mapper6_l_w);
252253   DECLARE_WRITE8_MEMBER(mapper6_w);
r18084r18085
522523   DECLARE_WRITE8_MEMBER(dummy_w);
523524   DECLARE_READ8_MEMBER(dummy_l_r);
524525   DECLARE_READ8_MEMBER(dummy_m_r);
525   DECLARE_READ8_MEMBER(dummy_r);   
526   
526   DECLARE_READ8_MEMBER(dummy_r);
527
528   /* misc region to be allocated at init */
529   // variables which don't change at run-time
530   UINT8      *m_rom;
531   UINT8      *m_prg;
532   UINT8      *m_vrom;
533   UINT8      *m_vram;
534   UINT8      *m_ciram; //PPU nametable RAM - external to PPU!
535
527536   UINT8      *m_wram;
528537   UINT8      *m_battery_ram;
529538   UINT8      *m_mapper_ram;
530539   UINT8      *m_mapper_bram;
531540   UINT32      m_mapper_ram_size;
532541   UINT32      m_mapper_bram_size;
533   
542
534543   /* load-time cart variables which remain constant */
535544   UINT16 m_prg_chunks;      // iNES 2.0 allows for more chunks (a recently dumped multigame cart has 256 chunks of both PRG & CHR!)
536545   UINT16 m_chr_chunks;
r18084r18085
540549   UINT32 m_battery_size;
541550   UINT8 m_prg_ram;         // if there is PRG RAM with no backup
542551   UINT32 m_wram_size;
543   
552
544553   /* system variables which don't change at run-time */
545554   UINT16 m_mapper;      // for iNES
546555   UINT16 m_pcb_id;      // for UNIF & xml
r18084r18085
556565   cpu_device        *m_maincpu;
557566   ppu2c0x_device    *m_ppu;
558567   device_t          *m_sound;
559   emu_timer         *m_irq_timer;   
568   emu_timer         *m_irq_timer;
569
570//private:
571
572   // banking helpers
573   // WRAM bankswitch
574   void wram_bank(int bank, int source);
575   // PRG bankswitch
576   void prg32(int bank);
577   void prg16_89ab(int bank);
578   void prg16_cdef(int bank);
579   void prg8_89(int bank);
580   void prg8_ab(int bank);
581   void prg8_cd(int bank);
582   void prg8_ef(int bank);
583   void prg8_67(int bank);   // a bunch of pcbs can bank ROM in WRAM area!
584   void prg8_x(int start, int bank);
585   // CHR 8k bankswitch
586   void chr8(int bank, int source);
587   // CHR 4k bankswitch
588   void chr4_x(int start, int bank, int source);
589   void chr4_0(int bank, int source){ chr4_x(0, bank, source); };
590   void chr4_4(int bank, int source){ chr4_x(4, bank, source); };
591   // CHR 2k bankswitch
592   void chr2_x(int start, int bank, int source);
593   void chr2_0(int bank, int source) { chr2_x(0, bank, source); };
594   void chr2_2(int bank, int source) { chr2_x(2, bank, source); };
595   void chr2_4(int bank, int source) { chr2_x(4, bank, source); };
596   void chr2_6(int bank, int source) { chr2_x(6, bank, source); };
597   // CHR 1k bankswitch
598   void chr1_x(int start, int bank, int source);
599   void chr1_0(int bank, int source) { chr1_x(0, bank, source); };
600   void chr1_1(int bank, int source) { chr1_x(1, bank, source); };
601   void chr1_2(int bank, int source) { chr1_x(2, bank, source); };
602   void chr1_3(int bank, int source) { chr1_x(3, bank, source); };
603   void chr1_4(int bank, int source) { chr1_x(4, bank, source); };
604   void chr1_5(int bank, int source) { chr1_x(5, bank, source); };
605   void chr1_6(int bank, int source) { chr1_x(6, bank, source); };
606   void chr1_7(int bank, int source) { chr1_x(7, bank, source); };
607   // NT bankswitch
608   void set_nt_page(int page, int source, int bank, int writable);
609   void set_nt_mirroring(int mirroring);
610
560611};
561612
562613

Previous 199869 Revisions Next


© 1997-2024 The MAME Team