From 77621a94382ebcf6b83d9879c406b00e581daa22 Mon Sep 17 00:00:00 2001 From: mahlemiut Date: Tue, 23 Sep 2014 07:44:52 +0000 Subject: [PATCH] trident: added XOR drawing, added XNEG and YNEG reverse directions for mono pattern BitBLT. --- src/emu/bus/isa/trident.c | 44 ++++++++++++++++++++++++++++++++++----- src/emu/bus/isa/trident.h | 1 + 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/emu/bus/isa/trident.c b/src/emu/bus/isa/trident.c index bace8a9ca0d..ca53b3ac56d 100644 --- a/src/emu/bus/isa/trident.c +++ b/src/emu/bus/isa/trident.c @@ -50,13 +50,17 @@ UINT32 trident_vga_device::READPIXEL32(INT16 x, INT16 y) void trident_vga_device::WRITEPIXEL8(INT16 x, INT16 y, UINT8 data) { if((x & 0xfff)> 8; } @@ -66,6 +70,7 @@ void trident_vga_device::WRITEPIXEL16(INT16 x, INT16 y, UINT16 data) { if((x & 0xfff)> 8; } @@ -75,6 +80,7 @@ void trident_vga_device::WRITEPIXEL32(INT16 x, INT16 y, UINT32 data) { if((x & 0xfff)> 8; 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) { if(svga.rgb8_en) @@ -1168,22 +1195,29 @@ void trident_vga_device::accel_line() // feed data written to VRAM to an active BitBLT command 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--) { - 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) WRITEPIXEL(tri.accel_mem_x,tri.accel_mem_y,tri.accel_fgcolour); else 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_y++; - if(tri.accel_mem_y > tri.accel_dest_y+tri.accel_dim_y) + tri.accel_mem_y+=ydir; + 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 } } diff --git a/src/emu/bus/isa/trident.h b/src/emu/bus/isa/trident.h index 8a2de90cc56..e77978fc247 100644 --- a/src/emu/bus/isa/trident.h +++ b/src/emu/bus/isa/trident.h @@ -115,6 +115,7 @@ private: void WRITEPIXEL32(INT16 x, INT16 y, UINT32 data); UINT32 READPIXEL(INT16 x,INT16 y); void WRITEPIXEL(INT16 x,INT16 y, UINT32 data); + UINT32 handle_rop(UINT32 src, UINT32 dst); };