dec8: correct cpu clocks for some games, make mcu-side comms edge-triggered, remove non-existant coin3 on 2 player games (it was service coin in some cases), misc cleanups,

ghostb3a: this version expects longer irq trigger,
srdarwinb: hook up coin inputs

Clones promoted to working
--------------------------
The Real Ghostbusters (US 3 Players, revision 2) [hap]
SRD: Super Real Darwin (Japan, bootleg) [hap]
This commit is contained in:
hap 2024-12-16 23:33:56 +01:00
parent b0267c4767
commit 1af09712d7
6 changed files with 1194 additions and 1103 deletions

View File

@ -1772,14 +1772,17 @@ static GFXDECODE_START( gfx_secretab )
GFXDECODE_ENTRY( "tiles2", 0, automat_tilelayout2, 0x300, 0x10 )
GFXDECODE_END
/******************************************************************************/
// DECO video CRTC, pixel clock is unverified (actually 24MHz/4?)
void dec0_state::set_screen_raw_params_data_east(machine_config &config)
void dec0_state::set_screen_raw_params(machine_config &config)
{
m_screen->set_raw(XTAL(12'000'000)/2,384,0,256,272,8,248);
// m_screen->set_refresh_hz(57.41);
// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529)); / 57.41 Hz, 529us Vblank
// m_screen->set_size(32*8, 32*8);
// m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
m_screen->set_raw(XTAL(12'000'000) / 2, 384, 0, 256, 272, 8, 248);
}
void dec0_state::dec0_base(machine_config &config)
@ -1788,12 +1791,7 @@ void dec0_state::dec0_base(machine_config &config)
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
set_screen_raw_params_data_east(config);
//m_screen->set_refresh_hz(57.41);
//m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529)); /* 57.41 Hz, 529us Vblank */
//m_screen->set_size(32*8, 32*8);
//m_screen->set_visarea(0*8, 32*8-1, 1*8, 31*8-1);
//screen update callback differs per game
set_screen_raw_params(config);
m_screen->set_palette(m_palette);
GFXDECODE(config, m_gfxdecode, m_palette, gfx_dec0);
@ -1930,9 +1928,7 @@ void dec0_automat_state::automat(machine_config &config)
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_refresh_hz(57.41);
// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529)); /* 57.41 Hz, 529us Vblank */
set_screen_raw_params_data_east(config);
set_screen_raw_params(config);
m_screen->set_screen_update(FUNC(dec0_automat_state::screen_update_automat));
m_screen->set_palette(m_palette);
@ -2006,9 +2002,7 @@ void dec0_automat_state::secretab(machine_config &config) // all clocks verified
BUFFERED_SPRITERAM16(config, m_spriteram);
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// m_screen->set_refresh_hz(57.41);
// m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(529)); // 57.41 Hz, 529us Vblank
set_screen_raw_params_data_east(config);
set_screen_raw_params(config);
m_screen->set_screen_update(FUNC(dec0_automat_state::screen_update_secretab));
m_screen->set_palette(m_palette);

View File

@ -84,7 +84,7 @@ protected:
void robocop_colpri_cb(u32 &colour, u32 &pri_mask);
void baddudes_tile_cb(tile_data &tileinfo, u32 &tile, u32 &colour, u32 &flags);
void set_screen_raw_params_data_east(machine_config &config);
void set_screen_raw_params(machine_config &config);
void h6280_decrypt(const char *cputag);
void dec0_map(address_map &map) ATTR_COLD;

File diff suppressed because it is too large Load Diff

View File

