Fix remainder of this == NULL checks from Tafoids run

This commit is contained in:
mooglyguy 2015-11-20 17:15:30 +01:00 committed by Miodrag Milanovic
parent 88faee7d26
commit 177eaa4208
16 changed files with 328 additions and 240 deletions

View File

@ -184,15 +184,18 @@ public:
m_e90_pal(*this,"e90pal"), m_e90_pal(*this,"e90pal"),
m_dip_read_offset(0) { } m_dip_read_offset(0) { }
optional_shared_ptr<UINT32> m_e90_vram;
optional_shared_ptr<UINT32> m_e90_pal;
DECLARE_DRIVER_INIT(aleck64); DECLARE_DRIVER_INIT(aleck64);
DECLARE_WRITE32_MEMBER(aleck_dips_w); DECLARE_WRITE32_MEMBER(aleck_dips_w);
DECLARE_READ32_MEMBER(aleck_dips_r); DECLARE_READ32_MEMBER(aleck_dips_r);
DECLARE_READ16_MEMBER(e90_prot_r); DECLARE_READ16_MEMBER(e90_prot_r);
DECLARE_WRITE16_MEMBER(e90_prot_w); DECLARE_WRITE16_MEMBER(e90_prot_w);
UINT32 screen_update_e90(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update_e90(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
optional_shared_ptr<UINT32> m_e90_vram;
optional_shared_ptr<UINT32> m_e90_pal;
private: private:
UINT32 m_dip_read_offset; UINT32 m_dip_read_offset;
}; };

View File

@ -62,7 +62,10 @@ class arcadia_amiga_state : public amiga_state
{ {
public: public:
arcadia_amiga_state(const machine_config &mconfig, device_type type, const char *tag) arcadia_amiga_state(const machine_config &mconfig, device_type type, const char *tag)
: amiga_state(mconfig, type, tag) { } : amiga_state(mconfig, type, tag)
, m_bios_region(*this, "user2")
{
}
UINT8 m_coin_counter[2]; UINT8 m_coin_counter[2];
@ -91,6 +94,10 @@ public:
protected: protected:
virtual void machine_reset() override; virtual void machine_reset() override;
optional_memory_region m_bios_region;
UINT8 m_coin_counter[2];
}; };
@ -922,12 +929,16 @@ DRIVER_INIT_MEMBER( arcadia_amiga_state, arcadia )
m_agnus_id = AGNUS_HR_NTSC; m_agnus_id = AGNUS_HR_NTSC;
m_denise_id = DENISE; m_denise_id = DENISE;
/* OnePlay bios is encrypted, TenPlay is not */ if (m_bios_region != NULL)
UINT16 *biosrom = (UINT16 *)memregion("user2")->base(); {
/* OnePlay bios is encrypted, TenPlay is not */
UINT16 *rom = (UINT16 *)m_bios_region->base();
if (biosrom) if (rom[0] != 0x4afc)
if (biosrom[0] != 0x4afc) {
generic_decode("user2", 6, 1, 0, 2, 3, 4, 5, 7); generic_decode("user2", 6, 1, 0, 2, 3, 4, 5, 7);
}
}
} }

View File

@ -334,8 +334,10 @@ DEVICE_IMAGE_LOAD_MEMBER(n64_mess_state,n64_cart)
//printf("Loading\n"); //printf("Loading\n");
UINT8 data[0x30800]; UINT8 data[0x30800];
battery_image->battery_load(data, 0x30800, 0x00); battery_image->battery_load(data, 0x30800, 0x00);
//memcpy(n64_sram, data, 0x20000); if (m_sram != NULL)
memcpy(memshare("sram")->ptr(), data, 0x20000); {
memcpy(m_sram, data, 0x20000);
}
memcpy(periphs->m_save_data.eeprom, data + 0x20000, 0x800); memcpy(periphs->m_save_data.eeprom, data + 0x20000, 0x800);
memcpy(periphs->m_save_data.mempak[0], data + 0x20800, 0x8000); memcpy(periphs->m_save_data.mempak[0], data + 0x20800, 0x8000);
memcpy(periphs->m_save_data.mempak[1], data + 0x28800, 0x8000); memcpy(periphs->m_save_data.mempak[1], data + 0x28800, 0x8000);

View File

@ -172,36 +172,50 @@ TODO:
SAMPLES_START_CB_MEMBER(ninjakd2_state::ninjakd2_init_samples) SAMPLES_START_CB_MEMBER(ninjakd2_state::ninjakd2_init_samples)
{ {
const UINT8* const rom = memregion("pcm")->base(); if (m_pcm_region == NULL)
const int length = memregion("pcm")->bytes(); {
return;
}
const UINT8* const rom = m_pcm_region->base();
const int length = m_pcm_region->bytes();
INT16* sampledata = auto_alloc_array(machine(), INT16, length); INT16* sampledata = auto_alloc_array(machine(), INT16, length);
// convert unsigned 8-bit PCM to signed 16-bit // convert unsigned 8-bit PCM to signed 16-bit
for (int i = 0; i < length; ++i) for (int i = 0; i < length; ++i)
{
sampledata[i] = rom[i] << 7; sampledata[i] = rom[i] << 7;
}
m_sampledata = sampledata; m_sampledata = sampledata;
} }
WRITE8_MEMBER(ninjakd2_state::ninjakd2_pcm_play_w) WRITE8_MEMBER(ninjakd2_state::ninjakd2_pcm_play_w)
{ {
const UINT8* const rom = memregion("pcm")->base();
// only Ninja Kid II uses this // only Ninja Kid II uses this
if (rom) if (m_pcm_region == NULL)
{ {
const int length = memregion("pcm")->bytes(); return;
const int start = data << 8; }
// find end of sample const UINT8* const rom = m_pcm_region->base();
int end = start; const int length = m_pcm_region->bytes();
while (end < length && rom[end] != 0x00) const int start = data << 8;
++end;
if (end - start) // find end of sample
m_pcm->start_raw(0, &m_sampledata[start], end - start, NE555_FREQUENCY); int end = start;
else while (end < length && rom[end] != 0x00)
m_pcm->stop(0); {
++end;
}
if (end - start)
{
m_pcm->start_raw(0, &m_sampledata[start], end - start, NE555_FREQUENCY);
}
else
{
m_pcm->stop(0);
} }
} }
@ -453,6 +467,13 @@ static ADDRESS_MAP_START( ninjakd2_sound_cpu, AS_PROGRAM, 8, ninjakd2_state )
AM_RANGE(0xf000, 0xf000) AM_WRITE(ninjakd2_pcm_play_w) AM_RANGE(0xf000, 0xf000) AM_WRITE(ninjakd2_pcm_play_w)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( ninjakid_nopcm_sound_cpu, AS_PROGRAM, 8, ninjakd2_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_RAM
AM_RANGE(0xe000, 0xe000) AM_READ(soundlatch_byte_r)
AM_RANGE(0xf000, 0xf000) AM_NOP
ADDRESS_MAP_END
static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, ninjakd2_state ) static ADDRESS_MAP_START( decrypted_opcodes_map, AS_DECRYPTED_OPCODES, 8, ninjakd2_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes") AM_RANGE(0x0000, 0x7fff) AM_ROM AM_SHARE("decrypted_opcodes")
@ -972,6 +993,9 @@ static MACHINE_CONFIG_DERIVED( mnight, ninjakd2_core )
MCFG_CPU_MODIFY("maincpu") MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(mnight_main_cpu) MCFG_CPU_PROGRAM_MAP(mnight_main_cpu)
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_PROGRAM_MAP(ninjakid_nopcm_sound_cpu)
/* video hardware */ /* video hardware */
MCFG_VIDEO_START_OVERRIDE(ninjakd2_state,mnight) MCFG_VIDEO_START_OVERRIDE(ninjakd2_state,mnight)
@ -980,11 +1004,13 @@ static MACHINE_CONFIG_DERIVED( mnight, ninjakd2_core )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( arkarea, ninjakd2_core ) static MACHINE_CONFIG_DERIVED( arkarea, ninjakd2_core )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_MODIFY("maincpu") MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(mnight_main_cpu) MCFG_CPU_PROGRAM_MAP(mnight_main_cpu)
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_PROGRAM_MAP(ninjakid_nopcm_sound_cpu)
/* video hardware */ /* video hardware */
MCFG_VIDEO_START_OVERRIDE(ninjakd2_state,arkarea) MCFG_VIDEO_START_OVERRIDE(ninjakd2_state,arkarea)
@ -998,6 +1024,9 @@ static MACHINE_CONFIG_DERIVED( robokid, mnight )
MCFG_CPU_MODIFY("maincpu") MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(robokid_main_cpu) MCFG_CPU_PROGRAM_MAP(robokid_main_cpu)
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_PROGRAM_MAP(ninjakid_nopcm_sound_cpu)
/* video hardware */ /* video hardware */
MCFG_GFXDECODE_MODIFY("gfxdecode", robokid) MCFG_GFXDECODE_MODIFY("gfxdecode", robokid)
MCFG_PALETTE_MODIFY("palette") MCFG_PALETTE_MODIFY("palette")
@ -1016,6 +1045,9 @@ static MACHINE_CONFIG_DERIVED( omegaf, robokid )
MCFG_CPU_MODIFY("maincpu") MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(omegaf_main_cpu) MCFG_CPU_PROGRAM_MAP(omegaf_main_cpu)
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_PROGRAM_MAP(ninjakid_nopcm_sound_cpu)
MCFG_MACHINE_START_OVERRIDE(ninjakd2_state,omegaf) MCFG_MACHINE_START_OVERRIDE(ninjakd2_state,omegaf)
MCFG_MACHINE_RESET_OVERRIDE(ninjakd2_state,omegaf) MCFG_MACHINE_RESET_OVERRIDE(ninjakd2_state,omegaf)

View File

@ -625,9 +625,15 @@ void prestige_state::machine_start()
m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str()); m_cart_rom = memregion(region_tag.assign(m_cart->tag()).append(GENERIC_ROM_REGION_TAG).c_str());
UINT8 *rom = memregion("maincpu")->base(); UINT8 *rom = memregion("maincpu")->base();
UINT8 *cart = m_cart_rom->base(); UINT8 *cart = NULL;
if (cart == nullptr) if (m_cart_rom != NULL)
{
cart = m_cart_rom->base();
}
else
{
cart = rom + 0x40000; // internal ROM also includes extra contents that are activated by a cartridge that works as a jumper cart = rom + 0x40000; // internal ROM also includes extra contents that are activated by a cartridge that works as a jumper
}
UINT8 *ram = m_ram->pointer(); UINT8 *ram = m_ram->pointer();
memset(ram, 0x00, m_ram->size()); memset(ram, 0x00, m_ram->size());

