Previous 199869 Revisions Next

r21046 Wednesday 13th February, 2013 at 20:50:54 UTC by Wilbert Pol
(MESS) msx.c: Reduce tagmap lookups (nw)
[src/mess/drivers]msx.c
[src/mess/includes]msx.h
[src/mess/machine]msx.c msx_slot.c

trunk/src/mess/machine/msx_slot.c
r21045r21046
3131static void msx_cpu_setbank (running_machine &machine, int page, UINT8 *mem)
3232{
3333   msx_state *state = machine.driver_data<msx_state>();
34   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
34   address_space &space = state->m_maincpu->space(AS_PROGRAM);
3535   switch (page)
3636   {
3737   case 1:
38      state->membank ("bank1")->set_base (mem);
38      state->m_bank1->set_base (mem);
3939      break;
4040   case 2:
41      state->membank ("bank2")->set_base (mem);
41      state->m_bank2->set_base (mem);
4242      break;
4343   case 3:
44      state->membank ("bank3")->set_base (mem);
44      state->m_bank3->set_base (mem);
4545      break;
4646   case 4:
47      state->membank ("bank4")->set_base (mem);
48      state->membank ("bank5")->set_base (mem + 0x1ff8);
47      state->m_bank4->set_base (mem);
48      state->m_bank5->set_base (mem + 0x1ff8);
4949      space.install_read_bank(0x7ff8, 0x7fff, "bank5");
5050      break;
5151   case 5:
52      state->membank ("bank6")->set_base (mem);
53      state->membank ("bank7")->set_base (mem + 0x1800);
52      state->m_bank6->set_base (mem);
53      state->m_bank7->set_base (mem + 0x1800);
5454      space.install_read_bank(0x9800, 0x9fff, "bank7");
5555      break;
5656   case 6:
57      state->membank ("bank8")->set_base (mem);
58      state->membank ("bank9")->set_base (mem + 0x1800);
57      state->m_bank8->set_base (mem);
58      state->m_bank9->set_base (mem + 0x1800);
5959      space.install_read_bank(0xb800, 0xbfff, "bank9");
6060      break;
6161   case 7:
62      state->membank ("bank10")->set_base (mem);
62      state->m_bank10->set_base (mem);
6363      break;
6464   case 8:
65      state->membank ("bank11")->set_base (mem);
65      state->m_bank11->set_base (mem);
6666      state->m_top_page = mem;
6767      break;
6868   }
r21045r21046
349349
350350static READ8_HANDLER (konami_scc_bank5)
351351{
352   msx_state *drvstate = space.machine().driver_data<msx_state>();
352353   if (offset & 0x80)
353354   {
354355      if ((offset & 0xff) >= 0xe0)
355356      {
356         return k051649_test_r (space.machine().device("k051649"), space, offset & 0xff);
357         return k051649_test_r(drvstate->m_k051649, space, offset & 0xff);
357358      }
358359      return 0xff;
359360   }
360361   else
361362   {
362      return k051649_waveform_r (space.machine().device("k051649"), space, offset & 0x7f);
363      return k051649_waveform_r(drvstate->m_k051649, space, offset & 0x7f);
363364   }
364365}
365366
r21045r21046
379380      msx_cpu_setbank (machine, 5, state->m_mem + state->m_banks[2] * 0x2000);
380381      msx_cpu_setbank (machine, 6, state->m_mem + state->m_banks[3] * 0x2000);
381382      if (state->m_cart.scc.active ) {
382         machine.device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x9800, 0x9fff, FUNC(konami_scc_bank5));
383         msx_state *drvstate = machine.driver_data<msx_state>();
384         drvstate->m_maincpu->space(AS_PROGRAM).install_legacy_read_handler(0x9800, 0x9fff, FUNC(konami_scc_bank5));
383385      } else {
384         machine.device("maincpu")->memory().space(AS_PROGRAM).install_read_bank(0x9800, 0x9fff,"bank7");
386         msx_state *drvstate = machine.driver_data<msx_state>();
387         drvstate->m_maincpu->space(AS_PROGRAM).install_read_bank(0x9800, 0x9fff,"bank7");
385388      }
386389      break;
387390   case 3:
r21045r21046
393396MSX_SLOT_WRITE(konami_scc)
394397{
395398   msx_state *drvstate = machine.driver_data<msx_state>();
396   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
399   address_space &space = drvstate->m_maincpu->space(AS_PROGRAM);
397400   if (addr >= 0x5000 && addr < 0x5800)
398401   {
399402      state->m_banks[0] = val & state->m_bank_mask;
r21045r21046
424427   }
425428   else if (state->m_cart.scc.active && addr >= 0x9800 && addr < 0xa000)
426429   {
427      device_t *k051649 = space.machine().device("k051649");
428430      int offset = addr & 0xff;
429431
430432      if (offset < 0x80)
431433      {
432         k051649_waveform_w (k051649, space, offset, val);
434         k051649_waveform_w (drvstate->m_k051649, space, offset, val);
433435      }
434436      else if (offset < 0xa0)
435437      {
436438         offset &= 0xf;
437439         if (offset < 0xa)
438440         {
439            k051649_frequency_w (k051649, space, offset, val);
441            k051649_frequency_w (drvstate->m_k051649, space, offset, val);
440442         }
441443         else if (offset < 0xf)
442444         {
443            k051649_volume_w (k051649, space, offset - 0xa, val);
445            k051649_volume_w (drvstate->m_k051649, space, offset - 0xa, val);
444446         }
445447         else
446448         {
447            k051649_keyonoff_w (k051649, space, 0, val);
449            k051649_keyonoff_w (drvstate->m_k051649, space, 0, val);
448450         }
449451      }
450452      else if (offset >= 0xe0)
451453      {
452         k051649_test_w (k051649, space, offset, val);
454         k051649_test_w (drvstate->m_k051649, space, offset, val);
453455      }
454456   }
455457   else if (addr >= 0xb000 && addr < 0xb800)
r21045r21046
12281230
12291231MSX_SLOT_RESET(diskrom)
12301232{
1231   device_t *fdc = machine.device("wd179x");
1232   wd17xx_reset(fdc);
1233   msx_state *drvstate = machine.driver_data<msx_state>();
1234   wd17xx_reset(drvstate->m_wd179x);
12331235}
12341236
12351237static READ8_HANDLER (msx_diskrom_page1_r)
12361238{
12371239   msx_state *state = space.machine().driver_data<msx_state>();
1238   device_t *fdc = space.machine().device("wd179x");
12391240   switch (offset)
12401241   {
1241   case 0: return wd17xx_status_r (fdc, space, 0);
1242   case 1: return wd17xx_track_r (fdc, space, 0);
1243   case 2: return wd17xx_sector_r (fdc, space, 0);
1244   case 3: return wd17xx_data_r (fdc, space, 0);
1242   case 0: return wd17xx_status_r (state->m_wd179x, space, 0);
1243   case 1: return wd17xx_track_r (state->m_wd179x, space, 0);
1244   case 2: return wd17xx_sector_r (state->m_wd179x, space, 0);
1245   case 3: return wd17xx_data_r (state->m_wd179x, space, 0);
12451246   case 7: return state->m_dsk_stat;
12461247   default:
12471248      return state->m_state[1]->m_mem[offset + 0x3ff8];
r21045r21046
12511252static READ8_HANDLER (msx_diskrom_page2_r)
12521253{
12531254   msx_state *state = space.machine().driver_data<msx_state>();
1254   device_t *fdc = space.machine().device("wd179x");
12551255   if (offset >= 0x7f8)
12561256   {
12571257      switch (offset)
12581258      {
12591259      case 0x7f8:
1260         return wd17xx_status_r (fdc, space, 0);
1260         return wd17xx_status_r (state->m_wd179x, space, 0);
12611261      case 0x7f9:
1262         return wd17xx_track_r (fdc, space, 0);
1262         return wd17xx_track_r (state->m_wd179x, space, 0);
12631263      case 0x7fa:
1264         return wd17xx_sector_r (fdc, space, 0);
1264         return wd17xx_sector_r (state->m_wd179x, space, 0);
12651265      case 0x7fb:
1266         return wd17xx_data_r (fdc, space, 0);
1266         return wd17xx_data_r (state->m_wd179x, space, 0);
12671267      case 0x7ff:
12681268         return state->m_dsk_stat;
12691269      default:
r21045r21046
12791279MSX_SLOT_MAP(diskrom)
12801280{
12811281   msx_state *drvstate = machine.driver_data<msx_state>();
1282   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
1282   address_space &space = drvstate->m_maincpu->space(AS_PROGRAM);
12831283   switch (page)
12841284   {
12851285   case 0:
r21045r21046
13051305
13061306MSX_SLOT_WRITE(diskrom)
13071307{
1308   device_t *fdc = machine.device("wd179x");
1309   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
1308   msx_state *drvstate = machine.driver_data<msx_state>();
1309   address_space &space = drvstate->m_maincpu->space(AS_PROGRAM);
13101310   if (addr >= 0xa000 && addr < 0xc000)
13111311   {
13121312      addr -= 0x4000;
r21045r21046
13141314   switch (addr)
13151315   {
13161316   case 0x7ff8:
1317      wd17xx_command_w (fdc, space, 0, val);
1317      wd17xx_command_w (drvstate->m_wd179x, space, 0, val);
13181318      break;
13191319   case 0x7ff9:
1320      wd17xx_track_w (fdc, space, 0, val);
1320      wd17xx_track_w (drvstate->m_wd179x, space, 0, val);
13211321      break;
13221322   case 0x7ffa:
1323      wd17xx_sector_w (fdc, space, 0, val);
1323      wd17xx_sector_w (drvstate->m_wd179x, space, 0, val);
13241324      break;
13251325   case 0x7ffb:
1326      wd17xx_data_w (fdc, space, 0, val);
1326      wd17xx_data_w (drvstate->m_wd179x, space, 0, val);
13271327      break;
13281328   case 0x7ffc:
1329      wd17xx_set_side (fdc,val & 1);
1329      wd17xx_set_side (drvstate->m_wd179x,val & 1);
13301330      state->m_mem[0x3ffc] = val | 0xfe;
13311331      break;
13321332   case 0x7ffd:
1333      wd17xx_set_drive (fdc,val & 1);
1333      wd17xx_set_drive (drvstate->m_wd179x,val & 1);
13341334      if ((state->m_mem[0x3ffd] ^ val) & 0x40)
13351335      {
13361336         set_led_status (machine, 0, !(val & 0x40));
r21045r21046
13571357
13581358MSX_SLOT_RESET(diskrom2)
13591359{
1360   device_t *fdc = machine.device("wd179x");
1361   wd17xx_reset (fdc);
1360   msx_state *drvstate = machine.driver_data<msx_state>();
1361   wd17xx_reset (drvstate->m_wd179x);
13621362}
13631363
13641364static READ8_HANDLER (msx_diskrom2_page1_r)
13651365{
13661366   msx_state *state = space.machine().driver_data<msx_state>();
1367   device_t *fdc = space.machine().device("wd179x");
13681367   switch (offset)
13691368   {
1370   case 0: return wd17xx_status_r(fdc, space, 0);
1371   case 1: return wd17xx_track_r(fdc, space, 0);
1372   case 2: return wd17xx_sector_r(fdc, space, 0);
1373   case 3: return wd17xx_data_r(fdc, space, 0);
1369   case 0: return wd17xx_status_r(state->m_wd179x, space, 0);
1370   case 1: return wd17xx_track_r(state->m_wd179x, space, 0);
1371   case 2: return wd17xx_sector_r(state->m_wd179x, space, 0);
1372   case 3: return wd17xx_data_r(state->m_wd179x, space, 0);
13741373   case 4: return state->m_dsk_stat;
13751374   default:
13761375      return state->m_state[1]->m_mem[offset + 0x3ff8];
r21045r21046
13801379static  READ8_HANDLER (msx_diskrom2_page2_r)
13811380{
13821381   msx_state *state = space.machine().driver_data<msx_state>();
1383   device_t *fdc = space.machine().device("wd179x");
13841382   if (offset >= 0x7b8)
13851383   {
13861384      switch (offset)
13871385      {
13881386      case 0x7b8:
1389         return wd17xx_status_r (fdc, space, 0);
1387         return wd17xx_status_r (state->m_wd179x, space, 0);
13901388      case 0x7b9:
1391         return wd17xx_track_r (fdc, space, 0);
1389         return wd17xx_track_r (state->m_wd179x, space, 0);
13921390      case 0x7ba:
1393         return wd17xx_sector_r (fdc, space, 0);
1391         return wd17xx_sector_r (state->m_wd179x, space, 0);
13941392      case 0x7bb:
1395         return wd17xx_data_r (fdc, space, 0);
1393         return wd17xx_data_r (state->m_wd179x, space, 0);
13961394      case 0x7bc:
13971395         return state->m_dsk_stat;
13981396      default:
r21045r21046
14081406MSX_SLOT_MAP(diskrom2)
14091407{
14101408   msx_state *drvstate = machine.driver_data<msx_state>();
1411   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
1409   address_space &space = drvstate->m_maincpu->space(AS_PROGRAM);
14121410   switch (page)
14131411   {
14141412   case 0:
r21045r21046
14331431
14341432MSX_SLOT_WRITE(diskrom2)
14351433{
1436   device_t *fdc = machine.device("wd179x");
1437   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
1434   msx_state *drvstate = machine.driver_data<msx_state>();
1435   address_space &space = drvstate->m_maincpu->space(AS_PROGRAM);
14381436   if (addr >= 0xa000 && addr < 0xc000)
14391437   {
14401438      addr -= 0x4000;
r21045r21046
14421440   switch (addr)
14431441   {
14441442   case 0x7fb8:
1445      wd17xx_command_w (fdc, space, 0, val);
1443      wd17xx_command_w (drvstate->m_wd179x, space, 0, val);
14461444      break;
14471445   case 0x7fb9:
1448      wd17xx_track_w (fdc, space, 0, val);
1446      wd17xx_track_w (drvstate->m_wd179x, space, 0, val);
14491447      break;
14501448   case 0x7fba:
1451      wd17xx_sector_w (fdc, space, 0, val);
1449      wd17xx_sector_w (drvstate->m_wd179x, space, 0, val);
14521450      break;
14531451   case 0x7fbb:
1454      wd17xx_data_w (fdc, space, 0, val);
1452      wd17xx_data_w (drvstate->m_wd179x, space, 0, val);
14551453      break;
14561454   case 0x7fbc:
1457      wd17xx_set_side (fdc,val & 1);
1455      wd17xx_set_side (drvstate->m_wd179x,val & 1);
14581456      state->m_mem[0x3fbc] = val | 0xfe;
1459      wd17xx_set_drive (fdc,val & 1);
1457      wd17xx_set_drive (drvstate->m_wd179x,val & 1);
14601458      if ((state->m_mem[0x3fbc] ^ val) & 0x40)
14611459      {
14621460         set_led_status (machine, 0, !(val & 0x40));
r21045r21046
15121510{
15131511   if (addr >= 0x4000 && addr < 0x8000 && !(addr & 0x0010))
15141512   {
1515      machine.device<dac_device>("dac")->write_unsigned8(val);
1513      msx_state *drvstate = machine.driver_data<msx_state>();
1514      drvstate->m_dac->write_unsigned8(val);
15161515   }
15171516}
15181517
r21045r21046
15691568   msx_state *drvstate = machine.driver_data<msx_state>();
15701569   if (addr >= 0x5000 && addr < 0x6000)
15711570   {
1572      machine.device<dac_device>("dac")->write_unsigned8(val);
1571      drvstate->m_dac->write_unsigned8(val);
15731572   }
15741573   else if (addr >= 0x6000 && addr < 0x8000)
15751574   {
r21045r21046
16851684MSX_SLOT_WRITE(fmpac)
16861685{
16871686   msx_state *drvstate = machine.driver_data<msx_state>();
1688   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
1687   address_space &space = drvstate->m_maincpu->space(AS_PROGRAM);
16891688   int i, data;
16901689
16911690   if (addr >= 0x4000 && addr < 0x6000 && state->m_cart.fmpac.sram_support)
r21045r21046
17051704   case 0x7ff4:
17061705      if (state->m_cart.fmpac.opll_active)
17071706      {
1708         ym2413_w (space.machine().device("ay8910"), space, 0, val);
1707         ym2413_w (drvstate->m_ym, space, 0, val);
17091708      }
17101709      break;
17111710   case 0x7ff5:
17121711      if (state->m_cart.fmpac.opll_active)
17131712      {
1714         ym2413_w (space.machine().device("ay8910"), space, 1, val);
1713         ym2413_w (drvstate->m_ym, space, 1, val);
17151714      }
17161715      break;
17171716   case 0x7ff6:
r21045r21046
21982197
21992198   if (reg < 0x80)
22002199   {
2201      return k051649_waveform_r (space.machine().device("k051649"), space, reg);
2200      return k051649_waveform_r (state->m_k051649, space, reg);
22022201   }
22032202   else if (reg < 0xa0)
22042203   {
r21045r21046
22072206   else if (reg < 0xc0)
22082207   {
22092208      /* read wave 5 */
2210      return k051649_waveform_r (space.machine().device("k051649"), space, 0x80 + (reg & 0x1f));
2209      return k051649_waveform_r (state->m_k051649, space, 0x80 + (reg & 0x1f));
22112210   }
22122211   else if (reg < 0xe0)
22132212   {
2214      return k051649_test_r (space.machine().device("k051649"), space, reg);
2213      return k051649_test_r (state->m_k051649, space, reg);
22152214   }
22162215
22172216   return 0xff;
r21045r21046
22322231
22332232   if (reg < 0xa0)
22342233   {
2235      return k052539_waveform_r (space.machine().device("k051649"), space, reg);
2234      return k052539_waveform_r (state->m_k051649, space, reg);
22362235   }
22372236   else if (reg >= 0xc0 && reg < 0xe0)
22382237   {
2239      return k051649_test_r (space.machine().device("k051649"), space, reg);
2238      return k051649_test_r (state->m_k051649, space, reg);
22402239   }
22412240
22422241   return 0xff;
r21045r21046
22442243
22452244MSX_SLOT_MAP(soundcartridge)
22462245{
2247   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
2246   msx_state *drvstate = machine.driver_data<msx_state>();
2247   address_space &space = drvstate->m_maincpu->space(AS_PROGRAM);
22482248   switch (page)
22492249   {
22502250   case 0:
r21045r21046
22792279MSX_SLOT_WRITE(soundcartridge)
22802280{
22812281   msx_state *drvstate = machine.driver_data<msx_state>();
2282   address_space &space = machine.device("maincpu")->memory().space(AS_PROGRAM);
2282   address_space &space = drvstate->m_maincpu->space(AS_PROGRAM);
22832283   int i;
22842284
22852285   if (addr < 0x4000)
r21045r21046
23412341      }
23422342      else if (addr >= 0x9800 && state->m_cart.sccp.scc_active)
23432343      {
2344         device_t *k051649 = space.machine().device("k051649");
23452344         int offset = addr & 0xff;
23462345
23472346         if (offset < 0x80)
23482347         {
2349            k051649_waveform_w (k051649, space, offset, val);
2348            k051649_waveform_w (drvstate->m_k051649, space, offset, val);
23502349         }
23512350         else if (offset < 0xa0)
23522351         {
r21045r21046
23542353
23552354            if (offset < 0xa)
23562355            {
2357               k051649_frequency_w (k051649, space, offset, val);
2356               k051649_frequency_w (drvstate->m_k051649, space, offset, val);
23582357            }
23592358            else if (offset < 0x0f)
23602359            {
2361               k051649_volume_w (k051649, space, offset - 0xa, val);
2360               k051649_volume_w (drvstate->m_k051649, space, offset - 0xa, val);
23622361            }
23632362            else if (offset == 0x0f)
23642363            {
2365               k051649_keyonoff_w (k051649, space, 0, val);
2364               k051649_keyonoff_w (drvstate->m_k051649, space, 0, val);
23662365            }
23672366         }
23682367         else if (offset < 0xe0)
23692368         {
2370            k051649_test_w (k051649, space, offset, val);
2369            k051649_test_w (drvstate->m_k051649, space, offset, val);
23712370         }
23722371      }
23732372   }
r21045r21046
23912390      }
23922391      else if (addr >= 0xb800 && state->m_cart.sccp.sccp_active)
23932392      {
2394         device_t *k051649 = space.machine().device("k051649");
23952393         int offset = addr & 0xff;
23962394
23972395         if (offset < 0xa0)
23982396         {
2399            k052539_waveform_w (k051649, space, offset, val);
2397            k052539_waveform_w (drvstate->m_k051649, space, offset, val);
24002398         }
24012399         else if (offset < 0xc0)
24022400         {
r21045r21046
24042402
24052403            if (offset < 0x0a)
24062404            {
2407               k051649_frequency_w (k051649, space, offset, val);
2405               k051649_frequency_w (drvstate->m_k051649, space, offset, val);
24082406            }
24092407            else if (offset < 0x0f)
24102408            {
2411               k051649_volume_w (k051649, space, offset - 0x0a, val);
2409               k051649_volume_w (drvstate->m_k051649, space, offset - 0x0a, val);
24122410            }
24132411            else if (offset == 0x0f)
24142412            {
2415               k051649_keyonoff_w (k051649, space, 0, val);
2413               k051649_keyonoff_w (drvstate->m_k051649, space, 0, val);
24162414            }
24172415         }
24182416         else if (offset < 0xe0)
24192417         {
2420            k051649_test_w (k051649, space, offset, val);
2418            k051649_test_w (drvstate->m_k051649, space, offset, val);
24212419         }
24222420      }
24232421   }
trunk/src/mess/machine/msx.c
r21045r21046
145145      UINT8 *rom_region = image.get_software_region("rom");
146146      size = size_aligned = image.get_software_region_length("rom");
147147
148      mem = auto_alloc_array(image.device().machine(), UINT8, size_aligned);
148      mem = auto_alloc_array(machine(), UINT8, size_aligned);
149149      memcpy(mem, rom_region, size_aligned);
150150   }
151151   else
r21045r21046
164164      while (size_aligned < size)
165165         size_aligned *= 2;
166166
167      mem = auto_alloc_array(image.device().machine(),UINT8,size_aligned);
167      mem = auto_alloc_array(machine(),UINT8,size_aligned);
168168      if (!mem)
169169      {
170170         logerror ("cart #%d: error: failed to allocate memory for cartridge\n", id);
r21045r21046
216216      int old_size_aligned = size_aligned;
217217
218218      size_aligned = 0x10000;
219      mem = auto_alloc_array(image.device().machine(),UINT8, 0x10000);
219      mem = auto_alloc_array(machine(),UINT8, 0x10000);
220220      if (!mem)
221221      {
222         auto_free(image.device().machine(),old_mem);
222         auto_free(machine(),old_mem);
223223         logerror ("cart #%d: error: cannot allocate memory\n", id);
224224         return IMAGE_INIT_FAIL;
225225      }
r21045r21046
236236
237237      /* Copy old contents to newly claimed memory */
238238      memcpy(mem,old_mem,old_size_aligned);
239      auto_free(image.device().machine(),old_mem);
239      auto_free(machine(),old_mem);
240240   }
241241
242242   /* mapper type 0 (ROM) might need moving around a bit */
r21045r21046
303303      type = SLOT_ROM;
304304
305305   /* allocate and set slot_state for this cartridge */
306   st = auto_alloc(image.device().machine(),slot_state);
306   st = auto_alloc(machine(),slot_state);
307307   if (!st)
308308   {
309309      logerror ("cart #%d: error: cannot allocate memory for cartridge state\n", id);
r21045r21046
312312   memset (st, 0, sizeof (slot_state));
313313
314314   st->m_type = type;
315   sramfile = auto_alloc_array(image.device().machine(), char, strlen (image.filename () + 1));
315   sramfile = auto_alloc_array(machine(), char, strlen (image.filename () + 1));
316316
317317   if (sramfile)
318318   {
r21045r21046
326326      st->m_sramfile = sramfile;
327327   }
328328
329   if (msx_slot_list[type].init (image.device().machine(), st, 0, mem, size_aligned))
329   if (msx_slot_list[type].init (machine(), st, 0, mem, size_aligned))
330330      return IMAGE_INIT_FAIL;
331331
332332   if (msx_slot_list[type].loadsram)
333      msx_slot_list[type].loadsram (image.device().machine(), st);
333      msx_slot_list[type].loadsram (machine(), st);
334334
335335   m_cart_state[id] = st;
336   msx_memory_set_carts (image.device().machine());
336   msx_memory_set_carts();
337337
338338   return IMAGE_INIT_PASS;
339339}
r21045r21046
360360
361361void msx_vdp_interrupt(device_t *, v99x8_device &device, int i)
362362{
363   device.machine().device("maincpu")->execute().set_input_line(0, (i ? HOLD_LINE : CLEAR_LINE));
363   msx_state *state = device.machine().driver_data<msx_state>();
364
365   state->m_maincpu->set_input_line(0, (i ? HOLD_LINE : CLEAR_LINE));
364366}
365367
366368void msx_state::msx_ch_reset_core ()
r21045r21046
519521
520522DRIVER_INIT_MEMBER(msx_state,msx)
521523{
522   machine().device("maincpu")->execute().set_input_line_vector(0, 0xff);
524   m_maincpu->set_input_line_vector(0, 0xff);
523525
524   msx_memory_init (machine());
526   msx_memory_init();
525527
526   z80_set_cycle_tables( machine().device("maincpu"), cc_op, cc_cb, cc_ed, cc_xy, cc_xycb, cc_ex );
528   z80_set_cycle_tables( m_maincpu, cc_op, cc_cb, cc_ed, cc_xy, cc_xycb, cc_ex );
527529}
528530
529531TIMER_DEVICE_CALLBACK_MEMBER(msx_state::msx2_interrupt)
530532{
531   m_v9938->set_resolution(machine().root_device().ioport("DSW")->read() & 0x03);
533   m_v9938->set_resolution(m_io_dsw->read() & 0x03);
532534   m_v9938->interrupt();
533535}
534536
r21045r21046
536538{
537539   int i;
538540
539   for (i=0; i<2; i++)
540   {
541      m_mouse[i] = ioport(i ? "MOUSE1" : "MOUSE0")->read();
542      m_mouse_stat[i] = -1;
543   }
541   m_mouse[0] = m_io_mouse0->read();
542   m_mouse_stat[0] = -1;
543   m_mouse[1] = m_io_mouse1->read();
544   m_mouse_stat[1] = -1;
544545}
545546
546547/*
r21045r21046
554555
555556   data = (m_cass->input() > 0.0038 ? 0x80 : 0);
556557
557   if ( (m_psg_b ^ ioport("DSW")->read() ) & 0x40)
558   if ( (m_psg_b ^ m_io_dsw->read() ) & 0x40)
558559   {
559560      /* game port 2 */
560      UINT8 inp = ioport("JOY1")->read();
561      UINT8 inp = m_io_joy1->read();
561562      if ( !(inp & 0x80) )
562563      {
563564         /* joystick */
r21045r21046
576577   else
577578   {
578579      /* game port 1 */
579      UINT8 inp = ioport("JOY0")->read();
580      UINT8 inp = m_io_joy0->read();
580581      if ( !(inp & 0x80) )
581582      {
582583         /* joystick */
r21045r21046
625626
626627WRITE8_MEMBER(msx_state::msx_printer_strobe_w)
627628{
628   machine().device<centronics_device>("centronics")->strobe_w(BIT(data, 1));
629   m_centronics->strobe_w(BIT(data, 1));
629630}
630631
631632WRITE8_MEMBER(msx_state::msx_printer_data_w)
632633{
633   if (machine().root_device().ioport("DSW")->read() & 0x80)
634   if (m_io_dsw->read() & 0x80)
634635      /* SIMPL emulation */
635      machine().device<dac_device>("dac")->write_signed8(data);
636      m_dac->write_signed8(data);
636637   else
637      machine().device<centronics_device>("centronics")->write(machine().driver_data()->generic_space(), 0, data);
638      m_centronics->write(space, 0, data);
638639}
639640
640641READ8_MEMBER(msx_state::msx_printer_status_r)
641642{
642643   UINT8 result = 0xfd;
643644
644   if (machine().root_device().ioport("DSW")->read() & 0x80)
645   if (m_io_dsw->read() & 0x80)
645646      return 0xff;
646647
647   result |= machine().device<centronics_device>("centronics")->busy_r() << 1;
648   result |= m_centronics->busy_r() << 1;
648649
649650   return result;
650651}
r21045r21046
789790{
790791   UINT8 result = 0xff;
791792   int row, data;
792   static const char *const keynames[] = { "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5" };
793   ioport_port *keynames[] = { m_io_key0, m_io_key1, m_io_key2, m_io_key3, m_io_key4, m_io_key5 };
793794
794795   row = keylatch;
795796   if (row <= 10)
796797   {
797      data = ioport(keynames[row / 2])->read();
798      data = keynames[row / 2]->read();
798799
799800      if (BIT(row, 0))
800801         data >>= 8;
r21045r21046
809810 *
810811 ***********************************************************************/
811812
812static void msx_memory_init (running_machine &machine)
813void msx_state::msx_memory_init()
813814{
814   msx_state *state = machine.driver_data<msx_state>();
815815   int prim, sec, page, extent, option;
816816   int size = 0;
817817   const msx_slot_layout *layout= (msx_slot_layout*)NULL;
r21045r21046
820820   slot_state *st;
821821   UINT8 *mem = NULL;
822822
823   state->m_empty = auto_alloc_array(machine, UINT8, 0x4000);
824   memset (state->m_empty, 0xff, 0x4000);
823   m_empty = auto_alloc_array(machine(), UINT8, 0x4000);
824   memset (m_empty, 0xff, 0x4000);
825825
826826   for (prim=0; prim<4; prim++) {
827827      for (sec=0; sec<4; sec++) {
828828         for (page=0; page<4; page++) {
829            state->m_all_state[prim][sec][page]= (slot_state*)NULL;
829            m_all_state[prim][sec][page]= (slot_state*)NULL;
830830         }
831831      }
832832   }
833833
834834   for (driver = msx_driver_list; driver->name[0]; driver++) {
835      if (!strcmp (driver->name, machine.system().name)) {
835      if (!strcmp (driver->name, machine().system().name)) {
836836         layout = driver->layout;
837837      }
838838   }
r21045r21046
843843      return;
844844   }
845845
846   state->layout = layout;
846   m_layout = layout;
847847
848848   for (; layout->entry != MSX_LAYOUT_LAST; layout++) {
849849      switch (layout->entry) {
r21045r21046
854854         extent = layout->page_extent;
855855
856856         if (layout->slot_secondary) {
857            state->m_slot_expanded[layout->slot_primary]= TRUE;
857            m_slot_expanded[layout->slot_primary]= TRUE;
858858         }
859859
860860         slot = &msx_slot_list[layout->type];
r21045r21046
874874
875875         st = (slot_state*)NULL;
876876         if (layout->type == SLOT_CARTRIDGE1) {
877            st = state->m_cart_state[0];
877            st = m_cart_state[0];
878878            if (!st) {
879879               slot = &msx_slot_list[SLOT_SOUNDCARTRIDGE];
880880               size = 0x20000;
881881            }
882882         }
883883         if (layout->type == SLOT_CARTRIDGE2) {
884            st = state->m_cart_state[1];
884            st = m_cart_state[1];
885885            if (!st) {
886886               /* Check whether the optional FM-PAC rom is present */
887887               option = 0x10000;
888888               size = 0x10000;
889               mem = machine.root_device().memregion("maincpu")->base() + option;
890               if (machine.root_device().memregion("maincpu")->bytes() >= size + option && mem[0] == 'A' && mem[1] == 'B') {
889               mem = m_region_maincpu->base() + option;
890               if (m_region_maincpu->bytes() >= size + option && mem[0] == 'A' && mem[1] == 'B') {
891891                  slot = &msx_slot_list[SLOT_FMPAC];
892892               }
893893               else {
r21045r21046
900900            switch (slot->mem_type) {
901901            case MSX_MEM_HANDLER:
902902            case MSX_MEM_ROM:
903               mem = machine.root_device().memregion("maincpu")->base() + option;
903               mem = m_region_maincpu->base() + option;
904904               break;
905905            case MSX_MEM_RAM:
906906               mem = NULL;
907907               break;
908908            }
909            st = auto_alloc_clear (machine, slot_state);
909            st = auto_alloc_clear (machine(), slot_state);
910910            memset (st, 0, sizeof (slot_state));
911911
912            if (slot->init (machine, st, layout->slot_page, mem, size)) {
912            if (slot->init (machine(), st, layout->slot_page, mem, size)) {
913913               continue;
914914            }
915915         }
r21045r21046
920920                     "page + extent > 3\n");
921921               break;
922922            }
923            state->m_all_state[prim][sec][page] = st;
923            m_all_state[prim][sec][page] = st;
924924            page++;
925925         }
926926         break;
927927      case MSX_LAYOUT_KANJI_ENTRY:
928         state->m_kanji_mem = machine.root_device().memregion("maincpu")->base() + layout->option;
928         m_kanji_mem = m_region_maincpu->base() + layout->option;
929929         break;
930930      case MSX_LAYOUT_RAMIO_SET_BITS_ENTRY:
931         state->m_ramio_set_bits = (UINT8)layout->option;
931         m_ramio_set_bits = (UINT8)layout->option;
932932         break;
933933      }
934934   }
r21045r21046
957957   }
958958}
959959
960static void msx_memory_set_carts (running_machine &machine)
960void msx_state::msx_memory_set_carts()
961961{
962   msx_state *state = machine.driver_data<msx_state>();
963962   const msx_slot_layout *layout;
964963   int page;
965964
966   if (!state->layout)
965   if (!layout)
967966      return;
968967
969   for (layout = state->layout; layout->entry != MSX_LAYOUT_LAST; layout++)
968   for (layout = m_layout; layout->entry != MSX_LAYOUT_LAST; layout++)
970969   {
971970      if (layout->entry == MSX_LAYOUT_SLOT_ENTRY)
972971      {
r21045r21046
974973         {
975974         case SLOT_CARTRIDGE1:
976975            for (page=0; page<4; page++)
977               state->m_all_state[layout->slot_primary][layout->slot_secondary][page]
978                  = state->m_cart_state[0];
976               m_all_state[layout->slot_primary][layout->slot_secondary][page]
977                  = m_cart_state[0];
979978            break;
980979         case SLOT_CARTRIDGE2:
981980            for (page=0; page<4; page++)
982               state->m_all_state[layout->slot_primary][layout->slot_secondary][page]
983                  = state->m_cart_state[1];
981               m_all_state[layout->slot_primary][layout->slot_secondary][page]
982                  = m_cart_state[1];
984983            break;
985984         }
986985      }
trunk/src/mess/includes/msx.h
r21045r21046
3838{
3939public:
4040   msx_state(const machine_config &mconfig, device_type type, const char *tag)
41      : driver_device(mconfig, type, tag),
42   m_v9938(*this, "v9938"),
43   m_cass(*this, CASSETTE_TAG),
44   m_ym(*this, "ym2413"),
45   m_dac(*this, "dac"),
46   m_rtc(*this, TC8521_TAG)
41      : driver_device(mconfig, type, tag)
42      , m_maincpu(*this, "maincpu")
43      , m_v9938(*this, "v9938")
44      , m_cass(*this, CASSETTE_TAG)
45      , m_ay8910(*this, "ay8910")
46      , m_ym(*this, "ym2413")
47      , m_k051649(*this, "k051649")
48      , m_dac(*this, "dac")
49      , m_centronics(*this, "centronics")
50      , m_rtc(*this, TC8521_TAG)
51      , m_wd179x(*this, "wd179x")
52      , m_bank1(*this, "bank1")
53      , m_bank2(*this, "bank2")
54      , m_bank3(*this, "bank3")
55      , m_bank4(*this, "bank4")
56      , m_bank5(*this, "bank5")
57      , m_bank6(*this, "bank6")
58      , m_bank7(*this, "bank7")
59      , m_bank8(*this, "bank8")
60      , m_bank9(*this, "bank9")
61      , m_bank10(*this, "bank10")
62      , m_bank11(*this, "bank11")
63      , m_region_maincpu(*this, "maincpu")
64      , m_io_joy0(*this, "JOY0")
65      , m_io_joy1(*this, "JOY1")
66      , m_io_dsw(*this, "DSW")
67      , m_io_mouse0(*this, "MOUSE0")
68      , m_io_mouse1(*this, "MOUSE1")
69      , m_io_key0(*this, "KEY0")
70      , m_io_key1(*this, "KEY1")
71      , m_io_key2(*this, "KEY2")
72      , m_io_key3(*this, "KEY3")
73      , m_io_key4(*this, "KEY4")
74      , m_io_key5(*this, "KEY5")
4775   { }
4876
4977   DECLARE_WRITE8_MEMBER(msx_page0_w);
r21045r21046
89117   UINT8 *m_kanji_mem;
90118   int m_kanji_latch;
91119   /* memory */
92   const msx_slot_layout *layout;
120   const msx_slot_layout *m_layout;
93121   slot_state *m_cart_state[MSX_MAX_CARTS];
94122   slot_state *m_state[4];
95123   const msx_slot *m_slot[4];
r21045r21046
110138   void msx_ch_reset_core ();
111139   void msx_memory_reset ();
112140
141   required_device<cpu_device> m_maincpu;
113142   optional_device<v9938_device> m_v9938;
114143   required_device<cassette_image_device> m_cass;
144   required_device<device_t> m_ay8910;
115145   required_device<ym2413_device> m_ym;
146   optional_device<device_t> m_k051649;
116147   required_device<dac_device> m_dac;
148   required_device<centronics_device> m_centronics;
117149   optional_device<rp5c01_device> m_rtc;
150   optional_device<device_t> m_wd179x;
118151   DECLARE_READ8_MEMBER(msx_psg_port_a_r);
119152   DECLARE_READ8_MEMBER(msx_psg_port_b_r);
120153   DECLARE_WRITE8_MEMBER(msx_psg_port_a_w);
r21045r21046
130163   DECLARE_WRITE8_MEMBER(msx_printer_strobe_w);
131164   DECLARE_WRITE8_MEMBER(msx_printer_data_w);
132165   DECLARE_READ8_MEMBER(msx_printer_status_r);
166   void msx_memory_init();
167   void msx_memory_set_carts();
133168
134169   DECLARE_DEVICE_IMAGE_LOAD_MEMBER( msx_cart );
135170   DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER( msx_cart );
171
172   required_memory_bank m_bank1;
173   required_memory_bank m_bank2;
174   required_memory_bank m_bank3;
175   required_memory_bank m_bank4;
176   required_memory_bank m_bank5;
177   required_memory_bank m_bank6;
178   required_memory_bank m_bank7;
179   required_memory_bank m_bank8;
180   required_memory_bank m_bank9;
181   required_memory_bank m_bank10;
182   required_memory_bank m_bank11;
183protected:
184   required_memory_region m_region_maincpu;
185   required_ioport m_io_joy0;
186   required_ioport m_io_joy1;
187   required_ioport m_io_dsw;
188   required_ioport m_io_mouse0;
189   required_ioport m_io_mouse1;
190   required_ioport m_io_key0;
191   required_ioport m_io_key1;
192   required_ioport m_io_key2;
193   required_ioport m_io_key3;
194   required_ioport m_io_key4;
195   required_ioport m_io_key5;
136196};
137197
138198
trunk/src/mess/drivers/msx.c
r21045r21046
343343
344344WRITE8_MEMBER(msx_state::msx_ay8910_w)
345345{
346   device_t *device = machine().device("ay8910");
347346   if ( offset & 1 )
348      ay8910_data_w( device, space, offset, data );
347      ay8910_data_w( m_ay8910, space, offset, data );
349348   else
350      ay8910_address_w( device, space, offset, data );
349      ay8910_address_w( m_ay8910, space, offset, data );
351350}
352351
353352

Previous 199869 Revisions Next


© 1997-2024 The MAME Team