mastboy.c, xorworld.c: added save state support (nw)

saa1099.c: added save state support (nw)
This commit is contained in:
Ivan Vangelista 2015-02-11 17:45:32 +01:00
parent f9485757a8
commit 217c569fd2
13 changed files with 181 additions and 132 deletions

View File

@ -33,8 +33,8 @@ WRITE8_MEMBER( isa8_gblaster_device::saa1099_1_16_w )
{
switch(offset)
{
case 0 : m_saa1099_1->saa1099_control_w( space, offset, data ); break;
case 1 : m_saa1099_1->saa1099_data_w( space, offset, data ); break;
case 0 : m_saa1099_1->control_w( space, offset, data ); break;
case 1 : m_saa1099_1->data_w( space, offset, data ); break;
}
}
@ -42,8 +42,8 @@ WRITE8_MEMBER( isa8_gblaster_device::saa1099_2_16_w )
{
switch(offset)
{
case 0 : m_saa1099_2->saa1099_control_w( space, offset, data ); break;
case 1 : m_saa1099_2->saa1099_data_w( space, offset, data ); break;
case 0 : m_saa1099_2->control_w( space, offset, data ); break;
case 1 : m_saa1099_2->data_w( space, offset, data ); break;
}
}

View File

@ -148,8 +148,8 @@ WRITE8_MEMBER( isa8_sblaster1_0_device::saa1099_1_16_w )
{
switch(offset)
{
case 0 : m_saa1099_1->saa1099_control_w( space, offset, data ); break;
case 1 : m_saa1099_1->saa1099_data_w( space, offset, data ); break;
case 0 : m_saa1099_1->control_w( space, offset, data ); break;
case 1 : m_saa1099_1->data_w( space, offset, data ); break;
}
}
@ -157,8 +157,8 @@ WRITE8_MEMBER( isa8_sblaster1_0_device::saa1099_2_16_w )
{
switch(offset)
{
case 0 : m_saa1099_2->saa1099_control_w( space, offset, data ); break;
case 1 : m_saa1099_2->saa1099_data_w( space, offset, data ); break;
case 0 : m_saa1099_2->control_w( space, offset, data ); break;
case 1 : m_saa1099_2->data_w( space, offset, data ); break;
}
}

View File

@ -161,6 +161,37 @@ void saa1099_device::device_start()
/* for each chip allocate one stream */
m_stream = stream_alloc(0, 2, m_sample_rate);
save_item(NAME(m_noise_params));
save_item(NAME(m_env_enable));
save_item(NAME(m_env_reverse_right));
save_item(NAME(m_env_mode));
save_item(NAME(m_env_bits));
save_item(NAME(m_env_clock));
save_item(NAME(m_env_step));
save_item(NAME(m_all_ch_enable));
save_item(NAME(m_sync_state));
save_item(NAME(m_selected_reg));
for (int i = 0; i < 6; i++)
{
save_item(NAME(m_channels[i].frequency), i);
save_item(NAME(m_channels[i].freq_enable), i);
save_item(NAME(m_channels[i].noise_enable), i);
save_item(NAME(m_channels[i].octave), i);
save_item(NAME(m_channels[i].amplitude), i);
save_item(NAME(m_channels[i].envelope), i);
save_item(NAME(m_channels[i].counter), i);
save_item(NAME(m_channels[i].freq), i);
save_item(NAME(m_channels[i].level), i);
}
for (int i = 0; i < 2; i++)
{
save_item(NAME(m_noise[i].counter), i);
save_item(NAME(m_noise[i].freq), i);
save_item(NAME(m_noise[i].level), i);
}
}
@ -217,9 +248,9 @@ void saa1099_device::sound_stream_update(sound_stream &stream, stream_sample_t *
/* eventually clock the envelope counters */
if (ch == 1 && m_env_clock[0] == 0)
saa1099_envelope(0);
envelope_w(0);
if (ch == 4 && m_env_clock[1] == 0)
saa1099_envelope(1);
envelope_w(1);
}
/* if the noise is enabled */
@ -266,7 +297,7 @@ void saa1099_device::sound_stream_update(sound_stream &stream, stream_sample_t *
}
void saa1099_device::saa1099_envelope(int ch)
void saa1099_device::envelope_w(int ch)
{
if (m_env_enable[ch])
{
@ -309,7 +340,7 @@ void saa1099_device::saa1099_envelope(int ch)
}
WRITE8_MEMBER( saa1099_device::saa1099_control_w )
WRITE8_MEMBER( saa1099_device::control_w )
{
if ((data & 0xff) > 0x1c)
{
@ -322,14 +353,14 @@ WRITE8_MEMBER( saa1099_device::saa1099_control_w )
{
/* clock the envelope channels */
if (m_env_clock[0])
saa1099_envelope(0);
envelope_w(0);
if (m_env_clock[1])
saa1099_envelope(1);
envelope_w(1);
}
}
WRITE8_MEMBER( saa1099_device::saa1099_data_w )
WRITE8_MEMBER( saa1099_device::data_w )
{
int reg = m_selected_reg;
int ch;

View File

@ -80,11 +80,11 @@ protected:
virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples);
public:
DECLARE_WRITE8_MEMBER( saa1099_control_w );
DECLARE_WRITE8_MEMBER( saa1099_data_w );
DECLARE_WRITE8_MEMBER( control_w );
DECLARE_WRITE8_MEMBER( data_w );
private:
void saa1099_envelope(int ch);
void envelope_w(int ch);
private:
sound_stream *m_stream; /* our stream */

View File

@ -526,8 +526,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( bingor_io, AS_IO, 16, bingor_state )
// AM_RANGE(0x0000, 0x00ff) AM_READ(test_r )
AM_RANGE(0x0100, 0x0101) AM_DEVWRITE8("saa", saa1099_device, saa1099_data_w, 0x00ff)
AM_RANGE(0x0102, 0x0103) AM_DEVWRITE8("saa", saa1099_device, saa1099_control_w, 0x00ff)
AM_RANGE(0x0100, 0x0101) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff)
AM_RANGE(0x0102, 0x0103) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff)
// AM_RANGE(0x0200, 0x0201) AM_READ(test_r )
ADDRESS_MAP_END

