Previous 199869 Revisions Next

r22071 Monday 25th March, 2013 at 11:49:43 UTC by Miodrag Milanović
some more megadriv modernization (nw)
[src/mame/drivers]megatech.c segac2.c
[src/mame/includes]megadriv.h
[src/mame/machine]megadriv.c
[src/mess/drivers]megadriv.c

trunk/src/mame/drivers/segac2.c
r22070r22071
8888#define LOG_PALETTE         0
8989#define LOG_IOCHIP          0
9090
91int segac2_bg_pal_lookup[4];
92int segac2_sp_pal_lookup[4];
93
94static void recompute_palette_tables( running_machine &machine );
95
9691/******************************************************************************
9792    Machine init
9893*******************************************************************************
r22070r22071
114109{
115110//  megadriv_scanline_timer = machine().device<timer_device>("md_scan_timer");
116111//  megadriv_scanline_timer->adjust(attotime::zero);
117   segac2_bg_pal_lookup[0] = 0x00;
118   segac2_bg_pal_lookup[1] = 0x10;
119   segac2_bg_pal_lookup[2] = 0x20;
120   segac2_bg_pal_lookup[3] = 0x30;
112   m_segac2_bg_pal_lookup[0] = 0x00;
113   m_segac2_bg_pal_lookup[1] = 0x10;
114   m_segac2_bg_pal_lookup[2] = 0x20;
115   m_segac2_bg_pal_lookup[3] = 0x30;
121116
122   segac2_sp_pal_lookup[0] = 0x00;
123   segac2_sp_pal_lookup[1] = 0x10;
124   segac2_sp_pal_lookup[2] = 0x20;
125   segac2_sp_pal_lookup[3] = 0x30;
117   m_segac2_sp_pal_lookup[0] = 0x00;
118   m_segac2_sp_pal_lookup[1] = 0x10;
119   m_segac2_sp_pal_lookup[2] = 0x20;
120   m_segac2_sp_pal_lookup[3] = 0x30;
126121
127122   megadriv_reset_vdp(machine());
128123
r22070r22071
140135   m_bg_palbase = 0;
141136   m_sp_palbase = 0;
142137
143   recompute_palette_tables(machine());
138   recompute_palette_tables();
144139
145140}
146141
r22070r22071
159154******************************************************************************/
160155
161156/* handle writes to the UPD7759 */
162static WRITE16_DEVICE_HANDLER( segac2_upd7759_w )
157WRITE16_MEMBER(segac2_state::segac2_upd7759_w )
163158{
164   segac2_state *state = space.machine().driver_data<segac2_state>();
165
159   device_t *upd = machine().device("upd");
166160   /* make sure we have a UPD chip */
167   if (!state->m_sound_banks)
161   if (!m_sound_banks)
168162      return;
169163
170164   /* only works if we're accessing the low byte */
171165   if (ACCESSING_BITS_0_7)
172166   {
173      upd7759_port_w(device, space, 0, data & 0xff);
174      upd7759_start_w(device, 0);
175      upd7759_start_w(device, 1);
167      upd7759_port_w(upd, space, 0, data & 0xff);
168      upd7759_start_w(upd, 0);
169      upd7759_start_w(upd, 1);
176170   }
177171}
178172
r22070r22071
195189******************************************************************************/
196190
197191/* handle reads from the paletteram */
198static READ16_HANDLER( palette_r )
192READ16_MEMBER(segac2_state::palette_r )
199193{
200   segac2_state *state = space.machine().driver_data<segac2_state>();
201194   offset &= 0x1ff;
202   if (state->m_segac2_alt_palette_mode)
195   if (m_segac2_alt_palette_mode)
203196      offset = ((offset << 1) & 0x100) | ((offset << 2) & 0x80) | ((~offset >> 2) & 0x40) | ((offset >> 1) & 0x20) | (offset & 0x1f);
204197
205   return state->m_paletteram[offset + state->m_palbank * 0x200];
198   return m_paletteram[offset + m_palbank * 0x200];
206199}
207200
208201/* handle writes to the paletteram */
209static WRITE16_HANDLER( palette_w )
202WRITE16_MEMBER(segac2_state::palette_w )
210203{
211   segac2_state *state = space.machine().driver_data<segac2_state>();
212204   int r, g, b, newword;
213205   int tmpr, tmpg, tmpb;
214206
215207   /* adjust for the palette bank */
216208   offset &= 0x1ff;
217   if (state->m_segac2_alt_palette_mode)
209   if (m_segac2_alt_palette_mode)
218210      offset = ((offset << 1) & 0x100) | ((offset << 2) & 0x80) | ((~offset >> 2) & 0x40) | ((offset >> 1) & 0x20) | (offset & 0x1f);
219   offset += state->m_palbank * 0x200;
211   offset += m_palbank * 0x200;
220212
221213   /* combine data */
222   COMBINE_DATA(&state->m_paletteram[offset]);
223   newword = state->m_paletteram[offset];
214   COMBINE_DATA(&m_paletteram[offset]);
215   newword = m_paletteram[offset];
224216
225217   /* up to 8 bits */
226218   r = ((newword << 1) & 0x1e) | ((newword >> 12) & 0x01);
r22070r22071
276268
277269******************************************************************************/
278270
279static void recompute_palette_tables( running_machine &machine )
271void segac2_state::recompute_palette_tables()
280272{
281   segac2_state *state = machine.driver_data<segac2_state>();
282273   int i;
283274
284275   for (i = 0; i < 4; i++)
285276   {
286      int bgpal = 0x000 + state->m_bg_palbase * 0x40 + i * 0x10;
287      int sppal = 0x100 + state->m_sp_palbase * 0x40 + i * 0x10;
277      int bgpal = 0x000 + m_bg_palbase * 0x40 + i * 0x10;
278      int sppal = 0x100 + m_sp_palbase * 0x40 + i * 0x10;
288279
289      if (!state->m_segac2_alt_palette_mode)
280      if (!m_segac2_alt_palette_mode)
290281      {
291         segac2_bg_pal_lookup[i] = 0x200 * state->m_palbank + bgpal;
292         segac2_sp_pal_lookup[i] = 0x200 * state->m_palbank + sppal;
282         m_segac2_bg_pal_lookup[i] = 0x200 * m_palbank + bgpal;
283         m_segac2_sp_pal_lookup[i] = 0x200 * m_palbank + sppal;
293284      }
294285      else
295286      {
296         segac2_bg_pal_lookup[i] = 0x200 * state->m_palbank + ((bgpal << 1) & 0x180) + ((~bgpal >> 2) & 0x40) + (bgpal & 0x30);
297         segac2_sp_pal_lookup[i] = 0x200 * state->m_palbank + ((~sppal << 2) & 0x100) + ((sppal << 2) & 0x80) + ((~sppal >> 2) & 0x40) + ((sppal >> 2) & 0x20) + (sppal & 0x10);
287         m_segac2_bg_pal_lookup[i] = 0x200 * m_palbank + ((bgpal << 1) & 0x180) + ((~bgpal >> 2) & 0x40) + (bgpal & 0x30);
288         m_segac2_sp_pal_lookup[i] = 0x200 * m_palbank + ((~sppal << 2) & 0x100) + ((sppal << 2) & 0x80) + ((~sppal >> 2) & 0x40) + ((sppal >> 2) & 0x20) + (sppal & 0x10);
298289      }
299290   }
300291
r22070r22071
313304
314305******************************************************************************/
315306
316static READ16_HANDLER( io_chip_r )
307READ16_MEMBER(segac2_state::io_chip_r )
317308{
318   segac2_state *state = space.machine().driver_data<segac2_state>();
319309   static const char *const portnames[] = { "P1", "P2", "PORTC", "PORTD", "SERVICE", "COINAGE", "DSW", "PORTH" };
320310   offset &= 0x1f/2;
321311
r22070r22071
331321      case 0x0c/2:
332322      case 0x0e/2:
333323         /* if the port is configured as an output, return the last thing written */
334         if (state->m_misc_io_data[0x1e/2] & (1 << offset))
335            return state->m_misc_io_data[offset];
324         if (m_misc_io_data[0x1e/2] & (1 << offset))
325            return m_misc_io_data[offset];
336326
337327         /* otherwise, return an input port */
338         if (offset == 0x04/2 && state->m_sound_banks)
328         if (offset == 0x04/2 && m_sound_banks)
339329            return (space.machine().root_device().ioport(portnames[offset])->read() & 0xbf) | (upd7759_busy_r(space.machine().device("upd")) << 6);
340330         return space.machine().root_device().ioport(portnames[offset])->read();
341331
r22070r22071
352342      /* CNT register & mirror */
353343      case 0x18/2:
354344      case 0x1c/2:
355         return state->m_misc_io_data[0x1c/2];
345         return m_misc_io_data[0x1c/2];
356346
357347      /* port direction register & mirror */
358348      case 0x1a/2:
359349      case 0x1e/2:
360         return state->m_misc_io_data[0x1e/2];
350         return m_misc_io_data[0x1e/2];
361351   }
362352   return 0xffff;
363353}
364354
365355
366static WRITE16_HANDLER( io_chip_w )
356WRITE16_MEMBER(segac2_state::io_chip_w )
367357{
368   segac2_state *state = space.machine().driver_data<segac2_state>();
369358   UINT8 newbank;
370359//  UINT8 old;
371360
372361   /* generic implementation */
373362   offset &= 0x1f/2;
374//  old = state->m_misc_io_data[offset];
375   state->m_misc_io_data[offset] = data;
363//  old = m_misc_io_data[offset];
364   m_misc_io_data[offset] = data;
376365
377366   switch (offset)
378367   {
r22070r22071
416405          D0 : To A9 of color RAM
417406         */
418407         newbank = data & 3;
419         if (newbank != state->m_palbank)
408         if (newbank != m_palbank)
420409         {
421410            //space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos() + 1);
422            state->m_palbank = newbank;
423            recompute_palette_tables(space.machine());
411            m_palbank = newbank;
412            recompute_palette_tables();
424413         }
425         if (state->m_sound_banks > 1)
414         if (m_sound_banks > 1)
426415         {
427416            device_t *upd = space.machine().device("upd");
428            newbank = (data >> 2) & (state->m_sound_banks - 1);
417            newbank = (data >> 2) & (m_sound_banks - 1);
429418            upd7759_set_bank_base(upd, newbank * 0x20000);
430419         }
431420         break;
432421
433422      /* CNT register */
434423      case 0x1c/2:
435         if (state->m_sound_banks > 1)
424         if (m_sound_banks > 1)
436425         {
437426            device_t *upd = space.machine().device("upd");
438427            upd7759_reset_w(upd, (data >> 1) & 1);
r22070r22071
452441
453442******************************************************************************/
454443
455static WRITE16_HANDLER( control_w )
444WRITE16_MEMBER(segac2_state::control_w )
456445{
457   segac2_state *state = space.machine().driver_data<segac2_state>();
458446   /* skip if not LSB */
459447   if (!ACCESSING_BITS_0_7)
460448      return;
r22070r22071
462450
463451   /* bit 0 controls display enable */
464452   //segac2_enable_display(space.machine(), ~data & 1);
465   state->m_segac2_enable_display = ~data & 1;
453   m_segac2_enable_display = ~data & 1;
466454
467455   /* bit 1 resets the protection */
468456   if (!(data & 2))
469      state->m_prot_write_buf = state->m_prot_read_buf = 0;
457      m_prot_write_buf = m_prot_read_buf = 0;
470458
471459   /* bit 2 controls palette shuffling; only ribbit and twinsqua use this feature */
472   state->m_segac2_alt_palette_mode = ((~data & 4) >> 2);
473   recompute_palette_tables(space.machine());
460   m_segac2_alt_palette_mode = ((~data & 4) >> 2);
461   recompute_palette_tables();
474462}
475463
476464
r22070r22071
488476******************************************************************************/
489477
490478/* protection chip reads */
491static READ16_HANDLER( prot_r )
479READ16_MEMBER(segac2_state::prot_r )
492480{
493   segac2_state *state = space.machine().driver_data<segac2_state>();
494   if (LOG_PROTECTION) logerror("%06X:protection r=%02X\n", space.device().safe_pcbase(), state->m_prot_func ? state->m_prot_read_buf : 0xff);
495   return state->m_prot_read_buf | 0xf0;
481   if (LOG_PROTECTION) logerror("%06X:protection r=%02X\n", space.device().safe_pcbase(), m_prot_func ? m_prot_read_buf : 0xff);
482   return m_prot_read_buf | 0xf0;
496483}
497484
498485
499486/* protection chip writes */
500static WRITE16_HANDLER( prot_w )
487WRITE16_MEMBER(segac2_state::prot_w )
501488{
502   segac2_state *state = space.machine().driver_data<segac2_state>();
503489   int new_sp_palbase = (data >> 2) & 3;
504490   int new_bg_palbase = data & 3;
505491   int table_index;
r22070r22071
509495      return;
510496
511497   /* compute the table index */
512   table_index = (state->m_prot_write_buf << 4) | state->m_prot_read_buf;
498   table_index = (m_prot_write_buf << 4) | m_prot_read_buf;
513499
514500   /* keep track of the last write for the next table lookup */
515   state->m_prot_write_buf = data & 0x0f;
501   m_prot_write_buf = data & 0x0f;
516502
517503   /* determine the value to return, should a read occur */
518   if (state->m_prot_func)
519      state->m_prot_read_buf = state->m_prot_func(table_index);
520   if (LOG_PROTECTION) logerror("%06X:protection w=%02X, new result=%02X\n", space.device().safe_pcbase(), data & 0x0f, state->m_prot_read_buf);
504   if (m_prot_func)
505      m_prot_read_buf = m_prot_func(table_index);
506   if (LOG_PROTECTION) logerror("%06X:protection w=%02X, new result=%02X\n", space.device().safe_pcbase(), data & 0x0f, m_prot_read_buf);
521507
522508   /* if the palette changed, force an update */
523   if (new_sp_palbase != state->m_sp_palbase || new_bg_palbase != state->m_bg_palbase)
509   if (new_sp_palbase != m_sp_palbase || new_bg_palbase != m_bg_palbase)
524510   {
525511      //space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos() + 1);
526      state->m_sp_palbase = new_sp_palbase;
527      state->m_bg_palbase = new_bg_palbase;
528      recompute_palette_tables(space.machine());
529      if (LOG_PALETTE) logerror("Set palbank: %d/%d (scan=%d)\n", state->m_bg_palbase, state->m_sp_palbase, space.machine().primary_screen->vpos());
512      m_sp_palbase = new_sp_palbase;
513      m_bg_palbase = new_bg_palbase;
514      recompute_palette_tables();
515      if (LOG_PALETTE) logerror("Set palbank: %d/%d (scan=%d)\n", m_bg_palbase, m_sp_palbase, space.machine().primary_screen->vpos());
530516   }
531517}
532518
r22070r22071
542528
543529******************************************************************************/
544530
545static WRITE16_HANDLER( counter_timer_w )
531WRITE16_MEMBER(segac2_state::counter_timer_w )
546532{
547533   /* only LSB matters */
548534   if (ACCESSING_BITS_0_7)
r22070r22071
590576
591577******************************************************************************/
592578
593static READ16_HANDLER( printer_r )
579READ16_MEMBER(segac2_state::printer_r )
594580{
595   segac2_state *state = space.machine().driver_data<segac2_state>();
596   return state->m_cam_data;
581   return m_cam_data;
597582}
598583
599static WRITE16_HANDLER( print_club_camera_w )
584WRITE16_MEMBER(segac2_state::print_club_camera_w )
600585{
601   segac2_state *state = space.machine().driver_data<segac2_state>();
602   state->m_cam_data = data;
586   m_cam_data = data;
603587}
604588
605589
r22070r22071
615599
616600static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, segac2_state )
617601   AM_RANGE(0x000000, 0x1fffff) AM_ROM
618   AM_RANGE(0x800000, 0x800001) AM_MIRROR(0x13fdfe) AM_READWRITE_LEGACY(prot_r, prot_w)
619   AM_RANGE(0x800200, 0x800201) AM_MIRROR(0x13fdfe) AM_WRITE_LEGACY(control_w)
620   AM_RANGE(0x840000, 0x84001f) AM_MIRROR(0x13fee0) AM_READWRITE_LEGACY(io_chip_r, io_chip_w)
602   AM_RANGE(0x800000, 0x800001) AM_MIRROR(0x13fdfe) AM_READWRITE(prot_r, prot_w)
603   AM_RANGE(0x800200, 0x800201) AM_MIRROR(0x13fdfe) AM_WRITE(control_w)
604   AM_RANGE(0x840000, 0x84001f) AM_MIRROR(0x13fee0) AM_READWRITE(io_chip_r, io_chip_w)
621605   AM_RANGE(0x840100, 0x840107) AM_MIRROR(0x13fef8) AM_DEVREADWRITE8_LEGACY("ymsnd", ym3438_r, ym3438_w, 0x00ff)
622   AM_RANGE(0x880100, 0x880101) AM_MIRROR(0x13fefe) AM_WRITE_LEGACY(counter_timer_w)
623   AM_RANGE(0x8c0000, 0x8c0fff) AM_MIRROR(0x13f000) AM_READWRITE_LEGACY(palette_r, palette_w) AM_SHARE("paletteram")
606   AM_RANGE(0x880100, 0x880101) AM_MIRROR(0x13fefe) AM_WRITE(counter_timer_w)
607   AM_RANGE(0x8c0000, 0x8c0fff) AM_MIRROR(0x13f000) AM_READWRITE(palette_r, palette_w) AM_SHARE("paletteram")
624608   AM_RANGE(0xc00000, 0xc0001f) AM_MIRROR(0x18ff00) AM_DEVREADWRITE("gen_vdp", sega_genesis_vdp_device, megadriv_vdp_r,megadriv_vdp_w)
625609   AM_RANGE(0xe00000, 0xe0ffff) AM_MIRROR(0x1f0000) AM_RAM AM_SHARE("nvram")
626610ADDRESS_MAP_END
r22070r22071
12941278         switch (src & 0x1c0)
12951279         {
12961280            case 0x000:
1297               desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x800];
1281               desty[x] = paldata[(src&0x0f) | m_segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x800];
12981282               break;
12991283            case 0x040:
1300               desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4]];
1284               desty[x] = paldata[(src&0x0f) | m_segac2_bg_pal_lookup[(src & 0x30)>>4]];
13011285               break;
13021286            case 0x080:
1303               desty[x] = paldata[(src&0x0f) | segac2_sp_pal_lookup[(src & 0x30)>>4]];
1287               desty[x] = paldata[(src&0x0f) | m_segac2_sp_pal_lookup[(src & 0x30)>>4]];
13041288               break;
13051289            case 0x0c0:
13061290               // bg pen
1307               desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x1000];
1291               desty[x] = paldata[(src&0x0f) | m_segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x1000];
13081292               break;
13091293            case 0x100:
13101294               // shadow
1311               desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x800];
1295               desty[x] = paldata[(src&0x0f) | m_segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x800];
13121296               break;
13131297            case 0x140:
13141298               // normal
1315               desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4]];
1299               desty[x] = paldata[(src&0x0f) | m_segac2_bg_pal_lookup[(src & 0x30)>>4]];
13161300               break;
13171301            case 0x180:
13181302               // sprite
1319               desty[x] = paldata[(src&0x0f) | segac2_sp_pal_lookup[(src & 0x30)>>4]];
1303               desty[x] = paldata[(src&0x0f) | m_segac2_sp_pal_lookup[(src & 0x30)>>4]];
13201304               break;
13211305            case 0x1c0:
13221306               // highlight
1323               desty[x] = paldata[(src&0x0f) | segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x1000];
1307               desty[x] = paldata[(src&0x0f) | m_segac2_bg_pal_lookup[(src & 0x30)>>4] | 0x1000];
13241308               break;
13251309         }
13261310      }
r22070r22071
18501834
18511835******************************************************************************/
18521836
1853void segac2_state::segac2_common_init(running_machine& machine, int (*func)(int in))
1837void segac2_state::segac2_common_init(int (*func)(int in))
18541838{
1855   segac2_state *state = machine.driver_data<segac2_state>();
1856   device_t *upd = machine.device("upd");
1857
18581839   DRIVER_INIT_CALL(megadriv_c2);
1840   device_t *upd = machine().device("upd");
18591841
1860   state->m_prot_func = func;
1842   m_prot_func = func;
18611843
18621844   if (upd != NULL)
1863      machine.device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(*upd, 0x880000, 0x880001, 0, 0x13fefe, FUNC(segac2_upd7759_w));
1845      machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x880000, 0x880001, 0, 0x13fefe, write16_delegate(FUNC(segac2_state::segac2_upd7759_w),this));
18641846}
18651847
18661848
r22070r22071
20902072
20912073DRIVER_INIT_MEMBER(segac2_state,c2boot)
20922074{
2093   segac2_common_init(machine(), NULL);
2075   segac2_common_init(NULL);
20942076}
20952077
20962078DRIVER_INIT_MEMBER(segac2_state,bloxeedc)
20972079{
2098   segac2_common_init(machine(), NULL);
2080   segac2_common_init(NULL);
20992081}
21002082
21012083DRIVER_INIT_MEMBER(segac2_state,columns)
21022084{
2103   segac2_common_init(machine(), prot_func_columns);
2085   segac2_common_init(prot_func_columns);
21042086}
21052087
21062088DRIVER_INIT_MEMBER(segac2_state,columns2)
21072089{
2108   segac2_common_init(machine(), prot_func_columns2);
2090   segac2_common_init(prot_func_columns2);
21092091}
21102092
21112093DRIVER_INIT_MEMBER(segac2_state,tfrceac)
21122094{
2113   segac2_common_init(machine(), prot_func_tfrceac);
2095   segac2_common_init(prot_func_tfrceac);
21142096}
21152097
21162098DRIVER_INIT_MEMBER(segac2_state,tfrceacb)
21172099{
21182100   /* disable the palette bank switching from the protection chip */
2119   segac2_common_init(machine(), NULL);
2101   segac2_common_init(NULL);
21202102   machine().device("maincpu")->memory().space(AS_PROGRAM).nop_write(0x800000, 0x800001);
21212103}
21222104
21232105DRIVER_INIT_MEMBER(segac2_state,borench)
21242106{
2125   segac2_common_init(machine(), prot_func_borench);
2107   segac2_common_init(prot_func_borench);
21262108}
21272109
21282110DRIVER_INIT_MEMBER(segac2_state,twinsqua)
21292111{
2130   segac2_common_init(machine(), prot_func_twinsqua);
2112   segac2_common_init(prot_func_twinsqua);
21312113}
21322114
21332115DRIVER_INIT_MEMBER(segac2_state,ribbit)
21342116{
2135   segac2_common_init(machine(), prot_func_ribbit);
2117   segac2_common_init(prot_func_ribbit);
21362118}
21372119
21382120DRIVER_INIT_MEMBER(segac2_state,puyo)
21392121{
2140   segac2_common_init(machine(), prot_func_puyo);
2122   segac2_common_init(prot_func_puyo);
21412123}
21422124
21432125DRIVER_INIT_MEMBER(segac2_state,tantr)
21442126{
2145   segac2_common_init(machine(), prot_func_tantr);
2127   segac2_common_init(prot_func_tantr);
21462128}
21472129
21482130DRIVER_INIT_MEMBER(segac2_state,tantrkor)
21492131{
2150   segac2_common_init(machine(), prot_func_tantrkor);
2132   segac2_common_init(prot_func_tantrkor);
21512133}
21522134
21532135DRIVER_INIT_MEMBER(segac2_state,potopoto)
21542136{
2155   segac2_common_init(machine(), prot_func_potopoto);
2137   segac2_common_init(prot_func_potopoto);
21562138}
21572139
21582140DRIVER_INIT_MEMBER(segac2_state,stkclmns)
21592141{
2160   segac2_common_init(machine(), prot_func_stkclmns);
2142   segac2_common_init(prot_func_stkclmns);
21612143}
21622144
21632145DRIVER_INIT_MEMBER(segac2_state,stkclmnj)
21642146{
2165   segac2_common_init(machine(), prot_func_stkclmnj);
2147   segac2_common_init(prot_func_stkclmnj);
21662148}
21672149
21682150DRIVER_INIT_MEMBER(segac2_state,ichir)
21692151{
2170   segac2_common_init(machine(), prot_func_ichir);
2152   segac2_common_init(prot_func_ichir);
21712153}
21722154
21732155DRIVER_INIT_MEMBER(segac2_state,ichirk)
21742156{
2175   segac2_common_init(machine(), prot_func_ichirk);
2157   segac2_common_init(prot_func_ichirk);
21762158}
21772159
21782160DRIVER_INIT_MEMBER(segac2_state,ichirj)
21792161{
2180   segac2_common_init(machine(), prot_func_ichirj);
2162   segac2_common_init(prot_func_ichirj);
21812163}
21822164
2183static READ16_HANDLER( ichirjbl_prot_r )
2165READ16_MEMBER(segac2_state::ichirjbl_prot_r )
21842166{
21852167   return 0x00f5;
21862168}
21872169
21882170DRIVER_INIT_MEMBER(segac2_state,ichirjbl)
21892171{
2190   segac2_common_init(machine(), NULL);
2172   segac2_common_init(NULL);
21912173
2192   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x840108, 0x840109, FUNC(ichirjbl_prot_r) );
2174   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x840108, 0x840109, read16_delegate(FUNC(segac2_state::ichirjbl_prot_r),this) );
21932175}
21942176
21952177DRIVER_INIT_MEMBER(segac2_state,puyopuy2)
21962178{
2197   segac2_common_init(machine(), prot_func_puyopuy2);
2179   segac2_common_init(prot_func_puyopuy2);
21982180}
21992181
22002182DRIVER_INIT_MEMBER(segac2_state,zunkyou)
22012183{
2202   segac2_common_init(machine(), prot_func_zunkyou);
2184   segac2_common_init(prot_func_zunkyou);
22032185}
22042186
22052187
22062188DRIVER_INIT_MEMBER(segac2_state,pclub)
22072189{
2208   segac2_common_init(machine(), prot_func_pclub);
2190   segac2_common_init(prot_func_pclub);
22092191
2210   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x880120, 0x880121, FUNC(printer_r) );/*Print Club Vol.1*/
2211   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x880124, 0x880125, FUNC(printer_r) );/*Print Club Vol.2*/
2212   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(0x880124, 0x880125, FUNC(print_club_camera_w));
2192   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x880120, 0x880121, read16_delegate(FUNC(segac2_state::printer_r),this) );/*Print Club Vol.1*/
2193   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x880124, 0x880125, read16_delegate(FUNC(segac2_state::printer_r),this) );/*Print Club Vol.2*/
2194   machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x880124, 0x880125, write16_delegate(FUNC(segac2_state::print_club_camera_w),this));
22132195}
22142196
22152197DRIVER_INIT_MEMBER(segac2_state,pclubjv2)
22162198{
2217   segac2_common_init(machine(), prot_func_pclubjv2);
2199   segac2_common_init(prot_func_pclubjv2);
22182200
2219   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x880120, 0x880121, FUNC(printer_r) );/*Print Club Vol.1*/
2220   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x880124, 0x880125, FUNC(printer_r) );/*Print Club Vol.2*/
2221   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(0x880124, 0x880125, FUNC(print_club_camera_w));
2201   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x880120, 0x880121, read16_delegate(FUNC(segac2_state::printer_r),this) );/*Print Club Vol.1*/
2202   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x880124, 0x880125, read16_delegate(FUNC(segac2_state::printer_r),this) );/*Print Club Vol.2*/
2203   machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x880124, 0x880125, write16_delegate(FUNC(segac2_state::print_club_camera_w),this));
22222204}
22232205
22242206DRIVER_INIT_MEMBER(segac2_state,pclubjv4)
22252207{
2226   segac2_common_init(machine(), prot_func_pclubjv4);
2208   segac2_common_init(prot_func_pclubjv4);
22272209
2228   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x880120, 0x880121, FUNC(printer_r) );/*Print Club Vol.1*/
2229   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x880124, 0x880125, FUNC(printer_r) );/*Print Club Vol.2*/
2230   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(0x880124, 0x880125, FUNC(print_club_camera_w));
2210   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x880120, 0x880121, read16_delegate(FUNC(segac2_state::printer_r),this) );/*Print Club Vol.1*/
2211   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x880124, 0x880125, read16_delegate(FUNC(segac2_state::printer_r),this) );/*Print Club Vol.2*/
2212   machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x880124, 0x880125, write16_delegate(FUNC(segac2_state::print_club_camera_w),this));
22312213}
22322214
22332215DRIVER_INIT_MEMBER(segac2_state,pclubjv5)
22342216{
2235   segac2_common_init(machine(), prot_func_pclubjv5);
2217   segac2_common_init(prot_func_pclubjv5);
22362218
2237   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x880120, 0x880121, FUNC(printer_r) );/*Print Club Vol.1*/
2238   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_read_handler(0x880124, 0x880125, FUNC(printer_r) );/*Print Club Vol.2*/
2239   machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(0x880124, 0x880125, FUNC(print_club_camera_w));
2219   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x880120, 0x880121, read16_delegate(FUNC(segac2_state::printer_r),this) );/*Print Club Vol.1*/
2220   machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x880124, 0x880125, read16_delegate(FUNC(segac2_state::printer_r),this) );/*Print Club Vol.2*/
2221   machine().device("maincpu")->memory().space(AS_PROGRAM).install_write_handler(0x880124, 0x880125, write16_delegate(FUNC(segac2_state::print_club_camera_w),this));
22402222}
22412223
22422224
trunk/src/mame/drivers/megatech.c
r22070r22071
207207INPUT_PORTS_END
208208
209209/* MEGATECH specific */
210static READ8_HANDLER( megatech_cart_select_r )
210READ8_MEMBER(mtech_state::megatech_cart_select_r )
211211{
212   mtech_state *state = space.machine().driver_data<mtech_state>();
213   return state->m_mt_cart_select_reg;
212   return m_mt_cart_select_reg;
214213}
215214
216215
217216
218static TIMER_CALLBACK( megatech_z80_run_state )
217TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_run_state )
219218{
220   mtech_state *state = machine.driver_data<mtech_state>();
221219   char tempname[20];
222220   UINT8* game_region;
223221
224222   sprintf(tempname, "game%d", param);
225   game_region = state->memregion(tempname)->base();
223   game_region = memregion(tempname)->base();
226224
227   memcpy(state->memregion("maincpu")->base(), game_region, 0x400000);
225   memcpy(memregion("maincpu")->base(), game_region, 0x400000);
228226
229   if (!state->m_cart_is_genesis[param])
227   if (!m_cart_is_genesis[param])
230228   {
231229      printf("enabling SMS Z80\n");
232      state->m_current_game_is_sms = 1;
233      megatech_set_genz80_as_sms_standard_map(machine, "genesis_snd_z80", MAPPER_STANDARD);
230      m_current_game_is_sms = 1;
231      megatech_set_genz80_as_sms_standard_map(machine(), "genesis_snd_z80", MAPPER_STANDARD);
234232      //machine.device("genesis_snd_z80")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
235      machine.device("genesis_snd_z80")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
233      machine().device("genesis_snd_z80")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
236234   }
237235   else
238236   {
239237      printf("disabling SMS Z80\n");
240      state->m_current_game_is_sms = 0;
241      state->megatech_set_megadrive_z80_as_megadrive_z80("genesis_snd_z80");
242      machine.device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
238      m_current_game_is_sms = 0;
239      megatech_set_megadrive_z80_as_megadrive_z80("genesis_snd_z80");
240      machine().device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
243241      //machine.device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
244242   }
245243}
246244
247static TIMER_CALLBACK( megatech_z80_stop_state )
245TIMER_CALLBACK_MEMBER(mtech_state::megatech_z80_stop_state )
248246{
249247   UINT8* game_region;
250248   char tempname[20];
r22070r22071
252250   printf("megatech_select_game %d\n", param+1);
253251
254252   sprintf(tempname, "game%d", param);
255   game_region = machine.root_device().memregion(tempname)->base();
253   game_region = machine().root_device().memregion(tempname)->base();
256254
257   machine.device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
258   machine.device("genesis_snd_z80")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
255   machine().device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
256   machine().device("genesis_snd_z80")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
259257   //machine.device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
260258   //machine.device("genesis_snd_z80")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
261   machine.device("ymsnd")->reset();
259   machine().device("ymsnd")->reset();
262260
263   megadriv_stop_scanline_timer(machine);// stop the scanline timer for the genesis vdp... it can be restarted in video eof when needed
261   megadriv_stop_scanline_timer();// stop the scanline timer for the genesis vdp... it can be restarted in video eof when needed
264262   segae_md_sms_stop_scanline_timer();// stop the scanline timer for the sms vdp
265263
266264
r22070r22071
268266   if (game_region)
269267   {
270268      {
271         machine.scheduler().timer_set(attotime::zero, FUNC(megatech_z80_run_state), param);
269         machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(mtech_state::megatech_z80_run_state),this), param);
272270      }
273271   }
274272   else
275273   {
276274      /* no cart.. */
277      memset(machine.root_device().memregion("mtbios")->base() + 0x8000, 0x00, 0x8000);
278      memset(machine.root_device().memregion("maincpu")->base(), 0x00, 0x400000);
275      memset(machine().root_device().memregion("mtbios")->base() + 0x8000, 0x00, 0x8000);
276      memset(machine().root_device().memregion("maincpu")->base(), 0x00, 0x400000);
279277   }
280278
281279   return;
282280}
283281
284static void megatech_select_game(running_machine &machine, int gameno)
282void mtech_state::megatech_select_game(int gameno)
285283{
286   machine.scheduler().timer_set(attotime::zero, FUNC(megatech_z80_stop_state), gameno);
284   machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(mtech_state::megatech_z80_stop_state),this), gameno);
287285}
288286
289static WRITE8_HANDLER( megatech_cart_select_w )
287WRITE8_MEMBER(mtech_state::megatech_cart_select_w )
290288{
291289   /* seems to write the slot number..
292290     but it stores something in (banked?) ram
293291     because it always seems to show the
294292     same instructions ... */
295   mtech_state *state = space.machine().driver_data<mtech_state>();
296   state->m_mt_cart_select_reg = data;
293   m_mt_cart_select_reg = data;
297294
298   megatech_select_game(space.machine(), state->m_mt_cart_select_reg);
295   megatech_select_game(m_mt_cart_select_reg);
299296}
300297
301298
302static READ8_HANDLER( bios_ctrl_r )
299READ8_MEMBER(mtech_state::bios_ctrl_r )
303300{
304   mtech_state *state = space.machine().driver_data<mtech_state>();
305
306301   if (offset == 0)
307302      return 0;
308303   if (offset == 2)
309      return state->m_bios_ctrl[offset] & 0xfe;
304      return m_bios_ctrl[offset] & 0xfe;
310305
311   return state->m_bios_ctrl[offset];
306   return m_bios_ctrl[offset];
312307}
313308
314static WRITE8_HANDLER( bios_ctrl_w )
309WRITE8_MEMBER(mtech_state::bios_ctrl_w )
315310{
316   mtech_state *state = space.machine().driver_data<mtech_state>();
317
318311   if (offset == 1)
319312   {
320313      output_set_value("Alarm_sound", data>>7 & 0x01);
321      state->m_bios_ctrl_inputs = data & 0x04;  // Genesis/SMS input ports disable bit
314      m_bios_ctrl_inputs = data & 0x04;  // Genesis/SMS input ports disable bit
322315   }
323316   else if (offset == 2)
324317   {
325318      output_set_value("Flash_screen", data>>1 & 0x01);
326319   }
327320
328   state->m_bios_ctrl[offset] = data;
321   m_bios_ctrl[offset] = data;
329322}
330323
331324/* this sets 0x300000 which may indicate that the 68k can see the instruction rom
332325   there, this limiting the max game rom capacity to 3meg. */
333326
334static READ8_HANDLER( megatech_z80_read_68k_banked_data )
327READ8_MEMBER(mtech_state::megatech_z80_read_68k_banked_data )
335328{
336   mtech_state *state = space.machine().driver_data<mtech_state>();
337329   address_space &space68k = space.machine().device<legacy_cpu_device>("maincpu")->space();
338   UINT8 ret = space68k.read_byte(state->m_mt_bank_addr + offset);
330   UINT8 ret = space68k.read_byte(m_mt_bank_addr + offset);
339331   return ret;
340332}
341333
342static WRITE8_HANDLER( megatech_z80_write_68k_banked_data )
334WRITE8_MEMBER(mtech_state::megatech_z80_write_68k_banked_data )
343335{
344   mtech_state *state = space.machine().driver_data<mtech_state>();
345336   address_space &space68k = space.machine().device<legacy_cpu_device>("maincpu")->space();
346   space68k.write_byte(state->m_mt_bank_addr + offset,data);
337   space68k.write_byte(m_mt_bank_addr + offset,data);
347338}
348339
349static void megatech_z80_bank_w(running_machine &machine, UINT16 data)
340void mtech_state::megatech_z80_bank_w(UINT16 data)
350341{
351   mtech_state *state = machine.driver_data<mtech_state>();
352   state->m_mt_bank_addr = ((state->m_mt_bank_addr >> 1) | (data << 23)) & 0xff8000;
342   m_mt_bank_addr = ((m_mt_bank_addr >> 1) | (data << 23)) & 0xff8000;
353343}
354344
355static WRITE8_HANDLER( mt_z80_bank_w )
345WRITE8_MEMBER(mtech_state::mt_z80_bank_w )
356346{
357   megatech_z80_bank_w(space.machine(), data & 1);
347   megatech_z80_bank_w(data & 1);
358348}
359349
360static READ8_HANDLER( megatech_banked_ram_r )
350READ8_MEMBER(mtech_state::megatech_banked_ram_r )
361351{
362   mtech_state *state = space.machine().driver_data<mtech_state>();
363   return state->m_megatech_banked_ram[offset + 0x1000 * (state->m_mt_cart_select_reg & 0x07)];
352   return m_megatech_banked_ram[offset + 0x1000 * (m_mt_cart_select_reg & 0x07)];
364353}
365354
366static WRITE8_HANDLER( megatech_banked_ram_w )
355WRITE8_MEMBER(mtech_state::megatech_banked_ram_w )
367356{
368   mtech_state *state = space.machine().driver_data<mtech_state>();
369   state->m_megatech_banked_ram[offset + 0x1000 * (state->m_mt_cart_select_reg & 0x07)] = data;
357   m_megatech_banked_ram[offset + 0x1000 * (m_mt_cart_select_reg & 0x07)] = data;
370358}
371359
372360
373361
374362static ADDRESS_MAP_START( megatech_bios_map, AS_PROGRAM, 8, mtech_state )
375363   AM_RANGE(0x0000, 0x2fff) AM_ROM // from bios rom (0x0000-0x2fff populated in ROM)
376   AM_RANGE(0x3000, 0x3fff) AM_READWRITE_LEGACY(megatech_banked_ram_r, megatech_banked_ram_w) // copies instruction data here at startup, must be banked
364   AM_RANGE(0x3000, 0x3fff) AM_READWRITE(megatech_banked_ram_r, megatech_banked_ram_w) // copies instruction data here at startup, must be banked
377365   AM_RANGE(0x4000, 0x5fff) AM_RAM // plain ram?
378   AM_RANGE(0x6000, 0x6000) AM_WRITE_LEGACY(mt_z80_bank_w )
366   AM_RANGE(0x6000, 0x6000) AM_WRITE(mt_z80_bank_w )
379367   AM_RANGE(0x6400, 0x6400) AM_READ_PORT("BIOS_DSW0")
380368   AM_RANGE(0x6401, 0x6401) AM_READ_PORT("BIOS_DSW1")
381   AM_RANGE(0x6404, 0x6404) AM_READWRITE_LEGACY(megatech_cart_select_r, megatech_cart_select_w) // cart select & ram bank
369   AM_RANGE(0x6404, 0x6404) AM_READWRITE(megatech_cart_select_r, megatech_cart_select_w) // cart select & ram bank
382370   AM_RANGE(0x6800, 0x6800) AM_READ_PORT("BIOS_IN0")
383371   AM_RANGE(0x6801, 0x6801) AM_READ_PORT("BIOS_IN1")
384   AM_RANGE(0x6802, 0x6807) AM_READWRITE_LEGACY(bios_ctrl_r, bios_ctrl_w)
372   AM_RANGE(0x6802, 0x6807) AM_READWRITE(bios_ctrl_r, bios_ctrl_w)
385373//  AM_RANGE(0x6805, 0x6805) AM_READ_PORT("???")
386374   AM_RANGE(0x7000, 0x77ff) AM_ROM // from bios rom (0x7000-0x77ff populated in ROM)
387375   //AM_RANGE(0x7800, 0x7fff) AM_RAM // ?
388   AM_RANGE(0x8000, 0x9fff) AM_READWRITE_LEGACY(megatech_z80_read_68k_banked_data, megatech_z80_write_68k_banked_data) // window into 68k address space, reads instr rom and writes to reset banks on z80 carts?
376   AM_RANGE(0x8000, 0x9fff) AM_READWRITE(megatech_z80_read_68k_banked_data, megatech_z80_write_68k_banked_data) // window into 68k address space, reads instr rom and writes to reset banks on z80 carts?
389377ADDRESS_MAP_END
390378
391379
392static WRITE8_HANDLER( megatech_bios_port_ctrl_w )
380WRITE8_MEMBER(mtech_state::megatech_bios_port_ctrl_w )
393381{
394   mtech_state *state = space.machine().driver_data<mtech_state>();
395   state->m_bios_port_ctrl = data;
382   m_bios_port_ctrl = data;
396383}
397384
398static READ8_HANDLER( megatech_bios_joypad_r )
385READ8_MEMBER(mtech_state::megatech_bios_joypad_r )
399386{
400   mtech_state *state = space.machine().driver_data<mtech_state>();
401   return megatech_bios_port_cc_dc_r(space.machine(), offset, state->m_bios_port_ctrl);
387   return megatech_bios_port_cc_dc_r(offset, m_bios_port_ctrl);
402388}
403389
404static WRITE8_HANDLER (megatech_bios_port_7f_w)
390WRITE8_MEMBER(mtech_state::megatech_bios_port_7f_w)
405391{
406392//  popmessage("CPU #3: I/O port 0x7F write, data %02x", data);
407393}
r22070r22071
410396
411397static ADDRESS_MAP_START( megatech_bios_portmap, AS_IO, 8, mtech_state )
412398   ADDRESS_MAP_GLOBAL_MASK(0xff)
413   AM_RANGE(0x3f, 0x3f) AM_WRITE_LEGACY(megatech_bios_port_ctrl_w)
399   AM_RANGE(0x3f, 0x3f) AM_WRITE(megatech_bios_port_ctrl_w)
414400
415   AM_RANGE(0x7f, 0x7f) AM_READWRITE_LEGACY(sms_vcounter_r, megatech_bios_port_7f_w)
401   AM_RANGE(0x7f, 0x7f) AM_READ_LEGACY(sms_vcounter_r) AM_WRITE(megatech_bios_port_7f_w)
416402   AM_RANGE(0xbe, 0xbe) AM_DEVREADWRITE( "vdp1", sega315_5124_device, vram_read, vram_write )
417403   AM_RANGE(0xbf, 0xbf) AM_DEVREADWRITE( "vdp1", sega315_5124_device, register_read, register_write )
418404
419   AM_RANGE(0xdc, 0xdd) AM_READ_LEGACY(megatech_bios_joypad_r)  // player inputs
405   AM_RANGE(0xdc, 0xdd) AM_READ(megatech_bios_joypad_r)  // player inputs
420406ADDRESS_MAP_END
421407
422408
r22070r22071
471457
472458   MACHINE_RESET_CALL_LEGACY(megadriv);
473459   MACHINE_RESET_CALL_LEGACY(megatech_md_sms);
474   megatech_select_game(machine(), 0);
460   megatech_select_game(0);
475461}
476462
477463UINT32 mtech_state::screen_update_megatech_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
r22070r22071
568554
569555DEVICE_IMAGE_LOAD_MEMBER( mtech_state, megatech_cart )
570556{
571   mtech_state *state = image.device().machine().driver_data<mtech_state>();
572557   const struct megatech_cart_region *mt_cart = &megatech_cart_table[0], *this_cart;
573558   const char  *pcb_name;
574559
r22070r22071
598583      if (!mame_stricmp("genesis", pcb_name))
599584      {
600585         mame_printf_debug("%s is genesis\n", mt_cart->tag);
601         state->m_cart_is_genesis[this_cart->slot] = 1;
586         m_cart_is_genesis[this_cart->slot] = 1;
602587      }
603588      else if (!mame_stricmp("sms", pcb_name))
604589      {
605590         mame_printf_debug("%s is sms\n", mt_cart->tag);
606         state->m_cart_is_genesis[this_cart->slot] = 0;
591         m_cart_is_genesis[this_cart->slot] = 0;
607592      }
608593      else
609594      {
trunk/src/mame/machine/megadriv.c
r22070r22071
9393   }
9494}
9595
96/* Megadrive / Genesis has 3 I/O ports */
97static emu_timer *m_io_timeout[3];
98static int m_io_stage[3];
99
100static TIMER_CALLBACK( io_timeout_timer_callback )
96TIMER_CALLBACK_MEMBER(md_base_state::io_timeout_timer_callback)
10197{
10298   m_io_stage[(int)(FPTR)ptr] = -1;
10399}
104100
105static void init_megadri6_io(running_machine &machine)
101void md_base_state::init_megadri6_io()
106102{
107103   int i;
108104
109105   for (i=0; i<3; i++)
110106   {
111      m_io_timeout[i] = machine.scheduler().timer_alloc(FUNC(io_timeout_timer_callback), (void*)(FPTR)i);
107      m_io_timeout[i] = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(md_base_state::io_timeout_timer_callback),this), (void*)(FPTR)i);
112108   }
113109}
114110
115/* pointers to our io data read/write functions */
116UINT8 (*megadrive_io_read_data_port_ptr)(running_machine &machine, int offset);
117void (*megadrive_io_write_data_port_ptr)(running_machine &machine, int offset, UINT16 data);
118
119111/*
120112
121113    A10001h = A0         Version register
r22070r22071
201193   PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_PLAYER(2) PORT_NAME("P2 MODE") // mode
202194INPUT_PORTS_END
203195
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;
208
209static void megadrive_reset_io(running_machine &machine)
196void md_base_state::megadrive_reset_io()
210197{
211198   int i;
212199
r22070r22071
227214}
228215
229216/************* 6 buttons version **************************/
230static UINT8 megadrive_io_read_data_port_6button(running_machine &machine, int portnum)
217READ8_MEMBER(md_base_state::megadrive_io_read_data_port_6button)
231218{
219   int portnum = offset;
232220   UINT8 retdata, helper = (m_megadrive_io_ctrl_regs[portnum] & 0x3f) | 0xc0; // bits 6 & 7 always come from m_megadrive_io_data_regs
233221   static const char *const pad3names[] = { "PAD1", "PAD2", "IN0", "UNK" };
234222   static const char *const pad6names[] = { "EXTRA1", "EXTRA2", "IN0", "UNK" };
r22070r22071
239227      {
240228         /* here we read B, C & the additional buttons */
241229         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
242                  (((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x30) |
243                     (machine.root_device().ioport(pad6names[portnum])->read_safe(0) & 0x0f)) & ~helper);
230                  (((ioport(pad3names[portnum])->read_safe(0) & 0x30) |
231                     (ioport(pad6names[portnum])->read_safe(0) & 0x0f)) & ~helper);
244232      }
245233      else
246234      {
247235         /* here we read B, C & the directional buttons */
248236         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
249                  ((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x3f) & ~helper);
237                  ((ioport(pad3names[portnum])->read_safe(0) & 0x3f) & ~helper);
250238      }
251239   }
252240   else
r22070r22071
255243      {
256244         /* here we read ((Start & A) >> 2) | 0x00 */
257245         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
258                  (((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) & ~helper);
246                  (((ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) & ~helper);
259247      }
260248      else if (m_io_stage[portnum]==2)
261249      {
262250         /* here we read ((Start & A) >> 2) | 0x0f */
263251         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
264                  ((((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) | 0x0f) & ~helper);
252                  ((((ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) | 0x0f) & ~helper);
265253      }
266254      else
267255      {
268256         /* here we read ((Start & A) >> 2) | Up and Down */
269257         retdata = (m_megadrive_io_data_regs[portnum] & helper) |
270                  ((((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
271                     (machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x03)) & ~helper);
258                  ((((ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
259                     (ioport(pad3names[portnum])->read_safe(0) & 0x03)) & ~helper);
272260      }
273261   }
274262
r22070r22071
279267
280268
281269/************* 3 buttons version **************************/
282UINT8 megadrive_io_read_data_port_3button(running_machine &machine, int portnum)
270READ8_MEMBER(md_base_state::megadrive_io_read_data_port_3button)
283271{
272   int portnum = offset;
284273   UINT8 retdata, helper = (m_megadrive_io_ctrl_regs[portnum] & 0x7f) | 0x80; // bit 7 always comes from m_megadrive_io_data_regs
285274   static const char *const pad3names[] = { "PAD1", "PAD2", "IN0", "UNK" };
286275
r22070r22071
288277   {
289278      /* here we read B, C & the directional buttons */
290279      retdata = (m_megadrive_io_data_regs[portnum] & helper) |
291               (((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x3f) | 0x40) & ~helper);
280               (((ioport(pad3names[portnum])->read_safe(0) & 0x3f) | 0x40) & ~helper);
292281   }
293282   else
294283   {
295284      /* here we read ((Start & A) >> 2) | Up and Down */
296285      retdata = (m_megadrive_io_data_regs[portnum] & helper) |
297               ((((machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
298                  (machine.root_device().ioport(pad3names[portnum])->read_safe(0) & 0x03) | 0x40) & ~helper);
286               ((((ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
287                  (ioport(pad3names[portnum])->read_safe(0) & 0x03) | 0x40) & ~helper);
299288   }
300289
301290   return retdata;
302291}
303292
304293/* used by megatech bios, the test mode accesses the joypad/stick inputs like this */
305UINT8 megatech_bios_port_cc_dc_r(running_machine &machine, int offset, int ctrl)
294UINT8 md_base_state::megatech_bios_port_cc_dc_r(int offset, int ctrl)
306295{
307296   UINT8 retdata;
308297
309298   if (ctrl == 0x55)
310299   {
311300         /* A keys */
312         retdata = ((machine.root_device().ioport("PAD1")->read() & 0x40) >> 2) |
313            ((machine.root_device().ioport("PAD2")->read() & 0x40) >> 4) | 0xeb;
301         retdata = ((ioport("PAD1")->read() & 0x40) >> 2) |
302            ((ioport("PAD2")->read() & 0x40) >> 4) | 0xeb;
314303   }
315304   else
316305   {
317306      if (offset == 0)
318307      {
319         retdata = (machine.root_device().ioport("PAD1")->read() & 0x3f) | ((machine.root_device().ioport("PAD2")->read() & 0x03) << 6);
308         retdata = (ioport("PAD1")->read() & 0x3f) | ((ioport("PAD2")->read() & 0x03) << 6);
320309      }
321310      else
322311      {
323         retdata = ((machine.root_device().ioport("PAD2")->read() & 0x3c) >> 2) | 0xf0;
312         retdata = ((ioport("PAD2")->read() & 0x3c) >> 2) | 0xf0;
324313      }
325314
326315   }
r22070r22071
328317   return retdata;
329318}
330319
331static UINT8 megadrive_io_read_ctrl_port(int portnum)
320UINT8 md_base_state::megadrive_io_read_ctrl_port(int portnum)
332321{
333322   UINT8 retdata;
334323   retdata = m_megadrive_io_ctrl_regs[portnum];
r22070r22071
337326   return retdata | (retdata << 8);
338327}
339328
340static UINT8 megadrive_io_read_tx_port(int portnum)
329UINT8 md_base_state::megadrive_io_read_tx_port(int portnum)
341330{
342331   UINT8 retdata;
343332   retdata = m_megadrive_io_tx_regs[portnum];
344333   return retdata | (retdata << 8);
345334}
346335
347static UINT8 megadrive_io_read_rx_port(int portnum)
336UINT8 md_base_state::megadrive_io_read_rx_port(int portnum)
348337{
349338   return 0x00;
350339}
351340
352static UINT8 megadrive_io_read_sctrl_port(int portnum)
341UINT8 md_base_state::megadrive_io_read_sctrl_port(int portnum)
353342{
354343   return 0x00;
355344}
r22070r22071
392381      case 0x2:
393382      case 0x3:
394383//          retdata = megadrive_io_read_data_port(offset-1);
395         retdata = megadrive_io_read_data_port_ptr(space.machine(), offset-1);
384         retdata = m_megadrive_io_read_data_port_ptr(space, offset-1, 0xff);
396385         break;
397386
398387      case 0x4:
r22070r22071
421410}
422411
423412
424static void megadrive_io_write_data_port_3button(running_machine &machine, int portnum, UINT16 data)
413WRITE16_MEMBER(md_base_state::megadrive_io_write_data_port_3button)
425414{
415   int portnum = offset;
426416   m_megadrive_io_data_regs[portnum] = data;
427417   //mame_printf_debug("Writing IO Data Register #%d data %04x\n",portnum,data);
428418
r22070r22071
431421
432422/****************************** 6 buttons version*****************************/
433423
434static void megadrive_io_write_data_port_6button(running_machine &machine, int portnum, UINT16 data)
424WRITE16_MEMBER(md_base_state::megadrive_io_write_data_port_6button)
435425{
426   int portnum = offset;
436427   if (m_megadrive_io_ctrl_regs[portnum]&0x40)
437428   {
438429      if (((m_megadrive_io_data_regs[portnum]&0x40)==0x00) && ((data&0x40) == 0x40))
439430      {
440431         m_io_stage[portnum]++;
441         m_io_timeout[portnum]->adjust(machine.device<cpu_device>("maincpu")->cycles_to_attotime(8192));
432         m_io_timeout[portnum]->adjust(machine().device<cpu_device>("maincpu")->cycles_to_attotime(8192));
442433      }
443434
444435   }
r22070r22071
451442
452443/*************************** 3 buttons version ****************************/
453444
454static void megadrive_io_write_ctrl_port(running_machine &machine, int portnum, UINT16 data)
445void md_base_state::megadrive_io_write_ctrl_port(int portnum, UINT16 data)
455446{
456447   m_megadrive_io_ctrl_regs[portnum] = data;
457448//  mame_printf_debug("Setting IO Control Register #%d data %04x\n",portnum,data);
458449}
459450
460static void megadrive_io_write_tx_port(running_machine &machine, int portnum, UINT16 data)
451void md_base_state::megadrive_io_write_tx_port(int portnum, UINT16 data)
461452{
462453   m_megadrive_io_tx_regs[portnum] = data;
463454}
464455
465static void megadrive_io_write_rx_port(running_machine &machine, int portnum, UINT16 data)
456void md_base_state::megadrive_io_write_rx_port(int portnum, UINT16 data)
466457{
467458}
468459
469static void megadrive_io_write_sctrl_port(running_machine &machine, int portnum, UINT16 data)
460void md_base_state::megadrive_io_write_sctrl_port(int portnum, UINT16 data)
470461{
471462}
472463
r22070r22071
488479      case 0x2:
489480      case 0x3:
490481//          megadrive_io_write_data_port(offset-1,data);
491         megadrive_io_write_data_port_ptr(space.machine(), offset-1,data);
482         m_megadrive_io_write_data_port_ptr(space, offset-1,data, 0xffff);
492483         break;
493484
494485      case 0x4:
495486      case 0x5:
496487      case 0x6:
497         megadrive_io_write_ctrl_port(space.machine(),offset-4,data);
488         megadrive_io_write_ctrl_port(offset-4,data);
498489         break;
499490
500491      /* Serial I/O Registers */
501492
502      case 0x7: megadrive_io_write_tx_port(space.machine(),0,data); break;
503      case 0x8: megadrive_io_write_rx_port(space.machine(),0,data); break;
504      case 0x9: megadrive_io_write_sctrl_port(space.machine(),0,data); break;
493      case 0x7: megadrive_io_write_tx_port(0,data); break;
494      case 0x8: megadrive_io_write_rx_port(0,data); break;
495      case 0x9: megadrive_io_write_sctrl_port(0,data); break;
505496
506      case 0xa: megadrive_io_write_tx_port(space.machine(),1,data); break;
507      case 0xb: megadrive_io_write_rx_port(space.machine(),1,data); break;
508      case 0xc: megadrive_io_write_sctrl_port(space.machine(),1,data); break;
497      case 0xa: megadrive_io_write_tx_port(1,data); break;
498      case 0xb: megadrive_io_write_rx_port(1,data); break;
499      case 0xc: megadrive_io_write_sctrl_port(1,data); break;
509500
510      case 0xd: megadrive_io_write_tx_port(space.machine(),2,data); break;
511      case 0xe: megadrive_io_write_rx_port(space.machine(),2,data); break;
512      case 0xf: megadrive_io_write_sctrl_port(space.machine(),2,data); break;
501      case 0xd: megadrive_io_write_tx_port(2,data); break;
502      case 0xe: megadrive_io_write_rx_port(2,data); break;
503      case 0xf: megadrive_io_write_sctrl_port(2,data); break;
513504   }
514505}
515506
r22070r22071
881872
882873MACHINE_START( megadriv )
883874{
884   if (m_megadrive_6buttons_pad)
885      init_megadri6_io(machine);
875   md_base_state *state = machine.driver_data<md_base_state>();
876   if (state->m_megadrive_6buttons_pad)
877      state->init_megadri6_io();
886878}
887879
888880MACHINE_RESET( megadriv )
r22070r22071
901893      machine.scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(md_base_state::megadriv_z80_run_state),state));
902894   }
903895
904   megadrive_reset_io(machine);
896   state->megadrive_reset_io();
905897
906898   if (!state->m_vdp->m_use_alt_timing)
907899   {
r22070r22071
924916      state->m_32x->pause_cpu();
925917}
926918
927void megadriv_stop_scanline_timer(running_machine &machine)
919void md_base_state::megadriv_stop_scanline_timer()
928920{
929   md_base_state *state = machine.driver_data<md_base_state>();
930
931   if (!state->m_vdp->m_use_alt_timing)
921   if (!m_vdp->m_use_alt_timing)
932922      megadriv_scanline_timer->reset();
933923}
934924
r22070r22071
11741164   // the drivers which need 6 buttons pad set this to 1 in their init befare calling the megadrive init
11751165   if (m_megadrive_6buttons_pad)
11761166   {
1177      megadrive_io_read_data_port_ptr = megadrive_io_read_data_port_6button;
1178      megadrive_io_write_data_port_ptr = megadrive_io_write_data_port_6button;
1167      m_megadrive_io_read_data_port_ptr = read8_delegate(FUNC(md_base_state::megadrive_io_read_data_port_6button),this);
1168      m_megadrive_io_write_data_port_ptr = write16_delegate(FUNC(md_base_state::megadrive_io_write_data_port_6button),this);
11791169      mame_printf_debug("6 button game\n");
11801170   }
11811171   else
11821172   {
1183      megadrive_io_read_data_port_ptr = megadrive_io_read_data_port_3button;
1184      megadrive_io_write_data_port_ptr = megadrive_io_write_data_port_3button;
1173      m_megadrive_io_read_data_port_ptr = read8_delegate(FUNC(md_base_state::megadrive_io_read_data_port_3button),this);
1174      m_megadrive_io_write_data_port_ptr = write16_delegate(FUNC(md_base_state::megadrive_io_write_data_port_3button),this);
11851175      mame_printf_debug("3 button game\n");
11861176   }
11871177
r22070r22071
12941284DRIVER_INIT_MEMBER(md_base_state,mpnew)
12951285{
12961286   DRIVER_INIT_CALL(megadrij);
1297   megadrive_io_read_data_port_ptr = megadrive_io_read_data_port_3button;
1298   megadrive_io_write_data_port_ptr = megadrive_io_write_data_port_3button;
1287   m_megadrive_io_read_data_port_ptr = read8_delegate(FUNC(md_base_state::megadrive_io_read_data_port_3button),this);
1288   m_megadrive_io_write_data_port_ptr = write16_delegate(FUNC(md_base_state::megadrive_io_write_data_port_3button),this);
12991289}
13001290
13011291/* used by megatech */
trunk/src/mame/includes/megadriv.h
r22070r22071
3939MACHINE_CONFIG_EXTERN( md_pal );
4040MACHINE_CONFIG_EXTERN( md_bootleg );    // for topshoot.c & hshavoc.c
4141
42extern UINT8 megatech_bios_port_cc_dc_r(running_machine &machine, int offset, int ctrl);
43extern void megadriv_stop_scanline_timer(running_machine &machine);
44
45
46/* These are needed to create external input handlers (see e.g. MESS) */
47/* Regs are also used by Megaplay! */
48extern UINT8 (*megadrive_io_read_data_port_ptr)(running_machine &machine, int offset);
49extern void (*megadrive_io_write_data_port_ptr)(running_machine &machine, int offset, UINT16 data);
50extern UINT8 m_megadrive_io_data_regs[3];
51extern UINT8 m_megadrive_io_ctrl_regs[3];
52
5342MACHINE_START( megadriv );
5443MACHINE_RESET( megadriv );
5544VIDEO_START( megadriv );
r22070r22071
8877      m_vdp(*this,"gen_vdp"),
8978      m_32x(*this,"sega32x"),
9079      m_segacd(*this,"segacd"),
91      m_megadrive_ram(*this,"megadrive_ram")
80      m_megadrive_ram(*this,"megadrive_ram"),
81      m_megadrive_6buttons_pad(0)
9282   { }
9383   required_device<cpu_device> m_maincpu;
9484   optional_device<cpu_device> m_z80snd;
r22070r22071
135125   DECLARE_READ8_MEMBER( z80_unmapped_r );
136126   DECLARE_WRITE8_MEMBER( z80_unmapped_w );   
137127   TIMER_CALLBACK_MEMBER(megadriv_z80_run_state);
128   
129   /* Megadrive / Genesis has 3 I/O ports */
130   emu_timer *m_io_timeout[3];
131   int m_io_stage[3];
132   UINT8 m_megadrive_io_data_regs[3];
133   UINT8 m_megadrive_io_ctrl_regs[3];
134   UINT8 m_megadrive_io_tx_regs[3];
135   int m_megadrive_6buttons_pad;
136   read8_delegate m_megadrive_io_read_data_port_ptr;
137   write16_delegate m_megadrive_io_write_data_port_ptr;
138   
139
140   TIMER_CALLBACK_MEMBER( io_timeout_timer_callback );
141   void init_megadri6_io();
142   void megadrive_reset_io();
143   DECLARE_READ8_MEMBER(megadrive_io_read_data_port_6button);
144   DECLARE_READ8_MEMBER(megadrive_io_read_data_port_3button);
145   UINT8 megatech_bios_port_cc_dc_r(int offset, int ctrl);
146   UINT8 megadrive_io_read_ctrl_port(int portnum);
147   UINT8 megadrive_io_read_tx_port(int portnum);
148   UINT8 megadrive_io_read_rx_port(int portnum);
149   UINT8 megadrive_io_read_sctrl_port(int portnum);
150
151   DECLARE_WRITE16_MEMBER(megadrive_io_write_data_port_3button);
152   DECLARE_WRITE16_MEMBER(megadrive_io_write_data_port_6button);
153   void megadrive_io_write_ctrl_port(int portnum, UINT16 data);
154   void megadrive_io_write_tx_port(int portnum, UINT16 data);
155   void megadrive_io_write_rx_port(int portnum, UINT16 data);
156   void megadrive_io_write_sctrl_port(int portnum, UINT16 data);   
157   
158   void megadriv_stop_scanline_timer();   
138159};
139160
140161class md_boot_state : public md_base_state
r22070r22071
285306   DECLARE_DRIVER_INIT(pclubjv2);
286307   DECLARE_DRIVER_INIT(pclubjv4);
287308   DECLARE_DRIVER_INIT(pclubjv5);
288   void segac2_common_init(running_machine& machine, int (*func)(int in));
309   void segac2_common_init(int (*func)(int in));
289310   DECLARE_VIDEO_START(segac2_new);
290311   DECLARE_MACHINE_START(segac2);
291312   DECLARE_MACHINE_RESET(segac2);
292313
293314   UINT32 screen_update_segac2_new(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
315   int m_segac2_bg_pal_lookup[4];
316   int m_segac2_sp_pal_lookup[4];
317   void recompute_palette_tables();   
318   
319   DECLARE_WRITE16_MEMBER( segac2_upd7759_w );
320   DECLARE_READ16_MEMBER( palette_r );
321   DECLARE_WRITE16_MEMBER( palette_w );
322   DECLARE_READ16_MEMBER( io_chip_r );
323   DECLARE_WRITE16_MEMBER( io_chip_w );
324   DECLARE_WRITE16_MEMBER( control_w );
325   DECLARE_READ16_MEMBER( prot_r );
326   DECLARE_WRITE16_MEMBER( prot_w );
327   DECLARE_WRITE16_MEMBER( counter_timer_w );
328   DECLARE_READ16_MEMBER( printer_r );
329   DECLARE_WRITE16_MEMBER( print_club_camera_w );   
330   DECLARE_READ16_MEMBER(ichirjbl_prot_r);
294331};
295332
296333class mplay_state : public md_base_state
r22070r22071
395432   UINT32 screen_update_megatech_menu(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
396433   
397434   void megatech_set_megadrive_z80_as_megadrive_z80(const char* tag);
435   
436   DECLARE_READ8_MEMBER( megatech_cart_select_r );
437   TIMER_CALLBACK_MEMBER( megatech_z80_run_state );
438   TIMER_CALLBACK_MEMBER( megatech_z80_stop_state );
439   void megatech_select_game(int gameno);
440   DECLARE_WRITE8_MEMBER( megatech_cart_select_w );
441   DECLARE_READ8_MEMBER( bios_ctrl_r );
442   DECLARE_WRITE8_MEMBER( bios_ctrl_w );
443   DECLARE_READ8_MEMBER( megatech_z80_read_68k_banked_data );
444   DECLARE_WRITE8_MEMBER( megatech_z80_write_68k_banked_data );
445   void megatech_z80_bank_w(UINT16 data);
446   DECLARE_WRITE8_MEMBER( mt_z80_bank_w );
447   DECLARE_READ8_MEMBER( megatech_banked_ram_r );
448   DECLARE_WRITE8_MEMBER( megatech_banked_ram_w );
449   DECLARE_WRITE8_MEMBER( megatech_bios_port_ctrl_w );
450   DECLARE_READ8_MEMBER( megatech_bios_joypad_r );
451   DECLARE_WRITE8_MEMBER (megatech_bios_port_7f_w);
398452};
399453
400454
trunk/src/mess/drivers/megadriv.c
r22070r22071
2424   m_slotcart(*this, "mdslot")
2525   { }
2626   
27   emu_timer *m_mess_io_timeout[3];
28   int m_mess_io_stage[3];
29   
3027   optional_device<md_cart_slot_device> m_slotcart;
3128   
3229   DECLARE_DRIVER_INIT(mess_md_common);
3330   DECLARE_DRIVER_INIT(genesis);
3431   DECLARE_DRIVER_INIT(md_eur);
3532   DECLARE_DRIVER_INIT(md_jpn);
33   
34   READ8_MEMBER(mess_md_io_read_data_port);
35   WRITE16_MEMBER(mess_md_io_write_data_port);
36
3637};
3738
3839class pico_state : public md_cons_state
r22070r22071
4445   
4546   optional_device<pico_cart_slot_device> m_picocart;
4647   UINT8 m_page_register;
48   
49   UINT16 pico_read_penpos(int pen);
50   DECLARE_READ16_HANDLER(pico_68k_io_read);
51   DECLARE_WRITE16_MEMBER(pico_68k_io_write);
4752};
4853
4954
r22070r22071
5358 *
5459 *************************************/
5560
56/* We need to always initialize 6 buttons pad */
57static TIMER_CALLBACK( mess_io_timeout_timer_callback )
58{
59   md_cons_state *state = machine.driver_data<md_cons_state>();
60   state->m_mess_io_stage[(int)(FPTR)ptr] = -1;
61}
62
63static void mess_init_6buttons_pad(running_machine &machine)
64{
65   md_cons_state *state = machine.driver_data<md_cons_state>();
66   int i;
67
68   for (i = 0; i < 3; i++)
69   {
70      state->m_mess_io_timeout[i] = machine.scheduler().timer_alloc(FUNC(mess_io_timeout_timer_callback), (void*)(FPTR)i);
71      state->m_mess_io_stage[i] = -1;
72   }
73}
74
7561/* These overwrite the MAME ones in DRIVER_INIT */
7662/* They're needed to give the users the choice between different controllers */
77static UINT8 mess_md_io_read_data_port(running_machine &machine, int portnum)
63READ8_MEMBER(md_cons_state::mess_md_io_read_data_port)
7864{
79   md_cons_state *state = machine.driver_data<md_cons_state>();
65   int portnum = offset;
8066   static const char *const pad6names[2][4] = {
8167      { "PAD1_6B", "PAD2_6B", "UNUSED", "UNUSED" },
8268      { "EXTRA1", "EXTRA2", "UNUSED", "UNUSED" }
r22070r22071
9177   switch (portnum)
9278   {
9379      case 0:
94         controller = (machine.root_device().ioport("CTRLSEL")->read() & 0x0f);
80         controller = (ioport("CTRLSEL")->read() & 0x0f);
9581         break;
9682
9783      case 1:
98         controller = (machine.root_device().ioport("CTRLSEL")->read() & 0xf0);
84         controller = (ioport("CTRLSEL")->read() & 0xf0);
9985         break;
10086
10187      default:
r22070r22071
10894   {
10995      if (m_megadrive_io_data_regs[portnum] & 0x40)
11096      {
111         if (state->m_mess_io_stage[portnum] == 2)
97         if (m_io_stage[portnum] == 2)
11298         {
11399            /* here we read B, C & the additional buttons */
114100            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
115                     (((state->ioport(pad6names[0][portnum])->read_safe(0) & 0x30) |
116                        (state->ioport(pad6names[1][portnum])->read_safe(0) & 0x0f)) & ~helper_6b);
101                     (((ioport(pad6names[0][portnum])->read_safe(0) & 0x30) |
102                        (ioport(pad6names[1][portnum])->read_safe(0) & 0x0f)) & ~helper_6b);
117103         }
118104         else
119105         {
120106            /* here we read B, C & the directional buttons */
121107            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
122                     ((state->ioport(pad6names[0][portnum])->read_safe(0) & 0x3f) & ~helper_6b);
108                     ((ioport(pad6names[0][portnum])->read_safe(0) & 0x3f) & ~helper_6b);
123109         }
124110      }
125111      else
126112      {
127         if (state->m_mess_io_stage[portnum] == 1)
113         if (m_io_stage[portnum] == 1)
128114         {
129115            /* here we read ((Start & A) >> 2) | 0x00 */
130116            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
131                     (((state->ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) & ~helper_6b);
117                     (((ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) & ~helper_6b);
132118         }
133         else if (state->m_mess_io_stage[portnum]==2)
119         else if (m_io_stage[portnum]==2)
134120         {
135121            /* here we read ((Start & A) >> 2) | 0x0f */
136122            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
137                     ((((state->ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) | 0x0f) & ~helper_6b);
123                     ((((ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) | 0x0f) & ~helper_6b);
138124         }
139125         else
140126         {
141127            /* here we read ((Start & A) >> 2) | Up and Down */
142128            retdata = (m_megadrive_io_data_regs[portnum] & helper_6b) |
143                     ((((state->ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) |
144                        (state->ioport(pad6names[0][portnum])->read_safe(0) & 0x03)) & ~helper_6b);
129                     ((((ioport(pad6names[0][portnum])->read_safe(0) & 0xc0) >> 2) |
130                        (ioport(pad6names[0][portnum])->read_safe(0) & 0x03)) & ~helper_6b);
145131         }
146132      }
147133
r22070r22071
153139   else
154140   {
155141      UINT8 svp_test = 0;
156      if (state->m_slotcart)
157         svp_test = state->m_slotcart->read_test();
142      if (m_slotcart)
143         svp_test = m_slotcart->read_test();
158144
159145      // handle test input for SVP test
160146      if (portnum == 0 && svp_test)
r22070r22071
165151      {
166152         /* here we read B, C & the directional buttons */
167153         retdata = (m_megadrive_io_data_regs[portnum] & helper_3b) |
168                  (((state->ioport(pad3names[portnum])->read_safe(0) & 0x3f) | 0x40) & ~helper_3b);
154                  (((ioport(pad3names[portnum])->read_safe(0) & 0x3f) | 0x40) & ~helper_3b);
169155      }
170156      else
171157      {
172158         /* here we read ((Start & A) >> 2) | Up and Down */
173159         retdata = (m_megadrive_io_data_regs[portnum] & helper_3b) |
174                  ((((state->ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
175                     (state->ioport(pad3names[portnum])->read_safe(0) & 0x03) | 0x40) & ~helper_3b);
160                  ((((ioport(pad3names[portnum])->read_safe(0) & 0xc0) >> 2) |
161                     (ioport(pad3names[portnum])->read_safe(0) & 0x03) | 0x40) & ~helper_3b);
176162      }
177163   }
178164
r22070r22071
180166}
181167
182168
183static void mess_md_io_write_data_port(running_machine &machine, int portnum, UINT16 data)
169WRITE16_MEMBER(md_cons_state::mess_md_io_write_data_port)
184170{
185   md_cons_state *state = machine.driver_data<md_cons_state>();
171   int portnum = offset;
186172   int controller;
187173
188174   switch (portnum)
189175   {
190176      case 0:
191         controller = (machine.root_device().ioport("CTRLSEL")->read() & 0x0f);
177         controller = (ioport("CTRLSEL")->read() & 0x0f);
192178         break;
193179
194180      case 1:
195         controller = (machine.root_device().ioport("CTRLSEL")->read() & 0xf0);
181         controller = (ioport("CTRLSEL")->read() & 0xf0);
196182         break;
197183
198184      default:
r22070r22071
206192      {
207193         if (((m_megadrive_io_data_regs[portnum] & 0x40) == 0x00) && ((data & 0x40) == 0x40))
208194         {
209            state->m_mess_io_stage[portnum]++;
210            state->m_mess_io_timeout[portnum]->adjust(machine.device<cpu_device>("maincpu")->cycles_to_attotime(8192));
195            m_io_stage[portnum]++;
196            m_io_timeout[portnum]->adjust(machine().device<cpu_device>("maincpu")->cycles_to_attotime(8192));
211197         }
212198
213199      }
r22070r22071
331317{
332318   md_cons_state *state = machine.driver_data<md_cons_state>();
333319
334   mess_init_6buttons_pad(machine);
320   state->init_megadri6_io();
335321
336322   vdp_get_word_from_68k_mem = vdp_get_word_from_68k_mem_console;
337323
r22070r22071
460446
461447DRIVER_INIT_MEMBER(md_cons_state,mess_md_common)
462448{
463   megadrive_io_read_data_port_ptr = mess_md_io_read_data_port;
464   megadrive_io_write_data_port_ptr = mess_md_io_write_data_port;
449   m_megadrive_io_read_data_port_ptr = read8_delegate(FUNC(md_cons_state::mess_md_io_read_data_port),this);
450   m_megadrive_io_write_data_port_ptr = write16_delegate(FUNC(md_cons_state::mess_md_io_write_data_port),this);
465451}
466452
467453DRIVER_INIT_MEMBER(md_cons_state,genesis)
r22070r22071
892878#define PICO_PENX   1
893879#define PICO_PENY   2
894880
895static UINT16 pico_read_penpos(running_machine &machine, int pen)
881UINT16 pico_state::pico_read_penpos(int pen)
896882{
897883   UINT16 penpos = 0;
898884
899885   switch (pen)
900886   {
901887      case PICO_PENX:
902         penpos = machine.root_device().ioport("PENX")->read_safe(0);
888         penpos = ioport("PENX")->read_safe(0);
903889         penpos |= 0x6;
904890         penpos = penpos * 320 / 255;
905891         penpos += 0x3d;
906892         break;
907893      case PICO_PENY:
908         penpos = machine.root_device().ioport("PENY")->read_safe(0);
894         penpos = ioport("PENY")->read_safe(0);
909895         penpos |= 0x6;
910896         penpos = penpos * 251 / 255;
911897         penpos += 0x1fc;
r22070r22071
915901   return penpos;
916902}
917903
918static READ16_HANDLER( pico_68k_io_read )
904READ16_HANDLER(pico_state::pico_68k_io_read )
919905{
920   pico_state *state = space.machine().driver_data<pico_state>();
921906   UINT8 retdata = 0;
922907
923908   switch (offset)
924909   {
925910      case 0: /* Version register ?XX?????? where XX is 00 for japan, 01 for europe and 10 for USA*/
926         retdata = (state->m_export << 6) | (state->m_pal << 5);
911         retdata = (m_export << 6) | (m_pal << 5);
927912         break;
928913      case 1:
929         retdata = state->ioport("PAD")->read_safe(0);
914         retdata = ioport("PAD")->read_safe(0);
930915         break;
931916
932917         /*
r22070r22071
941926           0x2f8 - 0x3f3 (storyware)
942927         */
943928      case 2:
944         retdata = pico_read_penpos(space.machine(), PICO_PENX) >> 8;
929         retdata = pico_read_penpos(PICO_PENX) >> 8;
945930         break;
946931      case 3:
947         retdata = pico_read_penpos(space.machine(), PICO_PENX) & 0x00ff;
932         retdata = pico_read_penpos(PICO_PENX) & 0x00ff;
948933         break;
949934      case 4:
950         retdata = pico_read_penpos(space.machine(), PICO_PENY) >> 8;
935         retdata = pico_read_penpos(PICO_PENY) >> 8;
951936         break;
952937      case 5:
953         retdata = pico_read_penpos(space.machine(), PICO_PENY) & 0x00ff;
938         retdata = pico_read_penpos(PICO_PENY) & 0x00ff;
954939         break;
955940      case 6:
956941      /* Page register :
r22070r22071
959944         either page 5 or page 6 is often unused.
960945      */
961946         {
962            UINT8 tmp = state->ioport("PAGE")->read_safe(0);
963            if (tmp == 2 && state->m_page_register != 0x3f)
947            UINT8 tmp = ioport("PAGE")->read_safe(0);
948            if (tmp == 2 && m_page_register != 0x3f)
964949            {
965               state->m_page_register <<= 1;
966               state->m_page_register |= 1;
950               m_page_register <<= 1;
951               m_page_register |= 1;
967952            }
968            if (tmp == 1 && state->m_page_register != 0x00)
969               state->m_page_register >>= 1;
970            retdata = state->m_page_register;
953            if (tmp == 1 && m_page_register != 0x00)
954               m_page_register >>= 1;
955            retdata = m_page_register;
971956            break;
972957         }
973958      case 7:
r22070r22071
985970   return retdata | retdata << 8;
986971}
987972
988static WRITE16_HANDLER( pico_68k_io_write )
973WRITE16_MEMBER(pico_state::pico_68k_io_write )
989974{
990975   switch (offset)
991976   {
r22070r22071
995980static ADDRESS_MAP_START( pico_mem, AS_PROGRAM, 16, pico_state )
996981   AM_RANGE(0x000000, 0x3fffff) AM_ROM
997982
998   AM_RANGE(0x800000, 0x80001f) AM_READWRITE_LEGACY(pico_68k_io_read, pico_68k_io_write)
983   AM_RANGE(0x800000, 0x80001f) AM_READWRITE(pico_68k_io_read, pico_68k_io_write)
999984
1000985   AM_RANGE(0xc00000, 0xc0001f) AM_DEVREADWRITE("gen_vdp", sega_genesis_vdp_device, megadriv_vdp_r,megadriv_vdp_w)
1001986   AM_RANGE(0xe00000, 0xe0ffff) AM_RAM AM_MIRROR(0x1f0000)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team