ddealer.cpp: fixed flip screen regression, removed prefixes / suffixes (nw)

This commit is contained in:
Ivan Vangelista 2016-12-12 11:47:38 +01:00 committed by GitHub
parent dafd2dccc6
commit ecdf2d1c63

View File

@ -51,10 +51,10 @@
- There's also MCU response (write/read/test) test just after these writes.
(probably data used in the check depends on above writes). It's similar to
jalmah.c tests, but num of responses is different, and shared ram is
jalmah.cpp tests, but num of responses is different, and shared ram is
used to communicate with MCU
- After last check (or maybe durning tests ... no idea)
- After last check (or maybe during tests ... no idea)
MCU writes $4ef900000604 (jmp $604) to $fe000 and game jumps to this address.
- code at $604 writes $20.w to $fe018 and $1.w to $fe01e.
@ -144,38 +144,40 @@ public:
required_shared_ptr<uint16_t> m_work_ram;
required_shared_ptr<uint16_t> m_mcu_shared_ram;
/* devices */
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
/* video-related */
tilemap_t *m_back_tilemap;
int m_respcount;
int m_flipscreen;
/* misc */
uint8_t m_input_pressed;
uint16_t m_coin_input;
DECLARE_WRITE16_MEMBER(ddealer_flipscreen_w);
DECLARE_WRITE16_MEMBER(flipscreen_w);
DECLARE_WRITE16_MEMBER(back_vram_w);
DECLARE_WRITE16_MEMBER(ddealer_vregs_w);
DECLARE_WRITE16_MEMBER(ddealer_mcu_shared_w);
DECLARE_READ16_MEMBER(ddealer_mcu_r);
DECLARE_WRITE16_MEMBER(mcu_shared_w);
DECLARE_READ16_MEMBER(mcu_r);
DECLARE_DRIVER_INIT(ddealer);
TILE_GET_INFO_MEMBER(get_back_tile_info);
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
uint32_t screen_update_ddealer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(ddealer_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(ddealer_mcu_sim);
required_device<cpu_device> m_maincpu;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
void ddealer_draw_video_layer( uint16_t* vreg_base, uint16_t* top, uint16_t* bottom, bitmap_ind16 &bitmap, const rectangle &cliprect, int flipy);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(mcu_sim);
void draw_video_layer(uint16_t* vreg_base, uint16_t* top, uint16_t* bottom, bitmap_ind16 &bitmap, const rectangle &cliprect, int flipy);
};
WRITE16_MEMBER(ddealer_state::ddealer_flipscreen_w)
WRITE16_MEMBER(ddealer_state::flipscreen_w)
{
m_flipscreen = data & 0x01;
flip_screen_set(data & 0x01);
}
TILE_GET_INFO_MEMBER(ddealer_state::get_back_tile_info)
@ -189,11 +191,10 @@ TILE_GET_INFO_MEMBER(ddealer_state::get_back_tile_info)
void ddealer_state::video_start()
{
m_flipscreen = 0;
m_back_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(FUNC(ddealer_state::get_back_tile_info),this), TILEMAP_SCAN_COLS, 8, 8, 64, 32);
}
void ddealer_state::ddealer_draw_video_layer( uint16_t* vreg_base, uint16_t* top, uint16_t* bottom, bitmap_ind16 &bitmap, const rectangle &cliprect, int flipy)
void ddealer_state::draw_video_layer(uint16_t* vreg_base, uint16_t* top, uint16_t* bottom, bitmap_ind16 &bitmap, const rectangle &cliprect, int flipy)
{
gfx_element *gfx = m_gfxdecode->gfx(1);
@ -276,40 +277,40 @@ void ddealer_state::ddealer_draw_video_layer( uint16_t* vreg_base, uint16_t* top
}
uint32_t ddealer_state::screen_update_ddealer(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
uint32_t ddealer_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_back_tilemap->set_scrollx(0, m_flipscreen ? -192 : -64);
m_back_tilemap->set_flip(m_flipscreen ? TILEMAP_FLIPY | TILEMAP_FLIPX : 0);
m_back_tilemap->set_scrollx(0, -64);
m_back_tilemap->draw(screen, bitmap, cliprect, 0, 0);
/* the fg tilemap handling is a little hacky right now,
i'm not sure if it should be a single tilemap with
I'm not sure if it should be a single tilemap with
rowscroll / linescroll, or two tilemaps which can be
combined, the flipscreen case makes things more
difficult to understand */
bool const flip = flip_screen();
if (!m_flipscreen)
if (!flip)
{
if (m_vregs[0xcc / 2] & 0x80)
{
ddealer_draw_video_layer(&m_vregs[0x1e0 / 2], m_left_fg_vram_top, m_left_fg_vram_bottom, bitmap, cliprect, m_flipscreen);
ddealer_draw_video_layer(&m_vregs[0xcc / 2], m_right_fg_vram_top, m_right_fg_vram_bottom, bitmap, cliprect, m_flipscreen);
draw_video_layer(&m_vregs[0x1e0 / 2], m_left_fg_vram_top, m_left_fg_vram_bottom, bitmap, cliprect, flip);
draw_video_layer(&m_vregs[0xcc / 2], m_right_fg_vram_top, m_right_fg_vram_bottom, bitmap, cliprect, flip);
}
else
{
ddealer_draw_video_layer(&m_vregs[0x1e0 / 2], m_left_fg_vram_top, m_left_fg_vram_bottom, bitmap, cliprect, m_flipscreen);
draw_video_layer(&m_vregs[0x1e0 / 2], m_left_fg_vram_top, m_left_fg_vram_bottom, bitmap, cliprect, flip);
}
}
else
{
if (m_vregs[0xcc / 2] & 0x80)
{
ddealer_draw_video_layer(&m_vregs[0xcc / 2], m_left_fg_vram_top, m_left_fg_vram_bottom, bitmap, cliprect, m_flipscreen);
ddealer_draw_video_layer(&m_vregs[0x1e0 / 2], m_right_fg_vram_top, m_right_fg_vram_bottom, bitmap, cliprect, m_flipscreen);
draw_video_layer(&m_vregs[0xcc / 2], m_left_fg_vram_top, m_left_fg_vram_bottom, bitmap, cliprect, flip);
draw_video_layer(&m_vregs[0x1e0 / 2], m_right_fg_vram_top, m_right_fg_vram_bottom, bitmap, cliprect, flip);
}
else
{
ddealer_draw_video_layer(&m_vregs[0x1e0 / 2], m_left_fg_vram_top, m_left_fg_vram_bottom, bitmap, cliprect, m_flipscreen);
draw_video_layer(&m_vregs[0x1e0 / 2], m_left_fg_vram_top, m_left_fg_vram_bottom, bitmap, cliprect, flip);
}
}
@ -317,7 +318,7 @@ uint32_t ddealer_state::screen_update_ddealer(screen_device &screen, bitmap_ind1
return 0;
}
TIMER_DEVICE_CALLBACK_MEMBER(ddealer_state::ddealer_mcu_sim)
TIMER_DEVICE_CALLBACK_MEMBER(ddealer_state::mcu_sim)
{
/*coin/credit simulation*/
/*$fe002 is used,might be for multiple coins for one credit settings.*/
@ -389,11 +390,6 @@ WRITE16_MEMBER(ddealer_state::back_vram_w)
}
WRITE16_MEMBER(ddealer_state::ddealer_vregs_w)
{
COMBINE_DATA(&m_vregs[offset]);
}
/******************************************************************************************************
Protection handling, identical to Hacha Mecha Fighter / Thunder Dragon with different vectors.
@ -415,7 +411,7 @@ Protection handling,identical to Hacha Mecha Fighter / Thunder Dragon with diffe
m_mcu_shared_ram[_protinput_+1] = (_input_ & 0x0000ffff);\
}
WRITE16_MEMBER(ddealer_state::ddealer_mcu_shared_w)
WRITE16_MEMBER(ddealer_state::mcu_shared_w)
{
COMBINE_DATA(&m_mcu_shared_ram[offset]);
@ -480,7 +476,7 @@ static ADDRESS_MAP_START( ddealer, AS_PROGRAM, 16, ddealer_state )
AM_RANGE(0x08000a, 0x08000b) AM_READ_PORT("UNK")
AM_RANGE(0x084000, 0x084003) AM_DEVWRITE8("ymsnd", ym2203_device, write, 0x00ff) // ym ?
AM_RANGE(0x088000, 0x0887ff) AM_RAM_DEVWRITE("palette", palette_device, write) AM_SHARE("palette")
AM_RANGE(0x08c000, 0x08cfff) AM_RAM_WRITE(ddealer_vregs_w) AM_SHARE("vregs") // palette ram
AM_RANGE(0x08c000, 0x08cfff) AM_RAM AM_SHARE("vregs") // palette ram
/* this might actually be 1 tilemap with some funky rowscroll / columnscroll enabled, I'm not sure */
AM_RANGE(0x090000, 0x090fff) AM_RAM AM_SHARE("left_fg_vratop")
@ -488,10 +484,10 @@ static ADDRESS_MAP_START( ddealer, AS_PROGRAM, 16, ddealer_state )
AM_RANGE(0x092000, 0x092fff) AM_RAM AM_SHARE("left_fg_vrabot")
AM_RANGE(0x093000, 0x093fff) AM_RAM AM_SHARE("right_fg_vrabot")
//AM_RANGE(0x094000, 0x094001) AM_NOP // always 0?
AM_RANGE(0x098000, 0x098001) AM_WRITE(ddealer_flipscreen_w)
AM_RANGE(0x098000, 0x098001) AM_WRITE(flipscreen_w)
AM_RANGE(0x09c000, 0x09cfff) AM_RAM_WRITE(back_vram_w) AM_SHARE("back_vram") // bg tilemap
AM_RANGE(0x0f0000, 0x0fdfff) AM_RAM AM_SHARE("work_ram")
AM_RANGE(0x0fe000, 0x0fefff) AM_RAM_WRITE(ddealer_mcu_shared_w) AM_SHARE("mcu_shared_ram")
AM_RANGE(0x0fe000, 0x0fefff) AM_RAM_WRITE(mcu_shared_w) AM_SHARE("mcu_shared_ram")
AM_RANGE(0x0ff000, 0x0fffff) AM_RAM
ADDRESS_MAP_END
@ -601,7 +597,6 @@ GFXDECODE_END
void ddealer_state::machine_start()
{
save_item(NAME(m_respcount));
save_item(NAME(m_flipscreen));
save_item(NAME(m_input_pressed));
save_item(NAME(m_coin_input));
}
@ -609,12 +604,11 @@ void ddealer_state::machine_start()
void ddealer_state::machine_reset()
{
m_respcount = 0;
m_flipscreen = 0;
m_input_pressed = 0;
m_coin_input = 0;
}
INTERRUPT_GEN_MEMBER(ddealer_state::ddealer_interrupt)
INTERRUPT_GEN_MEMBER(ddealer_state::interrupt)
{
device.execute().set_input_line(4, HOLD_LINE);
}
@ -623,7 +617,7 @@ static MACHINE_CONFIG_START( ddealer, ddealer_state )
MCFG_CPU_ADD("maincpu" , M68000, XTAL_16MHz/2) /* 8MHz */
MCFG_CPU_PROGRAM_MAP(ddealer)
MCFG_CPU_VBLANK_INT_DRIVER("screen", ddealer_state, ddealer_interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", ddealer_state, interrupt)
MCFG_CPU_PERIODIC_INT_DRIVER(ddealer_state, irq1_line_hold, 90)//guess, controls music tempo, 112 is way too fast
// M50747 or NMK-110 8131 MCU
@ -636,13 +630,13 @@ static MACHINE_CONFIG_START( ddealer, ddealer_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(512, 256)
MCFG_SCREEN_VISIBLE_AREA(0*8, 48*8-1, 2*8, 30*8-1)
MCFG_SCREEN_UPDATE_DRIVER(ddealer_state, screen_update_ddealer)
MCFG_SCREEN_UPDATE_DRIVER(ddealer_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_PALETTE_ADD("palette", 0x400)
MCFG_PALETTE_FORMAT(RRRRGGGGBBBBRGBx)
MCFG_TIMER_DRIVER_ADD_PERIODIC("coinsim", ddealer_state, ddealer_mcu_sim, attotime::from_hz(10000))
MCFG_TIMER_DRIVER_ADD_PERIODIC("coinsim", ddealer_state, mcu_sim, attotime::from_hz(10000))
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("ymsnd", YM2203, XTAL_6MHz / 8) /* 7.5KHz */
@ -651,7 +645,7 @@ MACHINE_CONFIG_END
READ16_MEMBER(ddealer_state::ddealer_mcu_r)
READ16_MEMBER(ddealer_state::mcu_r)
{
static const int resp[] =
{
@ -674,7 +668,7 @@ READ16_MEMBER(ddealer_state::ddealer_mcu_r)
DRIVER_INIT_MEMBER(ddealer_state,ddealer)
{
m_maincpu->space(AS_PROGRAM).install_read_handler(0xfe01c, 0xfe01d, read16_delegate(FUNC(ddealer_state::ddealer_mcu_r), this));
m_maincpu->space(AS_PROGRAM).install_read_handler(0xfe01c, 0xfe01d, read16_delegate(FUNC(ddealer_state::mcu_r), this));
}
ROM_START( ddealer )