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++) for(xi=0;xi<8;xi++)
{ {
color = 0; color = 0;
/* TODO: first byte seems bogus? */
for(pen_i = 0;pen_i<4;pen_i++) 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; 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; return 0;
} }
@ -711,6 +712,7 @@ static MACHINE_CONFIG_DERIVED( tetriskr, filetto )
MCFG_CPU_IO_MAP(tetriskr_io) MCFG_CPU_IO_MAP(tetriskr_io)
MCFG_DEVICE_MODIFY("screen") MCFG_DEVICE_MODIFY("screen")
MCFG_VIDEO_START(pc_cga_superimpose)
MCFG_SCREEN_UPDATE(tetriskr) MCFG_SCREEN_UPDATE(tetriskr)
MCFG_DEVICE_REMOVE("voice") MCFG_DEVICE_REMOVE("voice")

View File

@ -265,6 +265,7 @@ static struct
size_t videoram_size; size_t videoram_size;
UINT8 *videoram; UINT8 *videoram;
UINT8 is_superimpose;
} cga; } cga;
@ -350,6 +351,7 @@ static VIDEO_START( pc_cga )
internal_pc_cga_video_start(machine); internal_pc_cga_video_start(machine);
cga.videoram_size = 0x4000; cga.videoram_size = 0x4000;
cga.videoram = auto_alloc_array(machine, UINT8, 0x4000); cga.videoram = auto_alloc_array(machine, UINT8, 0x4000);
cga.is_superimpose = 0;
memory_set_bankptr(machine,"bank11", cga.videoram); memory_set_bankptr(machine,"bank11", cga.videoram);
} }
@ -390,6 +392,7 @@ static VIDEO_START( pc_cga32k )
cga.videoram_size = 0x8000; cga.videoram_size = 0x8000;
cga.videoram = auto_alloc_array(machine, UINT8, 0x8000); cga.videoram = auto_alloc_array(machine, UINT8, 0x8000);
cga.is_superimpose = 0;
memory_set_bankptr(machine,"bank11", cga.videoram); memory_set_bankptr(machine,"bank11", cga.videoram);
} }
@ -439,6 +442,13 @@ static SCREEN_UPDATE( cga_poisk2 )
return 0; 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. Draw text mode with 40x25 characters (default) with high intensity bg.
The character cell size is 16x8 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. 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 ) if ( cga.mode_control & 0x04 )
{ {
/* Composite greyscale */ /* 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 else
{ {
/* Composite colour */ /* 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 else
{ {
/* RGB colour */ /* 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; break;
case 0x38: case 0x39: case 0x3C: case 0x3D: 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 ); MACHINE_CONFIG_EXTERN( pcvideo_cga32k );
INPUT_PORTS_EXTERN( pcvideo_cga ); INPUT_PORTS_EXTERN( pcvideo_cga );
SCREEN_UPDATE( mc6845_cga ); SCREEN_UPDATE( mc6845_cga );
VIDEO_START( pc_cga_superimpose );
/* has a special 640x200 in 16 color mode, 4 banks at 0xb8000 */ /* has a special 640x200 in 16 color mode, 4 banks at 0xb8000 */
MACHINE_CONFIG_EXTERN( pcvideo_pc1512 ); MACHINE_CONFIG_EXTERN( pcvideo_pc1512 );