mirror of
https://github.com/holub/mame
synced 2025-04-24 09:20:02 +03:00
powervr2: Explode the dma registers [O. Galibert]
This commit is contained in:
parent
8d0c6abac3
commit
0127243023
@ -1534,7 +1534,7 @@ static ADDRESS_MAP_START( naomi_map, AS_PROGRAM, 64, naomi_state )
|
||||
AM_RANGE(0x005f7000, 0x005f70ff) AM_MIRROR(0x02000000) AM_DEVICE16( "rom_board", naomi_board, submap, U64(0x0000ffff0000ffff) )
|
||||
AM_RANGE(0x005f7400, 0x005f74ff) AM_MIRROR(0x02000000) AM_DEVICE32( "rom_board", naomi_g1_device, amap, U64(0xffffffffffffffff) )
|
||||
AM_RANGE(0x005f7800, 0x005f78ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
|
||||
AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x00600000, 0x006007ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_modem_r, dc_modem_w )
|
||||
AM_RANGE(0x00700000, 0x00707fff) AM_MIRROR(0x02000000) AM_READWRITE(dc_aica_reg_r, dc_aica_reg_w )
|
||||
@ -1586,7 +1586,7 @@ static ADDRESS_MAP_START( naomi2_map, AS_PROGRAM, 64, naomi_state )
|
||||
AM_RANGE(0x005f7000, 0x005f70ff) AM_MIRROR(0x02000000) AM_DEVICE16( "rom_board", naomi_board, submap, U64(0x0000ffff0000ffff) )
|
||||
AM_RANGE(0x005f7400, 0x005f74ff) AM_MIRROR(0x02000000) AM_DEVICE32( "rom_board", naomi_g1_device, amap, U64(0xffffffffffffffff) )
|
||||
AM_RANGE(0x005f7800, 0x005f78ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
|
||||
AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x00600000, 0x006007ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_modem_r, dc_modem_w )
|
||||
AM_RANGE(0x00700000, 0x00707fff) AM_MIRROR(0x02000000) AM_READWRITE(dc_aica_reg_r, dc_aica_reg_w )
|
||||
@ -1739,7 +1739,7 @@ static ADDRESS_MAP_START( aw_map, AS_PROGRAM, 64, naomi_state )
|
||||
AM_RANGE(0x005f7000, 0x005f70ff) AM_MIRROR(0x02000000) AM_DEVICE16( "rom_board", aw_rom_board, submap, U64(0x0000ffff0000ffff) )
|
||||
AM_RANGE(0x005f7400, 0x005f74ff) AM_MIRROR(0x02000000) AM_DEVICE32( "rom_board", naomi_g1_device, amap, U64(0xffffffffffffffff) )
|
||||
AM_RANGE(0x005f7800, 0x005f78ff) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
|
||||
AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x00600000, 0x006007ff) AM_READWRITE(aw_modem_r, aw_modem_w )
|
||||
AM_RANGE(0x00700000, 0x00707fff) AM_READWRITE(dc_aica_reg_r, dc_aica_reg_w )
|
||||
|
@ -231,16 +231,6 @@ class dc_state : public driver_device
|
||||
#define SB_DDSTARD ((0x005f78f4-0x005f7800)/4)
|
||||
#define SB_DDLEND ((0x005f78f8-0x005f7800)/4)
|
||||
|
||||
/*------------- PowerVR Interface -------------*/
|
||||
#define SB_PDSTAP ((0x005f7c00-0x005f7c00)/4)
|
||||
#define SB_PDSTAR ((0x005f7c04-0x005f7c00)/4)
|
||||
#define SB_PDLEN ((0x005f7c08-0x005f7c00)/4)
|
||||
#define SB_PDDIR ((0x005f7c0c-0x005f7c00)/4)
|
||||
#define SB_PDTSEL ((0x005f7c10-0x005f7c00)/4)
|
||||
#define SB_PDEN ((0x005f7c14-0x005f7c00)/4)
|
||||
#define SB_PDST ((0x005f7c18-0x005f7c00)/4)
|
||||
#define SB_PDAPRO ((0x005f7c80-0x005f7c00)/4)
|
||||
|
||||
#define RTC1 ((0x00710000-0x00710000)/4)
|
||||
#define RTC2 ((0x00710004-0x00710000)/4)
|
||||
#define RTC3 ((0x00710008-0x00710000)/4)
|
||||
|
@ -86,6 +86,17 @@ DEVICE_ADDRESS_MAP_START(ta_map, 32, powervr2_device)
|
||||
AM_RANGE(0x1000, 0x1fff) AM_READWRITE(palette_r, palette_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
DEVICE_ADDRESS_MAP_START(pd_dma_map, 32, powervr2_device)
|
||||
AM_RANGE(0x00, 0x03) AM_READWRITE(sb_pdstap_r, sb_pdstap_w)
|
||||
AM_RANGE(0x04, 0x07) AM_READWRITE(sb_pdstar_r, sb_pdstar_w)
|
||||
AM_RANGE(0x08, 0x0b) AM_READWRITE(sb_pdlen_r, sb_pdlen_w)
|
||||
AM_RANGE(0x0c, 0x0f) AM_READWRITE(sb_pddir_r, sb_pddir_w)
|
||||
AM_RANGE(0x10, 0x13) AM_READWRITE(sb_pdtsel_r, sb_pdtsel_w)
|
||||
AM_RANGE(0x14, 0x17) AM_READWRITE(sb_pden_r, sb_pden_w)
|
||||
AM_RANGE(0x18, 0x1b) AM_READWRITE(sb_pdst_r, sb_pdst_w)
|
||||
AM_RANGE(0x80, 0x83) AM_READWRITE(sb_pdapro_r, sb_pdapro_w)
|
||||
ADDRESS_MAP_END
|
||||
|
||||
const int powervr2_device::pvr_parconfseq[] = {1,2,3,2,3,4,5,6,5,6,7,8,9,10,11,12,13,14,13,14,15,16,17,16,17,0,0,0,0,0,18,19,20,19,20,21,22,23,22,23};
|
||||
const int powervr2_device::pvr_wordsvertex[24] = {8,8,8,8,8,16,16,8,8,8, 8, 8,8,8,8,8,16,16, 8,16,16,8,16,16};
|
||||
const int powervr2_device::pvr_wordspolygon[24] = {8,8,8,8,8, 8, 8,8,8,8,16,16,8,8,8,8, 8, 8,16,16,16,8, 8, 8};
|
||||
@ -1456,6 +1467,100 @@ void powervr2_device::update_screen_format()
|
||||
machine().primary_screen->configure(spg_hbstart, spg_vbstart, visarea, machine().primary_screen->frame_period().attoseconds );
|
||||
}
|
||||
|
||||
|
||||
READ32_MEMBER( powervr2_device::sb_pdstap_r )
|
||||
{
|
||||
return sb_pdstap;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER( powervr2_device::sb_pdstap_w )
|
||||
{
|
||||
COMBINE_DATA(&sb_pdstap);
|
||||
m_pvr_dma.pvr_addr = sb_pdstap;
|
||||
}
|
||||
|
||||
READ32_MEMBER( powervr2_device::sb_pdstar_r )
|
||||
{
|
||||
return sb_pdstar;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER( powervr2_device::sb_pdstar_w )
|
||||
{
|
||||
COMBINE_DATA(&sb_pdstar);
|
||||
m_pvr_dma.sys_addr = sb_pdstar;
|
||||
}
|
||||
|
||||
READ32_MEMBER( powervr2_device::sb_pdlen_r )
|
||||
{
|
||||
return sb_pdlen;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER( powervr2_device::sb_pdlen_w )
|
||||
{
|
||||
COMBINE_DATA(&sb_pdlen);
|
||||
m_pvr_dma.size = sb_pdlen;
|
||||
}
|
||||
|
||||
READ32_MEMBER( powervr2_device::sb_pddir_r )
|
||||
{
|
||||
return sb_pddir;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER( powervr2_device::sb_pddir_w )
|
||||
{
|
||||
COMBINE_DATA(&sb_pddir);
|
||||
m_pvr_dma.dir = sb_pddir;
|
||||
}
|
||||
|
||||
READ32_MEMBER( powervr2_device::sb_pdtsel_r )
|
||||
{
|
||||
return sb_pdtsel;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER( powervr2_device::sb_pdtsel_w )
|
||||
{
|
||||
COMBINE_DATA(&sb_pdtsel);
|
||||
m_pvr_dma.sel = sb_pdtsel & 1;
|
||||
}
|
||||
|
||||
READ32_MEMBER( powervr2_device::sb_pden_r )
|
||||
{
|
||||
return sb_pden;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER( powervr2_device::sb_pden_w )
|
||||
{
|
||||
COMBINE_DATA(&sb_pden);
|
||||
m_pvr_dma.flag = sb_pden & 1;
|
||||
}
|
||||
|
||||
READ32_MEMBER( powervr2_device::sb_pdst_r )
|
||||
{
|
||||
return sb_pdst;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER( powervr2_device::sb_pdst_w )
|
||||
{
|
||||
COMBINE_DATA(&sb_pdst);
|
||||
|
||||
UINT32 old = m_pvr_dma.start & 1;
|
||||
m_pvr_dma.start = sb_pdst & 1;
|
||||
|
||||
if(((old & 1) == 0) && m_pvr_dma.flag && m_pvr_dma.start && ((m_pvr_dma.sel & 1) == 0)) // 0 -> 1
|
||||
pvr_dma_execute(space);
|
||||
}
|
||||
|
||||
READ32_MEMBER( powervr2_device::sb_pdapro_r )
|
||||
{
|
||||
return sb_pdapro;
|
||||
}
|
||||
|
||||
WRITE32_MEMBER( powervr2_device::sb_pdapro_w )
|
||||
{
|
||||
COMBINE_DATA(&sb_pdapro);
|
||||
}
|
||||
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::transfer_opaque_list_irq)
|
||||
{
|
||||
irq_cb(EOXFER_OPLST_IRQ);
|
||||
@ -1804,7 +1909,9 @@ WRITE64_MEMBER( powervr2_device::ta_fifo_yuv_w )
|
||||
// SB_LMMODE0
|
||||
WRITE64_MEMBER(powervr2_device::ta_texture_directpath0_w )
|
||||
{
|
||||
int mode = pvrctrl_regs[SB_LMMODE0]&1;
|
||||
// That's not in the pvr control address space, it's in g2's
|
||||
// int mode = pvrctrl_regs[SB_LMMODE0]&1;
|
||||
int mode = 0;
|
||||
if (mode&1)
|
||||
{
|
||||
printf("ta_texture_directpath0_w 32-bit access!\n");
|
||||
@ -1819,7 +1926,9 @@ WRITE64_MEMBER(powervr2_device::ta_texture_directpath0_w )
|
||||
// SB_LMMODE1
|
||||
WRITE64_MEMBER(powervr2_device::ta_texture_directpath1_w )
|
||||
{
|
||||
int mode = pvrctrl_regs[SB_LMMODE1]&1;
|
||||
// That's not in the pvr control address space, it's in g2's
|
||||
// int mode = pvrctrl_regs[SB_LMMODE1]&1;
|
||||
int mode = 0;
|
||||
if (mode&1)
|
||||
{
|
||||
printf("ta_texture_directpath1_w 32-bit access!\n");
|
||||
@ -2830,51 +2939,10 @@ WRITE32_MEMBER( powervr2_device::pvrs_ta_w )
|
||||
|
||||
TIMER_CALLBACK_MEMBER(powervr2_device::pvr_dma_irq)
|
||||
{
|
||||
m_pvr_dma.start = pvrctrl_regs[SB_PDST] = 0;
|
||||
m_pvr_dma.start = sb_pdst = 0;
|
||||
irq_cb(DMA_PVR_IRQ);
|
||||
}
|
||||
|
||||
READ32_MEMBER(powervr2_device::pvr_ctrl_r)
|
||||
{
|
||||
#if DEBUG_PVRCTRL
|
||||
mame_printf_verbose("PVRCTRL: [%08x] read %x @ %x, mask %x (PC=%x)\n", 0x5f7c00+reg*4, pvrctrl_regs[offset], offset, mem_mask, space.device().safe_pc());
|
||||
#endif
|
||||
|
||||
return (UINT64)pvrctrl_regs[offset];
|
||||
}
|
||||
|
||||
WRITE32_MEMBER(powervr2_device::pvr_ctrl_w)
|
||||
{
|
||||
UINT8 old;
|
||||
|
||||
switch (offset)
|
||||
{
|
||||
case SB_PDSTAP: m_pvr_dma.pvr_addr = data; break;
|
||||
case SB_PDSTAR: m_pvr_dma.sys_addr = data; break;
|
||||
case SB_PDLEN: m_pvr_dma.size = data; break;
|
||||
case SB_PDDIR: m_pvr_dma.dir = data & 1; break;
|
||||
case SB_PDTSEL:
|
||||
m_pvr_dma.sel = data & 1;
|
||||
//if(m_pvr_dma.sel & 1)
|
||||
// printf("Warning: Unsupported irq mode trigger PVR-DMA\n");
|
||||
break;
|
||||
case SB_PDEN: m_pvr_dma.flag = data & 1; break;
|
||||
case SB_PDST:
|
||||
old = m_pvr_dma.start & 1;
|
||||
m_pvr_dma.start = data & 1;
|
||||
|
||||
if(((old & 1) == 0) && m_pvr_dma.flag && m_pvr_dma.start && ((m_pvr_dma.sel & 1) == 0)) // 0 -> 1
|
||||
pvr_dma_execute(space);
|
||||
break;
|
||||
}
|
||||
|
||||
#if DEBUG_PVRCTRL
|
||||
mame_printf_verbose("PVRCTRL: [%08x=%x] write %x to %x (reg %x), mask %x\n", 0x5f7c00+reg*4, data, offset, mem_mask);
|
||||
#endif
|
||||
|
||||
pvrctrl_regs[offset] = data;
|
||||
}
|
||||
|
||||
void powervr2_device::pvr_dma_execute(address_space &space)
|
||||
{
|
||||
UINT32 src,dst,size;
|
||||
@ -2923,7 +2991,6 @@ void powervr2_device::device_start()
|
||||
{
|
||||
irq_cb.resolve_safe();
|
||||
|
||||
memset(pvrctrl_regs, 0, sizeof(pvrctrl_regs));
|
||||
memset(grab, 0, sizeof(grab));
|
||||
pvr_build_parameterconfig();
|
||||
|
||||
@ -2980,6 +3047,15 @@ void powervr2_device::device_start()
|
||||
memset(fog_table, 0, sizeof(fog_table));
|
||||
memset(palette, 0, sizeof(palette));
|
||||
|
||||
sb_pdstap = 0;
|
||||
sb_pdstar = 0;
|
||||
sb_pdlen = 0;
|
||||
sb_pddir = 0;
|
||||
sb_pdtsel = 0;
|
||||
sb_pden = 0;
|
||||
sb_pdst = 0;
|
||||
sb_pdapro = 0;
|
||||
|
||||
save_item(NAME(softreset));
|
||||
save_item(NAME(param_base));
|
||||
save_item(NAME(region_base));
|
||||
@ -3021,6 +3097,15 @@ void powervr2_device::device_start()
|
||||
save_pointer(NAME(fog_table), 0x80);
|
||||
save_pointer(NAME(palette), 0x400);
|
||||
|
||||
save_item(NAME(sb_pdstap));
|
||||
save_item(NAME(sb_pdstar));
|
||||
save_item(NAME(sb_pdlen));
|
||||
save_item(NAME(sb_pddir));
|
||||
save_item(NAME(sb_pdtsel));
|
||||
save_item(NAME(sb_pden));
|
||||
save_item(NAME(sb_pdst));
|
||||
save_item(NAME(sb_pdapro));
|
||||
|
||||
save_item(NAME(m_pvr_dma.pvr_addr));
|
||||
save_item(NAME(m_pvr_dma.sys_addr));
|
||||
save_item(NAME(m_pvr_dma.size));
|
||||
@ -3028,7 +3113,6 @@ void powervr2_device::device_start()
|
||||
save_item(NAME(m_pvr_dma.dir));
|
||||
save_item(NAME(m_pvr_dma.flag));
|
||||
save_item(NAME(m_pvr_dma.start));
|
||||
save_pointer(NAME(pvrctrl_regs),0x100/4);
|
||||
save_item(NAME(debug_dip_status));
|
||||
save_pointer(NAME(tafifo_buff),32);
|
||||
save_item(NAME(scanline));
|
||||
|
@ -26,6 +26,7 @@ public:
|
||||
};
|
||||
|
||||
DECLARE_ADDRESS_MAP(ta_map, 32);
|
||||
DECLARE_ADDRESS_MAP(pd_dma_map, 32);
|
||||
|
||||
struct {
|
||||
UINT32 pvr_addr;
|
||||
@ -114,8 +115,6 @@ public:
|
||||
UINT64 *pvr2_framebuffer_ram;
|
||||
UINT64 *elan_ram;
|
||||
|
||||
|
||||
UINT32 pvrctrl_regs[0x100/4];
|
||||
UINT32 debug_dip_status;
|
||||
emu_timer *vbout_timer;
|
||||
emu_timer *vbin_timer;
|
||||
@ -220,9 +219,23 @@ public:
|
||||
DECLARE_READ32_MEMBER( palette_r );
|
||||
DECLARE_WRITE32_MEMBER( palette_w );
|
||||
|
||||
DECLARE_READ32_MEMBER( sb_pdstap_r );
|
||||
DECLARE_WRITE32_MEMBER( sb_pdstap_w );
|
||||
DECLARE_READ32_MEMBER( sb_pdstar_r );
|
||||
DECLARE_WRITE32_MEMBER( sb_pdstar_w );
|
||||
DECLARE_READ32_MEMBER( sb_pdlen_r );
|
||||
DECLARE_WRITE32_MEMBER( sb_pdlen_w );
|
||||
DECLARE_READ32_MEMBER( sb_pddir_r );
|
||||
DECLARE_WRITE32_MEMBER( sb_pddir_w );
|
||||
DECLARE_READ32_MEMBER( sb_pdtsel_r );
|
||||
DECLARE_WRITE32_MEMBER( sb_pdtsel_w );
|
||||
DECLARE_READ32_MEMBER( sb_pden_r );
|
||||
DECLARE_WRITE32_MEMBER( sb_pden_w );
|
||||
DECLARE_READ32_MEMBER( sb_pdst_r );
|
||||
DECLARE_WRITE32_MEMBER( sb_pdst_w );
|
||||
DECLARE_READ32_MEMBER( sb_pdapro_r );
|
||||
DECLARE_WRITE32_MEMBER( sb_pdapro_w );
|
||||
|
||||
DECLARE_READ32_MEMBER( pvr_ctrl_r );
|
||||
DECLARE_WRITE32_MEMBER( pvr_ctrl_w );
|
||||
DECLARE_READ32_MEMBER( pvr_ta_r );
|
||||
DECLARE_WRITE32_MEMBER( pvr_ta_w );
|
||||
DECLARE_READ32_MEMBER( pvr2_ta_r );
|
||||
@ -280,6 +293,9 @@ private:
|
||||
UINT32 fog_table[0x80];
|
||||
UINT32 palette[0x400];
|
||||
|
||||
// PD DMA registers
|
||||
UINT32 sb_pdstap, sb_pdstar, sb_pdlen, sb_pddir, sb_pdtsel, sb_pden, sb_pdst, sb_pdapro;
|
||||
|
||||
static UINT32 (*const blend_functions[64])(UINT32 s, UINT32 d);
|
||||
|
||||
static inline INT32 clamp(INT32 in, INT32 min, INT32 max);
|
||||
|
@ -118,7 +118,7 @@ static ADDRESS_MAP_START( dc_map, AS_PROGRAM, 64, dc_cons_state )
|
||||
AM_RANGE(0x005f7000, 0x005f70ff) AM_READWRITE(dc_mess_gdrom_r, dc_mess_gdrom_w )
|
||||
AM_RANGE(0x005f7400, 0x005f74ff) AM_READWRITE(dc_mess_g1_ctrl_r, dc_mess_g1_ctrl_w )
|
||||
AM_RANGE(0x005f7800, 0x005f78ff) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
|
||||
AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x005f8000, 0x005f9fff) AM_DEVICE32("powervr2", powervr2_device, ta_map, U64(0xffffffffffffffff))
|
||||
AM_RANGE(0x00600000, 0x006007ff) AM_READWRITE(dc_modem_r, dc_modem_w )
|
||||
AM_RANGE(0x00700000, 0x00707fff) AM_READWRITE(dc_aica_reg_r, dc_aica_reg_w )
|
||||
|
Loading…
Reference in New Issue
Block a user