diff --git a/src/mame/drivers/naomi.c b/src/mame/drivers/naomi.c index ae039f550d0..28da5d8c8af 100644 --- a/src/mame/drivers/naomi.c +++ b/src/mame/drivers/naomi.c @@ -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 ) diff --git a/src/mame/includes/dc.h b/src/mame/includes/dc.h index 5de13d36eb8..c8610bb45ff 100644 --- a/src/mame/includes/dc.h +++ b/src/mame/includes/dc.h @@ -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) diff --git a/src/mame/video/powervr2.c b/src/mame/video/powervr2.c index 3120cb8c7ec..89619a6f393 100644 --- a/src/mame/video/powervr2.c +++ b/src/mame/video/powervr2.c @@ -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)); diff --git a/src/mame/video/powervr2.h b/src/mame/video/powervr2.h index a2b022f6746..b46c5916d29 100644 --- a/src/mame/video/powervr2.h +++ b/src/mame/video/powervr2.h @@ -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); diff --git a/src/mess/drivers/dccons.c b/src/mess/drivers/dccons.c index 81bc34b44ab..53c393307ac 100644 --- a/src/mess/drivers/dccons.c +++ b/src/mess/drivers/dccons.c @@ -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 )