Previous 199869 Revisions Next

r32244 Sunday 21st September, 2014 at 04:43:40 UTC by Barry Rodewald
trident: added 2D acceleration support for 15/16/32bpp video modes (untested since XFree86 3.3 requires linear addressing, which in turn requires VLB or PCI support :()
[src/emu/bus/isa]trident.c trident.h

trunk/src/emu/bus/isa/trident.c
r32243r32244
1414
1515#define CRTC_PORT_ADDR ((vga.miscellaneous_output&1)?0x3d0:0x3b0)
1616
17#define READPIXEL8(x,y) (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)) % vga.svga_intf.vram_size])
18#define WRITEPIXEL8(x,y,c) if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip) \
19   (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)) % vga.svga_intf.vram_size] = c)
20
2117#define LOG (1)
2218#define LOG_ACCEL (0)
2319
r32243r32244
2622{
2723}
2824
25UINT8 trident_vga_device::READPIXEL8(INT16 x, INT16 y)
26{
27   return (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)) % vga.svga_intf.vram_size]);
28}
29
30UINT16 trident_vga_device::READPIXEL15(INT16 x, INT16 y)
31{
32   return (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] |
33           (vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] << 8));
34}
35
36UINT16 trident_vga_device::READPIXEL16(INT16 x, INT16 y)
37{
38   return (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] |
39           (vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] << 8));
40}
41
42UINT32 trident_vga_device::READPIXEL32(INT16 x, INT16 y)
43{
44   return (vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*4) % vga.svga_intf.vram_size] |
45         (vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+1) % vga.svga_intf.vram_size] << 8) |
46         (vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+2) % vga.svga_intf.vram_size] << 16) |
47         (vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+3) % vga.svga_intf.vram_size] << 24));
48}
49
50void trident_vga_device::WRITEPIXEL8(INT16 x, INT16 y, UINT8 data)
51{
52   if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
53      vga.memory[((y & 0xfff)*offset() + (x & 0xfff)) % vga.svga_intf.vram_size] = data;
54}
55
56void trident_vga_device::WRITEPIXEL15(INT16 x, INT16 y, UINT16 data)
57{
58   if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
59   {
60      vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] = data & 0x00ff;
61      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] = (data & 0x7f00) >> 8;
62   }
63}
64
65void trident_vga_device::WRITEPIXEL16(INT16 x, INT16 y, UINT16 data)
66{
67   if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
68   {
69      vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] = data & 0x00ff;
70      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] = (data & 0xff00) >> 8;
71   }
72}
73
74void trident_vga_device::WRITEPIXEL32(INT16 x, INT16 y, UINT32 data)
75{
76   if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
77   {
78      vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*4) % vga.svga_intf.vram_size] = data & 0x000000ff;
79      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+1) % vga.svga_intf.vram_size] = (data & 0x0000ff00) >> 8;
80      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+2) % vga.svga_intf.vram_size] = (data & 0x00ff0000) >> 16;
81      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+3) % vga.svga_intf.vram_size] = (data & 0xff000000) >> 24;
82   }
83}
84
85UINT32 trident_vga_device::READPIXEL(INT16 x,INT16 y)
86{
87   if(svga.rgb8_en)
88      return READPIXEL8(x,y) & 0xff;
89   if(svga.rgb15_en)
90      return READPIXEL15(x,y) & 0x7fff;
91   if(svga.rgb16_en)
92      return READPIXEL16(x,y) & 0xffff;
93   if(svga.rgb32_en)
94      return READPIXEL32(x,y);
95   return 0;  // should never reach here
96}
97
98void trident_vga_device::WRITEPIXEL(INT16 x,INT16 y, UINT32 data)
99{
100   if(svga.rgb8_en)
101      WRITEPIXEL8(x,y,data & 0xff);
102   if(svga.rgb15_en)
103      WRITEPIXEL15(x,y,data & 0x7fff);
104   if(svga.rgb16_en)
105      WRITEPIXEL16(x,y,data & 0xffff);
106   if(svga.rgb32_en)
107      WRITEPIXEL32(x,y,data);
108}
109
110
29111void trident_vga_device::device_start()
30112{
31113   memset(&vga, 0, sizeof(vga));
r32243r32244
10341116      {
10351117         if(tri.accel_drawflags & 0x4000)  // Solid fill
10361118         {
1037            WRITEPIXEL8(x,y,tri.accel_fgcolour);
1119            WRITEPIXEL(x,y,tri.accel_fgcolour);
10381120         }
10391121         else
10401122         {
1041            WRITEPIXEL8(x,y,READPIXEL8(sx,sy));
1123            WRITEPIXEL(x,y,READPIXEL(sx,sy));
10421124         }
10431125      }
10441126   }
r32243r32244
10671149   }
10681150   for(;;)
10691151   {
1070      WRITEPIXEL8(tri.accel_dest_x,tri.accel_dest_y,col);
1152      WRITEPIXEL(tri.accel_dest_x,tri.accel_dest_y,col);
10711153      if (count > tri.accel_dim_y) break;
10721154      count++;
10731155      if((err*2) > -dy)
r32243r32244
10891171   for(int x=31;x>=0;x--)
10901172   {
10911173      if(((data >> x) & 0x01) != 0)
1092         WRITEPIXEL8(tri.accel_mem_x,tri.accel_mem_y,tri.accel_fgcolour);
1174         WRITEPIXEL(tri.accel_mem_x,tri.accel_mem_y,tri.accel_fgcolour);
10931175      tri.accel_mem_x++;
10941176   }
10951177   if(tri.accel_mem_x > tri.accel_dest_x+tri.accel_dim_x)
trunk/src/emu/bus/isa/trident.h
r32243r32244
105105   void accel_bitblt();
106106   void accel_line();
107107   void accel_data_write(UINT32 data);
108   UINT8 READPIXEL8(INT16 x, INT16 y);
109   UINT16 READPIXEL15(INT16 x, INT16 y);
110   UINT16 READPIXEL16(INT16 x, INT16 y);
111   UINT32 READPIXEL32(INT16 x, INT16 y);
112   void WRITEPIXEL8(INT16 x, INT16 y, UINT8 data);
113   void WRITEPIXEL15(INT16 x, INT16 y, UINT16 data);
114   void WRITEPIXEL16(INT16 x, INT16 y, UINT16 data);
115   void WRITEPIXEL32(INT16 x, INT16 y, UINT32 data);
116   UINT32 READPIXEL(INT16 x,INT16 y);
117   void WRITEPIXEL(INT16 x,INT16 y, UINT32 data);
108118};
109119
110120

Previous 199869 Revisions Next


© 1997-2024 The MAME Team