Previous 199869 Revisions Next

r33539 Wednesday 26th November, 2014 at 00:15:03 UTC by David Haywood
improve background rendering (nw)
[src/mame/drivers]supduck.c

trunk/src/mame/drivers/supduck.c
r242050r242051
2323         m_maincpu(*this, "maincpu"),
2424         m_audiocpu(*this, "audiocpu"),
2525         m_spriteram(*this, "spriteram") ,
26         m_tx_videoram(*this, "txvideoram"),
27         m_bg_videoram(*this, "bgvideoram"),
28         m_fg_videoram(*this, "fgvideoram"),
26         m_text_videoram(*this, "textvideoram"),
27         m_fore_videoram(*this, "forevideoram"),
28         m_back_videoram(*this, "backvideoram"),
2929         m_gfxdecode(*this, "gfxdecode"),
3030         m_palette(*this, "palette")
3131   { }
r242050r242051
3636
3737   // shared pointers
3838   required_device<buffered_spriteram16_device> m_spriteram;
39   required_shared_ptr<UINT16> m_tx_videoram;
40   required_shared_ptr<UINT16> m_bg_videoram;
41   required_shared_ptr<UINT16> m_fg_videoram;
39   required_shared_ptr<UINT16> m_text_videoram;
40   required_shared_ptr<UINT16> m_fore_videoram;
41   required_shared_ptr<UINT16> m_back_videoram;
4242
4343   required_device<gfxdecode_device> m_gfxdecode;
4444   required_device<palette_device> m_palette;
4545
46   tilemap_t     *m_tx_tilemap;
47   tilemap_t     *m_bg_tilemap;
48   tilemap_t     *m_fg_tilemap;
46   tilemap_t     *m_text_tilemap;
47   tilemap_t     *m_fore_tilemap;
48   tilemap_t     *m_back_tilemap;
4949
5050   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
5151
52   DECLARE_WRITE16_MEMBER(tx_videoram_w);
53   DECLARE_WRITE16_MEMBER(bg_videoram_w);
54   DECLARE_WRITE16_MEMBER(fg_videoram_w);
52   DECLARE_WRITE16_MEMBER(text_videoram_w);
53   DECLARE_WRITE16_MEMBER(fore_videoram_w);
54   DECLARE_WRITE16_MEMBER(back_videoram_w);
5555   DECLARE_WRITE16_MEMBER(supduck_scroll_w);
5656
5757   DECLARE_WRITE16_MEMBER(supduck_4000_w);
5858   DECLARE_WRITE16_MEMBER(supduck_4002_w);
5959
60   TILEMAP_MAPPER_MEMBER(tigeroad_tilemap_scan);
60   TILEMAP_MAPPER_MEMBER(supduk_tilemap_scan);
6161
6262
6363protected:
r242050r242051
6969   virtual void video_start();
7070
7171   void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority);
72   TILE_GET_INFO_MEMBER(get_tx_tile_info);
73   TILE_GET_INFO_MEMBER(get_bg_tile_info);
74   TILE_GET_INFO_MEMBER(get_fg_tile_info);
72   TILE_GET_INFO_MEMBER(get_text_tile_info);
73   TILE_GET_INFO_MEMBER(get_fore_tile_info);
74   TILE_GET_INFO_MEMBER(get_back_tile_info);
7575
7676};
7777
78TILEMAP_MAPPER_MEMBER(supduck_state::tigeroad_tilemap_scan)
78
79
80TILEMAP_MAPPER_MEMBER(supduck_state::supduk_tilemap_scan)
7981{
80   /* logical (col,row) -> memory offset */
81   return (num_rows - 1 - row) * num_cols + col;
82   // where does each page start?
83   int pagesize = 0x8 * 0x8;
84
85   int offset = ((col & ~0x7) / 0x8) * (pagesize);
86   offset += ((row^0x3f) & 0x7)*0x8;
87   offset += col & 0x7;
88
89   offset &= 0x3ff;
90
91   offset += (((row^0x3f) & ~0x7) / 0x8) * 0x400;
92
93
94   return offset;
8295}
8396
8497void supduck_state::video_start()
8598{
86   m_tx_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_tx_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
99   m_text_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_text_tile_info),this), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
87100
88   m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_bg_tile_info),this), tilemap_mapper_delegate(FUNC(supduck_state::tigeroad_tilemap_scan),this), 32, 32, 8, 256);
89   m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_fg_tile_info),this), tilemap_mapper_delegate(FUNC(supduck_state::tigeroad_tilemap_scan),this), 32, 32, 8, 256);
101   m_fore_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_fore_tile_info),this), tilemap_mapper_delegate(FUNC(supduck_state::supduk_tilemap_scan),this), 32, 32, 128,64);
102   m_back_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(supduck_state::get_back_tile_info),this), tilemap_mapper_delegate(FUNC(supduck_state::supduk_tilemap_scan),this), 32, 32, 128,64);
90103
91   m_tx_tilemap->set_transparent_pen(3);
104   m_text_tilemap->set_transparent_pen(0x3);
105   m_fore_tilemap->set_transparent_pen(0xf);
92106
93107}
94108
r242050r242051
96110{
97111   bitmap.fill(m_palette->black_pen(), cliprect);
98112
113   m_back_tilemap->draw(screen, bitmap, cliprect, 0, 0);
114   m_fore_tilemap->draw(screen, bitmap, cliprect, 0, 0);
115
116
99117   draw_sprites(bitmap, cliprect, 0);
100118   draw_sprites(bitmap, cliprect, 1); //draw priority sprites?
101119
102   m_tx_tilemap->draw(screen, bitmap, cliprect, 0, 0);
120   m_text_tilemap->draw(screen, bitmap, cliprect, 0, 0);
103121   return 0;
104122}
105123
106124
107WRITE16_MEMBER(supduck_state::tx_videoram_w)
125WRITE16_MEMBER(supduck_state::text_videoram_w)
108126{
109   COMBINE_DATA(&m_tx_videoram[offset]);
110   m_tx_tilemap->mark_tile_dirty(offset);
127   COMBINE_DATA(&m_text_videoram[offset]);
128   m_text_tilemap->mark_tile_dirty(offset);
111129}
112130
113WRITE16_MEMBER(supduck_state::bg_videoram_w)
131WRITE16_MEMBER(supduck_state::fore_videoram_w)
114132{
115   COMBINE_DATA(&m_bg_videoram[offset]);
116   m_bg_tilemap->mark_tile_dirty(offset);
133   COMBINE_DATA(&m_fore_videoram[offset]);
134   m_fore_tilemap->mark_tile_dirty(offset);
117135}
118136
119WRITE16_MEMBER(supduck_state::fg_videoram_w)
137WRITE16_MEMBER(supduck_state::back_videoram_w)
120138{
121   COMBINE_DATA(&m_fg_videoram[offset]);
122   m_fg_tilemap->mark_tile_dirty(offset);
139   COMBINE_DATA(&m_back_videoram[offset]);
140   m_back_tilemap->mark_tile_dirty(offset);
123141}
124142
125143
126TILE_GET_INFO_MEMBER(supduck_state::get_tx_tile_info) // same as tigeroad.c
144TILE_GET_INFO_MEMBER(supduck_state::get_text_tile_info) // same as tigeroad.c
127145{
128   UINT16 *videoram = m_tx_videoram;
146   UINT16 *videoram = m_text_videoram;
129147   int data = videoram[tile_index];
130148   int attr = data >> 8;
131149   int code = (data & 0xff) + ((attr & 0xc0) << 2) + ((attr & 0x20) << 5);
r242050r242051
135153   SET_TILE_INFO_MEMBER(0, code, color, flags);
136154}
137155
138TILE_GET_INFO_MEMBER(supduck_state::get_bg_tile_info)
156TILE_GET_INFO_MEMBER(supduck_state::get_fore_tile_info)
139157{
140   UINT16 *videoram = m_bg_videoram;
158   UINT16 *videoram = m_fore_videoram;
141159   int data = videoram[tile_index];
142160   int code = data & 0xff;
143161   if (data & 0x4000) code |= 0x100;
r242050r242051
149167   SET_TILE_INFO_MEMBER(1, code, color, flags);
150168}
151169
152TILE_GET_INFO_MEMBER(supduck_state::get_fg_tile_info)
170TILE_GET_INFO_MEMBER(supduck_state::get_back_tile_info)
153171{
154172
155   UINT16 *videoram = m_fg_videoram;
173   UINT16 *videoram = m_back_videoram;
156174   int data = videoram[tile_index];
157175
158176   int code = data & 0xff;
r242050r242051
226244   switch (offset)
227245   {
228246   case 0:
229      m_bg_tilemap->set_scrollx(0, data);
230      printf("bg x scroll %04x\n", data);
231
247      m_back_tilemap->set_scrollx(0, data);
248//      printf("fore x scroll %04x\n", data);
249     
232250      break;
233251   case 1:
234      m_bg_tilemap->set_scrolly(0, -data - 32 * 8);
235      printf("bg y scroll %04x\n", data);
252      m_back_tilemap->set_scrolly(0, -data - 32 * 8);
253//      printf("fore y scroll %04x\n", data);
236254
237255      break;
238256   case 2:
239      m_fg_tilemap->set_scrollx(0, data);
257      m_fore_tilemap->set_scrollx(0, data);
258//      printf("back x scroll %04x\n", data);
259
240260      break;
241261   case 3:
242      m_fg_tilemap->set_scrolly(0, -data - 32 * 8);
262      m_fore_tilemap->set_scrolly(0, -data - 32 * 8);
263//      printf("back y scroll %04x\n", data);
264
243265      break;
244266   }
245267}
r242050r242051
249271static ADDRESS_MAP_START( main_map, AS_PROGRAM, 16, supduck_state )
250272   AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_WRITENOP
251273   AM_RANGE(0xfe0000, 0xfe1fff) AM_RAM AM_SHARE("spriteram")
252//   AM_RANGE(0xfe0000, 0xfe07ff) AM_RAM /* RAM? */
253//   AM_RANGE(0xfe0800, 0xfe0cff) AM_RAM AM_SHARE("spriteram")
254//   AM_RANGE(0xfe0d00, 0xfe3fff) AM_RAM              /* RAM? */
255//   AM_RANGE(0xfe4000, 0xfe4001) AM_WRITE(bionicc_gfxctrl_w)    /* + coin counters */
256//   AM_RANGE(0xfe4000, 0xfe4001) AM_READ_PORT("SYSTEM")
257//   AM_RANGE(0xfe4002, 0xfe4003) AM_READ(supduck_random_r)
274
258275   AM_RANGE(0xfe4000, 0xfe4001) AM_READ_PORT("P1_P2") AM_WRITE( supduck_4000_w )
259276   AM_RANGE(0xfe4002, 0xfe4003) AM_READ_PORT("SYSTEM") AM_WRITE( supduck_4002_w )
260277   AM_RANGE(0xfe4004, 0xfe4005) AM_READ_PORT("DSW")
261278
262279   AM_RANGE(0xfe8000, 0xfe8007) AM_WRITE(supduck_scroll_w)
263280   AM_RANGE(0xfe800e, 0xfe800f) AM_WRITENOP // watchdog or irqack
264
265281   
266//   AM_RANGE(0xfe8010, 0xfe8017) AM_WRITE(bionicc_scroll_w)
267//   AM_RANGE(0xfe801a, 0xfe801b) AM_WRITE(bionicc_mpu_trigger_w)    /* ??? not sure, but looks like it */
268   AM_RANGE(0xfec000, 0xfecfff) AM_RAM_WRITE(tx_videoram_w) AM_SHARE("txvideoram")
269   AM_RANGE(0xff0000, 0xff3fff) AM_RAM_WRITE(fg_videoram_w) AM_SHARE("fgvideoram")
270   AM_RANGE(0xff4000, 0xff7fff) AM_RAM_WRITE(bg_videoram_w) AM_SHARE("bgvideoram")
282   AM_RANGE(0xfec000, 0xfecfff) AM_RAM_WRITE(text_videoram_w) AM_SHARE("textvideoram")
283   AM_RANGE(0xff0000, 0xff3fff) AM_RAM_WRITE(back_videoram_w) AM_SHARE("backvideoram")
284   AM_RANGE(0xff4000, 0xff7fff) AM_RAM_WRITE(fore_videoram_w) AM_SHARE("forevideoram")
271285   AM_RANGE(0xff8000, 0xff87ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
272286   AM_RANGE(0xffc000, 0xffffff) AM_RAM /* working RAM */
273287ADDRESS_MAP_END
r242050r242051
459473   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
460474   MCFG_SCREEN_UPDATE_DRIVER(supduck_state, screen_update)
461475   MCFG_SCREEN_SIZE(32*8, 32*8)
462   MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 0*8, 30*8-1)
476   MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
463477   MCFG_SCREEN_PALETTE("palette")
464478   MCFG_SCREEN_VBLANK_DEVICE("spriteram", buffered_spriteram16_device, vblank_copy_rising)
465479


Previous 199869 Revisions Next


© 1997-2024 The MAME Team