Previous 199869 Revisions Next

r20378 Sunday 20th January, 2013 at 20:35:40 UTC by Wilbert Pol
(MESS)sms.c: Getting rid of some static functions (nw)
[src/mess/includes]sms.h
[src/mess/machine]sms.c

trunk/src/mess/machine/sms.c
r20377r20378
2727#define LGUN_X_INTERVAL       4
2828
2929
30static void setup_rom(address_space &space);
31
32
3330TIMER_CALLBACK_MEMBER(sms_state::rapid_fire_callback)
3431{
3532   m_rapid_fire_state_1 ^= 0xff;
r20377r20378
285282/* FIXME: this function is a hack for Light Phaser emulation. Theoretically
286283   sms_vdp_hcount_latch() should be used instead, but it returns incorrect
287284   position for unknown reason (timing?) */
288static void sms_vdp_hcount_lphaser( running_machine &machine, int hpos )
285void sms_state::vdp_hcount_lphaser( int hpos )
289286{
290   sms_state *state = machine.driver_data<sms_state>();
291   int hpos_tmp = hpos + state->m_lphaser_x_offs;
287   int hpos_tmp = hpos + m_lphaser_x_offs;
292288   UINT8 tmp = ((hpos_tmp - 46) >> 1) & 0xff;
293289
294290   //printf ("sms_vdp_hcount_lphaser: hpos %3d hpos_tmp %3d => hcount %2X\n", hpos, hpos_tmp, tmp);
295   state->m_vdp->hcount_latch_write(*state->m_space, 0, tmp);
291   m_vdp->hcount_latch_write(*m_space, 0, tmp);
296292}
297293
298294
r20377r20378
318314    - The whole procedure is managed by a timer callback, that always reschedule
319315      itself to run in some intervals when the beam is at the circular area.
320316*/
321static int lgun_bright_aim_area( running_machine &machine, emu_timer *timer, int lgun_x, int lgun_y )
317int sms_state::lgun_bright_aim_area( emu_timer *timer, int lgun_x, int lgun_y )
322318{
323   sms_state *state = machine.driver_data<sms_state>();
324319   const int r_x_r = LGUN_RADIUS * LGUN_RADIUS;
325   screen_device *screen = machine.first_screen();
326   const rectangle &visarea = screen->visible_area();
327   int beam_x = screen->hpos();
328   int beam_y = screen->vpos();
320   const rectangle &visarea = m_main_scr->visible_area();
321   int beam_x = m_main_scr->hpos();
322   int beam_y = m_main_scr->vpos();
329323   int dx, dy;
330324   int result = 0;
331325   int pos_changed = 0;
r20377r20378
365359
366360      if (!pos_changed)
367361      {
368         bitmap_rgb32 &bitmap = state->m_vdp->get_bitmap();
362         bitmap_rgb32 &bitmap = m_vdp->get_bitmap();
369363
370364         /* brightness of the lightgray color in the frame drawn by Light Phaser games */
371365         const UINT8 sensor_min_brightness = 0x7f;
r20377r20378
390384      else
391385         break;
392386   }
393   timer->adjust(machine.first_screen()->time_until_pos(beam_y, beam_x));
387   timer->adjust(m_main_scr->time_until_pos(beam_y, beam_x));
394388
395389   return result;
396390}
397391
398static UINT8 sms_vdp_hcount( running_machine &machine )
392UINT8 sms_state::sms_vdp_hcount()
399393{
400394   UINT8 tmp;
401   screen_device *screen = machine.first_screen();
402   int hpos = screen->hpos();
395   int hpos = m_main_scr->hpos();
403396
404397   /* alternative method: pass HCounter test, but some others fail */
405398   //int hpos_tmp = hpos;
r20377r20378
408401
409402   UINT64 calc_cycles;
410403   attotime time_end;
411   int vpos = screen->vpos();
412   int max_hpos = screen->width() - 1;
404   int vpos = m_main_scr->vpos();
405   int max_hpos = m_main_scr->width() - 1;
413406
414407   if (hpos == max_hpos)
415408      time_end = attotime::zero;
416409   else
417      time_end = screen->time_until_pos(vpos, max_hpos);
418   calc_cycles = machine.device<cpu_device>("maincpu")->attotime_to_clocks(time_end);
410      time_end = m_main_scr->time_until_pos(vpos, max_hpos);
411   calc_cycles = m_main_cpu->attotime_to_clocks(time_end);
419412
420413   /* equation got from SMSPower forum, posted by Flubba. */
421414   tmp = ((590 - (calc_cycles * 3)) / 4) & 0xff;
r20377r20378
425418}
426419
427420
428static void sms_vdp_hcount_latch( address_space &space )
421void sms_state::sms_vdp_hcount_latch( address_space &space )
429422{
430   sms_state *state = space.machine().driver_data<sms_state>();
431   UINT8 value = sms_vdp_hcount(space.machine());
423   UINT8 value = sms_vdp_hcount();
432424
433   state->m_vdp->hcount_latch_write(space, 0, value);
425   m_vdp->hcount_latch_write(space, 0, value);
434426}
435427
436428
437static UINT16 screen_hpos_nonscaled( screen_device &screen, int scaled_hpos )
429UINT16 sms_state::screen_hpos_nonscaled(int scaled_hpos)
438430{
439   const rectangle &visarea = screen.visible_area();
431   const rectangle &visarea = m_main_scr->visible_area();
440432   int offset_x = (scaled_hpos * visarea.width()) / 255;
441433   return visarea.min_x + offset_x;
442434}
443435
444436
445static UINT16 screen_vpos_nonscaled( screen_device &screen, int scaled_vpos )
437UINT16 sms_state::screen_vpos_nonscaled(int scaled_vpos)
446438{
447   const rectangle &visarea = screen.visible_area();
439   const rectangle &visarea = m_main_scr->visible_area();
448440   int offset_y = (scaled_vpos * (visarea.max_y - visarea.min_y)) / 255;
449441   return visarea.min_y + offset_y;
450442}
451443
452444
453static void lphaser1_sensor_check( running_machine &machine )
445void sms_state::lphaser1_sensor_check()
454446{
455   sms_state *state = machine.driver_data<sms_state>();
456   const int x = screen_hpos_nonscaled(*machine.first_screen(), machine.root_device().ioport("LPHASER0")->read());
457   const int y = screen_vpos_nonscaled(*machine.first_screen(), machine.root_device().ioport("LPHASER1")->read());
447   const int x = screen_hpos_nonscaled( ioport("LPHASER0")->read() );
448   const int y = screen_vpos_nonscaled( ioport("LPHASER1")->read() );
458449
459   if (lgun_bright_aim_area(machine, state->m_lphaser_1_timer, x, y))
450   if (lgun_bright_aim_area(m_lphaser_1_timer, x, y))
460451   {
461      if (state->m_lphaser_1_latch == 0)
452      if (m_lphaser_1_latch == 0)
462453      {
463         state->m_lphaser_1_latch = 1;
464         sms_vdp_hcount_lphaser(machine, x);
454         m_lphaser_1_latch = 1;
455         vdp_hcount_lphaser(x);
465456      }
466457   }
467458}
468459
469static void lphaser2_sensor_check( running_machine &machine )
460void sms_state::lphaser2_sensor_check()
470461{
471   sms_state *state = machine.driver_data<sms_state>();
472   const int x = screen_hpos_nonscaled(*machine.first_screen(), machine.root_device().ioport("LPHASER2")->read());
473   const int y = screen_vpos_nonscaled(*machine.first_screen(), machine.root_device().ioport("LPHASER3")->read());
462   const int x = screen_hpos_nonscaled( ioport("LPHASER2")->read() );
463   const int y = screen_vpos_nonscaled( ioport("LPHASER3")->read() );
474464
475   if (lgun_bright_aim_area(machine, state->m_lphaser_2_timer, x, y))
465   if (lgun_bright_aim_area(m_lphaser_2_timer, x, y))
476466   {
477      if (state->m_lphaser_2_latch == 0)
467      if (m_lphaser_2_latch == 0)
478468      {
479         state->m_lphaser_2_latch = 1;
480         sms_vdp_hcount_lphaser(machine, x);
469         m_lphaser_2_latch = 1;
470         vdp_hcount_lphaser(x);
481471      }
482472   }
483473}
r20377r20378
492482      /* enable crosshair */
493483      crosshair_set_screen(machine(), 0, CROSSHAIR_SCREEN_ALL);
494484      if (!m_lphaser_1_timer->enabled())
495         lphaser1_sensor_check(machine());
485         lphaser1_sensor_check();
496486   }
497487   else
498488   {
r20377r20378
506496      /* enable crosshair */
507497      crosshair_set_screen(machine(), 1, CROSSHAIR_SCREEN_ALL);
508498      if (!m_lphaser_2_timer->enabled())
509         lphaser2_sensor_check(machine());
499         lphaser2_sensor_check();
510500   }
511501   else
512502   {
r20377r20378
519509
520510TIMER_CALLBACK_MEMBER(sms_state::lphaser_1_callback)
521511{
522   lphaser1_sensor_check(machine());
512   lphaser1_sensor_check();
523513}
524514
525515
526516TIMER_CALLBACK_MEMBER(sms_state::lphaser_2_callback)
527517{
528   lphaser2_sensor_check(machine());
518   lphaser2_sensor_check();
529519}
530520
531521
532522INPUT_CHANGED_MEMBER(sms_state::lgun1_changed)
533523{
534524   if (!m_lphaser_1_timer ||
535      (machine().root_device().ioport("CTRLSEL")->read_safe(0x00) & 0x0f) != 0x01)
525      (ioport("CTRLSEL")->read_safe(0x00) & 0x0f) != 0x01)
536526      return;
537527
538528   if (newval != oldval)
539      lphaser1_sensor_check(machine());
529      lphaser1_sensor_check();
540530}
541531
542532INPUT_CHANGED_MEMBER(sms_state::lgun2_changed)
543533{
544534   if (!m_lphaser_2_timer ||
545      (machine().root_device().ioport("CTRLSEL")->read_safe(0x00) & 0xf0) != 0x10)
535      (ioport("CTRLSEL")->read_safe(0x00) & 0xf0) != 0x10)
546536      return;
547537
548538   if (newval != oldval)
549      lphaser2_sensor_check(machine());
539      lphaser2_sensor_check();
550540}
551541
552542
553static void sms_get_inputs( address_space &space )
543void sms_state::sms_get_inputs( address_space &space )
554544{
555   sms_state *state = space.machine().driver_data<sms_state>();
556545   UINT8 data = 0x00;
557   UINT32 cpu_cycles = downcast<cpu_device *>(&space.device())->total_cycles();
558   running_machine &machine = space.machine();
546   UINT32 cpu_cycles = m_main_cpu->total_cycles();
559547
560   state->m_input_port0 = 0xff;
561   state->m_input_port1 = 0xff;
548   m_input_port0 = 0xff;
549   m_input_port1 = 0xff;
562550
563   if (cpu_cycles - state->m_last_paddle_read_time > 256)
551   if (cpu_cycles - m_last_paddle_read_time > 256)
564552   {
565      state->m_paddle_read_state ^= 0xff;
566      state->m_last_paddle_read_time = cpu_cycles;
553      m_paddle_read_state ^= 0xff;
554      m_last_paddle_read_time = cpu_cycles;
567555   }
568556
569557   /* Check if lightgun has been chosen as input: if so, enable crosshair */
570   machine.scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(sms_state::lightgun_tick),state));
558   machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(sms_state::lightgun_tick),this));
571559
572560   /* Player 1 */
573   switch (machine.root_device().ioport("CTRLSEL")->read_safe(0x00) & 0x0f)
561   switch (ioport("CTRLSEL")->read_safe(0x00) & 0x0f)
574562   {
575563   case 0x00:  /* Joystick */
576      data = machine.root_device().ioport("PORT_DC")->read();
564      data = ioport("PORT_DC")->read();
577565      /* Check Rapid Fire setting for Button A */
578      if (!(data & 0x10) && (machine.root_device().ioport("RFU")->read() & 0x01))
579         data |= state->m_rapid_fire_state_1 & 0x10;
566      if (!(data & 0x10) && (ioport("RFU")->read() & 0x01))
567         data |= m_rapid_fire_state_1 & 0x10;
580568
581569      /* Check Rapid Fire setting for Button B */
582      if (!(data & 0x20) && (machine.root_device().ioport("RFU")->read() & 0x02))
583         data |= state->m_rapid_fire_state_1 & 0x20;
570      if (!(data & 0x20) && (ioport("RFU")->read() & 0x02))
571         data |= m_rapid_fire_state_1 & 0x20;
584572
585      state->m_input_port0 = (state->m_input_port0 & 0xc0) | (data & 0x3f);
573      m_input_port0 = (m_input_port0 & 0xc0) | (data & 0x3f);
586574      break;
587575
588576   case 0x01:  /* Light Phaser */
589      data = (machine.root_device().ioport("CTRLIPT")->read() & 0x01) << 4;
577      data = (ioport("CTRLIPT")->read() & 0x01) << 4;
590578      if (!(data & 0x10))
591579      {
592         if (machine.root_device().ioport("RFU")->read() & 0x01)
593            data |= state->m_rapid_fire_state_1 & 0x10;
580         if (ioport("RFU")->read() & 0x01)
581            data |= m_rapid_fire_state_1 & 0x10;
594582      }
595583      /* just consider the button (trigger) bit */
596584      data |= ~0x10;
597      state->m_input_port0 = (state->m_input_port0 & 0xc0) | (data & 0x3f);
585      m_input_port0 = (m_input_port0 & 0xc0) | (data & 0x3f);
598586      break;
599587
600588   case 0x02:  /* Paddle Control */
601589      /* Get button A state */
602      data = machine.root_device().ioport("PADDLE0")->read();
590      data = ioport("PADDLE0")->read();
603591
604      if (state->m_paddle_read_state)
592      if (m_paddle_read_state)
605593         data = data >> 4;
606594
607      state->m_input_port0 = (state->m_input_port0 & 0xc0) | (data & 0x0f) | (state->m_paddle_read_state & 0x20)
608                  | ((machine.root_device().ioport("CTRLIPT")->read() & 0x02) << 3);
595      m_input_port0 = (m_input_port0 & 0xc0) | (data & 0x0f) | (m_paddle_read_state & 0x20)
596                  | ((ioport("CTRLIPT")->read() & 0x02) << 3);
609597      break;
610598
611599   case 0x04:  /* Sega Sports Pad */
612      switch (state->m_sports_pad_state_1)
600      switch (m_sports_pad_state_1)
613601      {
614602      case 0:
615         data = (state->m_sports_pad_1_x >> 4) & 0x0f;
603         data = (m_sports_pad_1_x >> 4) & 0x0f;
616604         break;
617605      case 1:
618         data = state->m_sports_pad_1_x & 0x0f;
606         data = m_sports_pad_1_x & 0x0f;
619607         break;
620608      case 2:
621         data = (state->m_sports_pad_1_y >> 4) & 0x0f;
609         data = (m_sports_pad_1_y >> 4) & 0x0f;
622610         break;
623611      case 3:
624         data = state->m_sports_pad_1_y & 0x0f;
612         data = m_sports_pad_1_y & 0x0f;
625613         break;
626614      }
627      state->m_input_port0 = (state->m_input_port0 & 0xc0) | data | ((machine.root_device().ioport("CTRLIPT")->read() & 0x0c) << 2);
615      m_input_port0 = (m_input_port0 & 0xc0) | data | ((ioport("CTRLIPT")->read() & 0x0c) << 2);
628616      break;
629617   }
630618
631619   /* Player 2 */
632   switch (machine.root_device().ioport("CTRLSEL")->read_safe(0x00)  & 0xf0)
620   switch (ioport("CTRLSEL")->read_safe(0x00)  & 0xf0)
633621   {
634622   case 0x00:  /* Joystick */
635      data = machine.root_device().ioport("PORT_DC")->read();
636      state->m_input_port0 = (state->m_input_port0 & 0x3f) | (data & 0xc0);
623      data = ioport("PORT_DC")->read();
624      m_input_port0 = (m_input_port0 & 0x3f) | (data & 0xc0);
637625
638      data = machine.root_device().ioport("PORT_DD")->read();
626      data = ioport("PORT_DD")->read();
639627      /* Check Rapid Fire setting for Button A */
640      if (!(data & 0x04) && (machine.root_device().ioport("RFU")->read() & 0x04))
641         data |= state->m_rapid_fire_state_2 & 0x04;
628      if (!(data & 0x04) && (ioport("RFU")->read() & 0x04))
629         data |= m_rapid_fire_state_2 & 0x04;
642630
643631      /* Check Rapid Fire setting for Button B */
644      if (!(data & 0x08) && (machine.root_device().ioport("RFU")->read() & 0x08))
645         data |= state->m_rapid_fire_state_2 & 0x08;
632      if (!(data & 0x08) && (ioport("RFU")->read() & 0x08))
633         data |= m_rapid_fire_state_2 & 0x08;
646634
647      state->m_input_port1 = (state->m_input_port1 & 0xf0) | (data & 0x0f);
635      m_input_port1 = (m_input_port1 & 0xf0) | (data & 0x0f);
648636      break;
649637
650638   case 0x10:  /* Light Phaser */
651      data = (machine.root_device().ioport("CTRLIPT")->read() & 0x10) >> 2;
639      data = (ioport("CTRLIPT")->read() & 0x10) >> 2;
652640      if (!(data & 0x04))
653641      {
654         if (machine.root_device().ioport("RFU")->read() & 0x04)
655            data |= state->m_rapid_fire_state_2 & 0x04;
642         if (ioport("RFU")->read() & 0x04)
643            data |= m_rapid_fire_state_2 & 0x04;
656644      }
657645      /* just consider the button (trigger) bit */
658646      data |= ~0x04;
659      state->m_input_port1 = (state->m_input_port1 & 0xf0) | (data & 0x0f);
647      m_input_port1 = (m_input_port1 & 0xf0) | (data & 0x0f);
660648      break;
661649
662650   case 0x20:  /* Paddle Control */
663651      /* Get button A state */
664      data = machine.root_device().ioport("PADDLE1")->read();
665      if (state->m_paddle_read_state)
652      data = ioport("PADDLE1")->read();
653      if (m_paddle_read_state)
666654         data = data >> 4;
667655
668      state->m_input_port0 = (state->m_input_port0 & 0x3f) | ((data & 0x03) << 6);
669      state->m_input_port1 = (state->m_input_port1 & 0xf0) | ((data & 0x0c) >> 2) | (state->m_paddle_read_state & 0x08)
670                  | ((machine.root_device().ioport("CTRLIPT")->read() & 0x20) >> 3);
656      m_input_port0 = (m_input_port0 & 0x3f) | ((data & 0x03) << 6);
657      m_input_port1 = (m_input_port1 & 0xf0) | ((data & 0x0c) >> 2) | (m_paddle_read_state & 0x08)
658                  | ((ioport("CTRLIPT")->read() & 0x20) >> 3);
671659      break;
672660
673661   case 0x40:  /* Sega Sports Pad */
674      switch (state->m_sports_pad_state_2)
662      switch (m_sports_pad_state_2)
675663      {
676664      case 0:
677         data = state->m_sports_pad_2_x & 0x0f;
665         data = m_sports_pad_2_x & 0x0f;
678666         break;
679667      case 1:
680         data = (state->m_sports_pad_2_x >> 4) & 0x0f;
668         data = (m_sports_pad_2_x >> 4) & 0x0f;
681669         break;
682670      case 2:
683         data = state->m_sports_pad_2_y & 0x0f;
671         data = m_sports_pad_2_y & 0x0f;
684672         break;
685673      case 3:
686         data = (state->m_sports_pad_2_y >> 4) & 0x0f;
674         data = (m_sports_pad_2_y >> 4) & 0x0f;
687675         break;
688676      }
689      state->m_input_port0 = (state->m_input_port0 & 0x3f) | ((data & 0x03) << 6);
690      state->m_input_port1 = (state->m_input_port1 & 0xf0) | (data >> 2) | ((machine.root_device().ioport("CTRLIPT")->read() & 0xc0) >> 4);
677      m_input_port0 = (m_input_port0 & 0x3f) | ((data & 0x03) << 6);
678      m_input_port1 = (m_input_port1 & 0xf0) | (data >> 2) | ((ioport("CTRLIPT")->read() & 0xc0) >> 4);
691679      break;
692680   }
693681}
r20377r20378
774762   {
775763      if (!m_paused)
776764      {
777         machine().device("maincpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE);
765         m_main_cpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
778766      }
779767      m_paused = 1;
780768   }
r20377r20378
889877   if ( sscope )
890878   {
891879      // Scope is attached
892      screen_device *screen = machine().first_screen();
893
894880      m_sscope_state = data;
895881
896882      // There are occurrences when Sega Scope's state changes after VBLANK, or at
r20377r20378
898884      // one exception is the first frame of Zaxxon 3-D's title screen. In that
899885      // case, this method is enough for setting the intended state for the frame.
900886      // No information found about a minimum time need for switch open/closed lens.
901      if (screen->vpos() < (screen->height() >> 1))
887      if (m_main_scr->vpos() < (m_main_scr->height() >> 1))
902888      {
903889         m_frame_sscope_state = m_sscope_state;
904890      }
r20377r20378
12291215
12301216   logerror("bios write %02x, pc: %04x\n", data, space.device().safe_pc());
12311217
1232   setup_rom(space);
1218   setup_rom();
12331219}
12341220
12351221
r20377r20378
13631349}
13641350
13651351
1366static void setup_rom( address_space &space )
1352void sms_state::setup_rom()
13671353{
1368   sms_state *state = space.machine().driver_data<sms_state>();
1369
13701354   /* 1. set up bank pointers to point to nothing */
1371   state->membank("bank1")->set_base(state->m_banking_none);
1372   state->membank("bank2")->set_base(state->m_banking_none);
1373   state->membank("bank7")->set_base(state->m_banking_none);
1374   state->membank("bank3")->set_base(state->m_banking_none);
1375   state->membank("bank4")->set_base(state->m_banking_none);
1376   state->membank("bank5")->set_base(state->m_banking_none);
1377   state->membank("bank6")->set_base(state->m_banking_none);
1355   membank("bank1")->set_base(m_banking_none);
1356   membank("bank2")->set_base(m_banking_none);
1357   membank("bank7")->set_base(m_banking_none);
1358   membank("bank3")->set_base(m_banking_none);
1359   membank("bank4")->set_base(m_banking_none);
1360   membank("bank5")->set_base(m_banking_none);
1361   membank("bank6")->set_base(m_banking_none);
13781362
13791363   /* 2. check and set up expansion port */
1380   if (!(state->m_bios_port & IO_EXPANSION) && (state->m_bios_port & IO_CARTRIDGE) && (state->m_bios_port & IO_CARD))
1364   if (!(m_bios_port & IO_EXPANSION) && (m_bios_port & IO_CARTRIDGE) && (m_bios_port & IO_CARD))
13811365   {
13821366      /* TODO: Implement me */
13831367      logerror("Switching to unsupported expansion port.\n");
13841368   }
13851369
13861370   /* 3. check and set up card rom */
1387   if (!(state->m_bios_port & IO_CARD) && (state->m_bios_port & IO_CARTRIDGE) && (state->m_bios_port & IO_EXPANSION))
1371   if (!(m_bios_port & IO_CARD) && (m_bios_port & IO_CARTRIDGE) && (m_bios_port & IO_EXPANSION))
13881372   {
13891373      /* TODO: Implement me */
13901374      logerror("Switching to unsupported card rom port.\n");
r20377r20378
13931377   /* 4. check and set up cartridge rom */
13941378   /* if ((!(bios_port & IO_CARTRIDGE) && (bios_port & IO_EXPANSION) && (bios_port & IO_CARD)) || state->m_is_gamegear) { */
13951379   /* Out Run Europa initially writes a value to port 3E where IO_CARTRIDGE, IO_EXPANSION and IO_CARD are reset */
1396   if ((!(state->m_bios_port & IO_CARTRIDGE)) || state->m_is_gamegear)
1380   if ((!(m_bios_port & IO_CARTRIDGE)) || m_is_gamegear)
13971381   {
1398      state->membank("bank1")->set_base(state->m_banking_cart[1]);
1399      state->membank("bank2")->set_base(state->m_banking_cart[2]);
1400      state->membank("bank7")->set_base(state->m_banking_cart[7]);
1401      state->membank("bank3")->set_base(state->m_banking_cart[3]);
1402      state->membank("bank4")->set_base(state->m_banking_cart[3] + 0x2000);
1403      state->membank("bank5")->set_base(state->m_banking_cart[5]);
1404      state->membank("bank6")->set_base(state->m_banking_cart[5] + 0x2000);
1382      membank("bank1")->set_base(m_banking_cart[1]);
1383      membank("bank2")->set_base(m_banking_cart[2]);
1384      membank("bank7")->set_base(m_banking_cart[7]);
1385      membank("bank3")->set_base(m_banking_cart[3]);
1386      membank("bank4")->set_base(m_banking_cart[3] + 0x2000);
1387      membank("bank5")->set_base(m_banking_cart[5]);
1388      membank("bank6")->set_base(m_banking_cart[5] + 0x2000);
14051389      logerror("Switched in cartridge rom.\n");
14061390   }
14071391
14081392   /* 5. check and set up bios rom */
1409   if (!(state->m_bios_port & IO_BIOS_ROM))
1393   if (!(m_bios_port & IO_BIOS_ROM))
14101394   {
14111395      /* 0x0400 bioses */
1412      if (state->m_has_bios_0400)
1396      if (m_has_bios_0400)
14131397      {
1414         state->membank("bank1")->set_base(state->m_banking_bios[1]);
1398         membank("bank1")->set_base(m_banking_bios[1]);
14151399         logerror("Switched in 0x0400 bios.\n");
14161400      }
14171401      /* 0x2000 bioses */
1418      if (state->m_has_bios_2000)
1402      if (m_has_bios_2000)
14191403      {
1420         state->membank("bank1")->set_base(state->m_banking_bios[1]);
1421         state->membank("bank2")->set_base(state->m_banking_bios[2]);
1404         membank("bank1")->set_base(m_banking_bios[1]);
1405         membank("bank2")->set_base(m_banking_bios[2]);
14221406         logerror("Switched in 0x2000 bios.\n");
14231407      }
1424      if (state->m_has_bios_full)
1408      if (m_has_bios_full)
14251409      {
1426         state->membank("bank1")->set_base(state->m_banking_bios[1]);
1427         state->membank("bank2")->set_base(state->m_banking_bios[2]);
1428         state->membank("bank7")->set_base(state->m_banking_bios[7]);
1429         state->membank("bank3")->set_base(state->m_banking_bios[3]);
1430         state->membank("bank4")->set_base(state->m_banking_bios[3] + 0x2000);
1431         state->membank("bank5")->set_base(state->m_banking_bios[5]);
1432         state->membank("bank6")->set_base(state->m_banking_bios[5] + 0x2000);
1410         membank("bank1")->set_base(m_banking_bios[1]);
1411         membank("bank2")->set_base(m_banking_bios[2]);
1412         membank("bank7")->set_base(m_banking_bios[7]);
1413         membank("bank3")->set_base(m_banking_bios[3]);
1414         membank("bank4")->set_base(m_banking_bios[3] + 0x2000);
1415         membank("bank5")->set_base(m_banking_bios[5]);
1416         membank("bank6")->set_base(m_banking_bios[5] + 0x2000);
14331417         logerror("Switched in full bios.\n");
14341418      }
14351419   }
14361420
1437   if (state->m_cartridge[state->m_current_cartridge].features & CF_ONCART_RAM)
1421   if (m_cartridge[m_current_cartridge].features & CF_ONCART_RAM)
14381422   {
1439      state->membank("bank5")->set_base(state->m_cartridge[state->m_current_cartridge].cartRAM);
1440      state->membank("bank6")->set_base(state->m_cartridge[state->m_current_cartridge].cartRAM);
1423      membank("bank5")->set_base(m_cartridge[m_current_cartridge].cartRAM);
1424      membank("bank6")->set_base(m_cartridge[m_current_cartridge].cartRAM);
14411425   }
14421426}
14431427
r20377r20378
18541838}
18551839
18561840
1857static void setup_cart_banks( running_machine &machine )
1841void sms_state::setup_cart_banks()
18581842{
1859   sms_state *state = machine.driver_data<sms_state>();
1860   if (state->m_cartridge[state->m_current_cartridge].ROM)
1843   if (m_cartridge[m_current_cartridge].ROM)
18611844   {
1862      UINT8 rom_page_count = state->m_cartridge[state->m_current_cartridge].size / 0x4000;
1863      state->m_banking_cart[1] = state->m_cartridge[state->m_current_cartridge].ROM;
1864      state->m_banking_cart[2] = state->m_cartridge[state->m_current_cartridge].ROM + 0x0400;
1865      state->m_banking_cart[3] = state->m_cartridge[state->m_current_cartridge].ROM + ((1 < rom_page_count) ? 0x4000 : 0);
1866      state->m_banking_cart[5] = state->m_cartridge[state->m_current_cartridge].ROM + ((2 < rom_page_count) ? 0x8000 : 0);
1867      state->m_banking_cart[7] = state->m_cartridge[state->m_current_cartridge].ROM + 0x2000;
1845      UINT8 rom_page_count = m_cartridge[m_current_cartridge].size / 0x4000;
1846      m_banking_cart[1] = m_cartridge[m_current_cartridge].ROM;
1847      m_banking_cart[2] = m_cartridge[m_current_cartridge].ROM + 0x0400;
1848      m_banking_cart[3] = m_cartridge[m_current_cartridge].ROM + ((1 < rom_page_count) ? 0x4000 : 0);
1849      m_banking_cart[5] = m_cartridge[m_current_cartridge].ROM + ((2 < rom_page_count) ? 0x8000 : 0);
1850      m_banking_cart[7] = m_cartridge[m_current_cartridge].ROM + 0x2000;
18681851      /* Codemasters mapper points to bank 0 for page 2 */
1869      if ( state->m_cartridge[state->m_current_cartridge].features & CF_CODEMASTERS_MAPPER )
1852      if ( m_cartridge[m_current_cartridge].features & CF_CODEMASTERS_MAPPER )
18701853      {
1871         state->m_banking_cart[5] = state->m_cartridge[state->m_current_cartridge].ROM;
1854         m_banking_cart[5] = m_cartridge[m_current_cartridge].ROM;
18721855      }
18731856      /* Nemesis starts with last 8kb bank in page 0 */
1874      if (state->m_cartridge[state->m_current_cartridge].features & CF_KOREAN_ZEMINA_NEMESIS )
1857      if (m_cartridge[m_current_cartridge].features & CF_KOREAN_ZEMINA_NEMESIS )
18751858      {
1876         state->m_banking_cart[1] = state->m_cartridge[state->m_current_cartridge].ROM + ( rom_page_count - 1 ) * 0x4000 + 0x2000;
1877         state->m_banking_cart[2] = state->m_cartridge[state->m_current_cartridge].ROM + ( rom_page_count - 1 ) * 0x4000 + 0x2000 + 0x400;
1859         m_banking_cart[1] = m_cartridge[m_current_cartridge].ROM + ( rom_page_count - 1 ) * 0x4000 + 0x2000;
1860         m_banking_cart[2] = m_cartridge[m_current_cartridge].ROM + ( rom_page_count - 1 ) * 0x4000 + 0x2000 + 0x400;
18781861      }
18791862   }
18801863   else
18811864   {
1882      state->m_banking_cart[1] = state->m_banking_none;
1883      state->m_banking_cart[2] = state->m_banking_none;
1884      state->m_banking_cart[3] = state->m_banking_none;
1885      state->m_banking_cart[5] = state->m_banking_none;
1865      m_banking_cart[1] = m_banking_none;
1866      m_banking_cart[2] = m_banking_none;
1867      m_banking_cart[3] = m_banking_none;
1868      m_banking_cart[5] = m_banking_none;
18861869   }
18871870}
18881871
1889static void setup_banks( running_machine &machine )
1872void sms_state::setup_banks()
18901873{
1891   sms_state *state = machine.driver_data<sms_state>();
1892   UINT8 *mem = machine.root_device().memregion("maincpu")->base();
1893   state->m_banking_none = mem;
1894   state->m_banking_bios[1] = state->m_banking_cart[1] = mem;
1895   state->m_banking_bios[2] = state->m_banking_cart[2] = mem;
1896   state->m_banking_bios[3] = state->m_banking_cart[3] = mem;
1897   state->m_banking_bios[4] = state->m_banking_cart[4] = mem;
1898   state->m_banking_bios[5] = state->m_banking_cart[5] = mem;
1899   state->m_banking_bios[6] = state->m_banking_cart[6] = mem;
1900   state->m_banking_bios[7] = state->m_banking_cart[7] = mem;
1874   UINT8 *mem = memregion("maincpu")->base();
1875   m_banking_none = mem;
1876   m_banking_bios[1] = m_banking_cart[1] = mem;
1877   m_banking_bios[2] = m_banking_cart[2] = mem;
1878   m_banking_bios[3] = m_banking_cart[3] = mem;
1879   m_banking_bios[4] = m_banking_cart[4] = mem;
1880   m_banking_bios[5] = m_banking_cart[5] = mem;
1881   m_banking_bios[6] = m_banking_cart[6] = mem;
1882   m_banking_bios[7] = m_banking_cart[7] = mem;
19011883
1902   state->m_BIOS = machine.root_device().memregion("user1")->base();
1884   m_BIOS = memregion("user1")->base();
19031885
1904   state->m_bios_page_count = (state->m_BIOS ? state->memregion("user1")->bytes() / 0x4000 : 0);
1886   m_bios_page_count = (m_BIOS ? memregion("user1")->bytes() / 0x4000 : 0);
19051887
1906   setup_cart_banks(machine);
1888   setup_cart_banks();
19071889
1908   if (state->m_BIOS == NULL || state->m_BIOS[0] == 0x00)
1890   if (m_BIOS == NULL || m_BIOS[0] == 0x00)
19091891   {
1910      state->m_BIOS = NULL;
1911      state->m_bios_port |= IO_BIOS_ROM;
1912      state->m_has_bios_0400 = 0;
1913      state->m_has_bios_2000 = 0;
1914      state->m_has_bios_full = 0;
1915      state->m_has_bios = 0;
1892      m_BIOS = NULL;
1893      m_bios_port |= IO_BIOS_ROM;
1894      m_has_bios_0400 = 0;
1895      m_has_bios_2000 = 0;
1896      m_has_bios_full = 0;
1897      m_has_bios = 0;
19161898   }
19171899
1918   if (state->m_BIOS)
1900   if (m_BIOS)
19191901   {
1920      state->m_banking_bios[1] = state->m_BIOS;
1921      state->m_banking_bios[2] = state->m_BIOS + 0x0400;
1922      state->m_banking_bios[3] = state->m_BIOS + ((1 < state->m_bios_page_count) ? 0x4000 : 0);
1923      state->m_banking_bios[5] = state->m_BIOS + ((2 < state->m_bios_page_count) ? 0x8000 : 0);
1902      m_banking_bios[1] = m_BIOS;
1903      m_banking_bios[2] = m_BIOS + 0x0400;
1904      m_banking_bios[3] = m_BIOS + ((1 < m_bios_page_count) ? 0x4000 : 0);
1905      m_banking_bios[5] = m_BIOS + ((2 < m_bios_page_count) ? 0x8000 : 0);
19241906   }
19251907}
19261908
r20377r20378
19331915   m_lphaser_1_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sms_state::lphaser_1_callback),this));
19341916   m_lphaser_2_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sms_state::lphaser_2_callback),this));
19351917
1936   m_main_cpu = machine().device("maincpu");
1937   m_control_cpu = machine().device("control");
1938   m_vdp = machine().device<sega315_5124_device>("sms_vdp");
19391918   m_eeprom = machine().device<eeprom_device>("eeprom");
19401919   m_ym = machine().device("ym2413");
1941   m_main_scr = machine().device("screen");
19421920   m_left_lcd = machine().device("left_lcd");
19431921   m_right_lcd = machine().device("right_lcd");
19441922   m_space = &machine().device("maincpu")->memory().space(AS_PROGRAM);
r20377r20378
19651943
19661944MACHINE_RESET_MEMBER(sms_state,sms)
19671945{
1968   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
1946   address_space &space = m_main_cpu->space(AS_PROGRAM);
19691947
19701948   m_ctrl_reg = 0xff;
19711949   if (m_has_fm)
r20377r20378
20292007
20302008   m_store_control = 0;
20312009
2032   setup_banks(machine());
2010   setup_banks();
20332011
2034   setup_rom(space);
2012   setup_rom();
20352013
20362014   m_rapid_fire_state_1 = 0;
20372015   m_rapid_fire_state_2 = 0;
r20377r20378
20732051   if (slottype == 0)
20742052      m_current_cartridge = slot;
20752053
2076   setup_cart_banks(machine());
2054   setup_cart_banks();
20772055   membank("bank10")->set_base(m_banking_cart[3] + 0x2000);
2078   setup_rom(space);
2056   setup_rom();
20792057}
20802058
20812059
r20377r20378
21152093
21162094WRITE_LINE_MEMBER(sms_state::sms_store_int_callback)
21172095{
2118   (m_store_control & 0x01 ? m_control_cpu : m_main_cpu)->execute().set_input_line(0, state);
2096   (m_store_control & 0x01 ? m_control_cpu : m_main_cpu)->set_input_line(0, state);
21192097}
21202098
21212099
2122static void sms_set_zero_flag( running_machine &machine )
2123{
2124   sms_state *state = machine.driver_data<sms_state>();
2125   state->m_is_gamegear = 0;
2126   state->m_is_region_japan = 0;
2127   state->m_has_bios_0400 = 0;
2128   state->m_has_bios_2000 = 0;
2129   state->m_has_bios_full = 0;
2130   state->m_has_bios = 0;
2131   state->m_has_fm = 0;
2132}
2133
21342100DRIVER_INIT_MEMBER(sms_state,sg1000m3)
21352101{
2136   sms_set_zero_flag(machine());
21372102   m_is_region_japan = 1;
21382103   m_has_fm = 1;
21392104}
r20377r20378
21412106
21422107DRIVER_INIT_MEMBER(sms_state,sms1)
21432108{
2144   sms_set_zero_flag(machine());
21452109   m_has_bios_full = 1;
21462110}
21472111
21482112
21492113DRIVER_INIT_MEMBER(sms_state,smsj)
21502114{
2151   sms_set_zero_flag(machine());
21522115   m_is_region_japan = 1;
21532116   m_has_bios_2000 = 1;
21542117   m_has_fm = 1;
r20377r20378
21572120
21582121DRIVER_INIT_MEMBER(sms_state,sms2kr)
21592122{
2160   sms_set_zero_flag(machine());
21612123   m_is_region_japan = 1;
21622124   m_has_bios_full = 1;
21632125   m_has_fm = 1;
r20377r20378
21662128
21672129DRIVER_INIT_MEMBER(sms_state,smssdisp)
21682130{
2169   sms_set_zero_flag(machine());
21702131}
21712132
21722133
21732134DRIVER_INIT_MEMBER(sms_state,gamegear)
21742135{
2175   sms_set_zero_flag(machine());
21762136   m_is_gamegear = 1;
21772137   m_has_bios_0400 = 1;
21782138}
r20377r20378
21802140
21812141DRIVER_INIT_MEMBER(sms_state,gamegeaj)
21822142{
2183   sms_set_zero_flag(machine());
21842143   m_is_region_japan = 1;
21852144   m_is_gamegear = 1;
21862145   m_has_bios_0400 = 1;
r20377r20378
21892148
21902149VIDEO_START_MEMBER(sms_state,sms1)
21912150{
2192   screen_device *screen = machine().first_screen();
2193
2194   screen->register_screen_bitmap(m_prevleft_bitmap);
2195   screen->register_screen_bitmap(m_prevright_bitmap);
2151   m_main_scr->register_screen_bitmap(m_prevleft_bitmap);
2152   m_main_scr->register_screen_bitmap(m_prevright_bitmap);
21962153   save_item(NAME(m_prevleft_bitmap));
21972154   save_item(NAME(m_prevright_bitmap));
21982155}
trunk/src/mess/includes/sms.h
r20377r20378
2727public:
2828   sms_state(const machine_config &mconfig, device_type type, const char *tag)
2929      : driver_device(mconfig, type, tag)
30      , m_main_cpu(*this, "maincpu")
31      , m_control_cpu(*this, "control")
32      , m_vdp(*this, "sms_vdp")
33      , m_main_scr(*this, "screen")
34      , m_is_gamegear(0)
35      , m_is_region_japan(0)
36      , m_has_bios_0400(0)
37      , m_has_bios_2000(0)
38      , m_has_bios_full(0)
39      , m_has_bios(0)
40      , m_has_fm(0)
3041      , m_mainram(*this, "mainram")
3142   {
3243   }
3344
3445   // device_ts
35   device_t *m_main_cpu;
36   device_t *m_control_cpu;
37   sega315_5124_device *m_vdp;
46   required_device<cpu_device> m_main_cpu;
47   optional_device<cpu_device> m_control_cpu;
48   required_device<sega315_5124_device> m_vdp;
3849   eeprom_device *m_eeprom;
3950   device_t *m_ym;
40   device_t *m_main_scr;
51   required_device<screen_device> m_main_scr;
4152   device_t *m_left_lcd;
4253   device_t *m_right_lcd;
4354   address_space *m_space;
r20377r20378
200211
201212protected:
202213   required_shared_ptr<UINT8> m_mainram;
214
215   void setup_rom();
216   void vdp_hcount_lphaser(int hpos);
217   void lphaser1_sensor_check();
218   void lphaser2_sensor_check();
219   UINT16 screen_hpos_nonscaled(int scaled_hpos);
220   UINT16 screen_vpos_nonscaled(int scaled_vpos);
221   int lgun_bright_aim_area(emu_timer *timer, int lgun_x, int lgun_y);
222   void sms_vdp_hcount_latch(address_space &space);
223   UINT8 sms_vdp_hcount();
224   void setup_cart_banks();
225   void setup_banks();
226   void sms_get_inputs(address_space &space);
203227};
204228
205229

Previous 199869 Revisions Next


© 1997-2024 The MAME Team