Previous 199869 Revisions Next

r32450 Sunday 28th September, 2014 at 15:30:55 UTC by Wilbert Pol
315_5124.c: Refactored sprite handling, fixes status bar on Tarzan for gaemgear. Removed m_collission_buffer member variable. Tweaked game gear timing to fix glitches in status bar of Chicago Syndicate for gamegear.  [Enik Land]
[src/emu/video]315_5124.c 315_5124.h

trunk/src/emu/video/315_5124.c
r32449r32450
1313
1414  - Display mode 1 (text)
1515  - Display mode 3 (multicolor)
16  - Sprite doubling bug of the 315-5124 chip
1617
1718
1819SMS Display Timing
r32449r32450
6667#define VINT_HPOS             24
6768#define VINT_FLAG_HPOS        24
6869#define HINT_HPOS             26
69#define NMI_HPOS              28
70#define NMI_HPOS              28 /* not verified */
7071#define VCOUNT_CHANGE_HPOS    23
7172#define SPROVR_HPOS           24
7273#define SPRCOL_BASEHPOS       59
73#define X_SCROLL_HPOS         21
7474#define DISPLAY_DISABLED_HPOS 24 /* not verified, works if above 18 (for 'pstrike2') and below 25 (for 'fantdizzy') */
75#define SPR_PATTERN_HPOS      26 /* not verified, needed for 'backtof3' (SMS PAL game) title screen */
7675#define DISPLAY_CB_HPOS       2  /* fixes 'roadrash' (SMS game) title scrolling, due to line counter reload timing */
7776
7877#define DRAW_TIME_GG        94      /* 9 + 2 + 14 + 8 + 13 + 96/2 */
r32449r32450
162161   , m_pause_cb(*this)
163162   , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, NULL, *ADDRESS_MAP_NAME(sega315_5124))
164163   , m_palette(*this, "palette")
164   , m_xscroll_hpos(X_SCROLL_HPOS_5124)
165165{
166166}
167167
168168
169sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 cram_size, UINT8 palette_offset, bool supports_224_240, const char *shortname, const char *source)
170   : device_t( mconfig, type, name, tag, owner, clock, shortname, source)
169sega315_5124_device::sega315_5124_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 cram_size, UINT8 palette_offset, bool supports_224_240, const char *shortname, const char *source, int xscroll_hpos)
170   : device_t( mconfig, type, name, tag, owner, clock, shortname, __FILE__)
171171   , device_memory_interface(mconfig, *this)
172172   , device_video_interface(mconfig, *this)
173173   , m_cram_size( cram_size )
r32449r32450
178178   , m_pause_cb(*this)
179179   , m_space_config("videoram", ENDIANNESS_LITTLE, 8, 14, 0, NULL, *ADDRESS_MAP_NAME(sega315_5124))
180180   , m_palette(*this, "palette")
181   , m_xscroll_hpos(xscroll_hpos)
181182{
182183}
183184
184185
185186sega315_5246_device::sega315_5246_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
186   : sega315_5124_device( mconfig, SEGA315_5246, "Sega 315-5246 VDP", tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0, true, "sega315_5246", __FILE__)
187   : sega315_5124_device( mconfig, SEGA315_5246, "Sega 315-5246 VDP", tag, owner, clock, SEGA315_5124_CRAM_SIZE, 0, true, "sega315_5246", __FILE__, X_SCROLL_HPOS_5124)
187188{
188189}
189190
190191
191192sega315_5378_device::sega315_5378_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
192   : sega315_5124_device( mconfig, SEGA315_5378, "Sega 315-5378", tag, owner, clock, SEGA315_5378_CRAM_SIZE, 0x10, true, "sega315_5378", __FILE__)
193   : sega315_5124_device( mconfig, SEGA315_5378, "Sega 315-5378", tag, owner, clock, SEGA315_5378_CRAM_SIZE, 0x10, true, "sega315_5378", __FILE__, X_SCROLL_HPOS_5378)
193194{
194195}
195196
r32449r32450
407408
408409   /* copy current values in case they are not changed until latch time */
409410   m_display_disabled = !(m_reg[0x01] & 0x40);
410   m_reg6copy = m_reg[0x06];
411411   m_reg8copy = m_reg[0x08];
412412
413413   vpos_limit -= m_frame_timing[BOTTOM_BLANKING];
r32449r32450
690690            if (m_screen->hpos() <= DISPLAY_DISABLED_HPOS)
691691               m_display_disabled = !(m_reg[0x01] & 0x40);
692692            break;
693         case 6:
694            if (m_screen->hpos() <= SPR_PATTERN_HPOS)
695               m_reg6copy = m_reg[0x06];
696            break;
697693         case 8:
698            if (m_screen->hpos() <= X_SCROLL_HPOS)
694            if (m_screen->hpos() <= m_xscroll_hpos)
699695               m_reg8copy = m_reg[0x08];
700696         }
701697
r32449r32450
886882{
887883   int max_sprites;
888884
885   /* At this point the VDP vcount still doesn't refer the new line,
886      because the logical start point is slightly shifted on the scanline */
887   int parse_line = line - 1;
888
889   /* Check if SI is set */
890   m_sprite_height = (m_reg[0x01] & 0x02) ? 16 : 8;
891   /* Check if MAG is set */
892   m_sprite_zoom = (m_reg[0x01] & 0x01) ? 2 : 1;
893
894   if (m_sprite_zoom == 2)
895   {
896      /* Divide before use the value for comparison, same later with sprite_y, or
897         else an off-by-one bug could occur, as seen with Tarzan, for Game Gear */
898      parse_line >>= 1;
899   }
900
889901   m_sprite_count = 0;
890902
891903   if ( m_vdp_mode == 0 || m_vdp_mode == 2 )
r32449r32450
895907      max_sprites = 4;
896908
897909      m_sprite_base = ((m_reg[0x05] & 0x7f) << 7);
898      m_sprite_height = 8;
899910
900      if (m_reg[0x01] & 0x02)                         /* Check if SI is set */
901         m_sprite_height = m_sprite_height * 2;
902      if (m_reg[0x01] & 0x01)                         /* Check if MAG is set */
903         m_sprite_height = m_sprite_height * 2;
904
905911      for (int sprite_index = 0; (sprite_index < 32 * 4) && (m_sprite_count <= max_sprites); sprite_index += 4)
906912      {
907913         int sprite_y = space().read_byte(m_sprite_base + sprite_index);
908914         if (sprite_y == 0xd0)
909915            break;
910         sprite_y += 1;
911916
912         if (sprite_y > 240)
917         if (sprite_y >= 240)
913918         {
914919            sprite_y -= 256;
915920         }
916921
917         if ((line >= sprite_y) && (line < (sprite_y + m_sprite_height)))
922         if (m_sprite_zoom > 1)
918923         {
924            sprite_y >>= 1;
925         }
926
927         if ((parse_line >= sprite_y) && (parse_line < (sprite_y + m_sprite_height)))
928         {
919929            if (m_sprite_count < max_sprites)
920930            {
921               m_selected_sprite[m_sprite_count] = sprite_index;
931               int sprite_x = space().read_byte( m_sprite_base + sprite_index + 1 );
932               int sprite_tile_selected = space().read_byte( m_sprite_base + sprite_index + 2 );
933               UINT8 flags = space().read_byte( m_sprite_base + sprite_index + 3 );
934
935               if (flags & 0x80)
936                  sprite_x -= 32;
937
938               int sprite_line = parse_line - sprite_y;
939
940               if (m_reg[0x01] & 0x01)
941                  sprite_line >>= 1;
942
943               if (m_reg[0x01] & 0x02)
944               {
945                  sprite_tile_selected &= 0xfc;
946
947                  if (sprite_line > 0x07)
948                  {
949                     sprite_tile_selected += 1;
950                     sprite_line -= 8;
951                  }
952               }
953
954               m_sprite_x[m_sprite_count] = sprite_x;
955               m_sprite_tile_selected[m_sprite_count] = sprite_tile_selected;
956               m_sprite_flags[m_sprite_count] = flags;
957               m_sprite_pattern_line[m_sprite_count] = ((m_reg[0x06] & 0x07) << 11) + sprite_line;
922958            }
923959            m_sprite_count++;
924960         }
r32449r32450
931967      max_sprites = 8;
932968
933969      m_sprite_base = ((m_reg[0x05] << 7) & 0x3f00);
934      m_sprite_height = (m_reg[0x01] & 0x02) ? 16 : 8;
935      m_sprite_zoom = (m_reg[0x01] & 0x01) ? 2 : 1;
936970
937971      for (int sprite_index = 0; (sprite_index < 64) && (m_sprite_count <= max_sprites); sprite_index++)
938972      {
939973         int sprite_y = space().read_byte(m_sprite_base + sprite_index);
940974         if (m_y_pixels == 192 && sprite_y == 0xd0)
941975            break;
942         sprite_y += 1; /* sprite y position starts at line 1 */
943976
944         if (sprite_y > 240)
977         if (sprite_y >= 240)
945978         {
946979            sprite_y -= 256; /* wrap from top if y position is > 240 */
947980         }
948981
949         if ((line >= sprite_y) && (line < (sprite_y + m_sprite_height * m_sprite_zoom)))
982         if (m_sprite_zoom > 1)
950983         {
984            sprite_y >>= 1;
985         }
986
987         if ((parse_line >= sprite_y) && (parse_line < (sprite_y + m_sprite_height)))
988         {
951989            if (m_sprite_count < max_sprites)
952990            {
953               m_selected_sprite[m_sprite_count] = sprite_index;
991               int sprite_x = space().read_byte( m_sprite_base + 0x80 + (sprite_index << 1) );
992               int sprite_tile_selected = space().read_byte( m_sprite_base + 0x81 + (sprite_index << 1) );
993
994               if (m_reg[0x00] & 0x08)
995               {
996                  sprite_x -= 0x08;    /* sprite shift */
997               }
998
999               if (m_reg[0x06] & 0x04)
1000               {
1001                  sprite_tile_selected += 256; /* pattern table select */
1002               }
1003
1004               if (m_reg[0x01] & 0x02)
1005               {
1006                  sprite_tile_selected &= 0x01fe; /* force even index */
1007               }
1008
1009               int sprite_line = parse_line - sprite_y;
1010
1011               if (sprite_line > 0x07)
1012               {
1013                  sprite_tile_selected += 1;
1014               }
1015
1016               m_sprite_x[m_sprite_count] = sprite_x;
1017               m_sprite_tile_selected[m_sprite_count] = sprite_tile_selected;
1018               m_sprite_pattern_line[m_sprite_count] = ((sprite_line & 0x07) << 2);
9541019            }
9551020            m_sprite_count++;
9561021         }
r32449r32450
9751040{
9761041   bool sprite_col_occurred = false;
9771042   int sprite_col_x = SEGA315_5124_WIDTH;
1043   UINT8 collision_buffer[SEGA315_5124_WIDTH];
9781044
9791045   if (m_display_disabled || m_sprite_count == 0)
9801046      return;
9811047
982   memset(m_collision_buffer, 0, SEGA315_5124_WIDTH);
1048   memset(collision_buffer, 0, SEGA315_5124_WIDTH);
9831049
9841050   /* Draw sprite layer */
9851051   for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--)
9861052   {
987      int sprite_index = m_selected_sprite[sprite_buffer_index];
988      int sprite_y = space().read_byte( m_sprite_base + sprite_index ) + 1; /* sprite y position starts at line 1 */
989      int sprite_x = space().read_byte( m_sprite_base + 0x80 + (sprite_index << 1) );
990      int sprite_tile_selected = space().read_byte( m_sprite_base + 0x81 + (sprite_index << 1) );
1053      int sprite_x = m_sprite_x[sprite_buffer_index];
1054      int sprite_tile_selected = m_sprite_tile_selected[sprite_buffer_index];
1055      UINT16 sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
9911056
992      if (sprite_y > 240)
993      {
994         sprite_y -= 256; /* wrap from top if y position is > 240 */
995      }
1057      UINT8 bit_plane_0 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x00);
1058      UINT8 bit_plane_1 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x01);
1059      UINT8 bit_plane_2 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x02);
1060      UINT8 bit_plane_3 = space().read_byte((sprite_tile_selected << 5) + sprite_pattern_line + 0x03);
9961061
997      if (m_reg[0x00] & 0x08)
998      {
999         sprite_x -= 0x08;    /* sprite shift */
1000      }
1001
1002      if (m_reg6copy & 0x04)
1003      {
1004         sprite_tile_selected += 256; /* pattern table select */
1005      }
1006
1007      if (m_reg[0x01] & 0x02)
1008      {
1009         sprite_tile_selected &= 0x01fe; /* force even index */
1010      }
1011
1012      int sprite_line = (line - sprite_y) / m_sprite_zoom;
1013
1014      if (sprite_line > 0x07)
1015      {
1016         sprite_tile_selected += 1;
1017      }
1018
1019      UINT8 bit_plane_0 = space().read_byte(((sprite_tile_selected << 5) + ((sprite_line & 0x07) << 2)) + 0x00);
1020      UINT8 bit_plane_1 = space().read_byte(((sprite_tile_selected << 5) + ((sprite_line & 0x07) << 2)) + 0x01);
1021      UINT8 bit_plane_2 = space().read_byte(((sprite_tile_selected << 5) + ((sprite_line & 0x07) << 2)) + 0x02);
1022      UINT8 bit_plane_3 = space().read_byte(((sprite_tile_selected << 5) + ((sprite_line & 0x07) << 2)) + 0x03);
1023
10241062      for (int pixel_x = 0; pixel_x < 8 ; pixel_x++)
10251063      {
10261064         UINT8 pen_bit_0 = (bit_plane_0 >> (7 - pixel_x)) & 0x01;
r32449r32450
10651103                  priority_selected[pixel_plot_x + 1] = pen_selected;
10661104               }
10671105            }
1068            if (m_collision_buffer[pixel_plot_x] != 1)
1106            if (collision_buffer[pixel_plot_x] != 1)
10691107            {
1070               m_collision_buffer[pixel_plot_x] = 1;
1108               collision_buffer[pixel_plot_x] = 1;
10711109            }
10721110            else
10731111            {
10741112               sprite_col_occurred = true;
10751113               sprite_col_x = MIN(sprite_col_x, pixel_plot_x);
10761114            }
1077            if (m_collision_buffer[pixel_plot_x + 1] != 1)
1115            if (collision_buffer[pixel_plot_x + 1] != 1)
10781116            {
1079               m_collision_buffer[pixel_plot_x + 1] = 1;
1117               collision_buffer[pixel_plot_x + 1] = 1;
10801118            }
10811119            else
10821120            {
r32449r32450
11071145                  priority_selected[pixel_plot_x] = pen_selected;
11081146               }
11091147            }
1110            if (m_collision_buffer[pixel_plot_x] != 1)
1148            if (collision_buffer[pixel_plot_x] != 1)
11111149            {
1112               m_collision_buffer[pixel_plot_x] = 1;
1150               collision_buffer[pixel_plot_x] = 1;
11131151            }
11141152            else
11151153            {
r32449r32450
11311169{
11321170   bool sprite_col_occurred = false;
11331171   int sprite_col_x = SEGA315_5124_WIDTH;
1134   UINT16 sprite_pattern_base;
1172   UINT8 collision_buffer[SEGA315_5124_WIDTH];
11351173
11361174   if (m_display_disabled || m_sprite_count == 0)
11371175      return;
11381176
1139   sprite_pattern_base = ((m_reg6copy & 0x07) << 11);
1140   memset(m_collision_buffer, 0, SEGA315_5124_WIDTH);
1177   memset(collision_buffer, 0, SEGA315_5124_WIDTH);
11411178
11421179   /* Draw sprite layer */
11431180   for (int sprite_buffer_index = m_sprite_count - 1; sprite_buffer_index >= 0; sprite_buffer_index--)
11441181   {
1145      int sprite_index = m_selected_sprite[sprite_buffer_index];
1146      int sprite_y = space().read_byte( m_sprite_base + sprite_index ) + 1;
1147      int sprite_x = space().read_byte( m_sprite_base + sprite_index + 1 );
1148      UINT8 flags = space().read_byte( m_sprite_base + sprite_index + 3 );
1182      int sprite_x = m_sprite_x[sprite_buffer_index];
1183      UINT8 flags = m_sprite_flags[sprite_buffer_index];
11491184      int pen_selected = m_palette_offset + ( flags & 0x0f );
11501185
1151      if (sprite_y > 240)
1152         sprite_y -= 256;
1186      int sprite_tile_selected = m_sprite_tile_selected[sprite_buffer_index];
1187      UINT16 sprite_pattern_line = m_sprite_pattern_line[sprite_buffer_index];
11531188
1154      if (flags & 0x80)
1155         sprite_x -= 32;
1189      UINT8 pattern = space().read_byte( sprite_pattern_line + sprite_tile_selected * 8 );
11561190
1157      int sprite_tile_selected = space().read_byte( m_sprite_base + sprite_index + 2 );
1158      int sprite_line = line - sprite_y;
1159
1160      if (m_reg[0x01] & 0x01)
1161         sprite_line >>= 1;
1162
1163      if (m_reg[0x01] & 0x02)
1164      {
1165         sprite_tile_selected &= 0xfc;
1166
1167         if (sprite_line > 0x07)
1168         {
1169            sprite_tile_selected += 1;
1170            sprite_line -= 8;
1171         }
1172      }
1173
1174      UINT8 pattern = space().read_byte( sprite_pattern_base + sprite_tile_selected * 8 + sprite_line );
1175
11761191      for (int pixel_x = 0; pixel_x < 8; pixel_x++)
11771192      {
11781193         if (m_reg[0x01] & 0x01)
r32449r32450
11881203            {
11891204               line_buffer[pixel_plot_x] = m_current_palette[pen_selected];
11901205
1191               if (m_collision_buffer[pixel_plot_x] != 1)
1206               if (collision_buffer[pixel_plot_x] != 1)
11921207               {
1193                  m_collision_buffer[pixel_plot_x] = 1;
1208                  collision_buffer[pixel_plot_x] = 1;
11941209               }
11951210               else
11961211               {
r32449r32450
12001215
12011216               line_buffer[pixel_plot_x+1] = m_current_palette[pen_selected];
12021217
1203               if (m_collision_buffer[pixel_plot_x + 1] != 1)
1218               if (collision_buffer[pixel_plot_x + 1] != 1)
12041219               {
1205                  m_collision_buffer[pixel_plot_x + 1] = 1;
1220                  collision_buffer[pixel_plot_x + 1] = 1;
12061221               }
12071222               else
12081223               {
r32449r32450
12241239            {
12251240               line_buffer[pixel_plot_x] = m_current_palette[pen_selected];
12261241
1227               if (m_collision_buffer[pixel_plot_x] != 1)
1242               if (collision_buffer[pixel_plot_x] != 1)
12281243               {
1229                  m_collision_buffer[pixel_plot_x] = 1;
1244                  collision_buffer[pixel_plot_x] = 1;
12301245               }
12311246               else
12321247               {
r32449r32450
12371252         }
12381253      }
12391254
1240      if (m_reg[0x01] & 0x02)
1255      if (m_sprite_height == 16)
12411256      {
12421257         sprite_tile_selected += 2;
1243         pattern = space().read_byte( sprite_pattern_base + sprite_tile_selected * 8 + sprite_line );
1244         sprite_x += (m_reg[0x01] & 0x01 ? 16 : 8);
1258         pattern = space().read_byte( sprite_pattern_line + sprite_tile_selected * 8 );
1259         sprite_x += (m_sprite_zoom == 2 ? 16 : 8);
12451260
12461261         for (int pixel_x = 0; pixel_x < 8; pixel_x++)
12471262         {
r32449r32450
12581273               {
12591274                  line_buffer[pixel_plot_x] = m_current_palette[pen_selected];
12601275
1261                  if (m_collision_buffer[pixel_plot_x] != 1)
1276                  if (collision_buffer[pixel_plot_x] != 1)
12621277                  {
1263                     m_collision_buffer[pixel_plot_x] = 1;
1278                     collision_buffer[pixel_plot_x] = 1;
12641279                  }
12651280                  else
12661281                  {
r32449r32450
12701285
12711286                  line_buffer[pixel_plot_x+1] = m_current_palette[pen_selected];
12721287
1273                  if (m_collision_buffer[pixel_plot_x + 1] != 1)
1288                  if (collision_buffer[pixel_plot_x + 1] != 1)
12741289                  {
1275                     m_collision_buffer[pixel_plot_x + 1] = 1;
1290                     collision_buffer[pixel_plot_x + 1] = 1;
12761291                  }
12771292                  else
12781293                  {
r32449r32450
12941309               {
12951310                  line_buffer[pixel_plot_x] = m_current_palette[pen_selected];
12961311
1297                  if (m_collision_buffer[pixel_plot_x] != 1)
1312                  if (collision_buffer[pixel_plot_x] != 1)
12981313                  {
1299                     m_collision_buffer[pixel_plot_x] = 1;
1314                     collision_buffer[pixel_plot_x] = 1;
13001315                  }
13011316                  else
13021317                  {
r32449r32450
18321847   save_item(NAME(m_status));
18331848   save_item(NAME(m_pending_status));
18341849   save_item(NAME(m_pending_sprcol_x));
1835   save_item(NAME(m_reg6copy));
18361850   save_item(NAME(m_reg8copy));
18371851   save_item(NAME(m_reg9copy));
18381852   save_item(NAME(m_addrmode));
r32449r32450
18511865   save_item(NAME(m_reg));
18521866   save_item(NAME(m_current_palette));
18531867   save_pointer(NAME(m_line_buffer), 256 * 5);
1854   save_item(NAME(m_collision_buffer));
18551868   save_item(NAME(m_tmpbitmap));
18561869   save_item(NAME(m_y1_bitmap));
18571870   save_item(NAME(m_draw_time));
18581871   save_item(NAME(m_sprite_base));
1859   save_item(NAME(m_selected_sprite));
1872   save_item(NAME(m_sprite_pattern_line));
1873   save_item(NAME(m_sprite_tile_selected));
1874   save_item(NAME(m_sprite_x));
1875   save_item(NAME(m_sprite_flags));
18601876   save_item(NAME(m_sprite_count));
18611877   save_item(NAME(m_sprite_height));
18621878   save_item(NAME(m_sprite_zoom));
r32449r32450
18811897   m_pending_status = 0;
18821898   m_pending_sprcol_x = 0;
18831899   m_pending_reg_write = 0;
1884   m_reg6copy = 0;
18851900   m_reg8copy = 0;
18861901   m_reg9copy = 0;
18871902   m_addrmode = 0;
trunk/src/emu/video/315_5124.h
r32449r32450
5959public:
6060   // construction/destruction
6161   sega315_5124_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
62   sega315_5124_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 cram_size, UINT8 palette_offset, bool supports_224_240, const char *shortname, const char *source);
62   sega315_5124_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT8 cram_size, UINT8 palette_offset, bool supports_224_240, const char *shortname, const char *source, int xscroll_hpos = X_SCROLL_HPOS_5124);
6363
6464   static void set_signal_type(device_t &device, bool is_pal) { downcast<sega315_5124_device &>(device).m_is_pal = is_pal; }
6565   template<class _Object> static devcb_base &set_int_callback(device_t &device, _Object object) { return downcast<sega315_5124_device &>(device).m_int_cb.set_callback(object); }
r32449r32450
8787   virtual void set_sega315_5124_compatibility_mode( bool sega315_5124_compatibility_mode ) { };
8888
8989protected:
90   static const int X_SCROLL_HPOS_5124 = 21;
91   static const int X_SCROLL_HPOS_5378 = 35;  // Not verified
92
9093   void set_display_settings();
9194   virtual void update_palette();
9295   virtual void cram_write(UINT8 data);
r32449r32450
114117   UINT8            m_reg[16];                  /* All the registers */
115118   UINT8            m_status;                   /* Status register */
116119   UINT8            m_pending_status;           /* Pending status flags */
117   UINT8            m_reg6copy;                 /* Internal copy of register 6 (Sprite Patterns) */
118120   UINT8            m_reg8copy;                 /* Internal copy of register 8 (X-Scroll) */
119121   UINT8            m_reg9copy;                 /* Internal copy of register 9 (Y-Scroll) */
120122   UINT8            m_addrmode;                 /* Type of VDP action */
r32449r32450
136138   const UINT8      *m_frame_timing;
137139   bitmap_rgb32     m_tmpbitmap;
138140   bitmap_ind8      m_y1_bitmap;
139   UINT8            m_collision_buffer[SEGA315_5124_WIDTH];
140141   UINT8            m_palette_offset;
141142   bool             m_supports_224_240;
142143   bool             m_display_disabled;
143144   UINT16           m_sprite_base;
144   int              m_selected_sprite[8];
145   UINT16           m_sprite_pattern_line[8];
146   int              m_sprite_tile_selected[8];
147   int              m_sprite_x[8];
148   UINT8            m_sprite_flags[8];
145149   int              m_sprite_count;
146150   int              m_sprite_height;
147151   int              m_sprite_zoom;
r32449r32450
151155      sms compatibility mode. */
152156   int              *m_line_buffer;
153157   int              m_current_palette[32];
154   bool               m_is_pal;             /* false = NTSC, true = PAL */
155   devcb_write_line  m_int_cb;       /* Interrupt callback function */
156   devcb_write_line  m_pause_cb;     /* Pause callback function */
158   bool             m_is_pal;             /* false = NTSC, true = PAL */
159   devcb_write_line m_int_cb;       /* Interrupt callback function */
160   devcb_write_line m_pause_cb;     /* Pause callback function */
157161   emu_timer        *m_display_timer;
158162   emu_timer        *m_hint_timer;
159163   emu_timer        *m_vint_timer;
r32449r32450
176180   static const device_timer_id TIMER_FLAGS = 7;
177181
178182   required_device<palette_device> m_palette;
183   const int        m_xscroll_hpos;
179184};
180185
181186

Previous 199869 Revisions Next


© 1997-2024 The MAME Team