View File

@ -988,6 +988,13 @@ static ADDRESS_MAP_START( sound_portmap, AS_IO, 8, segas16a_state )
AM_RANGE(0xc0, 0xc0) AM_MIRROR(0x3f) AM_READ(sound_data_r) AM_RANGE(0xc0, 0xc0) AM_MIRROR(0x3f) AM_READ(sound_data_r)
ADDRESS_MAP_END ADDRESS_MAP_END
static ADDRESS_MAP_START( sound_no7751_portmap, AS_IO, 8, segas16a_state )
ADDRESS_MAP_UNMAP_HIGH
ADDRESS_MAP_GLOBAL_MASK(0xff)
AM_RANGE(0x00, 0x01) AM_MIRROR(0x3e) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write)
AM_RANGE(0x80, 0x80) AM_MIRROR(0x3f) AM_NOP
AM_RANGE(0xc0, 0xc0) AM_MIRROR(0x3f) AM_READ(sound_data_r)
ADDRESS_MAP_END
//************************************************************************** //**************************************************************************
@ -1964,6 +1971,9 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( system16a_no7751, system16a ) static MACHINE_CONFIG_DERIVED( system16a_no7751, system16a )
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_IO_MAP(sound_no7751_portmap)
MCFG_DEVICE_REMOVE("n7751") MCFG_DEVICE_REMOVE("n7751")
MCFG_DEVICE_REMOVE("dac") MCFG_DEVICE_REMOVE("dac")
@ -1987,6 +1997,9 @@ MACHINE_CONFIG_END
*/ */
static MACHINE_CONFIG_DERIVED( system16a_fd1089a_no7751, system16a_fd1089a ) static MACHINE_CONFIG_DERIVED( system16a_fd1089a_no7751, system16a_fd1089a )
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_IO_MAP(sound_no7751_portmap)
MCFG_DEVICE_REMOVE("n7751") MCFG_DEVICE_REMOVE("n7751")
MCFG_DEVICE_REMOVE("dac") MCFG_DEVICE_REMOVE("dac")
@ -1995,6 +2008,9 @@ static MACHINE_CONFIG_DERIVED( system16a_fd1089a_no7751, system16a_fd1089a )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( system16a_fd1089b_no7751, system16a_fd1089b ) static MACHINE_CONFIG_DERIVED( system16a_fd1089b_no7751, system16a_fd1089b )
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_IO_MAP(sound_no7751_portmap)
MCFG_DEVICE_REMOVE("n7751") MCFG_DEVICE_REMOVE("n7751")
MCFG_DEVICE_REMOVE("dac") MCFG_DEVICE_REMOVE("dac")
@ -2003,6 +2019,9 @@ static MACHINE_CONFIG_DERIVED( system16a_fd1089b_no7751, system16a_fd1089b )
MACHINE_CONFIG_END MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( system16a_fd1094_no7751, system16a_fd1094 ) static MACHINE_CONFIG_DERIVED( system16a_fd1094_no7751, system16a_fd1094 )
MCFG_CPU_MODIFY("soundcpu")
MCFG_CPU_IO_MAP(sound_no7751_portmap)
MCFG_DEVICE_REMOVE("n7751") MCFG_DEVICE_REMOVE("n7751")
MCFG_DEVICE_REMOVE("dac") MCFG_DEVICE_REMOVE("dac")

View File

@ -4,10 +4,9 @@
#define _INCLUDES_N64_H_ #define _INCLUDES_N64_H_
#include "cpu/rsp/rsp.h" #include "cpu/rsp/rsp.h"
#include "cpu/mips/mips3.h"
#include "sound/dmadac.h" #include "sound/dmadac.h"
/*----------- forward decls -----------*/
/*----------- driver state -----------*/ /*----------- driver state -----------*/
class n64_rdp; class n64_rdp;
@ -16,8 +15,15 @@ class n64_state : public driver_device
{ {
public: public:
n64_state(const machine_config &mconfig, device_type type, const char *tag) n64_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) , : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu") { } , m_vr4300(*this, "maincpu")
, m_rsp(*this, "rsp")
, m_sram(*this, "sram")
, m_rdram(*this, "rdram")
, m_rsp_imem(*this, "rsp_imem")
, m_rsp_dmem(*this, "rsp_dmem")
{
}
/* video-related */ /* video-related */
n64_rdp *m_rdp; n64_rdp *m_rdp;
@ -29,7 +35,25 @@ public:
UINT32 screen_update_n64(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); UINT32 screen_update_n64(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_eof_n64(screen_device &screen, bool state); void screen_eof_n64(screen_device &screen, bool state);
required_device<cpu_device> m_maincpu;
// Getters
n64_rdp* rdp() { return m_rdp; }
UINT32* rdram() { return m_rdram; }
UINT32* sram() { return m_sram; }
UINT32* rsp_imem() { return m_rsp_imem; }
UINT32* rsp_dmem() { return m_rsp_dmem; }
protected:
required_device<mips3_device> m_vr4300;
required_device<rsp_device> m_rsp;
optional_shared_ptr<UINT32> m_sram;
required_shared_ptr<UINT32> m_rdram;
required_shared_ptr<UINT32> m_rsp_imem;
required_shared_ptr<UINT32> m_rsp_dmem;
/* video-related */
n64_rdp *m_rdp;
}; };
/*----------- devices -----------*/ /*----------- devices -----------*/
@ -98,7 +122,6 @@ public:
void ai_timer_tick(); void ai_timer_tick();
void pi_dma_tick(); void pi_dma_tick();
void si_dma_tick(); void si_dma_tick();
void vi_scanline_tick();
void reset_tick(); void reset_tick();
void video_update(bitmap_rgb32 &bitmap); void video_update(bitmap_rgb32 &bitmap);
@ -137,15 +160,22 @@ public:
void poll_reset_button(bool button); void poll_reset_button(bool button);
UINT32 dp_clock; UINT32 dp_clock;
protected: protected:
// device-level overrides // device-level overrides
virtual void device_start() override; virtual void device_start() override;
virtual void device_reset() override; virtual void device_reset() override;
private: private:
address_space *mem_map; n64_state* m_n64;
device_t *maincpu; address_space *m_mem_map;
device_t *rspcpu; mips3_device *m_vr4300;
rsp_device *m_rsp;
UINT32 *m_rdram;
UINT32 *m_sram;
UINT32 *m_rsp_imem;
UINT32 *m_rsp_dmem;
void clear_rcp_interrupt(int interrupt); void clear_rcp_interrupt(int interrupt);
@ -370,13 +400,6 @@ const unsigned int ddStartOffset[16] =
{0x0,0x5F15E0,0xB79D00,0x10801A0,0x1523720,0x1963D80,0x1D414C0,0x20BBCE0, {0x0,0x5F15E0,0xB79D00,0x10801A0,0x1523720,0x1963D80,0x1D414C0,0x20BBCE0,
0x23196E0,0x28A1E00,0x2DF5DC0,0x3299340,0x36D99A0,0x3AB70E0,0x3E31900,0x4149200}; 0x23196E0,0x28A1E00,0x2DF5DC0,0x3299340,0x36D99A0,0x3AB70E0,0x3E31900,0x4149200};
extern UINT32 *n64_sram;
extern UINT32 *rdram;
extern UINT32 *rsp_imem;
extern UINT32 *rsp_dmem;
extern void dp_full_sync(running_machine &machine); extern void dp_full_sync(running_machine &machine);
#endif #endif