View File

@ -295,8 +295,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( 68000_awp_map_saa, AS_PROGRAM, 16, jpmsys5_state )
JPM_SYS5_COMMON_MAP
AM_RANGE(0x0460a0, 0x0460a1) AM_DEVWRITE8("saa", saa1099_device, saa1099_data_w, 0x00ff)
AM_RANGE(0x0460a2, 0x0460a3) AM_DEVWRITE8("saa", saa1099_device, saa1099_control_w, 0x00ff)
AM_RANGE(0x0460a0, 0x0460a1) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff)
AM_RANGE(0x0460a2, 0x0460a3) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff)
AM_RANGE(0x04c100, 0x04c105) AM_READWRITE(jpm_upd7759_r, jpm_upd7759_w) // do the SAA boards have the UPD?
ADDRESS_MAP_END

View File

@ -155,8 +155,8 @@ public:
static ADDRESS_MAP_START( manohman_map, AS_PROGRAM, 16, _manohman_state )
AM_RANGE(0x000000, 0x01ffff) AM_ROM
AM_RANGE(0x100000, 0x100001) AM_NOP // smell to MAX696 watchdog...
AM_RANGE(0x300000, 0x300001) AM_DEVWRITE8("saa", saa1099_device, saa1099_data_w, 0x00ff)
AM_RANGE(0x300002, 0x300003) AM_DEVWRITE8("saa", saa1099_device, saa1099_control_w, 0x00ff)
AM_RANGE(0x300000, 0x300001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff)
AM_RANGE(0x300002, 0x300003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff)
AM_RANGE(0x500000, 0x503fff) AM_RAM
AM_RANGE(0x600006, 0x600007) AM_RAM // write bitpatterns to compare with the 500000-503ff8 RAM testing.
// AM_RANGE(0xYYYYYY, 0xYYYYYY) AM_RAM

View File

