Added preliminary superimposing flag for CGA, and implemented for Tetris KR, now it properly mixes between CGA graphics and external background [Angelo Salese]

This commit is contained in:
Angelo Salese 2011-12-25 17:55:49 +00:00
parent 9f1a538301
commit 7456bb6a4b
3 changed files with 62 additions and 4 deletions

View File

@ -117,6 +117,7 @@ static SCREEN_UPDATE( tetriskr )
for(xi=0;xi<8;xi++)
{
color = 0;
/* TODO: first byte seems bogus? */
for(pen_i = 0;pen_i<4;pen_i++)
color |= ((bg_rom[y*320/8+x+(pen_i*0x20000)+yi*0x400+state->m_bg_bank*0x2000+1] >> (7-xi)) & 1) << pen_i;
@ -127,7 +128,7 @@ static SCREEN_UPDATE( tetriskr )
}
}
//SCREEN_UPDATE_CALL(mc6845_cga);
SCREEN_UPDATE_CALL(mc6845_cga);
return 0;
}
@ -711,6 +712,7 @@ static MACHINE_CONFIG_DERIVED( tetriskr, filetto )
MCFG_CPU_IO_MAP(tetriskr_io)
MCFG_DEVICE_MODIFY("screen")
MCFG_VIDEO_START(pc_cga_superimpose)
MCFG_SCREEN_UPDATE(tetriskr)
MCFG_DEVICE_REMOVE("voice")

View File

@ -265,6 +265,7 @@ static struct
size_t videoram_size;
UINT8 *videoram;
UINT8 is_superimpose;
} cga;
@ -350,6 +351,7 @@ static VIDEO_START( pc_cga )
internal_pc_cga_video_start(machine);
cga.videoram_size = 0x4000;
cga.videoram = auto_alloc_array(machine, UINT8, 0x4000);
cga.is_superimpose = 0;
memory_set_bankptr(machine,"bank11", cga.videoram);
}
@ -390,6 +392,7 @@ static VIDEO_START( pc_cga32k )
cga.videoram_size = 0x8000;
cga.videoram = auto_alloc_array(machine, UINT8, 0x8000);
cga.is_superimpose = 0;
memory_set_bankptr(machine,"bank11", cga.videoram);
}
@ -439,6 +442,13 @@ static SCREEN_UPDATE( cga_poisk2 )
return 0;
}
/* for superimposing CGA over a different source video (i.e. tetriskr) */
VIDEO_START( pc_cga_superimpose )
{
VIDEO_START_CALL( pc_cga );
cga.is_superimpose = 1;
}
/***************************************************************************
Draw text mode with 40x25 characters (default) with high intensity bg.
The character cell size is 16x8
@ -602,6 +612,51 @@ static MC6845_UPDATE_ROW( cga_text_blink_update_row )
}
}
static MC6845_UPDATE_ROW( cga_text_blink_update_row_si )
{
UINT8 *videoram = cga.videoram;
UINT16 *p = BITMAP_ADDR16(bitmap, y, 0);
int i;
running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_text_blink_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset +1 ];
UINT8 data = cga.chr_gen[ chr * 8 + ra ];
UINT16 fg = attr & 0x0F;
UINT16 bg = attr >> 4;
UINT8 xi;
if ( i == cursor_x )
{
if ( cga.frame & 0x08 )
{
data = 0xFF;
}
}
else
{
if ( ( attr & 0x80 ) && ( cga.frame & 0x10 ) )
{
data = 0x00;
}
}
for(xi=0;xi<8;xi++)
{
UINT8 pen_data, dot;
dot = (data & (1 << (7-xi)));
pen_data = dot ? fg : bg;
if(pen_data || dot)
*p = pen_data;
p++;
}
}
}
/***************************************************************************
Draw text mode with 40x25 characters (default) and blinking colors.
@ -981,18 +1036,18 @@ static void pc_cga_mode_control_w(running_machine &machine, int data)
if ( cga.mode_control & 0x04 )
{
/* Composite greyscale */
cga.update_row = cga_text_blink_update_row;
cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row;
}
else
{
/* Composite colour */
cga.update_row = cga_text_blink_update_row;
cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row;
}
}
else
{
/* RGB colour */
cga.update_row = cga_text_blink_update_row;
cga.update_row = cga.is_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row;
}
break;
case 0x38: case 0x39: case 0x3C: case 0x3D:

View File

@ -11,6 +11,7 @@ MACHINE_CONFIG_EXTERN( pcvideo_cga_320x200 );
MACHINE_CONFIG_EXTERN( pcvideo_cga32k );
INPUT_PORTS_EXTERN( pcvideo_cga );
SCREEN_UPDATE( mc6845_cga );
VIDEO_START( pc_cga_superimpose );
/* has a special 640x200 in 16 color mode, 4 banks at 0xb8000 */
MACHINE_CONFIG_EXTERN( pcvideo_pc1512 );