Previous 199869 Revisions Next

r23730 Saturday 15th June, 2013 at 21:05:15 UTC by O. Galibert
powervr2: Explode the dma registers [O. Galibert]
[src/mame/drivers]naomi.c
[src/mame/includes]dc.h
[src/mame/video]powervr2.c powervr2.h
[src/mess/drivers]dccons.c

trunk/src/mame/drivers/naomi.c
r23729r23730
15341534   AM_RANGE(0x005f7000, 0x005f70ff) AM_MIRROR(0x02000000) AM_DEVICE16( "rom_board", naomi_board, submap, U64(0x0000ffff0000ffff) )
15351535   AM_RANGE(0x005f7400, 0x005f74ff) AM_MIRROR(0x02000000) AM_DEVICE32( "rom_board", naomi_g1_device, amap, U64(0xffffffffffffffff) )
15361536   AM_RANGE(0x005f7800, 0x005f78ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
1537   AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, U64(0xffffffffffffffff))
1537   AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, U64(0xffffffffffffffff))
15381538   AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, U64(0xffffffffffffffff))
15391539   AM_RANGE(0x00600000, 0x006007ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_modem_r, dc_modem_w )
15401540   AM_RANGE(0x00700000, 0x00707fff) AM_MIRROR(0x02000000) AM_READWRITE(dc_aica_reg_r, dc_aica_reg_w )
r23729r23730
15861586   AM_RANGE(0x005f7000, 0x005f70ff) AM_MIRROR(0x02000000) AM_DEVICE16( "rom_board", naomi_board, submap, U64(0x0000ffff0000ffff) )
15871587   AM_RANGE(0x005f7400, 0x005f74ff) AM_MIRROR(0x02000000) AM_DEVICE32( "rom_board", naomi_g1_device, amap, U64(0xffffffffffffffff) )
15881588   AM_RANGE(0x005f7800, 0x005f78ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
1589   AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, U64(0xffffffffffffffff))
1589   AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, U64(0xffffffffffffffff))
15901590   AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, U64(0xffffffffffffffff))
15911591   AM_RANGE(0x00600000, 0x006007ff) AM_MIRROR(0x02000000) AM_READWRITE(dc_modem_r, dc_modem_w )
15921592   AM_RANGE(0x00700000, 0x00707fff) AM_MIRROR(0x02000000) AM_READWRITE(dc_aica_reg_r, dc_aica_reg_w )
r23729r23730
17391739   AM_RANGE(0x005f7000, 0x005f70ff) AM_MIRROR(0x02000000) AM_DEVICE16( "rom_board", aw_rom_board, submap, U64(0x0000ffff0000ffff) )
17401740   AM_RANGE(0x005f7400, 0x005f74ff) AM_MIRROR(0x02000000) AM_DEVICE32( "rom_board", naomi_g1_device, amap, U64(0xffffffffffffffff) )
17411741   AM_RANGE(0x005f7800, 0x005f78ff) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
1742   AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, U64(0xffffffffffffffff))
1742   AM_RANGE(0x005f7c00, 0x005f7cff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, U64(0xffffffffffffffff))
17431743   AM_RANGE(0x005f8000, 0x005f9fff) AM_MIRROR(0x02000000) AM_DEVICE32("powervr2", powervr2_device, ta_map, U64(0xffffffffffffffff))
17441744   AM_RANGE(0x00600000, 0x006007ff) AM_READWRITE(aw_modem_r, aw_modem_w )
17451745   AM_RANGE(0x00700000, 0x00707fff) AM_READWRITE(dc_aica_reg_r, dc_aica_reg_w )
trunk/src/mame/video/powervr2.c
r23729r23730
8686   AM_RANGE(0x1000, 0x1fff) AM_READWRITE(palette_r,          palette_w)
8787ADDRESS_MAP_END
8888
89DEVICE_ADDRESS_MAP_START(pd_dma_map, 32, powervr2_device)
90   AM_RANGE(0x00,   0x03)   AM_READWRITE(sb_pdstap_r,        sb_pdstap_w)
91   AM_RANGE(0x04,   0x07)   AM_READWRITE(sb_pdstar_r,        sb_pdstar_w)
92   AM_RANGE(0x08,   0x0b)   AM_READWRITE(sb_pdlen_r,         sb_pdlen_w)
93   AM_RANGE(0x0c,   0x0f)   AM_READWRITE(sb_pddir_r,         sb_pddir_w)
94   AM_RANGE(0x10,   0x13)   AM_READWRITE(sb_pdtsel_r,        sb_pdtsel_w)
95   AM_RANGE(0x14,   0x17)   AM_READWRITE(sb_pden_r,          sb_pden_w)
96   AM_RANGE(0x18,   0x1b)   AM_READWRITE(sb_pdst_r,          sb_pdst_w)
97   AM_RANGE(0x80,   0x83)   AM_READWRITE(sb_pdapro_r,        sb_pdapro_w)
98ADDRESS_MAP_END
99
89100const 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};
90101const 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};
91102const 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};
r23729r23730
14561467   machine().primary_screen->configure(spg_hbstart, spg_vbstart, visarea, machine().primary_screen->frame_period().attoseconds );
14571468}
14581469
1470
1471READ32_MEMBER( powervr2_device::sb_pdstap_r )
1472{
1473   return sb_pdstap;
1474}
1475
1476WRITE32_MEMBER( powervr2_device::sb_pdstap_w )
1477{
1478   COMBINE_DATA(&sb_pdstap);
1479   m_pvr_dma.pvr_addr = sb_pdstap;
1480}
1481
1482READ32_MEMBER( powervr2_device::sb_pdstar_r )
1483{
1484   return sb_pdstar;
1485}
1486
1487WRITE32_MEMBER( powervr2_device::sb_pdstar_w )
1488{
1489   COMBINE_DATA(&sb_pdstar);
1490   m_pvr_dma.sys_addr = sb_pdstar;
1491}
1492
1493READ32_MEMBER( powervr2_device::sb_pdlen_r )
1494{
1495   return sb_pdlen;
1496}
1497
1498WRITE32_MEMBER( powervr2_device::sb_pdlen_w )
1499{
1500   COMBINE_DATA(&sb_pdlen);
1501   m_pvr_dma.size = sb_pdlen;
1502}
1503
1504READ32_MEMBER( powervr2_device::sb_pddir_r )
1505{
1506   return sb_pddir;
1507}
1508
1509WRITE32_MEMBER( powervr2_device::sb_pddir_w )
1510{
1511   COMBINE_DATA(&sb_pddir);
1512   m_pvr_dma.dir = sb_pddir;
1513}
1514
1515READ32_MEMBER( powervr2_device::sb_pdtsel_r )
1516{
1517   return sb_pdtsel;
1518}
1519
1520WRITE32_MEMBER( powervr2_device::sb_pdtsel_w )
1521{
1522   COMBINE_DATA(&sb_pdtsel);
1523   m_pvr_dma.sel = sb_pdtsel & 1;
1524}
1525
1526READ32_MEMBER( powervr2_device::sb_pden_r )
1527{
1528   return sb_pden;
1529}
1530
1531WRITE32_MEMBER( powervr2_device::sb_pden_w )
1532{
1533   COMBINE_DATA(&sb_pden);
1534   m_pvr_dma.flag = sb_pden & 1;
1535}
1536
1537READ32_MEMBER( powervr2_device::sb_pdst_r )
1538{
1539   return sb_pdst;
1540}
1541
1542WRITE32_MEMBER( powervr2_device::sb_pdst_w )
1543{
1544   COMBINE_DATA(&sb_pdst);
1545
1546   UINT32 old = m_pvr_dma.start & 1;
1547   m_pvr_dma.start = sb_pdst & 1;
1548
1549   if(((old & 1) == 0) && m_pvr_dma.flag && m_pvr_dma.start && ((m_pvr_dma.sel & 1) == 0)) // 0 -> 1
1550      pvr_dma_execute(space);
1551}
1552
1553READ32_MEMBER( powervr2_device::sb_pdapro_r )
1554{
1555   return sb_pdapro;
1556}
1557
1558WRITE32_MEMBER( powervr2_device::sb_pdapro_w )
1559{
1560   COMBINE_DATA(&sb_pdapro);
1561}
1562
1563
14591564TIMER_CALLBACK_MEMBER(powervr2_device::transfer_opaque_list_irq)
14601565{
14611566   irq_cb(EOXFER_OPLST_IRQ);
r23729r23730
18041909// SB_LMMODE0
18051910WRITE64_MEMBER(powervr2_device::ta_texture_directpath0_w )
18061911{
1807   int mode = pvrctrl_regs[SB_LMMODE0]&1;
1912   // That's not in the pvr control address space, it's in g2's
1913   //   int mode = pvrctrl_regs[SB_LMMODE0]&1;
1914   int mode = 0;
18081915   if (mode&1)
18091916   {
18101917      printf("ta_texture_directpath0_w 32-bit access!\n");
r23729r23730
18191926// SB_LMMODE1
18201927WRITE64_MEMBER(powervr2_device::ta_texture_directpath1_w )
18211928{
1822   int mode = pvrctrl_regs[SB_LMMODE1]&1;
1929   // That's not in the pvr control address space, it's in g2's
1930   //   int mode = pvrctrl_regs[SB_LMMODE1]&1;
1931   int mode = 0;
18231932   if (mode&1)
18241933   {
18251934      printf("ta_texture_directpath1_w 32-bit access!\n");
r23729r23730
28302939
28312940TIMER_CALLBACK_MEMBER(powervr2_device::pvr_dma_irq)
28322941{
2833   m_pvr_dma.start = pvrctrl_regs[SB_PDST] = 0;
2942   m_pvr_dma.start = sb_pdst = 0;
28342943   irq_cb(DMA_PVR_IRQ);
28352944}
28362945
2837READ32_MEMBER(powervr2_device::pvr_ctrl_r)
2838{
2839   #if DEBUG_PVRCTRL
2840   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());
2841   #endif
2842
2843   return (UINT64)pvrctrl_regs[offset];
2844}
2845
2846WRITE32_MEMBER(powervr2_device::pvr_ctrl_w)
2847{
2848   UINT8 old;
2849
2850   switch (offset)
2851   {
2852      case SB_PDSTAP: m_pvr_dma.pvr_addr = data; break;
2853      case SB_PDSTAR: m_pvr_dma.sys_addr = data; break;
2854      case SB_PDLEN: m_pvr_dma.size = data; break;
2855      case SB_PDDIR: m_pvr_dma.dir = data & 1; break;
2856      case SB_PDTSEL:
2857         m_pvr_dma.sel = data & 1;
2858         //if(m_pvr_dma.sel & 1)
2859         //  printf("Warning: Unsupported irq mode trigger PVR-DMA\n");
2860         break;
2861      case SB_PDEN: m_pvr_dma.flag = data & 1; break;
2862      case SB_PDST:
2863         old = m_pvr_dma.start & 1;
2864         m_pvr_dma.start = data & 1;
2865
2866         if(((old & 1) == 0) && m_pvr_dma.flag && m_pvr_dma.start && ((m_pvr_dma.sel & 1) == 0)) // 0 -> 1
2867            pvr_dma_execute(space);
2868         break;
2869   }
2870
2871   #if DEBUG_PVRCTRL
2872   mame_printf_verbose("PVRCTRL: [%08x=%x] write %x to %x (reg %x), mask %x\n", 0x5f7c00+reg*4, data, offset, mem_mask);
2873   #endif
2874
2875   pvrctrl_regs[offset] = data;
2876}
2877
28782946void powervr2_device::pvr_dma_execute(address_space &space)
28792947{
28802948   UINT32 src,dst,size;
r23729r23730
29232991{
29242992   irq_cb.resolve_safe();
29252993
2926   memset(pvrctrl_regs, 0, sizeof(pvrctrl_regs));
29272994   memset(grab, 0, sizeof(grab));
29282995   pvr_build_parameterconfig();
29292996
r23729r23730
29803047   memset(fog_table, 0, sizeof(fog_table));
29813048   memset(palette, 0, sizeof(palette));
29823049
3050   sb_pdstap = 0;
3051   sb_pdstar = 0;
3052   sb_pdlen = 0;
3053   sb_pddir = 0;
3054   sb_pdtsel = 0;
3055   sb_pden = 0;
3056   sb_pdst = 0;
3057   sb_pdapro = 0;
3058
29833059   save_item(NAME(softreset));
29843060   save_item(NAME(param_base));
29853061   save_item(NAME(region_base));
r23729r23730
30213097   save_pointer(NAME(fog_table), 0x80);
30223098   save_pointer(NAME(palette), 0x400);
30233099
3100   save_item(NAME(sb_pdstap));
3101   save_item(NAME(sb_pdstar));
3102   save_item(NAME(sb_pdlen));
3103   save_item(NAME(sb_pddir));
3104   save_item(NAME(sb_pdtsel));
3105   save_item(NAME(sb_pden));
3106   save_item(NAME(sb_pdst));
3107   save_item(NAME(sb_pdapro));
3108
30243109   save_item(NAME(m_pvr_dma.pvr_addr));
30253110   save_item(NAME(m_pvr_dma.sys_addr));
30263111   save_item(NAME(m_pvr_dma.size));
r23729r23730
30283113   save_item(NAME(m_pvr_dma.dir));
30293114   save_item(NAME(m_pvr_dma.flag));
30303115   save_item(NAME(m_pvr_dma.start));
3031   save_pointer(NAME(pvrctrl_regs),0x100/4);
30323116   save_item(NAME(debug_dip_status));
30333117   save_pointer(NAME(tafifo_buff),32);
30343118   save_item(NAME(scanline));
trunk/src/mame/video/powervr2.h
r23729r23730
2626   };
2727
2828   DECLARE_ADDRESS_MAP(ta_map, 32);
29   DECLARE_ADDRESS_MAP(pd_dma_map, 32);
2930
3031   struct {
3132      UINT32 pvr_addr;
r23729r23730
114115   UINT64 *pvr2_framebuffer_ram;
115116   UINT64 *elan_ram;
116117
117
118   UINT32 pvrctrl_regs[0x100/4];
119118   UINT32 debug_dip_status;
120119   emu_timer *vbout_timer;
121120   emu_timer *vbin_timer;
r23729r23730
220219   DECLARE_READ32_MEMBER(  palette_r );
221220   DECLARE_WRITE32_MEMBER( palette_w );
222221
222   DECLARE_READ32_MEMBER(  sb_pdstap_r );
223   DECLARE_WRITE32_MEMBER( sb_pdstap_w );
224   DECLARE_READ32_MEMBER(  sb_pdstar_r );
225   DECLARE_WRITE32_MEMBER( sb_pdstar_w );
226   DECLARE_READ32_MEMBER(  sb_pdlen_r );
227   DECLARE_WRITE32_MEMBER( sb_pdlen_w );
228   DECLARE_READ32_MEMBER(  sb_pddir_r );
229   DECLARE_WRITE32_MEMBER( sb_pddir_w );
230   DECLARE_READ32_MEMBER(  sb_pdtsel_r );
231   DECLARE_WRITE32_MEMBER( sb_pdtsel_w );
232   DECLARE_READ32_MEMBER(  sb_pden_r );
233   DECLARE_WRITE32_MEMBER( sb_pden_w );
234   DECLARE_READ32_MEMBER(  sb_pdst_r );
235   DECLARE_WRITE32_MEMBER( sb_pdst_w );
236   DECLARE_READ32_MEMBER(  sb_pdapro_r );
237   DECLARE_WRITE32_MEMBER( sb_pdapro_w );
223238
224   DECLARE_READ32_MEMBER(  pvr_ctrl_r );
225   DECLARE_WRITE32_MEMBER( pvr_ctrl_w );
226239   DECLARE_READ32_MEMBER(  pvr_ta_r );
227240   DECLARE_WRITE32_MEMBER( pvr_ta_w );
228241   DECLARE_READ32_MEMBER(  pvr2_ta_r );
r23729r23730
280293   UINT32 fog_table[0x80];
281294   UINT32 palette[0x400];
282295
296   // PD DMA registers
297   UINT32 sb_pdstap, sb_pdstar, sb_pdlen, sb_pddir, sb_pdtsel, sb_pden, sb_pdst, sb_pdapro;
298
283299   static UINT32 (*const blend_functions[64])(UINT32 s, UINT32 d);
284300
285301   static inline INT32 clamp(INT32 in, INT32 min, INT32 max);
trunk/src/mame/includes/dc.h
r23729r23730
231231#define SB_DDSTARD  ((0x005f78f4-0x005f7800)/4)
232232#define SB_DDLEND   ((0x005f78f8-0x005f7800)/4)
233233
234/*------------- PowerVR Interface -------------*/
235#define SB_PDSTAP   ((0x005f7c00-0x005f7c00)/4)
236#define SB_PDSTAR   ((0x005f7c04-0x005f7c00)/4)
237#define SB_PDLEN    ((0x005f7c08-0x005f7c00)/4)
238#define SB_PDDIR    ((0x005f7c0c-0x005f7c00)/4)
239#define SB_PDTSEL   ((0x005f7c10-0x005f7c00)/4)
240#define SB_PDEN     ((0x005f7c14-0x005f7c00)/4)
241#define SB_PDST     ((0x005f7c18-0x005f7c00)/4)
242#define SB_PDAPRO   ((0x005f7c80-0x005f7c00)/4)
243
244234#define RTC1        ((0x00710000-0x00710000)/4)
245235#define RTC2        ((0x00710004-0x00710000)/4)
246236#define RTC3        ((0x00710008-0x00710000)/4)
trunk/src/mess/drivers/dccons.c
r23729r23730
118118   AM_RANGE(0x005f7000, 0x005f70ff) AM_READWRITE(dc_mess_gdrom_r, dc_mess_gdrom_w )
119119   AM_RANGE(0x005f7400, 0x005f74ff) AM_READWRITE(dc_mess_g1_ctrl_r, dc_mess_g1_ctrl_w )
120120   AM_RANGE(0x005f7800, 0x005f78ff) AM_READWRITE(dc_g2_ctrl_r, dc_g2_ctrl_w )
121   AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVREADWRITE32("powervr2", powervr2_device, pvr_ctrl_r, pvr_ctrl_w, U64(0xffffffffffffffff))
121   AM_RANGE(0x005f7c00, 0x005f7cff) AM_DEVICE32("powervr2", powervr2_device, pd_dma_map, U64(0xffffffffffffffff))
122122   AM_RANGE(0x005f8000, 0x005f9fff) AM_DEVICE32("powervr2", powervr2_device, ta_map, U64(0xffffffffffffffff))
123123   AM_RANGE(0x00600000, 0x006007ff) AM_READWRITE(dc_modem_r, dc_modem_w )
124124   AM_RANGE(0x00700000, 0x00707fff) AM_READWRITE(dc_aica_reg_r, dc_aica_reg_w )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team