More Sega updates:

* Fully modernized X-board driver
* Misc. cleanups

New working games
-----------------
AB Cop (Japan) [ShouTime]
This commit is contained in:
Aaron Giles 2012-08-13 06:01:28 +00:00
parent af5abe6bc8
commit 3258eb6014
10 changed files with 2002 additions and 1874 deletions

View File

@ -1777,14 +1777,12 @@ DRIVER_INIT_MEMBER(segahang_state,sharrier)
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segahang_state::sharrier_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segahang_state,enduror)
{
DRIVER_INIT_CALL(generic);
m_sharrier_video = true;
}
DRIVER_INIT_MEMBER(segahang_state,endurobl)
{
DRIVER_INIT_CALL(enduror);
@ -1797,7 +1795,6 @@ DRIVER_INIT_MEMBER(segahang_state,endurobl)
m_maincpu->space(AS_PROGRAM)->set_decrypted_region(0x000000, 0x03ffff, decrypt);
}
DRIVER_INIT_MEMBER(segahang_state,endurob2)
{
DRIVER_INIT_CALL(enduror);

File diff suppressed because it is too large Load Diff

View File

@ -3483,49 +3483,49 @@ DRIVER_INIT_MEMBER(segas16a_state,generic)
DRIVER_INIT_MEMBER(segas16a_state,aceattaa)
{
init_generic();
DRIVER_INIT_CALL(generic);
m_custom_io_r = read16_delegate(FUNC(segas16a_state::aceattaa_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16a_state,dumpmtmt)
{
init_generic();
DRIVER_INIT_CALL(generic);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16a_state::dumpmtmt_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segas16a_state,mjleague)
{
init_generic();
DRIVER_INIT_CALL(generic);
m_custom_io_r = read16_delegate(FUNC(segas16a_state::mjleague_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16a_state,passsht16a)
{
init_generic();
DRIVER_INIT_CALL(generic);
m_custom_io_r = read16_delegate(FUNC(segas16a_state::passsht16a_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16a_state,quartet)
{
init_generic();
DRIVER_INIT_CALL(generic);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16a_state::quartet_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segas16a_state,fantzonep)
{
init_generic();
DRIVER_INIT_CALL(generic);
sega_315_5177_decode(machine(), "soundcpu");
}
DRIVER_INIT_MEMBER(segas16a_state,sdi)
{
init_generic();
DRIVER_INIT_CALL(generic);
m_custom_io_r = read16_delegate(FUNC(segas16a_state::sdi_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16a_state,sjryukoa)
{
init_generic();
DRIVER_INIT_CALL(generic);
m_custom_io_r = read16_delegate(FUNC(segas16a_state::sjryuko_custom_io_r), this);
m_lamp_changed_w = lamp_changed_delegate(FUNC(segas16a_state::sjryuko_lamp_changed_w), this);
}

View File

@ -6433,56 +6433,56 @@ DRIVER_INIT_MEMBER(segas16b_state,generic_korean)
DRIVER_INIT_MEMBER(segas16b_state,aceattac_5358)
{
init_generic_5358();
DRIVER_INIT_CALL(generic_5358);
m_custom_io_r = read16_delegate(FUNC(segas16b_state::aceattac_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16b_state,altbeast_5521)
{
init_generic_5521();
DRIVER_INIT_CALL(generic_5521);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16b_state::altbeast_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segas16b_state,altbeasj_5521)
{
init_generic_5521();
DRIVER_INIT_CALL(generic_5521);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16b_state::altbeasj_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segas16b_state,altbeas5_5521)
{
init_generic_5521();
DRIVER_INIT_CALL(generic_5521);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16b_state::altbeas5_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segas16b_state,altbeas4_5521)
{
init_generic_5521();
DRIVER_INIT_CALL(generic_5521);
mc8123_decrypt_rom(machine(), "soundcpu", "mcu", NULL, 0);
}
DRIVER_INIT_MEMBER(segas16b_state,ddux_5704)
{
init_generic_5704();
DRIVER_INIT_CALL(generic_5704);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16b_state::ddux_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segas16b_state,dunkshot_5358_small)
{
init_generic_5358_small();
DRIVER_INIT_CALL(generic_5358_small);
m_custom_io_r = read16_delegate(FUNC(segas16b_state::dunkshot_custom_io_r), this);
m_tilemap_type = SEGAIC16_TILEMAP_16B_ALT;
}
DRIVER_INIT_MEMBER(segas16b_state,exctleag_5358)
{
init_generic_5358();
DRIVER_INIT_CALL(generic_5358);
m_custom_io_r = read16_delegate(FUNC(segas16b_state::sdi_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16b_state,goldnaxe_5704)
{
init_generic_5704();
DRIVER_INIT_CALL(generic_5704);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16b_state::goldnaxe_i8751_sim), this);
static const UINT8 memory_control_5704[0x10] =
@ -6492,7 +6492,7 @@ DRIVER_INIT_MEMBER(segas16b_state,goldnaxe_5704)
DRIVER_INIT_MEMBER(segas16b_state,goldnaxe_5797)
{
init_generic_5797();
DRIVER_INIT_CALL(generic_5797);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16b_state::goldnaxe_i8751_sim), this);
static const UINT8 memory_control_5797[0x10] =
@ -6502,44 +6502,44 @@ DRIVER_INIT_MEMBER(segas16b_state,goldnaxe_5797)
DRIVER_INIT_MEMBER(segas16b_state,hwchamp_5521)
{
init_generic_5521();
DRIVER_INIT_CALL(generic_5521);
m_custom_io_r = read16_delegate(FUNC(segas16b_state::hwchamp_custom_io_r), this);
m_custom_io_w = write16_delegate(FUNC(segas16b_state::hwchamp_custom_io_w), this);
}
DRIVER_INIT_MEMBER(segas16b_state,passshtj_5358)
{
init_generic_5358();
DRIVER_INIT_CALL(generic_5358);
m_custom_io_r = read16_delegate(FUNC(segas16b_state::passshtj_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16b_state,sdi_5358_small)
{
init_generic_5358_small();
DRIVER_INIT_CALL(generic_5358_small);
m_custom_io_r = read16_delegate(FUNC(segas16b_state::sdi_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16b_state,defense_5358_small)
{
init_generic_5358_small();
DRIVER_INIT_CALL(generic_5358_small);
m_custom_io_r = read16_delegate(FUNC(segas16b_state::sdi_custom_io_r), this);
}
DRIVER_INIT_MEMBER(segas16b_state,shinobi4_5521)
{
init_generic_5521();
DRIVER_INIT_CALL(generic_5521);
mc8123_decrypt_rom(machine(), "soundcpu", "mcu", NULL, 0);
}
DRIVER_INIT_MEMBER(segas16b_state,shinobi3_5358)
{
init_generic_5358();
DRIVER_INIT_CALL(generic_5358);
mc8123_decrypt_rom(machine(), "soundcpu", "mcu", NULL, 0);
}
DRIVER_INIT_MEMBER(segas16b_state,sjryuko_5358_small)
{
init_generic_5358_small();
DRIVER_INIT_CALL(generic_5358_small);
m_custom_io_r = read16_delegate(FUNC(segas16b_state::sjryuko_custom_io_r), this);
m_custom_io_w = write16_delegate(FUNC(segas16b_state::sjryuko_custom_io_w), this);
m_tilemap_type = SEGAIC16_TILEMAP_16B_ALT;
@ -6547,24 +6547,25 @@ DRIVER_INIT_MEMBER(segas16b_state,sjryuko_5358_small)
DRIVER_INIT_MEMBER(segas16b_state,timescan_5358_small)
{
init_generic_5358_small();
DRIVER_INIT_CALL(generic_5358_small);
m_tilemap_type = SEGAIC16_TILEMAP_16B_ALT;
}
DRIVER_INIT_MEMBER(segas16b_state,tturf_5704)
{
init_generic_5704();
DRIVER_INIT_CALL(generic_5704);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16b_state::tturf_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segas16b_state,wb3_5704)
{
init_generic_5704();
DRIVER_INIT_CALL(generic_5704);
m_i8751_vblank_hook = i8751_sim_delegate(FUNC(segas16b_state::wb3_i8751_sim), this);
}
DRIVER_INIT_MEMBER(segas16b_state,snapper)
{
init_generic_korean();
DRIVER_INIT_CALL(generic_korean);
m_atomicp_sound_divisor = 4;
}
@ -7127,7 +7128,7 @@ MACHINE_CONFIG_END
DRIVER_INIT_MEMBER(isgsm_state,isgsm)
{
init_generic_5521();
DRIVER_INIT_CALL(generic_5521);
// decrypt the bios...
dynamic_array<UINT16> temp(0x20000/2);

File diff suppressed because it is too large Load Diff

View File

@ -59,43 +59,41 @@ public:
m_nvram(*this, "nvram"),
m_workram(*this, "workram"),
m_custom_map(NULL),
m_is_shangon(false),
m_shangon_video(false),
m_scanline_timer(NULL),
m_irq2_state(0),
m_adc_select(0),
m_vblank_irq_state(0)
{ }
// driver init
DECLARE_DRIVER_INIT(outrunb);
DECLARE_DRIVER_INIT(shangon);
DECLARE_DRIVER_INIT(outrun);
DECLARE_DRIVER_INIT(shangon3);
// memory mapping
void memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 index);
UINT8 mapper_sound_r();
void mapper_sound_w(UINT8 data);
// read/write handlers
DECLARE_READ16_MEMBER( misc_io_r );
DECLARE_WRITE16_MEMBER( misc_io_w );
DECLARE_WRITE16_MEMBER( nop_w );
// PPI read/write handlers
DECLARE_READ8_MEMBER( unknown_porta_r );
DECLARE_READ8_MEMBER( unknown_portb_r );
DECLARE_READ8_MEMBER( unknown_portc_r );
DECLARE_WRITE8_MEMBER( unknown_porta_w );
DECLARE_WRITE8_MEMBER( unknown_portb_w );
DECLARE_WRITE8_MEMBER( video_control_w );
// memory mapping
void memory_mapper(sega_315_5195_mapper_device &mapper, UINT8 index);
UINT8 mapper_sound_r();
void mapper_sound_w(UINT8 data);
// main CPU read/write handlers
DECLARE_READ16_MEMBER( misc_io_r );
DECLARE_WRITE16_MEMBER( misc_io_w );
DECLARE_WRITE16_MEMBER( nop_w );
// Z80 sound CPU read/write handlers
DECLARE_READ8_MEMBER( sound_data_r );
// custom I/O
DECLARE_READ16_MEMBER( outrun_custom_io_r );
DECLARE_WRITE16_MEMBER( outrun_custom_io_w );
DECLARE_READ16_MEMBER( shangon_custom_io_r );
DECLARE_WRITE16_MEMBER( shangon_custom_io_w );
// game-specific driver init
DECLARE_DRIVER_INIT(generic);
DECLARE_DRIVER_INIT(outrun);
DECLARE_DRIVER_INIT(outrunb);
DECLARE_DRIVER_INIT(shangon);
// video rendering
// video updates
UINT32 screen_update_outrun(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_shangon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@ -115,15 +113,19 @@ protected:
};
// device overrides
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
// internal helpers
void init_generic();
void update_main_irqs();
static void m68k_reset_callback(device_t *device);
// custom I/O
DECLARE_READ16_MEMBER( outrun_custom_io_r );
DECLARE_WRITE16_MEMBER( outrun_custom_io_w );
DECLARE_READ16_MEMBER( shangon_custom_io_r );
DECLARE_WRITE16_MEMBER( shangon_custom_io_w );
// devices
required_device<sega_315_5195_mapper_device> m_mapper;
@ -140,7 +142,7 @@ protected:
read16_delegate m_custom_io_r;
write16_delegate m_custom_io_w;
const UINT8 * m_custom_map;
bool m_is_shangon;
bool m_shangon_video;
// internal state
emu_timer * m_scanline_timer;

View File

@ -57,22 +57,86 @@ public:
m_mcu(*this, "mcu"),
m_cmptimer_1(*this, "cmptimer_main"),
m_gprider_hack(false),
m_road_priority(1),
m_scanline_timer(NULL),
m_timer_irq_state(0),
m_vblank_irq_state(0),
m_road_priority(0),
m_loffire_sync(NULL),
m_lastsurv_mux(0)
{
memset(m_adc_reverse, 0, sizeof(m_adc_reverse));
memset(m_iochip_custom_io_r, 0, sizeof(m_iochip_custom_io_r));
memset(m_iochip_custom_io_w, 0, sizeof(m_iochip_custom_io_w));
memset(m_iochip_regs, 0, sizeof(m_iochip_regs));
}
//protected:
// internal helpers
void sound_data_w(UINT8 data);
// compare/timer chip callbacks
void timer_ack_callback();
void sound_data_w(UINT8 data);
// YM2151 chip callbacks
WRITE_LINE_MEMBER( sound_cpu_irq );
// main CPU read/write handlers
READ16_MEMBER( adc_r );
WRITE16_MEMBER( adc_w );
UINT16 iochip_r(int which, int port, int inputval);
READ16_MEMBER( iochip_0_r );
WRITE16_MEMBER( iochip_0_w );
READ16_MEMBER( iochip_1_r );
WRITE16_MEMBER( iochip_1_w );
WRITE16_MEMBER( iocontrol_w );
// game-specific main CPU read/write handlers
WRITE16_MEMBER( loffire_sync0_w );
READ16_MEMBER( rascot_excs_r );
WRITE16_MEMBER( rascot_excs_w );
READ16_MEMBER( smgp_excs_r );
WRITE16_MEMBER( smgp_excs_w );
// sound Z80 CPU read/write handlers
READ8_MEMBER( sound_data_r );
// game-specific driver init
DECLARE_DRIVER_INIT(generic);
DECLARE_DRIVER_INIT(aburner2);
DECLARE_DRIVER_INIT(lastsurv);
DECLARE_DRIVER_INIT(loffire);
DECLARE_DRIVER_INIT(smgp);
DECLARE_DRIVER_INIT(rascot);
DECLARE_DRIVER_INIT(gprider);
// video updates
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
protected:
// internal types
typedef delegate<UINT8 (UINT8)> ioread_delegate;
typedef delegate<void (UINT8)> iowrite_delegate;
// timer IDs
enum
{
TID_SCANLINE,
TID_IRQ2_GEN,
TID_SOUND_WRITE
};
// device overrides
virtual void machine_reset();
virtual void video_start();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
// internal helpers
void update_main_irqs();
static void m68k_reset_callback(device_t *device);
// custom I/O
void generic_iochip0_lamps_w(UINT8 data);
UINT8 aburner2_iochip0_motor_r(UINT8 data);
void aburner2_iochip0_motor_w(UINT8 data);
UINT8 smgp_iochip0_motor_r(UINT8 data);
void smgp_iochip0_motor_w(UINT8 data);
UINT8 lastsurv_iochip1_port_r(UINT8 data);
void lastsurv_iochip0_muxer_w(UINT8 data);
// devices
required_device<m68000_device> m_maincpu;
@ -85,30 +149,17 @@ public:
// configuration
bool m_gprider_hack;
bool m_adc_reverse[8];
UINT8 (*m_iochip_custom_io_r[2][8])(running_machine &machine, UINT8 data);
void (*m_iochip_custom_io_w[2][8])(running_machine &machine, UINT8 data);
ioread_delegate m_iochip_custom_io_r[2][8];
iowrite_delegate m_iochip_custom_io_w[2][8];
UINT8 m_road_priority;
// internal state
emu_timer * m_scanline_timer;
UINT8 m_timer_irq_state;
UINT8 m_vblank_irq_state;
UINT8 m_iochip_regs[2][8];
UINT8 m_road_priority;
// game-specific state
UINT16 * m_loffire_sync;
UINT8 m_lastsurv_mux;
DECLARE_DRIVER_INIT(generic_xboard);
DECLARE_DRIVER_INIT(loffire);
DECLARE_DRIVER_INIT(smgp);
DECLARE_DRIVER_INIT(aburner2);
DECLARE_DRIVER_INIT(gprider);
DECLARE_DRIVER_INIT(rascot);
DECLARE_DRIVER_INIT(lastsurv);
};
/*----------- defined in video/segaxbd.c -----------*/
VIDEO_START( xboard );
SCREEN_UPDATE_IND16( xboard );

View File

@ -4356,11 +4356,10 @@ loffireu // 1990.04 Line of Fire (US, FD1094, decrypted)
// 1990.03 Racing Hero (Japan)
rachero // 1990.?? Racing Hero (World, FD1094, decrypted)
abcop // 1990.?? A.B.Cop (World, FD1094, decrypted)
// 1991.01 A.B.Cop (Japan)
// 1990.10 GP Rider (Japan)
abcopj // 1991.01 A.B.Cop (Japan, FD1094, decrypted)
gpriderj // 1990.10 GP Rider (Japan, FD1094, decrypted)
gprider // 1990.?? GP Rider (World, FD1094, decrypted)
gprideru // 1990.12 GP Rider (US, FD1094, decrypted)
gpriderj // 1990.12 GP Rider (Japan, FD1094, decrypted)
rascot // 1991.?? Royal Ascot (Japan)

View File

@ -49,7 +49,7 @@ void segaorun_state::video_start()
// compute palette info
segaic16_palette_init(0x1000);
if (m_is_shangon)
if (m_shangon_video)
{
// initialize the tile/text layers
segaic16_tilemap_init(machine(), 0, SEGAIC16_TILEMAP_16B_ALT, 0x000, 0, 2);

View File

@ -39,67 +39,62 @@
#include "includes/segaxbd.h"
/*************************************
*
* Video startup
*
*************************************/
//**************************************************************************
// VIDEO STARTUP
//**************************************************************************
VIDEO_START( xboard )
void segaxbd_state::video_start()
{
/* compute palette info */
// compute palette info
segaic16_palette_init(0x2000);
/* initialize the tile/text layers */
segaic16_tilemap_init(machine, 0, SEGAIC16_TILEMAP_16B, 0x1c00, 0, 2);
// initialize the tile/text layers
segaic16_tilemap_init(machine(), 0, SEGAIC16_TILEMAP_16B, 0x1c00, 0, 2);
/* initialize the road */
segaic16_road_init(machine, 0, SEGAIC16_ROAD_XBOARD, 0x1700, 0x1720, 0x1780, -166);
// initialize the road
segaic16_road_init(machine(), 0, SEGAIC16_ROAD_XBOARD, 0x1700, 0x1720, 0x1780, -166);
}
/*************************************
*
* Video update
*
*************************************/
SCREEN_UPDATE_IND16( xboard )
//**************************************************************************
// VIDEO STARTUP
//**************************************************************************
UINT32 segaxbd_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
segaxbd_state *state = screen.machine().driver_data<segaxbd_state>();
/* if no drawing is happening, fill with black and get out */
// if no drawing is happening, fill with black and get out
if (!segaic16_display_enable)
{
bitmap.fill(get_black_pen(screen.machine()), cliprect);
bitmap.fill(get_black_pen(machine()), cliprect);
return 0;
}
/* reset priorities */
screen.machine().priority_bitmap.fill(0, cliprect);
// reset priorities
machine().priority_bitmap.fill(0, cliprect);
/* draw the low priority road layer */
// draw the low priority road layer
segaic16_road_draw(0, bitmap, cliprect, SEGAIC16_ROAD_BACKGROUND);
if (state->m_road_priority == 0)
if (m_road_priority == 0)
segaic16_road_draw(0, bitmap, cliprect, SEGAIC16_ROAD_FOREGROUND);
/* draw background */
// draw background
segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 0, 0x01);
segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_BACKGROUND, 1, 0x02);
/* draw foreground */
// draw foreground
segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_FOREGROUND, 0, 0x02);
segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_FOREGROUND, 1, 0x04);
/* draw the high priority road */
if (state->m_road_priority == 1)
// draw the high priority road
if (m_road_priority == 1)
segaic16_road_draw(0, bitmap, cliprect, SEGAIC16_ROAD_FOREGROUND);
/* text layer */
// text layer
segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_TEXT, 0, 0x04);
segaic16_tilemap_draw(screen, bitmap, cliprect, 0, SEGAIC16_TILEMAP_TEXT, 1, 0x08);
/* draw the sprites */
// draw the sprites
segaic16_sprites_draw(screen, bitmap, cliprect, 0);
return 0;
}