@ -32,6 +32,7 @@ protected:
m_screen(*this, "screen"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette"),
m_soundirq(*this, "soundirq"),
m_soundlatch(*this, "soundlatch"),
m_tilegen(*this, "tilegen%u", 1),
m_mainbank(*this, "mainbank"),
@ -42,28 +43,24 @@ protected:
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
TIMER_CALLBACK_MEMBER(audiocpu_nmi_clear);
void buffer_spriteram16_w(u8 data);
void sound_w(u8 data);
void main_irq_on_w(u8 data);
void main_irq_off_w(u8 data);
void main_firq_off_w(u8 data);
void sub_irq_on_w(u8 data);
void sub_irq_off_w(u8 data);
void sub_firq_off_w(u8 data);
void both_firq_off_w(u8 data);
void flip_screen_w(u8 data);
void bg_ram_w(offs_t offset, u8 data);
u8 bg_ram_r(offs_t offset);
void videoram_w(offs_t offset, u8 data);
void set_screen_raw_params_data_east(machine_config &config);
void set_screen_raw_params(machine_config &config);
void allocate_buffered_spriteram16();
void dec8_s_map(address_map &map) ATTR_COLD;
void oscar_s_map(address_map &map) ATTR_COLD;
/* devices */
// devices
required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_subcpu;
required_device<cpu_device> m_audiocpu;
@ -71,28 +68,27 @@ protected:
required_device<screen_device> m_screen;
required_device<gfxdecode_device> m_gfxdecode;
required_device<deco_rmc3_device> m_palette;
optional_device<input_merger_device> m_soundirq;
required_device<generic_latch_8_device> m_soundlatch;
optional_device_array<deco_bac06_device, 2> m_tilegen;
/* memory regions */
// memory regions
required_memory_bank m_mainbank;
/* memory pointers */
// memory pointers
required_shared_ptr<u8> m_videoram;
optional_shared_ptr<u8> m_bg_ram;
std::unique_ptr<u16[]> m_buffered_spriteram16; // for the mxc06 sprite chip emulation (oscar, cobra)
/* video-related */
tilemap_t *m_bg_tilemap = nullptr;
tilemap_t *m_fix_tilemap = nullptr;
int m_scroll[4]{};
int m_game_uses_priority = 0;
// video-related
tilemap_t *m_bg_tilemap = nullptr;
tilemap_t *m_fix_tilemap = nullptr;
int m_scroll[4]{};
int m_game_uses_priority = 0;
/* misc */
bool m_coin_state = false;
emu_timer *m_6502_timer = nullptr;
// misc
bool m_coin_state = false;
};
// with I8751 MCU
@ -101,40 +97,31 @@ class dec8_mcu_state_base : public dec8_state_base
protected:
dec8_mcu_state_base(const machine_config &mconfig, device_type type, const char *tag) :
dec8_state_base(mconfig, type, tag),
m_mcu(*this, "mcu"),
m_coin_port(*this, "I8751")
m_mcu(*this, "mcu")
{
}
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
TIMER_CALLBACK_MEMBER(mcu_irq_clear);
u8 i8751_h_r();
u8 i8751_l_r();
void i8751_w(offs_t offset, u8 data);
u8 i8751_hi_r();
u8 i8751_lo_r();
virtual void i8751_hi_w(u8 data);
void i8751_lo_w(u8 data);
u8 i8751_port0_r();
void i8751_port0_w(u8 data);
u8 i8751_port1_r();
void i8751_port1_w(u8 data);
void i8751_reset_w(u8 data);
required_device<i8751_device> m_mcu;
/* ports */
required_ioport m_coin_port;
optional_device<i8751_device> m_mcu;
// MCU communication
u8 m_i8751_p2 = 0;
u8 m_i8751_p2 = 0;
int m_i8751_port0 = 0;
int m_i8751_port1 = 0;
int m_i8751_return = 0;
int m_i8751_value = 0;
emu_timer *m_i8751_timer = nullptr;
};
// with unique sprite hardware
@ -147,6 +134,8 @@ public:
}
void srdarwin(machine_config &config);
void srdarwinb(machine_config &config);
void init_srdarwinb();
protected:
@ -160,10 +149,11 @@ private:
TILE_GET_INFO_MEMBER(get_fix_tile_info);
TILE_GET_INFO_MEMBER(get_tile_info);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap);
void main_map(address_map &map) ATTR_COLD;
void srdarwinb_map(address_map &map) ATTR_COLD;
};
// with 'karnov' sprite hardware
@ -172,16 +162,56 @@ class lastmisn_state : public dec8_mcu_state_base
public:
lastmisn_state(const machine_config &mconfig, device_type type, const char *tag) :
dec8_mcu_state_base(mconfig, type, tag),
m_spritegen_krn(*this, "spritegen_krn"),
m_spritegen_krn(*this, "spritegen_krn")
{
}
void lastmisn(machine_config &config);
void shackled(machine_config &config);
protected:
DECLARE_VIDEO_START(lastmisn);
u32 screen_update_lastmisn(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
required_device<deco_karnovsprites_device> m_spritegen_krn;
private:
void lastmisn_control_w(u8 data);
void shackled_control_w(u8 data);
void lastmisn_scrollx_w(u8 data);
void lastmisn_scrolly_w(u8 data);
void mcu_to_main_w(u8 data);
TILEMAP_MAPPER_MEMBER(lastmisn_scan_rows);
TILE_GET_INFO_MEMBER(get_lastmisn_tile_info);
TILE_GET_INFO_MEMBER(get_lastmisn_fix_tile_info);
DECLARE_VIDEO_START(shackled);
u32 screen_update_shackled(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void shackled_coin_irq(int state);
void lastmisn_map(address_map &map) ATTR_COLD;
void lastmisn_sub_map(address_map &map) ATTR_COLD;
void shackled_map(address_map &map) ATTR_COLD;
void shackled_sub_map(address_map &map) ATTR_COLD;
void ym3526_s_map(address_map &map) ATTR_COLD;
};
// different interrupt handling
class ghostb_state : public lastmisn_state
{
public:
ghostb_state(const machine_config &mconfig, device_type type, const char *tag) :
lastmisn_state(mconfig, type, tag),
m_nmigate(*this, "nmigate")
{
}
void garyoret(machine_config &config);
void ghostb(machine_config &config);
void lastmisn(machine_config &config);
void meikyuh(machine_config &config);
void shackled(machine_config &config);
void init_meikyuhbl();
@ -189,62 +219,48 @@ protected:
virtual void machine_start() override ATTR_COLD;
virtual void machine_reset() override ATTR_COLD;
virtual void i8751_hi_w(u8 data) override;
void gondo_i8751_hi_w(u8 data);
void ghostb_bank_w(u8 data);
void gondo_scroll_w(offs_t offset, u8 data);
void gondo_mcu_to_main_w(u8 data);
void mcu_to_main_w(u8 data);
void sound_w(u8 data);
TIMER_CALLBACK_MEMBER(audiocpu_nmi_clear);
TIMER_CALLBACK_MEMBER(mcu_irq_clear);
TILE_GET_INFO_MEMBER(get_gondo_fix_tile_info);
TILE_GET_INFO_MEMBER(get_gondo_tile_info);
DECLARE_VIDEO_START(lastmisn);
uint32_t screen_update_lastmisn(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void screen_vblank(int state);
required_device<deco_karnovsprites_device> m_spritegen_krn;
optional_device<input_merger_device> m_nmigate;
private:
void lastmisn_control_w(u8 data);
void shackled_control_w(u8 data);
void lastmisn_scrollx_w(u8 data);
void lastmisn_scrolly_w(u8 data);
void shackled_mcu_to_main_w(u8 data);
TILEMAP_MAPPER_MEMBER(lastmisn_scan_rows);
TILE_GET_INFO_MEMBER(get_ghostb_fix_tile_info);
TILE_GET_INFO_MEMBER(get_lastmisn_tile_info);
TILE_GET_INFO_MEMBER(get_lastmisn_fix_tile_info);
DECLARE_VIDEO_START(garyoret);
DECLARE_VIDEO_START(ghostb);
DECLARE_VIDEO_START(shackled);
uint32_t screen_update_ghostb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_garyoret(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_shackled(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_ghostb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_garyoret(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void shackled_coin_irq(int state);
void lastmisn_map(address_map &map) ATTR_COLD;
void lastmisn_sub_map(address_map &map) ATTR_COLD;
void ghostb_map(address_map &map) ATTR_COLD;
void garyoret_map(address_map &map) ATTR_COLD;
void meikyuh_map(address_map &map) ATTR_COLD;
void shackled_map(address_map &map) ATTR_COLD;
void shackled_sub_map(address_map &map) ATTR_COLD;
void ym3526_s_map(address_map &map) ATTR_COLD;
bool m_secclr = false;
bool m_nmi_enable = false;
bool m_secclr = false;
bool m_nmi_enable = false;
emu_timer *m_6502_timer = nullptr;
emu_timer *m_i8751_timer = nullptr;
};
// with rotary joystick
class gondo_state : public lastmisn_state
class gondo_state : public ghostb_state
{
public:
gondo_state(const machine_config &mconfig, device_type type, const char *tag) :
lastmisn_state(mconfig, type, tag),
ghostb_state(mconfig, type, tag),
m_analog_io(*this, "AN%u", 0U),
m_in_io(*this, "IN%u", 0U)
{
@ -258,7 +274,7 @@ protected:
private:
template<unsigned Which> u8 player_io_r(offs_t offset);
uint32_t screen_update_gondo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_gondo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void gondo_colpri_cb(u32 &colour, u32 &pri_mask);
@ -291,8 +307,8 @@ private:
DECLARE_VIDEO_START(cobracom);
DECLARE_VIDEO_START(oscar);
uint32_t screen_update_cobracom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
uint32_t screen_update_oscar(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_cobracom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
u32 screen_update_oscar(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void coin_irq(int state);
void coin_clear_w(u8 data);
@ -340,8 +356,8 @@ private:
required_device<msm5205_device> m_msm;
required_memory_bank m_soundbank;
int m_toggle = 0;
int m_msm5205next = 0;
int m_toggle = 0;
int m_msm5205next = 0;
};
#endif // MAME_DATAEAST_DEC8_H

View File

@ -8,9 +8,9 @@ Cobra Command:
256 colours, palette generated by ram.
The Real Ghostbusters:
1 Deco VSC30 (M60348) (on DE-0259-1 sub board)
1 Deco HMC20 (M60232) (on DE-0259-1 sub board)
1 x BAC06 (on DE-0273-1 board)
1 Deco VSC30 (M60348) (on DE-0259-1 sub board)
1 Deco HMC20 (M60232) (on DE-0259-1 sub board)
1 x BAC06 (on DE-0273-1 board)
1 playfield, same as above, with rowscroll
1024 colours from 2 proms.
@ -21,25 +21,24 @@ Super Real Darwin:
Closer to earlier Darwin 4078 board than above games.
Last Mission/Shackled:
Has 1 Deco VSC30 (M60348) (From readme file)
Has 1 Deco HMC20 (M60232) (From readme file)
Has 1 Deco VSC30 (M60348) (From readme file)
Has 1 Deco HMC20 (M60232) (From readme file)
1 playfield
Sprite hardware same as Karnov.
(Shackled) Palettes 8-15 for tiles seem to have priority over sprites.
1 playfield
Sprite hardware same as Karnov.
(Shackled) Palettes 8-15 for tiles seem to have priority over sprites.
Gondomania:
Has two large square surface mount chips: [ DRL 40, 8053, 8649a ]
Has 1 Deco VSC30 (M60348)
Has 1 Deco HMC20 (M60232)
Priority - all tiles with *pens* 8-15 appear over sprites with palettes 8-15.
Has two large square surface mount chips: [ DRL 40, 8053, 8649a ]
Has 1 Deco VSC30 (M60348)
Has 1 Deco HMC20 (M60232)
Priority - all tiles with *pens* 8-15 appear over sprites with palettes 8-15.
Oscar:
Uses MXC-06 custom chip for sprites.
Uses BAC-06 custom chip for background.
I can't find what makes the fix chars...
Priority - tiles with palettes 8-15 have their *pens* 8-15 appearing over
sprites.
Uses MXC-06 custom chip for sprites.
Uses BAC-06 custom chip for background.
I can't find what makes the fix chars...
Priority - tiles with palettes 8-15 have their *pens* 8-15 appearing over sprites.
***************************************************************************/
@ -80,14 +79,14 @@ void srdarwin_state::control_w(offs_t offset, u8 data)
{
switch (offset)
{
case 0: /* Top 3 bits - bank switch, bottom 4 - scroll MSB */
case 0: // Top 3 bits - bank switch, bottom 4 - scroll MSB
m_mainbank->set_entry((data >> 5));
m_scroll[0] = data & 0xf;
return;
break;
case 1:
m_scroll[1] = data;
return;
break;
}
}
@ -113,7 +112,7 @@ void lastmisn_state::lastmisn_control_w(u8 data)
void lastmisn_state::shackled_control_w(u8 data)
{
/* Bottom 4 bits - bank switch, Bits 4 & 5 - Scroll MSBs */
// Bottom 4 bits - bank switch, Bits 4 & 5 - Scroll MSBs
m_mainbank->set_entry(data & 0x0f);
m_scroll[0] = (data >> 5) & 1;
@ -130,20 +129,20 @@ void lastmisn_state::lastmisn_scrolly_w(u8 data)
m_scroll[3] = data;
}
void lastmisn_state::gondo_scroll_w(offs_t offset, u8 data)
void ghostb_state::gondo_scroll_w(offs_t offset, u8 data)
{
switch (offset)
{
case 0x0:
m_scroll[1] = data; /* X LSB */
m_scroll[1] = data; // X LSB
break;
case 0x8:
m_scroll[3] = data; /* Y LSB */
m_scroll[3] = data; // Y LSB
break;
case 0x10:
m_scroll[0] = (data >> 0) & 1; /* Bit 0: X MSB */
m_scroll[2] = (data >> 1) & 1; /* Bit 1: Y MSB */
/* Bit 2 is also used in Gondo & Garyoret */
m_scroll[0] = (data >> 0) & 1; // Bit 0: X MSB
m_scroll[2] = (data >> 1) & 1; // Bit 1: Y MSB
// Bit 2 is also used in Gondo & Garyoret
break;
}
}
@ -154,14 +153,14 @@ void dec8_state_base::allocate_buffered_spriteram16()
save_pointer(NAME(m_buffered_spriteram16), 0x800/2);
}
/******************************************************************************/
/******************************************************************************/
void srdarwin_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &primap)
{
u8 *buffered_spriteram = m_spriteram->buffer();
/* Sprites */
// Sprites
for (int offs = 0x200 - 4; offs >= 0; offs -= 4)
{
u32 pri_mask = 0;
@ -185,10 +184,11 @@ void srdarwin_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
{
sy = 240 - sy;
sx = 240 - sx;
if (fx) fx = 0; else fx = 1;
fx = !fx;
sy2 = sy - 16;
}
else sy2 = sy + 16;
else
sy2 = sy + 16;
m_gfxdecode->gfx(1)->prio_transpen(bitmap,cliprect,
code,
@ -204,6 +204,7 @@ void srdarwin_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec
}
}
/******************************************************************************/
void oscar_state::cobracom_colpri_cb(u32 &colour, u32 &pri_mask)
@ -215,7 +216,7 @@ void oscar_state::cobracom_colpri_cb(u32 &colour, u32 &pri_mask)
colour &= 3;
}
uint32_t oscar_state::screen_update_cobracom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 oscar_state::screen_update_cobracom(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0,cliprect);
bool flip = m_tilegen[0]->get_flip_state();
@ -231,8 +232,8 @@ uint32_t oscar_state::screen_update_cobracom(screen_device &screen, bitmap_ind16
return 0;
}
/******************************************************************************/
/******************************************************************************/
TILE_GET_INFO_MEMBER(oscar_state::get_cobracom_fix_tile_info)
{
@ -240,10 +241,7 @@ TILE_GET_INFO_MEMBER(oscar_state::get_cobracom_fix_tile_info)
int tile = m_videoram[offs + 1] + (m_videoram[offs] << 8);
int color = (tile & 0xe000) >> 13;
tileinfo.set(0,
tile & 0xfff,
color,
0);
tileinfo.set(0, tile & 0xfff, color, 0);
}
VIDEO_START_MEMBER(oscar_state,cobracom)
@ -256,9 +254,10 @@ VIDEO_START_MEMBER(oscar_state,cobracom)
m_game_uses_priority = 0;
}
/******************************************************************************/
uint32_t lastmisn_state::screen_update_ghostb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 ghostb_state::screen_update_ghostb(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_tilegen[0]->deco_bac06_pf_draw(screen,bitmap,cliprect,TILEMAP_DRAW_OPAQUE, 0);
m_spritegen_krn->draw_sprites(screen, bitmap, cliprect, m_buffered_spriteram16.get(), 0x400);
@ -266,22 +265,19 @@ uint32_t lastmisn_state::screen_update_ghostb(screen_device &screen, bitmap_ind1
return 0;
}
TILE_GET_INFO_MEMBER(lastmisn_state::get_ghostb_fix_tile_info)
TILE_GET_INFO_MEMBER(ghostb_state::get_ghostb_fix_tile_info)
{
int offs = tile_index << 1;
int tile = m_videoram[offs + 1] + (m_videoram[offs] << 8);
int color = (tile & 0xc00) >> 10;
tileinfo.set(0,
tile & 0x3ff,
color,
0);
tileinfo.set(0, tile & 0x3ff, color, 0);
}
VIDEO_START_MEMBER(lastmisn_state,ghostb)
VIDEO_START_MEMBER(ghostb_state,ghostb)
{
allocate_buffered_spriteram16();
m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(lastmisn_state::get_ghostb_fix_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ghostb_state::get_ghostb_fix_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_fix_tilemap->set_transparent_pen(0);
m_game_uses_priority = 0;
@ -290,6 +286,7 @@ VIDEO_START_MEMBER(lastmisn_state,ghostb)
save_item(NAME(m_nmi_enable));
}
/******************************************************************************/
// we mimic the priority scheme in dec0.cpp, this was originally a bit different, so this could be wrong
@ -299,7 +296,7 @@ void oscar_state::oscar_tile_cb(tile_data &tileinfo, u32 &tile, u32 &colour, u32
colour &= 7;
}
uint32_t oscar_state::screen_update_oscar(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 oscar_state::screen_update_oscar(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bool flip = m_tilegen[0]->get_flip_state();
m_tilegen[0]->set_flip_screen(flip);
@ -319,10 +316,7 @@ TILE_GET_INFO_MEMBER(oscar_state::get_oscar_fix_tile_info)
int tile = m_videoram[offs + 1] + (m_videoram[offs] << 8);
int color = (tile & 0xf000) >> 14;
tileinfo.set(0,
tile&0xfff,
color,
0);
tileinfo.set(0, tile & 0xfff, color, 0);
}
VIDEO_START_MEMBER(oscar_state,oscar)
@ -337,9 +331,10 @@ VIDEO_START_MEMBER(oscar_state,oscar)
m_game_uses_priority = 1;
}
/******************************************************************************/
uint32_t lastmisn_state::screen_update_lastmisn(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 lastmisn_state::screen_update_lastmisn(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, ((m_scroll[0] << 8)+ m_scroll[1]));
m_bg_tilemap->set_scrolly(0, ((m_scroll[2] << 8)+ m_scroll[3]));
@ -350,7 +345,7 @@ uint32_t lastmisn_state::screen_update_lastmisn(screen_device &screen, bitmap_in
return 0;
}
uint32_t lastmisn_state::screen_update_shackled(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 lastmisn_state::screen_update_shackled(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, ((m_scroll[0] << 8) + m_scroll[1]));
m_bg_tilemap->set_scrolly(0, ((m_scroll[2] << 8) + m_scroll[3]));
@ -366,7 +361,7 @@ uint32_t lastmisn_state::screen_update_shackled(screen_device &screen, bitmap_in
TILEMAP_MAPPER_MEMBER(lastmisn_state::lastmisn_scan_rows)
{
/* logical (col,row) -> memory offset */
// logical (col,row) -> memory offset
return ((col & 0x0f) + ((row & 0x0f) << 4)) + ((col & 0x10) << 4) + ((row & 0x10) << 5);
}
@ -381,10 +376,7 @@ TILE_GET_INFO_MEMBER(lastmisn_state::get_lastmisn_tile_info)
else
tileinfo.category = 0;
tileinfo.set(1,
tile & 0xfff,
color,
0);
tileinfo.set(1, tile & 0xfff, color, 0);
}
TILE_GET_INFO_MEMBER(lastmisn_state::get_lastmisn_fix_tile_info)
@ -393,10 +385,7 @@ TILE_GET_INFO_MEMBER(lastmisn_state::get_lastmisn_fix_tile_info)
int tile = m_videoram[offs + 1] + (m_videoram[offs] << 8);
int color = (tile & 0xc000) >> 14;
tileinfo.set(0,
tile&0xfff,
color,
0);
tileinfo.set(0, tile & 0xfff, color, 0);
}
VIDEO_START_MEMBER(lastmisn_state,lastmisn)
@ -420,9 +409,10 @@ VIDEO_START_MEMBER(lastmisn_state,shackled)
m_game_uses_priority = 1;
}
/******************************************************************************/
uint32_t srdarwin_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 srdarwin_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
m_bg_tilemap->set_scrollx(0, (m_scroll[0] << 8) + m_scroll[1]);
@ -437,14 +427,11 @@ uint32_t srdarwin_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
TILE_GET_INFO_MEMBER(srdarwin_state::get_fix_tile_info)
{
int tile = m_videoram[tile_index];
int color = 0; /* ? */
int color = 0; // ?
tileinfo.category = 0;
tileinfo.set(0,
tile,
color,
0);
tileinfo.set(0, tile, color, 0);
}
TILE_GET_INFO_MEMBER(srdarwin_state::get_tile_info)
@ -456,10 +443,7 @@ TILE_GET_INFO_MEMBER(srdarwin_state::get_tile_info)
tile = tile & 0x3ff;
bank = (tile / 0x100) + 2;
tileinfo.set(bank,
tile,
color,
0);
tileinfo.set(bank, tile, color, 0);
tileinfo.group = color;
}
@ -475,6 +459,7 @@ void srdarwin_state::video_start()
m_bg_tilemap->set_transmask(3, 0x0000, 0xffff); // draw as foreground only
}
/******************************************************************************/
void gondo_state::gondo_colpri_cb(u32 &colour, u32 &pri_mask)
@ -484,7 +469,7 @@ void gondo_state::gondo_colpri_cb(u32 &colour, u32 &pri_mask)
pri_mask |= GFX_PMASK_2; // behind foreground, above background
}
uint32_t gondo_state::screen_update_gondo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 gondo_state::screen_update_gondo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
screen.priority().fill(0, cliprect);
m_bg_tilemap->set_scrollx(0, ((m_scroll[0] << 8) + m_scroll[1]));
@ -497,7 +482,7 @@ uint32_t gondo_state::screen_update_gondo(screen_device &screen, bitmap_ind16 &b
return 0;
}
uint32_t lastmisn_state::screen_update_garyoret(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
u32 ghostb_state::screen_update_garyoret(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->set_scrollx(0, ((m_scroll[0] << 8) + m_scroll[1]));
m_bg_tilemap->set_scrolly(0, ((m_scroll[2] << 8) + m_scroll[3]));
@ -509,19 +494,16 @@ uint32_t lastmisn_state::screen_update_garyoret(screen_device &screen, bitmap_in
return 0;
}
TILE_GET_INFO_MEMBER(lastmisn_state::get_gondo_fix_tile_info)
TILE_GET_INFO_MEMBER(ghostb_state::get_gondo_fix_tile_info)
{
int offs = tile_index * 2;
int tile = m_videoram[offs + 1] + (m_videoram[offs] << 8);
int color = (tile & 0x7000) >> 12;
tileinfo.set(0,
tile&0xfff,
color,
0);
tileinfo.set(0, tile & 0xfff, color, 0);
}
TILE_GET_INFO_MEMBER(lastmisn_state::get_gondo_tile_info)
TILE_GET_INFO_MEMBER(ghostb_state::get_gondo_tile_info)
{
int offs = tile_index * 2;
int tile = m_bg_ram[offs + 1] + (m_bg_ram[offs] << 8);
@ -532,10 +514,7 @@ TILE_GET_INFO_MEMBER(lastmisn_state::get_gondo_tile_info)
else
tileinfo.category = 0;
tileinfo.set(1,
tile&0xfff,
color,
0);
tileinfo.set(1, tile & 0xfff, color, 0);
}
void gondo_state::video_start()
@ -545,18 +524,16 @@ void gondo_state::video_start()
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(gondo_state::get_gondo_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_fix_tilemap->set_transparent_pen(0);
m_bg_tilemap->set_transmask(0, 0x00ff, 0xff00); /* Bottom 8 pens */
m_bg_tilemap->set_transmask(0, 0x00ff, 0xff00); // Bottom 8 pens
m_game_uses_priority = 0;
}
VIDEO_START_MEMBER(lastmisn_state,garyoret)
VIDEO_START_MEMBER(ghostb_state,garyoret)
{
allocate_buffered_spriteram16();
m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(lastmisn_state::get_gondo_fix_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(lastmisn_state::get_gondo_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ghostb_state::get_gondo_fix_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(ghostb_state::get_gondo_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
m_fix_tilemap->set_transparent_pen(0);
m_game_uses_priority = 1;
}
/******************************************************************************/

View File

@ -87,6 +87,7 @@ Stephh's notes (based on the games M68000 code and some tests) :
#include "sound/ymopn.h"
#include "sound/ymopl.h"
#include "video/bufsprite.h"
#include "deckarn.h"
#include "decrmc3.h"
#include "screen.h"
@ -96,7 +97,6 @@ Stephh's notes (based on the games M68000 code and some tests) :
namespace {
/*************************************
*
* Type definitions
@ -106,8 +106,8 @@ namespace {
class karnov_state : public driver_device
{
public:
karnov_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
karnov_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_mcu(*this, "mcu"),
@ -169,6 +169,7 @@ private:
void karnovjbl_sound_map(address_map &map) ATTR_COLD;
void screen_vblank(int state);
// protection mcu
void mcu_coin_irq(int state);
void mcu_ack_w(uint16_t data);
@ -234,28 +235,29 @@ void karnov_state::mcu_p2_w(uint8_t data)
// ------1- secreq ack
// -------0 cinclr
if (BIT(m_mcu_p2, 0) == 1 && BIT(data, 0) == 0)
const u8 fall = ~data & m_mcu_p2;
m_mcu_p2 = data;
if (BIT(fall, 0))
m_mcu->set_input_line(MCS51_INT0_LINE, CLEAR_LINE);
if (BIT(m_mcu_p2, 1) == 1 && BIT(data, 1) == 0)
if (BIT(fall, 1))
m_mcu->set_input_line(MCS51_INT1_LINE, CLEAR_LINE);
if (BIT(m_mcu_p2, 2) == 1 && BIT(data, 2) == 0)
if (BIT(fall, 2))
m_maincpu->set_input_line(6, ASSERT_LINE);
if (BIT(m_mcu_p2, 4) == 1 && BIT(data, 4) == 0)
if (BIT(fall, 4))
m_mcu_p0 = m_maincpu_to_mcu >> 0;
if (BIT(m_mcu_p2, 5) == 1 && BIT(data, 5) == 0)
if (BIT(fall, 5))
m_mcu_p1 = m_maincpu_to_mcu >> 8;
if (BIT(m_mcu_p2, 6) == 1 && BIT(data, 6) == 0)
if (BIT(fall, 6))
m_mcu_to_maincpu = (m_mcu_to_maincpu & 0xff00) | (m_mcu_p0 << 0);
if (BIT(m_mcu_p2, 7) == 1 && BIT(data, 7) == 0)
if (BIT(fall, 7))
m_mcu_to_maincpu = (m_mcu_to_maincpu & 0x00ff) | (m_mcu_p1 << 8);
m_mcu_p2 = data;
}
// i8031 for bootleg emulation
@ -294,10 +296,13 @@ void karnov_state::mcu_data_h_w(uint8_t data)
void karnov_state::mcubl_p1_w(uint8_t data)
{
if (BIT(m_mcu_p1, 0) == 1 && BIT(data, 0) == 0)
const u8 fall = ~data & m_mcu_p1;
m_mcu_p1 = data;
if (BIT(fall, 0))
m_mcu->set_input_line(MCS51_INT1_LINE, CLEAR_LINE);
if (BIT(m_mcu_p1, 1) == 1 && BIT(data, 1) == 0)
if (BIT(fall, 1))
m_maincpu->set_input_line(6, ASSERT_LINE);
m_mcu_p1 = data;
@ -1251,13 +1256,13 @@ ROM_END
*
*************************************/
GAME( 1987, karnov, 0, karnov, karnov, karnov_state, empty_init, ROT0, "Data East USA", "Karnov (US, rev 6)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, karnova, karnov, karnov, karnov, karnov_state, empty_init, ROT0, "Data East USA", "Karnov (US, rev 5)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, karnovj, karnov, karnov, karnov, karnov_state, empty_init, ROT0, "Data East Corporation", "Karnov (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, karnovjbl, karnov, karnovjbl, karnovjbl, karnov_state, empty_init, ROT0, "bootleg (K. J. Corporation)", "Karnov (Japan, bootleg with NEC D8748HD)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1987, wndrplnt, 0, wndrplnt, wndrplnt, karnov_state, empty_init, ROT270, "Data East Corporation", "Wonder Planet (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnov, 0, karnov, chelnov, karnov_state, empty_init, ROT0, "Data East Corporation", "Chelnov - Atomic Runner (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnovu, chelnov, karnov, chelnovu, karnov_state, empty_init, ROT0, "Data East USA", "Chelnov - Atomic Runner (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnovj, chelnov, karnov, chelnovj, karnov_state, empty_init, ROT0, "Data East Corporation", "Chelnov - Atomic Runner (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnovjbl, chelnov, chelnovjbl, chelnovjbl, karnov_state, empty_init, ROT0, "bootleg", "Chelnov - Atomic Runner (Japan, bootleg with I8031, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnovjbla, chelnov, chelnovjbl, chelnovjbl, karnov_state, empty_init, ROT0, "bootleg", "Chelnov - Atomic Runner (Japan, bootleg with I8031, set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, karnov, 0, karnov, karnov, karnov_state, empty_init, ROT0, "Data East USA", "Karnov (US, rev 6)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, karnova, karnov, karnov, karnov, karnov_state, empty_init, ROT0, "Data East USA", "Karnov (US, rev 5)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, karnovj, karnov, karnov, karnov, karnov_state, empty_init, ROT0, "Data East Corporation", "Karnov (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, karnovjbl, karnov, karnovjbl, karnovjbl, karnov_state, empty_init, ROT0, "bootleg (K. J. Corporation)", "Karnov (Japan, bootleg with NEC D8748HD)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE )
GAME( 1987, wndrplnt, 0, wndrplnt, wndrplnt, karnov_state, empty_init, ROT270, "Data East Corporation", "Wonder Planet (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnov, 0, karnov, chelnov, karnov_state, empty_init, ROT0, "Data East Corporation", "Atomic Runner Chelnov (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnovu, chelnov, karnov, chelnovu, karnov_state, empty_init, ROT0, "Data East USA", "Atomic Runner Chelnov (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnovj, chelnov, karnov, chelnovj, karnov_state, empty_init, ROT0, "Data East Corporation", "Atomic Runner Chelnov (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnovjbl, chelnov, chelnovjbl, chelnovjbl, karnov_state, empty_init, ROT0, "bootleg", "Atomic Runner Chelnov (Japan, bootleg with I8031, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, chelnovjbla, chelnov, chelnovjbl, chelnovjbl, karnov_state, empty_init, ROT0, "bootleg", "Atomic Runner Chelnov (Japan, bootleg with I8031, set 2)", MACHINE_SUPPORTS_SAVE )