Previous 199869 Revisions Next

r22070 Monday 25th March, 2013 at 10:26:55 UTC by Miodrag Milanović
some megadriv modernization (nw)
[src/mame/drivers]megadrvb.c megaplay.c megatech.c
[src/mame/includes]megadriv.h
[src/mame/machine]megadriv.c megavdp.c
[src/mess/drivers]megadriv.c

trunk/src/mess/drivers/megadriv.c
r22069r22070
8585
8686   UINT8 retdata;
8787   int controller;
88   UINT8 helper_6b = (megadrive_io_ctrl_regs[portnum] & 0x3f) | 0xc0; // bits 6 & 7 always come from megadrive_io_data_regs
89   UINT8 helper_3b = (megadrive_io_ctrl_regs[portnum] & 0x7f) | 0x80; // bit 7 always comes from megadrive_io_data_regs
88   UINT8 helper_6b = (m_megadrive_io_ctrl_regs[portnum] & 0x3f) | 0xc0; // bits 6 & 7 always come from megadrive_io_data_regs
89   UINT8 helper_3b = (m_megadrive_io_ctrl_regs[portnum] & 0x7f) | 0x80; // bit 7 always comes from megadrive_io_data_regs
9090
9191   switch (portnum)
9292   {
r22069r22070
106106   /* Are we using a 6 buttons Joypad? */
107107   if (controller)
108108   {
109      if (megadrive_io_data_regs[portnum] & 0x40)
109      if (m_megadrive_io_data_regs[portnum] & 0x40)
110110      {
111111         if (state->m_mess_io_stage[portnum] == 2)
112112         {
113113            /* here we read B, C & the additional buttons */
114            retdata = (megadrive_io_data_regs[portnum] & helper_6b) |
114            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
115115                     (((state->ioport(pad6names[0][portnum])->read_safe(0) & 0x30) |
116116                        (state->ioport(pad6names[1][portnum])->read_safe(0) & 0x0f)) & ~helper_6b);
117117         }
118118         else
119119         {
120120            /* here we read B, C & the directional buttons */
121            retdata = (megadrive_io_data_regs[portnum] & helper_6b) |
121            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
122122                     ((state->ioport(pad6names[0][portnum])->read_safe(0) & 0x3f) & ~helper_6b);
123123         }
124124      }
r22069r22070
127127         if (state->m_mess_io_stage[portnum] == 1)
128128         {
129129            /* here we read ((Start & A) >> 2) | 0x00 */
130            retdata = (megadrive_io_data_regs[portnum] & helper_6b) |
130            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
131131                     (((state->ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) & ~helper_6b);
132132         }
133133         else if (state->m_mess_io_stage[portnum]==2)
134134         {
135135            /* here we read ((Start & A) >> 2) | 0x0f */
136            retdata = (megadrive_io_data_regs[portnum] & helper_6b) |
136            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
137137                     ((((state->ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) | 0x0f) & ~helper_6b);
138138         }
139139         else
140140         {
141141            /* here we read ((Start & A) >> 2) | Up and Down */
142            retdata = (megadrive_io_data_regs[portnum] & helper_6b) |
142            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
143143                     ((((state->ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) |
144144                        (state->ioport(pad6names[0][portnum])->read_safe(0) & 0x03)) & ~helper_6b);
145145         }
r22069r22070
159159      // handle test input for SVP test
160160      if (portnum == 0 && svp_test)
161161      {
162         retdata = (megadrive_io_data_regs[0] & 0xc0);
162         retdata = (m_megadrive_io_data_regs[0] & 0xc0);
163163      }
164      else if (megadrive_io_data_regs[portnum] & 0x40)
164      else if (m_megadrive_io_data_regs[portnum] & 0x40)
165165      {
166166         /* here we read B, C & the directional buttons */
167         retdata = (megadrive_io_data_regs[portnum] & helper_3b) |
167         retdata = (m_megadrive_io_data_regs[portnum] & helper_3b) |
168168                  (((state->ioport(pad3names[portnum])->read_safe(0) & 0x3f) | 0x40) & ~helper_3b);
169169      }
170170      else
171171      {
172172         /* here we read ((Start & A) >> 2) | Up and Down */
173         retdata = (megadrive_io_data_regs[portnum] & helper_3b) |
173         retdata = (m_megadrive_io_data_regs[portnum] & helper_3b) |
174174                  ((((state->ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
175175                     (state->ioport(pad3names[portnum])->read_safe(0) & 0x03) | 0x40) & ~helper_3b);
176176      }
r22069r22070
202202
203203   if (controller)
204204   {
205      if (megadrive_io_ctrl_regs[portnum] & 0x40)
205      if (m_megadrive_io_ctrl_regs[portnum] & 0x40)
206206      {
207         if (((megadrive_io_data_regs[portnum] & 0x40) == 0x00) && ((data & 0x40) == 0x40))
207         if (((m_megadrive_io_data_regs[portnum] & 0x40) == 0x00) && ((data & 0x40) == 0x40))
208208         {
209209            state->m_mess_io_stage[portnum]++;
210210            state->m_mess_io_timeout[portnum]->adjust(machine.device<cpu_device>("maincpu")->cycles_to_attotime(8192));
r22069r22070
212212
213213      }
214214   }
215   megadrive_io_data_regs[portnum] = data;
215   m_megadrive_io_data_regs[portnum] = data;
216216   //mame_printf_debug("Writing IO Data Register #%d data %04x\n",portnum,data);
217217}
218218
trunk/src/mame/drivers/megadrvb.c
r22069r22070
667667   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(0x220000, 0x220001, FUNC(aladmdb_w));
668668   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x330000, 0x330001, FUNC(aladmdb_r));
669669
670   megadrive_6buttons_pad = 0;
670   m_megadrive_6buttons_pad = 0;
671671   DRIVER_INIT_CALL(megadrij);
672672}
673673
r22069r22070
716716
717717   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x770070, 0x770075, FUNC(mk3mdb_dsw_r) );
718718
719   megadrive_6buttons_pad = 1;
719   m_megadrive_6buttons_pad = 1;
720720   DRIVER_INIT_CALL(megadriv);
721721}
722722
r22069r22070
730730
731731   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x770070, 0x770075, FUNC(ssf2mdb_dsw_r) );
732732
733   megadrive_6buttons_pad = 1;
733   m_megadrive_6buttons_pad = 1;
734734   DRIVER_INIT_CALL(megadrij);
735735}
736736
r22069r22070
759759
760760   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x770070, 0x770075, FUNC(srmdb_dsw_r) );
761761
762   megadrive_6buttons_pad = 0;
762   m_megadrive_6buttons_pad = 0;
763763   DRIVER_INIT_CALL(megadriv);
764764}
765765
r22069r22070
771771   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_port(0x200046, 0x200047, "IN2");
772772   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_port(0x200048, 0x200049, "IN3");
773773
774   megadrive_6buttons_pad = 0;
774   m_megadrive_6buttons_pad = 0;
775775   DRIVER_INIT_CALL(megadriv);
776776}
777777
trunk/src/mame/drivers/megatech.c
r22069r22070
238238   {
239239      printf("disabling SMS Z80\n");
240240      state->m_current_game_is_sms = 0;
241      megatech_set_megadrive_z80_as_megadrive_z80(machine, "genesis_snd_z80");
241      state->megatech_set_megadrive_z80_as_megadrive_z80("genesis_snd_z80");
242242      machine.device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
243243      //machine.device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
244244   }
trunk/src/mame/drivers/megaplay.c
r22069r22070
5858
5959#define MASTER_CLOCK        53693100
6060
61extern UINT8 segae_vintpending;
62extern UINT8 segae_hintpending;
63extern UINT8 *segae_vdp_regs[];     /* pointer to vdp's registers */
64
6561// Interrupt handler - from drivers/segasyse.c
6662#if 0
63static UINT8 segae_vintpending;
64static UINT8 segae_hintpending;
65static UINT8 *segae_vdp_regs[];     /* pointer to vdp's registers */
66
6767static UINT8 hintcount;           /* line interrupt counter, decreased each scanline */
6868
6969static INTERRUPT_GEN (megaplay_bios_irq)
r22069r22070
373373
374374/*MEGAPLAY specific*/
375375
376static READ8_HANDLER( megaplay_bios_banksel_r )
376READ8_MEMBER(mplay_state::megaplay_bios_banksel_r )
377377{
378   mplay_state *state = space.machine().driver_data<mplay_state>();
379   return state->m_bios_bank;
378   return m_bios_bank;
380379}
381380
382static WRITE8_HANDLER( megaplay_bios_banksel_w )
381WRITE8_MEMBER(mplay_state::megaplay_bios_banksel_w )
383382{
384383/*  Multi-slot note:
385384    Bits 0 and 1 appear to determine the selected game slot.
386385    It should be possible to multiplex different game ROMs at
387386    0x000000-0x3fffff based on these bits.
388387*/
389   mplay_state *state = space.machine().driver_data<mplay_state>();
390   state->m_bios_bank = data;
391   state->m_bios_mode = MP_ROM;
388   m_bios_bank = data;
389   m_bios_mode = MP_ROM;
392390//  logerror("BIOS: ROM bank %i selected [0x%02x]\n",bios_bank >> 6, data);
393391}
394392
395static READ8_HANDLER( megaplay_bios_gamesel_r )
393READ8_MEMBER(mplay_state::megaplay_bios_gamesel_r )
396394{
397   mplay_state *state = space.machine().driver_data<mplay_state>();
398   return state->m_bios_6403;
395   return m_bios_6403;
399396}
400397
401static WRITE8_HANDLER( megaplay_bios_gamesel_w )
398WRITE8_MEMBER(mplay_state::megaplay_bios_gamesel_w )
402399{
403   mplay_state *state = space.machine().driver_data<mplay_state>();
404   state->m_bios_6403 = data;
400   m_bios_6403 = data;
405401
406402//  logerror("BIOS: 0x6403 write: 0x%02x\n",data);
407   state->m_bios_mode = data & 0x10;
403   m_bios_mode = data & 0x10;
408404}
409405
410static WRITE16_HANDLER( megaplay_io_write )
406WRITE16_MEMBER(mplay_state::megaplay_io_write )
411407{
412408   if (offset == 0x03)
413      megadrive_io_data_regs[2] = (data & megadrive_io_ctrl_regs[2]) | (megadrive_io_data_regs[2] & ~megadrive_io_ctrl_regs[2]);
409      m_megadrive_io_data_regs[2] = (data & m_megadrive_io_ctrl_regs[2]) | (m_megadrive_io_data_regs[2] & ~m_megadrive_io_ctrl_regs[2]);
414410   else
415411      megadriv_68k_io_write(space, offset & 0x1f, data, 0xffff);
416412}
417413
418static READ16_HANDLER( megaplay_io_read )
414READ16_MEMBER(mplay_state::megaplay_io_read )
419415{
420416   if (offset == 0x03)
421      return megadrive_io_data_regs[2];
417      return m_megadrive_io_data_regs[2];
422418   else
423419      return megadriv_68k_io_read(space, offset & 0x1f, 0xffff);
424420}
425421
426static READ8_HANDLER( bank_r )
422READ8_MEMBER(mplay_state::bank_r )
427423{
428   mplay_state *state = space.machine().driver_data<mplay_state>();
429   UINT8* bank = state->memregion("mtbios")->base();
430   UINT32 fulladdress = state->m_mp_bios_bank_addr + offset;
424   UINT8* bank = memregion("mtbios")->base();
425   UINT32 fulladdress = m_mp_bios_bank_addr + offset;
431426
432427   if (fulladdress <= 0x3fffff) // ROM Addresses
433428   {
434      if (state->m_bios_mode & MP_ROM)
429      if (m_bios_mode & MP_ROM)
435430      {
436         int sel = (state->m_bios_bank >> 6) & 0x03;
431         int sel = (m_bios_bank >> 6) & 0x03;
437432
438433         if (sel == 0)
439434            return 0xff;
440435         else
441436            return bank[0x10000 + (sel - 1) * 0x8000 + offset];
442437      }
443      else if (state->m_bios_width & 0x08)
438      else if (m_bios_width & 0x08)
444439      {
445440         if (offset >= 0x2000)
446            return state->m_ic36_ram[offset - 0x2000];
441            return m_ic36_ram[offset - 0x2000];
447442         else
448            return state->m_ic37_ram[(0x2000 * (state->m_bios_bank & 0x03)) + offset];
443            return m_ic37_ram[(0x2000 * (m_bios_bank & 0x03)) + offset];
449444      }
450445      else
451446      {
452         return space.machine().root_device().memregion("maincpu")->base()[fulladdress ^ 1];
447         return machine().root_device().memregion("maincpu")->base()[fulladdress ^ 1];
453448      }
454449   }
455450   else if (fulladdress >= 0xa10000 && fulladdress <= 0xa1001f) // IO Acess
r22069r22070
464459
465460}
466461
467static WRITE8_HANDLER( bank_w )
462WRITE8_MEMBER(mplay_state::bank_w )
468463{
469   mplay_state *state = space.machine().driver_data<mplay_state>();
470   UINT32 fulladdress = state->m_mp_bios_bank_addr + offset;
464   UINT32 fulladdress = m_mp_bios_bank_addr + offset;
471465
472466   if (fulladdress <= 0x3fffff) // ROM / Megaplay Custom Addresses
473467   {
474      if (offset <= 0x1fff && (state->m_bios_width & 0x08))
468      if (offset <= 0x1fff && (m_bios_width & 0x08))
475469      {
476         state->m_ic37_ram[(0x2000 * (state->m_bios_bank & 0x03)) + offset] = data;
470         m_ic37_ram[(0x2000 * (m_bios_bank & 0x03)) + offset] = data;
477471      }
478472
479      if(offset >= 0x2000 && (state->m_bios_width & 0x08))
473      if(offset >= 0x2000 && (m_bios_width & 0x08))
480474      {
481475   //      ic36_ram[offset] = data;
482         state->m_ic36_ram[offset - 0x2000] = data;
476         m_ic36_ram[offset - 0x2000] = data;
483477      }
484478   }
485479   else if (fulladdress >= 0xa10000 && fulladdress <=0xa1001f) // IO Access
r22069r22070
496490/* Megaplay BIOS handles regs[2] at start in a different way compared to megadrive */
497491/* other io data/ctrl regs are dealt with exactly like in the console              */
498492
499static READ8_HANDLER( megaplay_bios_6402_r )
493READ8_MEMBER(mplay_state::megaplay_bios_6402_r )
500494{
501   return megadrive_io_data_regs[2];// & 0xfe;
495   return m_megadrive_io_data_regs[2];// & 0xfe;
502496}
503497
504static WRITE8_HANDLER( megaplay_bios_6402_w )
498WRITE8_MEMBER(mplay_state::megaplay_bios_6402_w )
505499{
506   megadrive_io_data_regs[2] = (megadrive_io_data_regs[2] & 0x07) | ((data & 0x70) >> 1);
500   m_megadrive_io_data_regs[2] = (m_megadrive_io_data_regs[2] & 0x07) | ((data & 0x70) >> 1);
507501//  logerror("BIOS: 0x6402 write: 0x%02x\n", data);
508502}
509503
510static READ8_HANDLER( megaplay_bios_6204_r )
504READ8_MEMBER(mplay_state::megaplay_bios_6204_r )
511505{
512   return megadrive_io_data_regs[2];
513//  return (state->m_bios_width & 0xf8) + (state->m_bios_6204 & 0x07);
506   return m_megadrive_io_data_regs[2];
507//  return (m_bios_width & 0xf8) + (m_bios_6204 & 0x07);
514508}
515509
516static WRITE8_HANDLER( megaplay_bios_width_w )
510WRITE8_MEMBER(mplay_state::megaplay_bios_width_w )
517511{
518   mplay_state *state = space.machine().driver_data<mplay_state>();
519   state->m_bios_width = data;
520   megadrive_io_data_regs[2] = (megadrive_io_data_regs[2] & 0x07) | ((data & 0xf8));
512   m_bios_width = data;
513   m_megadrive_io_data_regs[2] = (m_megadrive_io_data_regs[2] & 0x07) | ((data & 0xf8));
521514//  logerror("BIOS: 0x6204 - Width write: %02x\n", data);
522515}
523516
524static READ8_HANDLER( megaplay_bios_6404_r )
517READ8_MEMBER(mplay_state::megaplay_bios_6404_r )
525518{
526   mplay_state *state = space.machine().driver_data<mplay_state>();
527519//  logerror("BIOS: 0x6404 read: returned 0x%02x\n",bios_6404 | (bios_6403 & 0x10) >> 4);
528   return (state->m_bios_6404 & 0xfe) | ((state->m_bios_6403 & 0x10) >> 4);
529//  return state->m_bios_6404 | (state->m_bios_6403 & 0x10) >> 4;
520   return (m_bios_6404 & 0xfe) | ((m_bios_6403 & 0x10) >> 4);
521//  return m_bios_6404 | (m_bios_6403 & 0x10) >> 4;
530522}
531523
532static WRITE8_HANDLER( megaplay_bios_6404_w )
524WRITE8_MEMBER(mplay_state::megaplay_bios_6404_w )
533525{
534   mplay_state *state = space.machine().driver_data<mplay_state>();
535   if(((state->m_bios_6404 & 0x0c) == 0x00) && ((data & 0x0c) == 0x0c))
536      space.machine().device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE);
537   state->m_bios_6404 = data;
526   if(((m_bios_6404 & 0x0c) == 0x00) && ((data & 0x0c) == 0x0c))
527      machine().device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE);
528   m_bios_6404 = data;
538529
539530//  logerror("BIOS: 0x6404 write: 0x%02x\n", data);
540531}
541532
542static READ8_HANDLER( megaplay_bios_6600_r )
533READ8_MEMBER(mplay_state::megaplay_bios_6600_r )
543534{
544535/*  Multi-slot note:
545536    0x6600 appears to be used to check for extra slots being used.
546537    Enter the following line in place of the return statement in this
547538    function to make the BIOS check all 4 slots (3 and 4 will be "not used")
548        return (state->m_bios_6600 & 0xfe) | (state->m_bios_bank & 0x01);
539        return (m_bios_6600 & 0xfe) | (m_bios_bank & 0x01);
549540*/
550   mplay_state *state = space.machine().driver_data<mplay_state>();
551   return state->m_bios_6600;// & 0xfe;
541   return m_bios_6600;// & 0xfe;
552542}
553543
554static WRITE8_HANDLER( megaplay_bios_6600_w )
544WRITE8_MEMBER(mplay_state::megaplay_bios_6600_w )
555545{
556   mplay_state *state = space.machine().driver_data<mplay_state>();
557   state->m_bios_6600 = data;
546   m_bios_6600 = data;
558547//  logerror("BIOS: 0x6600 write: 0x%02x\n",data);
559548}
560549
561static WRITE8_HANDLER( megaplay_game_w )
550WRITE8_MEMBER(mplay_state::megaplay_game_w )
562551{
563   mplay_state *state = space.machine().driver_data<mplay_state>();
564   if (state->m_readpos == 1)
565      state->m_game_banksel = 0;
566   state->m_game_banksel |= (1 << (state->m_readpos - 1)) * (data & 0x01);
552   if (m_readpos == 1)
553      m_game_banksel = 0;
554   m_game_banksel |= (1 << (m_readpos - 1)) * (data & 0x01);
567555
568   state->m_readpos++;
556   m_readpos++;
569557
570   if (state->m_readpos > 9)
558   if (m_readpos > 9)
571559   {
572      state->m_bios_mode = MP_GAME;
573      state->m_readpos = 1;
574//      popmessage("Game bank selected: 0x%03x", state->m_game_banksel);
575      logerror("BIOS [0x%04x]: 68K address space bank selected: 0x%03x\n", space.device().safe_pcbase(), state->m_game_banksel);
560      m_bios_mode = MP_GAME;
561      m_readpos = 1;
562//      popmessage("Game bank selected: 0x%03x", m_game_banksel);
563      logerror("BIOS [0x%04x]: 68K address space bank selected: 0x%03x\n", space.device().safe_pcbase(), m_game_banksel);
576564   }
577565
578   state->m_mp_bios_bank_addr = ((state->m_mp_bios_bank_addr >> 1) | (data << 23)) & 0xff8000;
566   m_mp_bios_bank_addr = ((m_mp_bios_bank_addr >> 1) | (data << 23)) & 0xff8000;
579567}
580568
581569static ADDRESS_MAP_START( megaplay_bios_map, AS_PROGRAM, 8, mplay_state )
582570   AM_RANGE(0x0000, 0x3fff) AM_ROM
583571   AM_RANGE(0x4000, 0x4fff) AM_RAM
584572   AM_RANGE(0x5000, 0x5fff) AM_RAM
585   AM_RANGE(0x6000, 0x6000) AM_WRITE_LEGACY(megaplay_game_w)
573   AM_RANGE(0x6000, 0x6000) AM_WRITE(megaplay_game_w)
586574   AM_RANGE(0x6200, 0x6200) AM_READ_PORT("DSW0")
587575   AM_RANGE(0x6201, 0x6201) AM_READ_PORT("DSW1")
588   AM_RANGE(0x6203, 0x6203) AM_READWRITE_LEGACY(megaplay_bios_banksel_r, megaplay_bios_banksel_w)
589   AM_RANGE(0x6204, 0x6204) AM_READWRITE_LEGACY(megaplay_bios_6204_r, megaplay_bios_width_w)
576   AM_RANGE(0x6203, 0x6203) AM_READWRITE(megaplay_bios_banksel_r, megaplay_bios_banksel_w)
577   AM_RANGE(0x6204, 0x6204) AM_READWRITE(megaplay_bios_6204_r, megaplay_bios_width_w)
590578   AM_RANGE(0x6400, 0x6400) AM_READ_PORT("TEST")
591579   AM_RANGE(0x6401, 0x6401) AM_READ_PORT("COIN")
592   AM_RANGE(0x6402, 0x6402) AM_READWRITE_LEGACY(megaplay_bios_6402_r, megaplay_bios_6402_w)
593   AM_RANGE(0x6403, 0x6403) AM_READWRITE_LEGACY(megaplay_bios_gamesel_r, megaplay_bios_gamesel_w)
594   AM_RANGE(0x6404, 0x6404) AM_READWRITE_LEGACY(megaplay_bios_6404_r, megaplay_bios_6404_w)
595   AM_RANGE(0x6600, 0x6600) AM_READWRITE_LEGACY(megaplay_bios_6600_r, megaplay_bios_6600_w)
580   AM_RANGE(0x6402, 0x6402) AM_READWRITE(megaplay_bios_6402_r, megaplay_bios_6402_w)
581   AM_RANGE(0x6403, 0x6403) AM_READWRITE(megaplay_bios_gamesel_r, megaplay_bios_gamesel_w)
582   AM_RANGE(0x6404, 0x6404) AM_READWRITE(megaplay_bios_6404_r, megaplay_bios_6404_w)
583   AM_RANGE(0x6600, 0x6600) AM_READWRITE(megaplay_bios_6600_r, megaplay_bios_6600_w)
596584   AM_RANGE(0x6001, 0x67ff) AM_WRITEONLY
597585   AM_RANGE(0x6800, 0x77ff) AM_RAM AM_SHARE("ic3_ram")
598   AM_RANGE(0x8000, 0xffff) AM_READWRITE_LEGACY(bank_r, bank_w)
586   AM_RANGE(0x8000, 0xffff) AM_READWRITE(bank_r, bank_w)
599587ADDRESS_MAP_END
600588
601589/* basically from src/drivers/segasyse.c */
r22069r22070
830818ROM_END
831819
832820
833static void mplay_start(running_machine &machine)
821void mplay_state::mplay_start()
834822{
835   UINT8 *src = machine.root_device().memregion("mtbios")->base();
836   UINT8 *instruction_rom = machine.root_device().memregion("user1")->base();
837   UINT8 *game_rom = machine.root_device().memregion("maincpu")->base();
823   UINT8 *src = machine().root_device().memregion("mtbios")->base();
824   UINT8 *instruction_rom = machine().root_device().memregion("user1")->base();
825   UINT8 *game_rom = machine().root_device().memregion("maincpu")->base();
838826   int offs;
839827
840828   memmove(src + 0x10000, src + 0x8000, 0x18000); // move bios..
r22069r22070
850838   }
851839}
852840
853static READ16_HANDLER( megadriv_68k_read_z80_extra_ram )
841READ16_MEMBER(mplay_state::megadriv_68k_read_z80_extra_ram )
854842{
855   mplay_state *state = space.machine().driver_data<mplay_state>();
856   return state->m_ic36_ram[(offset << 1) ^ 1] | (state->m_ic36_ram[(offset << 1)] << 8);
843   return m_ic36_ram[(offset << 1) ^ 1] | (m_ic36_ram[(offset << 1)] << 8);
857844}
858845
859static WRITE16_HANDLER( megadriv_68k_write_z80_extra_ram )
846WRITE16_MEMBER(mplay_state::megadriv_68k_write_z80_extra_ram )
860847{
861   mplay_state *state = space.machine().driver_data<mplay_state>();
862848   if (!ACCESSING_BITS_0_7) // byte (MSB) access
863849   {
864      state->m_ic36_ram[(offset << 1)] = (data & 0xff00) >> 8;
850      m_ic36_ram[(offset << 1)] = (data & 0xff00) >> 8;
865851   }
866852   else if (!ACCESSING_BITS_8_15)
867853   {
868      state->m_ic36_ram[(offset << 1) ^ 1] = (data & 0x00ff);
854      m_ic36_ram[(offset << 1) ^ 1] = (data & 0x00ff);
869855   }
870856   else // for WORD access only the MSB is used, LSB is ignored
871857   {
872      state->m_ic36_ram[(offset << 1)] = (data & 0xff00) >> 8;
858      m_ic36_ram[(offset << 1)] = (data & 0xff00) >> 8;
873859   }
874860}
875861
r22069r22070
883869
884870   DRIVER_INIT_CALL(mpnew);
885871
886   mplay_start(machine());
872   mplay_start();
887873
888874   /* for now ... */
889   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0xa10000, 0xa1001f, FUNC(megaplay_io_read), FUNC(megaplay_io_write));
875   machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa10000, 0xa1001f, read16_delegate(FUNC(mplay_state::megaplay_io_read),this), write16_delegate(FUNC(mplay_state::megaplay_io_write),this));
890876
891877   /* megaplay has ram shared with the bios cpu here */
892878   machine().device("genesis_snd_z80")->memory().space(AS_PROGRAM).install_ram(0x2000, 0x3fff, &m_ic36_ram[0]);
893879
894880   /* instead of a RAM mirror the 68k sees the extra ram of the 2nd z80 too */
895   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0xa02000, 0xa03fff, FUNC(megadriv_68k_read_z80_extra_ram), FUNC(megadriv_68k_write_z80_extra_ram));
881   machine().device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_handler(0xa02000, 0xa03fff, read16_delegate(FUNC(mplay_state::megadriv_68k_read_z80_extra_ram),this), write16_delegate(FUNC(mplay_state::megadriv_68k_write_z80_extra_ram),this));
896882
897883   init_megatech_bios(machine());
898884
trunk/src/mame/machine/megadriv.c
r22069r22070
2828
2929MACHINE_CONFIG_EXTERN( megadriv );
3030
31timer_device* megadriv_scanline_timer;
31extern timer_device* megadriv_scanline_timer;
3232
3333
3434void megadriv_z80_hold(running_machine &machine)
r22069r22070
4444   state->m_z80snd->set_input_line(0, CLEAR_LINE);
4545}
4646
47static void megadriv_z80_bank_w(address_space &space, UINT16 data)
47void md_base_state::megadriv_z80_bank_w(UINT16 data)
4848{
49   md_base_state *state = space.machine().driver_data<md_base_state>();
50   state->m_genz80.z80_bank_addr = ((state->m_genz80.z80_bank_addr >> 1) | (data << 23)) & 0xff8000;
49   m_genz80.z80_bank_addr = ((m_genz80.z80_bank_addr >> 1) | (data << 23)) & 0xff8000;
5150}
5251
53static WRITE16_HANDLER( megadriv_68k_z80_bank_write )
52WRITE16_MEMBER(md_base_state::megadriv_68k_z80_bank_write )
5453{
5554   //logerror("%06x: 68k writing bit to bank register %01x\n", space.device().safe_pc(),data&0x01);
56   megadriv_z80_bank_w(space, data & 0x01);
55   megadriv_z80_bank_w(data & 0x01);
5756}
5857
59static WRITE8_HANDLER(megadriv_z80_z80_bank_w)
58WRITE8_MEMBER(md_base_state::megadriv_z80_z80_bank_w)
6059{
6160   //logerror("%04x: z80 writing bit to bank register %01x\n", space.device().safe_pc(),data&0x01);
62   megadriv_z80_bank_w(space, data & 0x01);
61   megadriv_z80_bank_w(data & 0x01);
6362}
6463
65
66static DECLARE_READ16_HANDLER( megadriv_68k_check_z80_bus );
67static DECLARE_WRITE16_HANDLER(megadriv_68k_req_z80_bus);
68
69static DECLARE_READ16_HANDLER( megadriv_68k_read_z80_ram );
70static DECLARE_WRITE16_HANDLER( megadriv_68k_write_z80_ram );
71
72static DECLARE_WRITE16_HANDLER( megadriv_68k_req_z80_reset );
73
74
75
7664READ8_MEMBER(md_base_state::megadriv_68k_YM2612_read)
7765{
7866   device_t *device = machine().device("ymsnd");
r22069r22070
10694}
10795
10896/* Megadrive / Genesis has 3 I/O ports */
109static emu_timer *io_timeout[3];
110static int io_stage[3];
97static emu_timer *m_io_timeout[3];
98static int m_io_stage[3];
11199
112100static TIMER_CALLBACK( io_timeout_timer_callback )
113101{
114   io_stage[(int)(FPTR)ptr] = -1;
102   m_io_stage[(int)(FPTR)ptr] = -1;
115103}
116104
117105static void init_megadri6_io(running_machine &machine)
r22069r22070
120108
121109   for (i=0; i<3; i++)
122110   {
123      io_timeout[i] = machine.scheduler().timer_alloc(FUNC(io_timeout_timer_callback), (void*)(FPTR)i);
111      m_io_timeout[i] = machine.scheduler().timer_alloc(FUNC(io_timeout_timer_callback), (void*)(FPTR)i);
124112   }
125113}
126114
r22069r22070
213201   PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_PLAYER(2) PORT_NAME("P2 MODE") // mode
214202INPUT_PORTS_END
215203
216UINT8 megadrive_io_data_regs[3];
217UINT8 megadrive_io_ctrl_regs[3];
218static UINT8 megadrive_io_tx_regs[3];
219int megadrive_6buttons_pad = 0;
204UINT8 m_megadrive_io_data_regs[3];
205UINT8 m_megadrive_io_ctrl_regs[3];
206static UINT8 m_megadrive_io_tx_regs[3];
207int m_megadrive_6buttons_pad = 0;
220208
221209static void megadrive_reset_io(running_machine &machine)
222210{
223211   int i;
224212
225   megadrive_io_data_regs[0] = 0x7f;
226   megadrive_io_data_regs[1] = 0x7f;
227   megadrive_io_data_regs[2] = 0x7f;
228   megadrive_io_ctrl_regs[0] = 0x00;
229   megadrive_io_ctrl_regs[1] = 0x00;
230   megadrive_io_ctrl_regs[2] = 0x00;
231   megadrive_io_tx_regs[0] = 0xff;
232   megadrive_io_tx_regs[1] = 0xff;
233   megadrive_io_tx_regs[2] = 0xff;
213   m_megadrive_io_data_regs[0] = 0x7f;
214   m_megadrive_io_data_regs[1] = 0x7f;
215   m_megadrive_io_data_regs[2] = 0x7f;
216   m_megadrive_io_ctrl_regs[0] = 0x00;
217   m_megadrive_io_ctrl_regs[1] = 0x00;
218   m_megadrive_io_ctrl_regs[2] = 0x00;
219   m_megadrive_io_tx_regs[0] = 0xff;
220   m_megadrive_io_tx_regs[1] = 0xff;
221   m_megadrive_io_tx_regs[2] = 0xff;
234222
235223   for (i=0; i<3; i++)
236224   {
237      io_stage[i] = -1;
225      m_io_stage[i] = -1;
238226   }
239227}
240228
241229/************* 6 buttons version **************************/
242230static UINT8 megadrive_io_read_data_port_6button(running_machine &machine, int portnum)
243231{
244   UINT8 retdata, helper = (megadrive_io_ctrl_regs[portnum] & 0x3f) | 0xc0; // bits 6 & 7 always come from megadrive_io_data_regs
232   UINT8 retdata, helper = (m_megadrive_io_ctrl_regs[portnum] & 0x3f) | 0xc0; // bits 6 & 7 always come from m_megadrive_io_data_regs
245233   static const char *const pad3names[] = { "PAD1", "PAD2", "IN0", "UNK" };
246234   static const char *const pad6names[] = { "EXTRA1", "EXTRA2", "IN0", "UNK" };
247235
248   if (megadrive_io_data_regs[portnum] & 0x40)
236   if (m_megadrive_io_data_regs[portnum] & 0x40)
249237   {
250      if (io_stage[portnum] == 2)
238      if (m_io_stage[portnum] == 2)
251239      {
252240         /* here we read B, C & the additional buttons */
253         retdata = (megadrive_io_data_regs[portnum] & helper) |
241         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
254242                  (((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x30) |
255243                     (machine.root_device().ioport(pad6names[portnum])->read_safe(0) & 0x0f)) & ~helper);
256244      }
257245      else
258246      {
259247         /* here we read B, C & the directional buttons */
260         retdata = (megadrive_io_data_regs[portnum] & helper) |
248         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
261249                  ((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x3f) & ~helper);
262250      }
263251   }
264252   else
265253   {
266      if (io_stage[portnum] == 1)
254      if (m_io_stage[portnum] == 1)
267255      {
268256         /* here we read ((Start & A) >> 2) | 0x00 */
269         retdata = (megadrive_io_data_regs[portnum] & helper) |
257         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
270258                  (((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) & ~helper);
271259      }
272      else if (io_stage[portnum]==2)
260      else if (m_io_stage[portnum]==2)
273261      {
274262         /* here we read ((Start & A) >> 2) | 0x0f */
275         retdata = (megadrive_io_data_regs[portnum] & helper) |
263         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
276264                  ((((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) | 0x0f) & ~helper);
277265      }
278266      else
279267      {
280268         /* here we read ((Start & A) >> 2) | Up and Down */
281         retdata = (megadrive_io_data_regs[portnum] & helper) |
269         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
282270                  ((((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
283271                     (machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x03)) & ~helper);
284272      }
285273   }
286274
287//  mame_printf_debug("read io data port stage %d port %d %02x\n",io_stage[portnum],portnum,retdata);
275//  mame_printf_debug("read io data port stage %d port %d %02x\n",m_io_stage[portnum],portnum,retdata);
288276
289277   return retdata | (retdata << 8);
290278}
r22069r22070
293281/************* 3 buttons version **************************/
294282UINT8 megadrive_io_read_data_port_3button(running_machine &machine, int portnum)
295283{
296   UINT8 retdata, helper = (megadrive_io_ctrl_regs[portnum] & 0x7f) | 0x80; // bit 7 always comes from megadrive_io_data_regs
284   UINT8 retdata, helper = (m_megadrive_io_ctrl_regs[portnum] & 0x7f) | 0x80; // bit 7 always comes from m_megadrive_io_data_regs
297285   static const char *const pad3names[] = { "PAD1", "PAD2", "IN0", "UNK" };
298286
299   if (megadrive_io_data_regs[portnum] & 0x40)
287   if (m_megadrive_io_data_regs[portnum] & 0x40)
300288   {
301289      /* here we read B, C & the directional buttons */
302      retdata = (megadrive_io_data_regs[portnum] & helper) |
290      retdata = (m_megadrive_io_data_regs[portnum] & helper) |
303291               (((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x3f) | 0x40) & ~helper);
304292   }
305293   else
306294   {
307295      /* here we read ((Start & A) >> 2) | Up and Down */
308      retdata = (megadrive_io_data_regs[portnum] & helper) |
296      retdata = (m_megadrive_io_data_regs[portnum] & helper) |
309297               ((((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
310298                  (machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x03) | 0x40) & ~helper);
311299   }
r22069r22070
343331static UINT8 megadrive_io_read_ctrl_port(int portnum)
344332{
345333   UINT8 retdata;
346   retdata = megadrive_io_ctrl_regs[portnum];
334   retdata = m_megadrive_io_ctrl_regs[portnum];
347335   //mame_printf_debug("read io ctrl port %d %02x\n",portnum,retdata);
348336
349337   return retdata | (retdata << 8);
r22069r22070
352340static UINT8 megadrive_io_read_tx_port(int portnum)
353341{
354342   UINT8 retdata;
355   retdata = megadrive_io_tx_regs[portnum];
343   retdata = m_megadrive_io_tx_regs[portnum];
356344   return retdata | (retdata << 8);
357345}
358346
r22069r22070
367355}
368356
369357
370READ16_HANDLER( megadriv_68k_io_read )
358READ16_MEMBER(md_base_state::megadriv_68k_io_read )
371359{
372   md_base_state *state = space.machine().driver_data<md_base_state>();
373360   UINT8 retdata;
374361
375362   retdata = 0;
r22069r22070
389376   {
390377      case 0:
391378         logerror("%06x read version register\n", space.device().safe_pc());
392         retdata = state->m_export << 7 | // Export
393                  state->m_pal << 6 | // NTSC or PAL?
394                  (state->m_segacd ? 0x00 : 0x20) | // 0x20 = no sega cd
379         retdata = m_export << 7 | // Export
380                  m_pal << 6 | // NTSC or PAL?
381                  (m_segacd ? 0x00 : 0x20) | // 0x20 = no sega cd
395382                  0x00 | // Unused (Always 0)
396383                  0x00 | // Bit 3 of Version Number
397384                  0x00 | // Bit 2 of Version Number
r22069r22070
436423
437424static void megadrive_io_write_data_port_3button(running_machine &machine, int portnum, UINT16 data)
438425{
439   megadrive_io_data_regs[portnum] = data;
426   m_megadrive_io_data_regs[portnum] = data;
440427   //mame_printf_debug("Writing IO Data Register #%d data %04x\n",portnum,data);
441428
442429}
r22069r22070
446433
447434static void megadrive_io_write_data_port_6button(running_machine &machine, int portnum, UINT16 data)
448435{
449   if (megadrive_io_ctrl_regs[portnum]&0x40)
436   if (m_megadrive_io_ctrl_regs[portnum]&0x40)
450437   {
451      if (((megadrive_io_data_regs[portnum]&0x40)==0x00) && ((data&0x40) == 0x40))
438      if (((m_megadrive_io_data_regs[portnum]&0x40)==0x00) && ((data&0x40) == 0x40))
452439      {
453         io_stage[portnum]++;
454         io_timeout[portnum]->adjust(machine.device<cpu_device>("maincpu")->cycles_to_attotime(8192));
440         m_io_stage[portnum]++;
441         m_io_timeout[portnum]->adjust(machine.device<cpu_device>("maincpu")->cycles_to_attotime(8192));
455442      }
456443
457444   }
458445
459   megadrive_io_data_regs[portnum] = data;
446   m_megadrive_io_data_regs[portnum] = data;
460447   //mame_printf_debug("Writing IO Data Register #%d data %04x\n",portnum,data);
461448
462449}
r22069r22070
466453
467454static void megadrive_io_write_ctrl_port(running_machine &machine, int portnum, UINT16 data)
468455{
469   megadrive_io_ctrl_regs[portnum] = data;
456   m_megadrive_io_ctrl_regs[portnum] = data;
470457//  mame_printf_debug("Setting IO Control Register #%d data %04x\n",portnum,data);
471458}
472459
473460static void megadrive_io_write_tx_port(running_machine &machine, int portnum, UINT16 data)
474461{
475   megadrive_io_tx_regs[portnum] = data;
462   m_megadrive_io_tx_regs[portnum] = data;
476463}
477464
478465static void megadrive_io_write_rx_port(running_machine &machine, int portnum, UINT16 data)
r22069r22070
484471}
485472
486473
487WRITE16_HANDLER( megadriv_68k_io_write )
474WRITE16_MEMBER(md_base_state::megadriv_68k_io_write )
488475{
489476//  mame_printf_debug("IO Write #%02x data %04x mem_mask %04x\n",offset,data,mem_mask);
490477
r22069r22070
532519   AM_RANGE(0x000000, 0x3fffff) AM_ROM
533520   /*      (0x000000 - 0x3fffff) == GAME ROM (4Meg Max, Some games have special banking too) */
534521
535   AM_RANGE(0xa00000, 0xa01fff) AM_READWRITE_LEGACY(megadriv_68k_read_z80_ram,megadriv_68k_write_z80_ram)
536   AM_RANGE(0xa02000, 0xa03fff) AM_WRITE_LEGACY(megadriv_68k_write_z80_ram)
522   AM_RANGE(0xa00000, 0xa01fff) AM_READWRITE(megadriv_68k_read_z80_ram,megadriv_68k_write_z80_ram)
523   AM_RANGE(0xa02000, 0xa03fff) AM_WRITE(megadriv_68k_write_z80_ram)
537524   AM_RANGE(0xa04000, 0xa04003) AM_READWRITE8(megadriv_68k_YM2612_read,megadriv_68k_YM2612_write, 0xffff)
538525
539   AM_RANGE(0xa06000, 0xa06001) AM_WRITE_LEGACY(megadriv_68k_z80_bank_write)
526   AM_RANGE(0xa06000, 0xa06001) AM_WRITE(megadriv_68k_z80_bank_write)
540527
541   AM_RANGE(0xa10000, 0xa1001f) AM_READWRITE_LEGACY(megadriv_68k_io_read,megadriv_68k_io_write)
528   AM_RANGE(0xa10000, 0xa1001f) AM_READWRITE(megadriv_68k_io_read,megadriv_68k_io_write)
542529
543   AM_RANGE(0xa11100, 0xa11101) AM_READWRITE_LEGACY(megadriv_68k_check_z80_bus,megadriv_68k_req_z80_bus)
544   AM_RANGE(0xa11200, 0xa11201) AM_WRITE_LEGACY(megadriv_68k_req_z80_reset)
530   AM_RANGE(0xa11100, 0xa11101) AM_READWRITE(megadriv_68k_check_z80_bus,megadriv_68k_req_z80_bus)
531   AM_RANGE(0xa11200, 0xa11201) AM_WRITE(megadriv_68k_req_z80_reset)
545532
546533   /* these are fake - remove allocs in VIDEO_START to use these to view ram instead */
547534//  AM_RANGE(0xb00000, 0xb0ffff) AM_RAM AM_SHARE("megadrive_vdp_vram")
r22069r22070
560547/* z80 sounds/sub CPU */
561548
562549
563static READ16_HANDLER( megadriv_68k_read_z80_ram )
550READ16_MEMBER(md_base_state::megadriv_68k_read_z80_ram )
564551{
565   md_base_state *state = space.machine().driver_data<md_base_state>();
566552   //mame_printf_debug("read z80 ram %04x\n",mem_mask);
567553
568   if ((state->m_genz80.z80_has_bus == 0) && (state->m_genz80.z80_is_reset == 0))
554   if ((m_genz80.z80_has_bus == 0) && (m_genz80.z80_is_reset == 0))
569555   {
570      return state->m_genz80.z80_prgram[(offset<<1)^1] | (state->m_genz80.z80_prgram[(offset<<1)]<<8);
556      return m_genz80.z80_prgram[(offset<<1)^1] | (m_genz80.z80_prgram[(offset<<1)]<<8);
571557   }
572558   else
573559   {
r22069r22070
576562   }
577563}
578564
579static WRITE16_HANDLER( megadriv_68k_write_z80_ram )
565WRITE16_MEMBER(md_base_state::megadriv_68k_write_z80_ram )
580566{
581   md_base_state *state = space.machine().driver_data<md_base_state>();
582567   //logerror("write z80 ram\n");
583568
584   if ((state->m_genz80.z80_has_bus == 0) && (state->m_genz80.z80_is_reset == 0))
569   if ((m_genz80.z80_has_bus == 0) && (m_genz80.z80_is_reset == 0))
585570   {
586571      if (!ACCESSING_BITS_0_7) // byte (MSB) access
587572      {
588         state->m_genz80.z80_prgram[(offset<<1)] = (data & 0xff00) >> 8;
573         m_genz80.z80_prgram[(offset<<1)] = (data & 0xff00) >> 8;
589574      }
590575      else if (!ACCESSING_BITS_8_15)
591576      {
592         state->m_genz80.z80_prgram[(offset<<1)^1] = (data & 0x00ff);
577         m_genz80.z80_prgram[(offset<<1)^1] = (data & 0x00ff);
593578      }
594579      else // for WORD access only the MSB is used, LSB is ignored
595580      {
596         state->m_genz80.z80_prgram[(offset<<1)] = (data & 0xff00) >> 8;
581         m_genz80.z80_prgram[(offset<<1)] = (data & 0xff00) >> 8;
597582      }
598583   }
599584   else
r22069r22070
603588}
604589
605590
606static READ16_HANDLER( megadriv_68k_check_z80_bus )
591READ16_MEMBER(md_base_state::megadriv_68k_check_z80_bus )
607592{
608   md_base_state *state = space.machine().driver_data<md_base_state>();
609593   UINT16 retvalue;
610594
611595   /* Double Dragon, Shadow of the Beast, Super Off Road, and Time Killers have buggy
r22069r22070
621605   /* Check if the 68k has the z80 bus */
622606   if (!ACCESSING_BITS_0_7) // byte (MSB) access
623607   {
624      if (state->m_genz80.z80_has_bus || state->m_genz80.z80_is_reset) retvalue = nextvalue | 0x0100;
608      if (m_genz80.z80_has_bus || m_genz80.z80_is_reset) retvalue = nextvalue | 0x0100;
625609      else retvalue = (nextvalue & 0xfeff);
626610
627611      //logerror("%06x: 68000 check z80 Bus (byte MSB access) returning %04x mask %04x\n", space.device().safe_pc(),retvalue, mem_mask);
r22069r22070
631615   else if (!ACCESSING_BITS_8_15) // is this valid?
632616   {
633617      //logerror("%06x: 68000 check z80 Bus (byte LSB access) %04x\n", space.device().safe_pc(),mem_mask);
634      if (state->m_genz80.z80_has_bus || state->m_genz80.z80_is_reset) retvalue = 0x0001;
618      if (m_genz80.z80_has_bus || m_genz80.z80_is_reset) retvalue = 0x0001;
635619      else retvalue = 0x0000;
636620
637621      return retvalue;
r22069r22070
639623   else
640624   {
641625      //logerror("%06x: 68000 check z80 Bus (word access) %04x\n", space.device().safe_pc(),mem_mask);
642      if (state->m_genz80.z80_has_bus || state->m_genz80.z80_is_reset) retvalue = nextvalue | 0x0100;
626      if (m_genz80.z80_has_bus || m_genz80.z80_is_reset) retvalue = nextvalue | 0x0100;
643627      else retvalue = (nextvalue & 0xfeff);
644628
645629   //  mame_printf_debug("%06x: 68000 check z80 Bus (word access) %04x %04x\n", space.device().safe_pc(),mem_mask, retvalue);
r22069r22070
648632}
649633
650634
651static TIMER_CALLBACK( megadriv_z80_run_state )
635TIMER_CALLBACK_MEMBER(md_base_state::megadriv_z80_run_state)
652636{
653   md_base_state *state = machine.driver_data<md_base_state>();
654637   /* Is the z80 RESET line pulled? */
655   if (state->m_genz80.z80_is_reset)
638   if (m_genz80.z80_is_reset)
656639   {
657      state->m_z80snd->reset();
658      state->m_z80snd->suspend(SUSPEND_REASON_HALT, 1);
659      machine.device("ymsnd")->reset();
640      m_z80snd->reset();
641      m_z80snd->suspend(SUSPEND_REASON_HALT, 1);
642      machine().device("ymsnd")->reset();
660643   }
661644   else
662645   {
663646      /* Check if z80 has the bus */
664      if (state->m_genz80.z80_has_bus)
665         state->m_z80snd->resume(SUSPEND_REASON_HALT);
647      if (m_genz80.z80_has_bus)
648         m_z80snd->resume(SUSPEND_REASON_HALT);
666649      else
667         state->m_z80snd->suspend(SUSPEND_REASON_HALT, 1);
650         m_z80snd->suspend(SUSPEND_REASON_HALT, 1);
668651   }
669652}
670653
671654
672static WRITE16_HANDLER( megadriv_68k_req_z80_bus )
655WRITE16_MEMBER(md_base_state::megadriv_68k_req_z80_bus )
673656{
674   md_base_state *state = space.machine().driver_data<md_base_state>();
675657   /* Request the Z80 bus, allows 68k to read/write Z80 address space */
676658   if (!ACCESSING_BITS_0_7) // byte access
677659   {
678660      if (data & 0x0100)
679661      {
680662         //logerror("%06x: 68000 request z80 Bus (byte MSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
681         state->m_genz80.z80_has_bus = 0;
663         m_genz80.z80_has_bus = 0;
682664      }
683665      else
684666      {
685667         //logerror("%06x: 68000 return z80 Bus (byte MSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
686         state->m_genz80.z80_has_bus = 1;
668         m_genz80.z80_has_bus = 1;
687669      }
688670   }
689671   else if (!ACCESSING_BITS_8_15) // is this valid?
r22069r22070
691673      if (data & 0x0001)
692674      {
693675         //logerror("%06x: 68000 request z80 Bus (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
694         state->m_genz80.z80_has_bus = 0;
676         m_genz80.z80_has_bus = 0;
695677      }
696678      else
697679      {
698680         //logerror("%06x: 68000 return z80 Bus (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
699         state->m_genz80.z80_has_bus = 1;
681         m_genz80.z80_has_bus = 1;
700682      }
701683   }
702684   else // word access
r22069r22070
704686      if (data & 0x0100)
705687      {
706688         //logerror("%06x: 68000 request z80 Bus (word access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
707         state->m_genz80.z80_has_bus = 0;
689         m_genz80.z80_has_bus = 0;
708690      }
709691      else
710692      {
711693         //logerror("%06x: 68000 return z80 Bus (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
712         state->m_genz80.z80_has_bus = 1;
694         m_genz80.z80_has_bus = 1;
713695      }
714696   }
715697
716698   /* If the z80 is running, sync the z80 execution state */
717   if (!state->m_genz80.z80_is_reset)
718      space.machine().scheduler().timer_set(attotime::zero, FUNC(megadriv_z80_run_state));
699   if (!m_genz80.z80_is_reset)
700      machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(md_base_state::megadriv_z80_run_state),this));
719701}
720702
721static WRITE16_HANDLER ( megadriv_68k_req_z80_reset )
703WRITE16_MEMBER(md_base_state::megadriv_68k_req_z80_reset )
722704{
723   md_base_state *state = space.machine().driver_data<md_base_state>();
724705   if (!ACCESSING_BITS_0_7) // byte access
725706   {
726707      if (data & 0x0100)
727708      {
728709         //logerror("%06x: 68000 clear z80 reset (byte MSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
729         state->m_genz80.z80_is_reset = 0;
710         m_genz80.z80_is_reset = 0;
730711      }
731712      else
732713      {
733714         //logerror("%06x: 68000 start z80 reset (byte MSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
734         state->m_genz80.z80_is_reset = 1;
715         m_genz80.z80_is_reset = 1;
735716      }
736717   }
737718   else if (!ACCESSING_BITS_8_15) // is this valid?
r22069r22070
739720      if (data & 0x0001)
740721      {
741722         //logerror("%06x: 68000 clear z80 reset (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
742         state->m_genz80.z80_is_reset = 0;
723         m_genz80.z80_is_reset = 0;
743724      }
744725      else
745726      {
746727         //logerror("%06x: 68000 start z80 reset (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
747         state->m_genz80.z80_is_reset = 1;
728         m_genz80.z80_is_reset = 1;
748729      }
749730   }
750731   else // word access
r22069r22070
752733      if (data & 0x0100)
753734      {
754735         //logerror("%06x: 68000 clear z80 reset (word access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
755         state->m_genz80.z80_is_reset = 0;
736         m_genz80.z80_is_reset = 0;
756737      }
757738      else
758739      {
759740         //logerror("%06x: 68000 start z80 reset (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask);
760         state->m_genz80.z80_is_reset = 1;
741         m_genz80.z80_is_reset = 1;
761742      }
762743   }
763   space.machine().scheduler().timer_set( attotime::zero, FUNC(megadriv_z80_run_state ));
744   machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(md_base_state::megadriv_z80_run_state),this));
764745}
765746
766747
r22069r22070
768749// add-on hardware which changes the cpu mapping like the 32x and SegaCD.
769750// - we might need to add exceptions for example, z80 reading / writing the
770751//   z80 area of the 68k if games misbehave
771static READ8_HANDLER( z80_read_68k_banked_data )
752READ8_MEMBER(md_base_state::z80_read_68k_banked_data )
772753{
773   md_base_state *state = space.machine().driver_data<md_base_state>();
774   address_space &space68k = state->m_maincpu->space();
775   UINT8 ret = space68k.read_byte(state->m_genz80.z80_bank_addr+offset);
754   address_space &space68k = m_maincpu->space();
755   UINT8 ret = space68k.read_byte(m_genz80.z80_bank_addr+offset);
776756   return ret;
777757}
778758
779static WRITE8_HANDLER( z80_write_68k_banked_data )
759WRITE8_MEMBER(md_base_state::z80_write_68k_banked_data )
780760{
781   md_base_state *state = space.machine().driver_data<md_base_state>();
782   address_space &space68k = state->m_maincpu->space();
783   space68k.write_byte(state->m_genz80.z80_bank_addr+offset,data);
761   address_space &space68k = m_maincpu->space();
762   space68k.write_byte(m_genz80.z80_bank_addr+offset,data);
784763}
785764
786765
787static WRITE8_HANDLER( megadriv_z80_vdp_write )
766WRITE8_MEMBER(md_base_state::megadriv_z80_vdp_write )
788767{
789768   switch (offset)
790769   {
r22069r22070
804783
805784
806785
807static READ8_HANDLER( megadriv_z80_vdp_read )
786READ8_MEMBER(md_base_state::megadriv_z80_vdp_read )
808787{
809788   mame_printf_debug("megadriv_z80_vdp_read %02x\n",offset);
810789   return space.machine().rand();
811790}
812791
813static READ8_HANDLER( megadriv_z80_unmapped_read )
792READ8_MEMBER(md_base_state::megadriv_z80_unmapped_read )
814793{
815794   return 0xff;
816795}
817796
818static ADDRESS_MAP_START( megadriv_z80_map, AS_PROGRAM, 8, driver_device )
797static ADDRESS_MAP_START( megadriv_z80_map, AS_PROGRAM, 8, md_base_state )
819798   AM_RANGE(0x0000, 0x1fff) AM_RAMBANK("bank1") AM_MIRROR(0x2000) // RAM can be accessed by the 68k
820799   AM_RANGE(0x4000, 0x4003) AM_DEVREADWRITE_LEGACY("ymsnd", ym2612_r,ym2612_w)
821800
822   AM_RANGE(0x6000, 0x6000) AM_WRITE_LEGACY(megadriv_z80_z80_bank_w)
823   AM_RANGE(0x6001, 0x6001) AM_WRITE_LEGACY(megadriv_z80_z80_bank_w) // wacky races uses this address
801   AM_RANGE(0x6000, 0x6000) AM_WRITE(megadriv_z80_z80_bank_w)
802   AM_RANGE(0x6001, 0x6001) AM_WRITE(megadriv_z80_z80_bank_w) // wacky races uses this address
824803
825   AM_RANGE(0x6100, 0x7eff) AM_READ_LEGACY(megadriv_z80_unmapped_read)
804   AM_RANGE(0x6100, 0x7eff) AM_READ(megadriv_z80_unmapped_read)
826805
827   AM_RANGE(0x7f00, 0x7fff) AM_READWRITE_LEGACY(megadriv_z80_vdp_read,megadriv_z80_vdp_write)
806   AM_RANGE(0x7f00, 0x7fff) AM_READWRITE(megadriv_z80_vdp_read,megadriv_z80_vdp_write)
828807
829   AM_RANGE(0x8000, 0xffff) AM_READWRITE_LEGACY(z80_read_68k_banked_data,z80_write_68k_banked_data) // The Z80 can read the 68k address space this way
808   AM_RANGE(0x8000, 0xffff) AM_READWRITE(z80_read_68k_banked_data,z80_write_68k_banked_data) // The Z80 can read the 68k address space this way
830809ADDRESS_MAP_END
831810
832static ADDRESS_MAP_START( megadriv_z80_io_map, AS_IO, 8, driver_device )
811static ADDRESS_MAP_START( megadriv_z80_io_map, AS_IO, 8, md_base_state )
833812   ADDRESS_MAP_GLOBAL_MASK(0xff)
834813   AM_RANGE(0x0000, 0xff) AM_NOP
835814ADDRESS_MAP_END
r22069r22070
842821   AM_RANGE(0x000000, 0x0fffff) AM_ROM /* Cartridge Program Rom */
843822   AM_RANGE(0x200000, 0x2023ff) AM_RAM // tested
844823
845   AM_RANGE(0xa00000, 0xa01fff) AM_READWRITE_LEGACY(megadriv_68k_read_z80_ram, megadriv_68k_write_z80_ram)
846   AM_RANGE(0xa02000, 0xa03fff) AM_WRITE_LEGACY(megadriv_68k_write_z80_ram)
824   AM_RANGE(0xa00000, 0xa01fff) AM_READWRITE(megadriv_68k_read_z80_ram, megadriv_68k_write_z80_ram)
825   AM_RANGE(0xa02000, 0xa03fff) AM_WRITE(megadriv_68k_write_z80_ram)
847826   AM_RANGE(0xa04000, 0xa04003) AM_READWRITE8(megadriv_68k_YM2612_read, megadriv_68k_YM2612_write, 0xffff)
848   AM_RANGE(0xa06000, 0xa06001) AM_WRITE_LEGACY(megadriv_68k_z80_bank_write)
827   AM_RANGE(0xa06000, 0xa06001) AM_WRITE(megadriv_68k_z80_bank_write)
849828
850   AM_RANGE(0xa10000, 0xa1001f) AM_READWRITE_LEGACY(megadriv_68k_io_read, megadriv_68k_io_write)
851   AM_RANGE(0xa11100, 0xa11101) AM_READWRITE_LEGACY(megadriv_68k_check_z80_bus, megadriv_68k_req_z80_bus)
852   AM_RANGE(0xa11200, 0xa11201) AM_WRITE_LEGACY(megadriv_68k_req_z80_reset)
829   AM_RANGE(0xa10000, 0xa1001f) AM_READWRITE(megadriv_68k_io_read, megadriv_68k_io_write)
830   AM_RANGE(0xa11100, 0xa11101) AM_READWRITE(megadriv_68k_check_z80_bus, megadriv_68k_req_z80_bus)
831   AM_RANGE(0xa11200, 0xa11201) AM_WRITE(megadriv_68k_req_z80_reset)
853832
854833   AM_RANGE(0xc00000, 0xc0001f) AM_DEVREADWRITE("gen_vdp", sega_genesis_vdp_device, megadriv_vdp_r,megadriv_vdp_w)
855834   AM_RANGE(0xd00000, 0xd0001f) AM_DEVREADWRITE("gen_vdp", sega_genesis_vdp_device, megadriv_vdp_r,megadriv_vdp_w)
r22069r22070
902881
903882MACHINE_START( megadriv )
904883{
905   if (megadrive_6buttons_pad)
884   if (m_megadrive_6buttons_pad)
906885      init_megadri6_io(machine);
907886}
908887
r22069r22070
919898      state->m_genz80.z80_has_bus = 1;
920899      state->m_genz80.z80_bank_addr = 0;
921900      state->m_vdp->set_scanline_counter(-1);
922      machine.scheduler().timer_set(attotime::zero, FUNC(megadriv_z80_run_state));
901      machine.scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(md_base_state::megadriv_z80_run_state),state));
923902   }
924903
925904   megadrive_reset_io(machine);
r22069r22070
11931172   m68k_set_tas_callback(machine().device("maincpu"), megadriv_tas_callback);
11941173
11951174   // the drivers which need 6 buttons pad set this to 1 in their init befare calling the megadrive init
1196   if (megadrive_6buttons_pad)
1175   if (m_megadrive_6buttons_pad)
11971176   {
11981177      megadrive_io_read_data_port_ptr = megadrive_io_read_data_port_6button;
11991178      megadrive_io_write_data_port_ptr = megadrive_io_write_data_port_6button;
r22069r22070
13201299}
13211300
13221301/* used by megatech */
1323static READ8_HANDLER( z80_unmapped_port_r )
1302READ8_MEMBER(md_base_state::z80_unmapped_port_r )
13241303{
13251304//  printf("unmapped z80 port read %04x\n",offset);
13261305   return 0;
13271306}
13281307
1329static WRITE8_HANDLER( z80_unmapped_port_w )
1308WRITE8_MEMBER(md_base_state::z80_unmapped_port_w )
13301309{
13311310//  printf("unmapped z80 port write %04x\n",offset);
13321311}
13331312
1334static READ8_HANDLER( z80_unmapped_r )
1313READ8_MEMBER(md_base_state::z80_unmapped_r )
13351314{
13361315   printf("unmapped z80 read %04x\n",offset);
13371316   return 0;
13381317}
13391318
1340static WRITE8_HANDLER( z80_unmapped_w )
1319WRITE8_MEMBER(md_base_state::z80_unmapped_w )
13411320{
13421321   printf("unmapped z80 write %04x\n",offset);
13431322}
13441323
13451324
13461325/* sets the megadrive z80 to it's normal ports / map */
1347void megatech_set_megadrive_z80_as_megadrive_z80(running_machine &machine, const char* tag)
1326void mtech_state::megatech_set_megadrive_z80_as_megadrive_z80(const char* tag)
13481327{
1349   md_base_state *state = machine.driver_data<md_base_state>();
1350   device_t *ym = machine.device("ymsnd");
1328   device_t *ym = machine().device("ymsnd");
13511329
13521330   /* INIT THE PORTS *********************************************************************************************/
1353   machine.device(tag)->memory().space(AS_IO).install_legacy_readwrite_handler(0x0000, 0xffff, FUNC(z80_unmapped_port_r), FUNC(z80_unmapped_port_w));
1331   machine().device(tag)->memory().space(AS_IO).install_readwrite_handler(0x0000, 0xffff, read8_delegate(FUNC(mtech_state::z80_unmapped_port_r),this), write8_delegate(FUNC(mtech_state::z80_unmapped_port_w),this));
13541332
13551333   /* catch any addresses that don't get mapped */
1356   machine.device(tag)->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x0000, 0xffff, FUNC(z80_unmapped_r), FUNC(z80_unmapped_w));
1334   machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_handler(0x0000, 0xffff, read8_delegate(FUNC(mtech_state::z80_unmapped_r),this), write8_delegate(FUNC(mtech_state::z80_unmapped_w),this));
13571335
13581336
1359   machine.device(tag)->memory().space(AS_PROGRAM).install_readwrite_bank(0x0000, 0x1fff, "bank1");
1360   machine.root_device().membank("bank1")->set_base(state->m_genz80.z80_prgram);
1337   machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_bank(0x0000, 0x1fff, "bank1");
1338   machine().root_device().membank("bank1")->set_base(m_genz80.z80_prgram);
13611339
1362   machine.device(tag)->memory().space(AS_PROGRAM).install_ram(0x0000, 0x1fff, state->m_genz80.z80_prgram);
1340   machine().device(tag)->memory().space(AS_PROGRAM).install_ram(0x0000, 0x1fff, m_genz80.z80_prgram);
13631341
13641342
1365   machine.device(tag)->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(*ym, 0x4000, 0x4003, FUNC(ym2612_r), FUNC(ym2612_w));
1366   machine.device(tag)->memory().space(AS_PROGRAM).install_legacy_write_handler    (0x6000, 0x6000, FUNC(megadriv_z80_z80_bank_w));
1367   machine.device(tag)->memory().space(AS_PROGRAM).install_legacy_write_handler    (0x6001, 0x6001, FUNC(megadriv_z80_z80_bank_w));
1368   machine.device(tag)->memory().space(AS_PROGRAM).install_legacy_read_handler     (0x6100, 0x7eff, FUNC(megadriv_z80_unmapped_read));
1369   machine.device(tag)->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x7f00, 0x7fff, FUNC(megadriv_z80_vdp_read), FUNC(megadriv_z80_vdp_write));
1370   machine.device(tag)->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(0x8000, 0xffff, FUNC(z80_read_68k_banked_data), FUNC(z80_write_68k_banked_data));
1343   machine().device(tag)->memory().space(AS_PROGRAM).install_legacy_readwrite_handler(*ym, 0x4000, 0x4003, FUNC(ym2612_r), FUNC(ym2612_w));
1344   machine().device(tag)->memory().space(AS_PROGRAM).install_write_handler    (0x6000, 0x6000, write8_delegate(FUNC(mtech_state::megadriv_z80_z80_bank_w),this));
1345   machine().device(tag)->memory().space(AS_PROGRAM).install_write_handler    (0x6001, 0x6001, write8_delegate(FUNC(mtech_state::megadriv_z80_z80_bank_w),this));
1346   machine().device(tag)->memory().space(AS_PROGRAM).install_read_handler     (0x6100, 0x7eff, read8_delegate(FUNC(mtech_state::megadriv_z80_unmapped_read),this));
1347   machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_handler(0x7f00, 0x7fff, read8_delegate(FUNC(mtech_state::megadriv_z80_vdp_read),this), write8_delegate(FUNC(mtech_state::megadriv_z80_vdp_write),this));
1348   machine().device(tag)->memory().space(AS_PROGRAM).install_readwrite_handler(0x8000, 0xffff, read8_delegate(FUNC(mtech_state::z80_read_68k_banked_data),this), write8_delegate(FUNC(mtech_state::z80_write_68k_banked_data),this));
13711349}
13721350
13731351
trunk/src/mame/machine/megavdp.c
r22069r22070
99
1010#include "sound/sn76496.h"
1111
12extern timer_device* megadriv_scanline_timer;
12timer_device* megadriv_scanline_timer;
1313
1414
1515#define MAX_HPOSITION 480
trunk/src/mame/includes/megadriv.h
r22069r22070
4242extern UINT8 megatech_bios_port_cc_dc_r(running_machine &machine, int offset, int ctrl);
4343extern void megadriv_stop_scanline_timer(running_machine &machine);
4444
45void megatech_set_megadrive_z80_as_megadrive_z80(running_machine &machine, const char* tag);
4645
47
48/* These handlers are needed by megaplay.c */
49extern DECLARE_READ16_HANDLER( megadriv_68k_io_read );
50extern DECLARE_WRITE16_HANDLER( megadriv_68k_io_write );
51
52
5346/* These are needed to create external input handlers (see e.g. MESS) */
5447/* Regs are also used by Megaplay! */
5548extern UINT8 (*megadrive_io_read_data_port_ptr)(running_machine &machine, int offset);
5649extern void (*megadrive_io_write_data_port_ptr)(running_machine &machine, int offset, UINT16 data);
57extern UINT8 megadrive_io_data_regs[3];
58extern UINT8 megadrive_io_ctrl_regs[3];
50extern UINT8 m_megadrive_io_data_regs[3];
51extern UINT8 m_megadrive_io_ctrl_regs[3];
5952
6053MACHINE_START( megadriv );
6154MACHINE_RESET( megadriv );
r22069r22070
6760
6861
6962
70extern int megadrive_6buttons_pad;
63extern int m_megadrive_6buttons_pad;
7164
7265/* Megaplay - Megatech specific */
7366/* It might be possible to move the following structs in the drivers */
r22069r22070
121114   void megadriv_init_common();
122115
123116   DECLARE_DEVICE_IMAGE_LOAD_MEMBER( _32x_cart );
117   
118   void megadriv_z80_bank_w(UINT16 data);
119   DECLARE_WRITE16_MEMBER( megadriv_68k_z80_bank_write );
120   DECLARE_WRITE8_MEMBER(megadriv_z80_z80_bank_w);
121   DECLARE_READ16_MEMBER( megadriv_68k_io_read );
122   DECLARE_WRITE16_MEMBER( megadriv_68k_io_write );
123   DECLARE_READ16_MEMBER( megadriv_68k_read_z80_ram );
124   DECLARE_WRITE16_MEMBER( megadriv_68k_write_z80_ram );
125   DECLARE_READ16_MEMBER( megadriv_68k_check_z80_bus );
126   DECLARE_WRITE16_MEMBER( megadriv_68k_req_z80_bus );
127   DECLARE_WRITE16_MEMBER ( megadriv_68k_req_z80_reset );
128   DECLARE_READ8_MEMBER( z80_read_68k_banked_data );
129   DECLARE_WRITE8_MEMBER( z80_write_68k_banked_data );
130   DECLARE_WRITE8_MEMBER( megadriv_z80_vdp_write );
131   DECLARE_READ8_MEMBER( megadriv_z80_vdp_read );
132   DECLARE_READ8_MEMBER( megadriv_z80_unmapped_read );
133   DECLARE_READ8_MEMBER( z80_unmapped_port_r );
134   DECLARE_WRITE8_MEMBER( z80_unmapped_port_w );
135   DECLARE_READ8_MEMBER( z80_unmapped_r );
136   DECLARE_WRITE8_MEMBER( z80_unmapped_w );   
137   TIMER_CALLBACK_MEMBER(megadriv_z80_run_state);
124138};
125139
126140class md_boot_state : public md_base_state
r22069r22070
318332
319333   UINT32 screen_update_megplay(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
320334   void screen_eof_megaplay(screen_device &screen, bool state);
335   
336   DECLARE_READ8_MEMBER( megaplay_bios_banksel_r );
337   DECLARE_WRITE8_MEMBER( megaplay_bios_banksel_w );
338   DECLARE_READ8_MEMBER( megaplay_bios_gamesel_r );
339   DECLARE_WRITE8_MEMBER( megaplay_bios_gamesel_w );
340   DECLARE_WRITE16_MEMBER( megaplay_io_write );
341   DECLARE_READ16_MEMBER( megaplay_io_read );
342   DECLARE_READ8_MEMBER( bank_r );
343   DECLARE_WRITE8_MEMBER( bank_w );
344   DECLARE_READ8_MEMBER( megaplay_bios_6402_r );
345   DECLARE_WRITE8_MEMBER( megaplay_bios_6402_w );
346   DECLARE_READ8_MEMBER( megaplay_bios_6204_r );
347   DECLARE_WRITE8_MEMBER( megaplay_bios_width_w );
348   DECLARE_READ8_MEMBER( megaplay_bios_6404_r );
349   DECLARE_WRITE8_MEMBER( megaplay_bios_6404_w );
350   DECLARE_READ8_MEMBER( megaplay_bios_6600_r );
351   DECLARE_WRITE8_MEMBER( megaplay_bios_6600_w );
352   DECLARE_WRITE8_MEMBER( megaplay_game_w );
353   void mplay_start();
354   DECLARE_READ16_MEMBER( megadriv_68k_read_z80_extra_ram );
355   DECLARE_WRITE16_MEMBER( megadriv_68k_write_z80_extra_ram );   
321356};
322357
323358class mtech_state : public md_base_state
r22069r22070
358393   UINT32 screen_update_mtnew(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
359394   void screen_eof_mtnew(screen_device &screen, bool state);
360395   UINT32 screen_update_megatech_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
396   
397   void megatech_set_megadrive_z80_as_megadrive_z80(const char* tag);
361398};
362399
363400

Previous 199869 Revisions Next


© 1997-2024 The MAME Team