summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/bus/isa/aga.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/bus/isa/aga.c')
-rw-r--r--src/emu/bus/isa/aga.c233
1 files changed, 133 insertions, 100 deletions
diff --git a/src/emu/bus/isa/aga.c b/src/emu/bus/isa/aga.c
index ec1ac365018..fc8c49d9605 100644
--- a/src/emu/bus/isa/aga.c
+++ b/src/emu/bus/isa/aga.c
@@ -12,6 +12,19 @@
#define AGA_SCREEN_NAME "screen"
#define AGA_MC6845_NAME "mc6845_aga"
+enum
+{
+ MDA_TEXT_INTEN = 0,
+ MDA_TEXT_BLINK,
+ CGA_TEXT_INTEN,
+ CGA_TEXT_INTEN_ALT,
+ CGA_TEXT_BLINK,
+ CGA_TEXT_BLINK_ALT,
+ CGA_GFX_1BPP,
+ CGA_GFX_2BPP,
+ CGA_GFX_4BPPL,
+ CGA_GFX_4BPPH
+};
static INPUT_PORTS_START( aga )
PORT_START( "cga_config" )
@@ -47,6 +60,7 @@ isa8_aga_device::isa8_aga_device(const machine_config &mconfig, const char *tag,
m_palette(*this, "palette"),
m_mc6845(*this, AGA_MC6845_NAME),
m_cga_config(*this, "cga_config"),
+ m_update_row_type(-1),
m_mda_mode_control(0),
m_mda_status(0),
m_cga_mode_control(0),
@@ -64,6 +78,7 @@ isa8_aga_device::isa8_aga_device(const machine_config &mconfig, device_type type
m_palette(*this, "palette"),
m_mc6845(*this, AGA_MC6845_NAME),
m_cga_config(*this, "cga_config"),
+ m_update_row_type(-1),
m_mda_mode_control(0),
m_mda_status(0),
m_cga_mode_control(0),
@@ -223,34 +238,47 @@ WRITE_LINE_MEMBER( isa8_aga_device::vsync_changed )
}
-
-
-
-static MC6845_UPDATE_ROW( aga_update_row )
+MC6845_UPDATE_ROW( isa8_aga_device::aga_update_row )
{
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- if ( aga->m_update_row )
+ if (m_update_row_type == -1)
+ return;
+
+ switch (m_update_row_type)
{
- aga->m_update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param );
+ case MDA_TEXT_INTEN:
+ mda_text_inten_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case MDA_TEXT_BLINK:
+ mda_text_blink_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case CGA_TEXT_INTEN:
+ cga_text_inten_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case CGA_TEXT_INTEN_ALT:
+ cga_text_inten_alt_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case CGA_TEXT_BLINK:
+ cga_text_blink_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case CGA_TEXT_BLINK_ALT:
+ cga_text_blink_alt_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case CGA_GFX_1BPP:
+ cga_gfx_1bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case CGA_GFX_2BPP:
+ cga_gfx_2bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case CGA_GFX_4BPPL:
+ cga_gfx_4bppl_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case CGA_GFX_4BPPH:
+ cga_gfx_4bpph_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
}
}
-static MC6845_INTERFACE( mc6845_aga_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* numbers of pixels per video memory address */
- NULL, /* begin_update */
- aga_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_NULL, /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_aga_device, hsync_changed), /* on_hsync_changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_aga_device, vsync_changed), /* on_vsync_changed */
- NULL
-};
-
MACHINE_CONFIG_FRAGMENT( pcvideo_aga )
MCFG_SCREEN_ADD( AGA_SCREEN_NAME, RASTER )
MCFG_SCREEN_RAW_PARAMS( XTAL_14_31818MHz,912,0,640,262,0,200 )
@@ -258,7 +286,12 @@ MACHINE_CONFIG_FRAGMENT( pcvideo_aga )
MCFG_PALETTE_ADD( "palette", /* CGA_PALETTE_SETS * 16*/ 65536 )
- MCFG_MC6845_ADD( AGA_MC6845_NAME, MC6845, AGA_SCREEN_NAME, XTAL_14_31818MHz/8, mc6845_aga_intf )
+ MCFG_MC6845_ADD(AGA_MC6845_NAME, MC6845, AGA_SCREEN_NAME, XTAL_14_31818MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(isa8_aga_device, aga_update_row)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(isa8_aga_device, hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(isa8_aga_device, vsync_changed))
MACHINE_CONFIG_END
machine_config_constructor isa8_aga_device::device_mconfig_additions() const
@@ -273,10 +306,10 @@ machine_config_constructor isa8_aga_device::device_mconfig_additions() const
*************************************/
/* colors need fixing in the mda_text_* functions ! */
-static MC6845_UPDATE_ROW( mda_text_inten_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
- UINT8 *videoram = aga->m_videoram;
+MC6845_UPDATE_ROW( isa8_aga_device::mda_text_inten_update_row )
+{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *videoram = m_videoram;
UINT32 *p = &bitmap.pix32(y);
UINT16 chr_base = ( ra & 0x08 ) ? 0x800 | ( ra & 0x07 ) : ra;
int i;
@@ -286,7 +319,7 @@ static MC6845_UPDATE_ROW( mda_text_inten_update_row ) {
UINT16 offset = ( ( ma + i ) << 1 ) & 0x0FFF;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset + 1 ];
- UINT8 data = aga->m_mda_chr_gen[ chr_base + chr * 8 ];
+ UINT8 data = m_mda_chr_gen[ chr_base + chr * 8 ];
UINT8 fg = ( attr & 0x08 ) ? 3 : 2;
UINT8 bg = 0;
@@ -334,10 +367,10 @@ static MC6845_UPDATE_ROW( mda_text_inten_update_row ) {
}
-static MC6845_UPDATE_ROW( mda_text_blink_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- UINT8 *videoram = aga->m_videoram;
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
+MC6845_UPDATE_ROW( isa8_aga_device::mda_text_blink_update_row )
+{
+ UINT8 *videoram = m_videoram;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
UINT16 chr_base = ( ra & 0x08 ) ? 0x800 | ( ra & 0x07 ) : ra;
int i;
@@ -347,7 +380,7 @@ static MC6845_UPDATE_ROW( mda_text_blink_update_row ) {
UINT16 offset = ( ( ma + i ) << 1 ) & 0x0FFF;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset + 1 ];
- UINT8 data = aga->m_mda_chr_gen[ chr_base + chr * 8 ];
+ UINT8 data = m_mda_chr_gen[ chr_base + chr * 8 ];
UINT8 fg = ( attr & 0x08 ) ? 3 : 2;
UINT8 bg = 0;
@@ -374,7 +407,7 @@ static MC6845_UPDATE_ROW( mda_text_blink_update_row ) {
if ( ( attr & 0x07 ) == 0x01 ) {
data = 0xFF;
}
- if ( ( attr & 0x80 ) && ( aga->m_framecnt & 0x40 ) ) {
+ if ( ( attr & 0x80 ) && ( m_framecnt & 0x40 ) ) {
data = 0x00;
}
}
@@ -396,10 +429,10 @@ static MC6845_UPDATE_ROW( mda_text_blink_update_row ) {
}
-static MC6845_UPDATE_ROW( cga_text_inten_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- UINT8 *videoram = aga->m_videoram;
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
+MC6845_UPDATE_ROW( isa8_aga_device::cga_text_inten_update_row )
+{
+ UINT8 *videoram = m_videoram;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -408,7 +441,7 @@ static MC6845_UPDATE_ROW( cga_text_inten_update_row ) {
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset +1 ];
- UINT8 data = aga->m_cga_chr_gen[ chr * 16 + ra ];
+ UINT8 data = m_cga_chr_gen[ chr * 16 + ra ];
UINT16 fg = attr & 0x0F;
UINT16 bg = ( attr >> 4 ) & 0x07;
@@ -427,10 +460,10 @@ static MC6845_UPDATE_ROW( cga_text_inten_update_row ) {
}
}
-static MC6845_UPDATE_ROW( cga_text_inten_alt_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
- UINT8 *videoram = aga->m_videoram;
+MC6845_UPDATE_ROW( isa8_aga_device::cga_text_inten_alt_update_row )
+{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *videoram = m_videoram;
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -439,7 +472,7 @@ static MC6845_UPDATE_ROW( cga_text_inten_alt_update_row ) {
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset +1 ];
- UINT8 data = aga->m_cga_chr_gen[ chr * 16 + ra ];
+ UINT8 data = m_cga_chr_gen[ chr * 16 + ra ];
UINT16 fg = attr & 0x0F;
if ( i == cursor_x ) {
@@ -457,10 +490,10 @@ static MC6845_UPDATE_ROW( cga_text_inten_alt_update_row ) {
}
}
-static MC6845_UPDATE_ROW( cga_text_blink_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
- UINT8 *videoram = aga->m_videoram;
+MC6845_UPDATE_ROW( isa8_aga_device::cga_text_blink_update_row )
+{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *videoram = m_videoram;
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -468,14 +501,14 @@ static MC6845_UPDATE_ROW( cga_text_blink_update_row ) {
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset +1 ];
- UINT8 data = aga->m_cga_chr_gen[ chr * 16 + ra ];
+ UINT8 data = m_cga_chr_gen[ chr * 16 + ra ];
UINT16 fg = attr & 0x0F;
UINT16 bg = (attr >> 4) & 0x07;
if ( i == cursor_x ) {
data = 0xFF;
} else {
- if ( ( attr & 0x80 ) && ( aga->m_framecnt & 0x10 ) ) {
+ if ( ( attr & 0x80 ) && ( m_framecnt & 0x10 ) ) {
data = 0x00;
}
}
@@ -491,10 +524,10 @@ static MC6845_UPDATE_ROW( cga_text_blink_update_row ) {
}
}
-static MC6845_UPDATE_ROW( cga_text_blink_alt_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
- UINT8 *videoram = aga->m_videoram;
+MC6845_UPDATE_ROW( isa8_aga_device::cga_text_blink_alt_update_row )
+{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *videoram = m_videoram;
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -503,14 +536,14 @@ static MC6845_UPDATE_ROW( cga_text_blink_alt_update_row ) {
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset +1 ];
- UINT8 data = aga->m_cga_chr_gen[ chr * 16 + ra ];
+ UINT8 data = m_cga_chr_gen[ chr * 16 + ra ];
UINT16 fg = attr & 0x07;
UINT16 bg = 0;
if ( i == cursor_x ) {
data = 0xFF;
} else {
- if ( ( attr & 0x80 ) && ( aga->m_framecnt & 0x10 ) ) {
+ if ( ( attr & 0x80 ) && ( m_framecnt & 0x10 ) ) {
data = 0x00;
bg = ( attr >> 4 ) & 0x07;
}
@@ -527,10 +560,10 @@ static MC6845_UPDATE_ROW( cga_text_blink_alt_update_row ) {
}
}
-static MC6845_UPDATE_ROW( cga_gfx_4bppl_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
- UINT8 *videoram = aga->m_videoram;
+MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_4bppl_update_row )
+{
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *videoram = m_videoram;
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -553,10 +586,10 @@ static MC6845_UPDATE_ROW( cga_gfx_4bppl_update_row ) {
}
}
-static MC6845_UPDATE_ROW( cga_gfx_4bpph_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- UINT8 *videoram = aga->m_videoram;
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
+MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_4bpph_update_row )
+{
+ UINT8 *videoram = m_videoram;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -587,10 +620,10 @@ static MC6845_UPDATE_ROW( cga_gfx_4bpph_update_row ) {
}
}
-static MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- UINT8 *videoram = aga->m_videoram;
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
+MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_2bpp_update_row )
+{
+ UINT8 *videoram = m_videoram;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -599,26 +632,26 @@ static MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row ) {
UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( y & 1 ) << 13 );
UINT8 data = videoram[ offset ];
- *p = palette[aga->m_cga_palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++;
- *p = palette[aga->m_cga_palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++;
- *p = palette[aga->m_cga_palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++;
- *p = palette[aga->m_cga_palette_lut_2bpp[ data & 0x03 ]]; p++;
+ *p = palette[m_cga_palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++;
+ *p = palette[m_cga_palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++;
+ *p = palette[m_cga_palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++;
+ *p = palette[m_cga_palette_lut_2bpp[ data & 0x03 ]]; p++;
data = videoram[ offset+1 ];
- *p = palette[aga->m_cga_palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++;
- *p = palette[aga->m_cga_palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++;
- *p = palette[aga->m_cga_palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++;
- *p = palette[aga->m_cga_palette_lut_2bpp[ data & 0x03 ]]; p++;
+ *p = palette[m_cga_palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++;
+ *p = palette[m_cga_palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++;
+ *p = palette[m_cga_palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++;
+ *p = palette[m_cga_palette_lut_2bpp[ data & 0x03 ]]; p++;
}
}
-static MC6845_UPDATE_ROW( cga_gfx_1bpp_update_row ) {
- isa8_aga_device *aga = downcast<isa8_aga_device *>(device->owner());
- UINT8 *videoram = aga->m_videoram;
- const rgb_t *palette = aga->m_palette->palette()->entry_list_raw();
+MC6845_UPDATE_ROW( isa8_aga_device::cga_gfx_1bpp_update_row )
+{
+ UINT8 *videoram = m_videoram;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
- UINT8 fg = aga->m_cga_color_select & 0x0F;
+ UINT8 fg = m_cga_color_select & 0x0F;
int i;
if ( y == 0 ) logerror("cga_gfx_1bpp_update_row\n");
@@ -690,22 +723,22 @@ WRITE8_MEMBER ( isa8_aga_device::pc_aga_mda_w )
case 8:
m_mda_mode_control = data;
- switch( m_mda_mode_control & 0x2a ) {
+ switch (m_mda_mode_control & 0x2a)
+ {
case 0x08:
- m_update_row = mda_text_inten_update_row;
+ m_update_row_type = MDA_TEXT_INTEN;
break;
case 0x28:
- m_update_row = mda_text_blink_update_row;
+ m_update_row_type = MDA_TEXT_BLINK;
break;
default:
- m_update_row = NULL;
+ m_update_row_type = -1;
}
break;
}
}
}
-
READ8_MEMBER ( isa8_aga_device::pc_aga_cga_r )
{
UINT8 data = 0xFF;
@@ -774,51 +807,51 @@ WRITE8_MEMBER (isa8_aga_device:: pc_aga_cga_w )
break;
case 8:
m_cga_mode_control = data;
-
+
//logerror("mode set to %02X\n", m_cga_mode_control & 0x3F );
switch ( m_cga_mode_control & 0x3F ) {
case 0x08: case 0x09: case 0x0C: case 0x0D:
m_mc6845->set_hpixels_per_column( 8 );
- m_update_row = cga_text_inten_update_row;
+ m_update_row_type = CGA_TEXT_INTEN;
break;
case 0x0A: case 0x0B: case 0x2A: case 0x2B:
m_mc6845->set_hpixels_per_column( 8 );
if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) {
- m_update_row = cga_gfx_4bppl_update_row;
+ m_update_row_type = CGA_GFX_4BPPL;
} else {
- m_update_row = cga_gfx_2bpp_update_row;
+ m_update_row_type = CGA_GFX_2BPP;
}
- break;
+ break;
case 0x0E: case 0x0F: case 0x2E: case 0x2F:
m_mc6845->set_hpixels_per_column( 8 );
- m_update_row = cga_gfx_2bpp_update_row;
+ m_update_row_type = CGA_GFX_2BPP;
break;
case 0x18: case 0x19: case 0x1C: case 0x1D:
m_mc6845->set_hpixels_per_column( 8 );
- m_update_row = cga_text_inten_alt_update_row;
+ m_update_row_type = CGA_TEXT_INTEN_ALT;
break;
case 0x1A: case 0x1B: case 0x3A: case 0x3B:
m_mc6845->set_hpixels_per_column( 8 );
if ( CGA_MONITOR == CGA_MONITOR_COMPOSITE ) {
- m_update_row = cga_gfx_4bpph_update_row;
+ m_update_row_type = CGA_GFX_4BPPH;
} else {
- m_update_row = cga_gfx_1bpp_update_row;
+ m_update_row_type = CGA_GFX_1BPP;
}
- break;
+ break;
case 0x1E: case 0x1F: case 0x3E: case 0x3F:
m_mc6845->set_hpixels_per_column( 16 );
- m_update_row = cga_gfx_1bpp_update_row;
+ m_update_row_type = CGA_GFX_1BPP;
break;
case 0x28: case 0x29: case 0x2C: case 0x2D:
m_mc6845->set_hpixels_per_column( 8 );
- m_update_row = cga_text_blink_update_row;
+ m_update_row_type = CGA_TEXT_BLINK;
break;
case 0x38: case 0x39: case 0x3C: case 0x3D:
m_mc6845->set_hpixels_per_column( 8 );
- m_update_row = cga_text_blink_alt_update_row;
+ m_update_row_type = CGA_TEXT_BLINK_ALT;
break;
default:
- m_update_row = NULL;
+ m_update_row_type = -1;
break;
}