View File

@ -16,6 +16,7 @@ public:
m_maincpu(*this,"maincpu"), m_maincpu(*this,"maincpu"),
m_soundcpu(*this, "soundcpu"), m_soundcpu(*this, "soundcpu"),
m_pcm(*this, "pcm"), m_pcm(*this, "pcm"),
m_pcm_region(*this, "pcm"),
m_bg_videoram(*this, "bg_videoram"), m_bg_videoram(*this, "bg_videoram"),
m_fg_videoram(*this, "fg_videoram"), m_fg_videoram(*this, "fg_videoram"),
m_spriteram(*this, "spriteram"), m_spriteram(*this, "spriteram"),
@ -28,6 +29,7 @@ public:
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_soundcpu; required_device<cpu_device> m_soundcpu;
optional_device<samples_device> m_pcm; optional_device<samples_device> m_pcm;
optional_memory_region m_pcm_region;
optional_shared_ptr<UINT8> m_bg_videoram; optional_shared_ptr<UINT8> m_bg_videoram;
required_shared_ptr<UINT8> m_fg_videoram; required_shared_ptr<UINT8> m_fg_videoram;
required_shared_ptr<UINT8> m_spriteram; required_shared_ptr<UINT8> m_spriteram;

View File

@ -6,15 +6,17 @@ class vsnes_state : public driver_device
{ {
public: public:
vsnes_state(const machine_config &mconfig, device_type type, const char *tag) vsnes_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag)
m_maincpu(*this, "maincpu"), , m_maincpu(*this, "maincpu")
m_subcpu(*this, "sub"), , m_subcpu(*this, "sub")
m_ppu1(*this, "ppu1"), , m_ppu1(*this, "ppu1")
m_ppu2(*this, "ppu2"), , m_ppu2(*this, "ppu2")
m_work_ram(*this, "work_ram"), , m_work_ram(*this, "work_ram")
m_work_ram_1(*this, "work_ram_1"), , m_work_ram_1(*this, "work_ram_1")
m_palette(*this, "palette") , m_palette(*this, "palette")
{ } , m_gfx1_rom(*this, "gfx1")
{
}
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
optional_device<cpu_device> m_subcpu; optional_device<cpu_device> m_subcpu;
@ -24,6 +26,9 @@ public:
required_shared_ptr<UINT8> m_work_ram; required_shared_ptr<UINT8> m_work_ram;
optional_shared_ptr<UINT8> m_work_ram_1; optional_shared_ptr<UINT8> m_work_ram_1;
required_device<palette_device> m_palette; required_device<palette_device> m_palette;
optional_memory_region m_gfx1_rom;
int m_coin; int m_coin;
int m_do_vrom_bank; int m_do_vrom_bank;
int m_input_latch[4]; int m_input_latch[4];

View File

@ -9,17 +9,9 @@
#include "includes/n64.h" #include "includes/n64.h"
#include "video/n64.h" #include "video/n64.h"
UINT32 *n64_sram;
UINT32 *rdram;
UINT32 *rsp_imem;
UINT32 *rsp_dmem;
// device type definition // device type definition
const device_type N64PERIPH = &device_creator<n64_periphs>; const device_type N64PERIPH = &device_creator<n64_periphs>;
n64_periphs::n64_periphs(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) n64_periphs::n64_periphs(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, N64PERIPH, "N64 Periphal Chips", tag, owner, clock, "n64_periphs", __FILE__) : device_t(mconfig, N64PERIPH, "N64 Periphal Chips", tag, owner, clock, "n64_periphs", __FILE__)
, device_video_interface(mconfig, *this) , device_video_interface(mconfig, *this)
@ -49,11 +41,11 @@ TIMER_CALLBACK_MEMBER(n64_periphs::reset_timer_callback)
void n64_periphs::reset_tick() void n64_periphs::reset_tick()
{ {
reset_timer->adjust(attotime::never); reset_timer->adjust(attotime::never);
maincpu->reset(); m_vr4300->reset();
maincpu->execute().set_input_line(INPUT_LINE_IRQ2, CLEAR_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ2, CLEAR_LINE);
rspcpu->reset(); m_rsp->reset();
rspcpu->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); m_rsp->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
rspcpu->state().set_state_int(RSP_SR, rspcpu->state().state_int(RSP_SR) | RSP_STATUS_HALT); m_rsp->set_state_int(RSP_SR, m_rsp->state_int(RSP_SR) | RSP_STATUS_HALT);
reset_held = false; reset_held = false;
cic_status = 0; cic_status = 0;
memset(pif_ram, 0, sizeof(pif_ram)); memset(pif_ram, 0, sizeof(pif_ram));
@ -104,7 +96,7 @@ void n64_periphs::poll_reset_button(bool button)
reset_held = button; reset_held = button;
if(!old_held && reset_held) if(!old_held && reset_held)
{ {
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ2, ASSERT_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ2, ASSERT_LINE);
} }
else if(old_held && reset_held) else if(old_held && reset_held)
{ {
@ -123,15 +115,21 @@ void n64_periphs::device_start()
si_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::si_dma_callback),this)); si_dma_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::si_dma_callback),this));
vi_scanline_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::vi_scanline_callback),this)); vi_scanline_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::vi_scanline_callback),this));
reset_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::reset_timer_callback),this)); reset_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(n64_periphs::reset_timer_callback),this));
m_n64 = machine().driver_data<n64_state>();
} }
void n64_periphs::device_reset() void n64_periphs::device_reset()
{ {
UINT32 *cart = (UINT32*)machine().root_device().memregion("user2")->base(); UINT32 *cart = (UINT32*)machine().root_device().memregion("user2")->base();
maincpu = machine().device("maincpu"); m_vr4300 = machine().device<mips3_device>("maincpu");
rspcpu = machine().device("rsp"); m_rsp = machine().device<rsp_device>("rsp");
mem_map = &maincpu->memory().space(AS_PROGRAM); m_mem_map = &m_vr4300->space(AS_PROGRAM);
m_rdram = m_n64->rdram();
m_rsp_imem = m_n64->rsp_imem();
m_rsp_dmem = m_n64->rsp_dmem();
m_sram = m_n64->sram();
mi_version = 0x01010101; mi_version = 0x01010101;
mi_interrupt = 0; mi_interrupt = 0;
@ -238,7 +236,7 @@ void n64_periphs::device_reset()
pif_ram[0x26] = 0x3f; pif_ram[0x26] = 0x3f;
pif_ram[0x27] = 0x3f; pif_ram[0x27] = 0x3f;
cic_type=2; cic_type=2;
mem_map->write_dword(0x00000318, 0x800000); /* RDRAM Size */ m_mem_map->write_dword(0x00000318, 0x800000); /* RDRAM Size */
if (boot_checksum == U64(0x00000000001ff230)) if (boot_checksum == U64(0x00000000001ff230))
{ {
@ -274,7 +272,7 @@ void n64_periphs::device_reset()
pif_ram[0x26] = 0x91; pif_ram[0x26] = 0x91;
pif_ram[0x27] = 0x3f; pif_ram[0x27] = 0x3f;
cic_type=5; cic_type=5;
mem_map->write_dword(0x000003f0, 0x800000); m_mem_map->write_dword(0x000003f0, 0x800000);
} }
else if (boot_checksum == U64(0x000000d6d5de4ba0)) else if (boot_checksum == U64(0x000000d6d5de4ba0))
{ {
@ -329,7 +327,7 @@ READ32_MEMBER( n64_periphs::mi_reg_r )
break; break;
default: default:
logerror("mi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, mem_map->device().safe_pc()); logerror("mi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, m_vr4300->pc());
break; break;
} }
@ -414,7 +412,7 @@ WRITE32_MEMBER( n64_periphs::mi_reg_w )
} }
default: default:
logerror("mi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, maincpu->safe_pc()); logerror("mi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
break; break;
} }
} }
@ -428,11 +426,11 @@ void n64_periphs::check_interrupts()
{ {
if (mi_intr_mask & mi_interrupt) if (mi_intr_mask & mi_interrupt)
{ {
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
} }
else else
{ {
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
} }
} }
@ -529,7 +527,7 @@ READ32_MEMBER( n64_periphs::rdram_reg_r )
{ {
if(offset > 0x24/4) if(offset > 0x24/4)
{ {
logerror("rdram_reg_r: %08X, %08X at %08X\n", offset, mem_mask, maincpu->safe_pc()); logerror("rdram_reg_r: %08X, %08X at %08X\n", offset, mem_mask, m_vr4300->pc());
return 0; return 0;
} }
return rdram_regs[offset]; return rdram_regs[offset];
@ -539,7 +537,7 @@ WRITE32_MEMBER( n64_periphs::rdram_reg_w )
{ {
if(offset > 0x24/4) if(offset > 0x24/4)
{ {
logerror("rdram_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, maincpu->safe_pc()); logerror("rdram_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
return; return;
} }
COMBINE_DATA(&rdram_regs[offset]); COMBINE_DATA(&rdram_regs[offset]);
@ -570,7 +568,7 @@ void n64_periphs::sp_dma(int direction)
length = 0x1000 - (sp_mem_addr & 0xfff); length = 0x1000 - (sp_mem_addr & 0xfff);
} }
UINT32 *sp_mem[2] = { rsp_dmem, rsp_imem }; UINT32 *sp_mem[2] = { m_rsp_dmem, m_rsp_imem };
int sp_mem_page = (sp_mem_addr >> 12) & 1; int sp_mem_page = (sp_mem_addr >> 12) & 1;
if(direction == 0)// RDRAM -> I/DMEM if(direction == 0)// RDRAM -> I/DMEM
@ -582,7 +580,7 @@ void n64_periphs::sp_dma(int direction)
for(int i = 0; i < length / 4; i++) for(int i = 0; i < length / 4; i++)
{ {
sp_mem[sp_mem_page][(dst + i) & 0x3ff] = rdram[src + i]; sp_mem[sp_mem_page][(dst + i) & 0x3ff] = m_rdram[src + i];
} }
sp_mem_addr += length; sp_mem_addr += length;
@ -600,7 +598,7 @@ void n64_periphs::sp_dma(int direction)
for(int i = 0; i < length / 4; i++) for(int i = 0; i < length / 4; i++)
{ {
rdram[dst + i] = sp_mem[sp_mem_page][(src + i) & 0x3ff]; m_rdram[dst + i] = sp_mem[sp_mem_page][(src + i) & 0x3ff];
} }
sp_mem_addr += length; sp_mem_addr += length;
@ -615,15 +613,15 @@ WRITE32_MEMBER(n64_periphs::sp_set_status)
{ {
if (data & 0x1) if (data & 0x1)
{ {
rspcpu->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); m_rsp->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
rspcpu->state().set_state_int(RSP_SR, rspcpu->state().state_int(RSP_SR) | RSP_STATUS_HALT); m_rsp->set_state_int(RSP_SR, m_rsp->state_int(RSP_SR) | RSP_STATUS_HALT);
} }
if (data & 0x2) if (data & 0x2)
{ {
rspcpu->state().set_state_int(RSP_SR, rspcpu->state().state_int(RSP_SR) | RSP_STATUS_BROKE); m_rsp->set_state_int(RSP_SR, m_rsp->state_int(RSP_SR) | RSP_STATUS_BROKE);
if (rspcpu->state().state_int(RSP_SR) & RSP_STATUS_INTR_BREAK) if (m_rsp->state_int(RSP_SR) & RSP_STATUS_INTR_BREAK)
{ {
signal_rcp_interrupt(SP_INTERRUPT); signal_rcp_interrupt(SP_INTERRUPT);
} }
@ -632,99 +630,73 @@ WRITE32_MEMBER(n64_periphs::sp_set_status)
READ32_MEMBER(n64_periphs::sp_reg_r) READ32_MEMBER(n64_periphs::sp_reg_r)
{ {
UINT32 ret = 0;
switch (offset) switch (offset)
{ {
case 0x00/4: // SP_MEM_ADDR_REG case 0x00/4: // SP_MEM_ADDR_REG
ret = sp_mem_addr; return sp_mem_addr;
break;
case 0x04/4: // SP_DRAM_ADDR_REG case 0x04/4: // SP_DRAM_ADDR_REG
ret = sp_dram_addr; return sp_dram_addr;
break;
case 0x08/4: // SP_RD_LEN_REG case 0x08/4: // SP_RD_LEN_REG
ret = (sp_dma_skip << 20) | (sp_dma_count << 12) | sp_dma_length; return (sp_dma_skip << 20) | (sp_dma_count << 12) | sp_dma_length;
break;
case 0x10/4: // SP_STATUS_REG case 0x10/4: // SP_STATUS_REG
ret = rspcpu->state().state_int(RSP_SR); return m_rsp->state_int(RSP_SR);
break;
case 0x14/4: // SP_DMA_FULL_REG case 0x14/4: // SP_DMA_FULL_REG
ret = 0; return 0;
break;
case 0x18/4: // SP_DMA_BUSY_REG case 0x18/4: // SP_DMA_BUSY_REG
ret = 0; return 0;
break;
case 0x1c/4: // SP_SEMAPHORE_REG case 0x1c/4: // SP_SEMAPHORE_REG
machine().device("maincpu")->execute().yield(); m_vr4300->yield();
if( sp_semaphore ) if( sp_semaphore )
{ {
ret = 1; return 1;
} }
else else
{ {
sp_semaphore = 1; sp_semaphore = 1;
ret = 0; return 0;
} }
break; break;
case 0x20/4: // DP_CMD_START case 0x20/4: // DP_CMD_START
{ return m_n64->rdp()->get_start();
n64_state *state = machine().driver_data<n64_state>();
ret = state->m_rdp->get_start();
break;
}
case 0x24/4: // DP_CMD_END case 0x24/4: // DP_CMD_END
{ return m_n64->rdp()->get_end();
n64_state *state = machine().driver_data<n64_state>();
ret = state->m_rdp->get_end();
break;
}
case 0x28/4: // DP_CMD_CURRENT case 0x28/4: // DP_CMD_CURRENT
{ return m_n64->rdp()->get_current();
n64_state *state = machine().driver_data<n64_state>();
ret = state->m_rdp->get_current();
break;
}
case 0x34/4: // DP_CMD_BUSY case 0x34/4: // DP_CMD_BUSY
case 0x38/4: // DP_CMD_PIPE_BUSY case 0x38/4: // DP_CMD_PIPE_BUSY
case 0x3c/4: // DP_CMD_TMEM_BUSY case 0x3c/4: // DP_CMD_TMEM_BUSY
break; return 0;
case 0x2c/4: // DP_CMD_STATUS case 0x2c/4: // DP_CMD_STATUS
{ return m_n64->rdp()->get_status();
n64_state *state = machine().driver_data<n64_state>();
ret = state->m_rdp->get_status();
break;
}
case 0x30/4: // DP_CMD_CLOCK case 0x30/4: // DP_CMD_CLOCK
{ if(!(m_n64->rdp()->get_status() & DP_STATUS_FREEZE))
if(!(machine().driver_data<n64_state>()->m_rdp->get_status() & DP_STATUS_FREEZE))
{ {
dp_clock += 13; dp_clock += 13;
ret = dp_clock; return dp_clock;
} }
break; break;
}
case 0x40000/4: // PC case 0x40000/4: // PC
ret = rspcpu->state().state_int(RSP_PC) & 0x00000fff; return m_rsp->state_int(RSP_PC) & 0x00000fff;
break;
default: default:
logerror("sp_reg_r: %08X at %08X\n", offset, maincpu->safe_pc()); logerror("sp_reg_r: %08X at %08X\n", offset, m_vr4300->pc());
break; break;
} }
return ret; return 0;
} }
@ -758,17 +730,17 @@ WRITE32_MEMBER(n64_periphs::sp_reg_w )
case 0x10/4: // RSP_STATUS_REG case 0x10/4: // RSP_STATUS_REG
{ {
UINT32 oldstatus = rspcpu->state().state_int(RSP_SR); UINT32 oldstatus = m_rsp->state_int(RSP_SR);
UINT32 newstatus = oldstatus; UINT32 newstatus = oldstatus;
if (data & 0x00000001) // clear halt if (data & 0x00000001) // clear halt
{ {
rspcpu->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); m_rsp->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
newstatus &= ~RSP_STATUS_HALT; newstatus &= ~RSP_STATUS_HALT;
} }
if (data & 0x00000002) // set halt if (data & 0x00000002) // set halt
{ {
rspcpu->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); m_rsp->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
newstatus |= RSP_STATUS_HALT; newstatus |= RSP_STATUS_HALT;
} }
if (data & 0x00000004) if (data & 0x00000004)
@ -792,8 +764,8 @@ WRITE32_MEMBER(n64_periphs::sp_reg_w )
newstatus |= RSP_STATUS_SSTEP; // set single step newstatus |= RSP_STATUS_SSTEP; // set single step
if(!(oldstatus & (RSP_STATUS_BROKE | RSP_STATUS_HALT))) if(!(oldstatus & (RSP_STATUS_BROKE | RSP_STATUS_HALT)))
{ {
rspcpu->state().set_state_int(RSP_STEPCNT, 1 ); m_rsp->set_state_int(RSP_STEPCNT, 1 );
machine().device("rsp")->execute().yield(); m_rsp->yield();
} }
} }
if (data & 0x00000080) if (data & 0x00000080)
@ -868,7 +840,7 @@ WRITE32_MEMBER(n64_periphs::sp_reg_w )
{ {
newstatus |= RSP_STATUS_SIGNAL7; // set signal 7 newstatus |= RSP_STATUS_SIGNAL7; // set signal 7
} }
rspcpu->state().set_state_int(RSP_SR, newstatus); m_rsp->set_state_int(RSP_SR, newstatus);
break; break;
} }
@ -880,7 +852,7 @@ WRITE32_MEMBER(n64_periphs::sp_reg_w )
break; break;
default: default:
logerror("sp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, maincpu->safe_pc()); logerror("sp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
break; break;
} }
} }
@ -889,18 +861,18 @@ WRITE32_MEMBER(n64_periphs::sp_reg_w )
switch (offset & 0xffff) switch (offset & 0xffff)
{ {
case 0x00/4: // SP_PC_REG case 0x00/4: // SP_PC_REG
if( rspcpu->state().state_int(RSP_NEXTPC) != 0xffffffff ) if( m_rsp->state_int(RSP_NEXTPC) != 0xffffffff )
{ {
rspcpu->state().set_state_int(RSP_NEXTPC, 0x1000 | (data & 0xfff)); m_rsp->set_state_int(RSP_NEXTPC, 0x1000 | (data & 0xfff));
} }
else else
{ {
rspcpu->state().set_state_int(RSP_PC, 0x1000 | (data & 0xfff)); m_rsp->set_state_int(RSP_PC, 0x1000 | (data & 0xfff));
} }
break; break;
default: default:
logerror("sp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, maincpu->safe_pc()); logerror("sp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
break; break;
} }
} }
@ -916,85 +888,77 @@ void dp_full_sync(running_machine &machine)
READ32_MEMBER( n64_periphs::dp_reg_r ) READ32_MEMBER( n64_periphs::dp_reg_r )
{ {
n64_state *state = space.machine().driver_data<n64_state>();
UINT32 ret = 0;
switch (offset) switch (offset)
{ {
case 0x00/4: // DP_START_REG case 0x00/4: // DP_START_REG
ret = state->m_rdp->get_start(); return m_n64->rdp()->get_start();
break;
case 0x04/4: // DP_END_REG case 0x04/4: // DP_END_REG
ret = state->m_rdp->get_end(); return m_n64->rdp()->get_end();
break;
case 0x08/4: // DP_CURRENT_REG case 0x08/4: // DP_CURRENT_REG
ret = state->m_rdp->get_current(); return m_n64->rdp()->get_current();
break;
case 0x0c/4: // DP_STATUS_REG case 0x0c/4: // DP_STATUS_REG
ret = state->m_rdp->get_status(); return m_n64->rdp()->get_status();
break;
case 0x10/4: // DP_CLOCK_REG case 0x10/4: // DP_CLOCK_REG
{ if(!(m_n64->rdp()->get_status() & DP_STATUS_FREEZE))
if(!(state->m_rdp->get_status() & DP_STATUS_FREEZE))
{ {
dp_clock += 13; dp_clock += 13;
ret = dp_clock; return dp_clock;
} }
break; break;
}
default: default:
logerror("dp_reg_r: %08X, %08X at %08X\n", offset, mem_mask, safe_pc()); logerror("dp_reg_r: %08X, %08X at %08X\n", offset, mem_mask, m_vr4300->pc());
break; break;
} }
return ret; return 0;
} }
WRITE32_MEMBER( n64_periphs::dp_reg_w ) WRITE32_MEMBER( n64_periphs::dp_reg_w )
{ {
n64_state *state = space.machine().driver_data<n64_state>(); UINT32 status = m_n64->rdp()->get_status();
UINT32 status = state->m_rdp->get_status();
switch (offset) switch (offset)
{ {
case 0x00/4: // DP_START_REG case 0x00/4: // DP_START_REG
if(status & DP_STATUS_START_VALID) if(status & DP_STATUS_START_VALID)
{
break; break;
}
else else
{ {
state->m_rdp->set_status(status | DP_STATUS_START_VALID); m_n64->rdp()->set_status(status | DP_STATUS_START_VALID);
state->m_rdp->set_start(data & ~7); m_n64->rdp()->set_start(data & ~7);
} }
break; break;
case 0x04/4: // DP_END_REG case 0x04/4: // DP_END_REG
if(status & DP_STATUS_START_VALID) if(status & DP_STATUS_START_VALID)
{ {
state->m_rdp->set_status(status & ~DP_STATUS_START_VALID); m_n64->rdp()->set_status(status & ~DP_STATUS_START_VALID);
state->m_rdp->set_current(state->m_rdp->get_start()); m_n64->rdp()->set_current(m_n64->rdp()->get_start());
state->m_rdp->set_end(data & ~7); m_n64->rdp()->set_end(data & ~7);
g_profiler.start(PROFILER_USER1); g_profiler.start(PROFILER_USER1);
state->m_rdp->process_command_list(); m_n64->rdp()->process_command_list();
g_profiler.stop(); g_profiler.stop();
break; break;
} }
else else
{ {
state->m_rdp->set_end(data & ~7); m_n64->rdp()->set_end(data & ~7);
g_profiler.start(PROFILER_USER1); g_profiler.start(PROFILER_USER1);
state->m_rdp->process_command_list(); m_n64->rdp()->process_command_list();
g_profiler.stop(); g_profiler.stop();
break; break;
} }
case 0x0c/4: // DP_STATUS_REG case 0x0c/4: // DP_STATUS_REG
{ {
UINT32 current_status = state->m_rdp->get_status(); UINT32 current_status = m_n64->rdp()->get_status();
if (data & 0x00000001) current_status &= ~DP_STATUS_XBUS_DMA; if (data & 0x00000001) current_status &= ~DP_STATUS_XBUS_DMA;
if (data & 0x00000002) current_status |= DP_STATUS_XBUS_DMA; if (data & 0x00000002) current_status |= DP_STATUS_XBUS_DMA;
if (data & 0x00000004) current_status &= ~DP_STATUS_FREEZE; if (data & 0x00000004) current_status &= ~DP_STATUS_FREEZE;
@ -1002,22 +966,17 @@ WRITE32_MEMBER( n64_periphs::dp_reg_w )
if (data & 0x00000010) current_status &= ~DP_STATUS_FLUSH; if (data & 0x00000010) current_status &= ~DP_STATUS_FLUSH;
if (data & 0x00000020) current_status |= DP_STATUS_FLUSH; if (data & 0x00000020) current_status |= DP_STATUS_FLUSH;
if (data & 0x00000200) dp_clock = 0; if (data & 0x00000200) dp_clock = 0;
state->m_rdp->set_status(current_status); m_n64->rdp()->set_status(current_status);
break; break;
} }
default: default:
logerror("dp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, safe_pc()); logerror("dp_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
break; break;
} }
} }
TIMER_CALLBACK_MEMBER(n64_periphs::vi_scanline_callback) TIMER_CALLBACK_MEMBER(n64_periphs::vi_scanline_callback)
{
machine().device<n64_periphs>("rcp")->vi_scanline_tick();
}
void n64_periphs::vi_scanline_tick()
{ {
signal_rcp_interrupt(VI_INTERRUPT); signal_rcp_interrupt(VI_INTERRUPT);
vi_scanline_timer->adjust(m_screen->time_until_pos(vi_intr >> 1)); vi_scanline_timer->adjust(m_screen->time_until_pos(vi_intr >> 1));
@ -1124,7 +1083,7 @@ READ32_MEMBER( n64_periphs::vi_reg_r )
break; break;
default: default:
logerror("vi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, maincpu->safe_pc()); logerror("vi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, m_vr4300->pc());
break; break;
} }
@ -1152,7 +1111,6 @@ WRITE32_MEMBER( n64_periphs::vi_reg_w )
vi_recalculate_resolution(); vi_recalculate_resolution();
} }
vi_width = data; vi_width = data;
//state->m_rdp->m_misc_state.m_fb_width = data;
break; break;
case 0x0c/4: // VI_INTR_REG case 0x0c/4: // VI_INTR_REG
@ -1214,7 +1172,7 @@ WRITE32_MEMBER( n64_periphs::vi_reg_w )
*/ */
default: default:
logerror("vi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, maincpu->safe_pc()); logerror("vi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
break; break;
} }
} }
@ -1289,7 +1247,7 @@ n64_periphs::AUDIO_DMA *n64_periphs::ai_fifo_get_top()
void n64_periphs::ai_dma() void n64_periphs::ai_dma()
{ {
INT16 *ram = (INT16*)rdram; INT16 *ram = (INT16*)m_rdram;
AUDIO_DMA *current = ai_fifo_get_top(); AUDIO_DMA *current = ai_fifo_get_top();
attotime period; attotime period;
@ -1365,7 +1323,7 @@ READ32_MEMBER( n64_periphs::ai_reg_r )
break; break;
default: default:
logerror("ai_reg_r: %08X, %08X at %08X\n", offset, mem_mask, maincpu->safe_pc()); logerror("ai_reg_r: %08X, %08X at %08X\n", offset, mem_mask, m_vr4300->pc());
break; break;
} }
@ -1404,7 +1362,7 @@ WRITE32_MEMBER( n64_periphs::ai_reg_w )
break; break;
default: default:
logerror("ai_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, maincpu->safe_pc()); logerror("ai_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
break; break;
} }
} }
@ -1414,15 +1372,15 @@ WRITE32_MEMBER( n64_periphs::ai_reg_w )
TIMER_CALLBACK_MEMBER(n64_periphs::pi_dma_callback) TIMER_CALLBACK_MEMBER(n64_periphs::pi_dma_callback)
{ {
machine().device<n64_periphs>("rcp")->pi_dma_tick(); pi_dma_tick();
machine().device("rsp")->execute().yield(); m_rsp->yield();
} }
void n64_periphs::pi_dma_tick() void n64_periphs::pi_dma_tick()
{ {
bool update_bm = false; bool update_bm = false;
UINT16 *cart16; UINT16 *cart16;
UINT16 *dram16 = (UINT16*)rdram; UINT16 *dram16 = (UINT16*)m_rdram;
UINT32 cart_addr = (pi_cart_addr & 0x0fffffff) >> 1; UINT32 cart_addr = (pi_cart_addr & 0x0fffffff) >> 1;
UINT32 dram_addr = (pi_dram_addr & 0x007fffff) >> 1; UINT32 dram_addr = (pi_dram_addr & 0x007fffff) >> 1;
@ -1441,7 +1399,7 @@ void n64_periphs::pi_dma_tick()
} }
else if((cart_addr & 0x04000000) == 0x04000000) else if((cart_addr & 0x04000000) == 0x04000000)
{ {
cart16 = (UINT16*)n64_sram; cart16 = (UINT16*)m_sram;
cart_addr = (pi_cart_addr & 0x0001ffff) >> 1; cart_addr = (pi_cart_addr & 0x0001ffff) >> 1;
} }
else if((cart_addr & 0x03000000) == 0x03000000 && dd_present) else if((cart_addr & 0x03000000) == 0x03000000 && dd_present)
@ -1549,7 +1507,7 @@ READ32_MEMBER( n64_periphs::pi_reg_r )
break; break;
default: default:
logerror("pi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, maincpu->safe_pc()); logerror("pi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, m_vr4300->pc());
break; break;
} }
@ -1574,14 +1532,14 @@ WRITE32_MEMBER( n64_periphs::pi_reg_w )
dd_status_reg &= ~DD_ASIC_STATUS_DREQ; dd_status_reg &= ~DD_ASIC_STATUS_DREQ;
dd_status_reg &= ~DD_ASIC_STATUS_BM_INT; dd_status_reg &= ~DD_ASIC_STATUS_BM_INT;
//logerror("Clearing DREQ, INT\n"); //logerror("Clearing DREQ, INT\n");
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE);
} }
if(pi_cart_addr == 0x05000000 && dd_present) if(pi_cart_addr == 0x05000000 && dd_present)
{ {
dd_status_reg &= ~DD_ASIC_STATUS_C2_XFER; dd_status_reg &= ~DD_ASIC_STATUS_C2_XFER;
dd_status_reg &= ~DD_ASIC_STATUS_BM_INT; dd_status_reg &= ~DD_ASIC_STATUS_BM_INT;
//logerror("Clearing C2, INT\n"); //logerror("Clearing C2, INT\n");
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE);
} }
break; break;
} }
@ -1658,7 +1616,7 @@ WRITE32_MEMBER( n64_periphs::pi_reg_w )
break; break;
default: default:
logerror("pi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, maincpu->safe_pc()); logerror("pi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
break; break;
} }
} }
@ -1678,12 +1636,12 @@ READ32_MEMBER( n64_periphs::ri_reg_r )
time recommended for letting the SI devices settle after startup. time recommended for letting the SI devices settle after startup.
This allows the initialization routines for the SI to see that a This allows the initialization routines for the SI to see that a
proper amount of time has passed since system startup. */ proper amount of time has passed since system startup. */
machine().device<mips3_device>("maincpu")->burn_cycles(93750000/2); m_vr4300->burn_cycles(93750000/2);
} }
if(offset > 0x1c/4) if(offset > 0x1c/4)
{ {
logerror("ri_reg_r: %08X, %08X at %08X\n", offset, mem_mask, maincpu->safe_pc()); logerror("ri_reg_r: %08X, %08X at %08X\n", offset, mem_mask, m_vr4300->pc());
return 0; return 0;
} }
return ri_regs[offset]; return ri_regs[offset];
@ -1693,7 +1651,7 @@ WRITE32_MEMBER( n64_periphs::ri_reg_w )
{ {
if(offset > 0x1c/4) if(offset > 0x1c/4)
{ {
logerror("ri_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, maincpu->safe_pc()); logerror("ri_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, m_vr4300->pc());
return; return;
} }
COMBINE_DATA(&ri_regs[offset]); COMBINE_DATA(&ri_regs[offset]);
@ -2138,7 +2096,7 @@ void n64_periphs::pif_dma(int direction)
if (direction) // RDRAM -> PIF RAM if (direction) // RDRAM -> PIF RAM
{ {
UINT32 *src = (UINT32*)&rdram[(si_dram_addr & 0x1fffffff) / 4]; UINT32 *src = m_rdram + ((si_dram_addr & 0x1fffffff) / 4);
for(int i = 0; i < 64; i+=4) for(int i = 0; i < 64; i+=4)
{ {
@ -2155,7 +2113,7 @@ void n64_periphs::pif_dma(int direction)
{ {
handle_pif(); handle_pif();
UINT32 *dst = (UINT32*)&rdram[(si_dram_addr & 0x1fffffff) / 4]; UINT32 *dst = m_rdram + ((si_dram_addr & 0x1fffffff) / 4);
for(int i = 0; i < 64; i+=4) for(int i = 0; i < 64; i+=4)
{ {
@ -2315,7 +2273,7 @@ void n64_periphs::dd_update_bm()
} }
//logerror("DD Write, Sending Interrupt\n"); //logerror("DD Write, Sending Interrupt\n");
dd_status_reg |= DD_ASIC_STATUS_BM_INT; dd_status_reg |= DD_ASIC_STATUS_BM_INT;
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ1, ASSERT_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ1, ASSERT_LINE);
return; return;
} }
else // dd read, BM Mode 1 else // dd read, BM Mode 1
@ -2359,7 +2317,7 @@ void n64_periphs::dd_update_bm()
} }
//logerror("DD Read, Sending Interrupt\n"); //logerror("DD Read, Sending Interrupt\n");
dd_status_reg |= DD_ASIC_STATUS_BM_INT; dd_status_reg |= DD_ASIC_STATUS_BM_INT;
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ1, ASSERT_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ1, ASSERT_LINE);
return; return;
} }
} }
@ -2452,7 +2410,7 @@ READ32_MEMBER( n64_periphs::dd_reg_r )
{ {
dd_status_reg &= ~DD_ASIC_STATUS_BM_INT; dd_status_reg &= ~DD_ASIC_STATUS_BM_INT;
//logerror("DD Read Gap, Clearing INT\n"); //logerror("DD Read Gap, Clearing INT\n");
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE);
dd_update_bm(); dd_update_bm();
} }
break; break;
@ -2623,7 +2581,7 @@ WRITE32_MEMBER( n64_periphs::dd_reg_w )
} }
//logerror("Sending MECHA Int\n"); //logerror("Sending MECHA Int\n");
dd_status_reg |= DD_ASIC_STATUS_MECHA_INT; dd_status_reg |= DD_ASIC_STATUS_MECHA_INT;
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ1, ASSERT_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ1, ASSERT_LINE);
break; break;
case 0x10/4: // BM Status case 0x10/4: // BM Status
@ -2664,7 +2622,7 @@ WRITE32_MEMBER( n64_periphs::dd_reg_w )
if(!(dd_status_reg & DD_ASIC_STATUS_BM_INT) && !(dd_status_reg & DD_ASIC_STATUS_MECHA_INT)) if(!(dd_status_reg & DD_ASIC_STATUS_BM_INT) && !(dd_status_reg & DD_ASIC_STATUS_MECHA_INT))
{ {
//logerror("DD Status, Clearing INT\n"); //logerror("DD Status, Clearing INT\n");
machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE); m_vr4300->set_input_line(INPUT_LINE_IRQ1, CLEAR_LINE);
} }
if(data & DD_BM_START) if(data & DD_BM_START)
{ {
@ -2742,7 +2700,14 @@ void n64_state::n64_machine_stop()
device_image_interface *image = dynamic_cast<device_image_interface *>(periphs->m_nvram_image); device_image_interface *image = dynamic_cast<device_image_interface *>(periphs->m_nvram_image);
UINT8 data[0x30800]; UINT8 data[0x30800];
memcpy(data, n64_sram, 0x20000); if (m_sram != NULL)
{
memset(data, 0, 0x20000);
}
else
{
memcpy(data, m_sram, 0x20000);
}
memcpy(data + 0x20000, periphs->m_save_data.eeprom, 0x800); memcpy(data + 0x20000, periphs->m_save_data.eeprom, 0x800);
memcpy(data + 0x20800, periphs->m_save_data.mempak[0], 0x8000); memcpy(data + 0x20800, periphs->m_save_data.mempak[0], 0x8000);
memcpy(data + 0x28800, periphs->m_save_data.mempak[1], 0x8000); memcpy(data + 0x28800, periphs->m_save_data.mempak[1], 0x8000);
@ -2751,21 +2716,16 @@ void n64_state::n64_machine_stop()
void n64_state::machine_start() void n64_state::machine_start()
{ {
rdram = reinterpret_cast<UINT32 *>(memshare("rdram")->ptr()); m_vr4300->mips3drc_set_options(MIPS3DRC_COMPATIBLE_OPTIONS);
n64_sram = reinterpret_cast<UINT32 *>(memshare("sram")->ptr());
rsp_imem = reinterpret_cast<UINT32 *>(memshare("rsp_imem")->ptr());
rsp_dmem = reinterpret_cast<UINT32 *>(memshare("rsp_dmem")->ptr());
dynamic_cast<mips3_device *>(machine().device("maincpu"))->mips3drc_set_options(MIPS3DRC_COMPATIBLE_OPTIONS);
/* configure fast RAM regions */ /* configure fast RAM regions */
dynamic_cast<mips3_device *>(machine().device("maincpu"))->add_fastram(0x00000000, 0x007fffff, FALSE, rdram); m_vr4300->add_fastram(0x00000000, 0x007fffff, FALSE, m_rdram);
rsp_device *rsp = machine().device<rsp_device>("rsp"); rsp_device *rsp = machine().device<rsp_device>("rsp");
rsp->rspdrc_set_options(RSPDRC_STRICT_VERIFY); rsp->rspdrc_set_options(RSPDRC_STRICT_VERIFY);
rsp->rspdrc_flush_drc_cache(); rsp->rspdrc_flush_drc_cache();
rsp->rsp_add_dmem(rsp_dmem); rsp->rsp_add_dmem(m_rsp_dmem);
rsp->rsp_add_imem(rsp_imem); rsp->rsp_add_imem(m_rsp_imem);
/* add a hook for battery save */ /* add a hook for battery save */
machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(n64_state::n64_machine_stop),this)); machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(n64_state::n64_machine_stop),this));
@ -2773,5 +2733,5 @@ void n64_state::machine_start()
void n64_state::machine_reset() void n64_state::machine_reset()
{ {
machine().device("rsp")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); m_rsp->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
} }

