mirror of
https://github.com/holub/mame
synced 2025-10-06 17:08:28 +03:00
marinedt.cpp: rewritten driver from scratch, improvements wrt older version are: [Angelo Salese]
* Added sea bitmap and flashing when shark appears; * Improved sprite/tilemap colors, now more accurate to the references; * Fixed priority, both sprite layers are actually above text tilemap; * Added player 2 trackball inputs, and global coin lockout; * Streamlined and improved collision detection (still not perfect therefore game still marked NOT_WORKING);
This commit is contained in:
parent
f092330cc3
commit
3ec911a5cf
@ -1,20 +1,22 @@
|
|||||||
// license:BSD-3-Clause
|
// license:BSD-3-Clause
|
||||||
// copyright-holders:Angelo Salese
|
// copyright-holders:Angelo Salese
|
||||||
/***************************************************************************
|
/*****************************************************************************************************************
|
||||||
|
|
||||||
Marine Date (c) 1981 Taito
|
Marine Date (c) 1981 Taito
|
||||||
|
|
||||||
similar to crbaloon.cpp
|
similar to crbaloon.cpp
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- sound
|
- discrete sound
|
||||||
- colors (gameplay borders should be red, ditto for goal stone),
|
- imperfect colors: unused bit 2 of color prom, guesswokred sea gradient, mg16 entirely unused.
|
||||||
also unused color 0x10-0x1f (might be a flashing bank)
|
also unused colors 0x10-0x1f (might be a flashing bank)
|
||||||
- collision detection isn't perfect;
|
- collision detection isn't perfect, sometimes octopus gets stuck and dies even if moves are still available.
|
||||||
|
Also it's supposed to bounce on sea foams (regression when bonus ball detection is fixed).
|
||||||
|
Above doesn't happen in upright mode, also HW collision detection isn't perfect even from the reference.
|
||||||
- ROM writes (irq mask?)
|
- ROM writes (irq mask?)
|
||||||
- Merge devices from crbaloon/bking/grchamp drivers.
|
- Merge devices with crbaloon/bking/grchamp drivers.
|
||||||
|
|
||||||
============================================================================
|
*****************************************************************************************************************
|
||||||
|
|
||||||
Marine Date
|
Marine Date
|
||||||
Taito 1981
|
Taito 1981
|
||||||
@ -96,8 +98,7 @@ Notes:
|
|||||||
Top and Middle PCBs are plugged in with the solder-sides together.
|
Top and Middle PCBs are plugged in with the solder-sides together.
|
||||||
Lower PCB is plugged in with components facing up.
|
Lower PCB is plugged in with components facing up.
|
||||||
|
|
||||||
***************************************************************************/
|
*****************************************************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "cpu/z80/z80.h"
|
#include "cpu/z80/z80.h"
|
||||||
@ -149,7 +150,7 @@ private:
|
|||||||
required_ioport_array<4> m_in_track;
|
required_ioport_array<4> m_in_track;
|
||||||
|
|
||||||
tilemap_t *m_tilemap;
|
tilemap_t *m_tilemap;
|
||||||
std::unique_ptr<bitmap_ind16> m_seabitmap;
|
std::unique_ptr<bitmap_ind16> m_seabitmap[2];
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
uint8_t offs;
|
uint8_t offs;
|
||||||
@ -161,6 +162,7 @@ private:
|
|||||||
uint8_t m_layer_en;
|
uint8_t m_layer_en;
|
||||||
uint8_t m_in_select;
|
uint8_t m_in_select;
|
||||||
bool m_screen_flip;
|
bool m_screen_flip;
|
||||||
|
uint8_t m_sea_bank;
|
||||||
|
|
||||||
void init_seabitmap();
|
void init_seabitmap();
|
||||||
void obj_reg_w(uint8_t which,uint8_t reg, uint8_t data);
|
void obj_reg_w(uint8_t which,uint8_t reg, uint8_t data);
|
||||||
@ -179,9 +181,11 @@ TILE_GET_INFO_MEMBER(marinedt_state::get_tile_info)
|
|||||||
void marinedt_state::init_seabitmap()
|
void marinedt_state::init_seabitmap()
|
||||||
{
|
{
|
||||||
const rectangle clip(32, 256, 32, 256);
|
const rectangle clip(32, 256, 32, 256);
|
||||||
m_seabitmap = std::make_unique<bitmap_ind16>(512, 512);
|
m_seabitmap[0] = std::make_unique<bitmap_ind16>(512, 512);
|
||||||
|
m_seabitmap[1] = std::make_unique<bitmap_ind16>(512, 512);
|
||||||
|
|
||||||
m_seabitmap->fill(64, clip);
|
m_seabitmap[0]->fill(64, clip);
|
||||||
|
m_seabitmap[1]->fill(64+32, clip);
|
||||||
|
|
||||||
for (int y = clip.min_y; y <= clip.max_y; y++)
|
for (int y = clip.min_y; y <= clip.max_y; y++)
|
||||||
{
|
{
|
||||||
@ -193,7 +197,8 @@ void marinedt_state::init_seabitmap()
|
|||||||
if(blue_pen > 0x5f)
|
if(blue_pen > 0x5f)
|
||||||
blue_pen = 0x5f;
|
blue_pen = 0x5f;
|
||||||
|
|
||||||
m_seabitmap->pix16(y, x) = blue_pen;
|
m_seabitmap[0]->pix16(y, x) = blue_pen;
|
||||||
|
m_seabitmap[1]->pix16(y, x) = blue_pen+0x20;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,21 +227,23 @@ void marinedt_state::video_start()
|
|||||||
save_item(NAME(m_obj[0].bitmap));
|
save_item(NAME(m_obj[0].bitmap));
|
||||||
save_item(NAME(m_obj[1].bitmap));
|
save_item(NAME(m_obj[1].bitmap));
|
||||||
save_item(NAME(m_layer_en));
|
save_item(NAME(m_layer_en));
|
||||||
|
save_item(NAME(m_sea_bank));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t marinedt_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
|
uint32_t marinedt_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
|
||||||
{
|
{
|
||||||
if(m_layer_en & 8)
|
if(m_layer_en & 8)
|
||||||
copybitmap(bitmap, *m_seabitmap, m_screen_flip == false, m_screen_flip == false, m_screen_flip ? 0 : -256, m_screen_flip ? 0 : -224, cliprect);
|
copybitmap(bitmap, *m_seabitmap[m_sea_bank], m_screen_flip == false, m_screen_flip == false, m_screen_flip ? 0 : -256, m_screen_flip ? 0 : -224, cliprect);
|
||||||
else
|
else
|
||||||
bitmap.fill(0,cliprect);
|
bitmap.fill(0,cliprect);
|
||||||
|
|
||||||
|
m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
||||||
|
|
||||||
if(m_layer_en & 2)
|
if(m_layer_en & 2)
|
||||||
copybitmap_trans(bitmap, m_obj[1].bitmap, 0, 0, 0, 0, cliprect, 0);
|
copybitmap_trans(bitmap, m_obj[1].bitmap, 0, 0, 0, 0, cliprect, 0);
|
||||||
if(m_layer_en & 1)
|
if(m_layer_en & 1)
|
||||||
copybitmap_trans(bitmap, m_obj[0].bitmap, 0, 0, 0, 0, cliprect, 0);
|
copybitmap_trans(bitmap, m_obj[0].bitmap, 0, 0, 0, 0, cliprect, 0);
|
||||||
|
|
||||||
m_tilemap->draw(screen, bitmap, cliprect, 0, 0);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,7 +268,7 @@ inline void marinedt_state::obj_reg_w(uint8_t which, uint8_t reg,uint8_t data)
|
|||||||
|
|
||||||
const uint8_t tilenum = ((m_obj[which].offs & 4) << 1) | ( (m_obj[which].offs & 0x38) >> 3);
|
const uint8_t tilenum = ((m_obj[which].offs & 4) << 1) | ( (m_obj[which].offs & 0x38) >> 3);
|
||||||
const uint8_t color = (m_obj[which].offs & 3);
|
const uint8_t color = (m_obj[which].offs & 3);
|
||||||
const bool fx = m_screen_flip;
|
bool fx = BIT(m_obj[which].offs,6);
|
||||||
const bool fy = BIT(m_obj[which].offs,7);
|
const bool fy = BIT(m_obj[which].offs,7);
|
||||||
|
|
||||||
//base_pen = (which == 0 ? 0x30 : 0x20) + color*4;
|
//base_pen = (which == 0 ? 0x30 : 0x20) + color*4;
|
||||||
@ -303,12 +310,13 @@ WRITE8_MEMBER(marinedt_state::sfx_w)
|
|||||||
WRITE8_MEMBER(marinedt_state::layer_enable_w)
|
WRITE8_MEMBER(marinedt_state::layer_enable_w)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
---x ---- enabled when shark appears and during scoring system explaination in attract (unknown purpose)
|
---x ---- enabled when shark appears (enables red gradient on sea bitmap apparently)
|
||||||
---- x--- sea layer draw enable (disabled in test mode)
|
---- x--- sea layer draw enable (disabled in test mode)
|
||||||
---- --x- obj 2 draw enable
|
---- --x- obj 2 draw enable
|
||||||
---- ---x obj 1 draw enable
|
---- ---x obj 1 draw enable
|
||||||
*/
|
*/
|
||||||
m_layer_en = data & 0xf;
|
m_layer_en = data & 0xf;
|
||||||
|
m_sea_bank = (data & 0x10) >> 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
WRITE8_MEMBER(marinedt_state::output_w)
|
WRITE8_MEMBER(marinedt_state::output_w)
|
||||||
@ -584,20 +592,22 @@ PALETTE_INIT_MEMBER(marinedt_state, marinedt)
|
|||||||
/* red component */
|
/* red component */
|
||||||
bit0 = (color_prom[i] >> 0) & 0x01;
|
bit0 = (color_prom[i] >> 0) & 0x01;
|
||||||
bit1 = (color_prom[i] >> 1) & 0x01;
|
bit1 = (color_prom[i] >> 1) & 0x01;
|
||||||
bit2 = (color_prom[i] >> 2) & 0x01;
|
// bit2 = (color_prom[i] >> 2) & 0x01;
|
||||||
r = (0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2);
|
r = (0x55 * bit0 + 0xaa * bit1);
|
||||||
|
|
||||||
/* green component */
|
/* green component */
|
||||||
bit0 = (color_prom[i] >> 3) & 0x01;
|
bit0 = (color_prom[i] >> 3) & 0x01;
|
||||||
bit1 = (color_prom[i] >> 4) & 0x01;
|
bit1 = (color_prom[i] >> 4) & 0x01;
|
||||||
bit2 = (color_prom[i] >> 5) & 0x01;
|
g = (0x55 * bit0 + 0xaa * bit1);
|
||||||
g = (0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2);
|
|
||||||
|
|
||||||
/* blue component */
|
/* blue component */
|
||||||
bit0 = (color_prom[i] >> 6) & 0x01;
|
bit0 = (color_prom[i] >> 5) & 0x01;
|
||||||
bit1 = (color_prom[i] >> 7) & 0x01;
|
bit1 = (color_prom[i] >> 6) & 0x01;
|
||||||
// TODO: blue arrangement wrong according to screenshot, gameplay border should be red instead of blue
|
bit2 = (color_prom[i] >> 7) & 0x01;
|
||||||
b = (0x47 * bit0 + 0x97 * bit1);
|
b = (0x55 * bit0 + 0xaa * bit1);
|
||||||
|
// matches yellow haired siren
|
||||||
|
if(bit2 == 0)
|
||||||
|
b/=2;
|
||||||
|
|
||||||
palette.set_pen_color(i, rgb_t(r, g, b));
|
palette.set_pen_color(i, rgb_t(r, g, b));
|
||||||
}
|
}
|
||||||
@ -607,6 +617,7 @@ PALETTE_INIT_MEMBER(marinedt_state, marinedt)
|
|||||||
{
|
{
|
||||||
b = color_prom[i+0x60];
|
b = color_prom[i+0x60];
|
||||||
palette.set_pen_color(64+31-i, rgb_t(0, 0, b));
|
palette.set_pen_color(64+31-i, rgb_t(0, 0, b));
|
||||||
|
palette.set_pen_color(64+63-i, rgb_t(0xff, 0, b));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -626,7 +637,7 @@ static MACHINE_CONFIG_START( marinedt )
|
|||||||
|
|
||||||
MCFG_GFXDECODE_ADD("gfxdecode", "palette", marinedt)
|
MCFG_GFXDECODE_ADD("gfxdecode", "palette", marinedt)
|
||||||
|
|
||||||
MCFG_PALETTE_ADD("palette", 64+32)
|
MCFG_PALETTE_ADD("palette", 64+64)
|
||||||
MCFG_PALETTE_INIT_OWNER(marinedt_state, marinedt)
|
MCFG_PALETTE_INIT_OWNER(marinedt_state, marinedt)
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
|
Loading…
Reference in New Issue
Block a user