@ -445,19 +445,25 @@ class mastboy_state : public driver_device
public:
mastboy_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_nvram(*this, "nvram") ,
m_workram(*this, "workram"),
m_tileram(*this, "tileram"),
m_colram(*this, "colram"),
m_maincpu(*this, "maincpu"),
m_msm(*this, "msm"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette") { }
m_palette(*this, "palette"),
m_nvram(*this, "nvram") ,
m_workram(*this, "workram"),
m_tileram(*this, "tileram"),
m_colram(*this, "colram") { }
required_shared_ptr<UINT8> m_nvram;
required_device<cpu_device> m_maincpu;
required_device<msm5205_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_nvram;
required_shared_ptr<UINT8> m_workram;
required_shared_ptr<UINT8> m_tileram;
required_shared_ptr<UINT8> m_colram;
UINT8* m_vram;
UINT8 m_bank;
int m_irq0_ack;
@ -466,29 +472,29 @@ public:
int m_m5205_part;
int m_m5205_sambit0;
int m_m5205_sambit1;
DECLARE_READ8_MEMBER(banked_ram_r);
DECLARE_WRITE8_MEMBER(banked_ram_w);
DECLARE_WRITE8_MEMBER(mastboy_bank_w);
DECLARE_READ8_MEMBER(mastboy_backupram_r);
DECLARE_WRITE8_MEMBER(mastboy_backupram_w);
DECLARE_WRITE8_MEMBER(bank_w);
DECLARE_READ8_MEMBER(backupram_r);
DECLARE_WRITE8_MEMBER(backupram_w);
DECLARE_WRITE8_MEMBER(backupram_enable_w);
DECLARE_WRITE8_MEMBER(msm5205_mastboy_m5205_sambit0_w);
DECLARE_WRITE8_MEMBER(msm5205_mastboy_m5205_sambit1_w);
DECLARE_WRITE8_MEMBER(mastboy_msm5205_data_w);
DECLARE_WRITE8_MEMBER(mastboy_irq0_ack_w);
DECLARE_READ8_MEMBER(mastboy_port_38_read);
DECLARE_READ8_MEMBER(mastboy_nmi_read);
DECLARE_WRITE8_MEMBER(mastboy_msm5205_reset_w);
DECLARE_DRIVER_INIT(mastboy);
DECLARE_WRITE8_MEMBER(msm5205_sambit0_w);
DECLARE_WRITE8_MEMBER(msm5205_sambit1_w);
DECLARE_WRITE8_MEMBER(msm5205_data_w);
DECLARE_WRITE8_MEMBER(irq0_ack_w);
DECLARE_READ8_MEMBER(port_38_read);
DECLARE_READ8_MEMBER(nmi_read);
DECLARE_WRITE8_MEMBER(msm5205_reset_w);
DECLARE_WRITE_LINE_MEMBER(adpcm_int);
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
UINT32 screen_update_mastboy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(mastboy_interrupt);
DECLARE_WRITE_LINE_MEMBER(mastboy_adpcm_int);
required_device<cpu_device> m_maincpu;
required_device<msm5205_device> m_msm;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(interrupt);
};
@ -497,9 +503,11 @@ public:
void mastboy_state::video_start()
{
m_gfxdecode->gfx(0)->set_source(m_vram);
save_pointer(NAME(m_vram), 0x10000);
}
UINT32 mastboy_state::screen_update_mastboy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
UINT32 mastboy_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
int y,x,i;
int count = 0x000;
@ -609,7 +617,7 @@ WRITE8_MEMBER(mastboy_state::banked_ram_w)
}
}
WRITE8_MEMBER(mastboy_state::mastboy_bank_w)
WRITE8_MEMBER(mastboy_state::bank_w)
{
// controls access to banked ram / rom
m_bank = data;
@ -617,12 +625,12 @@ WRITE8_MEMBER(mastboy_state::mastboy_bank_w)
/* Backup RAM access */
READ8_MEMBER(mastboy_state::mastboy_backupram_r)
READ8_MEMBER(mastboy_state::backupram_r)
{
return m_nvram[offset];
}
WRITE8_MEMBER(mastboy_state::mastboy_backupram_w)
WRITE8_MEMBER(mastboy_state::backupram_w)
{
// if (m_backupram_enabled)
// {
@ -643,7 +651,7 @@ WRITE8_MEMBER(mastboy_state::backupram_enable_w)
/* MSM5205 Related */
WRITE8_MEMBER(mastboy_state::msm5205_mastboy_m5205_sambit0_w)
WRITE8_MEMBER(mastboy_state::msm5205_sambit0_w)
{
m_m5205_sambit0 = data & 1;
m_msm->playmode_w((1 << 2) | (m_m5205_sambit1 << 1) | (m_m5205_sambit0) );
@ -651,7 +659,7 @@ WRITE8_MEMBER(mastboy_state::msm5205_mastboy_m5205_sambit0_w)
logerror("msm5205 samplerate bit 0, set to %02x\n",data);
}
WRITE8_MEMBER(mastboy_state::msm5205_mastboy_m5205_sambit1_w)
WRITE8_MEMBER(mastboy_state::msm5205_sambit1_w)
{
m_m5205_sambit1 = data & 1;
@ -660,18 +668,18 @@ WRITE8_MEMBER(mastboy_state::msm5205_mastboy_m5205_sambit1_w)
logerror("msm5205 samplerate bit 0, set to %02x\n",data);
}
WRITE8_MEMBER(mastboy_state::mastboy_msm5205_reset_w)
WRITE8_MEMBER(mastboy_state::msm5205_reset_w)
{
m_m5205_part = 0;
m_msm->reset_w(data & 1);
}
WRITE8_MEMBER(mastboy_state::mastboy_msm5205_data_w)
WRITE8_MEMBER(mastboy_state::msm5205_data_w)
{
m_m5205_next = data;
}
WRITE_LINE_MEMBER(mastboy_state::mastboy_adpcm_int)
WRITE_LINE_MEMBER(mastboy_state::adpcm_int)
{
m_msm->data_w(m_m5205_next);
m_m5205_next >>= 4;
@ -684,14 +692,14 @@ WRITE_LINE_MEMBER(mastboy_state::mastboy_adpcm_int)
/* Interrupt Handling */
WRITE8_MEMBER(mastboy_state::mastboy_irq0_ack_w)
WRITE8_MEMBER(mastboy_state::irq0_ack_w)
{
m_irq0_ack = data;
if ((data & 1) == 1)
m_maincpu->set_input_line(0, CLEAR_LINE);
}
INTERRUPT_GEN_MEMBER(mastboy_state::mastboy_interrupt)
INTERRUPT_GEN_MEMBER(mastboy_state::interrupt)
{
if ((m_irq0_ack & 1) == 1)
{
@ -711,21 +719,21 @@ static ADDRESS_MAP_START( mastboy_map, AS_PROGRAM, 8, mastboy_state )
AM_RANGE(0xc000, 0xffff) AM_READWRITE(banked_ram_r,banked_ram_w) // mastboy bank area read / write
AM_RANGE(0xff000, 0xff7ff) AM_READWRITE(mastboy_backupram_r,mastboy_backupram_w) AM_SHARE("nvram")
AM_RANGE(0xff000, 0xff7ff) AM_READWRITE(backupram_r,backupram_w) AM_SHARE("nvram")
AM_RANGE(0xff800, 0xff807) AM_READ_PORT("P1")
AM_RANGE(0xff808, 0xff80f) AM_READ_PORT("P2")
AM_RANGE(0xff810, 0xff817) AM_READ_PORT("DSW1")
AM_RANGE(0xff818, 0xff81f) AM_READ_PORT("DSW2")
AM_RANGE(0xff820, 0xff827) AM_WRITE(mastboy_bank_w)
AM_RANGE(0xff828, 0xff828) AM_DEVWRITE("saa", saa1099_device, saa1099_data_w)
AM_RANGE(0xff829, 0xff829) AM_DEVWRITE("saa", saa1099_device, saa1099_control_w)
AM_RANGE(0xff830, 0xff830) AM_WRITE(mastboy_msm5205_data_w)
AM_RANGE(0xff838, 0xff838) AM_WRITE(mastboy_irq0_ack_w)
AM_RANGE(0xff839, 0xff839) AM_WRITE(msm5205_mastboy_m5205_sambit0_w)
AM_RANGE(0xff83a, 0xff83a) AM_WRITE(msm5205_mastboy_m5205_sambit1_w)
AM_RANGE(0xff83b, 0xff83b) AM_WRITE(mastboy_msm5205_reset_w)
AM_RANGE(0xff820, 0xff827) AM_WRITE(bank_w)
AM_RANGE(0xff828, 0xff828) AM_DEVWRITE("saa", saa1099_device, data_w)
AM_RANGE(0xff829, 0xff829) AM_DEVWRITE("saa", saa1099_device, control_w)
AM_RANGE(0xff830, 0xff830) AM_WRITE(msm5205_data_w)
AM_RANGE(0xff838, 0xff838) AM_WRITE(irq0_ack_w)
AM_RANGE(0xff839, 0xff839) AM_WRITE(msm5205_sambit0_w)
AM_RANGE(0xff83a, 0xff83a) AM_WRITE(msm5205_sambit1_w)
AM_RANGE(0xff83b, 0xff83b) AM_WRITE(msm5205_reset_w)
AM_RANGE(0xff83c, 0xff83c) AM_WRITE(backupram_enable_w)
AM_RANGE(0xffc00, 0xfffff) AM_RAM // Internal RAM
@ -733,20 +741,20 @@ ADDRESS_MAP_END
/* Ports */
READ8_MEMBER(mastboy_state::mastboy_port_38_read)
READ8_MEMBER(mastboy_state::port_38_read)
{
return 0x00;
}
READ8_MEMBER(mastboy_state::mastboy_nmi_read)
READ8_MEMBER(mastboy_state::nmi_read)
{
// this is read in the NMI, it's related to the Z180 MMU I think, must return right value or game jumps to 0000
return 0x00;
}
static ADDRESS_MAP_START( mastboy_io_map, AS_IO, 8, mastboy_state )
AM_RANGE(0x38, 0x38) AM_READ(mastboy_port_38_read)
AM_RANGE(0x39, 0x39) AM_READ(mastboy_nmi_read)
AM_RANGE(0x38, 0x38) AM_READ(port_38_read)
AM_RANGE(0x39, 0x39) AM_READ(nmi_read)
ADDRESS_MAP_END
/* Input Ports */
@ -866,6 +874,19 @@ GFXDECODE_END
/* Machine Functions / Driver */
void mastboy_state::machine_start()
{
m_vram = memregion( "gfx1" )->base(); // makes decoding the RAM based tiles easier this way
save_item(NAME(m_bank));
save_item(NAME(m_irq0_ack));
save_item(NAME(m_backupram_enabled));
save_item(NAME(m_m5205_next));
save_item(NAME(m_m5205_part));
save_item(NAME(m_m5205_sambit0));
save_item(NAME(m_m5205_sambit1));
}
void mastboy_state::machine_reset()
{
/* clear some ram */
@ -885,7 +906,7 @@ static MACHINE_CONFIG_START( mastboy, mastboy_state )
MCFG_CPU_ADD("maincpu", Z180, 12000000/2) /* HD647180X0CP6-1M1R */
MCFG_CPU_PROGRAM_MAP(mastboy_map)
MCFG_CPU_IO_MAP(mastboy_io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", mastboy_state, mastboy_interrupt)
MCFG_CPU_VBLANK_INT_DRIVER("screen", mastboy_state, interrupt)
MCFG_NVRAM_ADD_1FILL("nvram")
@ -896,7 +917,7 @@ static MACHINE_CONFIG_START( mastboy, mastboy_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(256, 256)
MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
MCFG_SCREEN_UPDATE_DRIVER(mastboy_state, screen_update_mastboy)
MCFG_SCREEN_UPDATE_DRIVER(mastboy_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", mastboy)
@ -909,7 +930,7 @@ static MACHINE_CONFIG_START( mastboy, mastboy_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MCFG_SOUND_ADD("msm", MSM5205, 384000)
MCFG_MSM5205_VCLK_CB(WRITELINE(mastboy_state, mastboy_adpcm_int)) /* interrupt function */
MCFG_MSM5205_VCLK_CB(WRITELINE(mastboy_state, adpcm_int)) /* interrupt function */
MCFG_MSM5205_PRESCALER_SELECTOR(MSM5205_SEX_4B) /* 4KHz 4-bit */
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
MACHINE_CONFIG_END
@ -993,10 +1014,6 @@ ROM_START( mastboyi )
/* 0x1c0000 to 0x1fffff EMPTY */
ROM_END
DRIVER_INIT_MEMBER(mastboy_state,mastboy)
{
m_vram = memregion( "gfx1" )->base(); // makes decoding the RAM based tiles easier this way
}
GAME( 1991, mastboy, 0, mastboy, mastboy, mastboy_state, mastboy, ROT0, "Gaelco", "Master Boy (Spanish, PCB Rev A)", 0 )
GAME( 1991, mastboyi, mastboy, mastboy, mastboy, mastboy_state, mastboy, ROT0, "Gaelco", "Master Boy (Italian, PCB Rev A)", 0 )
GAME( 1991, mastboy, 0, mastboy, mastboy, driver_device, 0, ROT0, "Gaelco", "Master Boy (Spanish, PCB Rev A)", GAME_SUPPORTS_SAVE )
GAME( 1991, mastboyi, mastboy, mastboy, mastboy, driver_device, 0, ROT0, "Gaelco", "Master Boy (Italian, PCB Rev A)", GAME_SUPPORTS_SAVE )

View File

@ -1283,8 +1283,8 @@ static ADDRESS_MAP_START( mpu4_68k_map, AS_PROGRAM, 16, mpu4vid_state )
AM_RANGE(0x000000, 0x7fffff) AM_ROM
AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("vid_mainram")
// AM_RANGE(0x810000, 0x81ffff) AM_RAM /* ? */
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, saa1099_data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, saa1099_control_w, 0x00ff)
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff)
AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(ef9369_r, ef9369_w,0x00ff)
/* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */
@ -1303,8 +1303,8 @@ static ADDRESS_MAP_START( mpu4oki_68k_map, AS_PROGRAM, 16, mpu4vid_state )
AM_RANGE(0x600000, 0x63ffff) AM_RAM /* The Mating Game has an extra 256kB RAM on the program card */
// AM_RANGE(0x640000, 0x7fffff) AM_NOP /* Possible bug, reads and writes here */
AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("vid_mainram")
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, saa1099_data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, saa1099_control_w, 0x00ff)
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff)
AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(ef9369_r, ef9369_w,0x00ff)
AM_RANGE(0xb00000, 0xb0000f) AM_DEVREADWRITE8("scn2674_vid", scn2674_device, mpu4_vid_scn2674_r, mpu4_vid_scn2674_w,0x00ff)
@ -1325,8 +1325,8 @@ static ADDRESS_MAP_START( bwbvid_68k_map, AS_PROGRAM, 16, mpu4vid_state )
AM_RANGE(0x000000, 0x7fffff) AM_ROM
AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("vid_mainram")
AM_RANGE(0x810000, 0x81ffff) AM_RAM /* ? */
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, saa1099_data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, saa1099_control_w, 0x00ff)
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff)
AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(ef9369_r, ef9369_w,0x00ff)
// AM_RANGE(0xa00000, 0xa0000f) AM_READWRITE(bt471_r,bt471_w) //Some games use this
/* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */
@ -1343,8 +1343,8 @@ static ADDRESS_MAP_START( bwbvid5_68k_map, AS_PROGRAM, 16, mpu4vid_state )
AM_RANGE(0x000000, 0x7fffff) AM_ROM
AM_RANGE(0x800000, 0x80ffff) AM_RAM AM_SHARE("vid_mainram")
AM_RANGE(0x810000, 0x81ffff) AM_RAM /* ? */
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, saa1099_data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, saa1099_control_w, 0x00ff)
AM_RANGE(0x900000, 0x900001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff)
AM_RANGE(0x900002, 0x900003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff)
AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(ef9369_r, ef9369_w,0x00ff)
//AM_RANGE(0xa00000, 0xa00003) AM_READWRITE8(bt471_r,bt471_w,0x00ff) Some games use this
/* AM_RANGE(0xa00004, 0xa0000f) AM_READWRITE(mpu4_vid_unmap_r, mpu4_vid_unmap_w) */

View File

@ -62,12 +62,12 @@ WRITE16_MEMBER(xorworld_state::eeprom_data_w)
m_eeprom->di_write(data & 0x01);
}
WRITE16_MEMBER(xorworld_state::xorworld_irq2_ack_w)
WRITE16_MEMBER(xorworld_state::irq2_ack_w)
{
m_maincpu->set_input_line(2, CLEAR_LINE);
}
WRITE16_MEMBER(xorworld_state::xorworld_irq6_ack_w)
WRITE16_MEMBER(xorworld_state::irq6_ack_w)
{
m_maincpu->set_input_line(6, CLEAR_LINE);
}
@ -77,15 +77,15 @@ static ADDRESS_MAP_START( xorworld_map, AS_PROGRAM, 16, xorworld_state )
AM_RANGE(0x200000, 0x200001) AM_READ_PORT("P1")
AM_RANGE(0x400000, 0x400001) AM_READ_PORT("P2")
AM_RANGE(0x600000, 0x600001) AM_READ_PORT("DSW")
AM_RANGE(0x800000, 0x800001) AM_DEVWRITE8("saa", saa1099_device, saa1099_data_w, 0x00ff)
AM_RANGE(0x800002, 0x800003) AM_DEVWRITE8("saa", saa1099_device, saa1099_control_w, 0x00ff)
AM_RANGE(0x800000, 0x800001) AM_DEVWRITE8("saa", saa1099_device, data_w, 0x00ff)
AM_RANGE(0x800002, 0x800003) AM_DEVWRITE8("saa", saa1099_device, control_w, 0x00ff)
AM_RANGE(0xa00008, 0xa00009) AM_WRITE(eeprom_chip_select_w)
AM_RANGE(0xa0000a, 0xa0000b) AM_WRITE(eeprom_serial_clock_w)
AM_RANGE(0xa0000c, 0xa0000d) AM_WRITE(eeprom_data_w)
AM_RANGE(0xffc000, 0xffc7ff) AM_RAM_WRITE(xorworld_videoram16_w) AM_SHARE("videoram")
AM_RANGE(0xffc000, 0xffc7ff) AM_RAM_WRITE(videoram_w) AM_SHARE("videoram")
AM_RANGE(0xffc800, 0xffc87f) AM_RAM AM_SHARE("spriteram")
AM_RANGE(0xffc880, 0xffc881) AM_WRITE(xorworld_irq2_ack_w)
AM_RANGE(0xffc882, 0xffc883) AM_WRITE(xorworld_irq6_ack_w)
AM_RANGE(0xffc880, 0xffc881) AM_WRITE(irq2_ack_w)
AM_RANGE(0xffc882, 0xffc883) AM_WRITE(irq6_ack_w)
AM_RANGE(0xffc884, 0xffffff) AM_RAM
ADDRESS_MAP_END
@ -182,7 +182,7 @@ static MACHINE_CONFIG_START( xorworld, xorworld_state )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MCFG_SCREEN_UPDATE_DRIVER(xorworld_state, screen_update_xorworld)
MCFG_SCREEN_UPDATE_DRIVER(xorworld_state, screen_update)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", xorworld)
@ -235,4 +235,4 @@ DRIVER_INIT_MEMBER(xorworld_state,xorworld)
}
GAME( 1990, xorworld, 0, xorworld, xorworld, xorworld_state, xorworld, ROT0, "Gaelco", "Xor World (prototype)", 0 )
GAME( 1990, xorworld, 0, xorworld, xorworld, xorworld_state, xorworld, ROT0, "Gaelco", "Xor World (prototype)", GAME_SUPPORTS_SAVE )

View File

@ -5,30 +5,36 @@ class xorworld_state : public driver_device
public:
xorworld_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram"),
m_maincpu(*this, "maincpu"),
m_eeprom(*this, "eeprom"),
m_gfxdecode(*this, "gfxdecode"),
m_palette(*this, "palette") { }
m_palette(*this, "palette"),
m_videoram(*this, "videoram"),
m_spriteram(*this, "spriteram") { }
required_shared_ptr<UINT16> m_videoram;
tilemap_t *m_bg_tilemap;
required_shared_ptr<UINT16> m_spriteram;
DECLARE_WRITE16_MEMBER(xorworld_irq2_ack_w);
DECLARE_WRITE16_MEMBER(xorworld_irq6_ack_w);
DECLARE_WRITE16_MEMBER(xorworld_videoram16_w);
DECLARE_WRITE16_MEMBER(eeprom_chip_select_w);
DECLARE_WRITE16_MEMBER(eeprom_serial_clock_w);
DECLARE_WRITE16_MEMBER(eeprom_data_w);
DECLARE_DRIVER_INIT(xorworld);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
virtual void video_start();
DECLARE_PALETTE_INIT(xorworld);
UINT32 screen_update_xorworld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
required_device<cpu_device> m_maincpu;
required_device<eeprom_serial_93cxx_device> m_eeprom;
required_device<gfxdecode_device> m_gfxdecode;
required_device<palette_device> m_palette;
required_shared_ptr<UINT16> m_videoram;
required_shared_ptr<UINT16> m_spriteram;
tilemap_t *m_bg_tilemap;
DECLARE_WRITE16_MEMBER(irq2_ack_w);
DECLARE_WRITE16_MEMBER(irq6_ack_w);
DECLARE_WRITE16_MEMBER(videoram_w);
DECLARE_WRITE16_MEMBER(eeprom_chip_select_w);
DECLARE_WRITE16_MEMBER(eeprom_serial_clock_w);
DECLARE_WRITE16_MEMBER(eeprom_data_w);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
DECLARE_DRIVER_INIT(xorworld);
virtual void video_start();
DECLARE_PALETTE_INIT(xorworld);
UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect );
};

