Previous 199869 Revisions Next

r18283 Thursday 4th October, 2012 at 14:20:13 UTC by hap
be verbose about robokid motion error
[src/mame/drivers]ninjakd2.c
[src/mame/includes]ninjakd2.h
[src/mame/video]ninjakd2.c

trunk/src/mame/drivers/ninjakd2.c
r18282r18283
220220 *
221221 *************************************/
222222
223static void omegaf_io_protection_reset(running_machine &machine)
223void ninjakd2_state::omegaf_io_protection_reset()
224224{
225   ninjakd2_state *state = machine.driver_data<ninjakd2_state>();
226225   // make sure protection starts in a known state
227   state->m_omegaf_io_protection[0] = 0;
228   state->m_omegaf_io_protection[1] = 0;
229   state->m_omegaf_io_protection[2] = 0;
230   state->m_omegaf_io_protection_input = 0;
231   state->m_omegaf_io_protection_tic = 0;
226   m_omegaf_io_protection[0] = 0;
227   m_omegaf_io_protection[1] = 0;
228   m_omegaf_io_protection[2] = 0;
229   m_omegaf_io_protection_input = 0;
230   m_omegaf_io_protection_tic = 0;
232231}
233232
234233READ8_MEMBER(ninjakd2_state::omegaf_io_protection_r)
r18282r18283
916915
917916MACHINE_RESET_MEMBER(ninjakd2_state,omegaf)
918917{
919   omegaf_io_protection_reset(machine());
918   omegaf_io_protection_reset();
920919   
921920   machine_reset();
922921}
r18282r18283
13931392
13941393/*************************************
13951394 *
1396 *  Gfx ROM swizzling
1395 *  Driver initialization
13971396 *
13981397 *************************************/
13991398
r18282r18283
14101409static void lineswap_gfx_roms(running_machine &machine, const char *region, const int bit)
14111410{
14121411   const int length = machine.root_device().memregion(region)->bytes();
1413
14141412   UINT8* const src = machine.root_device().memregion(region)->base();
1415
14161413   UINT8* const temp = auto_alloc_array(machine, UINT8, length);
1417
14181414   const int mask = (1 << (bit + 1)) - 1;
14191415
1420   int sa;
1421
1422   for (sa = 0; sa < length; sa++)
1416   for (int sa = 0; sa < length; sa++)
14231417   {
14241418      const int da = (sa & ~mask) | ((sa << 1) & mask) | ((sa >> bit) & 1);
1425
14261419      temp[da] = src[sa];
14271420   }
14281421
14291422   memcpy(src, temp, length);
1430
14311423   auto_free(machine, temp);
14321424}
14331425
r18282r18283
14391431}
14401432
14411433
1442
1443/*************************************
1444 *
1445 *  Driver initialization
1446 *
1447 *************************************/
1448
14491434DRIVER_INIT_MEMBER(ninjakd2_state,ninjakd2)
14501435{
14511436   mc8123_decrypt_rom(machine(), "soundcpu", "user1", NULL, 0);
r18282r18283
14661451   gfx_unscramble(machine());
14671452}
14681453
1454/*****************************************************************************/
14691455
1470static void robokid_motion_error_kludge(UINT8 *ROM)
1456READ8_MEMBER(ninjakd2_state::robokid_motion_error_verbose_r)
14711457{
1458   popmessage("%s MOTION ERROR, contact MAMEdev", machine().system().name);
1459   logerror("maincpu %04x MOTION ERROR\n", space.device().safe_pc());
1460   return 0xe6;
1461}
1462
1463void ninjakd2_state::robokid_motion_error_kludge(UINT16 offset)
1464{
14721465   // patch out rare "5268 MOTION ERROR" (MT 05024)
14731466   // It looks like it's due to a buggy random number generator,
14741467   // then it possibly happens on the real arcade cabinet too.
14751468   // I doubt it is protection related, but you can never be sure.
1469   UINT8 *ROM = memregion("maincpu")->base() + offset;
14761470   ROM[0] = 0xe6;
14771471   ROM[1] = 0x03; // and 3
14781472   ROM[2] = 0x18;
14791473   ROM[3] = 0xf6; // jr $-8
1474   
1475   m_maincpu->space(AS_PROGRAM).install_read_handler(offset, offset, read8_delegate(FUNC(ninjakd2_state::robokid_motion_error_verbose_r), this));
14801476}
14811477
14821478DRIVER_INIT_MEMBER(ninjakd2_state,robokid)
14831479{
1484   robokid_motion_error_kludge(memregion("maincpu")->base() + 0x5247);
1480   robokid_motion_error_kludge(0x5247);
14851481}
14861482
14871483DRIVER_INIT_MEMBER(ninjakd2_state,robokidj)
14881484{
1489   robokid_motion_error_kludge(memregion("maincpu")->base() + 0x5266);
1485   robokid_motion_error_kludge(0x5266);
14901486}
14911487
14921488
trunk/src/mame/video/ninjakd2.c
r18282r18283
1/******************************************************************************
2
3    UPL "sprite framebuffer" hardware
4
5******************************************************************************/
6
17#include "emu.h"
28#include "includes/ninjakd2.h"
39
r18282r18283
28
3#define TRANSPARENTCODE (15)
4
59/*************************************
r18282r18283
115119      state->m_robokid_bg2_videoram = auto_alloc_array_clear(machine, UINT8, size);
116120   }
117121
118   machine.primary_screen->register_screen_bitmap(state->m_sp_bitmap);
122   machine.primary_screen->register_screen_bitmap(state->m_sprites_bitmap);
119123}
120124
121125static int stencil_ninjakd2( UINT16 pal );
r18282r18283
131135   m_fg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS,   8,  8, 32, 32);
132136   m_bg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::ninjakd2_get_bg_tile_info),this), TILEMAP_SCAN_ROWS,  16, 16, 32, 32);
133137
134   m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE);
138   m_fg_tilemap->set_transparent_pen(0xf);
135139
136140   m_robokid_sprites = 0;
137141   m_stencil_compare_function = stencil_ninjakd2;
r18282r18283
144148   m_fg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS,   8,  8, 32, 32);
145149   m_bg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::mnight_get_bg_tile_info),this), TILEMAP_SCAN_ROWS,  16, 16, 32, 32);
146150
147   m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE);
151   m_fg_tilemap->set_transparent_pen(0xf);
148152
149153   m_robokid_sprites = 0;
150154   m_stencil_compare_function = stencil_mnight;
r18282r18283
157161   m_fg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::get_fg_tile_info),this), TILEMAP_SCAN_ROWS,   8,  8, 32, 32);
158162   m_bg_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::mnight_get_bg_tile_info),this), TILEMAP_SCAN_ROWS,  16, 16, 32, 32);
159163
160   m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE);
164   m_fg_tilemap->set_transparent_pen(0xf);
161165
162166   m_robokid_sprites = 0;
163167   m_stencil_compare_function = stencil_arkarea;
r18282r18283
174178   m_bg1_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::robokid_get_bg1_tile_info),this), tilemap_mapper_delegate(FUNC(ninjakd2_state::robokid_bg_scan),this),    16, 16, 32, 32);
175179   m_bg2_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::robokid_get_bg2_tile_info),this), tilemap_mapper_delegate(FUNC(ninjakd2_state::robokid_bg_scan),this),    16, 16, 32, 32);
176180
177   m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE);
178   m_bg1_tilemap->set_transparent_pen(TRANSPARENTCODE);
179   m_bg2_tilemap->set_transparent_pen(TRANSPARENTCODE);
181   m_fg_tilemap->set_transparent_pen(0xf);
182   m_bg1_tilemap->set_transparent_pen(0xf);
183   m_bg2_tilemap->set_transparent_pen(0xf);
180184
181185   m_robokid_sprites = 1;
182186   m_stencil_compare_function = stencil_robokid;
r18282r18283
193197   m_bg1_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::robokid_get_bg1_tile_info),this), tilemap_mapper_delegate(FUNC(ninjakd2_state::omegaf_bg_scan),this),     16, 16, 128, 32);
194198   m_bg2_tilemap = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(ninjakd2_state::robokid_get_bg2_tile_info),this), tilemap_mapper_delegate(FUNC(ninjakd2_state::omegaf_bg_scan),this),     16, 16, 128, 32);
195199
196   m_fg_tilemap->set_transparent_pen(TRANSPARENTCODE);
197   m_bg0_tilemap->set_transparent_pen(TRANSPARENTCODE);
198   m_bg1_tilemap->set_transparent_pen(TRANSPARENTCODE);
199   m_bg2_tilemap->set_transparent_pen(TRANSPARENTCODE);
200   m_fg_tilemap->set_transparent_pen(0xf);
201   m_bg0_tilemap->set_transparent_pen(0xf);
202   m_bg1_tilemap->set_transparent_pen(0xf);
203   m_bg2_tilemap->set_transparent_pen(0xf);
200204
201205   m_robokid_sprites = 1;
202206   m_stencil_compare_function = stencil_omegaf;
r18282r18283
291295      case 1:   scrollx = ((scrollx & 0x0ff) | (data << 8)); break;
292296      case 2:   scrolly = ((scrolly & 0x100) | data);        break;
293297      case 3:   scrolly = ((scrolly & 0x0ff) | (data << 8)); break;
294      case 4:   tilemap->enable(data & 1);       break;
298      case 4:   tilemap->enable(data & 1); break;
295299   }
296300
297301   tilemap->set_scrollx(0, scrollx);
r18282r18283
319323}
320324
321325
322
323326WRITE8_MEMBER(ninjakd2_state::ninjakd2_sprite_overdraw_w)
324327{
325328   m_next_sprite_overdraw_enabled = data & 1;
r18282r18283
390393                     tile,
391394                     color,
392395                     flipx,flipy,
393                     sx + 16*x, sy + 16*y, TRANSPARENTCODE);
396                     sx + 16*x, sy + 16*y, 0xf);
394397
395398               ++sprites_drawn;
396399               if (sprites_drawn >= 96)
r18282r18283
428431static void erase_sprites(running_machine& machine, bitmap_ind16 &bitmap)
429432{
430433   ninjakd2_state *state = machine.driver_data<ninjakd2_state>();
434
431435   // if sprite overdraw is disabled, clear the sprite framebuffer
432436   if (!state->m_next_sprite_overdraw_enabled)
433      state->m_sp_bitmap.fill(TRANSPARENTCODE);
437   {
438      state->m_sprites_bitmap.fill(0xf);
439   }
434440   else
435      for (int y = 0; y < state->m_sp_bitmap.height(); ++y)
441   {
442      for (int y = 0; y < state->m_sprites_bitmap.height(); ++y)
436443      {
437         for (int x = 0; x < state->m_sp_bitmap.width(); ++x)
444         for (int x = 0; x < state->m_sprites_bitmap.width(); ++x)
438445         {
439            UINT16* const ptr = &state->m_sp_bitmap.pix16(y, x);
446            UINT16* const ptr = &state->m_sprites_bitmap.pix16(y, x);
440447
441            if ( (*state->m_stencil_compare_function)(*ptr) ) *ptr = TRANSPARENTCODE ;
448            if ( (*state->m_stencil_compare_function)(*ptr) ) *ptr = 0xf;
442449         }
443450      }
451   }
444452}
445453
446454
447455static void update_sprites(running_machine& machine)
448456{
449457   ninjakd2_state *state = machine.driver_data<ninjakd2_state>();
450   erase_sprites(machine, state->m_sp_bitmap);
451   draw_sprites(machine, state->m_sp_bitmap);
452}
458
453459   ////// Before modified, this was written.
454460      // we want to erase the sprites with the old setting and draw them with the
455461      // new one. Not doing this causes a glitch in Ninja Kid II when taking the top
456462      // exit from stage 3.
457463   ////// The glitch is correct behavior.
464   erase_sprites(machine, state->m_sprites_bitmap);
465   draw_sprites(machine, state->m_sprites_bitmap);
466}
458467
459468
460469UINT32 ninjakd2_state::screen_update_ninjakd2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
r18282r18283
467476   bitmap.fill(0, cliprect);
468477
469478   m_bg_tilemap->draw(bitmap, cliprect, 0, 0);
470
471   copybitmap_trans(bitmap, m_sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE);
472
479   copybitmap_trans(bitmap, m_sprites_bitmap, 0, 0, 0, 0, cliprect, 0xf);
473480   m_fg_tilemap->draw(bitmap, cliprect, 0, 0);
474481
475482   return 0;
r18282r18283
483490   bitmap.fill(0, cliprect);
484491
485492   m_bg0_tilemap->draw(bitmap, cliprect, 0, 0);
486
487493   m_bg1_tilemap->draw(bitmap, cliprect, 0, 0);
488
489   copybitmap_trans(bitmap, m_sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE);
490
494   copybitmap_trans(bitmap, m_sprites_bitmap, 0, 0, 0, 0, cliprect, 0xf);
491495   m_bg2_tilemap->draw(bitmap, cliprect, 0, 0);
492
493496   m_fg_tilemap->draw(bitmap, cliprect, 0, 0);
494497
495498   return 0;
r18282r18283
503506   bitmap.fill(0, cliprect);
504507
505508   m_bg0_tilemap->draw(bitmap, cliprect, 0, 0);
506
507509   m_bg1_tilemap->draw(bitmap, cliprect, 0, 0);
508
509510   m_bg2_tilemap->draw(bitmap, cliprect, 0, 0);
510
511   copybitmap_trans(bitmap, m_sp_bitmap, 0, 0, 0, 0, cliprect, TRANSPARENTCODE);
512
511   copybitmap_trans(bitmap, m_sprites_bitmap, 0, 0, 0, 0, cliprect, 0xf);
513512   m_fg_tilemap->draw(bitmap, cliprect, 0, 0);
514513
515514   return 0;
trunk/src/mame/includes/ninjakd2.h
r18282r18283
1/******************************************************************************
2
3    UPL "sprite framebuffer" hardware
4
5******************************************************************************/
6
17class ninjakd2_state : public driver_device
28{
39public:
r18282r18283
39   ninjakd2_state(const machine_config &mconfig, device_type type, const char *tag)
410      : driver_device(mconfig, type, tag),
11      m_maincpu(*this,"maincpu"),
512      m_bg_videoram(*this, "bg_videoram"),
613      m_fg_videoram(*this, "fg_videoram"),
714      m_spriteram(*this, "spriteram")
815   { }
916
17   required_device<cpu_device> m_maincpu;
1018   optional_shared_ptr<UINT8> m_bg_videoram;
1119   required_shared_ptr<UINT8> m_fg_videoram;
r18282r18283
1927   int m_next_sprite_overdraw_enabled;
2028   int (*m_stencil_compare_function) (UINT16 pal);
2129   int m_sprites_updated;
22   bitmap_ind16 m_sp_bitmap;
30   bitmap_ind16 m_sprites_bitmap;
2331   int m_robokid_sprites;
2432   tilemap_t* m_fg_tilemap;
2533   tilemap_t* m_bg_tilemap;
r18282r18283
3543   UINT8* m_robokid_bg2_videoram;
3644   UINT8 m_rom_bank_mask;
3745
46   void omegaf_io_protection_reset();
47   void robokid_motion_error_kludge(UINT16 offset);
48   
3849   DECLARE_WRITE8_MEMBER(ninjakd2_bankselect_w);
3950   DECLARE_WRITE8_MEMBER(ninjakd2_soundreset_w);
4051   DECLARE_WRITE8_MEMBER(ninjakd2_pcm_play_w);
4152   DECLARE_READ8_MEMBER(omegaf_io_protection_r);
53   DECLARE_READ8_MEMBER(robokid_motion_error_verbose_r);
4254   DECLARE_WRITE8_MEMBER(omegaf_io_protection_w);
4355   DECLARE_WRITE8_MEMBER(ninjakd2_bgvideoram_w);
4456   DECLARE_WRITE8_MEMBER(ninjakd2_fgvideoram_w);

Previous 199869 Revisions Next


© 1997-2024 The MAME Team