mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
naomi: Better IRQ isolation [O. Galibert]
This commit is contained in:
parent
b1fa04fbea
commit
165c949747
@ -3069,7 +3069,7 @@ static MACHINE_CONFIG_START( chihiro_base, chihiro_state )
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( chihirogd, chihiro_base )
|
||||
MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", "pic", NULL, "maincpu", NULL)
|
||||
MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", "pic", NULL, "maincpu", NOOP)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
#define ROM_LOAD16_WORD_SWAP_BIOS(bios,name,offset,length,hash) \
|
||||
|
@ -2498,7 +2498,7 @@ static MACHINE_CONFIG_START( naomi_aw_base, naomi_state )
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
|
||||
MCFG_SCREEN_UPDATE_DEVICE("powervr2", powervr2_device, screen_update)
|
||||
MCFG_PALETTE_LENGTH(0x1000)
|
||||
MCFG_POWERVR2_ADD("powervr2")
|
||||
MCFG_POWERVR2_ADD("powervr2", WRITE8(dc_state, pvr_irq))
|
||||
|
||||
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
@ -2521,7 +2521,7 @@ MACHINE_CONFIG_END
|
||||
*/
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( naomi, naomi_base )
|
||||
MCFG_NAOMI_ROM_BOARD_ADD("rom_board", "naomibd_eeprom", "maincpu", naomi_g1_irq)
|
||||
MCFG_NAOMI_ROM_BOARD_ADD("rom_board", "naomibd_eeprom", "maincpu", WRITE8(dc_state, g1_irq))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
/*
|
||||
@ -2529,7 +2529,7 @@ MACHINE_CONFIG_END
|
||||
*/
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( naomigd, naomi_base )
|
||||
MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", ":pic", "naomibd_eeprom", "maincpu", naomi_g1_irq)
|
||||
MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", ":pic", "naomibd_eeprom", "maincpu", WRITE8(dc_state, g1_irq))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
/*
|
||||
@ -2537,7 +2537,7 @@ MACHINE_CONFIG_END
|
||||
*/
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( naomim1, naomi_base )
|
||||
MCFG_NAOMI_M1_BOARD_ADD("rom_board", ":rom_key", "naomibd_eeprom", "maincpu", naomi_g1_irq)
|
||||
MCFG_NAOMI_M1_BOARD_ADD("rom_board", ":rom_key", "naomibd_eeprom", "maincpu", WRITE8(dc_state, g1_irq))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
/*
|
||||
@ -2545,7 +2545,7 @@ MACHINE_CONFIG_END
|
||||
*/
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( naomim2, naomi_base )
|
||||
MCFG_NAOMI_M2_BOARD_ADD("rom_board", ":rom_key", "naomibd_eeprom", "maincpu", naomi_g1_irq)
|
||||
MCFG_NAOMI_M2_BOARD_ADD("rom_board", ":rom_key", "naomibd_eeprom", "maincpu", WRITE8(dc_state, g1_irq))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
/*
|
||||
@ -2553,7 +2553,7 @@ MACHINE_CONFIG_END
|
||||
*/
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( naomim4, naomi_base )
|
||||
MCFG_NAOMI_M4_BOARD_ADD("rom_board", ":rom_key", "naomibd_eeprom", "maincpu", naomi_g1_irq)
|
||||
MCFG_NAOMI_M4_BOARD_ADD("rom_board", ":rom_key", "naomibd_eeprom", "maincpu", WRITE8(dc_state, g1_irq))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
/*
|
||||
@ -2600,7 +2600,7 @@ static MACHINE_CONFIG_DERIVED( aw_base, naomi_aw_base )
|
||||
MCFG_CPU_MODIFY("maincpu")
|
||||
MCFG_CPU_PROGRAM_MAP(aw_map)
|
||||
MCFG_MACRONIX_29L001MC_ADD("awflash")
|
||||
MCFG_AW_ROM_BOARD_ADD("rom_board", ":rom_key", "maincpu", naomi_g1_irq)
|
||||
MCFG_AW_ROM_BOARD_ADD("rom_board", ":rom_key", "maincpu", WRITE8(dc_state, g1_irq))
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( aw1c, aw_base )
|
||||
|
@ -547,7 +547,7 @@ static MACHINE_CONFIG_START( triforce_base, triforce_state )
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
static MACHINE_CONFIG_DERIVED( triforcegd, triforce_base )
|
||||
MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", "picreturn", NULL, "maincpu", NULL)
|
||||
MCFG_NAOMI_GDROM_BOARD_ADD("rom_board", ":gdrom", "picreturn", NULL, "maincpu", NOOP)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
||||
|
@ -52,7 +52,6 @@ class dc_state : public driver_device
|
||||
virtual void machine_start();
|
||||
virtual void machine_reset();
|
||||
TIMER_CALLBACK_MEMBER(aica_dma_irq);
|
||||
TIMER_CALLBACK_MEMBER(pvr_dma_irq);
|
||||
TIMER_CALLBACK_MEMBER(ch2_dma_irq);
|
||||
TIMER_CALLBACK_MEMBER(yuv_fifo_irq);
|
||||
TIMER_CALLBACK_MEMBER(dc_rtc_increment);
|
||||
@ -77,6 +76,8 @@ class dc_state : public driver_device
|
||||
DECLARE_WRITE64_MEMBER( dc_modem_w );
|
||||
DECLARE_READ64_MEMBER( dc_rtc_r );
|
||||
DECLARE_WRITE64_MEMBER( dc_rtc_w );
|
||||
DECLARE_WRITE8_MEMBER( g1_irq );
|
||||
DECLARE_WRITE8_MEMBER( pvr_irq );
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<cpu_device> m_soundcpu;
|
||||
@ -318,29 +319,30 @@ class dc_state : public driver_device
|
||||
/* 0x005f8600 - 0x005f8f5c TA_OL_POINTERS (read only) */
|
||||
|
||||
/* ------------- normal interrupts ------------- */
|
||||
#define IST_EOR_VIDEO 0x00000001
|
||||
#define IST_EOR_ISP 0x00000002
|
||||
#define IST_EOR_TSP 0x00000004
|
||||
#define IST_VBL_IN 0x00000008
|
||||
#define IST_VBL_OUT 0x00000010
|
||||
#define IST_HBL_IN 0x00000020
|
||||
#define IST_EOXFER_YUV 0x00000040
|
||||
#define IST_EOR_VIDEO 0x00000001
|
||||
#define IST_EOR_ISP 0x00000002
|
||||
#define IST_EOR_TSP 0x00000004
|
||||
#define IST_VBL_IN 0x00000008
|
||||
#define IST_VBL_OUT 0x00000010
|
||||
#define IST_HBL_IN 0x00000020
|
||||
#define IST_EOXFER_YUV 0x00000040
|
||||
#define IST_EOXFER_OPLST 0x00000080
|
||||
#define IST_EOXFER_OPMV 0x00000100
|
||||
#define IST_EOXFER_OPMV 0x00000100
|
||||
#define IST_EOXFER_TRLST 0x00000200
|
||||
#define IST_EOXFER_TRMV 0x00000400
|
||||
#define IST_DMA_PVR 0x00000800
|
||||
#define IST_DMA_MAPLE 0x00001000
|
||||
#define IST_DMA_MAPLEVB 0x00002000
|
||||
#define IST_DMA_GDROM 0x00004000
|
||||
#define IST_DMA_AICA 0x00008000
|
||||
#define IST_DMA_EXT1 0x00010000
|
||||
#define IST_DMA_EXT2 0x00020000
|
||||
#define IST_DMA_DEV 0x00040000
|
||||
#define IST_DMA_CH2 0x00080000
|
||||
#define IST_DMA_SORT 0x00100000
|
||||
#define IST_G1G2EXTSTAT 0x40000000
|
||||
#define IST_ERROR 0x80000000
|
||||
#define IST_EOXFER_TRMV 0x00000400
|
||||
#define IST_DMA_PVR 0x00000800
|
||||
#define IST_DMA_MAPLE 0x00001000
|
||||
#define IST_DMA_MAPLEVB 0x00002000
|
||||
#define IST_DMA_GDROM 0x00004000
|
||||
#define IST_DMA_AICA 0x00008000
|
||||
#define IST_DMA_EXT1 0x00010000
|
||||
#define IST_DMA_EXT2 0x00020000
|
||||
#define IST_DMA_DEV 0x00040000
|
||||
#define IST_DMA_CH2 0x00080000
|
||||
#define IST_DMA_SORT 0x00100000
|
||||
#define IST_EOXFER_PTLST 0x00200000
|
||||
#define IST_G1G2EXTSTAT 0x40000000
|
||||
#define IST_ERROR 0x80000000
|
||||
/* ------------ external interrupts ------------ */
|
||||
#define IST_EXT_EXTERNAL 0x00000008
|
||||
#define IST_EXT_MODEM 0x00000004
|
||||
|
@ -10,6 +10,8 @@
|
||||
#include "cpu/sh4/sh4.h"
|
||||
#include "sound/aica.h"
|
||||
#include "machine/mie.h"
|
||||
#include "machine/naomig1.h"
|
||||
#include "video/powervr2.h"
|
||||
|
||||
#define DEBUG_REGISTERS (1)
|
||||
|
||||
@ -81,12 +83,72 @@ TIMER_CALLBACK_MEMBER(dc_state::aica_dma_irq)
|
||||
dc_update_interrupt_status();
|
||||
}
|
||||
|
||||
void naomi_g1_irq(running_machine &machine)
|
||||
WRITE8_MEMBER(dc_state::g1_irq)
|
||||
{
|
||||
dc_state *state = machine.driver_data<dc_state>();
|
||||
switch(data) {
|
||||
case naomi_g1_device::DMA_GDROM_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_GDROM;
|
||||
break;
|
||||
}
|
||||
dc_update_interrupt_status();
|
||||
}
|
||||
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_GDROM;
|
||||
state->dc_update_interrupt_status();
|
||||
WRITE8_MEMBER(dc_state::pvr_irq)
|
||||
{
|
||||
switch(data) {
|
||||
case powervr2_device::EOXFER_YUV_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_YUV;
|
||||
break;
|
||||
|
||||
case powervr2_device::EOXFER_OPLST_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_OPLST;
|
||||
break;
|
||||
|
||||
case powervr2_device::EOXFER_OPMV_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_OPMV;
|
||||
break;
|
||||
|
||||
case powervr2_device::EOXFER_TRLST_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_TRLST;
|
||||
break;
|
||||
|
||||
case powervr2_device::EOXFER_TRMV_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_TRMV;
|
||||
break;
|
||||
|
||||
case powervr2_device::EOXFER_PTLST_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_PTLST;
|
||||
break;
|
||||
|
||||
case powervr2_device::VBL_IN_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_IN;
|
||||
break;
|
||||
|
||||
case powervr2_device::VBL_OUT_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_OUT;
|
||||
break;
|
||||
|
||||
case powervr2_device::HBL_IN_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_IN;
|
||||
break;
|
||||
|
||||
case powervr2_device::EOR_VIDEO_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_VIDEO;
|
||||
break;
|
||||
|
||||
case powervr2_device::EOR_TSP_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_TSP;
|
||||
break;
|
||||
|
||||
case powervr2_device::EOR_ISP_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_ISP;
|
||||
break;
|
||||
|
||||
case powervr2_device::DMA_PVR_IRQ:
|
||||
dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_PVR;
|
||||
break;
|
||||
}
|
||||
dc_update_interrupt_status();
|
||||
}
|
||||
|
||||
void dc_maple_irq(running_machine &machine)
|
||||
|
@ -24,27 +24,22 @@ DEVICE_ADDRESS_MAP_START(amap, 32, naomi_g1_device)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
naomi_g1_device::naomi_g1_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock)
|
||||
: device_t(mconfig, type, name, tag, owner, clock)
|
||||
: device_t(mconfig, type, name, tag, owner, clock),
|
||||
irq_cb(*this)
|
||||
{
|
||||
cpu = 0;
|
||||
}
|
||||
|
||||
void naomi_g1_device::static_set_maincpu_tag(device_t &device, const char *maincpu_tag)
|
||||
void naomi_g1_device::set_maincpu_tag(const char *_maincpu_tag)
|
||||
{
|
||||
naomi_g1_device &naomi_g1 = downcast<naomi_g1_device &>(device);
|
||||
naomi_g1.maincpu_tag = maincpu_tag;
|
||||
}
|
||||
|
||||
void naomi_g1_device::static_set_irq_cb(device_t &device, void (*irq_cb)(running_machine &))
|
||||
{
|
||||
naomi_g1_device &naomi_g1 = downcast<naomi_g1_device &>(device);
|
||||
naomi_g1.irq_cb = irq_cb;
|
||||
maincpu_tag = _maincpu_tag;
|
||||
}
|
||||
|
||||
void naomi_g1_device::device_start()
|
||||
{
|
||||
cpu = machine().device<sh4_device>(maincpu_tag);
|
||||
timer = timer_alloc(G1_TIMER_ID);
|
||||
irq_cb.resolve_safe();
|
||||
|
||||
save_item(NAME(gdstar));
|
||||
save_item(NAME(gdlen));
|
||||
@ -68,8 +63,7 @@ void naomi_g1_device::device_timer(emu_timer &timer, device_timer_id id, int par
|
||||
if(!gdst)
|
||||
return;
|
||||
gdst = 0;
|
||||
if(irq_cb)
|
||||
irq_cb(machine());
|
||||
irq_cb(DMA_GDROM_IRQ);
|
||||
}
|
||||
|
||||
READ32_MEMBER(naomi_g1_device::sb_gdstar_r)
|
||||
|
@ -2,18 +2,23 @@
|
||||
#define _NAOMIG1_H_
|
||||
|
||||
#include "cpu/sh4/sh4.h"
|
||||
#include "includes/dc.h"
|
||||
|
||||
#define MCFG_NAOMI_G1_ADD(_tag, type, _maincpu_tag, _irq_cb) \
|
||||
MCFG_DEVICE_ADD(_tag, type, 0) \
|
||||
naomi_g1_device::static_set_maincpu_tag(*device, _maincpu_tag); \
|
||||
naomi_g1_device::static_set_irq_cb(*device, _irq_cb);
|
||||
downcast<naomi_g1_device *>(device)->set_maincpu_tag(_maincpu_tag); \
|
||||
downcast<naomi_g1_device *>(device)->set_irq_cb(DEVCB2_ ## _irq_cb);
|
||||
|
||||
class naomi_g1_device : public device_t
|
||||
{
|
||||
public:
|
||||
enum {
|
||||
DMA_GDROM_IRQ
|
||||
};
|
||||
|
||||
naomi_g1_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock);
|
||||
static void static_set_maincpu_tag(device_t &device, const char *maincpu_tag);
|
||||
static void static_set_irq_cb(device_t &device, void (*irq_cb)(running_machine &));
|
||||
void set_maincpu_tag(const char *maincpu_tag);
|
||||
template<class _cb> void set_irq_cb(_cb cb) { irq_cb.set_callback(cb); }
|
||||
|
||||
DECLARE_ADDRESS_MAP(amap, 32);
|
||||
|
||||
@ -59,7 +64,7 @@ private:
|
||||
sh4_device *cpu;
|
||||
const char *maincpu_tag;
|
||||
emu_timer *timer;
|
||||
void (*irq_cb)(running_machine &);
|
||||
devcb2_write8 irq_cb;
|
||||
|
||||
void dma(void *dma_ptr, UINT32 main_adr, UINT32 size, bool to_mainram);
|
||||
};
|
||||
|
@ -124,7 +124,7 @@ SPG_STATUS
|
||||
---- ---- ---- ---- ---x ---- ---- ---- hsync
|
||||
---- ---- ---- ---- ---- x--- ---- ---- blank
|
||||
---- ---- ---- ---- ---- -x-- ---- ---- field number
|
||||
---- ---- ---- ---- ---- --xx xxxx xxxx state->scanline
|
||||
---- ---- ---- ---- ---- --xx xxxx xxxx scanline
|
||||
*/
|
||||
|
||||
|
||||
@ -832,7 +832,7 @@ void powervr2_device::tex_get_info(texinfo *t)
|
||||
|
||||
static const int mipmap_4_8_offset[8] = { 0x00018, 0x00058, 0x00158, 0x00558, 0x01558, 0x05558, 0x15558, 0x55558 }; // 4bpp (4bit offset) / 8bpp (8bit offset)
|
||||
static const int mipmap_np_offset[8] = { 0x00030, 0x000B0, 0x002B0, 0x00AB0, 0x02AB0, 0x0AAB0, 0x2AAB0, 0xAAAB0 }; // nonpalette textures
|
||||
static const int mipmap_vq_offset[8] = { 0x00006, 0x00016, 0x00056, 0x00156, 0x00556, 0x01556, 0x05556, 0x15556 }; // vq textures
|
||||
static const int mipmap_vq_offset[8] = { 0x00006, 0x00016, 0x00056, 0x00156, 0x00556, 0x01556, 0x05556, 0x15556 }; // vq textures
|
||||
|
||||
switch (miptype)
|
||||
{
|
||||
@ -1106,8 +1106,7 @@ WRITE32_MEMBER( powervr2_device::pvr_ta_w )
|
||||
printf("TA_YUV_TEX_BASE initialized to %08x\n", data);
|
||||
|
||||
// hack, this interrupt is generated after transfering a set amount of data
|
||||
//state->state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_YUV;
|
||||
//state->state->dc_update_interrupt_status();
|
||||
//irq_cb(EOXFER_YUV_IRQ);
|
||||
|
||||
break;
|
||||
case TA_YUV_TEX_CTRL:
|
||||
@ -1160,37 +1159,27 @@ WRITE32_MEMBER( powervr2_device::pvr_ta_w )
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::transfer_opaque_list_irq)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_OPLST;
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(EOXFER_OPLST_IRQ);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::transfer_opaque_modifier_volume_list_irq)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_OPMV;
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(EOXFER_OPMV_IRQ);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::transfer_translucent_list_irq)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_TRLST;
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(EOXFER_TRLST_IRQ);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::transfer_translucent_modifier_volume_list_irq)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_TRMV;
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(EOXFER_TRMV_IRQ);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::transfer_punch_through_list_irq)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= (1 << 21);
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(EOXFER_PTLST_IRQ);
|
||||
}
|
||||
|
||||
void powervr2_device::process_ta_fifo()
|
||||
@ -1511,16 +1500,6 @@ WRITE64_MEMBER( powervr2_device::ta_fifo_poly_w )
|
||||
|
||||
WRITE64_MEMBER( powervr2_device::ta_fifo_yuv_w )
|
||||
{
|
||||
//dc_state *state = space.machine().driver_data<dc_state>();
|
||||
|
||||
// int reg;
|
||||
// UINT64 shift;
|
||||
// UINT32 dat;
|
||||
|
||||
// reg = decode_reg_64(offset, mem_mask, &shift);
|
||||
// dat = (UINT32)(data >> shift);
|
||||
|
||||
// printf("YUV FIFO: [%08x=%x] write %" I64FMT "x to %x, mask %" I64FMT "x %08x\n", 0x10800000+reg*4, dat, data, offset, mem_mask,test);
|
||||
}
|
||||
|
||||
// SB_LMMODE0
|
||||
@ -2376,18 +2355,14 @@ void powervr2_device::pvr_build_parameterconfig()
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::vbin)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_IN; // V Blank-in interrupt
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(VBL_IN_IRQ);
|
||||
|
||||
vbin_timer->adjust(machine().primary_screen->time_until_pos(spg_vblank_in_irq_line_num));
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::vbout)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_VBL_OUT; // V Blank-out interrupt
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(VBL_OUT_IRQ);
|
||||
|
||||
vbout_timer->adjust(machine().primary_screen->time_until_pos(spg_vblank_out_irq_line_num));
|
||||
}
|
||||
@ -2398,17 +2373,13 @@ TIMER_CALLBACK_MEMBER(powervr2_device::hbin)
|
||||
{
|
||||
if(scanline == next_y)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_HBL_IN; // H Blank-in interrupt
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(HBL_IN_IRQ);
|
||||
next_y+=spg_line_comp_val;
|
||||
}
|
||||
}
|
||||
else if((scanline == spg_line_comp_val) || (spg_hblank_int_mode & 2))
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_HBL_IN; // H Blank-in interrupt
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(HBL_IN_IRQ);
|
||||
}
|
||||
|
||||
// printf("hbin on scanline %d\n",scanline);
|
||||
@ -2428,17 +2399,13 @@ TIMER_CALLBACK_MEMBER(powervr2_device::hbin)
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::endofrender_video)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_VIDEO;// VIDEO end of render
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(EOR_VIDEO_IRQ); // VIDEO end of render
|
||||
endofrender_timer_video->adjust(attotime::never);
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::endofrender_tsp)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_TSP; // TSP end of render
|
||||
state->dc_update_interrupt_status();
|
||||
{
|
||||
irq_cb(EOR_TSP_IRQ); // TSP end of render
|
||||
|
||||
endofrender_timer_tsp->adjust(attotime::never);
|
||||
endofrender_timer_video->adjust(attotime::from_usec(500) );
|
||||
@ -2446,9 +2413,7 @@ TIMER_CALLBACK_MEMBER(powervr2_device::endofrender_tsp)
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::endofrender_isp)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOR_ISP; // ISP end of render
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(EOR_ISP_IRQ); // ISP end of render
|
||||
|
||||
endofrender_timer_isp->adjust(attotime::never);
|
||||
endofrender_timer_tsp->adjust(attotime::from_usec(500) );
|
||||
@ -2574,10 +2539,8 @@ WRITE32_MEMBER( powervr2_device::pvrs_ta_w )
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::pvr_dma_irq)
|
||||
{
|
||||
dc_state *state = machine().driver_data<dc_state>();
|
||||
m_pvr_dma.start = pvrctrl_regs[SB_PDST] = 0;
|
||||
state->dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_PVR;
|
||||
state->dc_update_interrupt_status();
|
||||
irq_cb(DMA_PVR_IRQ);
|
||||
}
|
||||
|
||||
READ32_MEMBER(powervr2_device::pvr_ctrl_r)
|
||||
@ -2660,12 +2623,15 @@ void powervr2_device::pvr_dma_execute(address_space &space)
|
||||
}
|
||||
|
||||
powervr2_device::powervr2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: device_t(mconfig, POWERVR2, "PowerVR 2", tag, owner, clock)
|
||||
: device_t(mconfig, POWERVR2, "PowerVR 2", tag, owner, clock),
|
||||
irq_cb(*this)
|
||||
{
|
||||
}
|
||||
|
||||
void powervr2_device::device_start()
|
||||
{
|
||||
irq_cb.resolve_safe();
|
||||
|
||||
memset(pvrctrl_regs, 0, sizeof(pvrctrl_regs));
|
||||
memset(pvrta_regs, 0, sizeof(pvrta_regs));
|
||||
memset(grab, 0, sizeof(grab));
|
||||
|
@ -1,13 +1,29 @@
|
||||
#ifndef __POWERVR2_H__
|
||||
#define __POWERVR2_H__
|
||||
|
||||
#define MCFG_POWERVR2_ADD(_tag) \
|
||||
MCFG_DEVICE_ADD(_tag, POWERVR2, 0)
|
||||
#define MCFG_POWERVR2_ADD(_tag, _irq_cb) \
|
||||
MCFG_DEVICE_ADD(_tag, POWERVR2, 0) \
|
||||
downcast<powervr2_device *>(device)->set_irq_cb(DEVCB2_ ## _irq_cb);
|
||||
|
||||
class powervr2_device : public device_t
|
||||
{
|
||||
public:
|
||||
enum { NUM_BUFFERS = 4 };
|
||||
enum {
|
||||
EOXFER_YUV_IRQ,
|
||||
EOXFER_OPLST_IRQ,
|
||||
EOXFER_OPMV_IRQ,
|
||||
EOXFER_TRLST_IRQ,
|
||||
EOXFER_TRMV_IRQ,
|
||||
EOXFER_PTLST_IRQ,
|
||||
VBL_IN_IRQ,
|
||||
VBL_OUT_IRQ,
|
||||
HBL_IN_IRQ,
|
||||
EOR_VIDEO_IRQ,
|
||||
EOR_TSP_IRQ,
|
||||
EOR_ISP_IRQ,
|
||||
DMA_PVR_IRQ
|
||||
};
|
||||
|
||||
struct {
|
||||
UINT32 pvr_addr;
|
||||
@ -110,6 +126,7 @@ public:
|
||||
int next_y;
|
||||
|
||||
powervr2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
template<class _cb> void set_irq_cb(_cb cb) { irq_cb.set_callback(cb); }
|
||||
|
||||
DECLARE_READ32_MEMBER( pvr_ctrl_r );
|
||||
DECLARE_WRITE32_MEMBER( pvr_ctrl_w );
|
||||
@ -147,6 +164,8 @@ protected:
|
||||
virtual void device_reset();
|
||||
|
||||
private:
|
||||
devcb2_write8 irq_cb;
|
||||
|
||||
static UINT32 (*const blend_functions[64])(UINT32 s, UINT32 d);
|
||||
|
||||
static inline INT32 clamp(INT32 in, INT32 min, INT32 max);
|
||||
|
@ -206,7 +206,7 @@ static MACHINE_CONFIG_START( dc, dc_cons_state )
|
||||
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
|
||||
MCFG_SCREEN_UPDATE_DEVICE("powervr2", powervr2_device, screen_update)
|
||||
MCFG_PALETTE_LENGTH(0x1000)
|
||||
MCFG_POWERVR2_ADD("powervr2")
|
||||
MCFG_POWERVR2_ADD("powervr2", WRITE8(dc_state, pvr_irq))
|
||||
|
||||
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
|
||||
MCFG_SOUND_ADD("aica", AICA, 0)
|
||||
|
Loading…
Reference in New Issue
Block a user