View File

@ -49,10 +49,9 @@ PALETTE_INIT_MEMBER(xorworld_state, xorworld)
}
}
WRITE16_MEMBER(xorworld_state::xorworld_videoram16_w)
WRITE16_MEMBER(xorworld_state::videoram_w)
{
UINT16 *videoram = m_videoram;
COMBINE_DATA(&videoram[offset]);
COMBINE_DATA(&m_videoram[offset]);
m_bg_tilemap->mark_tile_dirty(offset);
}
@ -68,8 +67,7 @@ WRITE16_MEMBER(xorworld_state::xorworld_videoram16_w)
TILE_GET_INFO_MEMBER(xorworld_state::get_bg_tile_info)
{
UINT16 *videoram = m_videoram;
int data = videoram[tile_index];
int data = m_videoram[tile_index];
int code = data & 0x0fff;
SET_TILE_INFO_MEMBER(0, code, data >> 12, 0);
@ -96,21 +94,18 @@ void xorworld_state::video_start()
void xorworld_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect )
{
UINT16 *spriteram16 = m_spriteram;
int i;
for (i = 0; i < 0x40; i += 2)
for (int i = 0; i < 0x40; i += 2)
{
int sx = spriteram16[i] & 0x00ff;
int sy = 240 - (((spriteram16[i] & 0xff00) >> 8) & 0xff);
int code = (spriteram16[i+1] & 0x0ffc) >> 2;
int color = (spriteram16[i+1] & 0xf000) >> 12;
int sx = m_spriteram[i] & 0x00ff;
int sy = 240 - (((m_spriteram[i] & 0xff00) >> 8) & 0xff);
int code = (m_spriteram[i+1] & 0x0ffc) >> 2;
int color = (m_spriteram[i+1] & 0xf000) >> 12;
m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, code, color, 0, 0, sx, sy, 0);
}
}
UINT32 xorworld_state::screen_update_xorworld(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
UINT32 xorworld_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0);
draw_sprites(bitmap, cliprect);

