mirror of
https://github.com/holub/mame
synced 2025-10-07 01:16:22 +03:00
trident: added XOR drawing, added XNEG and YNEG reverse directions for mono pattern BitBLT.
This commit is contained in:
parent
03a6c85577
commit
77621a9438
@ -50,13 +50,17 @@ UINT32 trident_vga_device::READPIXEL32(INT16 x, INT16 y)
|
|||||||
void trident_vga_device::WRITEPIXEL8(INT16 x, INT16 y, UINT8 data)
|
void trident_vga_device::WRITEPIXEL8(INT16 x, INT16 y, UINT8 data)
|
||||||
{
|
{
|
||||||
if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
|
if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
|
||||||
|
{
|
||||||
|
data = handle_rop(data,READPIXEL8(x,y)) & 0xff;
|
||||||
vga.memory[((y & 0xfff)*offset() + (x & 0xfff)) % vga.svga_intf.vram_size] = data;
|
vga.memory[((y & 0xfff)*offset() + (x & 0xfff)) % vga.svga_intf.vram_size] = data;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void trident_vga_device::WRITEPIXEL15(INT16 x, INT16 y, UINT16 data)
|
void trident_vga_device::WRITEPIXEL15(INT16 x, INT16 y, UINT16 data)
|
||||||
{
|
{
|
||||||
if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
|
if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
|
||||||
{
|
{
|
||||||
|
data = handle_rop(data,READPIXEL8(x,y)) & 0x7fff;
|
||||||
vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] = data & 0x00ff;
|
vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] = data & 0x00ff;
|
||||||
vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] = (data & 0x7f00) >> 8;
|
vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] = (data & 0x7f00) >> 8;
|
||||||
}
|
}
|
||||||
@ -66,6 +70,7 @@ void trident_vga_device::WRITEPIXEL16(INT16 x, INT16 y, UINT16 data)
|
|||||||
{
|
{
|
||||||
if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
|
if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
|
||||||
{
|
{
|
||||||
|
data = handle_rop(data,READPIXEL8(x,y)) & 0xffff;
|
||||||
vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] = data & 0x00ff;
|
vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*2) % vga.svga_intf.vram_size] = data & 0x00ff;
|
||||||
vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] = (data & 0xff00) >> 8;
|
vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*2)+1) % vga.svga_intf.vram_size] = (data & 0xff00) >> 8;
|
||||||
}
|
}
|
||||||
@ -75,6 +80,7 @@ void trident_vga_device::WRITEPIXEL32(INT16 x, INT16 y, UINT32 data)
|
|||||||
{
|
{
|
||||||
if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
|
if((x & 0xfff)<tri.accel_dest_x_clip && (y & 0xfff)<tri.accel_dest_y_clip)
|
||||||
{
|
{
|
||||||
|
data = handle_rop(data,READPIXEL8(x,y));
|
||||||
vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*4) % vga.svga_intf.vram_size] = data & 0x000000ff;
|
vga.memory[((y & 0xfff)*offset() + (x & 0xfff)*4) % vga.svga_intf.vram_size] = data & 0x000000ff;
|
||||||
vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+1) % vga.svga_intf.vram_size] = (data & 0x0000ff00) >> 8;
|
vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+1) % vga.svga_intf.vram_size] = (data & 0x0000ff00) >> 8;
|
||||||
vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+2) % vga.svga_intf.vram_size] = (data & 0x00ff0000) >> 16;
|
vga.memory[((y & 0xfff)*offset() + ((x & 0xfff)*4)+2) % vga.svga_intf.vram_size] = (data & 0x00ff0000) >> 16;
|
||||||
@ -82,6 +88,27 @@ void trident_vga_device::WRITEPIXEL32(INT16 x, INT16 y, UINT32 data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT32 trident_vga_device::handle_rop(UINT32 src, UINT32 dst)
|
||||||
|
{
|
||||||
|
switch(tri.accel_fmix) // TODO: better understand this register
|
||||||
|
{
|
||||||
|
case 0xf0: // PAT
|
||||||
|
case 0xcc: // SRC
|
||||||
|
break; // pass data through
|
||||||
|
case 0x00: // 0
|
||||||
|
src = 0;
|
||||||
|
break;
|
||||||
|
case 0xff: // 1
|
||||||
|
src = 0xffffffff;
|
||||||
|
break;
|
||||||
|
case 0x66: // XOR
|
||||||
|
case 0x5a: // XOR PAT
|
||||||
|
src = dst ^ src;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
|
||||||
UINT32 trident_vga_device::READPIXEL(INT16 x,INT16 y)
|
UINT32 trident_vga_device::READPIXEL(INT16 x,INT16 y)
|
||||||
{
|
{
|
||||||
if(svga.rgb8_en)
|
if(svga.rgb8_en)
|
||||||
@ -1168,22 +1195,29 @@ void trident_vga_device::accel_line()
|
|||||||
// feed data written to VRAM to an active BitBLT command
|
// feed data written to VRAM to an active BitBLT command
|
||||||
void trident_vga_device::accel_data_write(UINT32 data)
|
void trident_vga_device::accel_data_write(UINT32 data)
|
||||||
{
|
{
|
||||||
|
int xdir = 1,ydir = 1;
|
||||||
|
|
||||||
|
if(tri.accel_drawflags & 0x0200) // XNEG
|
||||||
|
xdir = -1;
|
||||||
|
if(tri.accel_drawflags & 0x0100) // YNEG
|
||||||
|
ydir = -1;
|
||||||
|
|
||||||
for(int x=31;x>=0;x--)
|
for(int x=31;x>=0;x--)
|
||||||
{
|
{
|
||||||
if(tri.accel_mem_x <= tri.accel_dest_x+tri.accel_dim_x)
|
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)
|
||||||
{
|
{
|
||||||
if(((data >> x) & 0x01) != 0)
|
if(((data >> x) & 0x01) != 0)
|
||||||
WRITEPIXEL(tri.accel_mem_x,tri.accel_mem_y,tri.accel_fgcolour);
|
WRITEPIXEL(tri.accel_mem_x,tri.accel_mem_y,tri.accel_fgcolour);
|
||||||
else
|
else
|
||||||
WRITEPIXEL(tri.accel_mem_x,tri.accel_mem_y,tri.accel_bgcolour);
|
WRITEPIXEL(tri.accel_mem_x,tri.accel_mem_y,tri.accel_bgcolour);
|
||||||
}
|
}
|
||||||
tri.accel_mem_x++;
|
tri.accel_mem_x+=xdir;
|
||||||
}
|
}
|
||||||
if(tri.accel_mem_x > tri.accel_dest_x+tri.accel_dim_x)
|
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)
|
||||||
{
|
{
|
||||||
tri.accel_mem_x = tri.accel_dest_x;
|
tri.accel_mem_x = tri.accel_dest_x;
|
||||||
tri.accel_mem_y++;
|
tri.accel_mem_y+=ydir;
|
||||||
if(tri.accel_mem_y > tri.accel_dest_y+tri.accel_dim_y)
|
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)
|
||||||
tri.accel_memwrite_active = false; // completed
|
tri.accel_memwrite_active = false; // completed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,6 +115,7 @@ private:
|
|||||||
void WRITEPIXEL32(INT16 x, INT16 y, UINT32 data);
|
void WRITEPIXEL32(INT16 x, INT16 y, UINT32 data);
|
||||||
UINT32 READPIXEL(INT16 x,INT16 y);
|
UINT32 READPIXEL(INT16 x,INT16 y);
|
||||||
void WRITEPIXEL(INT16 x,INT16 y, UINT32 data);
|
void WRITEPIXEL(INT16 x,INT16 y, UINT32 data);
|
||||||
|
UINT32 handle_rop(UINT32 src, UINT32 dst);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user