View File

@ -197,14 +197,23 @@ MACHINE_START_MEMBER(vsnes_state,vsnes)
ppu1_space.install_readwrite_handler(0x2000, 0x3eff, read8_delegate(FUNC(vsnes_state::vsnes_nt0_r),this), write8_delegate(FUNC(vsnes_state::vsnes_nt0_w),this)); ppu1_space.install_readwrite_handler(0x2000, 0x3eff, read8_delegate(FUNC(vsnes_state::vsnes_nt0_r),this), write8_delegate(FUNC(vsnes_state::vsnes_nt0_w),this));
m_vrom[0] = memregion("gfx1")->base(); if (m_gfx1_rom != NULL)
m_vrom_size[0] = memregion("gfx1")->bytes(); {
m_vrom_banks = m_vrom_size[0] / 0x400; m_vrom[0] = memregion("gfx1")->base();
m_vrom_size[0] = memregion("gfx1")->bytes();
m_vrom_banks = m_vrom_size[0] / 0x400;
}
else
{
m_vrom[0] = NULL;
m_vrom_size[0] = 0;
m_vrom_banks = 0;
}
/* establish chr banks */ /* establish chr banks */
/* bank 1 is used already! */ /* bank 1 is used already! */
/* DRIVER_INIT is called first - means we can handle this different for VRAM games! */ /* DRIVER_INIT is called first - means we can handle this different for VRAM games! */
if (nullptr != m_vrom[0]) if (m_vrom[0] != nullptr)
{ {
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
{ {

View File

@ -91,7 +91,7 @@ INT32 n64_rdp::get_alpha_cvg(INT32 comb_alpha, rdp_span_aux* userdata, const rdp
void n64_state::video_start() void n64_state::video_start()
{ {
m_rdp = auto_alloc(machine(), n64_rdp(*this)); m_rdp = auto_alloc(machine(), n64_rdp(*this, m_rdram, m_rsp_dmem));
m_rdp->set_machine(machine()); m_rdp->set_machine(machine());
m_rdp->init_internal_state(); m_rdp->init_internal_state();
@ -203,7 +203,7 @@ void n64_periphs::video_update16(bitmap_rgb32 &bitmap)
//INT32 dither_filter = (n64->vi_control >> 16) & 1; //INT32 dither_filter = (n64->vi_control >> 16) & 1;
//INT32 vibuffering = ((n64->vi_control & 2) && fsaa && divot); //INT32 vibuffering = ((n64->vi_control & 2) && fsaa && divot);
UINT16* frame_buffer = (UINT16*)&rdram[(vi_origin & 0xffffff) >> 2]; UINT16* frame_buffer = (UINT16*)&m_rdram[(vi_origin & 0xffffff) >> 2];
//UINT32 hb = ((n64->vi_origin & 0xffffff) >> 2) >> 1; //UINT32 hb = ((n64->vi_origin & 0xffffff) >> 2) >> 1;
//UINT8* hidden_buffer = &m_hidden_bits[hb]; //UINT8* hidden_buffer = &m_hidden_bits[hb];
@ -261,7 +261,7 @@ void n64_periphs::video_update32(bitmap_rgb32 &bitmap)
INT32 gamma_dither = (vi_control >> 2) & 1; INT32 gamma_dither = (vi_control >> 2) & 1;
//INT32 vibuffering = ((n64->vi_control & 2) && fsaa && divot); //INT32 vibuffering = ((n64->vi_control & 2) && fsaa && divot);
UINT32* frame_buffer32 = (UINT32*)&rdram[(vi_origin & 0xffffff) >> 2]; UINT32* frame_buffer32 = (UINT32*)&m_rdram[(vi_origin & 0xffffff) >> 2];
const INT32 hdiff = (vi_hstart & 0x3ff) - ((vi_hstart >> 16) & 0x3ff); const INT32 hdiff = (vi_hstart & 0x3ff) - ((vi_hstart >> 16) & 0x3ff);
const float hcoeff = ((float)(vi_xscale & 0xfff) / (1 << 10)); const float hcoeff = ((float)(vi_xscale & 0xfff) / (1 << 10));
@ -843,7 +843,7 @@ void n64_rdp::z_store(const rdp_poly_state &object, UINT32 zcurpixel, UINT32 dzc
UINT16 zval = m_z_com_table[z & 0x3ffff]|(enc >> 2); UINT16 zval = m_z_com_table[z & 0x3ffff]|(enc >> 2);
if(zcurpixel <= MEM16_LIMIT) if(zcurpixel <= MEM16_LIMIT)
{ {
((UINT16*)rdram)[zcurpixel ^ WORD_ADDR_XOR] = zval; ((UINT16*)m_rdram)[zcurpixel ^ WORD_ADDR_XOR] = zval;
} }
if(dzcurpixel <= MEM8_LIMIT) if(dzcurpixel <= MEM8_LIMIT)
{ {
@ -1099,11 +1099,11 @@ UINT32 n64_rdp::read_data(UINT32 address)
{ {
if (m_status & 0x1) // XBUS_DMEM_DMA enabled if (m_status & 0x1) // XBUS_DMEM_DMA enabled
{ {
return rsp_dmem[(address & 0xfff) / 4]; return m_dmem[(address & 0xfff) / 4];
} }
else else
{ {
return rdram[((address & 0xffffff) / 4)]; return m_rdram[((address & 0xffffff) / 4)];
} }
} }
@ -3124,10 +3124,14 @@ void n64_rdp::process_command_list()
/*****************************************************************************/ /*****************************************************************************/
n64_rdp::n64_rdp(n64_state &state) : poly_manager<UINT32, rdp_poly_state, 8, 32000>(state.machine()) n64_rdp::n64_rdp(n64_state &state, UINT32* rdram, UINT32* dmem) : poly_manager<UINT32, rdp_poly_state, 8, 32000>(state.machine())
{ {
ignore = false; ignore = false;
dolog = false; dolog = false;
m_rdram = rdram;
m_dmem = dmem;
m_aux_buf_ptr = 0; m_aux_buf_ptr = 0;
m_aux_buf = nullptr; m_aux_buf = nullptr;
m_pipe_clean = true; m_pipe_clean = true;

View File

@ -69,26 +69,26 @@
#endif #endif
#if RDP_RANGE_CHECK #if RDP_RANGE_CHECK
#define RREADADDR8(in) ((rdp_range_check((in))) ? 0 : (((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR])) #define RREADADDR8(in) ((rdp_range_check((in))) ? 0 : (((UINT8*)m_rdram)[(in) ^ BYTE_ADDR_XOR]))
#define RREADIDX16(in) ((rdp_range_check((in) << 1)) ? 0 : (((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR])) #define RREADIDX16(in) ((rdp_range_check((in) << 1)) ? 0 : (((UINT16*)m_rdram)[(in) ^ WORD_ADDR_XOR]))
#define RREADIDX32(in) ((rdp_range_check((in) << 2)) ? 0 : rdram[(in)]) #define RREADIDX32(in) ((rdp_range_check((in) << 2)) ? 0 : m_rdram[(in)])
#define RWRITEADDR8(in, val) if(rdp_range_check((in))) { printf("Write8: Address %08x out of range!\n", (in)); fflush(stdout); fatalerror("Address %08x out of range!\n", (in)); } else { ((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR] = val;} #define RWRITEADDR8(in, val) if(rdp_range_check((in))) { printf("Write8: Address %08x out of range!\n", (in)); fflush(stdout); fatalerror("Address %08x out of range!\n", (in)); } else { ((UINT8*)m_rdram)[(in) ^ BYTE_ADDR_XOR] = val;}
#define RWRITEIDX16(in, val) if(rdp_range_check((in) << 1)) { printf("Write16: Address %08x out of range!\n", ((object.m_misc_state.m_fb_address >> 1) + curpixel) << 1); fflush(stdout); fatalerror("Address out of range\n"); } else { ((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR] = val;} #define RWRITEIDX16(in, val) if(rdp_range_check((in) << 1)) { printf("Write16: Address %08x out of range!\n", ((object.m_misc_state.m_fb_address >> 1) + curpixel) << 1); fflush(stdout); fatalerror("Address out of range\n"); } else { ((UINT16*)m_rdram)[(in) ^ WORD_ADDR_XOR] = val;}
#define RWRITEIDX32(in, val) if(rdp_range_check((in) << 2)) { printf("Write32: Address %08x out of range!\n", (in) << 2); fflush(stdout); fatalerror("Address %08x out of range!\n", (in) << 2); } else { rdram[(in)] = val;} #define RWRITEIDX32(in, val) if(rdp_range_check((in) << 2)) { printf("Write32: Address %08x out of range!\n", (in) << 2); fflush(stdout); fatalerror("Address %08x out of range!\n", (in) << 2); } else { m_rdram[(in)] = val;}
#else #else
#define RREADADDR8(in) (((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR]) #define RREADADDR8(in) (((UINT8*)m_rdram)[(in) ^ BYTE_ADDR_XOR])
#define RREADIDX16(in) (((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR]) #define RREADIDX16(in) (((UINT16*)m_rdram)[(in) ^ WORD_ADDR_XOR])
#define RREADIDX32(in) (rdram[(in)]) #define RREADIDX32(in) (m_rdram[(in)])
#define RWRITEADDR8(in, val) ((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR] = val; #define RWRITEADDR8(in, val) ((UINT8*)m_rdram)[(in) ^ BYTE_ADDR_XOR] = val;
#define RWRITEIDX16(in, val) ((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR] = val; #define RWRITEIDX16(in, val) ((UINT16*)m_rdram)[(in) ^ WORD_ADDR_XOR] = val;
#define RWRITEIDX32(in, val) rdram[(in)] = val #define RWRITEIDX32(in, val) m_rdram[(in)] = val
#endif #endif
#define U_RREADADDR8(in) (((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR]) #define U_RREADADDR8(in) (((UINT8*)m_rdram)[(in) ^ BYTE_ADDR_XOR])
#define U_RREADIDX16(in) (((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR]) #define U_RREADIDX16(in) (((UINT16*)m_rdram)[(in) ^ WORD_ADDR_XOR])
#define U_RREADIDX32(in) (rdram[(in)]) #define U_RREADIDX32(in) (m_rdram[(in)])
#define GETLOWCOL(x) (((x) & 0x3e) << 2) #define GETLOWCOL(x) (((x) & 0x3e) << 2)
#define GETMEDCOL(x) (((x) & 0x7c0) >> 3) #define GETMEDCOL(x) (((x) & 0x7c0) >> 3)
@ -133,7 +133,7 @@ typedef void (*rdp_command_t)(UINT32 w1, UINT32 w2);
class n64_rdp : public poly_manager<UINT32, rdp_poly_state, 8, 32000> class n64_rdp : public poly_manager<UINT32, rdp_poly_state, 8, 32000>
{ {
public: public:
n64_rdp(n64_state &state); n64_rdp(n64_state &state, UINT32* rdram, UINT32* dmem);
running_machine &machine() const { assert(m_machine != nullptr); return *m_machine; } running_machine &machine() const { assert(m_machine != nullptr); return *m_machine; }
@ -331,6 +331,8 @@ private:
compute_cvg_t m_compute_cvg[2]; compute_cvg_t m_compute_cvg[2];
running_machine* m_machine; running_machine* m_machine;
UINT32* m_rdram;
UINT32* m_dmem;
combine_modes_t m_combine; combine_modes_t m_combine;
bool m_pending_mode_block; bool m_pending_mode_block;

View File

@ -25,7 +25,7 @@ void n64_texture_pipe_t::set_machine(running_machine &machine)
{ {
n64_state* state = machine.driver_data<n64_state>(); n64_state* state = machine.driver_data<n64_state>();
m_rdp = state->m_rdp; m_rdp = state->rdp();
for(INT32 i = 0; i < 0x10000; i++) for(INT32 i = 0; i < 0x10000; i++)
{ {

View File

@ -826,6 +826,7 @@ void bootleg_sys16a_sprite_device::draw(bitmap_ind16 &bitmap, const rectangle &c
sega_sys16b_sprite_device::sega_sys16b_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) sega_sys16b_sprite_device::sega_sys16b_sprite_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: sega_16bit_sprite_device(mconfig, SEGA_SYS16B_SPRITES, "Sega System 16B Sprites", tag, owner, "sega_16bit_sprite", __FILE__) : sega_16bit_sprite_device(mconfig, SEGA_SYS16B_SPRITES, "Sega System 16B Sprites", tag, owner, "sega_16bit_sprite", __FILE__)
, m_sprite_region(*this, tag)
{ {
set_local_origin(184, 0x00, -184, 0); set_local_origin(184, 0x00, -184, 0);
} }
@ -867,9 +868,15 @@ void sega_sys16b_sprite_device::draw(bitmap_ind16 &bitmap, const rectangle &clip
// Note that the zooming described below is 100% accurate to the real board. // Note that the zooming described below is 100% accurate to the real board.
// //
// if the game does not have sprites, don't try to draw anything
if (m_sprite_region == NULL)
{
return;
}
// render the sprites in order // render the sprites in order
const UINT16 *spritebase = reinterpret_cast<const UINT16 *>(region()->base()); const UINT16 *spritebase = reinterpret_cast<const UINT16 *>(m_sprite_region->base());
UINT8 numbanks = region()->bytes() / 0x20000; UINT8 numbanks = m_sprite_region->bytes() / 0x20000;
UINT16 *ramend = spriteram() + spriteram_elements(); UINT16 *ramend = spriteram() + spriteram_elements();
for (UINT16 *data = spriteram(); data < ramend; data += 8) for (UINT16 *data = spriteram(); data < ramend; data += 8)
{ {

View File

@ -201,6 +201,9 @@ public:
protected: protected:
// subclass overrides // subclass overrides
virtual void draw(bitmap_ind16 &bitmap, const rectangle &cliprect) override; virtual void draw(bitmap_ind16 &bitmap, const rectangle &cliprect) override;
// memory regions
optional_memory_region m_sprite_region;
}; };