Previous 199869 Revisions Next

r31076 Sunday 22nd June, 2014 at 20:08:43 UTC by Wilbert Pol
(MESS) sms.c: Several timing fixes:  [Enik Land]
- Fix flicker on Choplifter title screen by drawing the borders through timers.
- Instead trigger NMI at end of the display, do it at end of top border (line 261 after start of active screen area).
- Add a delay to NMI, to be later than HINT, as stated by Flubba's VDPTest readme.
- Also based on VDPTest readme, change VINT and Sprite Overflow flags to be later than VCount change.
- Delay a little the display callback, to fix the title scrolling of Road Rash (SMS game).
- Fixed documentation of the scanline sections and change some timings to match.
- Calculate initial VCount values, instead use of hardcoded values.
[src/emu/video]315_5124.c 315_5124.h

trunk/src/emu/video/315_5124.c
r31075r31076
2222    - http://www.smspower.org/forums/viewtopic.php?p=44198
2323
2424A scanline contains the following sections:
25  - horizontal sync     1  ED      => HSYNC high/increment line counter/generate interrupts/etc
25  - horizontal sync     9  E9-ED   => HSYNC high
2626  - left blanking       2  ED-EE
27  - color burst        14  EE-EF
27  - color burst        14  EE-F5   => increment line counter/generate interrupts/etc
2828  - left blanking       8  F5-F9
2929  - left border        13  F9-FF
3030  - active display    256  00-7F
3131  - right border       15  80-87
3232  - right blanking      8  87-8B
33  - horizontal sync    25  8B-97   => HSYNC low
33  - horizontal sync    17  8B-93   => HSYNC low
3434
3535
3636NTSC frame timing
3737                       256x192         256x224        256x240 (doesn't work on real hardware)
38  - vertical blanking   3  D5-D7        3  E5-E7       3  EE-F0
39  - top blanking       13  D8-E4       13  E8-F4      13  F1-FD
38  - vertical blanking   3  D5-D7        3  E5-E7       3  ED-EF
39  - top blanking       13  D8-E4       13  E8-F4      13  F0-FC
4040  - top border         27  E5-FF       11  F5-FF       3  FD-FF
4141  - active display    192  00-BF      224  00-DF     240  00-EF
4242  - bottom border      24  C0-D7        8  E0-E7       0  F0-F0
r31075r31076
6464#define STATUS_HINT           0x02  /* Pending horizontal interrupt flag */
6565
6666#define VINT_HPOS             24
67#define VINT_FLAG_HPOS        23
67#define VINT_FLAG_HPOS        24
6868#define HINT_HPOS             26
69#define NMI_HPOS              28
6970#define VCOUNT_CHANGE_HPOS    23
70#define SPROVR_HPOS           23
71#define SPROVR_HPOS           24
7172#define SPRCOL_BASEHPOS       59
7273#define X_SCROLL_HPOS         21
7374#define DISPLAY_DISABLED_HPOS 17 /* fixes 'fantdizzy' (SMS PAL game) flicker */
74#define DISPLAY_CB_HPOS       0
75#define DISPLAY_CB_HPOS       2  /* fixes 'roadrash' (SMS game) title scrolling, due to line counter reload timing */
7576
76#define DRAW_TIME_GG        86      /* 1 + 2 + 14 + 8 + 122/2 */
77#define DRAW_TIME_SMS       25      /* 1 + 2 + 14 + 8 */
77#define DRAW_TIME_GG        94      /* 9 + 2 + 14 + 8 + 13 + 96/2 */
78#define DRAW_TIME_SMS       46      /* 9 + 2 + 14 + 8 + 13 */
7879
7980#define PRIORITY_BIT          0x1000
8081#define BACKDROP_COLOR        ((m_vdp_mode == 4 ? 0x10 : 0x00) + (m_reg[0x07] & 0x0f))
8182
82#define INIT_VCOUNT           0
83#define VERTICAL_BLANKING     1
84#define TOP_BLANKING          2
85#define TOP_BORDER            3
86#define ACTIVE_DISPLAY_V      4
87#define BOTTOM_BORDER         5
88#define BOTTOM_BLANKING       6
83#define VERTICAL_BLANKING     0
84#define TOP_BLANKING          1
85#define TOP_BORDER            2
86#define ACTIVE_DISPLAY_V      3
87#define BOTTOM_BORDER         4
88#define BOTTOM_BLANKING       5
8989
90static const UINT8 ntsc_192[7] = { 0xd5, 3, 13, 27, 192, 24, 3 };
91static const UINT8 ntsc_224[7] = { 0xe5, 3, 13, 11, 224,  8, 3 };
92static const UINT8 ntsc_240[7] = { 0xee, 3, 13,  3, 240,  0, 3 };
93static const UINT8 pal_192[7]  = { 0xba, 3, 13, 54, 192, 48, 3 };
94static const UINT8 pal_224[7]  = { 0xca, 3, 13, 38, 224, 32, 3 };
95static const UINT8 pal_240[7]  = { 0xd2, 3, 13, 30, 240, 24, 3 };
90static const UINT8 ntsc_192[6] = { 3, 13, 27, 192, 24, 3 };
91static const UINT8 ntsc_224[6] = { 3, 13, 11, 224,  8, 3 };
92static const UINT8 ntsc_240[6] = { 3, 13,  3, 240,  0, 3 };
93static const UINT8 pal_192[6]  = { 3, 13, 54, 192, 48, 3 };
94static const UINT8 pal_224[6]  = { 3, 13, 38, 224, 32, 3 };
95static const UINT8 pal_240[6]  = { 3, 13, 30, 240, 24, 3 };
9696
9797
9898const device_type SEGA315_5124 = &device_creator<sega315_5124_device>;
r31075r31076
273273READ8_MEMBER( sega315_5124_device::vcount_read )
274274{
275275   int vpos = m_screen->vpos();
276   int active_scr_start = m_frame_timing[VERTICAL_BLANKING] + m_frame_timing[TOP_BLANKING] + m_frame_timing[TOP_BORDER];
276277
277278   if (m_screen->hpos() < VCOUNT_CHANGE_HPOS)
278279   {
r31075r31076
281282         vpos += m_screen->height();
282283   }
283284
284   return (m_frame_timing[INIT_VCOUNT] + vpos) & 0xff;
285   return (vpos - active_scr_start) & 0xff;
285286}
286287
287288
r31075r31076
325326      draw_scanline( SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, param, m_screen->vpos() - param );
326327      break;
327328
328   case TIMER_CHECK_HINT:
329   case TIMER_LBORDER:
330      {
331         rectangle rec;
332         rec.min_y = rec.max_y = param;
333
334         update_palette();
335
336         /* Draw left border */
337         rec.min_x = SEGA315_5124_LBORDER_START;
338         rec.max_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 1;
339         m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
340         m_y1_bitmap.fill(1, rec);
341      }
342      break;
343
344   case TIMER_RBORDER:
345      {
346         rectangle rec;
347         rec.min_y = rec.max_y = param;
348
349         update_palette();
350
351         /* Draw right border */
352         rec.min_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256;
353         rec.max_x = rec.min_x + SEGA315_5124_RBORDER_WIDTH - 1;
354         m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
355         m_y1_bitmap.fill(1, rec);
356      }
357      break;
358
359   case TIMER_HINT:
329360      if ((m_pending_status & STATUS_HINT) || (m_status & STATUS_HINT))
330361      {
331362         if ((m_reg[0x00] & 0x10))
r31075r31076
338369      }
339370      break;
340371
341   case TIMER_CHECK_VINT:
372   case TIMER_VINT:
342373      if ((m_pending_status & STATUS_VINT) || (m_status & STATUS_VINT))
343374      {
344375         if ((m_reg[0x01] & 0x20))
r31075r31076
350381         }
351382      }
352383      break;
384
385   case TIMER_NMI:
386      if ( !m_pause_cb.isnull() )
387         m_pause_cb(0);
388      break;
353389   }
354390}
355391
356392
357393void sega315_5124_device::process_line_timer()
358394{
359   rectangle rec;
360395   int vpos = m_screen->vpos();
361396   int vpos_limit = m_frame_timing[VERTICAL_BLANKING] + m_frame_timing[TOP_BLANKING]
362397               + m_frame_timing[TOP_BORDER] + m_frame_timing[ACTIVE_DISPLAY_V]
363398               + m_frame_timing[BOTTOM_BORDER] + m_frame_timing[BOTTOM_BLANKING];
364399
365   rec.min_y = rec.max_y = vpos;
366
367400   m_display_disabled = !(m_reg[0x01] & 0x40);
368401
369   /* Check if we're on the last line of a frame */
370   if (vpos == vpos_limit - 1)
371   {
372      m_line_counter = m_reg[0x0a];
373      if ( !m_pause_cb.isnull() )
374         m_pause_cb(0);
402   /* Activate flags that were pending until the end of previous line. */
403   check_pending_flags();
375404
376      return;
377   }
378
379405   vpos_limit -= m_frame_timing[BOTTOM_BLANKING];
380406
381407   /* Check if we're below the bottom border */
r31075r31076
395421         if (m_line_counter == 0x00)
396422         {
397423            m_line_counter = m_reg[0x0a];
398            m_check_hint_timer->adjust( m_screen->time_until_pos( vpos, HINT_HPOS ) );
424            m_hint_timer->adjust( m_screen->time_until_pos( vpos, HINT_HPOS ) );
399425            m_pending_status |= STATUS_HINT;
400426         }
401427         else
r31075r31076
410436
411437      if (vpos == vpos_limit + 1)
412438      {
413         m_check_vint_timer->adjust( m_screen->time_until_pos( vpos, VINT_HPOS ) );
439         m_vint_timer->adjust( m_screen->time_until_pos( vpos, VINT_HPOS ) );
414440         m_pending_status |= STATUS_VINT;
415441      }
416442
417      update_palette();
443      /* Draw borders */
444      m_lborder_timer->adjust( m_screen->time_until_pos( vpos, SEGA315_5124_LBORDER_START ), vpos );
445      m_rborder_timer->adjust( m_screen->time_until_pos( vpos, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 ), vpos );
418446
419      /* Draw left border */
420      rec.min_x = SEGA315_5124_LBORDER_START;
421      rec.max_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 1;
422      m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
423      m_y1_bitmap.fill(1, rec);
424
425      /* Draw right border */
426      rec.min_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256;
427      rec.max_x = rec.min_x + SEGA315_5124_RBORDER_WIDTH - 1;
428      m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
429      m_y1_bitmap.fill(1, rec);
430
431447      /* Draw middle of the border */
432448      /* We need to do this through the regular drawing function so it will */
433449      /* be included in the gamegear scaling functions */
434      draw_scanline( SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, vpos_limit - m_frame_timing[ACTIVE_DISPLAY_V], vpos - (vpos_limit - m_frame_timing[ACTIVE_DISPLAY_V]) );
450      m_draw_timer->adjust( m_screen->time_until_pos( vpos, m_draw_time ), vpos_limit - m_frame_timing[ACTIVE_DISPLAY_V] );
435451      return;
436452   }
437453
r31075r31076
449465      if (m_line_counter == 0x00)
450466      {
451467         m_line_counter = m_reg[0x0a];
452         m_check_hint_timer->adjust( m_screen->time_until_pos( vpos, HINT_HPOS ) );
468         m_hint_timer->adjust( m_screen->time_until_pos( vpos, HINT_HPOS ) );
453469         m_pending_status |= STATUS_HINT;
454470      }
455471      else
r31075r31076
457473         m_line_counter--;
458474      }
459475
460      update_palette();
476      /* Draw borders */
477      m_lborder_timer->adjust( m_screen->time_until_pos( vpos, SEGA315_5124_LBORDER_START ), vpos );
478      m_rborder_timer->adjust( m_screen->time_until_pos( vpos, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 ), vpos );
461479
462      /* Draw left border */
463      rec.min_x = SEGA315_5124_LBORDER_START;
464      rec.max_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 1;
465      m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
466      m_y1_bitmap.fill(1, rec);
467
468      /* Draw right border */
469      rec.min_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256;
470      rec.max_x = rec.min_x + SEGA315_5124_RBORDER_WIDTH - 1;
471      m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
472      m_y1_bitmap.fill(1, rec);
473
480      /* Draw active display */
474481      select_sprites( vpos - vpos_limit );
475      if ( m_draw_time > 0 )
476      {
477         m_draw_timer->adjust( m_screen->time_until_pos( vpos, m_draw_time ), vpos_limit );
478      }
479      else
480      {
481         draw_scanline( SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, vpos_limit, vpos - vpos_limit );
482      }
482      m_draw_timer->adjust( m_screen->time_until_pos( vpos, m_draw_time ), vpos_limit );
483483      return;
484484   }
485485
r31075r31076
489489   if (vpos >= vpos_limit)
490490   {
491491      m_line_counter = m_reg[0x0a];
492      update_palette();
493492
494      /* Draw left border */
495      rec.min_x = SEGA315_5124_LBORDER_START;
496      rec.max_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH - 1;
497      m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
498      m_y1_bitmap.fill(1, rec);
493      /* Check if we're on the last line of the top border */
494      if (vpos == vpos_limit + m_frame_timing[TOP_BORDER] - 1)
495      {
496         m_nmi_timer->adjust( m_screen->time_until_pos( vpos, NMI_HPOS ) );
497      }
499498
500      /* Draw right border */
501      rec.min_x = SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256;
502      rec.max_x = rec.min_x + SEGA315_5124_RBORDER_WIDTH - 1;
503      m_tmpbitmap.fill(m_palette->pen(m_current_palette[BACKDROP_COLOR]), rec);
504      m_y1_bitmap.fill(1, rec);
499      /* Draw borders */
500      m_lborder_timer->adjust( m_screen->time_until_pos( vpos, SEGA315_5124_LBORDER_START ), vpos );
501      m_rborder_timer->adjust( m_screen->time_until_pos( vpos, SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH + 256 ), vpos );
505502
506503      /* Draw middle of the border */
507504      /* We need to do this through the regular drawing function so it will */
508505      /* be included in the gamegear scaling functions */
509506      select_sprites( vpos - (vpos_limit + m_frame_timing[TOP_BORDER]) );
510      draw_scanline( SEGA315_5124_LBORDER_START + SEGA315_5124_LBORDER_WIDTH, vpos_limit + m_frame_timing[TOP_BORDER], vpos - (vpos_limit + m_frame_timing[TOP_BORDER]) );
507      m_draw_timer->adjust( m_screen->time_until_pos( vpos, m_draw_time ), vpos_limit + m_frame_timing[TOP_BORDER] );
511508      return;
512509   }
513510
r31075r31076
543540
544541void sega315_5124_device::check_pending_flags()
545542{
546   const attotime current_time = machine().time();
547543   int hpos;
548544
549   if (current_time < m_line_end_time)
545   if (!m_pending_status)
550546   {
551      hpos = m_screen->hpos();
547      return;
552548   }
553   else
549
550   hpos = m_screen->hpos();
551   if (hpos < DISPLAY_CB_HPOS || m_display_timer->remaining() == attotime::zero)
554552   {
555553      hpos = m_screen->width();
556      m_line_end_time = current_time + m_screen->time_until_pos(m_screen->vpos(), hpos);
557554   }
558555
559556   if ((m_pending_status & STATUS_HINT) && hpos >= HINT_HPOS)
560557   {
561558      m_pending_status &= ~STATUS_HINT;
562      m_status |= STATUS_HINT;
559      m_status |= STATUS_HINT;   // fake flag.
563560   }
564561   if ((m_pending_status & STATUS_VINT) && hpos >= VINT_FLAG_HPOS)
565562   {
r31075r31076
688685            // So here, where the setting is done, the irq_state needs to be cleared.
689686            //
690687            // For VINT disabling through register 01:
691            // When running eagles5 on the sms2kr driver the irq_state is 1 because of some
688            // When running eagles5 on the smskr driver the irq_state is 1 because of some
692689            // previos HINTs that occured. eagles5 sets register 01 to 0x02 and expects
693690            // the irq state to be cleared after that.
694691            // The following bit of code takes care of that.
695692            //
696            if ( ( (m_status & STATUS_HINT) && !(m_reg[0x00] & 0x10) ) ||
697                  ( (m_status & STATUS_VINT) && !(m_reg[0x01] & 0x20) ) )
693            if ( ( reg_num == 0 && !(m_reg[0x00] & 0x10) ) ||
694                  ( reg_num == 1 && !(m_reg[0x01] & 0x20) ) )
698695            {
699696               if (m_irq_state == 1)
700697               {
r31075r31076
956953   bool sprite_col_occurred = false;
957954   int sprite_col_x = m_screen->width();
958955
959   /* Draw sprite layer */
960
961   /* Check if display is disabled */
962956   if (m_display_disabled)
963957      return;
964958
965959   memset(m_collision_buffer, 0, SEGA315_5124_WIDTH);
966960
961   /* Draw sprite layer */
967962   for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--)
968963   {
969964      int sprite_index = m_selected_sprite[sprite_buffer_index];
r31075r31076
11151110   int sprite_col_x = m_screen->width();
11161111   UINT16 sprite_pattern_base = ((m_reg[0x06] & 0x07) << 11);
11171112
1118   /* Draw sprite layer */
1119
1120   /* Check if display is disabled */
11211113   if (m_display_disabled)
11221114      return;
11231115
11241116   memset(m_collision_buffer, 0, SEGA315_5124_WIDTH);
11251117
1118   /* Draw sprite layer */
11261119   for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--)
11271120   {
11281121      int sprite_index = m_selected_sprite[sprite_buffer_index];
r31075r31076
13061299   UINT16 name_table_base, color_base, pattern_base;
13071300   int pattern_mask, color_mask, pattern_offset;
13081301
1309   /* Draw background layer */
13101302   name_table_base =  ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
13111303   color_base = ((m_reg[0x03] & 0x80) << 6);
13121304   color_mask = ((m_reg[0x03] & 0x7f) << 3) | 0x07;
r31075r31076
13141306   pattern_mask = ((m_reg[0x04] & 0x03) << 8) | 0xff;
13151307   pattern_offset = (line & 0xc0) << 2;
13161308
1309   /* Draw background layer */
13171310   for (tile_column = 0; tile_column < 32; tile_column++)
13181311   {
13191312      UINT8 name = space().read_byte( name_table_base + tile_column );
r31075r31076
13551348   int pixel_x, pixel_plot_x;
13561349   UINT16 name_base, color_base, pattern_base;
13571350
1358   /* Draw background layer */
13591351   name_base = ((m_reg[0x02] & 0x0f) << 10) + ((line >> 3) * 32);
13601352   color_base = ((m_reg[0x03] << 6) & (VRAM_SIZE - 1));
13611353   pattern_base = ((m_reg[0x04] << 11) & (VRAM_SIZE - 1));
13621354
1355   /* Draw background layer */
13631356   for (tile_column = 0; tile_column < 32; tile_column++)
13641357   {
13651358      UINT8 name = space().read_byte( name_base + tile_column );
r31075r31076
17501743void sega315_5124_device::stop_timers()
17511744{
17521745   m_display_timer->adjust(attotime::never);
1753   m_check_hint_timer->adjust(attotime::never);
1754   m_check_vint_timer->adjust(attotime::never);
1746   m_hint_timer->adjust(attotime::never);
1747   m_vint_timer->adjust(attotime::never);
1748   m_nmi_timer->adjust(attotime::never);
17551749   m_draw_timer->adjust(attotime::never);
1750   m_lborder_timer->adjust(attotime::never);
1751   m_rborder_timer->adjust(attotime::never);
17561752}
17571753
17581754
r31075r31076
17981794   m_display_timer = timer_alloc(TIMER_LINE);
17991795   m_display_timer->adjust(m_screen->time_until_pos(0, DISPLAY_CB_HPOS), 0, m_screen->scan_period());
18001796   m_draw_timer = timer_alloc(TIMER_DRAW);
1801   m_check_hint_timer = timer_alloc(TIMER_CHECK_HINT);
1802   m_check_vint_timer = timer_alloc(TIMER_CHECK_VINT);
1797   m_lborder_timer = timer_alloc(TIMER_LBORDER);
1798   m_rborder_timer = timer_alloc(TIMER_RBORDER);
1799   m_hint_timer = timer_alloc(TIMER_HINT);
1800   m_vint_timer = timer_alloc(TIMER_VINT);
1801   m_nmi_timer = timer_alloc(TIMER_NMI);
18031802
18041803   save_item(NAME(m_status));
18051804   save_item(NAME(m_pending_status));
r31075r31076
18261825   save_item(NAME(m_tmpbitmap));
18271826   save_item(NAME(m_y1_bitmap));
18281827   save_item(NAME(m_draw_time));
1829   save_item(NAME(m_line_end_time));
18301828   save_item(NAME(m_sprite_base));
18311829   save_item(NAME(m_selected_sprite));
18321830   save_item(NAME(m_sprite_count));
r31075r31076
18651863   m_line_counter = 0;
18661864   m_hcounter = 0;
18671865   m_draw_time = DRAW_TIME_SMS;
1868   m_line_end_time = machine().time() + m_screen->time_until_pos(m_screen->vpos(), m_screen->width());
18691866
18701867   for (i = 0; i < 0x20; i++)
18711868      m_current_palette[i] = 0;
trunk/src/emu/video/315_5124.h
r31075r31076
1717#define SEGA315_5124_WIDTH                      342     /* 342 pixels */
1818#define SEGA315_5124_HEIGHT_NTSC                262     /* 262 lines */
1919#define SEGA315_5124_HEIGHT_PAL                 313     /* 313 lines */
20#define SEGA315_5124_LBORDER_START              (1 + 2 + 14 + 8)
20#define SEGA315_5124_LBORDER_START              (9 + 2 + 14 + 8)
2121#define SEGA315_5124_LBORDER_WIDTH              13      /* 13 pixels */
2222#define SEGA315_5124_RBORDER_WIDTH              15      /* 15 pixels */
2323#define SEGA315_5124_TBORDER_START              (3 + 13)
r31075r31076
129129   int              m_vdp_mode;                 /* Current mode of the VDP: 0,1,2,3,4 */
130130   int              m_y_pixels;                 /* 192, 224, 240 */
131131   int              m_draw_time;
132   attotime         m_line_end_time;
133132   UINT8            m_line_counter;
134133   UINT8            m_hcounter;
135134   memory_region    *m_CRAM;                    /* Pointer to CRAM */
r31075r31076
155154   devcb_write_line  m_int_cb;       /* Interrupt callback function */
156155   devcb_write_line  m_pause_cb;     /* Pause callback function */
157156   emu_timer        *m_display_timer;
158   emu_timer        *m_check_hint_timer;
159   emu_timer        *m_check_vint_timer;
157   emu_timer        *m_hint_timer;
158   emu_timer        *m_vint_timer;
159   emu_timer        *m_nmi_timer;
160160   emu_timer        *m_draw_timer;
161   emu_timer        *m_lborder_timer;
162   emu_timer        *m_rborder_timer;
161163
162164   const address_space_config  m_space_config;
163165
164166   /* Timers */
165167   static const device_timer_id TIMER_LINE = 0;
166168   static const device_timer_id TIMER_DRAW = 1;
167   static const device_timer_id TIMER_CHECK_HINT = 2;
168   static const device_timer_id TIMER_CHECK_VINT = 3;
169   static const device_timer_id TIMER_LBORDER = 2;
170   static const device_timer_id TIMER_RBORDER = 3;
171   static const device_timer_id TIMER_HINT = 4;
172   static const device_timer_id TIMER_VINT = 5;
173   static const device_timer_id TIMER_NMI = 6;
169174
170175   required_device<palette_device> m_palette;
171176};

Previous 199869 Revisions Next


© 1997-2024 The MAME Team