View File

@ -334,8 +334,8 @@ static ADDRESS_MAP_START( samcoupe_io, AS_IO, 8, samcoupe_state )
AM_RANGE(0x00fd, 0x00fd) AM_MIRROR(0xff00) AM_MASK(0xffff) AM_READWRITE(samcoupe_midi_r, samcoupe_midi_w)
AM_RANGE(0x00fe, 0x00fe) AM_MIRROR(0xff00) AM_MASK(0xffff) AM_READWRITE(samcoupe_keyboard_r, samcoupe_border_w)
AM_RANGE(0x00ff, 0x00ff) AM_MIRROR(0xff00) AM_MASK(0xffff) AM_READ(samcoupe_attributes_r)
AM_RANGE(0x00ff, 0x00ff) AM_MIRROR(0xfe00) AM_MASK(0xffff) AM_DEVWRITE("saa1099", saa1099_device, saa1099_data_w)
AM_RANGE(0x01ff, 0x01ff) AM_MIRROR(0xfe00) AM_MASK(0xffff) AM_DEVWRITE("saa1099", saa1099_device, saa1099_control_w)
AM_RANGE(0x00ff, 0x00ff) AM_MIRROR(0xfe00) AM_MASK(0xffff) AM_DEVWRITE("saa1099", saa1099_device, data_w)
AM_RANGE(0x01ff, 0x01ff) AM_MIRROR(0xfe00) AM_MASK(0xffff) AM_DEVWRITE("saa1099", saa1099_device, control_w)
ADDRESS_MAP_END