Previous 199869 Revisions Next

r32301 Tuesday 23rd September, 2014 at 07:44:52 UTC by Barry Rodewald
trident: added XOR drawing, added XNEG and YNEG reverse directions for mono pattern BitBLT.
[src/emu/bus/isa]trident.c trident.h

trunk/src/emu/bus/isa/trident.c
r32300r32301
5050void trident_vga_device::WRITEPIXEL8(INT16 x, INT16 y, UINT8 data)
5151{
5252   if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
53   {
54      data = handle_rop(data,READPIXEL8(x,y)) & 0xff;
5355      vga.memory[((y & 0xfff)*offset() + (x & 0xfff)) % vga.svga_intf.vram_size] = data;
56   }
5457}
5558
5659void trident_vga_device::WRITEPIXEL15(INT16 x, INT16 y, UINT16 data)
5760{
5861   if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
5962   {
63      data = handle_rop(data,READPIXEL8(x,y)) & 0x7fff;
6064      vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] = data & 0x00ff;
6165      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] = (data & 0x7f00) >> 8;
6266   }
r32300r32301
6670{
6771   if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
6872   {
73      data = handle_rop(data,READPIXEL8(x,y)) & 0xffff;
6974      vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] = data & 0x00ff;
7075      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] = (data & 0xff00) >> 8;
7176   }
r32300r32301
7580{
7681   if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
7782   {
83      data = handle_rop(data,READPIXEL8(x,y));
7884      vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*4) % vga.svga_intf.vram_size] = data & 0x000000ff;
7985      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+1) % vga.svga_intf.vram_size] = (data & 0x0000ff00) >> 8;
8086      vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+2) % vga.svga_intf.vram_size] = (data & 0x00ff0000) >> 16;
r32300r32301
8288   }
8389}
8490
91UINT32 trident_vga_device::handle_rop(UINT32 src, UINT32 dst)
92{
93   switch(tri.accel_fmix)  // TODO: better understand this register
94   {
95   case 0xf0:  // PAT
96   case 0xcc:  // SRC
97      break;  // pass data through
98   case 0x00:  // 0
99      src = 0;
100      break;
101   case 0xff:  // 1
102      src = 0xffffffff;
103      break;
104   case 0x66:  // XOR
105   case 0x5a:  // XOR PAT
106      src = dst ^ src;
107      break;
108   }
109   return src;
110}
111
85112UINT32 trident_vga_device::READPIXEL(INT16 x,INT16 y)
86113{
87114   if(svga.rgb8_en)
r32300r32301
11681195// feed data written to VRAM to an active BitBLT command
11691196void trident_vga_device::accel_data_write(UINT32 data)
11701197{
1198   int xdir = 1,ydir = 1;
1199
1200   if(tri.accel_drawflags & 0x0200)  // XNEG
1201      xdir = -1;
1202   if(tri.accel_drawflags & 0x0100)  // YNEG
1203      ydir = -1;
1204
11711205   for(int x=31;x>=0;x--)
11721206   {
1173      if(tri.accel_mem_x <= tri.accel_dest_x+tri.accel_dim_x)
1207      if(tri.accel_mem_x <= tri.accel_dest_x+tri.accel_dim_x && tri.accel_mem_x >= tri.accel_dest_x-tri.accel_dim_x)
11741208      {
11751209         if(((data >> x) & 0x01) != 0)
11761210            WRITEPIXEL(tri.accel_mem_x,tri.accel_mem_y,tri.accel_fgcolour);
11771211         else
11781212            WRITEPIXEL(tri.accel_mem_x,tri.accel_mem_y,tri.accel_bgcolour);
11791213      }
1180      tri.accel_mem_x++;
1214      tri.accel_mem_x+=xdir;
11811215   }
1182   if(tri.accel_mem_x > tri.accel_dest_x+tri.accel_dim_x)
1216   if(tri.accel_mem_x > tri.accel_dest_x+tri.accel_dim_x || tri.accel_mem_x < tri.accel_dest_x-tri.accel_dim_x)
11831217   {
11841218      tri.accel_mem_x = tri.accel_dest_x;
1185      tri.accel_mem_y++;
1186      if(tri.accel_mem_y > tri.accel_dest_y+tri.accel_dim_y)
1219      tri.accel_mem_y+=ydir;
1220      if(tri.accel_mem_y > tri.accel_dest_y+tri.accel_dim_y || tri.accel_mem_y < tri.accel_dest_y-tri.accel_dim_y)
11871221         tri.accel_memwrite_active = false;  // completed
11881222   }
11891223}
trunk/src/emu/bus/isa/trident.h
r32300r32301
115115   void WRITEPIXEL32(INT16 x, INT16 y, UINT32 data);
116116   UINT32 READPIXEL(INT16 x,INT16 y);
117117   void WRITEPIXEL(INT16 x,INT16 y, UINT32 data);
118   UINT32 handle_rop(UINT32 src, UINT32 dst);
118119};
119120
120121

Previous 199869 Revisions Next


© 1997-2024 The MAME Team