summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Fabio Priuli <etabeta78@users.noreply.github.com>2014-05-01 08:36:28 +0000
committer Fabio Priuli <etabeta78@users.noreply.github.com>2014-05-01 08:36:28 +0000
commitcc8edf5ac2faa4e0bd54c3b9715871870cd61cdf (patch)
tree6a686dca4d3758b6db3d5dcce1b5aca00b16f8bf
parentea02fd06a5883097ad970c81219d9d8124002853 (diff)
mc6845: converted to devcb2, delegates and inline configs. nw.
while at it, cleaned up the args of the mc6845 delegates as well (no need to pass back and forth pieces of the driver class, now that delegates belong to it as well) even if I tested the changes extensively, I might have missed something among the 177 source files using this, so please report any regressions you see :)
-rw-r--r--src/emu/bus/a2bus/a2ultraterm.c45
-rw-r--r--src/emu/bus/a2bus/a2ultraterm.h1
-rw-r--r--src/emu/bus/a2bus/a2videoterm.c34
-rw-r--r--src/emu/bus/a2bus/a2videoterm.h1
-rw-r--r--src/emu/bus/c64/xl80.c41
-rw-r--r--src/emu/bus/c64/xl80.h2
-rw-r--r--src/emu/bus/comx35/clm.c39
-rw-r--r--src/emu/bus/comx35/clm.h2
-rw-r--r--src/emu/bus/ecbbus/grip.c76
-rw-r--r--src/emu/bus/ecbbus/grip.h2
-rw-r--r--src/emu/bus/isa/aga.c233
-rw-r--r--src/emu/bus/isa/aga.h14
-rw-r--r--src/emu/bus/isa/cga.c289
-rw-r--r--src/emu/bus/isa/cga.h17
-rw-r--r--src/emu/bus/isa/mda.c141
-rw-r--r--src/emu/bus/isa/mda.h37
-rw-r--r--src/emu/bus/wangpc/lvc.c55
-rw-r--r--src/emu/bus/wangpc/lvc.h2
-rw-r--r--src/emu/bus/wangpc/mvc.c55
-rw-r--r--src/emu/bus/wangpc/mvc.h2
-rw-r--r--src/emu/video/mc6845.c182
-rw-r--r--src/emu/video/mc6845.h202
-rw-r--r--src/mame/drivers/4enlinea.c1
-rw-r--r--src/mame/drivers/4roses.c24
-rw-r--r--src/mame/drivers/5clown.c25
-rw-r--r--src/mame/drivers/albazg.c19
-rw-r--r--src/mame/drivers/amaticmg.c24
-rw-r--r--src/mame/drivers/amusco.c27
-rw-r--r--src/mame/drivers/aristmk4.c25
-rw-r--r--src/mame/drivers/avt.c24
-rw-r--r--src/mame/drivers/blitz.c24
-rw-r--r--src/mame/drivers/blitz68k.c84
-rw-r--r--src/mame/drivers/buster.c20
-rw-r--r--src/mame/drivers/calomega.c24
-rw-r--r--src/mame/drivers/carrera.c20
-rw-r--r--src/mame/drivers/chance32.c21
-rw-r--r--src/mame/drivers/coinmstr.c19
-rw-r--r--src/mame/drivers/docastle.c41
-rw-r--r--src/mame/drivers/flipjack.c20
-rw-r--r--src/mame/drivers/fortecar.c20
-rw-r--r--src/mame/drivers/funworld.c44
-rw-r--r--src/mame/drivers/gluck2.c24
-rw-r--r--src/mame/drivers/goldnpkr.c24
-rw-r--r--src/mame/drivers/hitpoker.c20
-rw-r--r--src/mame/drivers/jokrwild.c25
-rw-r--r--src/mame/drivers/jubilee.c24
-rw-r--r--src/mame/drivers/kingdrby.c36
-rw-r--r--src/mame/drivers/laserbas.c20
-rw-r--r--src/mame/drivers/luckgrln.c20
-rw-r--r--src/mame/drivers/magicfly.c24
-rw-r--r--src/mame/drivers/majorpkr.c24
-rw-r--r--src/mame/drivers/merit.c59
-rw-r--r--src/mame/drivers/miniboy7.c24
-rw-r--r--src/mame/drivers/mpu12wbk.c24
-rw-r--r--src/mame/drivers/mpu4dealem.c21
-rw-r--r--src/mame/drivers/murogem.c20
-rw-r--r--src/mame/drivers/nyny.c106
-rw-r--r--src/mame/drivers/othello.c31
-rw-r--r--src/mame/drivers/peplus.c35
-rw-r--r--src/mame/drivers/progolf.c20
-rw-r--r--src/mame/drivers/r2dtank.c58
-rw-r--r--src/mame/drivers/rgum.c19
-rw-r--r--src/mame/drivers/sanremo.c37
-rw-r--r--src/mame/drivers/slotcarn.c59
-rw-r--r--src/mame/drivers/snk6502.c30
-rw-r--r--src/mame/drivers/speedatk.c19
-rw-r--r--src/mame/drivers/spiders.c58
-rw-r--r--src/mame/drivers/ssingles.c120
-rw-r--r--src/mame/drivers/supercrd.c24
-rw-r--r--src/mame/drivers/tapatune.c72
-rw-r--r--src/mame/drivers/tmspoker.c23
-rw-r--r--src/mame/drivers/truco.c24
-rw-r--r--src/mame/drivers/twincobr.c4
-rw-r--r--src/mame/drivers/usgames.c20
-rw-r--r--src/mame/drivers/vcombat.c23
-rw-r--r--src/mame/drivers/vlc.c19
-rw-r--r--src/mame/drivers/wardner.c4
-rw-r--r--src/mame/includes/qix.h2
-rw-r--r--src/mame/includes/spiders.h3
-rw-r--r--src/mame/includes/twincobr.h2
-rw-r--r--src/mame/video/decodmd2.c35
-rw-r--r--src/mame/video/decodmd2.h1
-rw-r--r--src/mame/video/decodmd3.c44
-rw-r--r--src/mame/video/decodmd3.h1
-rw-r--r--src/mame/video/madalien.c20
-rw-r--r--src/mame/video/qix.c57
-rw-r--r--src/mame/video/twincobr.c19
-rw-r--r--src/mess/drivers/a6809.c23
-rw-r--r--src/mess/drivers/alphatro.c38
-rw-r--r--src/mess/drivers/amstrad.c21
-rw-r--r--src/mess/drivers/amust.c31
-rw-r--r--src/mess/drivers/applix.c36
-rw-r--r--src/mess/drivers/apricot.c35
-rw-r--r--src/mess/drivers/apricotp.c30
-rw-r--r--src/mess/drivers/b16.c21
-rw-r--r--src/mess/drivers/bbc.c14
-rw-r--r--src/mess/drivers/bigbord2.c36
-rw-r--r--src/mess/drivers/bml3.c47
-rw-r--r--src/mess/drivers/bw12.c29
-rw-r--r--src/mess/drivers/c128.c40
-rw-r--r--src/mess/drivers/camplynx.c63
-rw-r--r--src/mess/drivers/cbm2.c36
-rw-r--r--src/mess/drivers/dgn_beta.c7
-rw-r--r--src/mess/drivers/dim68k.c38
-rw-r--r--src/mess/drivers/ec65.c40
-rw-r--r--src/mess/drivers/einstein.c31
-rw-r--r--src/mess/drivers/fanucspmg.c34
-rw-r--r--src/mess/drivers/fp1100.c25
-rw-r--r--src/mess/drivers/fp6000.c20
-rw-r--r--src/mess/drivers/h19.c33
-rw-r--r--src/mess/drivers/hp9k.c19
-rw-r--r--src/mess/drivers/kaypro.c21
-rw-r--r--src/mess/drivers/lola8a.c31
-rw-r--r--src/mess/drivers/m20.c20
-rw-r--r--src/mess/drivers/mbc200.c25
-rw-r--r--src/mess/drivers/mbc55x.c7
-rw-r--r--src/mess/drivers/mbee.c96
-rw-r--r--src/mess/drivers/multi16.c22
-rw-r--r--src/mess/drivers/multi8.c22
-rw-r--r--src/mess/drivers/mx2178.c30
-rw-r--r--src/mess/drivers/myb3k.c21
-rw-r--r--src/mess/drivers/mycom.c34
-rw-r--r--src/mess/drivers/paso1600.c21
-rw-r--r--src/mess/drivers/pasopia.c31
-rw-r--r--src/mess/drivers/pasopia7.c24
-rw-r--r--src/mess/drivers/pet.c138
-rw-r--r--src/mess/drivers/pyl601.c71
-rw-r--r--src/mess/drivers/sapi1.c32
-rw-r--r--src/mess/drivers/smc777.c19
-rw-r--r--src/mess/drivers/super80.c20
-rw-r--r--src/mess/drivers/svi318.c20
-rw-r--r--src/mess/drivers/tavernie.c31
-rw-r--r--src/mess/drivers/trs80m2.c38
-rw-r--r--src/mess/drivers/tvc.c62
-rw-r--r--src/mess/drivers/v6809.c40
-rw-r--r--src/mess/drivers/victor9k.c31
-rw-r--r--src/mess/drivers/vk100.c35
-rw-r--r--src/mess/drivers/x1.c20
-rw-r--r--src/mess/drivers/x1twin.c20
-rw-r--r--src/mess/drivers/z100.c21
-rw-r--r--src/mess/drivers/zrt80.c33
-rw-r--r--src/mess/includes/abc80x.h3
-rw-r--r--src/mess/includes/amstrad.h7
-rw-r--r--src/mess/includes/bbc.h3
-rw-r--r--src/mess/includes/bw12.h1
-rw-r--r--src/mess/includes/cbm2.h2
-rw-r--r--src/mess/includes/dgn_beta.h6
-rw-r--r--src/mess/includes/einstein.h1
-rw-r--r--src/mess/includes/kaypro.h6
-rw-r--r--src/mess/includes/mbc55x.h4
-rw-r--r--src/mess/includes/mbee.h16
-rw-r--r--src/mess/includes/pc1512.h7
-rw-r--r--src/mess/includes/pet.h6
-rw-r--r--src/mess/includes/super80.h5
-rw-r--r--src/mess/includes/svi318.h5
-rw-r--r--src/mess/includes/trs80m2.h2
-rw-r--r--src/mess/includes/tvc.h2
-rw-r--r--src/mess/includes/v1050.h2
-rw-r--r--src/mess/includes/victor9k.h1
-rw-r--r--src/mess/machine/amstrad.c31
-rw-r--r--src/mess/machine/svi318.c7
-rw-r--r--src/mess/video/abc1600.c45
-rw-r--r--src/mess/video/abc1600.h2
-rw-r--r--src/mess/video/abc800.c36
-rw-r--r--src/mess/video/abc802.c39
-rw-r--r--src/mess/video/abc806.c54
-rw-r--r--src/mess/video/bbc.c70
-rw-r--r--src/mess/video/dgn_beta.c40
-rw-r--r--src/mess/video/kaypro.c15
-rw-r--r--src/mess/video/mbc55x.c30
-rw-r--r--src/mess/video/mbee.c59
-rw-r--r--src/mess/video/pc1512.c40
-rw-r--r--src/mess/video/pc8401a.c25
-rw-r--r--src/mess/video/pc_t1t.c301
-rw-r--r--src/mess/video/pc_t1t.h14
-rw-r--r--src/mess/video/super80.c23
-rw-r--r--src/mess/video/v1050.c31
177 files changed, 2122 insertions, 3958 deletions
diff --git a/src/emu/bus/a2bus/a2ultraterm.c b/src/emu/bus/a2bus/a2ultraterm.c
index eef9e997e63..5989ceae9bd 100644
--- a/src/emu/bus/a2bus/a2ultraterm.c
+++ b/src/emu/bus/a2bus/a2ultraterm.c
@@ -61,22 +61,6 @@ const device_type A2BUS_ULTRATERMENH = &device_creator<a2bus_ultratermenh_device
#define CT2_INVBIT7L (0x02)
#define CT2_HLBIT7L (0x01)
-static MC6845_UPDATE_ROW( ultraterm_update_row );
-
-static MC6845_INTERFACE( mc6845_mda_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* begin_update */
- ultraterm_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_NULL, /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_NULL, /* on hsync changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, a2bus_videx160_device, vsync_changed), /* on_vsync_changed */
- NULL
-};
static const rgb_t ultraterm_palette[4] =
{
@@ -91,7 +75,11 @@ MACHINE_CONFIG_FRAGMENT( a2ultraterm )
MCFG_SCREEN_RAW_PARAMS(CLOCK_LOW, 882, 0, 720, 370, 0, 350 )
MCFG_SCREEN_UPDATE_DEVICE( ULTRATERM_MC6845_NAME, mc6845_device, screen_update )
- MCFG_MC6845_ADD( ULTRATERM_MC6845_NAME, MC6845, ULTRATERM_SCREEN_NAME, CLOCK_LOW/9, mc6845_mda_intf)
+ MCFG_MC6845_ADD(ULTRATERM_MC6845_NAME, MC6845, ULTRATERM_SCREEN_NAME, CLOCK_LOW/9)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(a2bus_videx160_device, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(a2bus_videx160_device, vsync_changed))
MACHINE_CONFIG_END
ROM_START( a2ultraterm )
@@ -319,9 +307,8 @@ void a2bus_videx160_device::write_c800(address_space &space, UINT16 offset, UINT
}
}
-static MC6845_UPDATE_ROW( ultraterm_update_row )
+MC6845_UPDATE_ROW( a2bus_videx160_device::crtc_update_row )
{
- a2bus_videx160_device *uterm = downcast<a2bus_videx160_device *>(device->owner());
UINT32 *p = &bitmap.pix32(y);
UINT16 chr_base = ra;
int i;
@@ -329,38 +316,38 @@ static MC6845_UPDATE_ROW( ultraterm_update_row )
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ma + i );
- UINT8 chr = uterm->m_ram[ offset ];
- UINT8 data = uterm->m_chrrom[ chr_base + (chr * 16) ];
+ UINT8 chr = m_ram[ offset ];
+ UINT8 data = m_chrrom[ chr_base + (chr * 16) ];
UINT8 fg = 2;
UINT8 bg = 0;
UINT8 tmp;
// apply attributes
- if (!(uterm->m_ctrl2 & CT2_USEDIPS))
+ if (!(m_ctrl2 & CT2_USEDIPS))
{
// this set and bit 7 in char, highlight
- if ((uterm->m_ctrl2 & CT2_HLBIT7H) && (chr & 0x80))
+ if ((m_ctrl2 & CT2_HLBIT7H) && (chr & 0x80))
{
fg = 3;
bg = 0;
}
// this set and NOT bit 7 in char, highlight
- if ((uterm->m_ctrl2 & CT2_HLBIT7L) && (!(chr & 0x80)))
+ if ((m_ctrl2 & CT2_HLBIT7L) && (!(chr & 0x80)))
{
fg = 3;
bg = 0;
}
// this clear and bit 7 in char, lowlight
- if (!(uterm->m_ctrl2 & CT2_HLBIT7H) && (chr & 0x80))
+ if (!(m_ctrl2 & CT2_HLBIT7H) && (chr & 0x80))
{
fg = 1;
bg = 0;
}
// this clear and NOT bit 7 in char, lowlight
- if (!(uterm->m_ctrl2 & CT2_HLBIT7L) && (!(chr & 0x80)))
+ if (!(m_ctrl2 & CT2_HLBIT7L) && (!(chr & 0x80)))
{
fg = 1;
bg = 0;
@@ -368,7 +355,7 @@ static MC6845_UPDATE_ROW( ultraterm_update_row )
// invert last so invert + hilight/invert + lowlight are possible
// invert if char bit 7 is set
- if ((uterm->m_ctrl2 & CT2_INVBIT7H) && (chr & 0x80))
+ if ((m_ctrl2 & CT2_INVBIT7H) && (chr & 0x80))
{
tmp = fg;
fg = bg;
@@ -376,7 +363,7 @@ static MC6845_UPDATE_ROW( ultraterm_update_row )
}
// invert if char bit 7 is clear
- if ((uterm->m_ctrl2 & CT2_INVBIT7L) && (!(chr & 0x80)))
+ if ((m_ctrl2 & CT2_INVBIT7L) && (!(chr & 0x80)))
{
tmp = fg;
fg = bg;
@@ -386,7 +373,7 @@ static MC6845_UPDATE_ROW( ultraterm_update_row )
if ( i == cursor_x )
{
- if ( uterm->m_framecnt & 0x08 )
+ if ( m_framecnt & 0x08 )
{
data = 0xFF;
}
diff --git a/src/emu/bus/a2bus/a2ultraterm.h b/src/emu/bus/a2bus/a2ultraterm.h
index 4d6225f160a..7495db2eca3 100644
--- a/src/emu/bus/a2bus/a2ultraterm.h
+++ b/src/emu/bus/a2bus/a2ultraterm.h
@@ -29,6 +29,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_WRITE_LINE_MEMBER(vsync_changed);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT8 *m_rom, *m_chrrom;
UINT8 m_ram[256*16];
diff --git a/src/emu/bus/a2bus/a2videoterm.c b/src/emu/bus/a2bus/a2videoterm.c
index d347f42d490..947bb7a1aa4 100644
--- a/src/emu/bus/a2bus/a2videoterm.c
+++ b/src/emu/bus/a2bus/a2videoterm.c
@@ -47,29 +47,16 @@ const device_type A2BUS_AEVIEWMASTER80 = &device_creator<a2bus_aevm80_device>;
#define MDA_CLOCK 16257000
-static MC6845_UPDATE_ROW( videoterm_update_row );
-
-static MC6845_INTERFACE( mc6845_mda_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* begin_update */
- videoterm_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_NULL, /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_NULL, /* on hsync changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, a2bus_videx80_device, vsync_changed), /* on_vsync_changed */
- NULL
-};
-
MACHINE_CONFIG_FRAGMENT( a2videoterm )
MCFG_SCREEN_ADD( VIDEOTERM_SCREEN_NAME, RASTER) // 560x216? (80x24 7x9 characters)
MCFG_SCREEN_RAW_PARAMS(MDA_CLOCK, 882, 0, 720, 370, 0, 350 )
MCFG_SCREEN_UPDATE_DEVICE( VIDEOTERM_MC6845_NAME, mc6845_device, screen_update )
- MCFG_MC6845_ADD( VIDEOTERM_MC6845_NAME, MC6845, VIDEOTERM_SCREEN_NAME, MDA_CLOCK/9, mc6845_mda_intf)
+ MCFG_MC6845_ADD(VIDEOTERM_MC6845_NAME, MC6845, VIDEOTERM_SCREEN_NAME, MDA_CLOCK/9)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(a2bus_videx80_device, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(a2bus_videx80_device, vsync_changed))
MACHINE_CONFIG_END
ROM_START( a2videoterm )
@@ -347,10 +334,9 @@ void a2bus_videx80_device::write_c800(address_space &space, UINT16 offset, UINT8
}
}
-static MC6845_UPDATE_ROW( videoterm_update_row )
+MC6845_UPDATE_ROW( a2bus_videx80_device::crtc_update_row )
{
- a2bus_videx80_device *vterm = downcast<a2bus_videx80_device *>(device->owner());
- const rgb_t *palette = vterm->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
UINT16 chr_base = ra; //( ra & 0x08 ) ? 0x800 | ( ra & 0x07 ) : ra;
int i;
@@ -358,14 +344,14 @@ static MC6845_UPDATE_ROW( videoterm_update_row )
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ma + i ) & 0x7ff;
- UINT8 chr = vterm->m_ram[ offset ];
- UINT8 data = vterm->m_chrrom[ chr_base + chr * 16 ];
+ UINT8 chr = m_ram[ offset ];
+ UINT8 data = m_chrrom[ chr_base + chr * 16 ];
UINT8 fg = 15;
UINT8 bg = 0;
if ( i == cursor_x )
{
- if ( vterm->m_framecnt & 0x08 )
+ if ( m_framecnt & 0x08 )
{
data = 0xFF;
}
diff --git a/src/emu/bus/a2bus/a2videoterm.h b/src/emu/bus/a2bus/a2videoterm.h
index 5043a6cafd8..50d2165dfe9 100644
--- a/src/emu/bus/a2bus/a2videoterm.h
+++ b/src/emu/bus/a2bus/a2videoterm.h
@@ -29,6 +29,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
DECLARE_WRITE_LINE_MEMBER(vsync_changed);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT8 *m_rom, *m_chrrom;
UINT8 m_ram[512*4];
diff --git a/src/emu/bus/c64/xl80.c b/src/emu/bus/c64/xl80.c
index a33504a2f1e..886368c810f 100644
--- a/src/emu/bus/c64/xl80.c
+++ b/src/emu/bus/c64/xl80.c
@@ -78,58 +78,36 @@ const rom_entry *c64_xl80_device::device_rom_region() const
}
//-------------------------------------------------
-// mc6845_interface crtc_intf
+// mc6845
//-------------------------------------------------
-void c64_xl80_device::crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( c64_xl80_device::crtc_update_row )
{
const pen_t *pen = m_palette->pens();
-
+
for (int column = 0; column < x_count; column++)
{
UINT8 code = m_ram[((ma + column) & 0x7ff)];
UINT16 addr = (code << 3) | (ra & 0x07);
UINT8 data = m_char_rom->base()[addr & 0x7ff];
-
+
if (column == cursor_x)
{
data = 0xff;
}
-
+
for (int bit = 0; bit < 8; bit++)
{
int x = (column * 8) + bit;
int color = BIT(data, 7) && de;
-
+
bitmap.pix32(vbp + y, hbp + x) = pen[color];
-
+
data <<= 1;
}
}
}
-static MC6845_UPDATE_ROW( c64_xl80_update_row )
-{
- c64_xl80_device *xl80 = downcast<c64_xl80_device *>(device->owner());
- xl80->crtc_update_row(device,bitmap,cliprect,ma,ra,y,x_count,cursor_x,de,hbp,vbp,param);
-}
-
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- c64_xl80_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-
//-------------------------------------------------
// GFXDECODE( c64_xl80 )
//-------------------------------------------------
@@ -154,7 +132,10 @@ static MACHINE_CONFIG_FRAGMENT( c64_xl80 )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", c64_xl80)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
- MCFG_MC6845_ADD(HD46505SP_TAG, H46505, MC6845_SCREEN_TAG, XTAL_14_31818MHz, crtc_intf)
+ MCFG_MC6845_ADD(HD46505SP_TAG, H46505, MC6845_SCREEN_TAG, XTAL_14_31818MHz)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(c64_xl80_device, crtc_update_row)
MACHINE_CONFIG_END
diff --git a/src/emu/bus/c64/xl80.h b/src/emu/bus/c64/xl80.h
index 29ccbca7fd5..711926b19ee 100644
--- a/src/emu/bus/c64/xl80.h
+++ b/src/emu/bus/c64/xl80.h
@@ -39,7 +39,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
// not really public
- void crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
+ MC6845_UPDATE_ROW( crtc_update_row );
protected:
// device-level overrides
diff --git a/src/emu/bus/comx35/clm.c b/src/emu/bus/comx35/clm.c
index e48ba540fec..a0e5b3becdf 100644
--- a/src/emu/bus/comx35/clm.c
+++ b/src/emu/bus/comx35/clm.c
@@ -97,55 +97,33 @@ const rom_entry *comx_clm_device::device_rom_region() const
//-------------------------------------------------
-// mc6845_interface crtc_intf
+// mc6845
//-------------------------------------------------
-void comx_clm_device::crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( comx_clm_device::crtc_update_row )
{
for (int column = 0; column < x_count; column++)
{
UINT8 code = m_video_ram[((ma + column) & 0x7ff)];
UINT16 addr = (code << 3) | (ra & 0x07);
UINT8 data = m_char_rom->base()[addr & 0x7ff];
-
+
if (BIT(ra, 3) && column == cursor_x)
{
data = 0xff;
}
-
+
for (int bit = 0; bit < 8; bit++)
{
int x = (column * 8) + bit;
-
+
bitmap.pix32(vbp + y, hbp + x) = m_palette->pen(BIT(data, 7) && de);
-
+
data <<= 1;
}
}
}
-static MC6845_UPDATE_ROW( comx_clm_update_row )
-{
- comx_clm_device *clm = downcast<comx_clm_device *>(device->owner());
- clm->crtc_update_row(device,bitmap,cliprect,ma,ra,y,x_count,cursor_x,de,hbp,vbp,param);
-}
-
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- comx_clm_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-
//-------------------------------------------------
// GFXDECODE( comx_clm )
//-------------------------------------------------
@@ -170,7 +148,10 @@ static MACHINE_CONFIG_FRAGMENT( comx_clm )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", comx_clm)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, MC6845_SCREEN_TAG, XTAL_14_31818MHz/7, crtc_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, MC6845_SCREEN_TAG, XTAL_14_31818MHz/7)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(comx_clm_device, crtc_update_row)
MACHINE_CONFIG_END
diff --git a/src/emu/bus/comx35/clm.h b/src/emu/bus/comx35/clm.h
index 180169bf03f..a79ef6ac043 100644
--- a/src/emu/bus/comx35/clm.h
+++ b/src/emu/bus/comx35/clm.h
@@ -38,7 +38,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
// not really public
- void crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
+ MC6845_UPDATE_ROW( crtc_update_row );
protected:
// device-level overrides
diff --git a/src/emu/bus/ecbbus/grip.c b/src/emu/bus/ecbbus/grip.c
index a5741101f8c..af28cbfa57b 100644
--- a/src/emu/bus/ecbbus/grip.c
+++ b/src/emu/bus/ecbbus/grip.c
@@ -223,57 +223,47 @@ ADDRESS_MAP_END
//**************************************************************************
//-------------------------------------------------
-// mc6845_interface crtc_intf
+// mc6845
//-------------------------------------------------
-void grip_device::crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( grip_device::crtc_update_row )
{
- int column, bit;
-
- for (column = 0; column < x_count; column++)
+ for (int column = 0; column < x_count; column++)
{
UINT16 address = (m_page << 12) | (((ma + column) & 0xfff) << 3) | (ra & 0x07);
UINT8 data = m_video_ram[address];
-
- for (bit = 0; bit < 8; bit++)
+
+ for (int bit = 0; bit < 8; bit++)
{
int x = (column * 8) + bit;
int color = (m_flash ? 0 : BIT(data, bit)) && de;
-
+
bitmap.pix32(vbp + y, hbp + x) = m_palette->pen(color);
}
}
}
-
-static MC6845_UPDATE_ROW( grip_update_row )
-{
- grip_device *grip = downcast<grip_device *>(device->owner());
-
- grip->crtc_update_row(device,bitmap,cliprect,ma,ra,y,x_count,cursor_x,de,hbp,vbp,param);
-}
/*
-static MC6845_UPDATE_ROW( grip5_update_row )
+MC6845_UPDATE_ROW( grip_device::grip5_update_row )
{
- grip5_state *state = device->machine().driver_data<grip5_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int column, bit;
for (column = 0; column < x_count; column++)
{
- UINT16 address = (state->m_dpage << 12) | (((ma + column) & 0xfff) << 3) | (ra & 0x07);
- UINT8 data = state->m_video_ram[address];
+ UINT16 address = (m_dpage << 12) | (((ma + column) & 0xfff) << 3) | (ra & 0x07);
+ UINT8 data = m_video_ram[address];
for (bit = 0; bit < 8; bit++)
{
int x = (column * 8) + bit;
- int color = state->m_flash ? 0 : BIT(data, bit);
+ int color = m_flash ? 0 : BIT(data, bit);
bitmap.pix32(y, x) = palette[color];
}
}
}
-static MC6845_ON_UPDATE_ADDR_CHANGED( grip5_update_addr_changed )
+MC6845_ON_UPDATE_ADDR_CHANGED( grip_device::grip5_addr_changed )
{
}
*/
@@ -286,38 +276,6 @@ static const speaker_interface speaker_intf =
speaker_levels
};
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- grip_update_row,
- NULL,
- DEVCB_DEVICE_LINE_MEMBER(Z80STI_TAG, z80sti_device, i1_w),
- DEVCB_DEVICE_LINE_MEMBER(Z80STI_TAG, z80sti_device, i2_w),
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-/*
-
-static MC6845_INTERFACE( grip5_crtc_intf )
-{
- false,
- 0,0,0,0,
- 8,
- NULL,
- grip5_update_row,
- NULL,
- DEVCB_DEVICE_LINE_MEMBER(Z80STI_TAG, z80sti_device, i1_w),
- DEVCB_DEVICE_LINE_MEMBER(Z80STI_TAG, z80sti_device, i2_w),
- DEVCB_NULL,
- DEVCB_NULL,
- grip5_update_addr_changed
-};
-*/
-
//-------------------------------------------------
// I8255A interface
@@ -527,8 +485,14 @@ static MACHINE_CONFIG_FRAGMENT( grip )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
// devices
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/4, crtc_intf)
-// MCFG_MC6845_ADD(HD6345_TAG, HD6345, SCREEN_TAG, XTAL_16MHz/4, grip5_crtc_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/4)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(grip_device, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(DEVWRITELINE(Z80STI_TAG, z80sti_device, i1_w))
+ MCFG_MC6845_OUT_CUR_CB(DEVWRITELINE(Z80STI_TAG, z80sti_device, i1_w))
+
+// MCFG_MC6845_ADD(HD6345_TAG, HD6345, SCREEN_TAG, XTAL_16MHz/4)
MCFG_DEVICE_ADD(I8255A_TAG, I8255A, 0)
MCFG_I8255_IN_PORTA_CB(READ8(grip_device, ppi_pa_r))
diff --git a/src/emu/bus/ecbbus/grip.h b/src/emu/bus/ecbbus/grip.h
index 026513c13c6..71eff97c8d2 100644
--- a/src/emu/bus/ecbbus/grip.h
+++ b/src/emu/bus/ecbbus/grip.h
@@ -66,7 +66,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( write_centronics_busy );
DECLARE_WRITE_LINE_MEMBER( write_centronics_fault );
- void crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
+ MC6845_UPDATE_ROW( crtc_update_row );
protected:
// device-level overrides
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;
}
diff --git a/src/emu/bus/isa/aga.h b/src/emu/bus/isa/aga.h
index 12568353e3a..e764458a087 100644
--- a/src/emu/bus/isa/aga.h
+++ b/src/emu/bus/isa/aga.h
@@ -56,12 +56,24 @@ public:
DECLARE_WRITE8_MEMBER( pc_aga_videoram_w );
DECLARE_READ8_MEMBER( pc_aga_videoram_r );
+ MC6845_UPDATE_ROW( aga_update_row );
+ MC6845_UPDATE_ROW( mda_text_inten_update_row );
+ MC6845_UPDATE_ROW( mda_text_blink_update_row );
+ MC6845_UPDATE_ROW( cga_text_inten_update_row );
+ MC6845_UPDATE_ROW( cga_text_inten_alt_update_row );
+ MC6845_UPDATE_ROW( cga_text_blink_update_row );
+ MC6845_UPDATE_ROW( cga_text_blink_alt_update_row );
+ MC6845_UPDATE_ROW( cga_gfx_4bppl_update_row );
+ MC6845_UPDATE_ROW( cga_gfx_4bpph_update_row );
+ MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row );
+ MC6845_UPDATE_ROW( cga_gfx_1bpp_update_row );
+
required_device<palette_device> m_palette;
required_device<mc6845_device> m_mc6845;
required_ioport m_cga_config;
- mc6845_update_row_func m_update_row;
+ int m_update_row_type;
AGA_MODE m_mode;
UINT8 m_mda_mode_control;
UINT8 m_mda_status;
diff --git a/src/emu/bus/isa/cga.c b/src/emu/bus/isa/cga.c
index cd5557ee6b2..aa205c53e48 100644
--- a/src/emu/bus/isa/cga.c
+++ b/src/emu/bus/isa/cga.c
@@ -95,11 +95,26 @@ TODO:
if(VERBOSE_CGA>=N) \
{ \
if( M ) \
- logerror("%11.6f: %-24s",machine.time().as_double(),(char*)M ); \
+ logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \
logerror A; \
} \
} while (0)
+enum
+{
+ CGA_TEXT_INTEN = 0,
+ CGA_TEXT_INTEN_ALT,
+ CGA_TEXT_INTEN_CG,
+ CGA_TEXT_BLINK,
+ CGA_TEXT_BLINK_ALT,
+ CGA_TEXT_BLINK_SI,
+ CGA_GFX_1BPP,
+ CGA_GFX_2BPP,
+ CGA_GFX_4BPPL,
+ CGA_GFX_4BPPH,
+ PC1512_GFX_4BPP
+};
+
/***************************************************************************
Static declarations
@@ -161,30 +176,63 @@ INPUT_PORTS_END
#define CGA_CHIPSET_ATI 0x60 /* ATI (supports Plantronics) */
#define CGA_CHIPSET_PARADISE 0x80 /* Paradise (used in PC1640) */
-static MC6845_UPDATE_ROW( cga_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::crtc_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- if ( cga->m_update_row )
+ if (m_update_row_type == -1)
+ return;
+
+ switch (m_update_row_type)
{
- cga->m_update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param );
+ 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_INTEN_CG:
+ cga_text_inten_comp_grey_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_TEXT_BLINK_SI:
+ cga_text_blink_update_row_si(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_cga_intf )
+MC6845_UPDATE_ROW( isa8_cga_pc1512_device::crtc_update_row )
{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* numbers of pixels per video memory address */
- NULL, /* begin_update */
- cga_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_cga_device, hsync_changed), /* on_hsync_changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_cga_device, vsync_changed), /* on_vsync_changed */
- NULL
-};
+ if (m_update_row_type == -1)
+ return;
+
+ switch (m_update_row_type)
+ {
+ case PC1512_GFX_4BPP:
+ pc1512_gfx_4bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ default:
+ isa8_cga_device::crtc_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ }
+}
+
#define CGA_HCLK (XTAL_14_31818MHz/8)
#define CGA_LCLK (XTAL_14_31818MHz/16)
@@ -197,7 +245,12 @@ static MACHINE_CONFIG_FRAGMENT( cga )
MCFG_PALETTE_ADD("palette", /* CGA_PALETTE_SETS * 16*/ 65536 )
- MCFG_MC6845_ADD(CGA_MC6845_NAME, MC6845, CGA_SCREEN_NAME, XTAL_14_31818MHz/8, mc6845_cga_intf)
+ MCFG_MC6845_ADD(CGA_MC6845_NAME, MC6845, CGA_SCREEN_NAME, XTAL_14_31818MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(isa8_cga_device, crtc_update_row)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(isa8_cga_device, hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(isa8_cga_device, vsync_changed))
MACHINE_CONFIG_END
@@ -247,6 +300,7 @@ isa8_cga_device::isa8_cga_device(const machine_config &mconfig, const char *tag,
device_t(mconfig, ISA8_CGA, "IBM Color/Graphics Monitor Adapter", tag, owner, clock, "cga", __FILE__),
device_isa8_card_interface(mconfig, *this),
m_cga_config(*this, "cga_config"),
+ m_update_row_type(-1),
m_vram_size( 0x4000 ),
m_palette(*this, "palette")
{
@@ -261,6 +315,7 @@ isa8_cga_device::isa8_cga_device(const machine_config &mconfig, device_type type
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
device_isa8_card_interface(mconfig, *this),
m_cga_config(*this, "cga_config"),
+ m_update_row_type(-1),
m_vram_size( 0x4000 ),
m_palette(*this, "palette")
{
@@ -283,7 +338,6 @@ void isa8_cga_device::device_start()
set_isa_device();
m_vram.resize(m_vram_size);
- m_update_row = NULL;
m_isa->install_device(0x3d0, 0x3df, 0, 0, read8_delegate( FUNC(isa8_cga_device::io_read), this ), write8_delegate( FUNC(isa8_cga_device::io_write), this ) );
m_isa->install_bank(0xb8000, 0xb8000 + MIN(0x8000,m_vram_size) - 1, 0, m_vram_size & 0x4000, "bank_cga", m_vram);
@@ -320,7 +374,6 @@ void isa8_cga_device::device_start()
void isa8_cga_device::device_reset()
{
- m_update_row = NULL;
m_framecnt = 0;
m_mode_control = 0;
m_vsync = 0;
@@ -414,14 +467,12 @@ isa8_cga_superimpose_device::isa8_cga_superimpose_device(const machine_config &m
The character cell size is 16x8
***************************************************************************/
-static MC6845_UPDATE_ROW( cga_text_inten_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_text_inten_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int i;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_text_inten_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
@@ -429,11 +480,11 @@ 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 = cga->m_chr_gen[ chr * 8 + ra ];
+ UINT8 data = m_chr_gen[ chr * 8 + ra ];
UINT16 fg = attr & 0x0F;
UINT16 bg = attr >> 4;
- if ( i == cursor_x && ( cga->m_framecnt & 0x08 ) )
+ if ( i == cursor_x && ( m_framecnt & 0x08 ) )
{
data = 0xFF;
}
@@ -455,14 +506,12 @@ static MC6845_UPDATE_ROW( cga_text_inten_update_row )
The character cell size is 16x8. Composite monitor, greyscale.
***************************************************************************/
-static MC6845_UPDATE_ROW( cga_text_inten_comp_grey_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_text_inten_comp_grey_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int i;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_text_inten_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
@@ -470,11 +519,11 @@ static MC6845_UPDATE_ROW( cga_text_inten_comp_grey_update_row )
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset +1 ];
- UINT8 data = cga->m_chr_gen[ chr * 8 + ra ];
+ UINT8 data = m_chr_gen[ chr * 8 + ra ];
UINT16 fg = 0x10 + ( attr & 0x0F );
UINT16 bg = 0x10 + ( ( attr >> 4 ) & 0x07 );
- if ( i == cursor_x && ( cga->m_framecnt & 0x08 ) )
+ if ( i == cursor_x && ( m_framecnt & 0x08 ) )
{
data = 0xFF;
}
@@ -495,14 +544,12 @@ static MC6845_UPDATE_ROW( cga_text_inten_comp_grey_update_row )
The character cell size is 16x8
***************************************************************************/
-static MC6845_UPDATE_ROW( cga_text_inten_alt_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_text_inten_alt_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int i;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_text_inten_alt_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
@@ -510,10 +557,10 @@ 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 = cga->m_chr_gen[ chr * 8 + ra ];
+ UINT8 data = m_chr_gen[ chr * 8 + ra ];
UINT16 fg = attr & 0x0F;
- if ( i == cursor_x && ( cga->m_framecnt & 0x08 ) )
+ if ( i == cursor_x && ( m_framecnt & 0x08 ) )
{
data = 0xFF;
}
@@ -535,14 +582,12 @@ static MC6845_UPDATE_ROW( cga_text_inten_alt_update_row )
The character cell size is 16x8
***************************************************************************/
-static MC6845_UPDATE_ROW( cga_text_blink_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_text_blink_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
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++ )
@@ -550,20 +595,20 @@ 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 = cga->m_chr_gen[ chr * 8 + ra ];
+ UINT8 data = m_chr_gen[ chr * 8 + ra ];
UINT16 fg = attr & 0x0F;
UINT16 bg = (attr >> 4) & 0x07;
if ( i == cursor_x )
{
- if ( cga->m_framecnt & 0x08 )
+ if ( m_framecnt & 0x08 )
{
data = 0xFF;
}
}
else
{
- if ( ( attr & 0x80 ) && ( cga->m_framecnt & 0x10 ) )
+ if ( ( attr & 0x80 ) && ( m_framecnt & 0x10 ) )
{
data = 0x00;
}
@@ -580,14 +625,12 @@ static MC6845_UPDATE_ROW( cga_text_blink_update_row )
}
}
-static MC6845_UPDATE_ROW( cga_text_blink_update_row_si )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_text_blink_update_row_si )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
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++ )
@@ -595,21 +638,21 @@ static MC6845_UPDATE_ROW( cga_text_blink_update_row_si )
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset +1 ];
- UINT8 data = cga->m_chr_gen[ chr * 8 + ra ];
+ UINT8 data = m_chr_gen[ chr * 8 + ra ];
UINT16 fg = attr & 0x0F;
UINT16 bg = (attr >> 4) & 0x07;
UINT8 xi;
if ( i == cursor_x )
{
- if ( cga->m_framecnt & 0x08 )
+ if ( m_framecnt & 0x08 )
{
data = 0xFF;
}
}
else
{
- if ( ( attr & 0x80 ) && ( cga->m_framecnt & 0x10 ) )
+ if ( ( attr & 0x80 ) && ( m_framecnt & 0x10 ) )
{
data = 0x00;
}
@@ -633,14 +676,12 @@ static MC6845_UPDATE_ROW( cga_text_blink_update_row_si )
The character cell size is 16x8
***************************************************************************/
-static MC6845_UPDATE_ROW( cga_text_blink_alt_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_text_blink_alt_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int i;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_text_blink_alt_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
@@ -648,20 +689,20 @@ 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 = cga->m_chr_gen[ chr * 8 + ra ];
+ UINT8 data = m_chr_gen[ chr * 8 + ra ];
UINT16 fg = attr & 0x07;
UINT16 bg = 0;
if ( i == cursor_x )
{
- if ( cga->m_framecnt & 0x08 )
+ if ( m_framecnt & 0x08 )
{
data = 0xFF;
}
}
else
{
- if ( ( attr & 0x80 ) && ( cga->m_framecnt & 0x10 ) )
+ if ( ( attr & 0x80 ) && ( m_framecnt & 0x10 ) )
{
data = 0x00;
bg = ( attr >> 4 ) & 0x07;
@@ -682,14 +723,12 @@ static MC6845_UPDATE_ROW( cga_text_blink_alt_update_row )
/* The lo-res (320x200) graphics mode on a colour composite monitor */
-static MC6845_UPDATE_ROW( cga_gfx_4bppl_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_gfx_4bppl_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int i;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_gfx_4bppl_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
@@ -743,14 +782,12 @@ static const UINT8 yc_lut[16][8] =
};
#endif
-static MC6845_UPDATE_ROW( cga_gfx_4bpph_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_gfx_4bpph_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int i;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_gfx_4bpph_update_row",("\n"));
@@ -788,14 +825,12 @@ static MC6845_UPDATE_ROW( cga_gfx_4bpph_update_row )
cga fetches 2 byte per mc6845 access.
***************************************************************************/
-static MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_gfx_2bpp_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int i;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_gfx_2bpp_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
@@ -803,17 +838,17 @@ static MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row )
UINT16 offset = ( ( ( ma + i ) << 1 ) & 0x1fff ) | ( ( y & 1 ) << 13 );
UINT8 data = videoram[ offset ];
- *p = palette[cga->m_palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++;
- *p = palette[cga->m_palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++;
- *p = palette[cga->m_palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++;
- *p = palette[cga->m_palette_lut_2bpp[ data & 0x03 ]]; p++;
+ *p = palette[m_palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++;
+ *p = palette[m_palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++;
+ *p = palette[m_palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++;
+ *p = palette[m_palette_lut_2bpp[ data & 0x03 ]]; p++;
data = videoram[ offset+1 ];
- *p = palette[cga->m_palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++;
- *p = palette[cga->m_palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++;
- *p = palette[cga->m_palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++;
- *p = palette[cga->m_palette_lut_2bpp[ data & 0x03 ]]; p++;
+ *p = palette[m_palette_lut_2bpp[ ( data >> 6 ) & 0x03 ]]; p++;
+ *p = palette[m_palette_lut_2bpp[ ( data >> 4 ) & 0x03 ]]; p++;
+ *p = palette[m_palette_lut_2bpp[ ( data >> 2 ) & 0x03 ]]; p++;
+ *p = palette[m_palette_lut_2bpp[ data & 0x03 ]]; p++;
}
}
@@ -825,15 +860,13 @@ static MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row )
Even scanlines are from CGA_base + 0x0000, odd from CGA_base + 0x2000
***************************************************************************/
-static MC6845_UPDATE_ROW( cga_gfx_1bpp_update_row )
+MC6845_UPDATE_ROW( isa8_cga_device::cga_gfx_1bpp_update_row )
{
- isa8_cga_device *cga = downcast<isa8_cga_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
- UINT8 fg = cga->m_color_select & 0x0F;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 fg = m_color_select & 0x0F;
int i;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"cga_gfx_1bpp_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
@@ -952,53 +985,53 @@ void isa8_cga_device::mode_control_w(UINT8 data)
if ( m_mode_control & 0x04 )
{
/* Composite greyscale */
- m_update_row = cga_text_inten_comp_grey_update_row;
+ m_update_row_type = CGA_TEXT_INTEN_CG;
}
else
{
/* Composite colour */
- m_update_row = cga_text_inten_update_row;
+ m_update_row_type = CGA_TEXT_INTEN;
}
}
else
{
/* RGB colour */
- m_update_row = cga_text_inten_update_row;
+ m_update_row_type = CGA_TEXT_INTEN;
}
break;
case 0x0A: case 0x0B: case 0x2A: case 0x2B:
mc6845->set_hpixels_per_column( 8 );
if ( 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;
case 0x0E: case 0x0F: case 0x2E: case 0x2F:
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:
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:
mc6845->set_hpixels_per_column( 16 );
if ( 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;
case 0x1E: case 0x1F: case 0x3E: case 0x3F:
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:
mc6845->set_hpixels_per_column( 8 );
@@ -1007,26 +1040,26 @@ void isa8_cga_device::mode_control_w(UINT8 data)
if ( m_mode_control & 0x04 )
{
/* Composite greyscale */
- m_update_row = m_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row;
+ m_update_row_type = m_superimpose ? CGA_TEXT_BLINK_SI : CGA_TEXT_BLINK;
}
else
{
/* Composite colour */
- m_update_row = m_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row;
+ m_update_row_type = m_superimpose ? CGA_TEXT_BLINK_SI : CGA_TEXT_BLINK;
}
}
else
{
/* RGB colour */
- m_update_row = m_superimpose ? cga_text_blink_update_row_si : cga_text_blink_update_row;
+ m_update_row_type = m_superimpose ? CGA_TEXT_BLINK_SI : CGA_TEXT_BLINK;
}
break;
case 0x38: case 0x39: case 0x3C: case 0x3D:
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;
}
@@ -1295,24 +1328,22 @@ WRITE8_MEMBER( isa8_cga_device::io_write )
//}
-static MC6845_UPDATE_ROW( pc1512_gfx_4bpp_update_row )
+MC6845_UPDATE_ROW( isa8_cga_pc1512_device::pc1512_gfx_4bpp_update_row )
{
- isa8_cga_pc1512_device *cga = downcast<isa8_cga_pc1512_device *>(device->owner());
- UINT8 *videoram = &cga->m_vram[cga->m_start_offset];
+ UINT8 *videoram = &m_vram[m_start_offset];
UINT32 *p = &bitmap.pix32(y);
- const rgb_t *palette = cga->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT16 offset_base = ra << 13;
int j;
- running_machine &machine = device->machine();
if ( y == 0 ) CGA_LOG(1,"pc1512_gfx_4bpp_update_row",("\n"));
for ( j = 0; j < x_count; j++ )
{
UINT16 offset = offset_base | ( ( ma + j ) & 0x1FFF );
- UINT16 i = ( cga->m_color_select & 8 ) ? videoram[ isa8_cga_pc1512_device::vram_offset[3] | offset ] << 3 : 0;
- UINT16 r = ( cga->m_color_select & 4 ) ? videoram[ isa8_cga_pc1512_device::vram_offset[2] | offset ] << 2 : 0;
- UINT16 g = ( cga->m_color_select & 2 ) ? videoram[ isa8_cga_pc1512_device::vram_offset[1] | offset ] << 1 : 0;
- UINT16 b = ( cga->m_color_select & 1 ) ? videoram[ isa8_cga_pc1512_device::vram_offset[0] | offset ] : 0;
+ UINT16 i = ( m_color_select & 8 ) ? videoram[ isa8_cga_pc1512_device::vram_offset[3] | offset ] << 3 : 0;
+ UINT16 r = ( m_color_select & 4 ) ? videoram[ isa8_cga_pc1512_device::vram_offset[2] | offset ] << 2 : 0;
+ UINT16 g = ( m_color_select & 2 ) ? videoram[ isa8_cga_pc1512_device::vram_offset[1] | offset ] << 1 : 0;
+ UINT16 b = ( m_color_select & 1 ) ? videoram[ isa8_cga_pc1512_device::vram_offset[0] | offset ] : 0;
*p = palette[( ( i & 0x400 ) | ( r & 0x200 ) | ( g & 0x100 ) | ( b & 0x80 ) ) >> 7]; p++;
*p = palette[( ( i & 0x200 ) | ( r & 0x100 ) | ( g & 0x080 ) | ( b & 0x40 ) ) >> 6]; p++;
@@ -1364,45 +1395,45 @@ WRITE8_MEMBER( isa8_cga_pc1512_device::io_write )
{
case 0x08: case 0x09: case 0x0C: case 0x0D:
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:
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;
case 0x0E: case 0x0F: case 0x2E: case 0x2F:
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:
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:
mc6845->set_hpixels_per_column( 8 );
- m_update_row = pc1512_gfx_4bpp_update_row;
+ m_update_row_type = PC1512_GFX_4BPP;
break;
case 0x1E: case 0x1F: case 0x3E: case 0x3F:
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:
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:
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;
}
break;
diff --git a/src/emu/bus/isa/cga.h b/src/emu/bus/isa/cga.h
index 52f54796fdd..4e088fd1b37 100644
--- a/src/emu/bus/isa/cga.h
+++ b/src/emu/bus/isa/cga.h
@@ -27,6 +27,18 @@ public:
isa8_cga_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
isa8_cga_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+ virtual MC6845_UPDATE_ROW( crtc_update_row );
+ MC6845_UPDATE_ROW( cga_text_inten_update_row );
+ MC6845_UPDATE_ROW( cga_text_inten_comp_grey_update_row );
+ MC6845_UPDATE_ROW( cga_text_inten_alt_update_row );
+ MC6845_UPDATE_ROW( cga_text_blink_update_row );
+ MC6845_UPDATE_ROW( cga_text_blink_update_row_si );
+ MC6845_UPDATE_ROW( cga_text_blink_alt_update_row );
+ MC6845_UPDATE_ROW( cga_gfx_4bppl_update_row );
+ MC6845_UPDATE_ROW( cga_gfx_4bpph_update_row );
+ MC6845_UPDATE_ROW( cga_gfx_2bpp_update_row );
+ MC6845_UPDATE_ROW( cga_gfx_1bpp_update_row );
+
// optional information overrides
virtual machine_config_constructor device_mconfig_additions() const;
virtual ioport_constructor device_input_ports() const;
@@ -55,7 +67,7 @@ public:
UINT8 m_color_select; /* wo 0x3d9 */
UINT8 m_status; /* ro 0x3da */
- mc6845_update_row_func m_update_row;
+ int m_update_row_type;
UINT8 m_palette_lut_2bpp[4];
offs_t m_chr_gen_offset[4];
UINT8 m_font_selection_mask;
@@ -118,6 +130,9 @@ public:
virtual ioport_constructor device_input_ports() const;
virtual const rom_entry *device_rom_region() const;
+ virtual MC6845_UPDATE_ROW( crtc_update_row );
+ MC6845_UPDATE_ROW( pc1512_gfx_4bpp_update_row );
+
protected:
// device-level overrides
virtual void device_start();
diff --git a/src/emu/bus/isa/mda.c b/src/emu/bus/isa/mda.c
index ce08169992c..dd96a7119fc 100644
--- a/src/emu/bus/isa/mda.c
+++ b/src/emu/bus/isa/mda.c
@@ -27,7 +27,7 @@
if(VERBOSE_MDA>=N) \
{ \
if( M ) \
- logerror("%11.6f: %-24s",device->machine().time().as_double(),(char*)M ); \
+ logerror("%11.6f: %-24s",machine().time().as_double(),(char*)M ); \
logerror A; \
} \
} while (0)
@@ -40,7 +40,12 @@ static const unsigned char mda_palette[4][3] =
{ 0x00,0xff,0x00 }
};
-static MC6845_UPDATE_ROW( mda_update_row );
+enum
+{
+ MDA_TEXT_INTEN = 0,
+ MDA_TEXT_BLINK,
+ HERCULES_GFX_BLINK
+};
/* F4 Character Displayer */
static const gfx_layout pc_16_charlayout =
@@ -75,21 +80,6 @@ static GFXDECODE_START( pcmda )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_mda_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 9, /* number of pixels per video memory address */
- NULL, /* begin_update */
- mda_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_mda_device, hsync_changed), /* on_hsync_changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_mda_device, vsync_changed), /* on_vsync_changed */
- NULL
-};
-
WRITE_LINE_MEMBER(isa8_mda_device::pc_cpu_line)
{
m_isa->irq7_w(state);
@@ -103,7 +93,12 @@ MACHINE_CONFIG_FRAGMENT( pcvideo_mda )
MCFG_PALETTE_ADD( "palette", 4 )
- MCFG_MC6845_ADD( MDA_MC6845_NAME, MC6845, MDA_SCREEN_NAME, MDA_CLOCK/9, mc6845_mda_intf)
+ MCFG_MC6845_ADD(MDA_MC6845_NAME, MC6845, MDA_SCREEN_NAME, MDA_CLOCK/9)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(9)
+ MCFG_MC6845_UPDATE_ROW_CB(isa8_mda_device, crtc_update_row)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(isa8_mda_device, hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(isa8_mda_device, vsync_changed))
MCFG_GFXDECODE_ADD("gfxdecode", "palette", pcmda)
@@ -154,6 +149,7 @@ const rom_entry *isa8_mda_device::device_rom_region() const
isa8_mda_device::isa8_mda_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, ISA8_MDA, "IBM Monochrome Display and Printer Adapter", tag, owner, clock, "isa_ibm_mda", __FILE__),
device_isa8_card_interface(mconfig, *this),
+ m_update_row_type(-1),
m_palette(*this, "palette")
{
}
@@ -161,6 +157,7 @@ isa8_mda_device::isa8_mda_device(const machine_config &mconfig, const char *tag,
isa8_mda_device::isa8_mda_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
device_t(mconfig, type, name, tag, owner, clock, shortname, source),
device_isa8_card_interface(mconfig, *this),
+ m_update_row_type(-1),
m_palette(*this, "palette")
{
}
@@ -190,7 +187,6 @@ void isa8_mda_device::device_start()
void isa8_mda_device::device_reset()
{
- m_update_row = NULL;
m_framecnt = 0;
m_mode_control = 0;
m_vsync = 0;
@@ -213,10 +209,9 @@ void isa8_mda_device::device_reset()
character codes 176 to 223.
***************************************************************************/
-static MC6845_UPDATE_ROW( mda_text_inten_update_row )
+MC6845_UPDATE_ROW( isa8_mda_device::mda_text_inten_update_row )
{
- isa8_mda_device *mda = downcast<isa8_mda_device *>(device->owner());
- const rgb_t *palette = mda->m_palette->palette()->entry_list_raw();
+ 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;
@@ -225,9 +220,9 @@ static MC6845_UPDATE_ROW( mda_text_inten_update_row )
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ( ma + i ) << 1 ) & 0x0FFF;
- UINT8 chr = mda->m_videoram[ offset ];
- UINT8 attr = mda->m_videoram[ offset + 1 ];
- UINT8 data = mda->m_chr_gen[ chr_base + chr * 8 ];
+ UINT8 chr = m_videoram[ offset ];
+ UINT8 attr = m_videoram[ offset + 1 ];
+ UINT8 data = m_chr_gen[ chr_base + chr * 8 ];
UINT8 fg = ( attr & 0x08 ) ? 3 : 2;
UINT8 bg = 0;
@@ -256,7 +251,7 @@ static MC6845_UPDATE_ROW( mda_text_inten_update_row )
break;
}
- if ( ( i == cursor_x && ( mda->m_framecnt & 0x08 ) ) || ( attr & 0x07 ) == 0x01 )
+ if ( ( i == cursor_x && ( m_framecnt & 0x08 ) ) || ( attr & 0x07 ) == 0x01 )
{
data = 0xFF;
}
@@ -287,10 +282,9 @@ static MC6845_UPDATE_ROW( mda_text_inten_update_row )
character codes 176 to 223.
***************************************************************************/
-static MC6845_UPDATE_ROW( mda_text_blink_update_row )
+MC6845_UPDATE_ROW( isa8_mda_device::mda_text_blink_update_row )
{
- isa8_mda_device *mda = downcast<isa8_mda_device *>(device->owner());
- const rgb_t *palette = mda->m_palette->palette()->entry_list_raw();
+ 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;
@@ -299,9 +293,9 @@ static MC6845_UPDATE_ROW( mda_text_blink_update_row )
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ( ma + i ) << 1 ) & 0x0FFF;
- UINT8 chr = mda->m_videoram[ offset ];
- UINT8 attr = mda->m_videoram[ offset + 1 ];
- UINT8 data = mda->m_chr_gen[ chr_base + chr * 8 ];
+ UINT8 chr = m_videoram[ offset ];
+ UINT8 attr = m_videoram[ offset + 1 ];
+ UINT8 data = m_chr_gen[ chr_base + chr * 8 ];
UINT8 fg = ( attr & 0x08 ) ? 3 : 2;
UINT8 bg = 0;
@@ -331,14 +325,14 @@ static MC6845_UPDATE_ROW( mda_text_blink_update_row )
if ( i == cursor_x )
{
- if ( mda->m_framecnt & 0x08 )
+ if ( m_framecnt & 0x08 )
{
data = 0xFF;
}
}
else
{
- if ( ( attr & 0x80 ) && ( mda->m_framecnt & 0x10 ) )
+ if ( ( attr & 0x80 ) && ( m_framecnt & 0x10 ) )
{
data = 0x00;
}
@@ -364,12 +358,36 @@ static MC6845_UPDATE_ROW( mda_text_blink_update_row )
}
-static MC6845_UPDATE_ROW( mda_update_row )
+MC6845_UPDATE_ROW( isa8_mda_device::crtc_update_row )
+{
+ if (m_update_row_type == -1)
+ return;
+
+ switch (m_update_row_type)
+ {
+ 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;
+ }
+}
+
+
+MC6845_UPDATE_ROW( isa8_hercules_device::crtc_update_row )
{
- isa8_mda_device *mda = downcast<isa8_mda_device *>(device->owner());
- if ( mda->m_update_row )
+ if (m_update_row_type == -1)
+ return;
+
+ switch (m_update_row_type)
{
- mda->m_update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param );
+ case HERCULES_GFX_BLINK:
+ hercules_gfx_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ default:
+ isa8_mda_device::crtc_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
}
}
@@ -400,13 +418,13 @@ WRITE8_MEMBER( isa8_mda_device::mode_control_w )
switch( m_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;
}
}
@@ -497,21 +515,6 @@ allow this.
The divder/pixels per 6845 clock is 9 for text mode and 16 for graphics mode.
*/
-static MC6845_INTERFACE( mc6845_hercules_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 9, /* number of pixels per video memory address */
- NULL, /* begin_update */
- mda_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_mda_device, hsync_changed), /* on_hsync_changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, isa8_mda_device, vsync_changed), /* on_vsync_changed */
- NULL
-};
-
static GFXDECODE_START( pcherc )
GFXDECODE_ENTRY( "gfx1", 0x0000, pc_16_charlayout, 1, 1 )
GFXDECODE_END
@@ -523,7 +526,12 @@ MACHINE_CONFIG_FRAGMENT( pcvideo_hercules )
MCFG_PALETTE_ADD( "palette", 4 )
- MCFG_MC6845_ADD( HERCULES_MC6845_NAME, MC6845, HERCULES_SCREEN_NAME, MDA_CLOCK/9, mc6845_hercules_intf)
+ MCFG_MC6845_ADD(HERCULES_MC6845_NAME, MC6845, HERCULES_SCREEN_NAME, MDA_CLOCK/9)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(9)
+ MCFG_MC6845_UPDATE_ROW_CB(isa8_hercules_device, crtc_update_row)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(isa8_mda_device, hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(isa8_mda_device, vsync_changed))
MCFG_GFXDECODE_ADD("gfxdecode", "palette", pcherc)
@@ -613,17 +621,16 @@ void isa8_hercules_device::device_reset()
bit 7 being the leftmost.
***************************************************************************/
-static MC6845_UPDATE_ROW( hercules_gfx_update_row )
+MC6845_UPDATE_ROW( isa8_hercules_device::hercules_gfx_update_row )
{
- isa8_hercules_device *herc = downcast<isa8_hercules_device *>(device->owner());
- const rgb_t *palette = herc->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
- UINT16 gfx_base = ( ( herc->m_mode_control & 0x80 ) ? 0x8000 : 0x0000 ) | ( ( ra & 0x03 ) << 13 );
+ UINT16 gfx_base = ( ( m_mode_control & 0x80 ) ? 0x8000 : 0x0000 ) | ( ( ra & 0x03 ) << 13 );
int i;
if ( y == 0 ) MDA_LOG(1,"hercules_gfx_update_row",("\n"));
for ( i = 0; i < x_count; i++ )
{
- UINT8 data = herc->m_videoram[ gfx_base + ( ( ma + i ) << 1 ) ];
+ UINT8 data = m_videoram[ gfx_base + ( ( ma + i ) << 1 ) ];
*p = palette[( data & 0x80 ) ? 2 : 0]; p++;
*p = palette[( data & 0x40 ) ? 2 : 0]; p++;
@@ -634,7 +641,7 @@ static MC6845_UPDATE_ROW( hercules_gfx_update_row )
*p = palette[( data & 0x02 ) ? 2 : 0]; p++;
*p = palette[( data & 0x01 ) ? 2 : 0]; p++;
- data = herc->m_videoram[ gfx_base + ( ( ma + i ) << 1 ) + 1 ];
+ data = m_videoram[ gfx_base + ( ( ma + i ) << 1 ) + 1 ];
*p = palette[( data & 0x80 ) ? 2 : 0]; p++;
*p = palette[( data & 0x40 ) ? 2 : 0]; p++;
@@ -657,17 +664,17 @@ WRITE8_MEMBER( isa8_hercules_device::mode_control_w )
switch( m_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;
case 0x0A: /* Hercules modes */
case 0x2A:
- m_update_row = hercules_gfx_update_row;
+ m_update_row_type = HERCULES_GFX_BLINK;
break;
default:
- m_update_row = NULL;
+ m_update_row_type = -1;
}
mc6845->set_clock( m_mode_control & 0x02 ? MDA_CLOCK / 16 : MDA_CLOCK / 9 );
diff --git a/src/emu/bus/isa/mda.h b/src/emu/bus/isa/mda.h
index 2fc74d49265..71db33dc557 100644
--- a/src/emu/bus/isa/mda.h
+++ b/src/emu/bus/isa/mda.h
@@ -36,6 +36,10 @@ public:
WRITE_LINE_MEMBER(pc_cpu_line);
+ virtual MC6845_UPDATE_ROW( crtc_update_row );
+ MC6845_UPDATE_ROW( mda_text_inten_update_row );
+ MC6845_UPDATE_ROW( mda_text_blink_update_row );
+
protected:
// device-level overrides
virtual void device_start();
@@ -45,7 +49,7 @@ public:
UINT8 m_mode_control;
- mc6845_update_row_func m_update_row;
+ int m_update_row_type;
UINT8 *m_chr_gen;
UINT8 m_vsync;
UINT8 m_hsync;
@@ -64,26 +68,29 @@ class isa8_hercules_device :
public isa8_mda_device
{
public:
- // construction/destruction
- isa8_hercules_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
- // optional information overrides
- virtual machine_config_constructor device_mconfig_additions() const;
- virtual const rom_entry *device_rom_region() const;
+ // construction/destruction
+ isa8_hercules_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ // optional information overrides
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual const rom_entry *device_rom_region() const;
- virtual DECLARE_READ8_MEMBER(io_read);
- virtual DECLARE_WRITE8_MEMBER(io_write);
- virtual DECLARE_READ8_MEMBER(status_r);
- virtual DECLARE_WRITE8_MEMBER(mode_control_w);
+ virtual DECLARE_READ8_MEMBER(io_read);
+ virtual DECLARE_WRITE8_MEMBER(io_write);
+ virtual DECLARE_READ8_MEMBER(status_r);
+ virtual DECLARE_WRITE8_MEMBER(mode_control_w);
+
+ virtual MC6845_UPDATE_ROW( crtc_update_row );
+ MC6845_UPDATE_ROW( hercules_gfx_update_row );
protected:
- // device-level overrides
- virtual void device_start();
- virtual void device_reset();
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
private:
- // internal state
+ // internal state
public:
- UINT8 m_configuration_switch; //hercules
+ UINT8 m_configuration_switch; //hercules
};
diff --git a/src/emu/bus/wangpc/lvc.c b/src/emu/bus/wangpc/lvc.c
index d1f92667fe2..e3505180a39 100644
--- a/src/emu/bus/wangpc/lvc.c
+++ b/src/emu/bus/wangpc/lvc.c
@@ -51,29 +51,29 @@ const device_type WANGPC_LVC = &device_creator<wangpc_lvc_device>;
//-------------------------------------------------
-// mc6845_interface crtc_intf
+// mc6845
//-------------------------------------------------
-void wangpc_lvc_device::crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( wangpc_lvc_device::crtc_update_row )
{
offs_t scroll_y = (((m_scroll >> 8) + 0x15) & 0xff) * 0x80;
-
+
if (OPTION_80_COL)
{
for (int column = 0; column < x_count; column++)
{
offs_t addr = scroll_y + (m_scroll & 0x3f) + ((ma / 80) * 0x480) + (((ra & 0x0f) << 7) | (column & 0x7f));
UINT16 data = m_video_ram[addr & 0x7fff];
-
+
for (int bit = 0; bit < 8; bit++)
{
int x = (column * 8) + bit;
int color = (BIT(data, 15) << 1) | BIT(data, 7);
-
+
if (column == cursor_x) color = 0x03;
-
+
bitmap.pix32(vbp + y, hbp + x) = de ? m_palette[color] : rgb_t::black;
-
+
data <<= 1;
}
}
@@ -82,35 +82,28 @@ void wangpc_lvc_device::crtc_update_row(mc6845_device *device, bitmap_rgb32 &bit
{
//offs_t addr = scroll_y + ((m_scroll & 0x3f) << 1) + ((ma / 40) * 0x480) + (((ra & 0x0f) << 7));
offs_t addr = scroll_y + ((m_scroll & 0x3f) << 1) + (y * 0x80);
-
+
for (int column = 0; column < x_count; column++)
{
UINT32 data = (m_video_ram[(addr + 1) & 0x7fff] << 16) | m_video_ram[addr & 0x7fff];
-
+
for (int bit = 0; bit < 8; bit++)
{
int x = (column * 8) + bit;
int color = (BIT(data, 31) << 3) | (BIT(data, 23) << 2) | (BIT(data, 15) << 1) | BIT(data, 7);
-
+
if (column == cursor_x) color = 0x03;
-
+
bitmap.pix32(vbp + y, hbp + x) = de ? m_palette[color] : rgb_t::black;
-
+
data <<= 1;
}
-
+
addr += 2;
}
}
}
-static MC6845_UPDATE_ROW( wangpc_lvc_update_row )
-{
- wangpc_lvc_device *lvc = downcast<wangpc_lvc_device *>(device->owner());
-
- lvc->crtc_update_row(device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param);
-}
-
WRITE_LINE_MEMBER( wangpc_lvc_device::vsync_w )
{
if (OPTION_VSYNC && state)
@@ -119,22 +112,6 @@ WRITE_LINE_MEMBER( wangpc_lvc_device::vsync_w )
}
}
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- wangpc_lvc_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, wangpc_lvc_device, vsync_w),
- NULL
-};
-
-
//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( wangpc_lvc )
//-------------------------------------------------
@@ -147,7 +124,11 @@ static MACHINE_CONFIG_FRAGMENT( wangpc_lvc )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_MC6845_ADD(MC6845_TAG, MC6845_1, SCREEN_TAG, XTAL_14_31818MHz/16, crtc_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845_1, SCREEN_TAG, XTAL_14_31818MHz/16)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(wangpc_lvc_device, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(wangpc_lvc_device, vsync_w))
MACHINE_CONFIG_END
diff --git a/src/emu/bus/wangpc/lvc.h b/src/emu/bus/wangpc/lvc.h
index 8977ec0cbff..239f2f0d880 100644
--- a/src/emu/bus/wangpc/lvc.h
+++ b/src/emu/bus/wangpc/lvc.h
@@ -37,7 +37,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
// not really public
- void crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
+ MC6845_UPDATE_ROW( crtc_update_row );
DECLARE_WRITE_LINE_MEMBER( vsync_w );
protected:
diff --git a/src/emu/bus/wangpc/mvc.c b/src/emu/bus/wangpc/mvc.c
index 81fa6d9ee57..2ee7b8c458e 100644
--- a/src/emu/bus/wangpc/mvc.c
+++ b/src/emu/bus/wangpc/mvc.c
@@ -66,34 +66,34 @@ const device_type WANGPC_MVC = &device_creator<wangpc_mvc_device>;
//-------------------------------------------------
-// mc6845_interface crtc_intf
+// mc6845
//-------------------------------------------------
-void wangpc_mvc_device::crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( wangpc_mvc_device::crtc_update_row )
{
for (int sx = 0; sx < 50; sx++)
{
offs_t addr = (y * 50) + sx;
UINT16 data = m_bitmap_ram[addr];
-
+
for (int bit = 0; bit < 16; bit++)
{
int x = (sx * 16) + bit;
int color = BIT(data, 15) && de;
-
+
bitmap.pix32(vbp + y, hbp + x) = PALETTE_MVC[color];
-
+
data <<= 1;
}
}
-
+
for (int column = 0; column < x_count; column++)
{
UINT16 code = m_video_ram[((ma + column) & 0x7ff)];
UINT8 attr = code & 0xff;
-
+
UINT8 new_ra = ra + 1;
-
+
if (ATTR_SUPERSCRIPT)
{
new_ra = ra + 3;
@@ -102,35 +102,28 @@ void wangpc_mvc_device::crtc_update_row(mc6845_device *device, bitmap_rgb32 &bit
{
new_ra = ra;
}
-
+
offs_t addr = ((code >> 8) << 4) | (new_ra & 0x0f);
UINT16 data = m_char_ram[addr & 0xfff];
-
+
if ((column == cursor_x) || (!ra && ATTR_OVERSCORE) || ((ra == 9) && ATTR_UNDERSCORE))
{
data = 0xffff;
}
-
+
for (int bit = 0; bit < 10; bit++)
{
int x = (column * 10) + bit;
int color = ((BIT(data, 9) & !ATTR_BLANK) ^ ATTR_REVERSE);
-
+
if ((color | bitmap.pix32(vbp + y, hbp + x)) & ATTR_BOLD) color = 2;
if (color) bitmap.pix32(vbp + y, hbp + x) = de ? PALETTE_MVC[color] : rgb_t::black;
-
+
data <<= 1;
}
}
}
-static MC6845_UPDATE_ROW( wangpc_mvc_update_row )
-{
- wangpc_mvc_device *mvc = downcast<wangpc_mvc_device *>(device->owner());
-
- mvc->crtc_update_row(device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param);
-}
-
WRITE_LINE_MEMBER( wangpc_mvc_device::vsync_w )
{
if (OPTION_VSYNC && state)
@@ -139,22 +132,6 @@ WRITE_LINE_MEMBER( wangpc_mvc_device::vsync_w )
}
}
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 10,
- NULL,
- wangpc_mvc_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, wangpc_mvc_device, vsync_w),
- NULL
-};
-
-
//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( wangpc_mvc )
//-------------------------------------------------
@@ -167,7 +144,11 @@ static MACHINE_CONFIG_FRAGMENT( wangpc_mvc )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
MCFG_SCREEN_REFRESH_RATE(60)
- MCFG_MC6845_ADD(MC6845_TAG, MC6845_1, SCREEN_TAG, XTAL_14_31818MHz/16, crtc_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845_1, SCREEN_TAG, XTAL_14_31818MHz/16)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(10)
+ MCFG_MC6845_UPDATE_ROW_CB(wangpc_mvc_device, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(wangpc_mvc_device, vsync_w))
MACHINE_CONFIG_END
diff --git a/src/emu/bus/wangpc/mvc.h b/src/emu/bus/wangpc/mvc.h
index 20fa6cfaec4..16cfaa8e978 100644
--- a/src/emu/bus/wangpc/mvc.h
+++ b/src/emu/bus/wangpc/mvc.h
@@ -37,7 +37,7 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
// not really public
- void crtc_update_row(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
+ MC6845_UPDATE_ROW( crtc_update_row );
DECLARE_WRITE_LINE_MEMBER( vsync_w );
protected:
diff --git a/src/emu/video/mc6845.c b/src/emu/video/mc6845.c
index 20a31ff9ba4..3f3789b9334 100644
--- a/src/emu/video/mc6845.c
+++ b/src/emu/video/mc6845.c
@@ -89,43 +89,35 @@ const device_type MOS8568 = &device_creator<mos8568_device>;
#define ATTR_ALTERNATE_CHARSET BIT(attr, 7)
-void mc6845_device::device_config_complete()
-{
- const mc6845_interface *intf = reinterpret_cast<const mc6845_interface *>(static_config());
-
- if ( intf != NULL )
- {
- *static_cast<mc6845_interface *>(this) = *intf;
- }
- else
- {
- m_show_border_area = false;
- m_visarea_adjust_min_x = 0;
- m_visarea_adjust_max_x = 0;
- m_visarea_adjust_min_y = 0;
- m_visarea_adjust_max_y = 0;
- m_hpixels_per_column = 0;
- m_begin_update = NULL;
- m_update_row = NULL;
- m_end_update = NULL;
- m_on_update_addr_changed = NULL;
- memset(&m_out_de_func, 0, sizeof(m_out_de_func));
- memset(&m_out_cur_func, 0, sizeof(m_out_cur_func));
- memset(&m_out_hsync_func, 0, sizeof(m_out_hsync_func));
- memset(&m_out_vsync_func, 0, sizeof(m_out_vsync_func));
- }
-}
-
-
mc6845_device::mc6845_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
: device_t(mconfig, type, name, tag, owner, clock, shortname, source),
- device_video_interface(mconfig, *this, false)
+ device_video_interface(mconfig, *this, false),
+ m_show_border_area(true),
+ m_visarea_adjust_min_x(0),
+ m_visarea_adjust_max_x(0),
+ m_visarea_adjust_min_y(0),
+ m_visarea_adjust_max_y(0),
+ m_hpixels_per_column(0),
+ m_out_de_cb(*this),
+ m_out_cur_cb(*this),
+ m_out_hsync_cb(*this),
+ m_out_vsync_cb(*this)
{
}
mc6845_device::mc6845_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, MC6845, "MC6845 CRTC", tag, owner, clock, "mc6845", __FILE__),
- device_video_interface(mconfig, *this, false)
+ device_video_interface(mconfig, *this, false),
+ m_show_border_area(true),
+ m_visarea_adjust_min_x(0),
+ m_visarea_adjust_max_x(0),
+ m_visarea_adjust_min_y(0),
+ m_visarea_adjust_max_y(0),
+ m_hpixels_per_column(0),
+ m_out_de_cb(*this),
+ m_out_cur_cb(*this),
+ m_out_hsync_cb(*this),
+ m_out_vsync_cb(*this)
{
}
@@ -138,7 +130,7 @@ void mc6845_device::device_post_load()
void mc6845_device::call_on_update_address(int strobe)
{
- if (m_on_update_addr_changed)
+ if (!m_on_update_addr_changed_cb.isnull())
m_upd_trans_timer->adjust(attotime::zero, (m_update_addr << 8) | strobe);
else
fatalerror("M6845: transparent memory mode without handler\n");
@@ -573,11 +565,11 @@ void mc6845_device::update_counters()
void mc6845_device::set_de(int state)
{
- if ( m_de != state )
+ if (m_de != state)
{
m_de = state;
- if ( m_de )
+ if (m_de)
{
/* If the upd_adr_timer was running, cancel it */
m_upd_adr_timer->adjust(attotime::never);
@@ -589,44 +581,37 @@ void mc6845_device::set_de(int state)
update_upd_adr_timer();
}
- if ( !m_res_out_de_func.isnull() )
- m_res_out_de_func( m_de );
+ m_out_de_cb(m_de);
}
}
void mc6845_device::set_hsync(int state)
{
- if ( m_hsync != state )
+ if (m_hsync != state)
{
m_hsync = state;
-
- if ( !m_res_out_hsync_func.isnull() )
- m_res_out_hsync_func( m_hsync );
+ m_out_hsync_cb(m_hsync);
}
}
void mc6845_device::set_vsync(int state)
{
- if ( m_vsync != state )
+ if (m_vsync != state)
{
m_vsync = state;
-
- if ( !m_res_out_vsync_func.isnull() )
- m_res_out_vsync_func( m_vsync );
+ m_out_vsync_cb(m_vsync);
}
}
void mc6845_device::set_cur(int state)
{
- if ( m_cur != state )
+ if (m_cur != state)
{
m_cur = state;
-
- if ( !m_res_out_cur_func.isnull() )
- m_res_out_cur_func( m_cur );
+ m_out_cur_cb(m_cur);
}
}
@@ -807,7 +792,7 @@ void mc6845_device::device_timer(emu_timer &timer, device_timer_id id, int param
int strobe = (param & 0xff);
/* call the callback function -- we know it exists */
- m_on_update_addr_changed(this, addr, strobe);
+ m_on_update_addr_changed_cb(addr, strobe);
if(!m_update_ready_bit && MODE_TRANSPARENT_BLANK)
{
@@ -928,7 +913,7 @@ void mc6845_device::update_cursor_state()
}
-UINT8 mc6845_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param)
+UINT8 mc6845_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
/* compute the current raster line */
UINT8 ra = y % (m_max_ras_addr + 1);
@@ -955,11 +940,11 @@ UINT8 mc6845_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle
UINT8 cr = y / (m_max_ras_addr + 1);
UINT16 ma = (cr << 8) | cc;
- m_update_row(this, bitmap, cliprect, ma, ra, y, m_horiz_disp, cursor_x, de, hbp, vbp, param);
+ m_update_row_cb(bitmap, cliprect, ma, ra, y, m_horiz_disp, cursor_x, de, hbp, vbp);
}
else
{
- m_update_row(this, bitmap, cliprect, m_current_disp_addr, ra, y, m_horiz_disp, cursor_x, de, hbp, vbp, param);
+ m_update_row_cb(bitmap, cliprect, m_current_disp_addr, ra, y, m_horiz_disp, cursor_x, de, hbp, vbp);
}
/* update MA if the last raster address */
@@ -976,15 +961,11 @@ UINT32 mc6845_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
if (m_has_valid_parameters)
{
- UINT16 y;
-
- void *param = NULL;
-
- assert(m_update_row != NULL);
+ assert(m_update_row_cb.isnull() != NULL);
/* call the set up function if any */
- if (m_begin_update != NULL)
- param = m_begin_update(this, bitmap, cliprect);
+ if (!m_begin_update_cb.isnull())
+ m_begin_update_cb(bitmap, cliprect);
if (cliprect.min_y == 0)
{
@@ -993,14 +974,14 @@ UINT32 mc6845_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
}
/* for each row in the visible region */
- for (y = cliprect.min_y; y <= cliprect.max_y; y++)
+ for (UINT16 y = cliprect.min_y; y <= cliprect.max_y; y++)
{
- this->draw_scanline(y, bitmap, cliprect, param);
+ this->draw_scanline(y, bitmap, cliprect);
}
/* call the tear down function if any */
- if (m_end_update != NULL)
- m_end_update(this, bitmap, cliprect, param);
+ if (!m_end_update_cb.isnull())
+ m_end_update_cb(bitmap, cliprect);
}
else
{
@@ -1017,10 +998,16 @@ void mc6845_device::device_start()
assert(m_hpixels_per_column > 0);
/* resolve callbacks */
- m_res_out_de_func.resolve(m_out_de_func, *this);
- m_res_out_cur_func.resolve(m_out_cur_func, *this);
- m_res_out_hsync_func.resolve(m_out_hsync_func, *this);
- m_res_out_vsync_func.resolve(m_out_vsync_func, *this);
+ m_out_de_cb.resolve_safe();
+ m_out_cur_cb.resolve_safe();
+ m_out_hsync_cb.resolve_safe();
+ m_out_vsync_cb.resolve_safe();
+
+ /* bind delegates */
+ m_begin_update_cb.bind_relative_to(*owner());
+ m_update_row_cb.bind_relative_to(*owner());
+ m_end_update_cb.bind_relative_to(*owner());
+ m_on_update_addr_changed_cb.bind_relative_to(*owner());
/* create the timers */
m_line_timer = timer_alloc(TIMER_LINE);
@@ -1257,7 +1244,8 @@ void mos8563_device::device_start()
m_supports_status_reg_d7 = true;
m_update_ready_bit = 1;
- m_update_row = vdc_update_row;
+ // default update_row delegate
+ m_update_row_cb = mc6845_update_row_delegate(FUNC(mos8563_device::vdc_update_row), this);
m_char_blink_state = false;
m_char_blink_count = 0;
@@ -1318,19 +1306,14 @@ void mos8568_device::device_start()
void mc6845_device::device_reset()
{
/* internal registers other than status remain unchanged, all outputs go low */
- if ( !m_res_out_de_func.isnull() )
- m_res_out_de_func( FALSE );
+ m_out_de_cb(false);
- if ( !m_res_out_hsync_func.isnull() )
- m_res_out_hsync_func( FALSE );
+ m_out_hsync_cb(false);
- if ( !m_res_out_vsync_func.isnull() )
- m_res_out_vsync_func( FALSE );
+ m_out_vsync_cb(false);
- if ( ! m_line_timer->enabled( ) )
- {
- m_line_timer->adjust( attotime::from_ticks( m_horiz_char_total + 1, m_clock ) );
- }
+ if (!m_line_timer->enabled())
+ m_line_timer->adjust(attotime::from_ticks(m_horiz_char_total + 1, m_clock));
m_light_pen_latched = false;
@@ -1520,9 +1503,9 @@ void mos8563_device::update_cursor_state()
}
-UINT8 mos8563_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param)
+UINT8 mos8563_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
- UINT8 ra = mc6845_device::draw_scanline(y, bitmap, cliprect, param);
+ UINT8 ra = mc6845_device::draw_scanline(y, bitmap, cliprect);
if (ra == m_max_ras_addr)
m_current_disp_addr = (m_current_disp_addr + m_row_addr_incr) & 0x3fff;
@@ -1531,31 +1514,31 @@ UINT8 mos8563_device::draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle
}
-void mos8563_device::update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( mos8563_device::vdc_update_row )
{
const pen_t *pen = m_palette->pens();
-
+
ra += (m_vert_scroll & 0x0f);
ra &= 0x0f;
-
+
UINT8 cth = (m_horiz_char >> 4) + (HSS_DBL ? 0 : 1);
UINT8 cdh = (m_horiz_char & 0x0f) + (HSS_DBL ? 0 : 1);
UINT8 cdv = m_vert_char_disp;
-
+
for (int column = 0; column < x_count; column++)
{
UINT8 code = read_videoram(ma + column);
UINT8 attr = 0;
-
+
int fg = m_color >> 4;
int bg = m_color & 0x0f;
-
+
if (HSS_ATTR)
{
offs_t attr_addr = m_attribute_addr + ma + column;
attr = read_videoram(attr_addr);
}
-
+
if (HSS_TEXT)
{
if (HSS_ATTR)
@@ -1563,15 +1546,15 @@ void mos8563_device::update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect,
fg = ATTR_FOREGROUND;
bg = ATTR_BACKGROUND;
}
-
+
if (VSS_RVS) code ^= 0xff;
-
+
for (int bit = 0; bit < cdh; bit++)
{
int x = (m_horiz_scroll & 0x0f) - cth + (column * cth) + bit;
if (x < 0) x = 0;
int color = BIT(code, 7) ? fg : bg;
-
+
bitmap.pix32(vbp + y, hbp + x) = pen[de ? color : 0];
}
}
@@ -1581,9 +1564,9 @@ void mos8563_device::update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect,
{
fg = ATTR_COLOR;
}
-
+
offs_t font_addr;
-
+
if (m_max_ras_addr < 16)
{
font_addr = ((m_char_base_addr & 0xe0) << 8) | (ATTR_ALTERNATE_CHARSET << 12) | (code << 4) | (ra & 0x0f);
@@ -1592,33 +1575,26 @@ void mos8563_device::update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect,
{
font_addr = ((m_char_base_addr & 0xc0) << 8) | (ATTR_ALTERNATE_CHARSET << 13) | (code << 5) | (ra & 0x1f);
}
-
+
UINT8 data = read_videoram(font_addr);
-
+
if (ra >= cdv) data = 0;
if (ATTR_UNDERLINE && (ra == m_underline_ras)) data = 0xff;
if (ATTR_BLINK && !m_char_blink_state) data = 0;
if (ATTR_REVERSE) data ^= 0xff;
if (column == cursor_x) data ^= 0xff;
if (VSS_RVS) data ^= 0xff;
-
+
for (int bit = 0; bit < cdh; bit++)
{
int x = (m_horiz_scroll & 0x0f) - cth + (column * cth) + bit;
if (x < 0) x = 0;
int color = BIT(data, 7) ? fg : bg;
-
+
bitmap.pix32(vbp + y, hbp + x) = pen[de ? color : 0];
-
+
if ((bit < 8) || !HSS_SEMI) data <<= 1;
}
}
}
}
-
-MC6845_UPDATE_ROW( mos8563_device::vdc_update_row )
-{
- mos8563_device *mos8563 = static_cast<mos8563_device *>(device);
-
- mos8563->update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param);
-}
diff --git a/src/emu/video/mc6845.h b/src/emu/video/mc6845.h
index 33e14a0b51f..40e0ca47b57 100644
--- a/src/emu/video/mc6845.h
+++ b/src/emu/video/mc6845.h
@@ -13,112 +13,73 @@
#include "emu.h"
-#define MC6845_INTERFACE(name) \
- const mc6845_interface (name) =
-
-#define MCFG_MC6845_ADD(_tag, _variant, _screen_tag, _clock, _config) \
+#define MCFG_MC6845_ADD(_tag, _variant, _screen_tag, _clock) \
MCFG_DEVICE_ADD(_tag, _variant, _clock) \
- MCFG_VIDEO_SET_SCREEN(_screen_tag) \
- MCFG_DEVICE_CONFIG(_config)
+ MCFG_VIDEO_SET_SCREEN(_screen_tag)
-#define MCFG_MOS8563_ADD(_tag, _screen_tag, _clock, _config, _map) \
+#define MCFG_MOS8563_ADD(_tag, _screen_tag, _clock, _map) \
MCFG_DEVICE_ADD(_tag, MOS8563, _clock) \
MCFG_VIDEO_SET_SCREEN(_screen_tag) \
- MCFG_DEVICE_CONFIG(_config) \
- MCFG_DEVICE_ADDRESS_MAP(AS_0, _map) \
- MCFG_SCREEN_ADD(_screen_tag, RASTER) \
- MCFG_SCREEN_REFRESH_RATE(60) \
- MCFG_SCREEN_SIZE(640, 200) \
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1) \
- MCFG_SCREEN_UPDATE_DEVICE(_tag, mos8563_device, screen_update)
-
-#define MCFG_MOS8568_ADD(_tag, _screen_tag, _clock, _config, _map) \
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, _map)
+
+#define MCFG_MOS8568_ADD(_tag, _screen_tag, _clock, _map) \
MCFG_DEVICE_ADD(_tag, MOS8568, _clock) \
MCFG_VIDEO_SET_SCREEN(_screen_tag) \
- MCFG_DEVICE_CONFIG(_config) \
- MCFG_DEVICE_ADDRESS_MAP(AS_0, _map) \
- MCFG_SCREEN_ADD(_screen_tag, RASTER) \
- MCFG_SCREEN_REFRESH_RATE(60) \
- MCFG_SCREEN_SIZE(640, 200) \
- MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1) \
- MCFG_SCREEN_UPDATE_DEVICE(_tag, mos8568_device, screen_update)
-
-
-class mc6845_device;
-
-/* callback definitions */
-typedef void * (*mc6845_begin_update_func)(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect);
-#define MC6845_BEGIN_UPDATE(name) void *name(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+ MCFG_DEVICE_ADDRESS_MAP(AS_0, _map)
-typedef void (*mc6845_update_row_func)(mc6845_device *device, bitmap_rgb32 &bitmap,
- const rectangle &cliprect, UINT16 ma, UINT8 ra,
- UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
+#define MCFG_MC6845_SHOW_BORDER_AREA(_show) \
+ mc6845_device::set_show_border_area(*device, _show);
+#define MCFG_MC6845_VISAREA_ADJUST(_minx, _maxx, _miny, _maxy) \
+ mc6845_device::set_visarea_adjust(*device, _minx, _maxx, _miny, _maxy);
-#define MC6845_UPDATE_ROW(name) void name(mc6845_device *device, bitmap_rgb32 &bitmap, \
- const rectangle &cliprect, UINT16 ma, UINT8 ra, \
- UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+#define MCFG_MC6845_CHAR_WIDTH(_pixels) \
+ mc6845_device::set_char_width(*device, _pixels);
+#define MCFG_MC6845_BEGIN_UPDATE_CB(_class, _method) \
+ mc6845_device::set_begin_update_callback(*device, mc6845_begin_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
-typedef void (*mc6845_end_update_func)(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param);
-#define MC6845_END_UPDATE(name) void name(mc6845_device *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param)
-
-
-typedef void (*mc6845_on_update_addr_changed_func)(mc6845_device *device, int address, int strobe);
-#define MC6845_ON_UPDATE_ADDR_CHANGED(name) void name(mc6845_device *device, int address, int strobe)
-
-
-/* interface */
-struct mc6845_interface
-{
- bool m_show_border_area; /* visible screen area (false) active display (true) active display + blanking */
+#define MCFG_MC6845_UPDATE_ROW_CB(_class, _method) \
+ mc6845_device::set_update_row_callback(*device, mc6845_update_row_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
- /* visible screen area adjustment */
- int m_visarea_adjust_min_x;
- int m_visarea_adjust_max_x;
- int m_visarea_adjust_min_y;
- int m_visarea_adjust_max_y;
+#define MCFG_MC6845_END_UPDATE_CB(_class, _method) \
+ mc6845_device::set_end_update_callback(*device, mc6845_end_update_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
- int m_hpixels_per_column; /* number of pixels per video memory address */
+#define MCFG_MC6845_ADDR_CHANGED_CB(_class, _method) \
+ mc6845_device::set_on_update_addr_change_callback(*device, mc6845_on_update_addr_changed_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
- /* if specified, this gets called before any pixel update,
- optionally return a pointer that will be passed to the
- update and tear down callbacks */
- mc6845_begin_update_func m_begin_update;
+#define MCFG_MC6845_OUT_DE_CB(_write) \
+ devcb = &mc6845_device::set_out_de_callback(*device, DEVCB2_##_write);
- /* this gets called for every row, the driver must output
- x_count * hpixels_per_column pixels.
- cursor_x indicates the character position where the cursor is, or -1
- if there is no cursor on this row */
- mc6845_update_row_func m_update_row;
+#define MCFG_MC6845_OUT_CUR_CB(_write) \
+ devcb = &mc6845_device::set_out_cur_callback(*device, DEVCB2_##_write);
- /* if specified, this gets called after all row updating is complete */
- mc6845_end_update_func m_end_update;
+#define MCFG_MC6845_OUT_HSYNC_CB(_write) \
+ devcb = &mc6845_device::set_out_hsync_callback(*device, DEVCB2_##_write);
- /* if specified, this gets called for every change of the disply enable pin (pin 18) */
- devcb_write_line m_out_de_func;
+#define MCFG_MC6845_OUT_VSYNC_CB(_write) \
+ devcb = &mc6845_device::set_out_vsync_callback(*device, DEVCB2_##_write);
- /* if specified, this gets called for every change of the cursor pin (pin 19) */
- devcb_write_line m_out_cur_func;
- /* if specified, this gets called for every change of the HSYNC pin (pin 39) */
- devcb_write_line m_out_hsync_func;
+/* callback definitions */
+typedef device_delegate<void (bitmap_rgb32 &bitmap, const rectangle &cliprect)> mc6845_begin_update_delegate;
+#define MC6845_BEGIN_UPDATE(name) void name(bitmap_rgb32 &bitmap, const rectangle &cliprect)
- /* if specified, this gets called for every change of the VSYNC pin (pin 40) */
- devcb_write_line m_out_vsync_func;
+typedef device_delegate<void (bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra,
+ UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp)> mc6845_update_row_delegate;
+#define MC6845_UPDATE_ROW(name) void name(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, \
+ UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp)
- /* Called whenever the update address changes
- * For vblank/hblank timing strobe indicates the physical update.
- * vblank/hblank timing not supported yet! */
+typedef device_delegate<void (bitmap_rgb32 &bitmap, const rectangle &cliprect)> mc6845_end_update_delegate;
+#define MC6845_END_UPDATE(name) void name(bitmap_rgb32 &bitmap, const rectangle &cliprect)
- mc6845_on_update_addr_changed_func m_on_update_addr_changed;
-};
+typedef device_delegate<void (int address, int strobe)> mc6845_on_update_addr_changed_delegate;
+#define MC6845_ON_UPDATE_ADDR_CHANGED(name) void name(int address, int strobe)
class mc6845_device : public device_t,
- public device_video_interface,
- public mc6845_interface
+ public device_video_interface
{
friend class mc6845_1_device;
friend class r6545_1_device;
@@ -135,6 +96,27 @@ public:
mc6845_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
mc6845_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+ static void set_show_border_area(device_t &device, bool show) { downcast<mc6845_device &>(device).m_show_border_area = show; }
+ static void set_visarea_adjust(device_t &device, int min_x, int max_x, int min_y, int max_y)
+ {
+ mc6845_device &dev = downcast<mc6845_device &>(device);
+ dev.m_visarea_adjust_min_x = min_x;
+ dev.m_visarea_adjust_max_x = max_x;
+ dev.m_visarea_adjust_min_y = min_y;
+ dev.m_visarea_adjust_max_y = max_y;
+ }
+ static void set_char_width(device_t &device, int pixels) { downcast<mc6845_device &>(device).m_hpixels_per_column = pixels; }
+
+ static void set_begin_update_callback(device_t &device, mc6845_begin_update_delegate callback) { downcast<mc6845_device &>(device).m_begin_update_cb = callback; }
+ static void set_update_row_callback(device_t &device, mc6845_update_row_delegate callback) { downcast<mc6845_device &>(device).m_update_row_cb = callback; }
+ static void set_end_update_callback(device_t &device, mc6845_end_update_delegate callback) { downcast<mc6845_device &>(device).m_end_update_cb = callback; }
+ static void set_on_update_addr_change_callback(device_t &device, mc6845_on_update_addr_changed_delegate callback) { downcast<mc6845_device &>(device).m_on_update_addr_changed_cb = callback; }
+
+ template<class _Object> static devcb2_base &set_out_de_callback(device_t &device, _Object object) { return downcast<mc6845_device &>(device).m_out_de_cb.set_callback(object); }
+ template<class _Object> static devcb2_base &set_out_cur_callback(device_t &device, _Object object) { return downcast<mc6845_device &>(device).m_out_cur_cb.set_callback(object); }
+ template<class _Object> static devcb2_base &set_out_hsync_callback(device_t &device, _Object object) { return downcast<mc6845_device &>(device).m_out_hsync_cb.set_callback(object); }
+ template<class _Object> static devcb2_base &set_out_vsync_callback(device_t &device, _Object object) { return downcast<mc6845_device &>(device).m_out_vsync_cb.set_callback(object); }
+
/* select one of the registers for reading or writing */
DECLARE_WRITE8_MEMBER( address_w );
@@ -181,7 +163,6 @@ public:
protected:
// device-level overrides
- virtual void device_config_complete();
virtual void device_start();
virtual void device_reset();
virtual void device_post_load();
@@ -194,11 +175,6 @@ protected:
bool m_supports_status_reg_d7;
bool m_supports_transparent;
- devcb_resolved_write_line m_res_out_de_func;
- devcb_resolved_write_line m_res_out_cur_func;
- devcb_resolved_write_line m_res_out_hsync_func;
- devcb_resolved_write_line m_res_out_vsync_func;
-
/* register file */
UINT8 m_horiz_char_total; /* 0x00 */
UINT8 m_horiz_disp; /* 0x01 */
@@ -262,7 +238,7 @@ protected:
emu_timer *m_light_pen_latch_timer;
emu_timer *m_upd_adr_timer;
emu_timer *m_upd_trans_timer;
-
+
/* computed values - do NOT state save these! */
/* These computed are used to define the screen parameters for a driver */
UINT16 m_horiz_pix_total;
@@ -290,7 +266,52 @@ protected:
void set_cur(int state);
void handle_line_timer();
virtual void update_cursor_state();
- virtual UINT8 draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param);
+ virtual UINT8 draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ /************************
+ interface CRTC - driver
+ ************************/
+
+ bool m_show_border_area; /* visible screen area (false) active display (true) active display + blanking */
+
+ /* visible screen area adjustment */
+ int m_visarea_adjust_min_x;
+ int m_visarea_adjust_max_x;
+ int m_visarea_adjust_min_y;
+ int m_visarea_adjust_max_y;
+
+ int m_hpixels_per_column; /* number of pixels per video memory address */
+
+ /* if specified, this gets called before any pixel update,
+ optionally return a pointer that will be passed to the
+ update and tear down callbacks */
+ mc6845_begin_update_delegate m_begin_update_cb;
+
+ /* this gets called for every row, the driver must output
+ x_count * hpixels_per_column pixels.
+ cursor_x indicates the character position where the cursor is, or -1
+ if there is no cursor on this row */
+ mc6845_update_row_delegate m_update_row_cb;
+
+ /* if specified, this gets called after all row updating is complete */
+ mc6845_end_update_delegate m_end_update_cb;
+
+ /* Called whenever the update address changes
+ * For vblank/hblank timing strobe indicates the physical update.
+ * vblank/hblank timing not supported yet! */
+ mc6845_on_update_addr_changed_delegate m_on_update_addr_changed_cb;
+
+ /* if specified, this gets called for every change of the disply enable pin (pin 18) */
+ devcb2_write_line m_out_de_cb;
+
+ /* if specified, this gets called for every change of the cursor pin (pin 19) */
+ devcb2_write_line m_out_cur_cb;
+
+ /* if specified, this gets called for every change of the HSYNC pin (pin 39) */
+ devcb2_write_line m_out_hsync_cb;
+
+ /* if specified, this gets called for every change of the VSYNC pin (pin 40) */
+ devcb2_write_line m_out_vsync_cb;
};
@@ -403,8 +424,7 @@ public:
inline UINT8 read_videoram(offs_t offset);
inline void write_videoram(offs_t offset, UINT8 data);
- void update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
- static MC6845_UPDATE_ROW( vdc_update_row );
+ MC6845_UPDATE_ROW( vdc_update_row );
protected:
// device-level overrides
@@ -442,7 +462,7 @@ protected:
int m_revision;
virtual void update_cursor_state();
- virtual UINT8 draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param);
+ virtual UINT8 draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect);
static const device_timer_id TIMER_BLOCK_COPY = 9;
diff --git a/src/mame/drivers/4enlinea.c b/src/mame/drivers/4enlinea.c
index c59726e114c..5e4e6ff3a79 100644
--- a/src/mame/drivers/4enlinea.c
+++ b/src/mame/drivers/4enlinea.c
@@ -295,7 +295,6 @@ void isa8_cga_4enlinea_device::device_start()
m_vram_size = 0x4000;
m_vram.resize(m_vram_size);
- m_update_row = NULL;
//m_isa->install_device(0x3bf, 0x3bf, 0, 0, NULL, write8_delegate( FUNC(isa8_cga_4enlinea_device::_4enlinea_mode_control_w), this ) );
m_isa->install_device(0x3d0, 0x3df, 0, 0, read8_delegate( FUNC(isa8_cga_4enlinea_device::_4enlinea_io_read), this ), write8_delegate( FUNC(isa8_cga_device::io_write), this ) );
m_isa->install_bank(0x8000, 0xbfff, 0, 0, "bank1", m_vram);
diff --git a/src/mame/drivers/4roses.c b/src/mame/drivers/4roses.c
index 30a384fd15b..6daf30633c4 100644
--- a/src/mame/drivers/4roses.c
+++ b/src/mame/drivers/4roses.c
@@ -358,28 +358,6 @@ static const ay8910_interface ay8910_intf =
};
-#if 0
-/************************
-* CRTC Interface *
-************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-#endif
-
-
/**************************
* Machine Drivers *
**************************/
@@ -408,7 +386,7 @@ static MACHINE_CONFIG_START( 4roses, _4roses_state )
MCFG_PALETTE_INIT_OWNER(_4roses_state,funworld)
MCFG_VIDEO_START_OVERRIDE(_4roses_state,funworld)
-// MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/8, mc6845_intf) /* 2MHz, guess */
+// MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/8) /* 2MHz, guess */
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/5clown.c b/src/mame/drivers/5clown.c
index 8e013209269..0276eac06ba 100644
--- a/src/mame/drivers/5clown.c
+++ b/src/mame/drivers/5clown.c
@@ -994,27 +994,6 @@ static GFXDECODE_START( fclown )
GFXDECODE_ENTRY( "gfx2", 0, tilelayout, 0, 16 )
GFXDECODE_END
-
-/***********************
-* CRTC Interface *
-***********************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/*************************
* Sound Interfaces *
*************************/
@@ -1070,7 +1049,9 @@ static MACHINE_CONFIG_START( fclown, _5clown_state )
MCFG_PALETTE_ADD("palette", 256)
MCFG_PALETTE_INIT_OWNER(_5clown_state, _5clown)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/16, mc6845_intf) /* guess */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/16) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/albazg.c b/src/mame/drivers/albazg.c
index d9a6975429b..79c5e4eb6d5 100644
--- a/src/mame/drivers/albazg.c
+++ b/src/mame/drivers/albazg.c
@@ -210,21 +210,6 @@ static const ay8910_interface ay8910_config =
DEVCB_NULL
};
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
/***************************************************************************************/
static ADDRESS_MAP_START( main_map, AS_PROGRAM, 8, albazg_state )
@@ -394,7 +379,9 @@ static MACHINE_CONFIG_START( yumefuda, albazg_state )
MCFG_SCREEN_UPDATE_DRIVER(albazg_state, screen_update_yumefuda)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", H46505, "screen", MASTER_CLOCK/16, mc6845_intf) /* hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", MASTER_CLOCK/16) /* hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", yumefuda )
MCFG_PALETTE_ADD("palette", 0x80)
diff --git a/src/mame/drivers/amaticmg.c b/src/mame/drivers/amaticmg.c
index 1afc5646020..657b7a54708 100644
--- a/src/mame/drivers/amaticmg.c
+++ b/src/mame/drivers/amaticmg.c
@@ -794,26 +794,6 @@ GFXDECODE_END
/************************************
-* CRTC Interface *
-************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-/************************************
* Machine Start & Reset *
************************************/
@@ -866,7 +846,9 @@ static MACHINE_CONFIG_START( amaticmg, amaticmg_state )
MCFG_SCREEN_UPDATE_DRIVER(amaticmg_state, screen_update_amaticmg)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", amaticmg)
diff --git a/src/mame/drivers/amusco.c b/src/mame/drivers/amusco.c
index ce14c156431..894480d2c8b 100644
--- a/src/mame/drivers/amusco.c
+++ b/src/mame/drivers/amusco.c
@@ -99,6 +99,7 @@ public:
DECLARE_READ8_MEMBER(mc6845_r);
DECLARE_WRITE8_MEMBER(mc6845_w);
DECLARE_WRITE16_MEMBER(vram_w);
+ MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr);
UINT32 screen_update_amusco(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(amusco_interrupt);
@@ -482,28 +483,11 @@ GFXDECODE_END
* CRTC Interface *
************************/
-MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr)
+MC6845_ON_UPDATE_ADDR_CHANGED(amusco_state::crtc_addr)
{
-// amusco_state *state = device->machine().driver_data<amusco_state>();
-// state->m_video_update_address = address;
+// m_video_update_address = address;
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- crtc_addr /* update address callback */
-};
-
-
INTERRUPT_GEN_MEMBER(amusco_state::amusco_vblank_irq)
{
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0x80/4); // sets 0x665 to 0xff
@@ -545,7 +529,10 @@ static MACHINE_CONFIG_START( amusco, amusco_state )
MCFG_PALETTE_ADD("palette", 8)
MCFG_PALETTE_INIT_OWNER(amusco_state, amusco_palette_init)
- MCFG_MC6845_ADD("crtc", R6545_1, "screen", CRTC_CLOCK, mc6845_intf) /* guess */
+ MCFG_MC6845_ADD("crtc", R6545_1, "screen", CRTC_CLOCK) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_ADDR_CHANGED_CB(amusco_state, crtc_addr)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/aristmk4.c b/src/mame/drivers/aristmk4.c
index 7149f8f7453..52a2e57bfd6 100644
--- a/src/mame/drivers/aristmk4.c
+++ b/src/mame/drivers/aristmk4.c
@@ -1568,24 +1568,6 @@ static const ay8910_interface ay8910_config2 =
DEVCB_DRIVER_MEMBER(aristmk4_state,pbltlp_out) // Port B write - goes to lamps on the buttons x4 and light tower x4
};
-static MC6845_INTERFACE( mc6845_intf )
-{
- /* in fact is a mc6845 driving 4 pixels by memory address.
- that's why the big horizontal parameters */
-
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
/* read m/c number */
READ8_MEMBER(aristmk4_state::pa1_r)
@@ -1724,7 +1706,12 @@ static MACHINE_CONFIG_START( aristmk4, aristmk4_state )
MCFG_PIA_CA2_HANDLER(WRITELINE(aristmk4_state, mkiv_pia_ca2))
MCFG_PIA_CB2_HANDLER(WRITELINE(aristmk4_state, mkiv_pia_cb2))
- MCFG_MC6845_ADD("crtc", C6545_1, "screen", MAIN_CLOCK/8, mc6845_intf) // TODO: type is unknown
+ MCFG_MC6845_ADD("crtc", C6545_1, "screen", MAIN_CLOCK/8) // TODO: type is unknown
+ /* in fact is a mc6845 driving 4 pixels by memory address.
+ that's why the big horizontal parameters */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
+
MCFG_MC146818_ADD( "rtc", XTAL_4_194304Mhz )
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/avt.c b/src/mame/drivers/avt.c
index 5f4aac83359..7cfcadeb0bd 100644
--- a/src/mame/drivers/avt.c
+++ b/src/mame/drivers/avt.c
@@ -847,26 +847,6 @@ static GFXDECODE_START( avt )
GFXDECODE_END
-/*******************************************
-* CRTC Interface *
-*******************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/********************************************
* Sound Interfaces *
********************************************/
@@ -914,7 +894,9 @@ static MACHINE_CONFIG_START( avt, avt_state )
MCFG_PALETTE_ADD("palette", 8*16)
MCFG_PALETTE_INIT_OWNER(avt_state, avt)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf) /* guess */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/blitz.c b/src/mame/drivers/blitz.c
index 49d830b8a99..f6b2380c9f6 100644
--- a/src/mame/drivers/blitz.c
+++ b/src/mame/drivers/blitz.c
@@ -701,26 +701,6 @@ static GFXDECODE_START( megadpkr )
GFXDECODE_END
-/********************************************
-* CRTC Interface *
-********************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/**********************************************************
* Discrete Sound Routines *
***********************************************************
@@ -787,7 +767,9 @@ static MACHINE_CONFIG_START( megadpkr, blitz_state )
MCFG_SCREEN_UPDATE_DRIVER(blitz_state, screen_update_megadpkr)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CPU_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CPU_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", megadpkr)
MCFG_PALETTE_ADD("palette", 256)
diff --git a/src/mame/drivers/blitz68k.c b/src/mame/drivers/blitz68k.c
index 999d00bcf9b..b281c124050 100644
--- a/src/mame/drivers/blitz68k.c
+++ b/src/mame/drivers/blitz68k.c
@@ -1647,10 +1647,6 @@ INPUT_PORTS_END
// R6845AP used for video sync signals only
-static MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr)
-{
-}
-
WRITE_LINE_MEMBER(blitz68k_state::crtc_vsync_irq1)
{
m_maincpu->set_input_line(1, state ? ASSERT_LINE : CLEAR_LINE);
@@ -1667,51 +1663,6 @@ WRITE_LINE_MEMBER(blitz68k_state::crtc_vsync_irq5)
}
-static MC6845_INTERFACE( mc6845_intf_irq1 )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */ /* Horizontal Display programmed to 160 characters */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(blitz68k_state,crtc_vsync_irq1), /* VSYNC callback */
- crtc_addr /* update address callback */
-};
-
-static MC6845_INTERFACE( mc6845_intf_irq3 )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */ /* Horizontal Display programmed to 160 characters */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(blitz68k_state,crtc_vsync_irq3), /* VSYNC callback */
- crtc_addr /* update address callback */
-};
-
-static MC6845_INTERFACE( mc6845_intf_irq5 )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */ /* Horizontal Display programmed to 160 characters */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(blitz68k_state,crtc_vsync_irq5), /* VSYNC callback */
- crtc_addr /* update address callback */
-};
-
static ADDRESS_MAP_START( ramdac_map, AS_0, 8, blitz68k_state )
AM_RANGE(0x000, 0x3ff) AM_DEVREADWRITE("ramdac",ramdac_device,ramdac_pal_r,ramdac_rgb666_w)
ADDRESS_MAP_END
@@ -1802,7 +1753,10 @@ static MACHINE_CONFIG_START( cjffruit, blitz68k_state )
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-8-1)
MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
- MCFG_MC6845_ADD("crtc", R6545_1, "screen", XTAL_22_1184MHz/8, mc6845_intf_irq1)
+ MCFG_MC6845_ADD("crtc", R6545_1, "screen", XTAL_22_1184MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(blitz68k_state, crtc_vsync_irq1))
MCFG_PALETTE_ADD("palette", 0x100)
@@ -1834,7 +1788,10 @@ static MACHINE_CONFIG_START( bankrob, blitz68k_state )
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4)
MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4, mc6845_intf_irq3)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(blitz68k_state, crtc_vsync_irq3))
MCFG_PALETTE_ADD("palette", 0x100)
@@ -1864,7 +1821,10 @@ static MACHINE_CONFIG_START( bankroba, blitz68k_state )
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+7, 256-1)
MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4, mc6845_intf_irq5)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(blitz68k_state, crtc_vsync_irq5))
MCFG_PALETTE_ADD("palette", 0x100)
@@ -1893,7 +1853,10 @@ static MACHINE_CONFIG_START( deucesw2, blitz68k_state )
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
- MCFG_MC6845_ADD("crtc", R6545_1, "screen", XTAL_22_1184MHz/8, mc6845_intf_irq3)
+ MCFG_MC6845_ADD("crtc", R6545_1, "screen", XTAL_22_1184MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(blitz68k_state, crtc_vsync_irq3))
MCFG_PALETTE_ADD("palette", 0x100)
@@ -1924,7 +1887,10 @@ static MACHINE_CONFIG_START( dualgame, blitz68k_state )
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4)
MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4, mc6845_intf_irq3)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(blitz68k_state, crtc_vsync_irq3))
MCFG_PALETTE_ADD("palette", 0x100)
@@ -1953,7 +1919,10 @@ static MACHINE_CONFIG_START( hermit, blitz68k_state )
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0+4, 256-1-4)
MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k)
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_22_1184MHz/8, mc6845_intf_irq1)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_22_1184MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(blitz68k_state, crtc_vsync_irq1))
MCFG_PALETTE_ADD("palette", 0x100)
@@ -1987,7 +1956,10 @@ static MACHINE_CONFIG_START( maxidbl, blitz68k_state )
MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
MCFG_SCREEN_UPDATE_DRIVER(blitz68k_state, screen_update_blitz68k_noblit)
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4, mc6845_intf_irq3)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_11_0592MHz/4)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(blitz68k_state, crtc_vsync_irq3))
MCFG_PALETTE_ADD("palette", 0x100)
MCFG_RAMDAC_ADD("ramdac", ramdac_map, "palette")
diff --git a/src/mame/drivers/buster.c b/src/mame/drivers/buster.c
index 0a604631588..4a81948848e 100644
--- a/src/mame/drivers/buster.c
+++ b/src/mame/drivers/buster.c
@@ -312,21 +312,6 @@ static GFXDECODE_START( buster )
GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0, 1 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
PALETTE_INIT_MEMBER(buster_state, buster)
{
int i;
@@ -350,7 +335,10 @@ static MACHINE_CONFIG_START( buster, buster_state )
MCFG_SCREEN_VISIBLE_AREA(0, 256-1, 16, 256-16-1)
MCFG_SCREEN_UPDATE_DRIVER(buster_state, screen_update_buster)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_3_579545MHz/4, mc6845_intf) //unknown clock / type
+
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_3_579545MHz/4) //unknown clock / type
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", buster)
MCFG_PALETTE_ADD("palette", 8)
diff --git a/src/mame/drivers/calomega.c b/src/mame/drivers/calomega.c
index dbd018c280a..031561bcbda 100644
--- a/src/mame/drivers/calomega.c
+++ b/src/mame/drivers/calomega.c
@@ -2600,26 +2600,6 @@ static const ay8910_interface sys906_ay8912_intf =
/*************************************************
-* CRTC Interface *
-*************************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-/*************************************************
* Machine Drivers *
*************************************************/
@@ -2653,7 +2633,9 @@ static MACHINE_CONFIG_START( sys903, calomega_state )
MCFG_PALETTE_ADD("palette", 1024)
MCFG_PALETTE_INIT_OWNER(calomega_state, calomega)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CPU_CLOCK, mc6845_intf) /* 6845 @ CPU clock */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CPU_CLOCK) /* 6845 @ CPU clock */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/carrera.c b/src/mame/drivers/carrera.c
index e5221990640..94cf851fbf6 100644
--- a/src/mame/drivers/carrera.c
+++ b/src/mame/drivers/carrera.c
@@ -315,22 +315,6 @@ PALETTE_INIT_MEMBER(carrera_state, carrera)
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static MACHINE_CONFIG_START( carrera, carrera_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MASTER_CLOCK / 6)
@@ -347,7 +331,9 @@ static MACHINE_CONFIG_START( carrera, carrera_state )
MCFG_SCREEN_UPDATE_DRIVER(carrera_state, screen_update_carrera)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK / 16, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", carrera)
MCFG_PALETTE_ADD("palette", 32)
diff --git a/src/mame/drivers/chance32.c b/src/mame/drivers/chance32.c
index db869810ce1..e99d9bed0f9 100644
--- a/src/mame/drivers/chance32.c
+++ b/src/mame/drivers/chance32.c
@@ -440,22 +440,6 @@ void chance32_state::machine_reset()
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 16, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static MACHINE_CONFIG_START( chance32, chance32_state )
/* basic machine hardware */
@@ -464,7 +448,6 @@ static MACHINE_CONFIG_START( chance32, chance32_state )
MCFG_CPU_IO_MAP(chance32_portmap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", chance32_state, irq0_line_hold)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(52.786)
@@ -475,7 +458,9 @@ static MACHINE_CONFIG_START( chance32, chance32_state )
MCFG_SCREEN_UPDATE_DRIVER(chance32_state, screen_update_chance32)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", H46505, "screen", 12000000/16, mc6845_intf) /* 52.786 Hz (similar to Major Poker) */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", 12000000/16) /* 52.786 Hz (similar to Major Poker) */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", chance32)
MCFG_PALETTE_ADD("palette", 0x800)
diff --git a/src/mame/drivers/coinmstr.c b/src/mame/drivers/coinmstr.c
index bc683fbcd55..f483ca33f1f 100644
--- a/src/mame/drivers/coinmstr.c
+++ b/src/mame/drivers/coinmstr.c
@@ -1448,21 +1448,6 @@ static const ay8910_interface ay8912_interface =
DEVCB_NULL
};
-static MC6845_INTERFACE( h46505_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
static MACHINE_CONFIG_START( coinmstr, coinmstr_state )
MCFG_CPU_ADD("maincpu", Z80, CPU_CLOCK) // 7 MHz.
@@ -1493,7 +1478,9 @@ static MACHINE_CONFIG_START( coinmstr, coinmstr_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", coinmstr)
MCFG_PALETTE_ADD("palette", 46*32*4)
- MCFG_MC6845_ADD("crtc", H46505, "screen", 14000000 / 16, h46505_intf)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", 14000000 / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/docastle.c b/src/mame/drivers/docastle.c
index 6c4fac61f8e..68f036e475f 100644
--- a/src/mame/drivers/docastle.c
+++ b/src/mame/drivers/docastle.c
@@ -551,35 +551,6 @@ static GFXDECODE_START( docastle )
GFXDECODE_END
-/*************************************
- *
- * 6845 CRTC interface
- *
- *************************************/
-
-/*
-The games program the CRTC for a width of 32 characters (256 pixels).
-However, the DE output from the CRTC is first ANDed with the NAND of
-MA1 through MA4, and then delayed by 8 pixel clocks; this effectively
-blanks the first 8 pixels and last 8 pixels of each line.
-*/
-
-static MC6845_INTERFACE( crtc_intf )
-{
- false, /* show border area */
- 8,-8,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_DRIVER_LINE_MEMBER(docastle_state, docastle_tint), /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/* Machine Drivers */
void docastle_state::machine_reset()
@@ -625,7 +596,17 @@ static MACHINE_CONFIG_START( docastle, docastle_state )
MCFG_CPU_VBLANK_INT_DRIVER("screen", docastle_state, nmi_line_pulse)
/* video hardware */
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_9_828MHz / 16, crtc_intf)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_9_828MHz / 16)
+ /*
+ The games program the CRTC for a width of 32 characters (256 pixels).
+ However, the DE output from the CRTC is first ANDed with the NAND of
+ MA1 through MA4, and then delayed by 8 pixel clocks; this effectively
+ blanks the first 8 pixels and last 8 pixels of each line.
+ */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_VISAREA_ADJUST(8,-8,0,0)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(docastle_state, docastle_tint))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_9_828MHz/2, 0x138, 8, 0x100-8, 0x108, 0, 0xc0) // from crtc
diff --git a/src/mame/drivers/flipjack.c b/src/mame/drivers/flipjack.c
index 71131fae0b7..73eb8b51171 100644
--- a/src/mame/drivers/flipjack.c
+++ b/src/mame/drivers/flipjack.c
@@ -423,22 +423,6 @@ static const ay8910_interface ay8910_config_2 =
DEVCB_NULL /* Port B write */
};
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static const gfx_layout tilelayout =
{
@@ -493,7 +477,9 @@ static MACHINE_CONFIG_START( flipjack, flipjack_state )
MCFG_SCREEN_RAW_PARAMS(VIDEO_CLOCK, 0x188, 0, 0x100, 0x100, 0, 0xc0) // from crtc
MCFG_SCREEN_UPDATE_DRIVER(flipjack_state, screen_update_flipjack)
- MCFG_MC6845_ADD("crtc", HD6845, "screen", VIDEO_CLOCK/8, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", HD6845, "screen", VIDEO_CLOCK/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", flipjack)
diff --git a/src/mame/drivers/fortecar.c b/src/mame/drivers/fortecar.c
index 18c143507e7..af596c8483d 100644
--- a/src/mame/drivers/fortecar.c
+++ b/src/mame/drivers/fortecar.c
@@ -526,22 +526,6 @@ static const ay8910_interface ay8910_config =
};
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static ADDRESS_MAP_START( fortecar_map, AS_PROGRAM, 8, fortecar_state )
AM_RANGE(0x0000, 0xbfff) AM_ROM
AM_RANGE(0xc000, 0xc7ff) AM_ROM
@@ -699,7 +683,9 @@ static MACHINE_CONFIG_START( fortecar, fortecar_state )
MCFG_PALETTE_ADD("palette", 0x200)
MCFG_PALETTE_INIT_OWNER(fortecar_state, fortecar)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf) /* 1.5 MHz, measured */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK) /* 1.5 MHz, measured */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/funworld.c b/src/mame/drivers/funworld.c
index 02f1924b793..5a6d652b123 100644
--- a/src/mame/drivers/funworld.c
+++ b/src/mame/drivers/funworld.c
@@ -2867,41 +2867,6 @@ static const ay8910_interface funquiz_ay8910_intf =
DEVCB_DRIVER_MEMBER(funworld_state,funworld_lamp_b_w) /* portB out */
};
-/************************
-* CRTC Interface *
-************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-static MC6845_INTERFACE( magicrd2_mc6845_intf )
-{
- false, /* show border area */
- 0,-56,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/********************************
* Machine Start & Reset *
********************************/
@@ -2957,7 +2922,9 @@ static MACHINE_CONFIG_START( fw1stpal, funworld_state )
MCFG_PALETTE_INIT_OWNER(funworld_state, funworld)
MCFG_VIDEO_START_OVERRIDE(funworld_state, funworld)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf) /* 2MHz, veryfied on jollycrd & royalcrd */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK) /* 2MHz, veryfied on jollycrd & royalcrd */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -2995,7 +2962,10 @@ static MACHINE_CONFIG_DERIVED( magicrd2, fw1stpal )
MCFG_VIDEO_START_OVERRIDE(funworld_state, magicrd2)
MCFG_DEVICE_REMOVE("crtc")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, magicrd2_mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_VISAREA_ADJUST(0, -56, 0, 0)
+ MCFG_MC6845_CHAR_WIDTH(4)
MCFG_SOUND_REPLACE("ay8910", AY8910, SND_CLOCK) /* 2MHz */
MCFG_SOUND_CONFIG(ay8910_intf)
diff --git a/src/mame/drivers/gluck2.c b/src/mame/drivers/gluck2.c
index 7280d77b1a1..2e14e67280a 100644
--- a/src/mame/drivers/gluck2.c
+++ b/src/mame/drivers/gluck2.c
@@ -503,26 +503,6 @@ static GFXDECODE_START( gluck2 )
GFXDECODE_END
-/********************************************
-* CRTC Interface *
-********************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/*************************************************
* Sound Interfaces *
*************************************************/
@@ -572,7 +552,9 @@ static MACHINE_CONFIG_START( gluck2, gluck2_state )
MCFG_PALETTE_ADD("palette", 0x100)
MCFG_PALETTE_INIT_OWNER(gluck2_state, gluck2)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/16, mc6845_intf) /* guess */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/16) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/goldnpkr.c b/src/mame/drivers/goldnpkr.c
index 539e38714b0..57f4431ab10 100644
--- a/src/mame/drivers/goldnpkr.c
+++ b/src/mame/drivers/goldnpkr.c
@@ -3526,26 +3526,6 @@ static GFXDECODE_START( wcrdxtnd )
GFXDECODE_ENTRY( "gfx15", 0, tilelayout, 0, 16 )
GFXDECODE_END
-/*******************************************
-* CRTC Interface *
-*******************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/**********************************************************
* Discrete Sound Routines *
***********************************************************
@@ -3746,7 +3726,9 @@ static MACHINE_CONFIG_START( goldnpkr_base, goldnpkr_state )
MCFG_SCREEN_UPDATE_DRIVER(goldnpkr_state, screen_update_goldnpkr)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CPU_CLOCK, mc6845_intf) /* 68B45 or 6845s @ CPU clock */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CPU_CLOCK) /* 68B45 or 6845s @ CPU clock */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", goldnpkr)
MCFG_PALETTE_ADD("palette", 256)
diff --git a/src/mame/drivers/hitpoker.c b/src/mame/drivers/hitpoker.c
index 1421aef3e75..17681857388 100644
--- a/src/mame/drivers/hitpoker.c
+++ b/src/mame/drivers/hitpoker.c
@@ -462,21 +462,6 @@ static GFXDECODE_START( hitpoker )
GFXDECODE_ENTRY( "gfx1", 0, hitpoker_layout_8bpp, 0, 8 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
static const ay8910_interface ay8910_config =
{
AY8910_LEGACY_OUTPUT,
@@ -511,12 +496,13 @@ static MACHINE_CONFIG_START( hitpoker, hitpoker_state )
MCFG_SCREEN_UPDATE_DRIVER(hitpoker_state, screen_update_hitpoker)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", H46505, "screen", CRTC_CLOCK/2, mc6845_intf) /* hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", CRTC_CLOCK/2) /* hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", hitpoker)
MCFG_PALETTE_ADD("palette", 0x800)
-
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("aysnd", YM2149, 1500000)
diff --git a/src/mame/drivers/jokrwild.c b/src/mame/drivers/jokrwild.c
index 5e345780bd5..3bd3bdda21a 100644
--- a/src/mame/drivers/jokrwild.c
+++ b/src/mame/drivers/jokrwild.c
@@ -423,26 +423,6 @@ WRITE8_MEMBER(jokrwild_state::testb_w)
// printf("%02x B\n",data);
}
-/************************
-* CRTC Interface *
-************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/*************************
* Machine Drivers *
*************************/
@@ -479,8 +459,9 @@ static MACHINE_CONFIG_START( jokrwild, jokrwild_state )
MCFG_PALETTE_ADD("palette", 512)
MCFG_PALETTE_INIT_OWNER(jokrwild_state, jokrwild)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/16, mc6845_intf) /* guess */
-
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/16) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/jubilee.c b/src/mame/drivers/jubilee.c
index 33bbbdf82d9..9240bb9ae94 100644
--- a/src/mame/drivers/jubilee.c
+++ b/src/mame/drivers/jubilee.c
@@ -650,25 +650,6 @@ static GFXDECODE_START( jubileep ) /* 4 different graphics banks */
GFXDECODE_END
-/***********************
-* CRTC Interface *
-************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0, 0, 0, 0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
/*************************
* Machine Drivers *
*************************/
@@ -693,8 +674,9 @@ static MACHINE_CONFIG_START( jubileep, jubilee_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", jubileep)
MCFG_PALETTE_ADD("palette",8)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf)
-
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/kingdrby.c b/src/mame/drivers/kingdrby.c
index 8574e0cb19b..00b7bed9eaa 100644
--- a/src/mame/drivers/kingdrby.c
+++ b/src/mame/drivers/kingdrby.c
@@ -20,6 +20,12 @@ TODO:
(but there isn't any title screen in the game?)
- Fix I/O in the 1986 bootleg version;
+MC6845 interface:
+ screen size: 384x272 registers 00 & 04. (value-1)
+ visible area: 256x224 registers 01 & 06.
+
+ the clocks are a guess, but is the only logical combination I found to get a reasonable vertical of ~53Hz.
+
============================================================================================
file : readme.txt
@@ -852,32 +858,6 @@ static GFXDECODE_START( cowrace )
GFXDECODE_ENTRY( "gfx2", 0x000000, layout8x8x2, 0x000, 0x80 )
GFXDECODE_END
-/**********************************************************************************************************
-*
-* MC6845 interface
-*
-* screen size: 384x272 registers 00 & 04. (value-1)
-* visible area: 256x224 registers 01 & 06.
-*
-* the clocks are a guess, but is the only logical combination I found to get a reasonable vertical of ~53Hz.
-*
-***********************************************************************************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
/*************************************
*
* Sound HW Config
@@ -1006,7 +986,9 @@ static MACHINE_CONFIG_START( kingdrby, kingdrby_state )
MCFG_SCREEN_UPDATE_DRIVER(kingdrby_state, screen_update_kingdrby)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CLK_1/32, mc6845_intf) /* 53.333 Hz. guess */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CLK_1/32) /* 53.333 Hz. guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/laserbas.c b/src/mame/drivers/laserbas.c
index fa56410a667..d69c9cdd491 100644
--- a/src/mame/drivers/laserbas.c
+++ b/src/mame/drivers/laserbas.c
@@ -286,22 +286,6 @@ void laserbas_state::machine_reset()
m_count = 0;
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static MACHINE_CONFIG_START( laserbas, laserbas_state )
MCFG_CPU_ADD("maincpu", Z80, 4000000)
@@ -329,7 +313,9 @@ static MACHINE_CONFIG_START( laserbas, laserbas_state )
MCFG_SCREEN_UPDATE_DRIVER(laserbas_state, screen_update_laserbas)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", H46505, "screen", 3000000/4, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", 3000000/4) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_PALETTE_ADD("palette", 32)
MCFG_PALETTE_FORMAT(RRRGGGBB)
diff --git a/src/mame/drivers/luckgrln.c b/src/mame/drivers/luckgrln.c
index f8790404396..857f04f75b4 100644
--- a/src/mame/drivers/luckgrln.c
+++ b/src/mame/drivers/luckgrln.c
@@ -975,21 +975,6 @@ static GFXDECODE_START( luckgrln )
GFXDECODE_ENTRY( "reels", 0, tiles8x32_layout, 0, 64 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
INTERRUPT_GEN_MEMBER(luckgrln_state::luckgrln_irq)
{
if(m_nmi_enable)
@@ -1002,7 +987,9 @@ static MACHINE_CONFIG_START( luckgrln, luckgrln_state )
MCFG_CPU_IO_MAP(portmap)
MCFG_CPU_VBLANK_INT_DRIVER("screen", luckgrln_state, luckgrln_irq)
- MCFG_MC6845_ADD("crtc", H46505, "screen", 6000000/4, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", 6000000/4) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -1015,7 +1002,6 @@ static MACHINE_CONFIG_START( luckgrln, luckgrln_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", luckgrln)
MCFG_PALETTE_ADD("palette", 0x8000)
-
MCFG_SPEAKER_STANDARD_MONO("mono")
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/magicfly.c b/src/mame/drivers/magicfly.c
index 29b9cd186ec..25d23638338 100644
--- a/src/mame/drivers/magicfly.c
+++ b/src/mame/drivers/magicfly.c
@@ -917,26 +917,6 @@ static GFXDECODE_START( magicfly )
GFXDECODE_END
-/********************************************
-* CRTC Interface *
-********************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/*********************************************
* Machine Drivers *
*********************************************/
@@ -963,7 +943,9 @@ static MACHINE_CONFIG_START( magicfly, magicfly_state )
MCFG_PALETTE_ADD("palette", 32)
MCFG_PALETTE_INIT_OWNER(magicfly_state, magicfly)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/16, mc6845_intf) /* guess */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/16) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/majorpkr.c b/src/mame/drivers/majorpkr.c
index 83172f5a98e..b95c1beb344 100644
--- a/src/mame/drivers/majorpkr.c
+++ b/src/mame/drivers/majorpkr.c
@@ -1001,26 +1001,6 @@ static GFXDECODE_START( majorpkr )
GFXDECODE_END
-/***********************
-* CRTC Interface *
-***********************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 16, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/*************************
* Machine Drivers *
*************************/
@@ -1046,7 +1026,9 @@ static MACHINE_CONFIG_START( majorpkr, majorpkr_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", majorpkr)
MCFG_PALETTE_ADD("palette", 0x100 * 16)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf) /* verified */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK) /* verified */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/merit.c b/src/mame/drivers/merit.c
index f3a15912378..8e06b873f71 100644
--- a/src/mame/drivers/merit.c
+++ b/src/mame/drivers/merit.c
@@ -126,6 +126,8 @@ public:
DECLARE_DRIVER_INIT(dtrvwz5);
virtual void machine_start();
DECLARE_MACHINE_START(casino5);
+ MC6845_BEGIN_UPDATE(crtc_begin_update);
+ MC6845_UPDATE_ROW(crtc_update_row);
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
};
@@ -237,46 +239,38 @@ WRITE8_MEMBER(merit_state::palette_w)
}
-static MC6845_BEGIN_UPDATE( begin_update )
+MC6845_BEGIN_UPDATE( merit_state::crtc_begin_update )
{
- merit_state *state = device->machine().driver_data<merit_state>();
- int i;
int dim, bit0, bit1, bit2;
- for (i=0; i < NUM_PENS; i++)
+ for (int i=0; i < NUM_PENS; i++)
{
dim = BIT(i,3) ? 255 : 127;
bit0 = BIT(i,0);
bit1 = BIT(i,1);
bit2 = BIT(i,2);
- state->m_pens[i] = rgb_t(dim*bit0, dim*bit1, dim*bit2);
+ m_pens[i] = rgb_t(dim*bit0, dim*bit1, dim*bit2);
}
-
- return state->m_pens;
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( merit_state::crtc_update_row )
{
- merit_state *state = device->machine().driver_data<merit_state>();
- UINT8 cx;
-
- pen_t *pens = (pen_t *)param;
UINT8 *gfx[2];
UINT16 x = 0;
int rlen;
- gfx[0] = state->memregion("gfx1")->base();
- gfx[1] = state->memregion("gfx2")->base();
- rlen = state->memregion("gfx2")->bytes();
+ gfx[0] = memregion("gfx1")->base();
+ gfx[1] = memregion("gfx2")->base();
+ rlen = memregion("gfx2")->bytes();
//ma = ma ^ 0x7ff;
- for (cx = 0; cx < x_count; cx++)
+ for (UINT8 cx = 0; cx < x_count; cx++)
{
int i;
- int attr = state->m_ram_attr[ma & 0x7ff];
+ int attr = m_ram_attr[ma & 0x7ff];
int region = (attr & 0x40) >> 6;
- int addr = ((state->m_ram_video[ma & 0x7ff] | ((attr & 0x80) << 1) | (state->m_extra_video_bank_bit)) << 4) | (ra & 0x0f);
+ int addr = ((m_ram_video[ma & 0x7ff] | ((attr & 0x80) << 1) | (m_extra_video_bank_bit)) << 4) | (ra & 0x0f);
int colour = (attr & 0x7f) << 3;
UINT8 *data;
@@ -296,8 +290,8 @@ static MC6845_UPDATE_ROW( update_row )
else
col |= 0x03;
- col = state->m_ram_palette[col & 0x3ff];
- bitmap.pix32(y, x) = pens[col ? col & (NUM_PENS-1) : (state->m_lscnblk ? 8 : 0)];
+ col = m_ram_palette[col & 0x3ff];
+ bitmap.pix32(y, x) = m_pens[col ? col & (NUM_PENS-1) : (m_lscnblk ? 8 : 0)];
x++;
}
@@ -317,21 +311,6 @@ WRITE_LINE_MEMBER(merit_state::vsync_changed)
m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE);
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- begin_update, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_DRIVER_LINE_MEMBER(merit_state,hsync_changed), /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(merit_state,vsync_changed), /* VSYNC callback */
- NULL /* update address callback */
-};
-
WRITE8_MEMBER(merit_state::led1_w)
{
/* 5 button lamps player 1 */
@@ -1181,13 +1160,17 @@ static MACHINE_CONFIG_START( pitboss, merit_state )
MCFG_I8255_OUT_PORTC_CB(WRITE8(merit_state, misc_w))
/* video hardware */
-
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 512, 0, 512, 256, 0, 256) /* temporary, CRTC will configure screen */
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf)
-
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(merit_state, crtc_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(merit_state, crtc_update_row)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(merit_state, hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(merit_state, vsync_changed))
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/miniboy7.c b/src/mame/drivers/miniboy7.c
index db662821882..a35549bf001 100644
--- a/src/mame/drivers/miniboy7.c
+++ b/src/mame/drivers/miniboy7.c
@@ -391,26 +391,6 @@ static GFXDECODE_START( miniboy7 )
GFXDECODE_END
-/**********************************
-* CRTC Interface *
-**********************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/***********************************
* Sound Interface *
***********************************/
@@ -454,7 +434,9 @@ static MACHINE_CONFIG_START( miniboy7, miniboy7_state )
MCFG_PALETTE_ADD("palette", 256)
MCFG_PALETTE_INIT_OWNER(miniboy7_state, miniboy7)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/12, mc6845_intf) /* guess */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/12) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/mpu12wbk.c b/src/mame/drivers/mpu12wbk.c
index e902ae1995f..57445b630d5 100644
--- a/src/mame/drivers/mpu12wbk.c
+++ b/src/mame/drivers/mpu12wbk.c
@@ -491,26 +491,6 @@ static const ay8910_interface ay8910_config =
};
-/************************
-* CRTC Interface *
-************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/*************************
* Machine Drivers *
*************************/
@@ -537,7 +517,9 @@ static MACHINE_CONFIG_START( mpu12wbk, mpu12wbk_state )
MCFG_PALETTE_ADD("palette", 512)
MCFG_PALETTE_INIT_OWNER(mpu12wbk_state, mpu12wbk)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/4, mc6845_intf) /* guess */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/4) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/mpu4dealem.c b/src/mame/drivers/mpu4dealem.c
index 13157853cb8..2b69ec3d60b 100644
--- a/src/mame/drivers/mpu4dealem.c
+++ b/src/mame/drivers/mpu4dealem.c
@@ -146,22 +146,6 @@ WRITE_LINE_MEMBER(mpu4dealem_state::dealem_vsync_changed)
*
*************************************/
-static MC6845_INTERFACE( hd6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(mpu4dealem_state, dealem_vsync_changed), /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static ADDRESS_MAP_START( dealem_memmap, AS_PROGRAM, 8, mpu4dealem_state )
AM_RANGE(0x0000, 0x07ff) AM_RAM AM_SHARE("nvram")
@@ -236,7 +220,10 @@ static MACHINE_CONFIG_START( dealem, mpu4dealem_state )
MCFG_PALETTE_ADD("palette", 32)
MCFG_PALETTE_INIT_OWNER(mpu4dealem_state,dealem)
- MCFG_MC6845_ADD("crtc", HD6845, "screen", MPU4_MASTER_CLOCK / 4 / 8, hd6845_intf) /* HD68B45 */
+ MCFG_MC6845_ADD("crtc", HD6845, "screen", MPU4_MASTER_CLOCK / 4 / 8) /* HD68B45 */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(mpu4dealem_state, dealem_vsync_changed))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/murogem.c b/src/mame/drivers/murogem.c
index 5602bc6c7ae..8078fa06d40 100644
--- a/src/mame/drivers/murogem.c
+++ b/src/mame/drivers/murogem.c
@@ -236,21 +236,6 @@ UINT32 murogem_state::screen_update_murogem(screen_device &screen, bitmap_ind16
return 0;
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
static MACHINE_CONFIG_START( murogem, murogem_state )
/* basic machine hardware */
@@ -271,8 +256,9 @@ static MACHINE_CONFIG_START( murogem, murogem_state )
MCFG_PALETTE_ADD("palette", 0x100)
MCFG_PALETTE_INIT_OWNER(murogem_state, murogem)
-
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 750000, mc6845_intf) /* ? MHz */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 750000) /* ? MHz */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/nyny.c b/src/mame/drivers/nyny.c
index 4abe2a18cf0..580dd33d359 100644
--- a/src/mame/drivers/nyny.c
+++ b/src/mame/drivers/nyny.c
@@ -140,17 +140,11 @@ public:
INTERRUPT_GEN_MEMBER(update_pia_1);
DECLARE_WRITE8_MEMBER(ic48_1_74123_output_changed);
inline void shift_star_generator( );
-};
-
-
-/*************************************
- *
- * Prototypes
- *
- *************************************/
-
-
+ MC6845_BEGIN_UPDATE(crtc_begin_update);
+ MC6845_UPDATE_ROW(crtc_update_row);
+ MC6845_END_UPDATE(crtc_end_update);
+};
/*************************************
@@ -252,31 +246,22 @@ WRITE_LINE_MEMBER(nyny_state::flipscreen_w)
}
-static MC6845_BEGIN_UPDATE( begin_update )
+MC6845_BEGIN_UPDATE( nyny_state::crtc_begin_update )
{
- nyny_state *state = device->machine().driver_data<nyny_state>();
/* create the pens */
- offs_t i;
-
- for (i = 0; i < NUM_PENS; i++)
+ for (offs_t i = 0; i < NUM_PENS; i++)
{
- state->m_pens[i] = rgb_t(pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2));
+ m_pens[i] = rgb_t(pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2));
}
-
- return state->m_pens;
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( nyny_state::crtc_update_row )
{
- nyny_state *state = device->machine().driver_data<nyny_state>();
- UINT8 cx;
- pen_t *pens = (pen_t *)param;
UINT8 x = 0;
- for (cx = 0; cx < x_count; cx++)
+ for (UINT8 cx = 0; cx < x_count; cx++)
{
- int i;
UINT8 data1, data2, color1, color2;
/* the memory is hooked up to the MA, RA lines this way */
@@ -285,19 +270,19 @@ static MC6845_UPDATE_ROW( update_row )
((ra << 5) & 0x00e0) |
((ma << 0) & 0x001f);
- if (state->m_flipscreen)
+ if (m_flipscreen)
offs = offs ^ 0x9fff;
- data1 = state->m_videoram1[offs];
- data2 = state->m_videoram2[offs];
- color1 = state->m_colorram1[offs] & 0x07;
- color2 = state->m_colorram2[offs] & 0x07;
+ data1 = m_videoram1[offs];
+ data2 = m_videoram2[offs];
+ color1 = m_colorram1[offs] & 0x07;
+ color2 = m_colorram2[offs] & 0x07;
- for (i = 0; i < 8; i++)
+ for (int i = 0; i < 8; i++)
{
UINT8 bit1, bit2, color;
- if (state->m_flipscreen)
+ if (m_flipscreen)
{
bit1 = BIT(data1, 7);
bit2 = BIT(data2, 7);
@@ -320,7 +305,7 @@ static MC6845_UPDATE_ROW( update_row )
else
color = bit2 ? color2 : 0;
- bitmap.pix32(y, x) = pens[color];
+ bitmap.pix32(y, x) = m_pens[color];
x += 1;
}
@@ -336,37 +321,29 @@ void nyny_state::shift_star_generator( )
}
-static MC6845_END_UPDATE( end_update )
+MC6845_END_UPDATE( nyny_state::crtc_end_update )
{
- nyny_state *state = device->machine().driver_data<nyny_state>();
-
/* draw the star field into the bitmap */
- int y;
+ UINT16 delay_counter = m_star_delay_counter;
- pen_t *pens = (pen_t *)param;
- UINT16 delay_counter = state->m_star_delay_counter;
-
- for (y = cliprect.min_y; y <= cliprect.max_y; y++)
+ for (int y = cliprect.min_y; y <= cliprect.max_y; y++)
{
- int x;
-
- for (x = cliprect.min_x; x <= cliprect.max_x; x++)
+ for (int x = cliprect.min_x; x <= cliprect.max_x; x++)
{
/* check if the star status */
- if (state->m_star_enable &&
- (bitmap.pix32(y, x) == pens[0]) &&
- ((state->m_star_shift_reg & 0x80ff) == 0x00ff) &&
- (((y & 0x01) ^ state->m_flipscreen) ^ (((x & 0x08) >> 3) ^ state->m_flipscreen)))
+ if (m_star_enable && (bitmap.pix32(y, x) == m_pens[0]) &&
+ ((m_star_shift_reg & 0x80ff) == 0x00ff) &&
+ (((y & 0x01) ^ m_flipscreen) ^ (((x & 0x08) >> 3) ^ m_flipscreen)))
{
- UINT8 color = ((state->m_star_shift_reg & 0x0100) >> 8) | /* R */
- ((state->m_star_shift_reg & 0x0400) >> 9) | /* G */
- ((state->m_star_shift_reg & 0x1000) >> 10); /* B */
+ UINT8 color = ((m_star_shift_reg & 0x0100) >> 8) | /* R */
+ ((m_star_shift_reg & 0x0400) >> 9) | /* G */
+ ((m_star_shift_reg & 0x1000) >> 10); /* B */
- bitmap.pix32(y, x) = pens[color];
+ bitmap.pix32(y, x) = m_pens[color];
}
if (delay_counter == 0)
- state->shift_star_generator();
+ shift_star_generator();
else
delay_counter = delay_counter - 1;
}
@@ -380,23 +357,6 @@ WRITE_LINE_MEMBER(nyny_state::display_enable_changed)
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- begin_update, /* before pixel update callback */
- update_row, /* row update callback */
- end_update, /* after pixel update callback */
- DEVCB_DRIVER_LINE_MEMBER(nyny_state,display_enable_changed), /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-
/*************************************
*
* Audio system - CPU 1
@@ -671,7 +631,13 @@ static MACHINE_CONFIG_START( nyny, nyny_state )
MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(nyny_state, crtc_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(nyny_state, crtc_update_row)
+ MCFG_MC6845_END_UPDATE_CB(nyny_state, crtc_end_update)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(nyny_state, display_enable_changed))
/* 74LS123 */
MCFG_DEVICE_ADD("ic48_1", TTL74123, 0)
diff --git a/src/mame/drivers/othello.c b/src/mame/drivers/othello.c
index 03f2bfdb99a..30367eb2b6b 100644
--- a/src/mame/drivers/othello.c
+++ b/src/mame/drivers/othello.c
@@ -102,22 +102,22 @@ public:
virtual void machine_start();
virtual void machine_reset();
DECLARE_PALETTE_INIT(othello);
+ MC6845_UPDATE_ROW(crtc_update_row);
};
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( othello_state::crtc_update_row )
{
- othello_state *state = device->machine().driver_data<othello_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int cx, x;
UINT32 data_address;
UINT32 tmp;
- const UINT8 *gfx = state->memregion("gfx")->base();
+ const UINT8 *gfx = memregion("gfx")->base();
for(cx = 0; cx < x_count; ++cx)
{
- data_address = ((state->m_videoram[ma + cx] + state->m_tile_bank) << 4) | ra;
+ data_address = ((m_videoram[ma + cx] + m_tile_bank) << 4) | ra;
tmp = gfx[data_address] | (gfx[data_address + 0x2000] << 8) | (gfx[data_address + 0x4000] << 16);
for(x = 0; x < TILE_WIDTH; ++x)
@@ -372,22 +372,6 @@ static INPUT_PORTS_START( othello )
INPUT_PORTS_END
-static MC6845_INTERFACE( h46505_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- TILE_WIDTH, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
void othello_state::machine_start()
{
m_mc6845 = machine().device<mc6845_device>("crtc");
@@ -440,7 +424,10 @@ static MACHINE_CONFIG_START( othello, othello_state )
MCFG_PALETTE_ADD("palette", 0x10)
MCFG_PALETTE_INIT_OWNER(othello_state, othello)
- MCFG_MC6845_ADD("crtc", H46505, "screen", 1000000 /* ? MHz */, h46505_intf) /* H46505 @ CPU clock */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", 1000000 /* ? MHz */) /* H46505 @ CPU clock */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(TILE_WIDTH)
+ MCFG_MC6845_UPDATE_ROW_CB(othello_state, crtc_update_row)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/peplus.c b/src/mame/drivers/peplus.c
index 78f590d784c..643945dd111 100644
--- a/src/mame/drivers/peplus.c
+++ b/src/mame/drivers/peplus.c
@@ -279,6 +279,7 @@ public:
DECLARE_DRIVER_INIT(peplussb);
DECLARE_DRIVER_INIT(peplussbw);
TILE_GET_INFO_MEMBER(get_bg_tile_info);
+ MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr);
virtual void machine_reset();
virtual void video_start();
UINT32 screen_update_peplus(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -302,26 +303,6 @@ static const UINT16 id_023[8] = { 0x4a6c, 0x4a7b, 0x4a4b, 0x4a5a, 0x4a2b, 0x4a0a
#define SOUND_CLOCK ((MASTER_CLOCK)/12)
-/* prototypes */
-
-static MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr);
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(peplus_state,crtc_vsync), /* VSYNC callback */
- crtc_addr /* update address callback */
-};
-
-
/**************
* Memory Copy *
***************/
@@ -377,12 +358,12 @@ WRITE8_MEMBER(peplus_state::peplus_bgcolor_w)
/* ROCKWELL 6545 - Transparent Memory Addressing */
-static MC6845_ON_UPDATE_ADDR_CHANGED(crtc_addr)
+MC6845_ON_UPDATE_ADDR_CHANGED(peplus_state::crtc_addr)
{
- peplus_state *state = device->machine().driver_data<peplus_state>();
- state->m_vid_address = address;
+ m_vid_address = address;
}
+
WRITE8_MEMBER(peplus_state::peplus_crtc_mode_w)
{
/* Reset timing logic */
@@ -1350,9 +1331,13 @@ static MACHINE_CONFIG_START( peplus, peplus_state )
MCFG_PALETTE_ADD("palette", 16*16*2)
MCFG_PALETTE_INIT_OWNER(peplus_state, peplus)
- MCFG_MC6845_ADD("crtc", R6545_1, "screen", MC6845_CLOCK, mc6845_intf)
- MCFG_X2404P_ADD("i2cmem")
+ MCFG_MC6845_ADD("crtc", R6545_1, "screen", MC6845_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_ADDR_CHANGED_CB(peplus_state, crtc_addr)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(peplus_state, crtc_vsync))
+ MCFG_X2404P_ADD("i2cmem")
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/progolf.c b/src/mame/drivers/progolf.c
index ca070f59a16..3e1f3a9ffe5 100644
--- a/src/mame/drivers/progolf.c
+++ b/src/mame/drivers/progolf.c
@@ -378,22 +378,6 @@ static GFXDECODE_START( progolf )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-
-};
-
PALETTE_INIT_MEMBER(progolf_state, progolf)
{
const UINT8 *color_prom = memregion("proms")->base();
@@ -446,7 +430,9 @@ static MACHINE_CONFIG_START( progolf, progolf_state )
MCFG_PALETTE_ADD("palette", 32*3)
MCFG_PALETTE_INIT_OWNER(progolf_state, progolf)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 3000000/4, mc6845_intf) /* hand tuned to get ~57 fps */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 3000000/4) /* hand tuned to get ~57 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/r2dtank.c b/src/mame/drivers/r2dtank.c
index c74182aee7a..7289e3a1692 100644
--- a/src/mame/drivers/r2dtank.c
+++ b/src/mame/drivers/r2dtank.c
@@ -79,6 +79,8 @@ public:
DECLARE_WRITE8_MEMBER(pia_comp_w);
virtual void machine_start();
DECLARE_WRITE8_MEMBER(ttl74123_output_changed);
+ MC6845_BEGIN_UPDATE(crtc_begin_update);
+ MC6845_UPDATE_ROW(crtc_update_row);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
};
@@ -276,32 +278,22 @@ WRITE_LINE_MEMBER(r2dtank_state::flipscreen_w)
}
-static MC6845_BEGIN_UPDATE( begin_update )
+MC6845_BEGIN_UPDATE( r2dtank_state::crtc_begin_update )
{
- r2dtank_state *state = device->machine().driver_data<r2dtank_state>();
/* create the pens */
- offs_t i;
-
- for (i = 0; i < NUM_PENS; i++)
+ for (offs_t i = 0; i < NUM_PENS; i++)
{
- state->m_pens[i] = rgb_t(pal1bit(i >> 2), pal1bit(i >> 1), pal1bit(i >> 0));
+ m_pens[i] = rgb_t(pal1bit(i >> 2), pal1bit(i >> 1), pal1bit(i >> 0));
}
-
- return state->m_pens;
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( r2dtank_state::crtc_update_row )
{
- r2dtank_state *state = device->machine().driver_data<r2dtank_state>();
- UINT8 cx;
-
- pen_t *pens = (pen_t *)param;
UINT8 x = 0;
- for (cx = 0; cx < x_count; cx++)
+ for (UINT8 cx = 0; cx < x_count; cx++)
{
- int i;
UINT8 data, fore_color;
/* the memory is hooked up to the MA, RA lines this way */
@@ -309,17 +301,17 @@ static MC6845_UPDATE_ROW( update_row )
((ra << 5) & 0x00e0) |
((ma << 0) & 0x001f);
- if (state->m_flipscreen)
+ if (m_flipscreen)
offs = offs ^ 0x1fff;
- data = state->m_videoram[offs];
- fore_color = (state->m_colorram[offs] >> 5) & 0x07;
+ data = m_videoram[offs];
+ fore_color = (m_colorram[offs] >> 5) & 0x07;
- for (i = 0; i < 8; i++)
+ for (int i = 0; i < 8; i++)
{
UINT8 bit, color;
- if (state->m_flipscreen)
+ if (m_flipscreen)
{
bit = data & 0x01;
data = data >> 1;
@@ -331,7 +323,7 @@ static MC6845_UPDATE_ROW( update_row )
}
color = bit ? fore_color : 0;
- bitmap.pix32(y, x) = pens[color];
+ bitmap.pix32(y, x) = m_pens[color];
x = x + 1;
}
@@ -347,23 +339,6 @@ WRITE_LINE_MEMBER(r2dtank_state::display_enable_changed)
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- begin_update, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_DRIVER_LINE_MEMBER(r2dtank_state,display_enable_changed), /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-
/*************************************
*
* Memory handlers
@@ -503,7 +478,12 @@ static MACHINE_CONFIG_START( r2dtank, r2dtank_state )
MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(r2dtank_state, crtc_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(r2dtank_state, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(r2dtank_state, display_enable_changed))
/* 74LS123 */
diff --git a/src/mame/drivers/rgum.c b/src/mame/drivers/rgum.c
index eb48db68b63..7e83db4c306 100644
--- a/src/mame/drivers/rgum.c
+++ b/src/mame/drivers/rgum.c
@@ -234,21 +234,6 @@ static GFXDECODE_START( rgum )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
static const ay8910_interface ay8910_config =
{
AY8910_LEGACY_OUTPUT,
@@ -274,7 +259,9 @@ static MACHINE_CONFIG_START( rgum, rgum_state )
MCFG_SCREEN_UPDATE_DRIVER(rgum_state, screen_update_royalgum)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 24000000/16, mc6845_intf) /* unknown clock & type, hand tuned to get ~50 fps (?) */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 24000000/16) /* unknown clock & type, hand tuned to get ~50 fps (?) */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_DEVICE_ADD("ppi8255", I8255A, 0)
MCFG_I8255_IN_PORTA_CB(IOPORT("IN0"))
diff --git a/src/mame/drivers/sanremo.c b/src/mame/drivers/sanremo.c
index 3d1bbc20158..5843ca17b3d 100644
--- a/src/mame/drivers/sanremo.c
+++ b/src/mame/drivers/sanremo.c
@@ -332,35 +332,6 @@ static GFXDECODE_START( sanremo )
GFXDECODE_ENTRY( "gfx", 0, tilelayout, 0, 1 )
GFXDECODE_END
-
-/********************************************
-* CRTC Interface *
-********************************************/
-
-
-static const mc6845_interface mc6845_intf =
-/*
- *** MC6845 init ***
-
- Register: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17
- Value: 0x45 0x30 0x36 0x0A 0x28 0x00 0x26 0x27 0x00 0x07 0x20 0x0B 0x00 0x00 0x00 0x00 0x00 0x00.
-
-*/
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/********************************************
* Sound Interface *
********************************************/
@@ -399,7 +370,13 @@ static MACHINE_CONFIG_START( sanremo, sanremo_state )
MCFG_SCREEN_UPDATE_DRIVER(sanremo_state, screen_update_sanremo)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ // *** MC6845 init ***
+ //
+ // Register: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17
+ // Value: 0x45 0x30 0x36 0x0A 0x28 0x00 0x26 0x27 0x00 0x07 0x20 0x0B 0x00 0x00 0x00 0x00 0x00 0x00.
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", sanremo)
MCFG_PALETTE_ADD("palette", 0x10)
diff --git a/src/mame/drivers/slotcarn.c b/src/mame/drivers/slotcarn.c
index 11683ce3001..d55d2915ad5 100644
--- a/src/mame/drivers/slotcarn.c
+++ b/src/mame/drivers/slotcarn.c
@@ -50,6 +50,8 @@ public:
DECLARE_WRITE8_MEMBER(palette_w);
DECLARE_WRITE_LINE_MEMBER(hsync_changed);
DECLARE_WRITE_LINE_MEMBER(vsync_changed);
+ MC6845_BEGIN_UPDATE(crtc_begin_update);
+ MC6845_UPDATE_ROW(crtc_update_row);
virtual void machine_start();
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
@@ -87,49 +89,40 @@ WRITE8_MEMBER(slotcarn_state::palette_w)
}
-static MC6845_BEGIN_UPDATE( begin_update )
+MC6845_BEGIN_UPDATE( slotcarn_state::crtc_begin_update )
{
- slotcarn_state *state = device->machine().driver_data<slotcarn_state>();
- int i;
int dim, bit0, bit1, bit2;
- for (i=0; i < NUM_PENS; i++)
+ for (int i=0; i < NUM_PENS; i++)
{
dim = BIT(i,3) ? 255 : 127;
bit0 = BIT(i,0);
bit1 = BIT(i,1);
bit2 = BIT(i,2);
- state->m_pens[i] = rgb_t(dim*bit0, dim*bit1, dim*bit2);
+ m_pens[i] = rgb_t(dim*bit0, dim*bit1, dim*bit2);
}
-
- return state->m_pens;
}
-
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( slotcarn_state::crtc_update_row )
{
- slotcarn_state *state = device->machine().driver_data<slotcarn_state>();
int extra_video_bank_bit = 0; // not used?
int lscnblk = 0; // not used?
-
- UINT8 cx;
- pen_t *pens = (pen_t *)param;
UINT8 *gfx[2];
UINT16 x = 0;
int rlen;
- gfx[0] = state->memregion("gfx1")->base();
- gfx[1] = state->memregion("gfx2")->base();
- rlen = state->memregion("gfx2")->bytes();
+ gfx[0] = memregion("gfx1")->base();
+ gfx[1] = memregion("gfx2")->base();
+ rlen = memregion("gfx2")->bytes();
//ma = ma ^ 0x7ff;
- for (cx = 0; cx < x_count; cx++)
+ for (UINT8 cx = 0; cx < x_count; cx++)
{
int i;
- int attr = state->m_ram_attr[ma & 0x7ff];
+ int attr = m_ram_attr[ma & 0x7ff];
int region = (attr & 0x40) >> 6;
- int addr = ((state->m_ram_video[ma & 0x7ff] | ((attr & 0x80) << 1) | (extra_video_bank_bit)) << 4) | (ra & 0x0f);
+ int addr = ((m_ram_video[ma & 0x7ff] | ((attr & 0x80) << 1) | (extra_video_bank_bit)) << 4) | (ra & 0x0f);
int colour = (attr & 0x7f) << 3;
UINT8 *data;
@@ -149,8 +142,8 @@ static MC6845_UPDATE_ROW( update_row )
else
col |= 0x03;
- col = state->m_ram_palette[col & 0x3ff];
- bitmap.pix32(y, x) = pens[col ? col & (NUM_PENS-1) : (lscnblk ? 8 : 0)];
+ col = m_ram_palette[col & 0x3ff];
+ bitmap.pix32(y, x) = m_pens[col ? col & (NUM_PENS-1) : (lscnblk ? 8 : 0)];
x++;
}
@@ -170,22 +163,6 @@ WRITE_LINE_MEMBER(slotcarn_state::vsync_changed)
m_maincpu->set_input_line(0, state ? ASSERT_LINE : CLEAR_LINE);
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- begin_update, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_DRIVER_LINE_MEMBER(slotcarn_state,hsync_changed), /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(slotcarn_state,vsync_changed), /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
/*******************************
* Memory Map *
*******************************/
@@ -596,7 +573,13 @@ static MACHINE_CONFIG_START( slotcarn, slotcarn_state )
MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 512, 0, 512, 256, 0, 256) /* temporary, CRTC will configure screen */
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(slotcarn_state, crtc_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(slotcarn_state, crtc_update_row)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(slotcarn_state, hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(slotcarn_state, vsync_changed))
MCFG_GFXDECODE_ADD("gfxdecode", "palette", slotcarn)
MCFG_PALETTE_ADD("palette", 0x400)
diff --git a/src/mame/drivers/snk6502.c b/src/mame/drivers/snk6502.c
index 472f5bec31f..9001a53cc2a 100644
--- a/src/mame/drivers/snk6502.c
+++ b/src/mame/drivers/snk6502.c
@@ -748,28 +748,6 @@ INTERRUPT_GEN_MEMBER(snk6502_state::snk6502_interrupt)
/*************************************
*
- * 6845 CRTC interface
- *
- *************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-/*************************************
- *
* Machine initialisation
*
*************************************/
@@ -837,7 +815,9 @@ static MACHINE_CONFIG_START( sasuke, snk6502_state )
MCFG_PALETTE_INIT_OWNER(snk6502_state,satansat)
MCFG_VIDEO_START_OVERRIDE(snk6502_state,satansat)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK / 16, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_TIMER_DRIVER_ADD_PERIODIC("sasuke_timer", snk6502_state, sasuke_update_counter, attotime::from_hz(MASTER_CLOCK / 8))
@@ -911,7 +891,9 @@ static MACHINE_CONFIG_START( vanguard, snk6502_state )
MCFG_PALETTE_INIT_OWNER(snk6502_state,snk6502)
MCFG_VIDEO_START_OVERRIDE(snk6502_state,snk6502)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK / 16, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/speedatk.c b/src/mame/drivers/speedatk.c
index d24e2795c5c..5a871816bd6 100644
--- a/src/mame/drivers/speedatk.c
+++ b/src/mame/drivers/speedatk.c
@@ -285,21 +285,6 @@ static GFXDECODE_START( speedatk )
GFXDECODE_ENTRY( "gfx2", 0, charlayout_3bpp, 0, 32 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
WRITE8_MEMBER(speedatk_state::speedatk_output_w)
{
m_flip_scr = data & 0x80;
@@ -336,7 +321,9 @@ static MACHINE_CONFIG_START( speedatk, speedatk_state )
MCFG_SCREEN_UPDATE_DRIVER(speedatk_state, screen_update_speedatk)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", H46505, "screen", MASTER_CLOCK/16, mc6845_intf) /* hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", MASTER_CLOCK/16) /* hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", speedatk)
MCFG_PALETTE_ADD("palette", 0x100)
diff --git a/src/mame/drivers/spiders.c b/src/mame/drivers/spiders.c
index 36ecdff41fc..9df460c2ac5 100644
--- a/src/mame/drivers/spiders.c
+++ b/src/mame/drivers/spiders.c
@@ -321,32 +321,22 @@ WRITE_LINE_MEMBER(spiders_state::flipscreen_w)
}
-static MC6845_BEGIN_UPDATE( begin_update )
+MC6845_BEGIN_UPDATE( spiders_state::crtc_begin_update )
{
- spiders_state *state = device->machine().driver_data<spiders_state>();
/* create the pens */
- offs_t i;
-
- for (i = 0; i < NUM_PENS; i++)
+ for (offs_t i = 0; i < NUM_PENS; i++)
{
- state->m_pens[i] = rgb_t(pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2));
+ m_pens[i] = rgb_t(pal1bit(i >> 0), pal1bit(i >> 1), pal1bit(i >> 2));
}
-
- return state->m_pens;
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( spiders_state::crtc_update_row )
{
- spiders_state *state = device->machine().driver_data<spiders_state>();
- UINT8 cx;
-
- pen_t *pens = (pen_t *)param;
UINT8 x = 0;
- for (cx = 0; cx < x_count; cx++)
+ for (UINT8 cx = 0; cx < x_count; cx++)
{
- int i;
UINT8 data1, data2, data3;
/* the memory is hooked up to the MA, RA lines this way */
@@ -354,18 +344,18 @@ static MC6845_UPDATE_ROW( update_row )
((ra << 5) & 0x00e0) |
((ma << 0) & 0x001f);
- if (state->m_flipscreen)
+ if (m_flipscreen)
offs = offs ^ 0x3fff;
- data1 = state->m_ram[0x0000 | offs];
- data2 = state->m_ram[0x4000 | offs];
- data3 = state->m_ram[0x8000 | offs];
+ data1 = m_ram[0x0000 | offs];
+ data2 = m_ram[0x4000 | offs];
+ data3 = m_ram[0x8000 | offs];
- for (i = 0; i < 8; i++)
+ for (int i = 0; i < 8; i++)
{
UINT8 color;
- if (state->m_flipscreen)
+ if (m_flipscreen)
{
color = ((data3 & 0x80) >> 5) |
((data2 & 0x80) >> 6) |
@@ -386,7 +376,7 @@ static MC6845_UPDATE_ROW( update_row )
data3 = data3 >> 1;
}
- bitmap.pix32(y, x) = pens[color];
+ bitmap.pix32(y, x) = m_pens[color];
x = x + 1;
}
@@ -402,23 +392,6 @@ WRITE_LINE_MEMBER(spiders_state::display_enable_changed)
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- begin_update, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_DRIVER_LINE_MEMBER(spiders_state,display_enable_changed), /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-
/*************************************
*
* Graphics ROM access - see the
@@ -603,7 +576,12 @@ static MACHINE_CONFIG_START( spiders, spiders_state )
MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 256, 0, 256, 256, 0, 256) /* temporary, CRTC will configure screen */
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(spiders_state, crtc_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(spiders_state, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(spiders_state, display_enable_changed))
/* 74LS123 */
diff --git a/src/mame/drivers/ssingles.c b/src/mame/drivers/ssingles.c
index bc8072b5393..e4c1a8a67c9 100644
--- a/src/mame/drivers/ssingles.c
+++ b/src/mame/drivers/ssingles.c
@@ -175,6 +175,8 @@ public:
DECLARE_DRIVER_INIT(ssingles);
virtual void video_start();
INTERRUPT_GEN_MEMBER(atamanot_irq);
+ MC6845_UPDATE_ROW(ssingles_update_row);
+ MC6845_UPDATE_ROW(atamanot_update_row);
required_device<cpu_device> m_maincpu;
};
@@ -191,114 +193,79 @@ static const UINT8 ssingles_colors[NUM_PENS*3]=
0x00,0x00,0x00, 0xff,0x00,0xff, 0x80,0x00,0x80, 0x40,0x00,0x40
};
-static MC6845_UPDATE_ROW( ssingles_update_row )
+MC6845_UPDATE_ROW( ssingles_state::ssingles_update_row )
{
- ssingles_state *state = device->machine().driver_data<ssingles_state>();
- int cx,x;
UINT32 tile_address;
- UINT16 cell,palette;
- UINT8 b0,b1;
- const UINT8 *gfx = state->memregion("gfx1")->base();
+ UINT16 cell, palette;
+ UINT8 b0, b1;
+ const UINT8 *gfx = memregion("gfx1")->base();
- for(cx=0;cx<x_count;++cx)
+ for (int cx = 0; cx < x_count; ++cx)
{
- int address=((ma>>1)+(cx>>1))&0xff;
+ int address = ((ma >> 1) + (cx >> 1)) & 0xff;
- cell=state->m_videoram[address]+(state->m_colorram[address]<<8);
+ cell = m_videoram[address] + (m_colorram[address] << 8);
- tile_address=((cell&0x3ff)<<4)+ra;
- palette=(cell>>10)&0x1c;
+ tile_address = ((cell & 0x3ff) << 4) + ra;
+ palette = (cell >> 10) & 0x1c;
- if(cx&1)
+ if (cx & 1)
{
- b0=gfx[tile_address+0x0000]; /* 9.bin */
- b1=gfx[tile_address+0x8000]; /* 11.bin */
+ b0 = gfx[tile_address + 0x0000]; /* 9.bin */
+ b1 = gfx[tile_address + 0x8000]; /* 11.bin */
}
else
{
- b0=gfx[tile_address+0x4000]; /* 10.bin */
- b1=gfx[tile_address+0xc000]; /* 12.bin */
+ b0 = gfx[tile_address + 0x4000]; /* 10.bin */
+ b1 = gfx[tile_address + 0xc000]; /* 12.bin */
}
- for(x=7;x>=0;--x)
+ for (int x = 7; x >= 0; --x)
{
- bitmap.pix32(y, (cx<<3)|(x)) = state->m_pens[palette+((b1&1)|((b0&1)<<1))];
- b0>>=1;
- b1>>=1;
+ bitmap.pix32(y, (cx << 3) | x) = m_pens[palette + ((b1 & 1) | ((b0 & 1) << 1))];
+ b0 >>= 1;
+ b1 >>= 1;
}
}
}
-static MC6845_UPDATE_ROW( atamanot_update_row )
+MC6845_UPDATE_ROW( ssingles_state::atamanot_update_row )
{
- ssingles_state *state = device->machine().driver_data<ssingles_state>();
- int cx,x;
UINT32 tile_address;
- UINT16 cell,palette;
- UINT8 b0,b1;
- const UINT8 *gfx = state->memregion("gfx1")->base();
+ UINT16 cell, palette;
+ UINT8 b0, b1;
+ const UINT8 *gfx = memregion("gfx1")->base();
- for(cx=0;cx<x_count;++cx)
+ for (int cx = 0; cx < x_count; ++cx)
{
- int address=((ma>>1)+(cx>>1))&0xff;
+ int address = ((ma >> 1) + (cx >> 1)) & 0xff;
- cell=state->m_videoram[address]+(state->m_colorram[address]<<8);
+ cell = m_videoram[address] + (m_colorram[address] << 8);
- tile_address=((cell&0x1ff)<<4)+ra;
- palette=(cell>>10)&0x1c;
+ tile_address = ((cell & 0x1ff) << 4) + ra;
+ palette = (cell >> 10) & 0x1c;
- if(cx&1)
+ if (cx & 1)
{
- b0=gfx[tile_address+0x0000]; /* 9.bin */
- b1=gfx[tile_address+0x4000]; /* 11.bin */
+ b0 = gfx[tile_address + 0x0000]; /* 9.bin */
+ b1 = gfx[tile_address + 0x4000]; /* 11.bin */
}
else
{
- b0=gfx[tile_address+0x2000]; /* 10.bin */
- b1=gfx[tile_address+0x6000]; /* 12.bin */
+ b0 = gfx[tile_address + 0x2000]; /* 10.bin */
+ b1 = gfx[tile_address + 0x6000]; /* 12.bin */
}
- for(x=7;x>=0;--x)
+ for (int x = 7; x >= 0; --x)
{
- bitmap.pix32(y, (cx<<3)|(x)) = state->m_pens[palette+((b1&1)|((b0&1)<<1))];
- b0>>=1;
- b1>>=1;
+ bitmap.pix32(y, (cx << 3) | x) = m_pens[palette + ((b1 & 1) | ((b0 & 1) << 1))];
+ b0 >>= 1;
+ b1 >>= 1;
}
}
}
-static MC6845_INTERFACE( ssingles_mc6845_intf )
-{
- false,
- 0,0,0,0,
- 8,
- NULL, /* before pixel update callback */
- ssingles_update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-static MC6845_INTERFACE( atamanot_mc6845_intf )
-{
- false,
- 0,0,0,0,
- 8,
- NULL, /* before pixel update callback */
- atamanot_update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
WRITE8_MEMBER(ssingles_state::ssingles_videoram_w)
{
UINT8 *vram = memregion("vram")->base();
@@ -579,8 +546,10 @@ static MACHINE_CONFIG_START( ssingles, ssingles_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", ssingles)
-
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 1000000 /* ? MHz */, ssingles_mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 1000000 /* ? MHz */)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(ssingles_state, ssingles_update_row)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -606,7 +575,10 @@ static MACHINE_CONFIG_DERIVED( atamanot, ssingles )
MCFG_DEVICE_REMOVE("crtc")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 1000000 /* ? MHz */, atamanot_mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 1000000 /* ? MHz */)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(ssingles_state, atamanot_update_row)
MCFG_GFXDECODE_MODIFY("gfxdecode", atamanot)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/supercrd.c b/src/mame/drivers/supercrd.c
index d8e7b59f3da..a50ba81898c 100644
--- a/src/mame/drivers/supercrd.c
+++ b/src/mame/drivers/supercrd.c
@@ -404,26 +404,6 @@ static GFXDECODE_START( supercrd ) /* Adressing the first half of the palette *
GFXDECODE_END
-/************************
-* CRTC Interface *
-************************/
-
-//static MC6845_INTERFACE( mc6845_intf )
-//{
-// false,
-// 0,0,0,0, /* visarea adjustment */
-// 4, /* number of pixels per video memory address */
-// NULL, /* before pixel update callback */
-// NULL, /* row update callback */
-// NULL, /* after pixel update callback */
-// DEVCB_NULL, /* callback for display state changes */
-// DEVCB_NULL, /* callback for cursor state changes */
-// DEVCB_NULL, /* HSYNC callback */
-// DEVCB_NULL, /* VSYNC callback */
-// NULL /* update address callback */
-//};
-
-
/**************************
* Machine Drivers *
**************************/
@@ -454,7 +434,9 @@ static MACHINE_CONFIG_START( supercrd, supercrd_state )
MCFG_PALETTE_INIT_OWNER(supercrd_state, supercrd)
MCFG_VIDEO_START_OVERRIDE(supercrd_state, supercrd)
-// MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/8, mc6845_intf)
+// MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/8)
+// MCFG_MC6845_SHOW_BORDER_AREA(false)
+// MCFG_MC6845_CHAR_WIDTH(4)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/tapatune.c b/src/mame/drivers/tapatune.c
index 41e5c145aa9..26e91cd0c08 100644
--- a/src/mame/drivers/tapatune.c
+++ b/src/mame/drivers/tapatune.c
@@ -98,6 +98,9 @@ public:
DECLARE_WRITE8_MEMBER(bsmt_data_hi_w);
DECLARE_WRITE8_MEMBER(bsmt_reg_w);
DECLARE_READ8_MEMBER(special_r);
+
+ MC6845_BEGIN_UPDATE(crtc_begin_update);
+ MC6845_UPDATE_ROW(crtc_update_row);
};
@@ -140,50 +143,36 @@ void tapatune_state::machine_reset()
*
*************************************/
-const rgb_t* get_pens(tapatune_state *state)
+MC6845_BEGIN_UPDATE( tapatune_state::crtc_begin_update )
{
+ // Create the pens
for (UINT32 i = 0; i < 0x100; i++)
{
- int r = state->m_paletteram[3 * i + 0];
- int g = state->m_paletteram[3 * i + 1];
- int b = state->m_paletteram[3 * i + 2];
-
+ int r = m_paletteram[3 * i + 0];
+ int g = m_paletteram[3 * i + 1];
+ int b = m_paletteram[3 * i + 2];
+
r = pal6bit(r);
g = pal6bit(g);
b = pal6bit(b);
-
- state->m_pens[i] = rgb_t(r, g, b);
+
+ m_pens[i] = rgb_t(r, g, b);
}
-
- return state->m_pens;
-}
-
-
-static MC6845_BEGIN_UPDATE( begin_update )
-{
- tapatune_state *state = device->machine().driver_data<tapatune_state>();
-
- // Create the pens
- get_pens(state);
-
- return state->m_pens;
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( tapatune_state::crtc_update_row )
{
- tapatune_state *state = device->machine().driver_data<tapatune_state>();
UINT32 *dest = &bitmap.pix32(y);
- rgb_t *pens = (rgb_t *)param;
offs_t offs = (ma*2 + ra*0x40)*4;
- UINT8 *videoram = reinterpret_cast<UINT8 *>(state->m_videoram.target());
+ UINT8 *videoram = reinterpret_cast<UINT8 *>(m_videoram.target());
for (UINT32 x = 0; x < x_count*4; x++)
{
UINT8 pix = videoram[BYTE_XOR_BE(offs + x)];
- dest[2*x] = pens[((pix >> 4) & 0x0f)];
- dest[2*x + 1] = pens[(pix & 0x0f)];
+ dest[2*x] = m_pens[((pix >> 4) & 0x0f)];
+ dest[2*x + 1] = m_pens[(pix & 0x0f)];
}
}
@@ -507,28 +496,6 @@ INPUT_PORTS_END
/*************************************
*
- * 6845 interface
- *
- *************************************/
-
-static MC6845_INTERFACE( h46505_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 5, /* number of pixels per video memory address */
- begin_update,/* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(tapatune_state,crtc_vsync), /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-/*************************************
- *
* Machine driver
*
*************************************/
@@ -546,7 +513,14 @@ static MACHINE_CONFIG_START( tapatune, tapatune_state )
MCFG_QUANTUM_PERFECT_CPU("maincpu")
MCFG_NVRAM_ADD_0FILL("nvram")
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_24MHz / 16, h46505_intf)
+
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_24MHz / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(5)
+ MCFG_MC6845_BEGIN_UPDATE_CB(tapatune_state, crtc_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(tapatune_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(tapatune_state, crtc_vsync))
+
MCFG_TICKET_DISPENSER_ADD("ticket", attotime::from_msec(100), TICKET_MOTOR_ACTIVE_LOW, TICKET_STATUS_ACTIVE_LOW)
/* video hardware */
diff --git a/src/mame/drivers/tmspoker.c b/src/mame/drivers/tmspoker.c
index 885df998e85..4bfd4485867 100644
--- a/src/mame/drivers/tmspoker.c
+++ b/src/mame/drivers/tmspoker.c
@@ -545,25 +545,6 @@ static GFXDECODE_START( tmspoker )
GFXDECODE_END
-/***********************
-* CRTC Interface *
-************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
/*************************
* Machine Drivers *
*************************/
@@ -588,7 +569,9 @@ static MACHINE_CONFIG_START( tmspoker, tmspoker_state )
MCFG_PALETTE_ADD("palette", 256)
MCFG_PALETTE_INIT_OWNER(tmspoker_state, tmspoker)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/4, mc6845_intf) /* guess */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK/4) /* guess */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/truco.c b/src/mame/drivers/truco.c
index 774387e2930..f4db5d43691 100644
--- a/src/mame/drivers/truco.c
+++ b/src/mame/drivers/truco.c
@@ -406,26 +406,6 @@ INTERRUPT_GEN_MEMBER(truco_state::truco_interrupt)
/*******************************************
-* CRTC Interface *
-*******************************************/
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 4, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-/*******************************************
* Machine Driver *
*******************************************/
@@ -458,7 +438,9 @@ static MACHINE_CONFIG_START( truco, truco_state )
MCFG_PALETTE_ADD("palette", 16)
MCFG_PALETTE_INIT_OWNER(truco_state, truco)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK, mc6845_intf) /* Identified as UM6845 */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", CRTC_CLOCK) /* Identified as UM6845 */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(4)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/twincobr.c b/src/mame/drivers/twincobr.c
index c2b7b66cb39..21c05b9af2d 100644
--- a/src/mame/drivers/twincobr.c
+++ b/src/mame/drivers/twincobr.c
@@ -677,7 +677,9 @@ static MACHINE_CONFIG_START( twincobr, twincobr_state )
MCFG_MACHINE_RESET_OVERRIDE(twincobr_state,twincobr)
/* video hardware */
- MCFG_MC6845_ADD("crtc", HD6845, "screen", XTAL_28MHz/8, twincobr_mc6845_intf) /* 3.5MHz measured on CLKin */
+ MCFG_MC6845_ADD("crtc", HD6845, "screen", XTAL_28MHz/8) /* 3.5MHz measured on CLKin */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(2)
MCFG_TOAPLAN_SCU_ADD("scu", "palette", 31, 15)
diff --git a/src/mame/drivers/usgames.c b/src/mame/drivers/usgames.c
index 5352fe7eae5..264a5cce32d 100644
--- a/src/mame/drivers/usgames.c
+++ b/src/mame/drivers/usgames.c
@@ -212,22 +212,6 @@ static GFXDECODE_START( usgames )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static MACHINE_CONFIG_START( usg32, usgames_state )
/* basic machine hardware */
@@ -250,7 +234,9 @@ static MACHINE_CONFIG_START( usg32, usgames_state )
MCFG_PALETTE_ADD("palette", 2*256)
MCFG_PALETTE_INIT_OWNER(usgames_state, usgames)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_18MHz / 16, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_18MHz / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/vcombat.c b/src/mame/drivers/vcombat.c
index b1a82d5fa87..a156dc2715f 100644
--- a/src/mame/drivers/vcombat.c
+++ b/src/mame/drivers/vcombat.c
@@ -575,22 +575,6 @@ WRITE_LINE_MEMBER(vcombat_state::sound_update)
m_soundcpu->set_input_line(M68K_IRQ_1, state ? ASSERT_LINE : CLEAR_LINE);
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 16, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_DRIVER_LINE_MEMBER(vcombat_state,sound_update), /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static MACHINE_CONFIG_START( vcombat, vcombat_state )
MCFG_CPU_ADD("maincpu", M68000, XTAL_12MHz)
MCFG_CPU_PROGRAM_MAP(main_map)
@@ -621,7 +605,7 @@ static MACHINE_CONFIG_START( vcombat, vcombat_state )
MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
/* Disabled for now as it can't handle multiple screens */
-// MCFG_MC6845_ADD("crtc", MC6845, "screen", 6000000 / 16, mc6845_intf)
+// MCFG_MC6845_ADD("crtc", MC6845, "screen", 6000000 / 16)
MCFG_DEFAULT_LAYOUT(layout_dualhsxs)
MCFG_SCREEN_ADD("screen", RASTER)
@@ -657,7 +641,10 @@ static MACHINE_CONFIG_START( shadfgtr, vcombat_state )
MCFG_TLC34076_ADD("tlc34076", TLC34076_6_BIT)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_20MHz / 4 / 16, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_20MHz / 4 / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(vcombat_state, sound_update))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_20MHz / 4, 320, 0, 256, 277, 0, 224)
diff --git a/src/mame/drivers/vlc.c b/src/mame/drivers/vlc.c
index 5d678ca0d09..070f5c97dec 100644
--- a/src/mame/drivers/vlc.c
+++ b/src/mame/drivers/vlc.c
@@ -235,21 +235,6 @@ static const UINT8 pal35[256] = {
/******************** VIDEO SECTION ************************************/
/***************************************************************************/
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
static const gfx_layout charlayout =
{
/* Todo , just for sample */
@@ -627,7 +612,9 @@ static MACHINE_CONFIG_START( nevada, nevada_state )
MCFG_PALETTE_ADD("palette", 256)
MCFG_PALETTE_INIT_OWNER(nevada_state, nevada)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MC6845_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MC6845_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/drivers/wardner.c b/src/mame/drivers/wardner.c
index 2efed984aa5..4e681bf541d 100644
--- a/src/mame/drivers/wardner.c
+++ b/src/mame/drivers/wardner.c
@@ -394,7 +394,9 @@ static MACHINE_CONFIG_START( wardner, wardner_state )
MCFG_QUANTUM_TIME(attotime::from_hz(6000)) /* 100 CPU slices per frame */
/* video hardware */
- MCFG_MC6845_ADD("crtc", HD6845, "screen", XTAL_14MHz/4, twincobr_mc6845_intf) /* 3.5MHz measured on CLKin */
+ MCFG_MC6845_ADD("crtc", HD6845, "screen", XTAL_14MHz/4) /* 3.5MHz measured on CLKin */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(2)
MCFG_TOAPLAN_SCU_ADD("scu", "palette", 32, 14)
diff --git a/src/mame/includes/qix.h b/src/mame/includes/qix.h
index 47aee496e10..c8779cc3834 100644
--- a/src/mame/includes/qix.h
+++ b/src/mame/includes/qix.h
@@ -136,6 +136,8 @@ public:
DECLARE_WRITE8_MEMBER(slither_coinctl_w);
DECLARE_WRITE_LINE_MEMBER(qix_pia_dint);
DECLARE_WRITE_LINE_MEMBER(qix_pia_sint);
+ MC6845_BEGIN_UPDATE(crtc_begin_update);
+ MC6845_UPDATE_ROW(crtc_update_row);
void set_pen(int offs);
int kram3_permut1(int idx, int value);
int kram3_permut2(int tbl_index, int idx, const UINT8 *xor_table);
diff --git a/src/mame/includes/spiders.h b/src/mame/includes/spiders.h
index 26636daad07..592fcec4b84 100644
--- a/src/mame/includes/spiders.h
+++ b/src/mame/includes/spiders.h
@@ -4,6 +4,7 @@
***************************************************************************/
#include "sound/discrete.h"
+#include "video/mc6845.h"
#define NUM_PENS (8)
@@ -39,6 +40,8 @@ public:
DECLARE_WRITE8_MEMBER(spiders_audio_a_w);
DECLARE_WRITE8_MEMBER(spiders_audio_b_w);
DECLARE_WRITE8_MEMBER(spiders_audio_ctrl_w);
+ MC6845_BEGIN_UPDATE(crtc_begin_update);
+ MC6845_UPDATE_ROW(crtc_update_row);
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
};
diff --git a/src/mame/includes/twincobr.h b/src/mame/includes/twincobr.h
index 4e76b54d907..085612aaca2 100644
--- a/src/mame/includes/twincobr.h
+++ b/src/mame/includes/twincobr.h
@@ -128,5 +128,3 @@ public:
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
};
-
-extern const mc6845_interface twincobr_mc6845_intf;
diff --git a/src/mame/video/decodmd2.c b/src/mame/video/decodmd2.c
index ca2ba7a20de..b10eaf52229 100644
--- a/src/mame/video/decodmd2.c
+++ b/src/mame/video/decodmd2.c
@@ -97,39 +97,23 @@ TIMER_DEVICE_CALLBACK_MEMBER(decodmd_type2_device::dmd_firq)
m_cpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
-MC6845_UPDATE_ROW( dmd_update_row )
+MC6845_UPDATE_ROW( decodmd_type2_device::crtc_update_row )
{
- decodmd_type2_device *state = downcast<decodmd_type2_device *>(device->owner());
- UINT8* RAM = state->m_ram->pointer();
- UINT8 x,dot,intensity;
+ UINT8 *RAM = m_ram->pointer();
+ UINT8 intensity;
UINT16 addr = (ma & 0xfc00) + ((ma & 0x100)<<2) + (ra << 4);
- for(x=0;x<128;x+=8)
+ for (int x = 0; x < 128; x += 8)
{
- for(dot=0;dot<8;dot++)
+ for (int dot = 0; dot < 8; dot++)
{
- intensity = ((RAM[addr] >> (7-dot) & 0x01) << 1) | (RAM[addr+0x200] >> (7-dot) & 0x01);
- bitmap.pix32(y,x+dot) = rgb_t(0x3f*intensity,0x2a*intensity,0x00);
+ intensity = ((RAM[addr] >> (7-dot) & 0x01) << 1) | (RAM[addr + 0x200] >> (7-dot) & 0x01);
+ bitmap.pix32(y, x + dot) = rgb_t(0x3f * intensity, 0x2a * intensity, 0x00);
}
addr++;
}
}
-MC6845_INTERFACE( decodmd2_6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* begin_update */
- dmd_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_NULL, /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_NULL, /* on_hsync_changed */
- DEVCB_NULL, /* on_vsync_changed */
- NULL
-};
-
static ADDRESS_MAP_START( decodmd2_map, AS_PROGRAM, 8, decodmd_type2_device )
AM_RANGE(0x0000, 0x2fff) AM_RAMBANK("dmdram")
AM_RANGE(0x3000, 0x3000) AM_READWRITE(crtc_status_r,crtc_address_w)
@@ -149,7 +133,10 @@ static MACHINE_CONFIG_FRAGMENT( decodmd2 )
MCFG_TIMER_DRIVER_ADD_PERIODIC("firq_timer",decodmd_type2_device,dmd_firq,attotime::from_hz(80))
- MCFG_MC6845_ADD("dmd6845",MC6845,NULL,XTAL_8MHz / 8,decodmd2_6845_intf) // TODO: confirm clock speed
+ MCFG_MC6845_ADD("dmd6845", MC6845, NULL, XTAL_8MHz / 8) // TODO: confirm clock speed
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(decodmd_type2_device, crtc_update_row)
MCFG_DEFAULT_LAYOUT(layout_lcd)
diff --git a/src/mame/video/decodmd2.h b/src/mame/video/decodmd2.h
index 57c96888c31..9855fa3041d 100644
--- a/src/mame/video/decodmd2.h
+++ b/src/mame/video/decodmd2.h
@@ -42,6 +42,7 @@ public:
DECLARE_READ8_MEMBER(status_r);
DECLARE_WRITE8_MEMBER(status_w);
TIMER_DEVICE_CALLBACK_MEMBER(dmd_firq);
+ MC6845_UPDATE_ROW(crtc_update_row);
static void static_set_gfxregion(device_t &device, const char *tag);
diff --git a/src/mame/video/decodmd3.c b/src/mame/video/decodmd3.c
index e02ad9f4939..b4133ae8da3 100644
--- a/src/mame/video/decodmd3.c
+++ b/src/mame/video/decodmd3.c
@@ -95,45 +95,29 @@ WRITE16_MEMBER( decodmd_type3_device::crtc_register_w )
}
}
-MC6845_UPDATE_ROW( dmd64_update_row )
+MC6845_UPDATE_ROW( decodmd_type3_device::crtc_update_row )
{
- decodmd_type3_device *state = downcast<decodmd_type3_device *>(device->owner());
- UINT8* RAM = state->m_ram->pointer();
- UINT8 x,dot,intensity;
+ UINT8 *RAM = m_ram->pointer();
+ UINT8 intensity;
UINT16 addr = ((ma & 0x7ff) << 2) | ((ra & 0x02) << 12);
addr += ((ra & 0x01) * 24);
- for(x=0;x<192;x+=16)
+ for (int x = 0; x < 192; x += 16)
{
- for(dot=0;dot<8;dot++)
+ for (int dot = 0; dot < 8; dot++)
{
- intensity = ((RAM[addr+1] >> (7-dot) & 0x01) << 1) | (RAM[addr+0x801] >> (7-dot) & 0x01);
- bitmap.pix32(y,x+dot) = rgb_t(0x3f*intensity,0x2a*intensity,0x00);
+ intensity = ((RAM[addr + 1] >> (7-dot) & 0x01) << 1) | (RAM[addr + 0x801] >> (7-dot) & 0x01);
+ bitmap.pix32(y, x + dot) = rgb_t(0x3f * intensity, 0x2a * intensity, 0x00);
}
- for(dot=8;dot<16;dot++)
+ for (int dot = 8; dot < 16; dot++)
{
- intensity = ((RAM[addr] >> (15-dot) & 0x01) << 1) | (RAM[addr+0x800] >> (15-dot) & 0x01);
- bitmap.pix32(y,x+dot) = rgb_t(0x3f*intensity,0x2a*intensity,0x00);
+ intensity = ((RAM[addr] >> (15-dot) & 0x01) << 1) | (RAM[addr + 0x800] >> (15-dot) & 0x01);
+ bitmap.pix32(y, x + dot) = rgb_t(0x3f * intensity, 0x2a * intensity, 0x00);
}
- addr+=2;
+ addr += 2;
}
}
-MC6845_INTERFACE( decodmd3_6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 16, /* number of pixels per video memory address */
- NULL, /* begin_update */
- dmd64_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_NULL, /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_NULL, /* on_hsync_changed */
- DEVCB_NULL, /* on_vsync_changed */
- NULL
-};
-
static ADDRESS_MAP_START( decodmd3_map, AS_PROGRAM, 16, decodmd_type3_device )
AM_RANGE(0x00000000, 0x000fffff) AM_ROMBANK("dmdrom")
AM_RANGE(0x00800000, 0x0080ffff) AM_RAMBANK("dmdram")
@@ -151,7 +135,10 @@ static MACHINE_CONFIG_FRAGMENT( decodmd3 )
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer",decodmd_type3_device,dmd_irq,attotime::from_hz(150))
- MCFG_MC6845_ADD("dmd6845",MC6845,NULL,XTAL_12MHz / 4,decodmd3_6845_intf) // TODO: confirm clock speed
+ MCFG_MC6845_ADD("dmd6845", MC6845, NULL, XTAL_12MHz / 4) // TODO: confirm clock speed
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16)
+ MCFG_MC6845_UPDATE_ROW_CB(decodmd_type3_device, crtc_update_row)
MCFG_DEFAULT_LAYOUT(layout_lcd)
@@ -163,7 +150,6 @@ static MACHINE_CONFIG_FRAGMENT( decodmd3 )
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("64K")
-
MACHINE_CONFIG_END
machine_config_constructor decodmd_type3_device::device_mconfig_additions() const
diff --git a/src/mame/video/decodmd3.h b/src/mame/video/decodmd3.h
index 9cbb1cdf4e5..e2085c2a2ab 100644
--- a/src/mame/video/decodmd3.h
+++ b/src/mame/video/decodmd3.h
@@ -34,6 +34,7 @@ public:
DECLARE_WRITE16_MEMBER(crtc_register_w);
DECLARE_READ16_MEMBER(crtc_status_r);
TIMER_DEVICE_CALLBACK_MEMBER(dmd_irq);
+ MC6845_UPDATE_ROW(crtc_update_row);
static void static_set_gfxregion(device_t &device, const char *tag);
diff --git a/src/mame/video/madalien.c b/src/mame/video/madalien.c
index a21008ba65b..05e8d6245f3 100644
--- a/src/mame/video/madalien.c
+++ b/src/mame/video/madalien.c
@@ -365,22 +365,6 @@ static GFXDECODE_START( madalien )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
MACHINE_CONFIG_FRAGMENT( madalien_video )
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, 336, 0, 256, 288, 0, 256)
@@ -393,5 +377,7 @@ MACHINE_CONFIG_FRAGMENT( madalien_video )
MCFG_PALETTE_INIT_OWNER(madalien_state,madalien)
MCFG_VIDEO_START_OVERRIDE(madalien_state,madalien)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", PIXEL_CLOCK / 8, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", PIXEL_CLOCK / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MACHINE_CONFIG_END
diff --git a/src/mame/video/qix.c b/src/mame/video/qix.c
index 9e53365b73e..88cb3a109ab 100644
--- a/src/mame/video/qix.c
+++ b/src/mame/video/qix.c
@@ -12,19 +12,6 @@
#include "cpu/m6809/m6809.h"
-
-/*************************************
- *
- * Static function prototypes
- *
- *************************************/
-
-static MC6845_BEGIN_UPDATE( begin_update );
-static MC6845_UPDATE_ROW( update_row );
-
-
-
-
/*************************************
*
* Start
@@ -272,37 +259,29 @@ void qix_state::set_pen(int offs)
*
*************************************/
-static MC6845_BEGIN_UPDATE( begin_update )
+MC6845_BEGIN_UPDATE( qix_state::crtc_begin_update )
{
- qix_state *state = device->machine().driver_data<qix_state>();
-
#if 0
// note the confusing bit order!
popmessage("self test leds: %d%d %d%d%d%d",BIT(leds,7),BIT(leds,5),BIT(leds,6),BIT(leds,4),BIT(leds,2),BIT(leds,3));
#endif
-
- return &(state->m_pens)[state->m_palette_bank << 8];
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( qix_state::crtc_update_row )
{
- qix_state *state = device->machine().driver_data<qix_state>();
UINT32 *dest = &bitmap.pix32(y);
- UINT16 x;
-
- pen_t *pens = (pen_t *)param;
+ pen_t *pens = &m_pens[m_palette_bank << 8];
/* the memory is hooked up to the MA, RA lines this way */
offs_t offs = ((ma << 6) & 0xf800) | ((ra << 8) & 0x0700);
- offs_t offs_xor = state->m_flip ? 0xffff : 0;
+ offs_t offs_xor = m_flip ? 0xffff : 0;
- for (x = 0; x < x_count * 8; x++)
- dest[x] = pens[state->m_videoram[(offs + x) ^ offs_xor]];
+ for (UINT16 x = 0; x < x_count * 8; x++)
+ dest[x] = pens[m_videoram[(offs + x) ^ offs_xor]];
}
-
/*************************************
*
* Memory handlers
@@ -387,29 +366,19 @@ ADDRESS_MAP_END
*
*************************************/
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- begin_update, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_DRIVER_LINE_MEMBER(qix_state,display_enable_changed), /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_DRIVER_LINE_MEMBER(qix_state,qix_vsync_changed), /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
MACHINE_CONFIG_FRAGMENT( qix_video )
MCFG_CPU_ADD("videocpu", M6809, MAIN_CLOCK_OSC/4/4) /* 1.25 MHz */
MCFG_CPU_PROGRAM_MAP(qix_video_map)
MCFG_VIDEO_START_OVERRIDE(qix_state,qix)
- MCFG_MC6845_ADD("vid_u18", MC6845, "screen", QIX_CHARACTER_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("vid_u18", MC6845, "screen", QIX_CHARACTER_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(qix_state, crtc_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(qix_state, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(qix_state, display_enable_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(qix_state, qix_vsync_changed))
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(QIX_CHARACTER_CLOCK*8, 0x148, 0, 0x100, 0x111, 0, 0x100) /* from CRTC */
diff --git a/src/mame/video/twincobr.c b/src/mame/video/twincobr.c
index 6999a0d7dbc..fa34c615f1c 100644
--- a/src/mame/video/twincobr.c
+++ b/src/mame/video/twincobr.c
@@ -16,25 +16,6 @@
#include "video/mc6845.h"
#include "includes/twincobr.h"
-
-/* 6845 used for video sync signals only */
-MC6845_INTERFACE( twincobr_mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 2, /* number of pixels per video memory address */ /* Horizontal Display programmed to 160 characters */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-
/***************************************************************************
Callbacks for the TileMap code
***************************************************************************/
diff --git a/src/mess/drivers/a6809.c b/src/mess/drivers/a6809.c
index 55ac980a4e9..ca594096cb4 100644
--- a/src/mess/drivers/a6809.c
+++ b/src/mess/drivers/a6809.c
@@ -126,25 +126,6 @@ MACHINE_RESET_MEMBER( a6809_state, a6809)
m_via->write_pb7(0);
}
-static MC6845_UPDATE_ROW( a6809_update_row )
-{
-}
-
-static MC6845_INTERFACE( a6809_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 12,
- NULL,
- a6809_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
READ8_MEMBER( a6809_state::videoram_r )
{
offset += m_start_address;
@@ -266,7 +247,9 @@ static MACHINE_CONFIG_START( a6809, a6809_state )
MCFG_VIA6522_CB2_HANDLER(WRITELINE(a6809_state, cass_w))
MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE("maincpu", m6809e_device, irq_line))
- MCFG_MC6845_ADD("mc6845", MC6845, "screen", XTAL_4MHz / 2, a6809_crtc6845_interface)
+ MCFG_MC6845_ADD("mc6845", MC6845, "screen", XTAL_4MHz / 2)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(12)
MCFG_DEVICE_ADD("saa5050", SAA5050, 6000000)
MCFG_SAA5050_D_CALLBACK(READ8(a6809_state, videoram_r))
diff --git a/src/mess/drivers/alphatro.c b/src/mess/drivers/alphatro.c
index f167875ca75..626632b52f1 100644
--- a/src/mess/drivers/alphatro.c
+++ b/src/mess/drivers/alphatro.c
@@ -77,6 +77,7 @@ public:
DECLARE_PALETTE_INIT(alphatro);
TIMER_DEVICE_CALLBACK_MEMBER(timer_c);
TIMER_DEVICE_CALLBACK_MEMBER(timer_p);
+ MC6845_UPDATE_ROW(crtc_update_row);
required_shared_ptr<UINT8> m_p_videoram;
UINT8 *m_p_chargen;
UINT8 m_flashcnt;
@@ -154,12 +155,11 @@ void alphatro_state::video_start()
m_p_chargen = memregion("chargen")->base();
}
-static MC6845_UPDATE_ROW( alphatro_update_row )
+MC6845_UPDATE_ROW( alphatro_state::crtc_update_row )
{
- alphatro_state *state = device->machine().driver_data<alphatro_state>();
- const rgb_t *pens = state->m_palette->palette()->entry_list_raw();
- bool palette = BIT(state->ioport("CONFIG")->read(), 5);
- if (y==0) state->m_flashcnt++;
+ const rgb_t *pens = m_palette->palette()->entry_list_raw();
+ bool palette = BIT(ioport("CONFIG")->read(), 5);
+ if (y==0) m_flashcnt++;
bool inv;
UINT8 chr,gfx,attr,bg,fg;
UINT16 mem,x;
@@ -169,8 +169,8 @@ static MC6845_UPDATE_ROW( alphatro_update_row )
{
inv = (x == cursor_x);
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
- attr = state->m_p_videoram[mem | 0x800];
+ chr = m_p_videoram[mem];
+ attr = m_p_videoram[mem | 0x800];
fg = (palette) ? 8 : attr & 7; // amber or RGB
bg = (palette) ? 0 : (attr & 0x38) >> 3;
@@ -180,13 +180,13 @@ static MC6845_UPDATE_ROW( alphatro_update_row )
chr &= 0x7f;
}
- if (BIT(attr, 6) & BIT(state->m_flashcnt, 4)) // flashing
+ if (BIT(attr, 6) & BIT(m_flashcnt, 4)) // flashing
{
inv ^= 1;
}
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_chargen[(chr<<4) | ra];
+ gfx = m_p_chargen[(chr<<4) | ra];
if (inv)
{
@@ -414,21 +414,6 @@ PALETTE_INIT_MEMBER(alphatro_state, alphatro)
}
-static MC6845_INTERFACE( alphatro_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8,
- NULL,
- alphatro_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
TIMER_DEVICE_CALLBACK_MEMBER(alphatro_state::timer_c)
{
m_cass_data[3]++;
@@ -494,7 +479,10 @@ static MACHINE_CONFIG_START( alphatro, alphatro_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
/* Devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12_288MHz / 8, alphatro_crtc6845_interface) // clk unknown
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12_288MHz / 8) // clk unknown
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(alphatro_state, crtc_update_row)
MCFG_DEVICE_ADD("usart", I8251, 0)
MCFG_I8251_TXD_HANDLER(WRITELINE(alphatro_state, txdata_callback))
diff --git a/src/mess/drivers/amstrad.c b/src/mess/drivers/amstrad.c
index 41d37f4fac9..2bb009279f4 100644
--- a/src/mess/drivers/amstrad.c
+++ b/src/mess/drivers/amstrad.c
@@ -875,7 +875,12 @@ static MACHINE_CONFIG_START( amstrad_nofdc, amstrad_state )
MCFG_PALETTE_ADD("palette", 32)
MCFG_PALETTE_INIT_OWNER(amstrad_state,amstrad_cpc)
- MCFG_MC6845_ADD( "mc6845", MC6845, NULL, XTAL_16MHz / 16, amstrad_mc6845_intf )
+ MCFG_MC6845_ADD("mc6845", MC6845, NULL, XTAL_16MHz / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(amstrad_state, amstrad_de_changed))
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(amstrad_state, amstrad_hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(amstrad_state, amstrad_vsync_changed))
MCFG_VIDEO_START_OVERRIDE(amstrad_state,amstrad)
@@ -961,7 +966,12 @@ static MACHINE_CONFIG_START( cpcplus, amstrad_state )
MCFG_PALETTE_ADD("palette", 4096)
MCFG_PALETTE_INIT_OWNER(amstrad_state,amstrad_plus)
- MCFG_MC6845_ADD( "mc6845", MC6845, NULL, XTAL_40MHz / 40, amstrad_plus_mc6845_intf )
+ MCFG_MC6845_ADD("mc6845", MC6845, NULL, XTAL_40MHz / 40)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(amstrad_state, amstrad_plus_de_changed))
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(amstrad_state, amstrad_plus_hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(amstrad_state, amstrad_plus_vsync_changed))
MCFG_VIDEO_START_OVERRIDE(amstrad_state,amstrad)
@@ -1031,7 +1041,12 @@ static MACHINE_CONFIG_START( gx4000, amstrad_state )
MCFG_PALETTE_ADD("palette", 4096)
MCFG_PALETTE_INIT_OWNER(amstrad_state,amstrad_plus)
- MCFG_MC6845_ADD( "mc6845", MC6845, NULL, XTAL_40MHz / 40, amstrad_plus_mc6845_intf )
+ MCFG_MC6845_ADD("mc6845", MC6845, NULL, XTAL_40MHz / 40)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(amstrad_state, amstrad_plus_de_changed))
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(amstrad_state, amstrad_plus_hsync_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(amstrad_state, amstrad_plus_vsync_changed))
MCFG_VIDEO_START_OVERRIDE(amstrad_state,amstrad)
diff --git a/src/mess/drivers/amust.c b/src/mess/drivers/amust.c
index 3be6c0502df..7df7a17ac73 100644
--- a/src/mess/drivers/amust.c
+++ b/src/mess/drivers/amust.c
@@ -125,6 +125,7 @@ public:
DECLARE_WRITE8_MEMBER(port0d_w);
DECLARE_WRITE8_MEMBER(kbd_put);
INTERRUPT_GEN_MEMBER(irq_vs);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT8 *m_p_videoram;
const UINT8 *m_p_chargen;
required_device<palette_device> m_palette;
@@ -320,10 +321,9 @@ static GFXDECODE_START( amust )
GFXDECODE_ENTRY( "chargen", 0x0000, amust_charlayout, 0, 1 )
GFXDECODE_END
-MC6845_UPDATE_ROW( amust_update_row )
+MC6845_UPDATE_ROW( amust_state::crtc_update_row )
{
- amust_state *state = device->machine().driver_data<amust_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx,inv;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -332,9 +332,9 @@ MC6845_UPDATE_ROW( amust_update_row )
{
inv = (x == cursor_x) ? 0xff : 0;
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
+ chr = m_p_videoram[mem];
if (ra < 8)
- gfx = state->m_p_chargen[(chr<<3) | ra] ^ inv;
+ gfx = m_p_chargen[(chr<<3) | ra] ^ inv;
else
gfx = inv;
@@ -350,21 +350,6 @@ MC6845_UPDATE_ROW( amust_update_row )
}
}
-static MC6845_INTERFACE( amust_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- amust_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
MACHINE_RESET_MEMBER( amust_state, amust )
{
m_p_chargen = memregion("chargen")->base();
@@ -415,7 +400,11 @@ static MACHINE_CONFIG_START( amust, amust_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* Devices */
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_14_31818MHz / 8, amust_crtc)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_14_31818MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(amust_state, crtc_update_row)
+
MCFG_DEVICE_ADD("keybd", GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(amust_state, kbd_put))
MCFG_UPD765A_ADD("fdc", false, true)
diff --git a/src/mess/drivers/applix.c b/src/mess/drivers/applix.c
index 6cea23d6ac3..0af94b4d305 100644
--- a/src/mess/drivers/applix.c
+++ b/src/mess/drivers/applix.c
@@ -132,6 +132,7 @@ public:
DECLARE_WRITE8_MEMBER( p3_write );
TIMER_DEVICE_CALLBACK_MEMBER(cass_timer);
DECLARE_DRIVER_INIT(applix);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT8 m_video_latch;
UINT8 m_pa;
virtual void machine_reset();
@@ -771,28 +772,27 @@ void applix_state::video_start()
{
}
-static MC6845_UPDATE_ROW( applix_update_row )
+MC6845_UPDATE_ROW( applix_state::crtc_update_row )
{
// The display is bitmapped. 2 modes are supported here, 320x200x16 and 640x200x4.
// Need to display a border colour.
// There is a monochrome mode, but no info found as yet.
- applix_state *state = device->machine().driver_data<applix_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 i;
UINT16 chr,x;
- UINT32 mem, vidbase = (state->m_video_latch & 15) << 14, *p = &bitmap.pix32(y);
+ UINT32 mem, vidbase = (m_video_latch & 15) << 14, *p = &bitmap.pix32(y);
for (x = 0; x < x_count; x++)
{
mem = vidbase + ma + x + (ra<<12);
- chr = state->m_base[mem];
+ chr = m_base[mem];
- if (BIT(state->m_pa, 3))
+ if (BIT(m_pa, 3))
// 640 x 200 x 4of16 mode
{
for (i = 0; i < 8; i++)
{
- *p++ = palette[state->m_palette_latch[chr>>14]];
+ *p++ = palette[m_palette_latch[chr>>14]];
chr <<= 2;
}
}
@@ -809,21 +809,6 @@ static MC6845_UPDATE_ROW( applix_update_row )
}
}
-static MC6845_INTERFACE( applix_crtc )
-{
- false, // should show a border
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- applix_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(applix_state, vsync_w),
- NULL
-};
-
WRITE_LINE_MEMBER( applix_state::vsync_w )
{
m_via->write_ca2(state);
@@ -886,7 +871,12 @@ static MACHINE_CONFIG_START( applix, applix_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
/* Devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 1875000, applix_crtc) // 6545
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 1875000) // 6545
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(applix_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(applix_state, vsync_w))
+
MCFG_DEVICE_ADD("via6522", VIA6522, 0)
MCFG_VIA6522_READPB_HANDLER(READ8(applix_state, applix_pb_r))
// in CB1 kbd clk
diff --git a/src/mess/drivers/apricot.c b/src/mess/drivers/apricot.c
index ab14bc15438..4d3521d11db 100644
--- a/src/mess/drivers/apricot.c
+++ b/src/mess/drivers/apricot.c
@@ -92,6 +92,8 @@ public:
DECLARE_WRITE_LINE_MEMBER( data_selector_dtr_w ) { m_data_selector_dtr = state; };
DECLARE_WRITE_LINE_MEMBER( data_selector_rts_w ) { m_data_selector_rts = state; };
+ MC6845_UPDATE_ROW( crtc_update_row );
+
virtual void machine_start();
int m_data_selector_dtr;
@@ -224,19 +226,18 @@ UINT32 apricot_state::screen_update_apricot(screen_device &screen, bitmap_rgb32
return 0;
}
-static MC6845_UPDATE_ROW( apricot_update_row )
+MC6845_UPDATE_ROW( apricot_state::crtc_update_row )
{
- apricot_state *state = device->machine().driver_data<apricot_state>();
- UINT8 *ram = state->m_ram->pointer();
- const pen_t *pen = state->m_palette->pens();
+ UINT8 *ram = m_ram->pointer();
+ const pen_t *pen = m_palette->pens();
int i, x;
- if (state->m_video_mode)
+ if (m_video_mode)
{
// text mode
for (i = 0; i < x_count; i++)
{
- UINT16 code = state->m_screen_buffer[(ma + i) & 0x7ff];
+ UINT16 code = m_screen_buffer[(ma + i) & 0x7ff];
UINT16 offset = ((code & 0x7ff) << 5) | (ra << 1);
UINT16 data = ram[offset + 1] << 8 | ram[offset];
int fill = 0;
@@ -260,22 +261,6 @@ static MC6845_UPDATE_ROW( apricot_update_row )
}
}
-static MC6845_INTERFACE( apricot_mc6845_intf )
-{
- false,
- 0,0,0,0,
- 10,
- NULL,
- apricot_update_row,
- NULL,
- DEVCB_DRIVER_LINE_MEMBER(apricot_state, apricot_mc6845_de),
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-
//**************************************************************************
// MACHINE EMULATION
//**************************************************************************
@@ -346,7 +331,11 @@ static MACHINE_CONFIG_START( apricot, apricot_state )
MCFG_PALETTE_ADD_MONOCHROME_GREEN_HIGHLIGHT("palette")
- MCFG_MC6845_ADD("ic30", MC6845, "screen", XTAL_15MHz / 10, apricot_mc6845_intf)
+ MCFG_MC6845_ADD("ic30", MC6845, "screen", XTAL_15MHz / 10)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(10)
+ MCFG_MC6845_UPDATE_ROW_CB(apricot_state, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(apricot_state, apricot_mc6845_de))
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mess/drivers/apricotp.c b/src/mess/drivers/apricotp.c
index 5987e571f55..488b9986191 100644
--- a/src/mess/drivers/apricotp.c
+++ b/src/mess/drivers/apricotp.c
@@ -50,31 +50,6 @@ enum
// VIDEO
//**************************************************************************
-//-------------------------------------------------
-// mc6845_interface crtc_intf
-//-------------------------------------------------
-
-static MC6845_UPDATE_ROW( fp_update_row )
-{
-}
-
-
-static MC6845_INTERFACE( crtc_intf )
-{
- false,
- 0,0,0,0,
- 8,
- NULL,
- fp_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-
void fp_state::video_start()
{
// allocate memory
@@ -529,7 +504,10 @@ static MACHINE_CONFIG_START( fp, fp_state )
MCFG_PALETTE_ADD("palette", 16)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", act_f1)
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_CRT_TAG, 4000000, crtc_intf)
+
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_CRT_TAG, 4000000)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mess/drivers/b16.c b/src/mess/drivers/b16.c
index 3f725d39271..c6acf3922a6 100644
--- a/src/mess/drivers/b16.c
+++ b/src/mess/drivers/b16.c
@@ -255,22 +255,6 @@ void b16_state::machine_reset()
}
-
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
READ8_MEMBER(b16_state::memory_read_byte)
{
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
@@ -300,7 +284,10 @@ static MACHINE_CONFIG_START( b16, b16_state )
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_14_31818MHz/5, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_14_31818MHz/5) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+
MCFG_DEVICE_ADD("8237dma", AM9517A, XTAL_14_31818MHz/2)
MCFG_I8237_IN_MEMR_CB(READ8(b16_state, memory_read_byte))
MCFG_I8237_OUT_MEMW_CB(WRITE8(b16_state, memory_write_byte))
diff --git a/src/mess/drivers/bbc.c b/src/mess/drivers/bbc.c
index 617c6650ecf..10d83389261 100644
--- a/src/mess/drivers/bbc.c
+++ b/src/mess/drivers/bbc.c
@@ -688,7 +688,12 @@ static MACHINE_CONFIG_START( bbca, bbc_state )
MCFG_SAA5050_SCREEN_SIZE(40, 24, 40)
/* crtc */
- MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000, bbc_mc6845_intf)
+ MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(bbc_state, bbc_vsync))
+
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbca)
MCFG_DEFAULT_LAYOUT(layout_bbc)
@@ -909,7 +914,12 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_SAA5050_SCREEN_SIZE(40, 24, 40)
/* crtc */
- MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000, bbc_mc6845_intf)
+ MCFG_MC6845_ADD("mc6845", MC6845, "screen", 2000000)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(bbc_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(bbc_state, bbc_vsync))
+
MCFG_VIDEO_START_OVERRIDE(bbc_state, bbcm)
/* sound hardware */
diff --git a/src/mess/drivers/bigbord2.c b/src/mess/drivers/bigbord2.c
index 3b4c7c019df..c086110a74f 100644
--- a/src/mess/drivers/bigbord2.c
+++ b/src/mess/drivers/bigbord2.c
@@ -135,6 +135,7 @@ public:
DECLARE_WRITE8_MEMBER(memory_write_byte);
DECLARE_READ8_MEMBER(io_read_byte);
DECLARE_WRITE8_MEMBER(io_write_byte);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT8 *m_p_chargen; /* character ROM */
UINT8 *m_p_videoram; /* Video RAM */
UINT8 *m_p_attribram; /* Attribute RAM */
@@ -511,10 +512,9 @@ static GFXDECODE_START( bigbord2 )
GFXDECODE_ENTRY( "chargen", 0x0000, bigbord2_charlayout, 0, 1 )
GFXDECODE_END
-MC6845_UPDATE_ROW( bigbord2_update_row )
+MC6845_UPDATE_ROW( bigbord2_state::crtc_update_row )
{
- bigbord2_state *state = device->machine().driver_data<bigbord2_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx,inv;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -523,11 +523,11 @@ MC6845_UPDATE_ROW( bigbord2_update_row )
{
inv=0;
mem = (ma + x) & 0x7ff;
- if (BIT(state->m_p_attribram[mem], 7)) inv^=0xff;
- chr = state->m_p_videoram[mem];
+ if (BIT(m_p_attribram[mem], 7)) inv^=0xff;
+ chr = m_p_videoram[mem];
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_chargen[(chr<<4) | ra ] ^ inv;
+ gfx = m_p_chargen[(chr<<4) | ra ] ^ inv;
/* Display a scanline of a character */
*p++ = palette[BIT( gfx, 7 )];
@@ -541,22 +541,6 @@ MC6845_UPDATE_ROW( bigbord2_update_row )
}
}
-static MC6845_INTERFACE( bigbord2_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- bigbord2_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(bigbord2_state, frame), // vsync
- NULL
-};
-
-
/* Machine Drivers */
#define MAIN_CLOCK XTAL_8MHz / 2
@@ -603,7 +587,13 @@ static MACHINE_CONFIG_START( bigbord2, bigbord2_state )
MCFG_MB8877x_ADD("fdc", XTAL_16MHz / 16)
MCFG_FLOPPY_DRIVE_ADD("fdc:0", bigbord2_floppies, "525dd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", bigbord2_floppies, "525dd", floppy_image_device::default_floppy_formats)
- MCFG_MC6845_ADD("crtc", MC6845, SCREEN_TAG, XTAL_16MHz / 8, bigbord2_crtc)
+
+ MCFG_MC6845_ADD("crtc", MC6845, SCREEN_TAG, XTAL_16MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(bigbord2_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(bigbord2_state, frame))
+
MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(bigbord2_state, bigbord2_kbd_put))
diff --git a/src/mess/drivers/bml3.c b/src/mess/drivers/bml3.c
index 757af860c11..c4b22d6ea23 100644
--- a/src/mess/drivers/bml3.c
+++ b/src/mess/drivers/bml3.c
@@ -112,6 +112,8 @@ public:
DECLARE_READ8_MEMBER(bml3_f000_r); DECLARE_WRITE8_MEMBER(bml3_f000_w);
DECLARE_READ8_MEMBER(bml3_fff0_r); DECLARE_WRITE8_MEMBER(bml3_fff0_w);
+ MC6845_UPDATE_ROW(crtc_update_row);
+
UINT8 *m_p_videoram;
UINT8 *m_p_chargen;
UINT8 m_hres_reg;
@@ -589,10 +591,9 @@ static INPUT_PORTS_START( bml3 )
PORT_BIT(0xffe00000,IP_ACTIVE_HIGH,IPT_UNKNOWN)
INPUT_PORTS_END
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( bml3_state::crtc_update_row )
{
- bml3_state *state = device->machine().driver_data<bml3_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
// The MB-6890 has a 5-bit colour RAM region. The meaning of the bits are:
// 0: blue
// 1: red
@@ -604,9 +605,9 @@ static MC6845_UPDATE_ROW( update_row )
bool reverse=0,graphic=0,lowres=0;
UINT16 mem=0;
- interlace = (state->m_crtc_vreg[8] & 3) ? 1 : 0;
- lowres = BIT(state->m_hres_reg, 6);
- bgcolor = state->m_hres_reg & 7;
+ interlace = (m_crtc_vreg[8] & 3) ? 1 : 0;
+ lowres = BIT(m_hres_reg, 6);
+ bgcolor = m_hres_reg & 7;
if (interlace)
{
@@ -624,11 +625,11 @@ static MC6845_UPDATE_ROW( update_row )
else
mem = (ma + x + ra * x_count/40 * 0x400 -0x400) & 0x3fff;
- color = state->m_p_videoram[mem|0x4000] & 7;
- reverse = BIT(state->m_p_videoram[mem|0x4000], 3) ^ (x == cursor_x);
- graphic = BIT(state->m_p_videoram[mem|0x4000], 4);
+ color = m_p_videoram[mem|0x4000] & 7;
+ reverse = BIT(m_p_videoram[mem|0x4000], 3) ^ (x == cursor_x);
+ graphic = BIT(m_p_videoram[mem|0x4000], 4);
- rawbits = state->m_p_videoram[mem];
+ rawbits = m_p_videoram[mem];
if (graphic)
{
@@ -653,12 +654,12 @@ static MC6845_UPDATE_ROW( update_row )
int tile_bank = BIT(rawbits, 7);
if (interlace)
{
- dots[0] = state->m_p_chargen[(tile_bank<<11)|(tile<<4)|(ra<<1)];
- dots[1] = state->m_p_chargen[(tile_bank<<11)|(tile<<4)|(ra<<1)|tile_bank];
+ dots[0] = m_p_chargen[(tile_bank<<11)|(tile<<4)|(ra<<1)];
+ dots[1] = m_p_chargen[(tile_bank<<11)|(tile<<4)|(ra<<1)|tile_bank];
}
else
{
- dots[0] = dots[1] = state->m_p_chargen[(tile<<4)|(ra<<1)|tile_bank];
+ dots[0] = dots[1] = m_p_chargen[(tile<<4)|(ra<<1)|tile_bank];
}
}
@@ -679,20 +680,6 @@ static MC6845_UPDATE_ROW( update_row )
}
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
TIMER_DEVICE_CALLBACK_MEMBER(bml3_state::keyboard_callback)
{
@@ -1000,7 +987,11 @@ static MACHINE_CONFIG_START( bml3_common, bml3_state )
/* Devices */
// CRTC clock should be synchronous with the CPU clock.
- MCFG_MC6845_ADD("crtc", H46505, "screen", CPU_CLOCK, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", H46505, "screen", CPU_CLOCK)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(bml3_state, crtc_update_row)
+
// fire once per scan of an individual key
// According to the service manual (p.65), the keyboard timer is driven by the horizontal video sync clock.
MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", bml3_state, keyboard_callback, attotime::from_hz(H_CLOCK/2))
diff --git a/src/mess/drivers/bw12.c b/src/mess/drivers/bw12.c
index 6d1031bbb2f..cb722ce969f 100644
--- a/src/mess/drivers/bw12.c
+++ b/src/mess/drivers/bw12.c
@@ -324,17 +324,16 @@ INPUT_PORTS_END
/* Video */
-static MC6845_UPDATE_ROW( bw12_update_row )
+MC6845_UPDATE_ROW( bw12_state::crtc_update_row )
{
- bw12_state *state = device->machine().driver_data<bw12_state>();
- const pen_t *pen = state->m_palette->pens();
+ const pen_t *pen = m_palette->pens();
int column, bit;
for (column = 0; column < x_count; column++)
{
- UINT8 code = state->m_video_ram[((ma + column) & BW12_VIDEORAM_MASK)];
+ UINT8 code = m_video_ram[((ma + column) & BW12_VIDEORAM_MASK)];
UINT16 addr = code << 4 | (ra & 0x0f);
- UINT8 data = state->m_char_rom->base()[addr & BW12_CHARROM_MASK];
+ UINT8 data = m_char_rom->base()[addr & BW12_CHARROM_MASK];
if (column == cursor_x)
{
@@ -354,21 +353,6 @@ static MC6845_UPDATE_ROW( bw12_update_row )
}
-static MC6845_INTERFACE( bw12_mc6845_interface )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- bw12_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
/* PIA6821 Interface */
WRITE_LINE_MEMBER( bw12_state::write_centronics_busy )
@@ -564,7 +548,10 @@ static MACHINE_CONFIG_START( common, bw12_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", bw12)
MCFG_PALETTE_ADD_MONOCHROME_AMBER("palette")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/8, bw12_mc6845_interface)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(bw12_state, crtc_update_row)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mess/drivers/c128.c b/src/mess/drivers/c128.c
index a0e351cd67a..63316484c3c 100644
--- a/src/mess/drivers/c128.c
+++ b/src/mess/drivers/c128.c
@@ -862,7 +862,7 @@ READ_LINE_MEMBER( c128_state::mmu_sense40_r )
//-------------------------------------------------
-// mc6845_interface vdc_intf
+// mc6845
//-------------------------------------------------
static GFXDECODE_START( c128 )
@@ -870,22 +870,6 @@ static GFXDECODE_START( c128 )
GFXDECODE_END
-static MC6845_INTERFACE( vdc_intf )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- NULL,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-
//-------------------------------------------------
// MOS8564_INTERFACE( vic_intf )
//-------------------------------------------------
@@ -1455,7 +1439,15 @@ static MACHINE_CONFIG_START( ntsc, c128_state )
MCFG_QUANTUM_PERFECT_CPU(M8502_TAG)
// video hardware
- MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, XTAL_16MHz, vdc_intf, vdc_videoram_map)
+ MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, XTAL_16MHz, vdc_videoram_map)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_SCREEN_ADD(SCREEN_VDC_TAG, RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_SIZE(640, 200)
+ MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
+ MCFG_SCREEN_UPDATE_DEVICE(MOS8563_TAG, mos8563_device, screen_update)
+
MCFG_DEVICE_ADD(MOS8564_TAG, MOS8564, XTAL_14_31818MHz*2/3.5)
MCFG_MOS6566_CPU(M8502_TAG)
MCFG_MOS6566_IRQ_CALLBACK(WRITELINE(c128_state, vic_irq_w))
@@ -1619,7 +1611,17 @@ static MACHINE_CONFIG_START( pal, c128_state )
MCFG_QUANTUM_PERFECT_CPU(M8502_TAG)
// video hardware
- MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, XTAL_16MHz, vdc_intf, vdc_videoram_map)
+ MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, XTAL_16MHz, vdc_videoram_map)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_SCREEN_ADD(SCREEN_VDC_TAG, RASTER)
+ MCFG_SCREEN_REFRESH_RATE(60)
+ MCFG_SCREEN_SIZE(640, 200)
+ MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 200-1)
+ MCFG_SCREEN_UPDATE_DEVICE(MOS8563_TAG, mos8563_device, screen_update)
+
MCFG_DEVICE_ADD(MOS8566_TAG, MOS8566, XTAL_17_734472MHz*2/4.5)
MCFG_MOS6566_CPU(M8502_TAG)
MCFG_MOS6566_IRQ_CALLBACK(WRITELINE(c128_state, vic_irq_w))
diff --git a/src/mess/drivers/camplynx.c b/src/mess/drivers/camplynx.c
index 38352c95bd5..cd5e9f32603 100644
--- a/src/mess/drivers/camplynx.c
+++ b/src/mess/drivers/camplynx.c
@@ -103,6 +103,8 @@ public:
DECLARE_DRIVER_INIT(lynx48k);
DECLARE_PALETTE_INIT(camplynx);
DECLARE_MACHINE_RESET(lynx128k);
+ MC6845_UPDATE_ROW(lynx48k_update_row);
+ MC6845_UPDATE_ROW(lynx128k_update_row);
required_device<palette_device> m_palette;
private:
virtual void video_start();
@@ -384,11 +386,10 @@ PALETTE_INIT_MEMBER(camplynx_state, camplynx)
}
}
-static MC6845_UPDATE_ROW( lynx48k_update_row )
+MC6845_UPDATE_ROW( camplynx_state::lynx48k_update_row )
{
- camplynx_state *state = device->machine().driver_data<camplynx_state>();
- UINT8 *RAM = device->machine().root_device().memregion("maincpu")->base();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ UINT8 *RAM = machine().root_device().memregion("maincpu")->base();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 r,g,b;
UINT32 x, *p = &bitmap.pix32(y);
@@ -409,11 +410,10 @@ static MC6845_UPDATE_ROW( lynx48k_update_row )
}
}
-static MC6845_UPDATE_ROW( lynx128k_update_row )
+MC6845_UPDATE_ROW( camplynx_state::lynx128k_update_row )
{
- camplynx_state *state = device->machine().driver_data<camplynx_state>();
- UINT8 *RAM = device->machine().root_device().memregion("maincpu")->base();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ UINT8 *RAM = machine().root_device().memregion("maincpu")->base();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 r,g,b;
UINT32 x, *p = &bitmap.pix32(y);
@@ -438,38 +438,6 @@ void camplynx_state::video_start()
{
}
-static MC6845_INTERFACE( lynx48k_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8,
- NULL,
- lynx48k_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-
-static MC6845_INTERFACE( lynx128k_crtc6845_interface )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* dots per character */
- NULL,
- lynx128k_update_row, /* callback to display one scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_MEMBER(camplynx_state, lynx128k_irq), /* callback when cursor pin changes state */
- DEVCB_NULL,
- NULL
-};
-
-
static MACHINE_CONFIG_START( lynx48k, camplynx_state )
/* basic machine hardware */
@@ -492,8 +460,11 @@ static MACHINE_CONFIG_START( lynx48k, camplynx_state )
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.8)
- /* Devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12MHz / 8 /*? dot clock divided by dots per char */, lynx48k_crtc6845_interface)
+ /* devices */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12MHz / 8 /*? dot clock divided by dots per char */)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(camplynx_state, lynx48k_update_row)
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( lynx128k, camplynx_state )
@@ -520,8 +491,12 @@ static MACHINE_CONFIG_START( lynx128k, camplynx_state )
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.8)
- /* Devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12MHz / 8 /*? dot clock divided by dots per char */, lynx128k_crtc6845_interface)
+ /* devices */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12MHz / 8 /*? dot clock divided by dots per char */)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(camplynx_state, lynx128k_update_row)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITE8(camplynx_state, lynx128k_irq))
MACHINE_CONFIG_END
DRIVER_INIT_MEMBER(camplynx_state,lynx48k)
diff --git a/src/mess/drivers/cbm2.c b/src/mess/drivers/cbm2.c
index a06698a7bc5..78bcd9e6ec5 100644
--- a/src/mess/drivers/cbm2.c
+++ b/src/mess/drivers/cbm2.c
@@ -1102,21 +1102,20 @@ INPUT_PORTS_END
//**************************************************************************
//-------------------------------------------------
-// mc6845_interface crtc_intf
+// mc6845
//-------------------------------------------------
-static MC6845_UPDATE_ROW( crtc_update_row )
+MC6845_UPDATE_ROW( cbm2_state::crtc_update_row )
{
- cbm2_state *state = device->machine().driver_data<cbm2_state>();
- const pen_t *pen = state->m_palette->pens();
+ const pen_t *pen = m_palette->pens();
int x = 0;
for (int column = 0; column < x_count; column++)
{
- UINT8 code = state->m_video_ram[(ma + column) & 0x7ff];
- offs_t char_rom_addr = (ma & 0x1000) | (state->m_graphics << 11) | ((code & 0x7f) << 4) | (ra & 0x0f);
- UINT8 data = state->m_charom->base()[char_rom_addr & 0xfff];
+ UINT8 code = m_video_ram[(ma + column) & 0x7ff];
+ offs_t char_rom_addr = (ma & 0x1000) | (m_graphics << 11) | ((code & 0x7f) << 4) | (ra & 0x0f);
+ UINT8 data = m_charom->base()[char_rom_addr & 0xfff];
for (int bit = 0; bit < 9; bit++)
{
@@ -1126,27 +1125,11 @@ static MC6845_UPDATE_ROW( crtc_update_row )
bitmap.pix32(vbp + y, hbp + x++) = pen[color];
- if (bit < 8 || !state->m_graphics) data <<= 1;
+ if (bit < 8 || !m_graphics) data <<= 1;
}
}
}
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 9,
- NULL,
- crtc_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-
//-------------------------------------------------
// vic2_interface vic_intf
//-------------------------------------------------
@@ -2254,7 +2237,10 @@ static MACHINE_CONFIG_START( cbm2lp_ntsc, cbm2_state )
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
- MCFG_MC6845_ADD(MC68B45_TAG, MC6845, SCREEN_TAG, XTAL_18MHz/9, crtc_intf)
+ MCFG_MC6845_ADD(MC68B45_TAG, MC6845, SCREEN_TAG, XTAL_18MHz/9)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(9)
+ MCFG_MC6845_UPDATE_ROW_CB(cbm2_state, crtc_update_row)
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mess/drivers/dgn_beta.c b/src/mess/drivers/dgn_beta.c
index c4a3a1f141f..7a744fe606d 100644
--- a/src/mess/drivers/dgn_beta.c
+++ b/src/mess/drivers/dgn_beta.c
@@ -327,7 +327,6 @@ static MACHINE_CONFIG_START( dgnbeta, dgn_beta_state )
MCFG_CPU_ADD(DMACPU_TAG, M6809E, DGNBETA_CPU_SPEED_HZ) /* 2 MHz */
MCFG_CPU_PROGRAM_MAP(dgnbeta_map)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(DGNBETA_FRAMES_PER_SECOND)
@@ -375,7 +374,11 @@ static MACHINE_CONFIG_START( dgnbeta, dgn_beta_state )
MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(dgnbeta_floppy_interface)
- MCFG_MC6845_ADD("crtc", HD6845, "screen", XTAL_12_288MHz / 16, dgnbeta_crtc6845_interface) //XTAL is guessed
+ MCFG_MC6845_ADD("crtc", HD6845, "screen", XTAL_12_288MHz / 16) //XTAL is guessed
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16) /*?*/
+ MCFG_MC6845_UPDATE_ROW_CB(dgn_beta_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(dgn_beta_state, dgnbeta_vsync_changed))
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
diff --git a/src/mess/drivers/dim68k.c b/src/mess/drivers/dim68k.c
index af052b4c8bd..9c12fb1caff 100644
--- a/src/mess/drivers/dim68k.c
+++ b/src/mess/drivers/dim68k.c
@@ -66,6 +66,7 @@ public:
DECLARE_WRITE16_MEMBER( dim68k_video_high_w );
DECLARE_WRITE16_MEMBER( dim68k_video_reset_w );
DECLARE_WRITE8_MEMBER(kbd_put);
+ MC6845_UPDATE_ROW(crtc_update_row);
const UINT8 *m_p_chargen;
bool m_speaker_bit;
UINT8 m_video_control;
@@ -224,15 +225,14 @@ void dim68k_state::video_start()
}
// Text-only; graphics isn't emulated yet. Need to find out if hardware cursor is used.
-MC6845_UPDATE_ROW( dim68k_update_row )
+MC6845_UPDATE_ROW( dim68k_state::crtc_update_row )
{
- dim68k_state *state = device->machine().driver_data<dim68k_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx,x,xx,inv;
UINT16 chr16=0x2020; // set to spaces if screen is off
UINT32 *p = &bitmap.pix32(y);
- UINT8 screen_on = ~state->m_video_control & 4;
- UINT8 dot8 = ~state->m_video_control & 40;
+ UINT8 screen_on = ~m_video_control & 4;
+ UINT8 dot8 = ~m_video_control & 40;
// need to divide everything in half to cater for 16-bit reads
x_count /= 2;
@@ -242,14 +242,14 @@ MC6845_UPDATE_ROW( dim68k_update_row )
for (x = 0; x < x_count; x++)
{
if (screen_on)
- chr16 = state->m_ram[ma+x]; // reads 2 characters
+ chr16 = m_ram[ma+x]; // reads 2 characters
inv=0;
if (xx == cursor_x && screen_on) inv=0xff;
xx++;
chr = chr16>>8;
- gfx = state->m_p_chargen[(chr<<4) | ra] ^ inv ^ ((chr & 0x80) ? 0xff : 0);
+ gfx = m_p_chargen[(chr<<4) | ra] ^ inv ^ ((chr & 0x80) ? 0xff : 0);
*p++ = palette[BIT(gfx, 7)];
*p++ = palette[BIT(gfx, 6)];
*p++ = palette[BIT(gfx, 5)];
@@ -264,7 +264,7 @@ MC6845_UPDATE_ROW( dim68k_update_row )
xx++;
chr = chr16;
- gfx = state->m_p_chargen[(chr<<4) | ra] ^ inv ^ ((chr & 0x80) ? 0xff : 0);
+ gfx = m_p_chargen[(chr<<4) | ra] ^ inv ^ ((chr & 0x80) ? 0xff : 0);
*p++ = palette[BIT(gfx, 7)];
*p++ = palette[BIT(gfx, 6)];
*p++ = palette[BIT(gfx, 5)];
@@ -294,21 +294,6 @@ static GFXDECODE_START( dim68k )
GFXDECODE_ENTRY( "chargen", 0x0000, dim68k_charlayout, 0, 1 )
GFXDECODE_END
-static MC6845_INTERFACE( dim68k_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character - switchable 7 or 8 */
- NULL,
- dim68k_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
static SLOT_INTERFACE_START( dim68k_floppies )
SLOT_INTERFACE( "525hd", FLOPPY_525_HD )
SLOT_INTERFACE_END
@@ -342,7 +327,12 @@ static MACHINE_CONFIG_START( dim68k, dim68k_state )
MCFG_UPD765A_ADD("fdc", true, true) // these options unknown
MCFG_FLOPPY_DRIVE_ADD("fdc:0", dim68k_floppies, "525hd", floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", dim68k_floppies, "525hd", floppy_image_device::default_floppy_formats)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 1790000, dim68k_crtc)
+
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 1790000)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(dim68k_state, crtc_update_row)
+
MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(dim68k_state, kbd_put))
MACHINE_CONFIG_END
diff --git a/src/mess/drivers/ec65.c b/src/mess/drivers/ec65.c
index 73d12881606..978ffb25a8f 100644
--- a/src/mess/drivers/ec65.c
+++ b/src/mess/drivers/ec65.c
@@ -38,6 +38,7 @@ public:
}
DECLARE_WRITE8_MEMBER(kbd_put);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT8 *m_p_chargen;
required_device<via6522_device> m_via_0;
required_device<via6522_device> m_via_1;
@@ -118,10 +119,9 @@ void ec65_state::video_start()
m_p_chargen = memregion("chargen")->base();
}
-static MC6845_UPDATE_ROW( ec65_update_row )
+MC6845_UPDATE_ROW( ec65_state::crtc_update_row )
{
- ec65_state *state = device->machine().driver_data<ec65_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx,inv;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -130,10 +130,10 @@ static MC6845_UPDATE_ROW( ec65_update_row )
{
inv = (x == cursor_x) ? 0xff : 0;
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
+ chr = m_p_videoram[mem];
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_chargen[(chr<<4) | (ra & 0x0f)] ^ inv;
+ gfx = m_p_chargen[(chr<<4) | (ra & 0x0f)] ^ inv;
/* Display a scanline of a character */
*p++ = palette[BIT(gfx, 7)];
@@ -147,23 +147,6 @@ static MC6845_UPDATE_ROW( ec65_update_row )
}
}
-
-static MC6845_INTERFACE( ec65_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8 /*?*/,
- NULL,
- ec65_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-
/* F4 Character Displayer */
static const gfx_layout ec65_charlayout =
{
@@ -188,7 +171,6 @@ static MACHINE_CONFIG_START( ec65, ec65_state )
MCFG_CPU_ADD("maincpu",M6502, XTAL_4MHz / 4)
MCFG_CPU_PROGRAM_MAP(ec65_mem)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -200,8 +182,10 @@ static MACHINE_CONFIG_START( ec65, ec65_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", ec65)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, "screen", XTAL_16MHz / 8, ec65_crtc6845_interface)
-
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, "screen", XTAL_16MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /*?*/
+ MCFG_MC6845_UPDATE_ROW_CB(ec65_state, crtc_update_row)
/* devices */
MCFG_DEVICE_ADD(PIA6821_TAG, PIA6821, 0)
@@ -225,7 +209,6 @@ static MACHINE_CONFIG_START( ec65k, ec65k_state )
MCFG_CPU_ADD("maincpu",G65816, XTAL_4MHz) // can use 4,2 or 1 MHz
MCFG_CPU_PROGRAM_MAP(ec65k_mem)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -237,8 +220,9 @@ static MACHINE_CONFIG_START( ec65k, ec65k_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", ec65)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, "screen", XTAL_16MHz / 8, ec65_crtc6845_interface)
-
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, "screen", XTAL_16MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /*?*/
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mess/drivers/einstein.c b/src/mess/drivers/einstein.c
index 670c5894ab7..06067b70a53 100644
--- a/src/mess/drivers/einstein.c
+++ b/src/mess/drivers/einstein.c
@@ -99,17 +99,16 @@ READ8_MEMBER(einstein_state::einstein_80col_ram_r)
bit 12 jumper M004, this could be used to select two different character
sets.
*/
-static MC6845_UPDATE_ROW( einstein_6845_update_row )
+MC6845_UPDATE_ROW( einstein_state::crtc_update_row )
{
- einstein_state *einstein = device->machine().driver_data<einstein_state>();
- const rgb_t *palette = einstein->m_palette->palette()->entry_list_raw();
- UINT8 *data = einstein->m_region_gfx1->base();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *data = m_region_gfx1->base();
UINT8 char_code, data_byte;
int i, x;
for (i = 0, x = 0; i < x_count; i++, x += 8)
{
- char_code = einstein->m_crtc_ram[(ma + i) & 0x07ff];
+ char_code = m_crtc_ram[(ma + i) & 0x07ff];
data_byte = data[(char_code << 3) + (ra & 0x07) + ((ra & 0x08) << 8)];
bitmap.pix32(y, x + 0) = palette[TMS9928A_PALETTE_SIZE + BIT(data_byte, 7)];
@@ -676,21 +675,6 @@ static const ay8910_interface einstein_ay_interface =
DEVCB_NULL
};
-static MC6845_INTERFACE( einstein_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8,
- NULL,
- einstein_6845_update_row,
- NULL,
- DEVCB_DRIVER_LINE_MEMBER(einstein_state,einstein_6845_de_changed),
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
/* F4 Character Displayer */
static const gfx_layout einstei2_charlayout =
{
@@ -721,7 +705,6 @@ static MACHINE_CONFIG_START( einstein, einstein_state )
MCFG_CPU_IO_MAP(einstein_io)
MCFG_CPU_CONFIG(einstein_daisy_chain)
-
/* this is actually clocked at the system clock 4 MHz, but this would be too fast for our
driver. So we update at 50Hz and hope this is good enough. */
MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard", einstein_state, einstein_keyboard_timer_callback, attotime::from_hz(50))
@@ -807,7 +790,11 @@ static MACHINE_CONFIG_DERIVED( einstei2, einstein )
/* 2 additional colors for the 80 column screen */
MCFG_PALETTE_ADD("palette", TMS9928A_PALETTE_SIZE + 2)
- MCFG_MC6845_ADD("crtc", MC6845, "80column", XTAL_X002 / 4, einstein_crtc6845_interface)
+ MCFG_MC6845_ADD("crtc", MC6845, "80column", XTAL_X002 / 4)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(einstein_state, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(einstein_state, einstein_6845_de_changed))
MACHINE_CONFIG_END
diff --git a/src/mess/drivers/fanucspmg.c b/src/mess/drivers/fanucspmg.c
index be6d2d96dcb..77c96770213 100644
--- a/src/mess/drivers/fanucspmg.c
+++ b/src/mess/drivers/fanucspmg.c
@@ -547,6 +547,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(tc_w);
DECLARE_WRITE_LINE_MEMBER(hrq_w);
+ MC6845_UPDATE_ROW(crtc_update_row);
+
DECLARE_DRIVER_INIT(fanucspmg);
UINT8 m_vram[24576];
@@ -765,23 +767,22 @@ WRITE8_MEMBER(fanucspmg_state::memory_write_byte)
return prog_space.write_byte(offset | (m_dma_page << 16), data);
}
-static MC6845_UPDATE_ROW( fanuc_update_row )
+MC6845_UPDATE_ROW( fanucspmg_state::crtc_update_row )
{
- fanucspmg_state *state = downcast<fanucspmg_state *>(device->owner());
UINT32 *p = &bitmap.pix32(y);
int i;
- UINT8 *chargen = state->m_chargen->base();
+ UINT8 *chargen = m_chargen->base();
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ma + i );
- if (state->m_video_ctrl & 0x02)
+ if (m_video_ctrl & 0x02)
{
if (offset <= 0x5ff)
{
- UINT8 chr = state->m_vram[offset + 0x600];
- UINT8 attr = state->m_vram[offset];
+ UINT8 chr = m_vram[offset + 0x600];
+ UINT8 attr = m_vram[offset];
UINT8 data = chargen[ chr + (ra * 256) ];
UINT32 fg = 0;
UINT32 bg = 0;
@@ -814,21 +815,6 @@ static MC6845_UPDATE_ROW( fanuc_update_row )
}
}
-static MC6845_INTERFACE( mc6845_fanuc_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* begin_update */
- fanuc_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_NULL, /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_NULL, /* on hsync changed */
- DEVCB_DRIVER_LINE_MEMBER(fanucspmg_state, vsync_w), /* on vsync changed */
- NULL
-};
-
static SLOT_INTERFACE_START( fanuc_floppies )
SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
SLOT_INTERFACE_END
@@ -882,7 +868,11 @@ static MACHINE_CONFIG_START( fanucspmg, fanucspmg_state )
MCFG_SCREEN_RAW_PARAMS(XTAL_15MHz, 640, 0, 512, 390, 0, 384 )
MCFG_SCREEN_UPDATE_DEVICE( CRTC_TAG, mc6845_device, screen_update )
- MCFG_MC6845_ADD( CRTC_TAG, HD6845, SCREEN_TAG, XTAL_8MHz/2, mc6845_fanuc_intf)
+ MCFG_MC6845_ADD( CRTC_TAG, HD6845, SCREEN_TAG, XTAL_8MHz/2)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(fanucspmg_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(fanucspmg_state, vsync_w))
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mess/drivers/fp1100.c b/src/mess/drivers/fp1100.c
index 22d49cf9e0b..ef89520ccd1 100644
--- a/src/mess/drivers/fp1100.c
+++ b/src/mess/drivers/fp1100.c
@@ -87,10 +87,6 @@ void fp1100_state::video_start()
{
}
-static MC6845_UPDATE_ROW( fp1100_update_row )
-{
-}
-
READ8_MEMBER( fp1100_state::fp1100_mem_r )
{
if(m_mem_bank == 0 && offset <= 0x8fff)
@@ -318,21 +314,6 @@ GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- fp1100_update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
INTERRUPT_GEN_MEMBER(fp1100_state::fp1100_vblank_irq)
{
if(irq_mask & 0x10)
@@ -362,8 +343,10 @@ static MACHINE_CONFIG_START( fp1100, fp1100_state )
MCFG_PALETTE_ADD("palette", 8)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", fp1100)
- /* Devices */
- MCFG_MC6845_ADD("crtc", H46505, "screen", MAIN_CLOCK/2, mc6845_intf) /* hand tuned to get ~60 fps */
+ /* devices */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", MAIN_CLOCK/2) /* hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mess/drivers/fp6000.c b/src/mess/drivers/fp6000.c
index 203fd119961..5eb0720b426 100644
--- a/src/mess/drivers/fp6000.c
+++ b/src/mess/drivers/fp6000.c
@@ -288,28 +288,12 @@ void fp6000_state::machine_reset()
{
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
static MACHINE_CONFIG_START( fp6000, fp6000_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8086, 16000000/2)
MCFG_CPU_PROGRAM_MAP(fp6000_map)
MCFG_CPU_IO_MAP(fp6000_io)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -319,7 +303,9 @@ static MACHINE_CONFIG_START( fp6000, fp6000_state )
MCFG_SCREEN_UPDATE_DRIVER(fp6000_state, screen_update_fp6000)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD("crtc", H46505, "screen", 16000000/5, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", 16000000/5) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_PALETTE_ADD("palette", 8)
// MCFG_PALETTE_INIT(black_and_white)
diff --git a/src/mess/drivers/h19.c b/src/mess/drivers/h19.c
index b823566fda2..df5b1815980 100644
--- a/src/mess/drivers/h19.c
+++ b/src/mess/drivers/h19.c
@@ -72,6 +72,7 @@ public:
DECLARE_READ8_MEMBER(h19_a0_r);
DECLARE_WRITE8_MEMBER(h19_c0_w);
DECLARE_WRITE8_MEMBER(h19_kbd_put);
+ MC6845_UPDATE_ROW(crtc_update_row);
required_shared_ptr<UINT8> m_p_videoram;
required_device<palette_device> m_palette;
UINT8 *m_p_chargen;
@@ -320,10 +321,9 @@ void h19_state::video_start()
m_p_chargen = memregion("chargen")->base();
}
-static MC6845_UPDATE_ROW( h19_update_row )
+MC6845_UPDATE_ROW( h19_state::crtc_update_row )
{
- h19_state *state = device->machine().driver_data<h19_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -333,7 +333,7 @@ static MC6845_UPDATE_ROW( h19_update_row )
UINT8 inv=0;
if (x == cursor_x) inv=0xff;
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
+ chr = m_p_videoram[mem];
if (chr & 0x80)
{
@@ -342,7 +342,7 @@ static MC6845_UPDATE_ROW( h19_update_row )
}
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_chargen[(chr<<4) | ra] ^ inv;
+ gfx = m_p_chargen[(chr<<4) | ra] ^ inv;
/* Display a scanline of a character (8 pixels) */
*p++ = palette[BIT(gfx, 7)];
@@ -372,21 +372,6 @@ static const ins8250_interface h19_ace_interface =
};
-static MC6845_INTERFACE( h19_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8 /*?*/,
- NULL,
- h19_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_NMI), // frame pulse
- NULL
-};
-
/* F4 Character Displayer */
static const gfx_layout h19_charlayout =
{
@@ -428,8 +413,14 @@ static MACHINE_CONFIG_START( h19, h19_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", h19)
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12_288MHz / 8, h19_crtc6845_interface) // clk taken from schematics
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_12_288MHz / 8) // clk taken from schematics
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /*?*/
+ MCFG_MC6845_UPDATE_ROW_CB(h19_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(INPUTLINE("maincpu", INPUT_LINE_NMI)) // frame pulse
+
MCFG_INS8250_ADD( "ins8250", h19_ace_interface, XTAL_12_288MHz / 4) // 3.072mhz clock which gets divided down for the various baud rates
+
MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(h19_state, h19_kbd_put))
diff --git a/src/mess/drivers/hp9k.c b/src/mess/drivers/hp9k.c
index afb4dd9111c..19f612d7513 100644
--- a/src/mess/drivers/hp9k.c
+++ b/src/mess/drivers/hp9k.c
@@ -389,21 +389,6 @@ WRITE8_MEMBER( hp9k_state::kbd_put )
}
-static MC6845_INTERFACE( hp9k_mc6845_intf )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- NULL, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
static MACHINE_CONFIG_START( hp9k, hp9k_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu",M68000, XTAL_8MHz)
@@ -422,7 +407,9 @@ static MACHINE_CONFIG_START( hp9k, hp9k_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", hp9k)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
- MCFG_MC6845_ADD( "mc6845", MC6845, "screen", XTAL_16MHz / 16, hp9k_mc6845_intf )
+ MCFG_MC6845_ADD("mc6845", MC6845, "screen", XTAL_16MHz / 16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mess/drivers/kaypro.c b/src/mess/drivers/kaypro.c
index 55ce10b2e06..9e76d9acd30 100644
--- a/src/mess/drivers/kaypro.c
+++ b/src/mess/drivers/kaypro.c
@@ -148,21 +148,6 @@ static const z80_daisy_config kaypro2x_daisy_chain[] =
-static MC6845_INTERFACE( kaypro2x_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 7, /* number of dots per character */
- NULL,
- kaypro2x_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
//static WRITE_LINE_DEVICE_HANDLER( rx_tx_w )
//{
// downcast<z80sio_device *>(device)->rx_clock_in();
@@ -289,7 +274,11 @@ static MACHINE_CONFIG_START( kaypro2x, kaypro_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
/* devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 2000000, kaypro2x_crtc) /* comes out of ULA - needs to be measured */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 2000000) /* comes out of ULA - needs to be measured */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(7)
+ MCFG_MC6845_UPDATE_ROW_CB(kaypro_state, kaypro2x_update_row)
+
MCFG_QUICKLOAD_ADD("quickload", kaypro_state, kaypro, "com,cpm", 3)
MCFG_CENTRONICS_ADD("centronics", centronics_printers, "printer")
diff --git a/src/mess/drivers/lola8a.c b/src/mess/drivers/lola8a.c
index f07c94246c4..f3aae30c631 100644
--- a/src/mess/drivers/lola8a.c
+++ b/src/mess/drivers/lola8a.c
@@ -52,6 +52,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(cass_w);
DECLARE_READ8_MEMBER(keyboard_r);
+ MC6845_UPDATE_ROW(crtc_update_row);
private:
UINT8 m_portb;
@@ -196,11 +197,10 @@ PALETTE_INIT_MEMBER(lola8a_state, lola8a)
}
}
-static MC6845_UPDATE_ROW( lola8a_update_row )
+MC6845_UPDATE_ROW( lola8a_state::crtc_update_row )
{
- lola8a_state *state = device->machine().driver_data<lola8a_state>();
- address_space &program = state->m_maincpu->space(AS_PROGRAM);
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ address_space &program = m_maincpu->space(AS_PROGRAM);
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
for (int sx = 0; sx < x_count; sx++)
{
@@ -257,21 +257,6 @@ WRITE_LINE_MEMBER(lola8a_state::crtc_vsync)
m_maincpu->set_input_line(I8085_RST75_LINE, state? ASSERT_LINE : CLEAR_LINE);
}
-static MC6845_INTERFACE( hd46505sp_intf )
-{
- false,
- 0,0,0,0,
- 8,
- NULL,
- lola8a_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(lola8a_state, crtc_vsync),
- NULL
-};
-
static const ay8910_interface psg_intf =
{
AY8910_LEGACY_OUTPUT,
@@ -302,7 +287,13 @@ static MACHINE_CONFIG_START( lola8a, lola8a_state )
MCFG_SCREEN_UPDATE_DEVICE(HD46505SP_TAG, hd6845_device, screen_update)
MCFG_SCREEN_SIZE(640, 480)
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
- MCFG_MC6845_ADD(HD46505SP_TAG, HD6845, "screen", XTAL_8MHz / 8, hd46505sp_intf) // HD6845 == HD46505S
+
+ MCFG_MC6845_ADD(HD46505SP_TAG, HD6845, "screen", XTAL_8MHz / 8) // HD6845 == HD46505S
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(lola8a_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(lola8a_state, crtc_vsync))
+
MCFG_PALETTE_ADD("palette", 8)
MCFG_PALETTE_INIT_OWNER(lola8a_state, lola8a)
diff --git a/src/mess/drivers/m20.c b/src/mess/drivers/m20.c
index 483651821cf..ba13f0f1802 100644
--- a/src/mess/drivers/m20.c
+++ b/src/mess/drivers/m20.c
@@ -830,21 +830,6 @@ void m20_state::machine_reset()
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 16, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
WRITE_LINE_MEMBER(m20_state::kbd_rxrdy_int)
{
m_i8259->ir4_w(state);
@@ -922,7 +907,10 @@ static MACHINE_CONFIG_START( m20, m20_state )
MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("i8259", pic8259_device, ir0_w))
MCFG_FLOPPY_DRIVE_ADD("fd1797:0", m20_floppies, "5dd", m20_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("fd1797:1", m20_floppies, "5dd", m20_state::floppy_formats)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", PIXEL_CLOCK/8, mc6845_intf) /* hand tuned to get ~50 fps */
+
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", PIXEL_CLOCK/8) /* hand tuned to get ~50 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(16)
MCFG_DEVICE_ADD("ppi8255", I8255A, 0)
diff --git a/src/mess/drivers/mbc200.c b/src/mess/drivers/mbc200.c
index 3d29a1c33c5..2e4fc087ac9 100644
--- a/src/mess/drivers/mbc200.c
+++ b/src/mess/drivers/mbc200.c
@@ -133,26 +133,6 @@ void mbc200_state::machine_start()
m_floppy1->floppy_drive_set_ready_state(1, 1);
}
-MC6845_UPDATE_ROW( mbc200_update_row )
-{
-}
-
-
-static MC6845_INTERFACE( mbc200_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- mbc200_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
void mbc200_state::video_start()
{
}
@@ -253,8 +233,9 @@ static MACHINE_CONFIG_START( mbc200, mbc200_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", mbc200)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
-
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_8MHz / 4, mbc200_crtc) // HD46505SP
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_8MHz / 4) // HD46505SP
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_DEVICE_ADD("ppi8255_1", I8255, 0)
diff --git a/src/mess/drivers/mbc55x.c b/src/mess/drivers/mbc55x.c
index 0d2c1ab3056..5b2b4eae3ab 100644
--- a/src/mess/drivers/mbc55x.c
+++ b/src/mess/drivers/mbc55x.c
@@ -277,7 +277,12 @@ static MACHINE_CONFIG_START( mbc55x, mbc55x_state )
MCFG_I8255_IN_PORTC_CB(READ8(mbc55x_state, mbc55x_ppi_portc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(mbc55x_state, mbc55x_ppi_portc_w))
- MCFG_MC6845_ADD(VID_MC6845_NAME, MC6845, SCREEN_TAG, XTAL_14_31818MHz/8, mb55x_mc6845_intf)
+ MCFG_MC6845_ADD(VID_MC6845_NAME, MC6845, SCREEN_TAG, XTAL_14_31818MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(mbc55x_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(mbc55x_state, vid_hsync_changed))
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(mbc55x_state, vid_vsync_changed))
/* Backing storage */
MCFG_FD1793_ADD(FDC_TAG, mbc55x_wd17xx_interface )
diff --git a/src/mess/drivers/mbee.c b/src/mess/drivers/mbee.c
index a33b2d5fa86..ed543170355 100644
--- a/src/mess/drivers/mbee.c
+++ b/src/mess/drivers/mbee.c
@@ -660,67 +660,6 @@ static SLOT_INTERFACE_START( mbee_floppies )
SLOT_INTERFACE_END
-static MC6845_INTERFACE( mbee_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- mbee_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- mbee_update_addr /* handler to process transparent mode */
-};
-
-
-static MC6845_INTERFACE( mbeeic_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- mbeeic_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- mbee_update_addr /* handler to process transparent mode */
-};
-
-static MC6845_INTERFACE( mbeeppc_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- mbeeppc_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- mbee_update_addr /* handler to process transparent mode */
-};
-
-static MC6845_INTERFACE( mbee256_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- mbeeppc_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- mbee256_update_addr /* handler to process transparent mode */
-};
-
static const cassette_interface mbee_cassette_interface =
{
mbee_cassette_formats,
@@ -766,7 +705,12 @@ static MACHINE_CONFIG_START( mbee, mbee_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* devices */
- MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_12MHz / 8, mbee_crtc)
+ MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_12MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbee_update_row)
+ MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr)
+
MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", 2)
MCFG_QUICKLOAD_ADD("quickload2", mbee_state, mbee_z80bin, "bin", 2)
@@ -817,7 +761,12 @@ static MACHINE_CONFIG_START( mbeeic, mbee_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* devices */
- MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8, mbeeic_crtc)
+ MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeic_update_row)
+ MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr)
+
MCFG_QUICKLOAD_ADD("quickload", mbee_state, mbee, "mwb,com,bee", 2)
MCFG_QUICKLOAD_ADD("quickload2", mbee_state, mbee_z80bin, "bin", 2)
@@ -854,8 +803,13 @@ static MACHINE_CONFIG_DERIVED( mbeeppc, mbeeic )
MCFG_PALETTE_MODIFY("palette")
MCFG_PALETTE_ENTRIES(16)
MCFG_PALETTE_INIT_OWNER(mbee_state,mbeeppc)
+
MCFG_DEVICE_REMOVE("crtc")
- MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8, mbeeppc_crtc)
+ MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row)
+ MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee_update_addr)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( mbee56, mbeeic )
@@ -890,8 +844,13 @@ static MACHINE_CONFIG_DERIVED( mbee256, mbee128 )
MCFG_CPU_IO_MAP(mbee256_io)
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbee256 )
MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz )
+
MCFG_DEVICE_REMOVE("crtc")
- MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8, mbee256_crtc)
+ MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row)
+ MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee256_update_addr)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( mbeett, mbeeppc )
@@ -900,8 +859,13 @@ static MACHINE_CONFIG_DERIVED( mbeett, mbeeppc )
MCFG_CPU_IO_MAP(mbeett_io)
MCFG_MACHINE_RESET_OVERRIDE(mbee_state, mbeett )
MCFG_MC146818_ADD( "rtc", XTAL_32_768kHz )
+
MCFG_DEVICE_REMOVE("crtc")
- MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8, mbee256_crtc)
+ MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_13_5MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(mbee_state, mbeeppc_update_row)
+ MCFG_MC6845_ADDR_CHANGED_CB(mbee_state, mbee256_update_addr)
MACHINE_CONFIG_END
/* Unused roms:
diff --git a/src/mess/drivers/multi16.c b/src/mess/drivers/multi16.c
index d6cef937648..fb96621bf98 100644
--- a/src/mess/drivers/multi16.c
+++ b/src/mess/drivers/multi16.c
@@ -127,21 +127,6 @@ void multi16_state::machine_reset()
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
static MACHINE_CONFIG_START( multi16, multi16_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8086, 8000000)
@@ -160,8 +145,11 @@ static MACHINE_CONFIG_START( multi16, multi16_state )
MCFG_PALETTE_ADD("palette", 8)
- /* Devices */
- MCFG_MC6845_ADD("crtc", H46505, "screen", 16000000/5, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ /* devices */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", 16000000/5) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+
MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), GND, NULL )
MACHINE_CONFIG_END
diff --git a/src/mess/drivers/multi8.c b/src/mess/drivers/multi8.c
index 28f5ec2b586..3c01000b25e 100644
--- a/src/mess/drivers/multi8.c
+++ b/src/mess/drivers/multi8.c
@@ -560,21 +560,6 @@ static GFXDECODE_START( multi8 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
PALETTE_INIT_MEMBER(multi8_state, multi8)
{
UINT8 i;
@@ -676,9 +661,12 @@ static MACHINE_CONFIG_START( multi8, multi8_state )
MCFG_SOUND_ADD("beeper", BEEP, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono",0.50)
- /* Devices */
+ /* devices */
MCFG_TIMER_DRIVER_ADD_PERIODIC("keyboard_timer", multi8_state, keyboard_callback, attotime::from_hz(240/32))
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_3_579545MHz/2, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_3_579545MHz/2) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_DEVICE_ADD("ppi8255_0", I8255, 0)
MCFG_I8255_IN_PORTA_CB(READ8(multi8_state, porta_r))
diff --git a/src/mess/drivers/mx2178.c b/src/mess/drivers/mx2178.c
index 6a46dc37c42..18fb00807dc 100644
--- a/src/mess/drivers/mx2178.c
+++ b/src/mess/drivers/mx2178.c
@@ -41,6 +41,7 @@ public:
DECLARE_READ8_MEMBER(keyin_r);
DECLARE_WRITE8_MEMBER(kbd_put);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
+ MC6845_UPDATE_ROW(crtc_update_row);
const UINT8 *m_p_chargen;
required_shared_ptr<UINT8> m_p_videoram;
@@ -96,10 +97,9 @@ WRITE8_MEMBER( mx2178_state::kbd_put )
m_maincpu->set_input_line(0, HOLD_LINE);
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( mx2178_state::crtc_update_row )
{
- mx2178_state *state = device->machine().driver_data<mx2178_state>();
- const rgb_t *pens = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *pens = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -107,10 +107,10 @@ static MC6845_UPDATE_ROW( update_row )
for (x = 0; x < x_count; x++)
{
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
+ chr = m_p_videoram[mem];
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_chargen[(chr<<4) | ra] ^ ((x == cursor_x) ? 0xff : 0);
+ gfx = m_p_chargen[(chr<<4) | ra] ^ ((x == cursor_x) ? 0xff : 0);
/* Display a scanline of a character (8 pixels) */
*p++ = pens[BIT(gfx, 7)];
@@ -124,21 +124,6 @@ static MC6845_UPDATE_ROW( update_row )
}
}
-static MC6845_INTERFACE( crtc_interface )
-{
- false,
- 0,0,0,0,
- 8,
- NULL,
- update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
/* F4 Character Displayer */
static const gfx_layout mx2178_charlayout =
{
@@ -185,7 +170,10 @@ static MACHINE_CONFIG_START( mx2178, mx2178_state )
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
/* Devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 18869600 / 8, crtc_interface) // clk unknown
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 18869600 / 8) // clk unknown
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(mx2178_state, crtc_update_row)
MCFG_DEVICE_ADD("acia", ACIA6850, 0)
diff --git a/src/mess/drivers/myb3k.c b/src/mess/drivers/myb3k.c
index fd64e59cb91..f90339d3400 100644
--- a/src/mess/drivers/myb3k.c
+++ b/src/mess/drivers/myb3k.c
@@ -233,22 +233,6 @@ static GFXDECODE_START( myb3k )
GFXDECODE_ENTRY( "ipl", 0x0000, myb3k_charlayout, 0, 1 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
static const wd17xx_interface myb3k_wd17xx_interface =
{
DEVCB_NULL,
@@ -291,7 +275,10 @@ static MACHINE_CONFIG_START( myb3k, myb3k_state )
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
/* Devices */
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_3_579545MHz/4, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_3_579545MHz/4) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+
MCFG_MB8877_ADD("fdc", myb3k_wd17xx_interface ) //unknown type
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(myb3k_floppy_interface)
MACHINE_CONFIG_END
diff --git a/src/mess/drivers/mycom.c b/src/mess/drivers/mycom.c
index f73dab885df..e275b06e37b 100644
--- a/src/mess/drivers/mycom.c
+++ b/src/mess/drivers/mycom.c
@@ -93,6 +93,7 @@ public:
DECLARE_DRIVER_INIT(mycom);
TIMER_DEVICE_CALLBACK_MEMBER(mycom_kbd);
DECLARE_WRITE8_MEMBER(mycom_rtc_w);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT8 *m_p_videoram;
UINT8 *m_p_chargen;
UINT8 m_0a;
@@ -130,22 +131,21 @@ void mycom_state::video_start()
m_p_chargen = memregion("chargen")->base();
}
-static MC6845_UPDATE_ROW( mycom_update_row )
+MC6845_UPDATE_ROW( mycom_state::crtc_update_row )
{
- mycom_state *state = device->machine().driver_data<mycom_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx=0,z;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
- if (state->m_0a & 0x40)
+ if (m_0a & 0x40)
{
for (x = 0; x < x_count; x++) // lores pixels
{
UINT8 dbit=1;
if (x == cursor_x) dbit=0;
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
+ chr = m_p_videoram[mem];
z = ra / 3;
*p++ = palette[BIT( chr, z ) ? dbit: dbit^1];
*p++ = palette[BIT( chr, z ) ? dbit: dbit^1];
@@ -169,8 +169,8 @@ static MC6845_UPDATE_ROW( mycom_update_row )
gfx = inv; // some blank spacing lines
else
{
- chr = state->m_p_videoram[mem];
- gfx = state->m_p_chargen[(chr<<3) | ra] ^ inv;
+ chr = m_p_videoram[mem];
+ gfx = m_p_chargen[(chr<<3) | ra] ^ inv;
}
/* Display a scanline of a character */
@@ -339,21 +339,6 @@ static GFXDECODE_START( mycom )
GFXDECODE_ENTRY( "chargen", 0x0000, mycom_charlayout, 0, 1 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- mycom_update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
WRITE8_MEMBER( mycom_state::mycom_04_w )
{
m_i_videoram = (m_i_videoram & 0x700) | data;
@@ -549,7 +534,10 @@ static MACHINE_CONFIG_START( mycom, mycom_state )
/* Manual states clock is 1.008mhz for 40 cols, and 2.016 mhz for 80 cols.
The CRTC is a HD46505S - same as a 6845. The start registers need to be readable. */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 1008000, mc6845_intf)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 1008000)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(mycom_state, crtc_update_row)
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mess/drivers/paso1600.c b/src/mess/drivers/paso1600.c
index a950482813f..3720c89acdf 100644
--- a/src/mess/drivers/paso1600.c
+++ b/src/mess/drivers/paso1600.c
@@ -271,21 +271,6 @@ static GFXDECODE_START( paso1600 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
void paso1600_state::machine_start()
{
}
@@ -333,8 +318,12 @@ static MACHINE_CONFIG_START( paso1600, paso1600_state )
// MCFG_PALETTE_INIT(black_and_white)
/* Devices */
- MCFG_MC6845_ADD("crtc", H46505, "screen", 16000000/4, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", 16000000/4) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+
MCFG_PIC8259_ADD( "pic8259", INPUTLINE("maincpu", 0), GND, NULL )
+
MCFG_DEVICE_ADD("8237dma", AM9517A, 16000000/4)
MCFG_I8237_IN_MEMR_CB(READ8(paso1600_state, pc_dma_read_byte))
MCFG_I8237_OUT_MEMW_CB(WRITE8(paso1600_state, pc_dma_write_byte))
diff --git a/src/mess/drivers/pasopia.c b/src/mess/drivers/pasopia.c
index b9b7ca2e94a..e8a1a33123d 100644
--- a/src/mess/drivers/pasopia.c
+++ b/src/mess/drivers/pasopia.c
@@ -58,6 +58,7 @@ public:
DECLARE_READ8_MEMBER(mux_r);
DECLARE_READ8_MEMBER(keyb_r);
DECLARE_WRITE8_MEMBER(mux_w);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT8 m_hblank;
UINT16 m_vram_addr;
@@ -85,11 +86,10 @@ void pasopia_state::video_start()
{
}
-MC6845_UPDATE_ROW( pasopia_update_row )
+MC6845_UPDATE_ROW( pasopia_state::crtc_update_row )
{
- pasopia_state *state = device->machine().driver_data<pasopia_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
- UINT8 *m_p_chargen = state->memregion("chargen")->base();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *m_p_chargen = memregion("chargen")->base();
UINT8 chr,gfx,fg=7,bg=0; // colours need to be determined
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -99,7 +99,7 @@ MC6845_UPDATE_ROW( pasopia_update_row )
UINT8 inv=0;
if (x == cursor_x) inv=0xff;
mem = (ma + x) & 0xfff;
- chr = state->m_p_vram[mem];
+ chr = m_p_vram[mem];
/* get pattern of pixels for that character scanline */
gfx = m_p_chargen[(chr<<3) | ra] ^ inv;
@@ -253,21 +253,6 @@ WRITE8_MEMBER( pasopia_state::mux_w )
m_mux_data = data;
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- pasopia_update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
static const gfx_layout p7_chars_8x8 =
{
8,8,
@@ -313,7 +298,6 @@ static MACHINE_CONFIG_START( pasopia, pasopia_state )
MCFG_CPU_IO_MAP(pasopia_io)
MCFG_CPU_CONFIG(pasopia_daisy)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -325,7 +309,10 @@ static MACHINE_CONFIG_START( pasopia, pasopia_state )
MCFG_PALETTE_ADD("palette", 8)
/* Devices */
- MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_4MHz/4, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", XTAL_4MHz/4) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(pasopia_state, crtc_update_row)
MCFG_DEVICE_ADD("ppi8255_0", I8255A, 0)
MCFG_I8255_OUT_PORTA_CB(WRITE8(pasopia_state, vram_addr_lo_w))
diff --git a/src/mess/drivers/pasopia7.c b/src/mess/drivers/pasopia7.c
index c2631be19d8..77e4de73dc7 100644
--- a/src/mess/drivers/pasopia7.c
+++ b/src/mess/drivers/pasopia7.c
@@ -729,21 +729,6 @@ static GFXDECODE_START( pasopia7 )
GFXDECODE_ENTRY( "kanji", 0x00000, p7_chars_16x16, 0, 0x10 )
GFXDECODE_END
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
READ8_MEMBER( pasopia7_state::mux_r )
{
return m_mux_data;
@@ -998,7 +983,9 @@ static MACHINE_CONFIG_DERIVED( p7_raster, p7_base )
MCFG_PALETTE_INIT_OWNER(pasopia7_state,p7_raster)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", pasopia7 )
- MCFG_MC6845_ADD("crtc", H46505, "screen", VDP_CLOCK, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", VDP_CLOCK) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MACHINE_CONFIG_END
@@ -1016,7 +1003,10 @@ static MACHINE_CONFIG_DERIVED( p7_lcd, p7_base )
MCFG_PALETTE_INIT_OWNER(pasopia7_state,p7_lcd)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", pasopia7 )
- MCFG_MC6845_ADD("crtc", H46505, "screen", LCD_CLOCK, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", LCD_CLOCK) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+
MCFG_DEFAULT_LAYOUT( layout_lcd )
MACHINE_CONFIG_END
diff --git a/src/mess/drivers/pet.c b/src/mess/drivers/pet.c
index 40e3be08520..5baa372c11a 100644
--- a/src/mess/drivers/pet.c
+++ b/src/mess/drivers/pet.c
@@ -1071,22 +1071,19 @@ UINT32 pet_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, con
//-------------------------------------------------
-// MC6845_INTERFACE( crtc_intf )
+// MC6845 PET80
//-------------------------------------------------
-static MC6845_BEGIN_UPDATE( pet_begin_update )
+MC6845_BEGIN_UPDATE( pet_state::pet_begin_update )
{
bitmap.fill(rgb_t::black);
-
- return 0;
}
-static MC6845_UPDATE_ROW( pet80_update_row )
+MC6845_UPDATE_ROW( pet80_state::pet80_update_row )
{
- pet80_state *state = device->machine().driver_data<pet80_state>();
int x = 0;
- int char_rom_mask = state->m_char_rom->bytes() - 1;
- const pen_t *pen = state->m_palette->pens();
+ int char_rom_mask = m_char_rom->bytes() - 1;
+ const pen_t *pen = m_palette->pens();
hbp = 80;
for (int column = 0; column < x_count; column++)
@@ -1099,10 +1096,10 @@ static MC6845_UPDATE_ROW( pet80_update_row )
// even character
- lsd = state->m_video_ram[((ma + column) << 1) & 0x7ff];
+ lsd = m_video_ram[((ma + column) << 1) & 0x7ff];
- offs_t char_addr = (chr_option << 11) | (state->m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
- data = state->m_char_rom->base()[char_addr & char_rom_mask];
+ offs_t char_addr = (chr_option << 11) | (m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
+ data = m_char_rom->base()[char_addr & char_rom_mask];
for (int bit = 0; bit < 8; bit++, data <<= 1)
{
@@ -1112,10 +1109,10 @@ static MC6845_UPDATE_ROW( pet80_update_row )
// odd character
- lsd = state->m_video_ram[(((ma + column) << 1) + 1) & 0x7ff];
+ lsd = m_video_ram[(((ma + column) << 1) + 1) & 0x7ff];
- char_addr = (chr_option << 11) | (state->m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
- data = state->m_char_rom->base()[char_addr & char_rom_mask];
+ char_addr = (chr_option << 11) | (m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
+ data = m_char_rom->base()[char_addr & char_rom_mask];
for (int bit = 0; bit < 8; bit++, data <<= 1)
{
@@ -1125,32 +1122,16 @@ static MC6845_UPDATE_ROW( pet80_update_row )
}
}
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 2*8,
- pet_begin_update,
- pet80_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DEVICE_LINE_MEMBER(M6520_1_TAG, pia6821_device, cb1_w),
- NULL
-};
-
//-------------------------------------------------
-// MC6845_INTERFACE( pet40_crtc_intf )
+// MC6845 PET40
//-------------------------------------------------
-static MC6845_UPDATE_ROW( pet40_update_row )
+MC6845_UPDATE_ROW( pet_state::pet40_update_row )
{
- pet_state *state = device->machine().driver_data<pet_state>();
int x = 0;
- int char_rom_mask = state->m_char_rom->bytes() - 1;
- const pen_t *pen = state->m_palette->pens();
+ int char_rom_mask = m_char_rom->bytes() - 1;
+ const pen_t *pen = m_palette->pens();
hbp = 41;
for (int column = 0; column < x_count; column++)
@@ -1161,10 +1142,10 @@ static MC6845_UPDATE_ROW( pet40_update_row )
int invert = BIT(ma, 12);
int chr_option = BIT(ma, 13);
- lsd = state->m_video_ram[(ma + column) & 0x3ff];
+ lsd = m_video_ram[(ma + column) & 0x3ff];
- offs_t char_addr = (chr_option << 11) | (state->m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
- data = state->m_char_rom->base()[char_addr & char_rom_mask];
+ offs_t char_addr = (chr_option << 11) | (m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
+ data = m_char_rom->base()[char_addr & char_rom_mask];
for (int bit = 0; bit < 8; bit++, data <<= 1)
{
@@ -1174,32 +1155,16 @@ static MC6845_UPDATE_ROW( pet40_update_row )
}
}
-static MC6845_INTERFACE( pet40_crtc_intf )
-{
- true,
- 0,0,0,0,
- 8,
- pet_begin_update,
- pet40_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DEVICE_LINE_MEMBER(M6520_1_TAG, pia6821_device, cb1_w),
- NULL
-};
-
//-------------------------------------------------
-// MC6845_INTERFACE( cbm8296_crtc_intf )
+// MC6845 CBM8296
//-------------------------------------------------
-static MC6845_UPDATE_ROW( cbm8296_update_row )
+MC6845_UPDATE_ROW( pet80_state::cbm8296_update_row )
{
- pet80_state *state = device->machine().driver_data<pet80_state>();
int x = 0;
- int char_rom_mask = state->m_char_rom->bytes() - 1;
- const pen_t *pen = state->m_palette->pens();
+ int char_rom_mask = m_char_rom->bytes() - 1;
+ const pen_t *pen = m_palette->pens();
for (int column = 0; column < x_count; column++)
{
@@ -1213,10 +1178,10 @@ static MC6845_UPDATE_ROW( cbm8296_update_row )
// even character
- lsd = state->m_ram->pointer()[drma];
+ lsd = m_ram->pointer()[drma];
- offs_t char_addr = (chr_option << 11) | (state->m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
- data = state->m_char_rom->base()[char_addr & char_rom_mask];
+ offs_t char_addr = (chr_option << 11) | (m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
+ data = m_char_rom->base()[char_addr & char_rom_mask];
for (int bit = 0; bit < 8; bit++, data <<= 1)
{
@@ -1226,10 +1191,10 @@ static MC6845_UPDATE_ROW( cbm8296_update_row )
// odd character
- lsd = state->m_ram->pointer()[drma | 0x100];
+ lsd = m_ram->pointer()[drma | 0x100];
- char_addr = (chr_option << 11) | (state->m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
- data = state->m_char_rom->base()[char_addr & char_rom_mask];
+ char_addr = (chr_option << 11) | (m_graphic << 10) | ((lsd & 0x7f) << 3) | rra;
+ data = m_char_rom->base()[char_addr & char_rom_mask];
for (int bit = 0; bit < 8; bit++, data <<= 1)
{
@@ -1239,21 +1204,6 @@ static MC6845_UPDATE_ROW( cbm8296_update_row )
}
}
-static MC6845_INTERFACE( cbm8296_crtc_intf )
-{
- true,
- 0,0,0,0,
- 2*8,
- NULL,
- cbm8296_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DEVICE_LINE_MEMBER(M6520_1_TAG, pia6821_device, cb1_w),
- NULL
-};
-
//-------------------------------------------------
// SLOT_INTERFACE( cbm8296d_ieee488_devices )
@@ -1738,7 +1688,13 @@ static MACHINE_CONFIG_DERIVED( pet4032f, pet4000 )
MCFG_SCREEN_VISIBLE_AREA(0, 320 - 1, 0, 250 - 1)
MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
MCFG_DEVICE_REMOVE("sync_timer")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/16, pet40_crtc_intf)
+
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/16)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(pet_state, pet_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(pet_state, pet40_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(DEVWRITELINE(M6520_1_TAG, pia6821_device, cb1_w))
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -1804,7 +1760,13 @@ static MACHINE_CONFIG_DERIVED( cbm4032f, cbm4000 )
MCFG_SCREEN_VISIBLE_AREA(0, 320 - 1, 0, 250 - 1)
MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
MCFG_DEVICE_REMOVE("sync_timer")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/16, pet40_crtc_intf)
+
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/16)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(pet_state, pet_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(pet_state, pet40_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(DEVWRITELINE(M6520_1_TAG, pia6821_device, cb1_w))
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
@@ -1880,7 +1842,13 @@ static MACHINE_CONFIG_START( pet80, pet80_state )
MCFG_SCREEN_SIZE(640, 250)
MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 250 - 1)
MCFG_SCREEN_UPDATE_DEVICE(MC6845_TAG, mc6845_device, screen_update)
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/16, crtc_intf)
+
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/16)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(2*8)
+ MCFG_MC6845_BEGIN_UPDATE_CB(pet_state, pet_begin_update)
+ MCFG_MC6845_UPDATE_ROW_CB(pet80_state, pet80_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(DEVWRITELINE(M6520_1_TAG, pia6821_device, cb1_w))
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
@@ -2006,8 +1974,12 @@ static MACHINE_CONFIG_DERIVED_CLASS( cbm8296, pet80, cbm8296_state )
MCFG_PLS100_ADD(PLA1_TAG)
MCFG_PLS100_ADD(PLA2_TAG)
- MCFG_DEVICE_MODIFY(MC6845_TAG)
- MCFG_DEVICE_CONFIG(cbm8296_crtc_intf)
+ MCFG_DEVICE_REMOVE(MC6845_TAG)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_16MHz/16)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(2*8)
+ MCFG_MC6845_UPDATE_ROW_CB(pet80_state, cbm8296_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(DEVWRITELINE(M6520_1_TAG, pia6821_device, cb1_w))
MCFG_DEVICE_MODIFY("ieee8")
MCFG_SLOT_DEFAULT_OPTION("c8250")
diff --git a/src/mess/drivers/pyl601.c b/src/mess/drivers/pyl601.c
index 26528a254c0..005928fd647 100644
--- a/src/mess/drivers/pyl601.c
+++ b/src/mess/drivers/pyl601.c
@@ -77,6 +77,8 @@ public:
DECLARE_WRITE8_MEMBER(led_w);
DECLARE_WRITE8_MEMBER(floppy_w);
DECLARE_READ8_MEMBER(floppy_r);
+ MC6845_UPDATE_ROW(pyl601_update_row);
+ MC6845_UPDATE_ROW(pyl601a_update_row);
UINT8 selectedline(UINT16 data);
required_device<speaker_sound_device> m_speaker;
required_device<upd765a_device> m_fdc;
@@ -383,19 +385,18 @@ void pyl601_state::video_start()
{
}
-static MC6845_UPDATE_ROW( pyl601_update_row )
+MC6845_UPDATE_ROW( pyl601_state::pyl601_update_row )
{
- pyl601_state *state = device->machine().driver_data<pyl601_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
- UINT8 *charrom = state->memregion("chargen")->base();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *charrom = memregion("chargen")->base();
int column, bit, i;
UINT8 data;
- if (BIT(state->m_video_mode, 5) == 0)
+ if (BIT(m_video_mode, 5) == 0)
{
for (column = 0; column < x_count; column++)
{
- UINT8 code = state->m_ram->pointer()[(((ma + column) & 0x0fff) + 0xf000)];
+ UINT8 code = m_ram->pointer()[(((ma + column) & 0x0fff) + 0xf000)];
code = ((code << 1) | (code >> 7)) & 0xff;
if (column == cursor_x-2)
data = 0xff;
@@ -416,7 +417,7 @@ static MC6845_UPDATE_ROW( pyl601_update_row )
{
for (i = 0; i < x_count; i++)
{
- data = state->m_ram->pointer()[(((ma + i) << 3) | (ra & 0x07)) & 0xffff];
+ data = m_ram->pointer()[(((ma + i) << 3) | (ra & 0x07)) & 0xffff];
for (bit = 0; bit < 8; bit++)
{
bitmap.pix32(y, (i * 8) + bit) = palette[BIT(data, 7)];
@@ -426,19 +427,18 @@ static MC6845_UPDATE_ROW( pyl601_update_row )
}
}
-static MC6845_UPDATE_ROW( pyl601a_update_row )
+MC6845_UPDATE_ROW( pyl601_state::pyl601a_update_row )
{
- pyl601_state *state = device->machine().driver_data<pyl601_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
- UINT8 *charrom = state->memregion("chargen")->base();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *charrom = memregion("chargen")->base();
int column, bit, i;
UINT8 data;
- if (BIT(state->m_video_mode, 5) == 0)
+ if (BIT(m_video_mode, 5) == 0)
{
for (column = 0; column < x_count; column++)
{
- UINT8 code = state->m_ram->pointer()[(((ma + column) & 0x0fff) + 0xf000)];
+ UINT8 code = m_ram->pointer()[(((ma + column) & 0x0fff) + 0xf000)];
data = charrom[((code << 4) | (ra & 0x07)) & 0xfff];
if (column == cursor_x)
data = 0xff;
@@ -457,7 +457,7 @@ static MC6845_UPDATE_ROW( pyl601a_update_row )
{
for (i = 0; i < x_count; i++)
{
- data = state->m_ram->pointer()[(((ma + i) << 3) | (ra & 0x07)) & 0xffff];
+ data = m_ram->pointer()[(((ma + i) << 3) | (ra & 0x07)) & 0xffff];
for (bit = 0; bit < 8; bit++)
{
bitmap.pix32(y, (i * 8) + bit) = palette[BIT(data, 7)];
@@ -469,36 +469,6 @@ static MC6845_UPDATE_ROW( pyl601a_update_row )
-static MC6845_INTERFACE( pyl601_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8 /*?*/,
- NULL,
- pyl601_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
-static MC6845_INTERFACE( pyl601a_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8 /*?*/,
- NULL,
- pyl601a_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
DRIVER_INIT_MEMBER(pyl601_state,pyl601)
{
memset(m_ram->pointer(), 0, 64 * 1024);
@@ -559,7 +529,6 @@ static MACHINE_CONFIG_START( pyl601, pyl601_state )
MCFG_CPU_PROGRAM_MAP(pyl601_mem)
MCFG_CPU_VBLANK_INT_DRIVER("screen", pyl601_state, pyl601_interrupt)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
@@ -576,7 +545,11 @@ static MACHINE_CONFIG_START( pyl601, pyl601_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* Devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_2MHz, pyl601_crtc6845_interface)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_2MHz)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /* ? */
+ MCFG_MC6845_UPDATE_ROW_CB(pyl601_state, pyl601_update_row)
+
MCFG_UPD765A_ADD("upd765", true, true)
MCFG_FLOPPY_DRIVE_ADD("upd765:0", pyl601_floppies, "525hd", pyl601_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("upd765:1", pyl601_floppies, "525hd", pyl601_state::floppy_formats)
@@ -592,8 +565,12 @@ static MACHINE_CONFIG_DERIVED( pyl601a, pyl601 )
MCFG_CPU_CLOCK( XTAL_2MHz)
MCFG_GFXDECODE_MODIFY("gfxdecode", pyl601a)
+
MCFG_DEVICE_REMOVE("crtc")
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_2MHz, pyl601a_crtc6845_interface)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_2MHz)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /* ? */
+ MCFG_MC6845_UPDATE_ROW_CB(pyl601_state, pyl601a_update_row)
MACHINE_CONFIG_END
/* ROM definition */
diff --git a/src/mess/drivers/sapi1.c b/src/mess/drivers/sapi1.c
index 1091b55501c..b41318516c4 100644
--- a/src/mess/drivers/sapi1.c
+++ b/src/mess/drivers/sapi1.c
@@ -73,6 +73,7 @@ public:
DECLARE_DRIVER_INIT(sapizps3b);
DECLARE_MACHINE_RESET(sapi1);
DECLARE_MACHINE_RESET(sapizps3);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT32 screen_update_sapi1(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_sapi3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
private:
@@ -407,10 +408,9 @@ UINT32 sapi1_state::screen_update_sapi3(screen_device &screen, bitmap_ind16 &bit
return 0;
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( sapi1_state::crtc_update_row )
{
- sapi1_state *state = device->machine().driver_data<sapi1_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx,inv;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -420,7 +420,7 @@ static MC6845_UPDATE_ROW( update_row )
inv = gfx = 0;
if (x == cursor_x) inv ^= 0xff;
mem = (2*(ma + x)) & 0xfff;
- chr = state->m_p_videoram[mem] & 0x3f;
+ chr = m_p_videoram[mem] & 0x3f;
if (ra < 8)
gfx = MHB2501[(chr<<3) | ra] ^ inv;
@@ -435,23 +435,6 @@ static MC6845_UPDATE_ROW( update_row )
}
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 6, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
-
-
/**************************************
Keyboard
@@ -598,7 +581,12 @@ static MACHINE_CONFIG_DERIVED( sapi3b, sapi3 )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_PROGRAM_MAP(sapi3b_mem)
MCFG_CPU_IO_MAP(sapi3b_io)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 1008000, mc6845_intf) // guess
+
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 1008000) // guess
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(6)
+ MCFG_MC6845_UPDATE_ROW_CB(sapi1_state, crtc_update_row)
+
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DEVICE("crtc", mc6845_device, screen_update)
MCFG_SCREEN_NO_PALETTE
diff --git a/src/mess/drivers/smc777.c b/src/mess/drivers/smc777.c
index 199823d4dc3..b4637015beb 100644
--- a/src/mess/drivers/smc777.c
+++ b/src/mess/drivers/smc777.c
@@ -1003,21 +1003,6 @@ void smc777_state::machine_reset()
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- true, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
/* set-up SMC-70 mode colors */
PALETTE_INIT_MEMBER(smc777_state, smc777)
{
@@ -1096,7 +1081,9 @@ static MACHINE_CONFIG_START( smc777, smc777_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty)
- MCFG_MC6845_ADD("crtc", H46505, "screen", MASTER_CLOCK/2, mc6845_intf) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_ADD("crtc", H46505, "screen", MASTER_CLOCK/2) /* unknown clock, hand tuned to get ~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_MB8876_ADD("fdc",smc777_mb8876_interface)
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(smc777_floppy_interface)
diff --git a/src/mess/drivers/super80.c b/src/mess/drivers/super80.c
index 761ec55c3f3..4f6bc687157 100644
--- a/src/mess/drivers/super80.c
+++ b/src/mess/drivers/super80.c
@@ -656,21 +656,6 @@ static const cassette_interface super80_cassette_interface =
};
-static MC6845_INTERFACE( super80v_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- SUPER80V_DOTS, /* number of dots per character */
- NULL,
- super80v_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
//-------------------------------------------------
// Z80DMA
//-------------------------------------------------
@@ -812,7 +797,10 @@ static MACHINE_CONFIG_START( super80v, super80_state )
MCFG_PALETTE_ADD("palette", 32)
MCFG_PALETTE_INIT_OWNER(super80_state,super80m)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK / SUPER80V_DOTS, super80v_crtc)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", MASTER_CLOCK / SUPER80V_DOTS)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(SUPER80V_DOTS)
+ MCFG_MC6845_UPDATE_ROW_CB(super80_state, crtc_update_row)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", super80v)
MCFG_DEFAULT_LAYOUT( layout_super80 )
diff --git a/src/mess/drivers/svi318.c b/src/mess/drivers/svi318.c
index 3abefa1d5cc..9b2f621e195 100644
--- a/src/mess/drivers/svi318.c
+++ b/src/mess/drivers/svi318.c
@@ -389,21 +389,6 @@ static MACHINE_CONFIG_DERIVED( svi328n, svi318n )
MACHINE_CONFIG_END
-static MC6845_INTERFACE( svi806_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8 /*?*/,
- NULL,
- svi806_crtc6845_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
/* F4 Character Displayer */
static const gfx_layout svi328_charlayout =
{
@@ -460,7 +445,10 @@ static MACHINE_CONFIG_START( svi328_806, svi318_state )
MCFG_GFXDECODE_ADD("gfxdecode", "palette", svi328)
- MCFG_MC6845_ADD("crtc", MC6845, "svi806", XTAL_12MHz / 8, svi806_crtc6845_interface)
+ MCFG_MC6845_ADD("crtc", MC6845, "svi806", XTAL_12MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /* ? */
+ MCFG_MC6845_UPDATE_ROW_CB(svi318_state, crtc_update_row)
MCFG_VIDEO_START_OVERRIDE(svi318_state, svi328_806 )
diff --git a/src/mess/drivers/tavernie.c b/src/mess/drivers/tavernie.c
index 6dd97bb79e3..511201e2ed1 100644
--- a/src/mess/drivers/tavernie.c
+++ b/src/mess/drivers/tavernie.c
@@ -92,6 +92,7 @@ public:
DECLARE_MACHINE_RESET(cpu09);
DECLARE_MACHINE_RESET(ivg09);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
+ MC6845_UPDATE_ROW(crtc_update_row);
const UINT8 *m_p_chargen;
optional_shared_ptr<UINT8> m_p_videoram;
@@ -206,10 +207,9 @@ WRITE8_MEMBER( tavernie_state::ds_w )
}
-static MC6845_UPDATE_ROW( update_row )
+MC6845_UPDATE_ROW( tavernie_state::crtc_update_row )
{
- tavernie_state *state = device->machine().driver_data<tavernie_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx=0;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -223,8 +223,8 @@ static MC6845_UPDATE_ROW( update_row )
gfx = inv; // some blank spacing lines
else
{
- chr = state->m_p_videoram[mem];
- gfx = state->m_p_chargen[(chr<<4) | ra] ^ inv;
+ chr = m_p_videoram[mem];
+ gfx = m_p_chargen[(chr<<4) | ra] ^ inv;
}
/* Display a scanline of a character */
@@ -239,21 +239,6 @@ static MC6845_UPDATE_ROW( update_row )
}
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- update_row, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
READ8_MEMBER( tavernie_state::pa_r )
{
@@ -381,7 +366,11 @@ static MACHINE_CONFIG_DERIVED( ivg09, cpu09 )
/* Devices */
MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(tavernie_state, kbd_put))
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 1008000, mc6845_intf) // unknown clock
+
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 1008000) // unknown clock
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(tavernie_state, crtc_update_row)
MCFG_DEVICE_ADD("pia_ivg", PIA6821, 0)
MCFG_PIA_READPB_HANDLER(READ8(tavernie_state, pb_ivg_r))
diff --git a/src/mess/drivers/trs80m2.c b/src/mess/drivers/trs80m2.c
index 9f71593d172..86a7771774b 100644
--- a/src/mess/drivers/trs80m2.c
+++ b/src/mess/drivers/trs80m2.c
@@ -380,18 +380,17 @@ INPUT_PORTS_END
// VIDEO
//**************************************************************************
-static MC6845_UPDATE_ROW( trs80m2_update_row )
+MC6845_UPDATE_ROW( trs80m2_state::crtc_update_row )
{
- trs80m2_state *state = device->machine().driver_data<trs80m2_state>();
- const pen_t *pen = state->m_palette->pens();
+ const pen_t *pen = m_palette->pens();
int x = 0;
for (int column = 0; column < x_count; column++)
{
- UINT8 code = state->m_video_ram[(ma + column) & 0x7ff];
+ UINT8 code = m_video_ram[(ma + column) & 0x7ff];
offs_t address = ((code & 0x7f) << 4) | (ra & 0x0f);
- UINT8 data = state->m_char_rom->base()[address];
+ UINT8 data = m_char_rom->base()[address];
int dcursor = (column == cursor_x);
int drevid = BIT(code, 7);
@@ -427,21 +426,6 @@ WRITE_LINE_MEMBER( trs80m2_state::vsync_w )
}
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- trs80m2_update_row,
- NULL,
- DEVCB_DRIVER_LINE_MEMBER(trs80m2_state, de_w),
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(trs80m2_state, vsync_w),
- NULL
-};
-
void trs80m2_state::video_start()
{
// allocate memory
@@ -734,7 +718,12 @@ static MACHINE_CONFIG_START( trs80m2, trs80m2_state )
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_12_48MHz/8, mc6845_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_12_48MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(trs80m2_state, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(trs80m2_state, de_w))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(trs80m2_state, vsync_w))
// devices
MCFG_FD1791x_ADD(FD1791_TAG, XTAL_8MHz/4)
@@ -819,7 +808,12 @@ static MACHINE_CONFIG_START( trs80m16, trs80m16_state )
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_12_48MHz/8, mc6845_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, XTAL_12_48MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(trs80m2_state, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(trs80m2_state, de_w))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(trs80m2_state, vsync_w))
// devices
MCFG_FD1791x_ADD(FD1791_TAG, XTAL_8MHz/4)
diff --git a/src/mess/drivers/tvc.c b/src/mess/drivers/tvc.c
index 47230c3bb87..ead91f0c9e5 100644
--- a/src/mess/drivers/tvc.c
+++ b/src/mess/drivers/tvc.c
@@ -510,29 +510,28 @@ void tvc_state::machine_reset()
membank("bank2")->set_base(m_ram->pointer() + 0x4000);
}
-static MC6845_UPDATE_ROW( tvc_update_row )
+MC6845_UPDATE_ROW( tvc_state::crtc_update_row )
{
- tvc_state *state = device->machine().driver_data<tvc_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
- UINT8 *vram = state->memregion("vram")->base() + ((state->m_vram_bank & 0x30)<<10);
+ UINT8 *vram = memregion("vram")->base() + ((m_vram_bank & 0x30)<<10);
UINT16 offset = ((ma*4 + ra*0x40) & 0x3fff);
int i;
- switch(state->m_video_mode) {
+ switch(m_video_mode) {
case 0 :
// 2 colors mode
for ( i = 0; i < x_count; i++ )
{
UINT8 data = vram[offset + i];
- *p++ = palette[state->m_col[BIT(data,7)]];
- *p++ = palette[state->m_col[BIT(data,6)]];
- *p++ = palette[state->m_col[BIT(data,5)]];
- *p++ = palette[state->m_col[BIT(data,4)]];
- *p++ = palette[state->m_col[BIT(data,3)]];
- *p++ = palette[state->m_col[BIT(data,2)]];
- *p++ = palette[state->m_col[BIT(data,1)]];
- *p++ = palette[state->m_col[BIT(data,0)]];
+ *p++ = palette[m_col[BIT(data,7)]];
+ *p++ = palette[m_col[BIT(data,6)]];
+ *p++ = palette[m_col[BIT(data,5)]];
+ *p++ = palette[m_col[BIT(data,4)]];
+ *p++ = palette[m_col[BIT(data,3)]];
+ *p++ = palette[m_col[BIT(data,2)]];
+ *p++ = palette[m_col[BIT(data,1)]];
+ *p++ = palette[m_col[BIT(data,0)]];
}
break;
case 1 :
@@ -541,14 +540,14 @@ static MC6845_UPDATE_ROW( tvc_update_row )
for ( i = 0; i < x_count; i++ )
{
UINT8 data = vram[offset + i];
- *p++ = palette[state->m_col[BIT(data,3)*2 + BIT(data,7)]];
- *p++ = palette[state->m_col[BIT(data,3)*2 + BIT(data,7)]];
- *p++ = palette[state->m_col[BIT(data,2)*2 + BIT(data,6)]];
- *p++ = palette[state->m_col[BIT(data,2)*2 + BIT(data,6)]];
- *p++ = palette[state->m_col[BIT(data,1)*2 + BIT(data,5)]];
- *p++ = palette[state->m_col[BIT(data,1)*2 + BIT(data,5)]];
- *p++ = palette[state->m_col[BIT(data,0)*2 + BIT(data,4)]];
- *p++ = palette[state->m_col[BIT(data,0)*2 + BIT(data,4)]];
+ *p++ = palette[m_col[BIT(data,3)*2 + BIT(data,7)]];
+ *p++ = palette[m_col[BIT(data,3)*2 + BIT(data,7)]];
+ *p++ = palette[m_col[BIT(data,2)*2 + BIT(data,6)]];
+ *p++ = palette[m_col[BIT(data,2)*2 + BIT(data,6)]];
+ *p++ = palette[m_col[BIT(data,1)*2 + BIT(data,5)]];
+ *p++ = palette[m_col[BIT(data,1)*2 + BIT(data,5)]];
+ *p++ = palette[m_col[BIT(data,0)*2 + BIT(data,4)]];
+ *p++ = palette[m_col[BIT(data,0)*2 + BIT(data,4)]];
}
break;
default:
@@ -633,21 +632,6 @@ QUICKLOAD_LOAD_MEMBER( tvc_state,tvc64)
}
-static MC6845_INTERFACE( tvc_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8 /*?*/,
- NULL,
- tvc_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(tvc_state, tvc_int_ff_set),
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
static const cassette_interface tvc_cassette_interface =
{
tvc64_cassette_formats,
@@ -679,7 +663,11 @@ static MACHINE_CONFIG_START( tvc, tvc_state )
MCFG_PALETTE_ADD( "palette", 16 )
MCFG_PALETTE_INIT_OWNER(tvc_state, tvc)
- MCFG_MC6845_ADD("crtc", MC6845, "screen", 3125000/2, tvc_crtc6845_interface) // clk taken from schematics
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", 3125000/2) // clk taken from schematics
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /*?*/
+ MCFG_MC6845_UPDATE_ROW_CB(tvc_state, crtc_update_row)
+ MCFG_MC6845_OUT_CUR_CB(WRITELINE(tvc_state, tvc_int_ff_set))
/* internal ram */
MCFG_RAM_ADD(RAM_TAG)
diff --git a/src/mess/drivers/v6809.c b/src/mess/drivers/v6809.c
index a5eb5d31e3e..8d14abcd89a 100644
--- a/src/mess/drivers/v6809.c
+++ b/src/mess/drivers/v6809.c
@@ -90,6 +90,8 @@ public:
DECLARE_WRITE8_MEMBER(kbd_put);
DECLARE_WRITE_LINE_MEMBER(write_acia_clock);
DECLARE_MACHINE_RESET(v6809);
+ MC6845_UPDATE_ROW(crtc_update_row);
+ MC6845_ON_UPDATE_ADDR_CHANGED(crtc_update_addr);
UINT8 *m_p_videoram;
const UINT8 *m_p_chargen;
@@ -168,10 +170,9 @@ static GFXDECODE_START( v6809 )
GFXDECODE_ENTRY( "chargen", 0x0000, v6809_charlayout, 0, 1 )
GFXDECODE_END
-MC6845_UPDATE_ROW( v6809_update_row )
+MC6845_UPDATE_ROW( v6809_state::crtc_update_row )
{
- v6809_state *state = device->machine().driver_data<v6809_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -179,8 +180,8 @@ MC6845_UPDATE_ROW( v6809_update_row )
for (x = 0; x < x_count; x++)
{
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
- gfx = state->m_p_chargen[(chr<<4) | ra] ^ ((x == cursor_x) ? 0xff : 0);
+ chr = m_p_videoram[mem];
+ gfx = m_p_chargen[(chr<<4) | ra] ^ ((x == cursor_x) ? 0xff : 0);
/* Display a scanline of a character (8 pixels) */
*p++ = palette[BIT(gfx, 7)];
@@ -194,28 +195,12 @@ MC6845_UPDATE_ROW( v6809_update_row )
}
}
-MC6845_ON_UPDATE_ADDR_CHANGED( v6809_update_addr )
+MC6845_ON_UPDATE_ADDR_CHANGED( v6809_state::crtc_update_addr )
{
/* not sure what goes in here - parameters passed are device, address, strobe */
- v6809_state *state = device->machine().driver_data<v6809_state>();
- state->m_video_address = address & 0x7ff;
+ m_video_address = address & 0x7ff;
}
-static MC6845_INTERFACE( v6809_crtc )
-{
- false,
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of dots per character */
- NULL,
- v6809_update_row, /* handler to display a scanline */
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- v6809_update_addr /* handler to process transparent mode */
-};
-
WRITE8_MEMBER( v6809_state::videoram_w )
{
m_vidbyte = data;
@@ -341,8 +326,13 @@ static MACHINE_CONFIG_START( v6809, v6809_state )
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
- /* Devices */
- MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_16MHz / 8, v6809_crtc)
+ /* devices */
+ MCFG_MC6845_ADD("crtc", SY6545_1, "screen", XTAL_16MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(v6809_state, crtc_update_row)
+ MCFG_MC6845_ADDR_CHANGED_CB(v6809_state, crtc_update_addr)
+
MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(v6809_state, kbd_put))
diff --git a/src/mess/drivers/victor9k.c b/src/mess/drivers/victor9k.c
index 00a3074c307..87e8122a879 100644
--- a/src/mess/drivers/victor9k.c
+++ b/src/mess/drivers/victor9k.c
@@ -256,7 +256,7 @@ INPUT_PORTS_END
//**************************************************************************
//-------------------------------------------------
-// MC6845_INTERFACE( hd46505s_intf )
+// MC6845
//-------------------------------------------------
#define CODE_NON_DISPLAY 0x1000
@@ -264,11 +264,10 @@ INPUT_PORTS_END
#define CODE_LOW_INTENSITY 0x4000
#define CODE_REVERSE_VIDEO 0x8000
-static MC6845_UPDATE_ROW( victor9k_update_row )
+MC6845_UPDATE_ROW( victor9k_state::crtc_update_row )
{
- victor9k_state *state = device->machine().driver_data<victor9k_state>();
- address_space &program = state->m_maincpu->space(AS_PROGRAM);
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ address_space &program = m_maincpu->space(AS_PROGRAM);
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
if (BIT(ma, 13))
{
@@ -280,7 +279,7 @@ static MC6845_UPDATE_ROW( victor9k_update_row )
for (int sx = 0; sx < x_count; sx++)
{
- UINT16 code = (state->m_video_ram[video_ram_addr + 1] << 8) | state->m_video_ram[video_ram_addr];
+ UINT16 code = (m_video_ram[video_ram_addr + 1] << 8) | m_video_ram[video_ram_addr];
UINT32 char_ram_addr = (BIT(ma, 12) << 16) | ((code & 0xff) << 5) | (ra << 1);
UINT16 data = program.read_word(char_ram_addr);
@@ -305,20 +304,6 @@ WRITE_LINE_MEMBER(victor9k_state::vert_w)
m_pic->ir7_w(state);
}
-static MC6845_INTERFACE( hd46505s_intf )
-{
- true,
- 0,0,0,0,
- 10,
- NULL,
- victor9k_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(victor9k_state, vert_w),
- NULL
-};
WRITE_LINE_MEMBER(victor9k_state::mux_serial_b_w)
@@ -906,7 +891,11 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state )
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
- MCFG_MC6845_ADD(HD46505S_TAG, HD6845, SCREEN_TAG, 1000000, hd46505s_intf) // HD6845 == HD46505S
+ MCFG_MC6845_ADD(HD46505S_TAG, HD6845, SCREEN_TAG, 1000000) // HD6845 == HD46505S
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(10)
+ MCFG_MC6845_UPDATE_ROW_CB(victor9k_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(victor9k_state, vert_w))
// sound hardware
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mess/drivers/vk100.c b/src/mess/drivers/vk100.c
index ad573f8e1c2..46272c8227a 100644
--- a/src/mess/drivers/vk100.c
+++ b/src/mess/drivers/vk100.c
@@ -244,6 +244,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(i8251_txrdy_int);
DECLARE_WRITE_LINE_MEMBER(i8251_rts);
UINT8 vram_read();
+ MC6845_UPDATE_ROW(crtc_update_row);
void vram_write(UINT8 data);
protected:
@@ -964,7 +965,7 @@ void vk100_state::video_start()
m_ras_erase = memregion("ras_erase")->base();
}
-static MC6845_UPDATE_ROW( vk100_update_row )
+MC6845_UPDATE_ROW( vk100_state::crtc_update_row )
{
static const UINT32 colorTable[16] = {
0x000000, 0x0000FF, 0xFF0000, 0xFF00FF, 0x00FF00, 0x00FFFF, 0xFFFF00, 0xFFFFFF,
@@ -977,50 +978,38 @@ static MC6845_UPDATE_ROW( vk100_update_row )
* real address to 16-bit chunk a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
* crtc input MA11 MA10 MA9 MA8 MA7 MA6 RA1 RA0 MA5 MA4 MA3 MA2 MA1 MA0
*/
- vk100_state *state = device->machine().driver_data<vk100_state>();
UINT16 EA = ((ma&0xfc0)<<2)|((ra&0x3)<<6)|(ma&0x3F);
// display the 64 different 12-bit-wide chunks
for (int i = 0; i < 64; i++)
{
- UINT16 block = state->m_vram[(EA<<1)+(2*i)+1] | (state->m_vram[(EA<<1)+(2*i)]<<8);
- UINT32 fgColor = (state->m_vgSOPS&0x08)?colorTable[(block&0xF000)>>12]:colorTable2[(block&0xF000)>>12];
- UINT32 bgColor = (state->m_vgSOPS&0x08)?colorTable[(state->m_vgSOPS&0xF0)>>4]:colorTable2[(state->m_vgSOPS&0xF0)>>4];
+ UINT16 block = m_vram[(EA<<1)+(2*i)+1] | (m_vram[(EA<<1)+(2*i)]<<8);
+ UINT32 fgColor = (m_vgSOPS&0x08)?colorTable[(block&0xF000)>>12]:colorTable2[(block&0xF000)>>12];
+ UINT32 bgColor = (m_vgSOPS&0x08)?colorTable[(m_vgSOPS&0xF0)>>4]:colorTable2[(m_vgSOPS&0xF0)>>4];
// display a 12-bit wide chunk
for (int j = 0; j < 12; j++)
{
- bitmap.pix32(y, (12*i)+j) = (((block&(0x0001<<j))?1:0)^(state->m_vgSOPS&1))?fgColor:bgColor;
+ bitmap.pix32(y, (12*i)+j) = (((block&(0x0001<<j))?1:0)^(m_vgSOPS&1))?fgColor:bgColor;
}
}
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false,
- 0,0,0,0,
- 12,
- NULL,
- vk100_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(vk100_state, crtc_vsync),
- NULL
-};
-
static MACHINE_CONFIG_START( vk100, vk100_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", I8085A, XTAL_5_0688MHz)
MCFG_CPU_PROGRAM_MAP(vk100_mem)
MCFG_CPU_IO_MAP(vk100_io)
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_45_6192Mhz/3, 882, 0, 720, 370, 0, 350 ) // fake screen timings for startup until 6845 sets real ones
MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
- MCFG_MC6845_ADD( "crtc", H46505, "screen", XTAL_45_6192Mhz/3/12, mc6845_intf)
+
+ MCFG_MC6845_ADD( "crtc", H46505, "screen", XTAL_45_6192Mhz/3/12)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(12)
+ MCFG_MC6845_UPDATE_ROW_CB(vk100_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(vk100_state, crtc_vsync))
/* i8251 uart */
MCFG_DEVICE_ADD("i8251", I8251, 0)
diff --git a/src/mess/drivers/x1.c b/src/mess/drivers/x1.c
index abbc820e163..b2e93f6867c 100644
--- a/src/mess/drivers/x1.c
+++ b/src/mess/drivers/x1.c
@@ -1870,21 +1870,6 @@ WRITE8_MEMBER( x1_state::x1_portc_w )
m_cassette->output(BIT(data, 0) ? +1.0 : -1.0);
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- true, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
READ8_MEMBER(x1_state::memory_read_byte)
{
address_space& prog_space = m_maincpu->space(AS_PROGRAM);
@@ -2535,7 +2520,10 @@ static MACHINE_CONFIG_START( x1, x1_state )
MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1)
MCFG_SCREEN_UPDATE_DRIVER(x1_state, screen_update_x1)
- MCFG_MC6845_ADD("crtc", H46505, "screen", (VDP_CLOCK/48), mc6845_intf) //unknown divider
+ MCFG_MC6845_ADD("crtc", H46505, "screen", (VDP_CLOCK/48)) //unknown divider
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+
MCFG_PALETTE_ADD("palette", 0x10+0x1000)
MCFG_PALETTE_INIT_OWNER(x1_state,x1)
diff --git a/src/mess/drivers/x1twin.c b/src/mess/drivers/x1twin.c
index 913bf46de1a..273307e0211 100644
--- a/src/mess/drivers/x1twin.c
+++ b/src/mess/drivers/x1twin.c
@@ -79,21 +79,6 @@ static const wd17xx_interface x1_mb8877a_interface =
{FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
};
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area*/
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
/*************************************
*
* Inputs
@@ -508,7 +493,10 @@ static MACHINE_CONFIG_START( x1twin, x1twin_state )
MCFG_SCREEN_RAW_PARAMS(PCE_MAIN_CLOCK/2, HUC6260_WPF, 70, 70 + 512 + 32, HUC6260_LPF, 14, 14+242)
MCFG_SCREEN_UPDATE_DRIVER(x1twin_state, screen_update_x1pce)
- MCFG_MC6845_ADD("crtc", H46505, "x1_screen", (VDP_CLOCK/48), mc6845_intf) //unknown divider
+ MCFG_MC6845_ADD("crtc", H46505, "x1_screen", (VDP_CLOCK/48)) //unknown divider
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+
MCFG_PALETTE_ADD("palette", 0x10+0x1000)
MCFG_PALETTE_INIT_OWNER(x1twin_state,x1)
diff --git a/src/mess/drivers/z100.c b/src/mess/drivers/z100.c
index b146d33e2c2..67649a9388d 100644
--- a/src/mess/drivers/z100.c
+++ b/src/mess/drivers/z100.c
@@ -603,21 +603,6 @@ READ8_MEMBER( z100_state::get_slave_ack )
return 0;
}
-static MC6845_INTERFACE( mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* number of pixels per video memory address */
- NULL, /* before pixel update callback */
- NULL, /* row update callback */
- NULL, /* after pixel update callback */
- DEVCB_NULL, /* callback for display state changes */
- DEVCB_NULL, /* callback for cursor state changes */
- DEVCB_NULL, /* HSYNC callback */
- DEVCB_NULL, /* VSYNC callback */
- NULL /* update address callback */
-};
-
WRITE8_MEMBER( z100_state::video_pia_A_w )
{
/*
@@ -726,8 +711,10 @@ static MACHINE_CONFIG_START( z100, z100_state )
MCFG_PALETTE_ADD("palette", 8)
- /* Devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_14_31818MHz/8, mc6845_intf) /* unknown clock, hand tuned to get ~50/~60 fps */
+ /* devices */
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_14_31818MHz/8) /* unknown clock, hand tuned to get ~50/~60 fps */
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
MCFG_PIC8259_ADD( "pic8259_master", INPUTLINE("maincpu", 0), VCC, READ8(z100_state, get_slave_ack) )
MCFG_PIC8259_ADD( "pic8259_slave", DEVWRITELINE("pic8259_master", pic8259_device, ir3_w), GND, NULL )
diff --git a/src/mess/drivers/zrt80.c b/src/mess/drivers/zrt80.c
index ae669a6e373..9692961291d 100644
--- a/src/mess/drivers/zrt80.c
+++ b/src/mess/drivers/zrt80.c
@@ -48,6 +48,7 @@ public:
DECLARE_WRITE8_MEMBER(zrt80_30_w);
DECLARE_WRITE8_MEMBER(zrt80_38_w);
DECLARE_WRITE8_MEMBER(kbd_put);
+ MC6845_UPDATE_ROW(crtc_update_row);
const UINT8 *m_p_chargen;
required_shared_ptr<UINT8> m_p_videoram;
protected:
@@ -214,21 +215,20 @@ void zrt80_state::video_start()
m_p_chargen = memregion("chargen")->base();
}
-static MC6845_UPDATE_ROW( zrt80_update_row )
+MC6845_UPDATE_ROW( zrt80_state::crtc_update_row )
{
- zrt80_state *state = device->machine().driver_data<zrt80_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx,inv;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
- UINT8 polarity = state->ioport("DIPSW1")->read() & 4 ? 0xff : 0;
+ UINT8 polarity = ioport("DIPSW1")->read() & 4 ? 0xff : 0;
for (x = 0; x < x_count; x++)
{
inv = polarity;
if (x == cursor_x) inv ^= 0xff;
mem = (ma + x) & 0x1fff;
- chr = state->m_p_videoram[mem];
+ chr = m_p_videoram[mem];
if BIT(chr, 7)
{
@@ -236,7 +236,7 @@ static MC6845_UPDATE_ROW( zrt80_update_row )
chr &= 0x7f;
}
- gfx = state->m_p_chargen[(chr<<4) | ra] ^ inv;
+ gfx = m_p_chargen[(chr<<4) | ra] ^ inv;
/* Display a scanline of a character */
*p++ = palette[BIT(gfx, 7)];
@@ -251,21 +251,6 @@ static MC6845_UPDATE_ROW( zrt80_update_row )
}
-static MC6845_INTERFACE( zrt80_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 8 /*?*/,
- NULL,
- zrt80_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
static const ins8250_interface zrt80_com_interface =
{
DEVCB_NULL,
@@ -322,7 +307,11 @@ static MACHINE_CONFIG_START( zrt80, zrt80_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
/* Devices */
- MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_20MHz / 8, zrt80_crtc6845_interface)
+ MCFG_MC6845_ADD("crtc", MC6845, "screen", XTAL_20MHz / 8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8) /*?*/
+ MCFG_MC6845_UPDATE_ROW_CB(zrt80_state, crtc_update_row)
+
MCFG_INS8250_ADD( "ins8250", zrt80_com_interface, 2457600 )
MCFG_DEVICE_ADD(KEYBOARD_TAG, GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(WRITE8(zrt80_state, kbd_put))
diff --git a/src/mess/includes/abc80x.h b/src/mess/includes/abc80x.h
index eac46480de1..ac267a60bde 100644
--- a/src/mess/includes/abc80x.h
+++ b/src/mess/includes/abc80x.h
@@ -184,6 +184,7 @@ public:
void hr_update(bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_DIRECT_UPDATE_MEMBER( direct_update_handler );
+ MC6845_UPDATE_ROW( abc800m_update_row );
};
@@ -248,6 +249,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( mux80_40_w );
DECLARE_WRITE_LINE_MEMBER( vs_w );
DECLARE_DIRECT_UPDATE_MEMBER( direct_update_handler );
+ MC6845_UPDATE_ROW( abc802_update_row );
// cpu state
int m_lrs; // low RAM select
@@ -310,6 +312,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( vs_w );
DECLARE_DIRECT_UPDATE_MEMBER( direct_update_handler );
DECLARE_PALETTE_INIT( abc806 );
+ MC6845_UPDATE_ROW( abc806_update_row );
// memory state
int m_keydtr; // keyboard DTR
diff --git a/src/mess/includes/amstrad.h b/src/mess/includes/amstrad.h
index 1010953c75e..ca53a4d7655 100644
--- a/src/mess/includes/amstrad.h
+++ b/src/mess/includes/amstrad.h
@@ -319,13 +319,6 @@ protected:
/*----------- defined in machine/amstrad.c -----------*/
-extern const mc6845_interface amstrad_mc6845_intf;
-extern const mc6845_interface amstrad_plus_mc6845_intf;
-
-
-
-
-
SLOT_INTERFACE_EXTERN(cpc_exp_cards);
SLOT_INTERFACE_EXTERN(cpcplus_exp_cards);
diff --git a/src/mess/includes/bbc.h b/src/mess/includes/bbc.h
index 62dbdd80dff..aa4bddbdd55 100644
--- a/src/mess/includes/bbc.h
+++ b/src/mess/includes/bbc.h
@@ -165,6 +165,8 @@ public:
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbc_exp_rom );
DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcm_cart );
+ MC6845_UPDATE_ROW(crtc_update_row);
+
private:
required_device<cpu_device> m_maincpu;
required_device<ram_device> m_ram;
@@ -419,7 +421,6 @@ public: // HACK FOR MC6845
/*----------- defined in machine/bbc.c -----------*/
-extern const mc6845_interface bbc_mc6845_intf;
extern const wd17xx_interface bbc_wd17xx_interface;
#endif /* BBC_H_ */
diff --git a/src/mess/includes/bw12.h b/src/mess/includes/bw12.h
index e0ff1e291d3..bbde95f7d5e 100644
--- a/src/mess/includes/bw12.h
+++ b/src/mess/includes/bw12.h
@@ -91,6 +91,7 @@ public:
DECLARE_READ_LINE_MEMBER( ay3600_shift_r );
DECLARE_READ_LINE_MEMBER( ay3600_control_r );
DECLARE_WRITE_LINE_MEMBER( ay3600_data_ready_w );
+ MC6845_UPDATE_ROW( crtc_update_row );
/* memory state */
int m_bank;
diff --git a/src/mess/includes/cbm2.h b/src/mess/includes/cbm2.h
index 25b2a411eb4..a94419e349d 100644
--- a/src/mess/includes/cbm2.h
+++ b/src/mess/includes/cbm2.h
@@ -214,6 +214,8 @@ public:
DECLARE_WRITE_LINE_MEMBER( user_irq_w );
+ MC6845_UPDATE_ROW( crtc_update_row );
+
DECLARE_QUICKLOAD_LOAD_MEMBER( cbmb );
// memory state
int m_dramon;
diff --git a/src/mess/includes/dgn_beta.h b/src/mess/includes/dgn_beta.h
index 5c81a5cc056..2b4ec244a6d 100644
--- a/src/mess/includes/dgn_beta.h
+++ b/src/mess/includes/dgn_beta.h
@@ -193,6 +193,7 @@ public:
// Page IO at FE00
DECLARE_READ8_MEMBER(dgn_beta_page_r);
DECLARE_WRITE8_MEMBER(dgn_beta_page_w);
+ MC6845_UPDATE_ROW(crtc_update_row);
/* WD2797 FDC */
DECLARE_READ8_MEMBER(dgnbeta_wd2797_r);
@@ -219,9 +220,4 @@ public:
extern const wd17xx_interface dgnbeta_wd17xx_interface;
-
-/*----------- defined in video/dgn_beta.c -----------*/
-
-extern const mc6845_interface dgnbeta_crtc6845_interface;
-
#endif /* DGN_BETA_H_ */
diff --git a/src/mess/includes/einstein.h b/src/mess/includes/einstein.h
index d0a60d6008f..10de7d0b019 100644
--- a/src/mess/includes/einstein.h
+++ b/src/mess/includes/einstein.h
@@ -130,6 +130,7 @@ public:
DECLARE_WRITE8_MEMBER(einstein_drsel_w);
DECLARE_WRITE_LINE_MEMBER(einstein_serial_transmit_clock);
DECLARE_WRITE_LINE_MEMBER(einstein_serial_receive_clock);
+ MC6845_UPDATE_ROW(crtc_update_row);
protected:
required_device<i8251_device> m_uart;
diff --git a/src/mess/includes/kaypro.h b/src/mess/includes/kaypro.h
index 3df7b63a470..f48df61d460 100644
--- a/src/mess/includes/kaypro.h
+++ b/src/mess/includes/kaypro.h
@@ -68,6 +68,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(kaypro_interrupt);
DECLARE_READ8_MEMBER(kaypro_sio_r);
DECLARE_WRITE8_MEMBER(kaypro_sio_w);
+ MC6845_UPDATE_ROW(kaypro2x_update_row);
DECLARE_QUICKLOAD_LOAD_MEMBER(kaypro);
const UINT8 *m_p_chargen;
UINT8 m_mc6845_cursor[16];
@@ -110,8 +111,3 @@ UINT8 kay_kbd_d_r( running_machine &machine );
void kay_kbd_d_w( running_machine &machine, UINT8 data );
INPUT_PORTS_EXTERN( kay_kbd );
-
-
-/*----------- defined in video/kaypro.c -----------*/
-
-MC6845_UPDATE_ROW( kaypro2x_update_row );
diff --git a/src/mess/includes/mbc55x.h b/src/mess/includes/mbc55x.h
index 95d022fd77b..0f2beb080be 100644
--- a/src/mess/includes/mbc55x.h
+++ b/src/mess/includes/mbc55x.h
@@ -154,6 +154,7 @@ public:
DECLARE_READ8_MEMBER(mbc55x_kb_usart_r);
DECLARE_WRITE8_MEMBER(mbc55x_kb_usart_w);
DECLARE_DRIVER_INIT(mbc55x);
+ MC6845_UPDATE_ROW(crtc_update_row);
virtual void machine_start();
virtual void machine_reset();
virtual void video_start();
@@ -202,9 +203,6 @@ extern const wd17xx_interface mbc55x_wd17xx_interface;
/*----------- defined in video/mbc55x.c -----------*/
-extern const mc6845_interface mb55x_mc6845_intf;
-
-
#define RED 0
#define GREEN 1
#define BLUE 2
diff --git a/src/mess/includes/mbee.h b/src/mess/includes/mbee.h
index 039d8925d88..25147ee4e54 100644
--- a/src/mess/includes/mbee.h
+++ b/src/mess/includes/mbee.h
@@ -159,6 +159,12 @@ public:
void mbee_video_kbd_scan(int param);
UINT8 m_sy6545_cursor[16];
+ MC6845_UPDATE_ROW(mbee_update_row);
+ MC6845_UPDATE_ROW(mbeeic_update_row);
+ MC6845_UPDATE_ROW(mbeeppc_update_row);
+ MC6845_ON_UPDATE_ADDR_CHANGED(mbee_update_addr);
+ MC6845_ON_UPDATE_ADDR_CHANGED(mbee256_update_addr);
+
private:
size_t m_size;
UINT8 m_clock_pulse;
@@ -223,14 +229,4 @@ public:
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
};
-
-/*----------- defined in video/mbee.c -----------*/
-
-MC6845_UPDATE_ROW( mbee_update_row );
-MC6845_UPDATE_ROW( mbeeic_update_row );
-MC6845_UPDATE_ROW( mbeeppc_update_row );
-MC6845_ON_UPDATE_ADDR_CHANGED( mbee_update_addr );
-MC6845_ON_UPDATE_ADDR_CHANGED( mbee256_update_addr );
-
-
#endif /* MBEE_H_ */
diff --git a/src/mess/includes/pc1512.h b/src/mess/includes/pc1512.h
index 97eb96946f8..218a3d5599e 100644
--- a/src/mess/includes/pc1512.h
+++ b/src/mess/includes/pc1512.h
@@ -121,9 +121,9 @@ public:
int get_display_mode(UINT8 mode);
offs_t get_char_rom_offset();
int get_color(UINT8 data);
- void draw_alpha(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
- void draw_graphics_1(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
- void draw_graphics_2(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
+ MC6845_UPDATE_ROW(draw_alpha);
+ MC6845_UPDATE_ROW(draw_graphics_1);
+ MC6845_UPDATE_ROW(draw_graphics_2);
DECLARE_READ8_MEMBER( video_ram_r );
DECLARE_WRITE8_MEMBER( video_ram_w );
@@ -171,6 +171,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
DECLARE_WRITE_LINE_MEMBER(write_centronics_select);
DECLARE_WRITE_LINE_MEMBER(write_centronics_fault);
+ MC6845_UPDATE_ROW(crtc_update_row);
// system status register
int m_pit1;
diff --git a/src/mess/includes/pet.h b/src/mess/includes/pet.h
index 4f8c650ea62..95eafe61066 100644
--- a/src/mess/includes/pet.h
+++ b/src/mess/includes/pet.h
@@ -109,6 +109,9 @@ public:
DECLARE_MACHINE_START( pet40 );
DECLARE_MACHINE_RESET( pet40 );
+ MC6845_BEGIN_UPDATE( pet_begin_update );
+ MC6845_UPDATE_ROW( pet40_update_row );
+
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void check_interrupts();
@@ -206,6 +209,9 @@ public:
DECLARE_MACHINE_START( pet80 );
DECLARE_MACHINE_RESET( pet80 );
+
+ MC6845_UPDATE_ROW( pet80_update_row );
+ MC6845_UPDATE_ROW( cbm8296_update_row );
};
diff --git a/src/mess/includes/super80.h b/src/mess/includes/super80.h
index e5344e627a3..b378bda25b9 100644
--- a/src/mess/includes/super80.h
+++ b/src/mess/includes/super80.h
@@ -70,6 +70,7 @@ public:
DECLARE_VIDEO_START(super80v);
DECLARE_PALETTE_INIT(super80m);
DECLARE_QUICKLOAD_LOAD_MEMBER(super80);
+ MC6845_UPDATE_ROW(crtc_update_row);
UINT32 screen_update_super80(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
UINT32 screen_update_super80v(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
UINT32 screen_update_super80d(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -119,7 +120,3 @@ private:
optional_device<floppy_connector> m_floppy0;
optional_device<floppy_connector> m_floppy1;
};
-
-
-/*----------- defined in video/super80.c -----------*/
-MC6845_UPDATE_ROW( super80v_update_row );
diff --git a/src/mess/includes/svi318.h b/src/mess/includes/svi318.h
index 709c1c83e07..d01643e83c8 100644
--- a/src/mess/includes/svi318.h
+++ b/src/mess/includes/svi318.h
@@ -119,6 +119,8 @@ public:
DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER(svi318_cart);
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
+ MC6845_UPDATE_ROW(crtc_update_row);
+
required_device<z80_device> m_maincpu;
protected:
required_device<cassette_image_device> m_cassette;
@@ -156,7 +158,4 @@ protected:
extern const ins8250_interface svi318_ins8250_interface[2];
extern const wd17xx_interface svi_wd17xx_interface;
-MC6845_UPDATE_ROW( svi806_crtc6845_update_row );
-
-
#endif /* SVI318_H_ */
diff --git a/src/mess/includes/trs80m2.h b/src/mess/includes/trs80m2.h
index c588a85b8ae..94a85e36038 100644
--- a/src/mess/includes/trs80m2.h
+++ b/src/mess/includes/trs80m2.h
@@ -108,6 +108,8 @@ public:
DECLARE_WRITE_LINE_MEMBER( kb_clock_w );
DECLARE_WRITE8_MEMBER( kbd_w );
+ MC6845_UPDATE_ROW( crtc_update_row );
+
// memory state
int m_boot_rom;
int m_bank;
diff --git a/src/mess/includes/tvc.h b/src/mess/includes/tvc.h
index 66486027e9c..27fd7100a12 100644
--- a/src/mess/includes/tvc.h
+++ b/src/mess/includes/tvc.h
@@ -119,6 +119,8 @@ public:
DECLARE_QUICKLOAD_LOAD_MEMBER( tvc64);
+ MC6845_UPDATE_ROW(crtc_update_row);
+
tvcexp_slot_device * m_expansions[4];
UINT8 m_video_mode;
UINT8 m_keyline;
diff --git a/src/mess/includes/v1050.h b/src/mess/includes/v1050.h
index 7ec844c0a8c..429f032c38a 100644
--- a/src/mess/includes/v1050.h
+++ b/src/mess/includes/v1050.h
@@ -150,6 +150,8 @@ public:
DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
DECLARE_WRITE_LINE_MEMBER(write_centronics_perror);
+ MC6845_UPDATE_ROW(crtc_update_row);
+
protected:
virtual void machine_start();
virtual void machine_reset();
diff --git a/src/mess/includes/victor9k.h b/src/mess/includes/victor9k.h
index d2932ec3745..b8d5c9c4381 100644
--- a/src/mess/includes/victor9k.h
+++ b/src/mess/includes/victor9k.h
@@ -162,6 +162,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( via6_irq_w );
DECLARE_WRITE_LINE_MEMBER( ssda_irq_w );
+ MC6845_UPDATE_ROW( crtc_update_row );
void ready0_cb(floppy_image_device *, int device);
int load0_cb(floppy_image_device *device);
diff --git a/src/mess/machine/amstrad.c b/src/mess/machine/amstrad.c
index a46a1a7303c..cb12927cba1 100644
--- a/src/mess/machine/amstrad.c
+++ b/src/mess/machine/amstrad.c
@@ -1079,37 +1079,6 @@ UINT32 amstrad_state::screen_update_amstrad(screen_device &screen, bitmap_ind16
}
-MC6845_INTERFACE( amstrad_mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 16, /* number of pixels per video memory address */
- NULL, /* begin_update */
- NULL, /* update_row */
- NULL, /* end_update */
- DEVCB_DRIVER_LINE_MEMBER(amstrad_state,amstrad_de_changed), /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_DRIVER_LINE_MEMBER(amstrad_state,amstrad_hsync_changed), /* on_hsync_changed */
- DEVCB_DRIVER_LINE_MEMBER(amstrad_state,amstrad_vsync_changed), /* on_vsync_changed */
- NULL
-};
-
-
-MC6845_INTERFACE( amstrad_plus_mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 16, /* number of pixels per video memory address */
- NULL, /* begin_update */
- NULL, /* update_row */
- NULL, /* end_update */
- DEVCB_DRIVER_LINE_MEMBER(amstrad_state,amstrad_plus_de_changed), /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_DRIVER_LINE_MEMBER(amstrad_state,amstrad_plus_hsync_changed), /* on_hsync_changed */
- DEVCB_DRIVER_LINE_MEMBER(amstrad_state,amstrad_plus_vsync_changed), /* on_vsync_changed */
- NULL
-};
-
/* traverses the daisy-chain of expansion devices, looking for the specified device */
static device_t* get_expansion_device(running_machine &machine, const char* tag)
{
diff --git a/src/mess/machine/svi318.c b/src/mess/machine/svi318.c
index d7a8e93f0b6..131e9cc7168 100644
--- a/src/mess/machine/svi318.c
+++ b/src/mess/machine/svi318.c
@@ -313,16 +313,15 @@ READ8_MEMBER(svi318_state::svi318_fdc_irqdrq_r)
return result;
}
-MC6845_UPDATE_ROW( svi806_crtc6845_update_row )
+MC6845_UPDATE_ROW( svi318_state::crtc_update_row )
{
- svi318_state *state = device->machine().driver_data<svi318_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
int i;
for( i = 0; i < x_count; i++ )
{
int j;
- UINT8 data = state->m_svi.svi806_gfx[ state->m_svi.svi806_ram->u8(( ma + i ) & 0x7FF) * 16 + ra ];
+ UINT8 data = m_svi.svi806_gfx[ m_svi.svi806_ram->u8(( ma + i ) & 0x7FF) * 16 + ra ];
if ( i == cursor_x )
{
diff --git a/src/mess/video/abc1600.c b/src/mess/video/abc1600.c
index 85593b94b16..be4f5a8f355 100644
--- a/src/mess/video/abc1600.c
+++ b/src/mess/video/abc1600.c
@@ -127,7 +127,7 @@ const rom_entry *abc1600_mover_device::device_rom_region() const
//-------------------------------------------------
-// mc6845_interface crtc_intf
+// mc6845
//-------------------------------------------------
inline UINT16 abc1600_mover_device::get_crtca(UINT16 ma, UINT8 ra, UINT8 column)
@@ -161,58 +161,32 @@ inline UINT16 abc1600_mover_device::get_crtca(UINT16 ma, UINT8 ra, UINT8 column)
return (cr << 10) | ((ra & 0x0f) << 6) | ((cc << 1) & 0x3c);
}
-void abc1600_mover_device::crtc_update_row(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW(abc1600_mover_device::crtc_update_row)
{
int x = 0;
const pen_t *pen = m_palette->pens();
-
+
for (int column = 0; column < x_count; column += 2)
{
UINT16 dma = get_crtca(ma, ra, column);
-
+
// data is read out of video RAM in nibble mode by strobing CAS 4 times
for (int cas = 0; cas < 4; cas++)
{
UINT16 data = read_videoram(dma + cas);
-
+
for (int bit = 0; bit < 16; bit++)
{
int color = ((BIT(data, 15) ^ PIX_POL) && !BLANK) && de;
-
+
bitmap.pix32(vbp + y, hbp + x++) = pen[color];
-
+
data <<= 1;
}
}
}
}
-static MC6845_UPDATE_ROW( abc1600_update_row )
-{
- abc1600_mover_device *mover = downcast<abc1600_mover_device *>(device->owner());
- mover->crtc_update_row(device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param);
-}
-
-static MC6845_ON_UPDATE_ADDR_CHANGED( crtc_update )
-{
-}
-
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 32,
- NULL,
- abc1600_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- crtc_update
-};
-
-
//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( abc1600_mover )
//-------------------------------------------------
@@ -229,7 +203,10 @@ static MACHINE_CONFIG_FRAGMENT( abc1600_mover )
MCFG_PALETTE_ADD_MONOCHROME_GREEN("palette")
- MCFG_MC6845_ADD(SY6845E_TAG, SY6845E, SCREEN_TAG, XTAL_64MHz/32, crtc_intf)
+ MCFG_MC6845_ADD(SY6845E_TAG, SY6845E, SCREEN_TAG, XTAL_64MHz/32)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(32)
+ MCFG_MC6845_UPDATE_ROW_CB(abc1600_mover_device, crtc_update_row)
MACHINE_CONFIG_END
diff --git a/src/mess/video/abc1600.h b/src/mess/video/abc1600.h
index 58bf6a2059d..126b195aaeb 100644
--- a/src/mess/video/abc1600.h
+++ b/src/mess/video/abc1600.h
@@ -54,7 +54,7 @@ public:
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
- void crtc_update_row(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param);
+ MC6845_UPDATE_ROW(crtc_update_row);
protected:
// device-level overrides
diff --git a/src/mess/video/abc800.c b/src/mess/video/abc800.c
index bceb3d57eb2..ee9fc3a19de 100644
--- a/src/mess/video/abc800.c
+++ b/src/mess/video/abc800.c
@@ -231,12 +231,10 @@ void abc800m_state::hr_update(bitmap_rgb32 &bitmap, const rectangle &cliprect)
// MC6845_UPDATE_ROW( abc800m_update_row )
//-------------------------------------------------
-static MC6845_UPDATE_ROW( abc800m_update_row )
+MC6845_UPDATE_ROW( abc800m_state::abc800m_update_row )
{
- abc800m_state *state = device->machine().driver_data<abc800m_state>();
-
int column;
- rgb_t fgpen = state->m_palette->pen(1);
+ rgb_t fgpen = m_palette->pen(1);
y += vbp;
@@ -244,8 +242,8 @@ static MC6845_UPDATE_ROW( abc800m_update_row )
{
int bit;
- UINT16 address = (state->m_char_ram[(ma + column) & 0x7ff] << 4) | (ra & 0x0f);
- UINT8 data = (state->m_char_rom->base()[address & 0x7ff] & 0x3f);
+ UINT16 address = (m_char_ram[(ma + column) & 0x7ff] << 4) | (ra & 0x0f);
+ UINT8 data = (m_char_rom->base()[address & 0x7ff] & 0x3f);
if (column == cursor_x)
{
@@ -270,26 +268,6 @@ static MC6845_UPDATE_ROW( abc800m_update_row )
//-------------------------------------------------
-// mc6845_interface crtc_intf
-//-------------------------------------------------
-
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- ABC800_CHAR_WIDTH,
- NULL,
- abc800m_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DEVICE_LINE_MEMBER(Z80DART_TAG, z80dart_device, rib_w),
- NULL
-};
-
-
-//-------------------------------------------------
// SCREEN_UPDATE( abc800m )
//-------------------------------------------------
@@ -316,7 +294,11 @@ UINT32 abc800m_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
//-------------------------------------------------
MACHINE_CONFIG_FRAGMENT( abc800m_video )
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, ABC800_CCLK, crtc_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, ABC800_CCLK)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(ABC800_CHAR_WIDTH)
+ MCFG_MC6845_UPDATE_ROW_CB(abc800m_state, abc800m_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(DEVWRITELINE(Z80DART_TAG, z80dart_device, rib_w))
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_UPDATE_DRIVER(abc800m_state, screen_update)
diff --git a/src/mess/video/abc802.c b/src/mess/video/abc802.c
index a8dac53e8c3..667f8cfe931 100644
--- a/src/mess/video/abc802.c
+++ b/src/mess/video/abc802.c
@@ -14,7 +14,7 @@
// MC6845_UPDATE_ROW( abc802_update_row )
//-------------------------------------------------
-static MC6845_UPDATE_ROW( abc802_update_row )
+MC6845_UPDATE_ROW( abc802_state::abc802_update_row )
{
/*
@@ -55,8 +55,7 @@ static MC6845_UPDATE_ROW( abc802_update_row )
*/
- abc802_state *state = device->machine().driver_data<abc802_state>();
- const pen_t *pen = state->m_palette->pens();
+ const pen_t *pen = m_palette->pens();
int rf = 0, rc = 0, rg = 0;
@@ -64,7 +63,7 @@ static MC6845_UPDATE_ROW( abc802_update_row )
for (int column = 0; column < x_count; column++)
{
- UINT8 code = state->m_char_ram[(ma + column) & 0x7ff];
+ UINT8 code = m_char_ram[(ma + column) & 0x7ff];
UINT16 address = code << 4;
UINT8 ra_latch = ra;
UINT8 data;
@@ -76,7 +75,7 @@ static MC6845_UPDATE_ROW( abc802_update_row )
ra_latch = 0x0f;
}
- if ((state->m_flshclk && rf) || rc)
+ if ((m_flshclk && rf) || rc)
{
ra_latch = 0x0e;
}
@@ -86,7 +85,7 @@ static MC6845_UPDATE_ROW( abc802_update_row )
address |= 0x800;
}
- data = state->m_char_rom->base()[(address + ra_latch) & 0xfff];
+ data = m_char_rom->base()[(address + ra_latch) & 0xfff];
if (data & ABC802_ATE)
{
@@ -119,7 +118,7 @@ static MC6845_UPDATE_ROW( abc802_update_row )
{
data <<= 2;
- if (state->m_80_40_mux)
+ if (m_80_40_mux)
{
for (int bit = 0; bit < ABC800_CHAR_WIDTH; bit++)
{
@@ -176,26 +175,6 @@ WRITE_LINE_MEMBER( abc802_state::vs_w )
}
-//-------------------------------------------------
-// mc6845_interface crtc_intf
-//-------------------------------------------------
-
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- ABC800_CHAR_WIDTH,
- NULL,
- abc802_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(abc802_state, vs_w),
- NULL
-};
-
-
void abc802_state::video_start()
{
// register for state saving
@@ -223,7 +202,11 @@ UINT32 abc802_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap,
//-------------------------------------------------
MACHINE_CONFIG_FRAGMENT( abc802_video )
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, ABC800_CCLK, crtc_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, ABC800_CCLK)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(ABC800_CHAR_WIDTH)
+ MCFG_MC6845_UPDATE_ROW_CB(abc802_state, abc802_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(abc802_state, vs_w))
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_UPDATE_DRIVER(abc802_state, screen_update)
diff --git a/src/mess/video/abc806.c b/src/mess/video/abc806.c
index 8132ae3d931..c83acf9e673 100644
--- a/src/mess/video/abc806.c
+++ b/src/mess/video/abc806.c
@@ -222,26 +222,25 @@ WRITE8_MEMBER( abc806_state::sso_w )
// MC6845_UPDATE_ROW( abc806_update_row )
//-------------------------------------------------
-static MC6845_UPDATE_ROW( abc806_update_row )
+MC6845_UPDATE_ROW( abc806_state::abc806_update_row )
{
- abc806_state *state = device->machine().driver_data<abc806_state>();
- const pen_t *pen = state->m_palette->pens();
+ const pen_t *pen = m_palette->pens();
// UINT8 old_data = 0xff;
int fg_color = 7;
int bg_color = 0;
int underline = 0;
int flash = 0;
- int e5 = state->m_40;
- int e6 = state->m_40;
+ int e5 = m_40;
+ int e6 = m_40;
int th = 0;
- y += state->m_sync + vbp;
+ y += m_sync + vbp;
for (int column = 0; column < x_count; column++)
{
- UINT8 data = state->m_char_ram[(ma + column) & 0x7ff];
- UINT8 attr = state->m_attr_ram[(ma + column) & 0x7ff];
+ UINT8 data = m_char_ram[(ma + column) & 0x7ff];
+ UINT8 attr = m_attr_ram[(ma + column) & 0x7ff];
UINT16 rad_addr;
UINT8 rad_data;
@@ -270,7 +269,7 @@ static MC6845_UPDATE_ROW( abc806_update_row )
e6 = BIT(attr, 1);
// read attributes from next byte
- attr = state->m_attr_ram[(ma + column + 1) & 0x7ff];
+ attr = m_attr_ram[(ma + column + 1) & 0x7ff];
if (attr != 0x00)
{
@@ -289,8 +288,8 @@ static MC6845_UPDATE_ROW( abc806_update_row )
bg_color = (attr >> 3) & 0x07;
underline = BIT(attr, 6);
flash = BIT(attr, 7);
- e5 = state->m_40;
- e6 = state->m_40;
+ e5 = m_40;
+ e6 = m_40;
}
if (column == cursor_x)
@@ -299,14 +298,14 @@ static MC6845_UPDATE_ROW( abc806_update_row )
}
else
{
- rad_addr = (e6 << 8) | (e5 << 7) | (flash << 6) | (underline << 5) | (state->m_flshclk << 4) | ra;
- rad_data = state->m_rad_prom->base()[rad_addr] & 0x0f;
+ rad_addr = (e6 << 8) | (e5 << 7) | (flash << 6) | (underline << 5) | (m_flshclk << 4) | ra;
+ rad_data = m_rad_prom->base()[rad_addr] & 0x0f;
rad_data = ra; // HACK because the RAD prom is not dumped yet
}
UINT16 chargen_addr = (th << 12) | (data << 4) | rad_data;
- UINT8 chargen_data = state->m_char_rom->base()[chargen_addr & 0xfff] << 2;
+ UINT8 chargen_data = m_char_rom->base()[chargen_addr & 0xfff] << 2;
int x = hbp + (column + 4) * ABC800_CHAR_WIDTH;
for (int bit = 0; bit < ABC800_CHAR_WIDTH; bit++)
@@ -393,26 +392,6 @@ WRITE_LINE_MEMBER( abc806_state::vs_w )
//-------------------------------------------------
-// mc6845_interface crtc_intf
-//-------------------------------------------------
-
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- ABC800_CHAR_WIDTH,
- NULL,
- abc806_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(abc806_state, hs_w),
- DEVCB_DRIVER_LINE_MEMBER(abc806_state, vs_w),
- NULL
-};
-
-
-//-------------------------------------------------
// hr_update - high resolution screen update
//-------------------------------------------------
@@ -523,7 +502,12 @@ PALETTE_INIT_MEMBER( abc806_state, abc806 )
//-------------------------------------------------
MACHINE_CONFIG_FRAGMENT( abc806_video )
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, ABC800_CCLK, crtc_intf)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, SCREEN_TAG, ABC800_CCLK)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(ABC800_CHAR_WIDTH)
+ MCFG_MC6845_UPDATE_ROW_CB(abc806_state, abc806_update_row)
+ MCFG_MC6845_OUT_HSYNC_CB(WRITELINE(abc806_state, hs_w))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(abc806_state, vs_w))
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_UPDATE_DRIVER(abc806_state, screen_update)
diff --git a/src/mess/video/bbc.c b/src/mess/video/bbc.c
index c3df043c574..f504a1df513 100644
--- a/src/mess/video/bbc.c
+++ b/src/mess/video/bbc.c
@@ -162,15 +162,14 @@ WRITE8_MEMBER(bbc_state::bbc_videoULA_w)
* BBC circuits controlled by 6845 Outputs
************************************************************************/
-static MC6845_UPDATE_ROW( vid_update_row )
+MC6845_UPDATE_ROW( bbc_state::crtc_update_row )
{
- bbc_state *state = device->machine().driver_data<bbc_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
- if (state->m_videoULA_teletext_normal_select)
+ if (m_videoULA_teletext_normal_select)
{
- state->m_trom->lose_w(1);
- state->m_trom->lose_w(0);
+ m_trom->lose_w(1);
+ m_trom->lose_w(0);
for(int x_pos=0; x_pos<x_count; x_pos++)
{
@@ -180,22 +179,24 @@ static MC6845_UPDATE_ROW( vid_update_row )
if (((ma>>13)&1)==0)
{
- state->m_Teletext_Latch=0;
- } else {
- state->m_Teletext_Latch=(state->m_BBC_Video_RAM[state->calculate_video_address(ma+x_pos,ra)]);
+ m_Teletext_Latch=0;
+ }
+ else
+ {
+ m_Teletext_Latch=(m_BBC_Video_RAM[calculate_video_address(ma+x_pos,ra)]);
}
- state->m_trom->write((state->m_Teletext_Latch&0x3f)|(state->m_Teletext_Latch&0x40));
+ m_trom->write((m_Teletext_Latch&0x3f)|(m_Teletext_Latch&0x40));
- state->m_trom->f1_w(1);
- state->m_trom->f1_w(0);
+ m_trom->f1_w(1);
+ m_trom->f1_w(0);
for(int pixelno=0;pixelno<6;pixelno++)
{
- state->m_trom->tr6_w(1);
- state->m_trom->tr6_w(0);
+ m_trom->tr6_w(1);
+ m_trom->tr6_w(0);
- int col=state->m_trom->get_rgb() ^ ((x_pos==cursor_x) ? 7 : 0);
+ int col=m_trom->get_rgb() ^ ((x_pos==cursor_x) ? 7 : 0);
int r = BIT(col, 0) * 0xff;
int g = BIT(col, 1) * 0xff;
@@ -203,14 +204,14 @@ static MC6845_UPDATE_ROW( vid_update_row )
rgb_t rgb = rgb_t(r, g, b);
- bitmap.pix32(y, (x_pos*state->m_pixels_per_byte)+pixelno) = rgb;
+ bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno) = rgb;
}
}
if (ra == 18)
{
- state->m_trom->lose_w(1);
- state->m_trom->lose_w(0);
+ m_trom->lose_w(1);
+ m_trom->lose_w(0);
}
}
else
@@ -222,13 +223,13 @@ static MC6845_UPDATE_ROW( vid_update_row )
{
for(int x_pos=0; x_pos<x_count; x_pos++)
{
- int vmem=state->calculate_video_address(ma+x_pos,ra);
- unsigned char i=state->m_BBC_Video_RAM[vmem];
+ int vmem=calculate_video_address(ma+x_pos,ra);
+ unsigned char i=m_BBC_Video_RAM[vmem];
- for(int pixelno=0;pixelno<state->m_pixels_per_byte;pixelno++)
+ for(int pixelno=0;pixelno<m_pixels_per_byte;pixelno++)
{
- int col=state->m_videoULA_pallet_lookup[state->m_pixel_bits[i]] ^ ((x_pos==cursor_x) ? 7 : 0);
- bitmap.pix32(y, (x_pos*state->m_pixels_per_byte)+pixelno)=palette[col];
+ int col=m_videoULA_pallet_lookup[m_pixel_bits[i]] ^ ((x_pos==cursor_x) ? 7 : 0);
+ bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno)=palette[col];
i=(i<<1)|1;
}
}
@@ -237,9 +238,9 @@ static MC6845_UPDATE_ROW( vid_update_row )
{
for(int x_pos=0; x_pos<x_count; x_pos++)
{
- for(int pixelno=0;pixelno<state->m_pixels_per_byte;pixelno++)
+ for(int pixelno=0;pixelno<m_pixels_per_byte;pixelno++)
{
- bitmap.pix32(y, (x_pos*state->m_pixels_per_byte)+pixelno)=palette[7];
+ bitmap.pix32(y, (x_pos*m_pixels_per_byte)+pixelno)=palette[7];
}
}
}
@@ -251,25 +252,6 @@ WRITE_LINE_MEMBER(bbc_state::bbc_vsync)
m_trom->dew_w(state);
}
-
-MC6845_INTERFACE( bbc_mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* numbers of pixels per video memory address */
- NULL, /* begin_update */
- vid_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_NULL, /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_NULL, /* on_hsync_changed */
- DEVCB_DRIVER_LINE_MEMBER(bbc_state,bbc_vsync), /* on_vsync_changed */
- NULL
-};
-
-
-
-
/************************************************************************
* memory interface to BBC's 6845
************************************************************************/
diff --git a/src/mess/video/dgn_beta.c b/src/mess/video/dgn_beta.c
index 1dc294646e5..84a90cc0592 100644
--- a/src/mess/video/dgn_beta.c
+++ b/src/mess/video/dgn_beta.c
@@ -91,24 +91,23 @@ the access to the video memory is unclear to me at the moment.
#define GCtrlFS 0x20 /* labeled F/S, not yet sure of function Fast or Slow scan ? */
#define GCtrlAddrLines 0xC0 /* Top two address lines for text mode */
-#define IsTextMode (state->m_GCtrl & GCtrlChrGfx) ? 1 : 0 // Is this text mode ?
-#define IsGfx16 ((~state->m_GCtrl & GCtrlChrGfx) && (~state->m_GCtrl & GCtrlControl)) ? 1 : 0 // is this 320x256x16bpp mode
-#define IsGfx2 ((state->m_GCtrl & GCtrlHiLo) && (~state->m_GCtrl & GCtrlFS)) ? 1 : 0 // Is this a 2 colour mode
-#define SWChar (state->m_GCtrl & GCtrlSWChar)>>1 // Swchar bit
+#define IsTextMode (m_GCtrl & GCtrlChrGfx) ? 1 : 0 // Is this text mode ?
+#define IsGfx16 ((~m_GCtrl & GCtrlChrGfx) && (~m_GCtrl & GCtrlControl)) ? 1 : 0 // is this 320x256x16bpp mode
+#define IsGfx2 ((m_GCtrl & GCtrlHiLo) && (~m_GCtrl & GCtrlFS)) ? 1 : 0 // Is this a 2 colour mode
+#define SWChar (m_GCtrl & GCtrlSWChar)>>1 // Swchar bit
-static MC6845_UPDATE_ROW( dgnbeta_update_row )
+MC6845_UPDATE_ROW( dgn_beta_state::crtc_update_row )
{
- dgn_beta_state *state = device->machine().driver_data<dgn_beta_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
- UINT8 *videoram = state->m_videoram;
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
+ UINT8 *videoram = m_videoram;
UINT32 *p = &bitmap.pix32(y);
int i;
if(IsTextMode)
{
- UINT8 *chr_gen = state->memregion("gfx1")->base();
+ UINT8 *chr_gen = memregion("gfx1")->base();
for ( i = 0; i < x_count; i++ )
{
- UINT32 offset = ( ( ma + i ) | ((state->m_GCtrl & GCtrlAddrLines)<<8)) << 1;
+ UINT32 offset = ( ( ma + i ) | ((m_GCtrl & GCtrlAddrLines)<<8)) << 1;
UINT8 chr = videoram[ offset ];
UINT8 attr = videoram[ offset +1 ];
@@ -122,7 +121,7 @@ static MC6845_UPDATE_ROW( dgnbeta_update_row )
int ULActive=(UnderLine && (ra==9) && ~SWChar);
/* Invert forground and background if flashing char and flash acive */
- int Invert=(FlashChar & state->m_FlashBit);
+ int Invert=(FlashChar & m_FlashBit);
/* Underline inverts flash */
if (ULActive)
@@ -215,7 +214,7 @@ static MC6845_UPDATE_ROW( dgnbeta_update_row )
{
for (Dot=0;Dot<16;Dot=Dot+1)
{
- Colour=state->m_ColourRAM[((Word&0x8000)>>15)];
+ Colour=m_ColourRAM[((Word&0x8000)>>15)];
*p = palette[Colour]; p++;
@@ -227,7 +226,7 @@ static MC6845_UPDATE_ROW( dgnbeta_update_row )
{
for (Dot=0;Dot<8;Dot++)
{
- Colour=state->m_ColourRAM[((Word&0x8000)>>14) | ((Word&0x80)>>7)];
+ Colour=m_ColourRAM[((Word&0x8000)>>14) | ((Word&0x80)>>7)];
*p = palette[Colour]; p++;
*p = palette[Colour]; p++;
@@ -256,21 +255,6 @@ WRITE_LINE_MEMBER(dgn_beta_state::dgnbeta_vsync_changed)
dgn_beta_frame_interrupt(state);
}
-MC6845_INTERFACE( dgnbeta_crtc6845_interface )
-{
- false,
- 0,0,0,0,
- 16 /*?*/,
- NULL,
- dgnbeta_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(dgn_beta_state,dgnbeta_vsync_changed),
- NULL
-};
-
/* Set video control register from I28 port B, the control register is laid out as */
/* follows :- */
diff --git a/src/mess/video/kaypro.c b/src/mess/video/kaypro.c
index 8e415498cd5..d4845b1b682 100644
--- a/src/mess/video/kaypro.c
+++ b/src/mess/video/kaypro.c
@@ -131,10 +131,9 @@ UINT32 kaypro_state::screen_update_kaypro2x(screen_device &screen, bitmap_rgb32
Not sure how the attributes interact, for example does an underline blink? */
-MC6845_UPDATE_ROW( kaypro2x_update_row )
+MC6845_UPDATE_ROW( kaypro_state::kaypro2x_update_row )
{
- kaypro_state *state = device->machine().driver_data<kaypro_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
UINT16 x;
UINT8 gfx,fg,bg;
@@ -144,8 +143,8 @@ MC6845_UPDATE_ROW( kaypro2x_update_row )
UINT8 inv=0;
// if (x == cursor_x) inv=0xff; /* uncomment when mame fixed */
UINT16 mem = (ma + x) & 0x7ff;
- UINT8 chr = state->m_p_videoram[mem];
- UINT8 attr = state->m_p_videoram[mem | 0x800];
+ UINT8 chr = m_p_videoram[mem];
+ UINT8 attr = m_p_videoram[mem | 0x800];
if ((attr & 3) == 3)
{
@@ -171,18 +170,18 @@ MC6845_UPDATE_ROW( kaypro2x_update_row )
}
/* Take care of flashing characters */
- if ( (BIT(attr, 2)) & (BIT(state->m_framecnt, 3)) )
+ if ( (BIT(attr, 2)) & (BIT(m_framecnt, 3)) )
fg = bg;
/* process cursor */
if (x == cursor_x)
- inv ^= state->m_mc6845_cursor[ra];
+ inv ^= m_mc6845_cursor[ra];
/* get pattern of pixels for that character scanline */
if ( (ra == 15) & (BIT(attr, 3)) ) /* underline */
gfx = 0xff;
else
- gfx = state->m_p_chargen[(chr<<4) | ra ] ^ inv;
+ gfx = m_p_chargen[(chr<<4) | ra ] ^ inv;
/* Display a scanline of a character (8 pixels) */
*p++ = palette[BIT( gfx, 7 ) ? fg : bg];
diff --git a/src/mess/video/mbc55x.c b/src/mess/video/mbc55x.c
index bc48ae654d1..5d9eb0bc3be 100644
--- a/src/mess/video/mbc55x.c
+++ b/src/mess/video/mbc55x.c
@@ -71,7 +71,7 @@ give the leftmost column of the rectangle, the next four give the next column, a
#define DEBUG_LINES 1
#define DEBUG_VSYNC 2
-#define DEBUG_SET(flags) ((mstate->m_debug_video & (flags))==(flags))
+#define DEBUG_SET(flags) ((m_debug_video & (flags))==(flags))
static void video_debug(running_machine &machine, int ref, int params, const char *param[])
{
@@ -87,14 +87,13 @@ static void video_debug(running_machine &machine, int ref, int params, const cha
}
}
-static MC6845_UPDATE_ROW( vid_update_row )
+MC6845_UPDATE_ROW( mbc55x_state::crtc_update_row )
{
- mbc55x_state *mstate = device->machine().driver_data<mbc55x_state>();
- const rgb_t *palette = mstate->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
- UINT8 *ram = &mstate->m_ram->pointer()[0];
- UINT8 *red = &mstate->m_video_mem[RED_PLANE_OFFSET];
- UINT8 *blue = &mstate->m_video_mem[BLUE_PLANE_OFFSET];
+ UINT8 *ram = &m_ram->pointer()[0];
+ UINT8 *red = &m_video_mem[RED_PLANE_OFFSET];
+ UINT8 *blue = &m_video_mem[BLUE_PLANE_OFFSET];
UINT8 *green;
int offset;
UINT8 rpx,gpx,bpx;
@@ -106,7 +105,7 @@ static MC6845_UPDATE_ROW( vid_update_row )
UINT8 shifts;
UINT8 colour;
- switch(mstate->m_vram_page)
+ switch(m_vram_page)
{
case 4 : green=&ram[0x08000]; break;
case 5 : green=&ram[0x1C000]; break;
@@ -158,21 +157,6 @@ WRITE_LINE_MEMBER( mbc55x_state::vid_vsync_changed )
{
}
-MC6845_INTERFACE( mb55x_mc6845_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* numbers of pixels per video memory address */
- NULL, /* begin_update */
- vid_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_NULL, /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_DRIVER_LINE_MEMBER(mbc55x_state, vid_hsync_changed), /* on_hsync_changed */
- DEVCB_DRIVER_LINE_MEMBER(mbc55x_state, vid_vsync_changed), /* on_vsync_changed */
- NULL
-};
-
void mbc55x_state::video_start()
{
m_debug_video=0;
diff --git a/src/mess/video/mbee.c b/src/mess/video/mbee.c
index fdfd99cd5f3..c1a46682a85 100644
--- a/src/mess/video/mbee.c
+++ b/src/mess/video/mbee.c
@@ -149,7 +149,7 @@ WRITE8_MEMBER( mbee_state::mbeeppc_1c_w )
/* d7 extended graphics (1=allow attributes and pcg banks)
d5 bankswitch basic rom
d4 select attribute ram
- d3..d0 select state->m_videoram bank */
+ d3..d0 select m_videoram bank */
m_1c = data;
membank("basic")->set_entry(BIT(data, 5));
@@ -160,7 +160,7 @@ WRITE8_MEMBER( mbee_state::mbee256_1c_w )
/* d7 extended graphics (1=allow attributes and pcg banks)
d5 bankswitch basic rom
d4 select attribute ram
- d3..d0 select state->m_videoram bank */
+ d3..d0 select m_videoram bank */
m_1c = data;
}
@@ -401,22 +401,21 @@ UINT32 mbee_state::screen_update_mbee(screen_device &screen, bitmap_rgb32 &bitma
}
-MC6845_ON_UPDATE_ADDR_CHANGED( mbee_update_addr )
+MC6845_ON_UPDATE_ADDR_CHANGED( mbee_state::mbee_update_addr )
{
/* not sure what goes in here - parameters passed are device, address, strobe */
}
-MC6845_ON_UPDATE_ADDR_CHANGED( mbee256_update_addr )
+MC6845_ON_UPDATE_ADDR_CHANGED( mbee_state::mbee256_update_addr )
{
/* not used on 256TC */
}
/* monochrome bee */
-MC6845_UPDATE_ROW( mbee_update_row )
+MC6845_UPDATE_ROW( mbee_state::mbee_update_row )
{
- mbee_state *state = device->machine().driver_data<mbee_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -425,16 +424,16 @@ MC6845_UPDATE_ROW( mbee_update_row )
{
UINT8 inv=0;
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
+ chr = m_p_videoram[mem];
- state->mbee_video_kbd_scan(x+ma);
+ mbee_video_kbd_scan(x+ma);
/* process cursor */
if (x == cursor_x)
- inv ^= state->m_sy6545_cursor[ra]; // cursor scan row
+ inv ^= m_sy6545_cursor[ra]; // cursor scan row
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_gfxram[(chr<<4) | ra] ^ inv;
+ gfx = m_p_gfxram[(chr<<4) | ra] ^ inv;
/* Display a scanline of a character (8 pixels) */
*p++ = palette[BIT(gfx, 7)];
@@ -449,30 +448,29 @@ MC6845_UPDATE_ROW( mbee_update_row )
}
/* prom-based colours */
-MC6845_UPDATE_ROW( mbeeic_update_row )
+MC6845_UPDATE_ROW( mbee_state::mbeeic_update_row )
{
- mbee_state *state = device->machine().driver_data<mbee_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,gfx,fg,bg;
UINT16 mem,x,col;
- UINT16 colourm = (state->m_08 & 0x0e) << 7;
+ UINT16 colourm = (m_08 & 0x0e) << 7;
UINT32 *p = &bitmap.pix32(y);
for (x = 0; x < x_count; x++) // for each character
{
UINT8 inv=0;
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
- col = state->m_p_colorram[mem] | colourm; // read a byte of colour
+ chr = m_p_videoram[mem];
+ col = m_p_colorram[mem] | colourm; // read a byte of colour
- state->mbee_video_kbd_scan(x+ma);
+ mbee_video_kbd_scan(x+ma);
/* process cursor */
if (x == cursor_x)
- inv ^= state->m_sy6545_cursor[ra]; // cursor scan row
+ inv ^= m_sy6545_cursor[ra]; // cursor scan row
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_gfxram[(chr<<4) | ra] ^ inv;
+ gfx = m_p_gfxram[(chr<<4) | ra] ^ inv;
fg = (col & 0x001f) | 64; // map to foreground palette
bg = (col & 0x07e0) >> 5; // and background palette
@@ -490,10 +488,9 @@ MC6845_UPDATE_ROW( mbeeic_update_row )
/* new colours & hires2 */
-MC6845_UPDATE_ROW( mbeeppc_update_row )
+MC6845_UPDATE_ROW( mbee_state::mbeeppc_update_row )
{
- mbee_state *state = device->machine().driver_data<mbee_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 gfx,fg,bg;
UINT16 mem,x,col,chr;
UINT32 *p = &bitmap.pix32(y);
@@ -502,12 +499,12 @@ MC6845_UPDATE_ROW( mbeeppc_update_row )
{
UINT8 inv=0;
mem = (ma + x) & 0x7ff;
- chr = state->m_p_videoram[mem];
- col = state->m_p_colorram[mem]; // read a byte of colour
+ chr = m_p_videoram[mem];
+ col = m_p_colorram[mem]; // read a byte of colour
- if (state->m_1c & 0x80) // are extended features enabled?
+ if (m_1c & 0x80) // are extended features enabled?
{
- UINT8 attr = state->m_p_attribram[mem];
+ UINT8 attr = m_p_attribram[mem];
if (chr & 0x80)
chr += ((attr & 15) << 7); // bump chr to its particular pcg definition
@@ -515,18 +512,18 @@ MC6845_UPDATE_ROW( mbeeppc_update_row )
if (attr & 0x40)
inv ^= 0xff; // inverse attribute
- if ((attr & 0x80) && (state->m_framecnt & 0x10)) // flashing attribute
+ if ((attr & 0x80) && (m_framecnt & 0x10)) // flashing attribute
chr = 0x20;
}
- state->mbee_video_kbd_scan(x+ma);
+ mbee_video_kbd_scan(x+ma);
/* process cursor */
if (x == cursor_x)
- inv ^= state->m_sy6545_cursor[ra]; // cursor scan row
+ inv ^= m_sy6545_cursor[ra]; // cursor scan row
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_gfxram[(chr<<4) | ra] ^ inv;
+ gfx = m_p_gfxram[(chr<<4) | ra] ^ inv;
fg = col & 15; // map to foreground palette
bg = (col & 0xf0) >> 4; // and background palette
diff --git a/src/mess/video/pc1512.c b/src/mess/video/pc1512.c
index f51549967ca..39ae133f0a7 100644
--- a/src/mess/video/pc1512.c
+++ b/src/mess/video/pc1512.c
@@ -360,7 +360,7 @@ WRITE8_MEMBER( pc1512_state::vdu_w )
//-------------------------------------------------
-// mc6845_interface crtc_intf
+// mc6845
//-------------------------------------------------
int pc1512_state::get_display_mode(UINT8 mode)
@@ -394,7 +394,7 @@ offs_t pc1512_state::get_char_rom_offset()
return ((m_lk->read() >> 5) & 0x03) << 11;
}
-void pc1512_state::draw_alpha(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( pc1512_state::draw_alpha )
{
offs_t char_rom_offset = get_char_rom_offset();
UINT32 *p = &bitmap.pix32(y + vbp, hbp);
@@ -463,7 +463,7 @@ int pc1512_state::get_color(UINT8 data)
return color;
};
-void pc1512_state::draw_graphics_1(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( pc1512_state::draw_graphics_1 )
{
if (y > 199) return;
@@ -483,7 +483,7 @@ void pc1512_state::draw_graphics_1(bitmap_rgb32 &bitmap, const rectangle &clipre
}
}
-void pc1512_state::draw_graphics_2(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, int de, int hbp, int vbp, void *param)
+MC6845_UPDATE_ROW( pc1512_state::draw_graphics_2 )
{
if (y > 199) return;
@@ -506,42 +506,25 @@ void pc1512_state::draw_graphics_2(bitmap_rgb32 &bitmap, const rectangle &clipre
}
}
-static MC6845_UPDATE_ROW( pc1512_update_row )
+MC6845_UPDATE_ROW( pc1512_state::crtc_update_row )
{
- pc1512_state *state = device->machine().driver_data<pc1512_state>();
-
- switch (state->get_display_mode(state->m_vdu_mode))
+ switch (get_display_mode(m_vdu_mode))
{
case ALPHA_40:
case ALPHA_80:
- state->draw_alpha(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param);
+ draw_alpha(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
break;
case GRAPHICS_1:
- state->draw_graphics_1(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param);
+ draw_graphics_1(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
break;
case GRAPHICS_2:
- state->draw_graphics_2(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param);
+ draw_graphics_2(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
break;
}
}
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- pc1512_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
-
void pc1512_state::video_start()
{
@@ -616,5 +599,8 @@ MACHINE_CONFIG_FRAGMENT( pc1512_video )
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
MCFG_SCREEN_REFRESH_RATE(50)
- MCFG_MC6845_ADD(AMS40041_TAG, AMS40041, SCREEN_TAG, XTAL_28_63636MHz/32, crtc_intf)
+ MCFG_MC6845_ADD(AMS40041_TAG, AMS40041, SCREEN_TAG, XTAL_28_63636MHz/32)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(pc1512_state, crtc_update_row)
MACHINE_CONFIG_END
diff --git a/src/mess/video/pc8401a.c b/src/mess/video/pc8401a.c
index 2d2d0889d60..835854d50f6 100644
--- a/src/mess/video/pc8401a.c
+++ b/src/mess/video/pc8401a.c
@@ -49,27 +49,6 @@ static ADDRESS_MAP_START( pc8500_lcdc, AS_0, 8, pc8401a_state )
AM_RANGE(0x0000, 0x3fff) AM_RAM
ADDRESS_MAP_END
-/* MC6845 Interface */
-
-static MC6845_UPDATE_ROW( pc8441a_update_row )
-{
-}
-
-
-static MC6845_INTERFACE( pc8441a_mc6845_interface )
-{
- false,
- 0,0,0,0,
- 6,
- NULL,
- pc8441a_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- NULL
-};
/* Machine Drivers */
@@ -115,5 +94,7 @@ MACHINE_CONFIG_FRAGMENT( pc8500_video )
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_PALETTE("palette")
- MCFG_MC6845_ADD(MC6845_TAG, MC6845, CRT_SCREEN_TAG, 400000, pc8441a_mc6845_interface)
+ MCFG_MC6845_ADD(MC6845_TAG, MC6845, CRT_SCREEN_TAG, 400000)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(6)
MACHINE_CONFIG_END
diff --git a/src/mess/video/pc_t1t.c b/src/mess/video/pc_t1t.c
index 83211353910..54c232e94d7 100644
--- a/src/mess/video/pc_t1t.c
+++ b/src/mess/video/pc_t1t.c
@@ -13,6 +13,17 @@
#include "machine/pic8259.h"
#include "machine/ram.h"
+enum
+{
+ T1000_TEXT_INTEN = 0,
+ T1000_TEXT_BLINK,
+ T1000_GFX_1BPP,
+ T1000_GFX_2BPP,
+ T1000_GFX_4BPP,
+ T1000_GFX_2BPP_TGA,
+ PCJX_TEXT,
+ PCJR_GFX_2BPP_HIGH
+};
const device_type PCVIDEO_T1000 = &device_creator<pcvideo_t1000_device>;
@@ -32,6 +43,7 @@ pc_t1t_device::pc_t1t_device(const machine_config &mconfig, device_type type, co
m_chr_size(0),
m_ra_offset(0),
m_address_data_ff(0),
+ m_update_row_type(-1),
m_display_enable(0),
m_vsync(0),
m_palette_base(0),
@@ -55,7 +67,6 @@ pcvideo_pcjr_device::pcvideo_pcjr_device(const machine_config &mconfig, const ch
void pcvideo_t1000_device::device_start()
{
m_chr_gen = machine().root_device().memregion("gfx1")->base();
- m_update_row = NULL;
m_bank = 0;
m_chr_size = 1;
m_ra_offset = 256;
@@ -65,7 +76,6 @@ void pcvideo_t1000_device::device_start()
void pcvideo_pcjr_device::device_start()
{
m_chr_gen = machine().root_device().memregion("gfx1")->base();
- m_update_row = NULL;
m_bank = 0;
m_mode_control = 0x08;
m_chr_size = 8;
@@ -77,31 +87,12 @@ void pcvideo_pcjr_device::device_start()
}
-static MC6845_UPDATE_ROW( t1000_update_row );
-
-
/***************************************************************************
Static declarations
***************************************************************************/
-static MC6845_INTERFACE( mc6845_t1000_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* numbers of pixels per video memory address */
- NULL, /* begin_update */
- t1000_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pc_t1t_device, t1000_de_changed), /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_NULL, /* on_hsync_changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pcvideo_t1000_device, t1000_vsync_changed), /* on_vsync_changed */
- NULL,
-};
-
-
MACHINE_CONFIG_FRAGMENT( pcvideo_t1000 )
MCFG_SCREEN_ADD(T1000_SCREEN_NAME, RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_14_31818MHz,912,0,640,262,0,200)
@@ -110,7 +101,12 @@ MACHINE_CONFIG_FRAGMENT( pcvideo_t1000 )
MCFG_PALETTE_ADD( "palette", 32 )
MCFG_PALETTE_INIT_OWNER(pc_t1t_device, pcjr)
- MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/8, mc6845_t1000_intf)
+ MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(pc_t1t_device, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(pc_t1t_device, t1000_de_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(pcvideo_t1000_device, t1000_vsync_changed))
MACHINE_CONFIG_END
machine_config_constructor pcvideo_t1000_device::device_mconfig_additions() const
@@ -119,22 +115,6 @@ machine_config_constructor pcvideo_t1000_device::device_mconfig_additions() cons
}
-static MC6845_INTERFACE( mc6845_pcjr_intf )
-{
- false, /* show border area */
- 0,0,0,0, /* visarea adjustment */
- 8, /* numbers of pixels per video memory address */
- NULL, /* begin_update */
- t1000_update_row, /* update_row */
- NULL, /* end_update */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pc_t1t_device, t1000_de_changed), /* on_de_changed */
- DEVCB_NULL, /* on_cur_changed */
- DEVCB_NULL, /* on_hsync_changed */
- DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pcvideo_pcjr_device, pcjr_vsync_changed), /* on_vsync_changed */
- NULL
-};
-
-
MACHINE_CONFIG_FRAGMENT( pcvideo_pcjr )
MCFG_SCREEN_ADD(T1000_SCREEN_NAME, RASTER)
MCFG_SCREEN_RAW_PARAMS(XTAL_14_31818MHz,912,0,640,262,0,200)
@@ -143,7 +123,12 @@ MACHINE_CONFIG_FRAGMENT( pcvideo_pcjr )
MCFG_PALETTE_ADD( "palette", 32 )
MCFG_PALETTE_INIT_OWNER(pc_t1t_device, pcjr)
- MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/16, mc6845_pcjr_intf)
+ MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/16)
+ MCFG_MC6845_SHOW_BORDER_AREA(false)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(pcvideo_pcjr_device, crtc_update_row)
+ MCFG_MC6845_OUT_DE_CB(WRITELINE(pc_t1t_device, t1000_de_changed))
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(pcvideo_pcjr_device, pcjr_vsync_changed))
MACHINE_CONFIG_END
machine_config_constructor pcvideo_pcjr_device::device_mconfig_additions() const
@@ -180,10 +165,9 @@ PALETTE_INIT_MEMBER( pc_t1t_device, pcjr )
}
-static MC6845_UPDATE_ROW( t1000_text_inten_update_row )
+MC6845_UPDATE_ROW( pc_t1t_device::t1000_text_inten_update_row )
{
- pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner());
- const rgb_t *palette = t1t->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
@@ -191,13 +175,13 @@ static MC6845_UPDATE_ROW( t1000_text_inten_update_row )
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
- UINT8 chr = t1t->m_displayram[ offset ];
- UINT8 attr = t1t->m_displayram[ offset +1 ];
- UINT8 data = t1t->m_chr_gen[ chr * t1t->m_chr_size + ra * t1t->m_ra_offset ];
- UINT16 fg = t1t->m_palette_base + ( attr & 0x0F );
- UINT16 bg = t1t->m_palette_base + ( ( attr >> 4 ) & 0x07 );
+ UINT8 chr = m_displayram[ offset ];
+ UINT8 attr = m_displayram[ offset +1 ];
+ UINT8 data = m_chr_gen[ chr * m_chr_size + ra * m_ra_offset ];
+ UINT16 fg = m_palette_base + ( attr & 0x0F );
+ UINT16 bg = m_palette_base + ( ( attr >> 4 ) & 0x07 );
- if ( i == cursor_x && ( t1t->m_pc_framecnt & 0x08 ) )
+ if ( i == cursor_x && ( m_pc_framecnt & 0x08 ) )
{
data = 0xFF;
}
@@ -214,32 +198,31 @@ static MC6845_UPDATE_ROW( t1000_text_inten_update_row )
}
-static MC6845_UPDATE_ROW( t1000_text_blink_update_row )
+MC6845_UPDATE_ROW( pc_t1t_device::t1000_text_blink_update_row )
{
- pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner());
- const rgb_t *palette = t1t->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
- UINT8 chr = t1t->m_displayram[ offset ];
- UINT8 attr = t1t->m_displayram[ offset +1 ];
- UINT8 data = t1t->m_chr_gen[ chr * t1t->m_chr_size + ra * t1t->m_ra_offset ];
- UINT16 fg = t1t->m_palette_base + ( attr & 0x0F );
- UINT16 bg = t1t->m_palette_base + ( ( attr >> 4 ) & 0x07 );
+ UINT8 chr = m_displayram[ offset ];
+ UINT8 attr = m_displayram[ offset +1 ];
+ UINT8 data = m_chr_gen[ chr * m_chr_size + ra * m_ra_offset ];
+ UINT16 fg = m_palette_base + ( attr & 0x0F );
+ UINT16 bg = m_palette_base + ( ( attr >> 4 ) & 0x07 );
if ( i == cursor_x )
{
- if ( t1t->m_pc_framecnt & 0x08 )
+ if ( m_pc_framecnt & 0x08 )
{
data = 0xFF;
}
}
else
{
- if ( ( attr & 0x80 ) && ( t1t->m_pc_framecnt & 0x10 ) )
+ if ( ( attr & 0x80 ) && ( m_pc_framecnt & 0x10 ) )
{
data = 0x00;
}
@@ -256,36 +239,35 @@ static MC6845_UPDATE_ROW( t1000_text_blink_update_row )
}
}
-static MC6845_UPDATE_ROW( pcjx_text_update_row )
+MC6845_UPDATE_ROW( pcvideo_pcjr_device::pcjx_text_update_row )
{
- pcvideo_pcjr_device *pcjx = downcast<pcvideo_pcjr_device *>(device->owner());
- const rgb_t *palette = pcjx->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
int i;
for ( i = 0; i < x_count; i++ )
{
UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
- UINT8 chr = pcjx->m_displayram[ offset ];
- UINT8 attr = pcjx->m_displayram[ offset +1 ];
- UINT16 fg = pcjx->m_palette_base + ( attr & 0x07 );
- UINT16 bg = pcjx->m_palette_base + ( ( attr >> 4 ) & 0x07 );
+ UINT8 chr = m_displayram[ offset ];
+ UINT8 attr = m_displayram[ offset +1 ];
+ UINT16 fg = m_palette_base + ( attr & 0x07 );
+ UINT16 bg = m_palette_base + ( ( attr >> 4 ) & 0x07 );
UINT16 code = chr & 0x1f;
if((attr & 0x88) == 0x88)
{
- code = pcjx->m_displayram[ offset - 2 ] & 0x1f;
+ code = m_displayram[ offset - 2 ] & 0x1f;
code = (code << 8) + chr;
}
else if(attr & 0x80)
- code = (code << 8) + pcjx->m_displayram[ offset + 2 ];
+ code = (code << 8) + m_displayram[ offset + 2 ];
else
code = chr;
UINT8 data;
if(ra < 16)
- data = pcjx->m_jxkanji[code * 16 * 2 + (ra * 2) + ((attr & 8)?1:0)];
+ data = m_jxkanji[code * 16 * 2 + (ra * 2) + ((attr & 8)?1:0)];
else
- data = ((i == cursor_x) && (pcjx->m_pc_framecnt & 8)) ? 0xff: 0;
+ data = ((i == cursor_x) && (m_pc_framecnt & 8)) ? 0xff: 0;
*p = palette[( data & 0x80 ) ? fg : bg]; p++;
*p = palette[( data & 0x40 ) ? fg : bg]; p++;
@@ -298,12 +280,11 @@ static MC6845_UPDATE_ROW( pcjx_text_update_row )
}
}
-static MC6845_UPDATE_ROW( t1000_gfx_4bpp_update_row )
+MC6845_UPDATE_ROW( pc_t1t_device::t1000_gfx_4bpp_update_row )
{
- pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner());
- const rgb_t *palette = t1t->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = t1t->m_displayram + ( ra << 13 );
+ UINT8 *vid = m_displayram + ( ra << 13 );
int i;
for ( i = 0; i < x_count; i++ )
@@ -311,27 +292,26 @@ static MC6845_UPDATE_ROW( t1000_gfx_4bpp_update_row )
UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
UINT8 data = vid[ offset ];
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data >> 4 )]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data >> 4 )]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data & 0x0F )]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data & 0x0F )]]; p++;
+ *p = palette[m_palette_base + m_reg.data[0x10 + ( data >> 4 )]]; p++;
+ *p = palette[m_palette_base + m_reg.data[0x10 + ( data >> 4 )]]; p++;
+ *p = palette[m_palette_base + m_reg.data[0x10 + ( data & 0x0F )]]; p++;
+ *p = palette[m_palette_base + m_reg.data[0x10 + ( data & 0x0F )]]; p++;
data = vid[ offset + 1 ];
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data >> 4 )]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data >> 4 )]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data & 0x0F )]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data & 0x0F )]]; p++;
+ *p = palette[m_palette_base + m_reg.data[0x10 + ( data >> 4 )]]; p++;
+ *p = palette[m_palette_base + m_reg.data[0x10 + ( data >> 4 )]]; p++;
+ *p = palette[m_palette_base + m_reg.data[0x10 + ( data & 0x0F )]]; p++;
+ *p = palette[m_palette_base + m_reg.data[0x10 + ( data & 0x0F )]]; p++;
}
}
-static MC6845_UPDATE_ROW( t1000_gfx_2bpp_update_row )
+MC6845_UPDATE_ROW( pc_t1t_device::t1000_gfx_2bpp_update_row )
{
- pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner());
- const rgb_t *palette = t1t->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = t1t->m_displayram + ( ra << 13 );
+ UINT8 *vid = m_displayram + ( ra << 13 );
int i;
for ( i = 0; i < x_count; i++ )
@@ -339,27 +319,26 @@ static MC6845_UPDATE_ROW( t1000_gfx_2bpp_update_row )
UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
UINT8 data = vid[ offset ];
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( data & 0x03 ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( data & 0x03 ) ]]; p++;
data = vid[ offset+1 ];
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
- *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( data & 0x03 ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( data & 0x03 ) ]]; p++;
}
}
-static MC6845_UPDATE_ROW( pcjr_gfx_2bpp_high_update_row )
+MC6845_UPDATE_ROW( pcvideo_pcjr_device::pcjr_gfx_2bpp_high_update_row )
{
- pcvideo_pcjr_device *pcjr = downcast<pcvideo_pcjr_device *>(device->owner());
- const rgb_t *palette = pcjr->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = pcjr->m_displayram + ( ra << 13 );
+ UINT8 *vid = m_displayram + ( ra << 13 );
int i;
for ( i = 0; i < x_count; i++ )
@@ -368,24 +347,23 @@ static MC6845_UPDATE_ROW( pcjr_gfx_2bpp_high_update_row )
UINT8 data0 = vid[ offset ];
UINT8 data1 = vid[ offset + 1 ];
- *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x80 ) >> 7 ) | ( ( data1 & 0x80 ) >> 6 ) ) ]]; p++;
- *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x40 ) >> 6 ) | ( ( data1 & 0x40 ) >> 5 ) ) ]]; p++;
- *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x20 ) >> 5 ) | ( ( data1 & 0x20 ) >> 4 ) ) ]]; p++;
- *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x10 ) >> 4 ) | ( ( data1 & 0x10 ) >> 3 ) ) ]]; p++;
- *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x08 ) >> 3 ) | ( ( data1 & 0x08 ) >> 2 ) ) ]]; p++;
- *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x04 ) >> 2 ) | ( ( data1 & 0x04 ) >> 1 ) ) ]]; p++;
- *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x02 ) >> 1 ) | ( ( data1 & 0x02 ) ) ) ]]; p++;
- *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x01 ) ) | ( ( data1 & 0x01 ) << 1 ) ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x80 ) >> 7 ) | ( ( data1 & 0x80 ) >> 6 ) ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x40 ) >> 6 ) | ( ( data1 & 0x40 ) >> 5 ) ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x20 ) >> 5 ) | ( ( data1 & 0x20 ) >> 4 ) ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x10 ) >> 4 ) | ( ( data1 & 0x10 ) >> 3 ) ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x08 ) >> 3 ) | ( ( data1 & 0x08 ) >> 2 ) ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x04 ) >> 2 ) | ( ( data1 & 0x04 ) >> 1 ) ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x02 ) >> 1 ) | ( ( data1 & 0x02 ) ) ) ]]; p++;
+ *p = palette[m_palette_base + m_reg.data[ 0x10 + ( ( ( data0 & 0x01 ) ) | ( ( data1 & 0x01 ) << 1 ) ) ]]; p++;
}
}
-static MC6845_UPDATE_ROW( t1000_gfx_2bpp_tga_update_row )
+MC6845_UPDATE_ROW( pc_t1t_device::t1000_gfx_2bpp_tga_update_row )
{
- pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner());
- const rgb_t *palette = t1t->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = t1t->m_displayram + ( ra << 13 );
+ UINT8 *vid = m_displayram + ( ra << 13 );
int i;
if ( y == 0 ) logerror("t1000_gfx_2bpp_tga_update_row\n");
@@ -395,27 +373,26 @@ static MC6845_UPDATE_ROW( t1000_gfx_2bpp_tga_update_row )
UINT8 data = vid[ offset ];
UINT16 data2 = ( vid[ offset + 1 ] ) << 1;
- *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x100 ) | ( data & 0x80 ) ) >> 7 ) ]]; p++;
- *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x80 ) | ( data & 0x40 ) ) >> 6 ) ]]; p++;
- *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x40 ) | ( data & 0x20 ) ) >> 5 ) ]]; p++;
- *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x20 ) | ( data & 0x10 ) ) >> 4 ) ]]; p++;
+ *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x100 ) | ( data & 0x80 ) ) >> 7 ) ]]; p++;
+ *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x80 ) | ( data & 0x40 ) ) >> 6 ) ]]; p++;
+ *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x40 ) | ( data & 0x20 ) ) >> 5 ) ]]; p++;
+ *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x20 ) | ( data & 0x10 ) ) >> 4 ) ]]; p++;
- *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x10 ) | ( data & 0x08 ) ) >> 3 ) ]]; p++;
- *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x08 ) | ( data & 0x04 ) ) >> 2 ) ]]; p++;
- *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x04 ) | ( data & 0x02 ) ) >> 1 ) ]]; p++;
- *p = palette[t1t->m_reg.data[ 0x10 + ( ( data2 & 0x02 ) | ( data & 0x01 ) ) ]]; p++;
+ *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x10 ) | ( data & 0x08 ) ) >> 3 ) ]]; p++;
+ *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x08 ) | ( data & 0x04 ) ) >> 2 ) ]]; p++;
+ *p = palette[m_reg.data[ 0x10 + ( ( ( data2 & 0x04 ) | ( data & 0x02 ) ) >> 1 ) ]]; p++;
+ *p = palette[m_reg.data[ 0x10 + ( ( data2 & 0x02 ) | ( data & 0x01 ) ) ]]; p++;
}
}
-static MC6845_UPDATE_ROW( t1000_gfx_1bpp_update_row )
+MC6845_UPDATE_ROW( pc_t1t_device::t1000_gfx_1bpp_update_row )
{
- pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner());
- const rgb_t *palette = t1t->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT32 *p = &bitmap.pix32(y);
- UINT8 *vid = t1t->m_displayram + ( ra << 13 );
- UINT8 fg = t1t->m_palette_base + t1t->m_reg.data[0x11];
- UINT8 bg = t1t->m_palette_base + t1t->m_reg.data[0x10];
+ UINT8 *vid = m_displayram + ( ra << 13 );
+ UINT8 fg = m_palette_base + m_reg.data[0x11];
+ UINT8 bg = m_palette_base + m_reg.data[0x10];
int i;
if ( y == 0 ) logerror("t1000_gfx_1bpp_update_row\n");
@@ -446,13 +423,51 @@ static MC6845_UPDATE_ROW( t1000_gfx_1bpp_update_row )
}
}
+MC6845_UPDATE_ROW( pc_t1t_device::crtc_update_row )
+{
+ if (m_update_row_type == -1)
+ return;
+
+ switch (m_update_row_type)
+ {
+ case T1000_TEXT_INTEN:
+ t1000_text_inten_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case T1000_TEXT_BLINK:
+ t1000_text_blink_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case T1000_GFX_1BPP:
+ t1000_gfx_1bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case T1000_GFX_2BPP:
+ t1000_gfx_2bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case T1000_GFX_2BPP_TGA:
+ t1000_gfx_2bpp_tga_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case T1000_GFX_4BPP:
+ t1000_gfx_4bpp_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ }
+}
+
-static MC6845_UPDATE_ROW( t1000_update_row )
+MC6845_UPDATE_ROW( pcvideo_pcjr_device::crtc_update_row )
{
- pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner());
- if ( t1t->m_update_row )
+ if (m_update_row_type == -1)
+ return;
+
+ switch (m_update_row_type)
{
- t1t->m_update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp, param );
+ case PCJX_TEXT:
+ pcjx_text_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ case PCJR_GFX_2BPP_HIGH:
+ pcjr_gfx_2bpp_high_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
+ default:
+ pc_t1t_device::crtc_update_row(bitmap, cliprect, ma, ra, y, x_count, cursor_x, de, hbp, vbp);
+ break;
}
}
@@ -478,10 +493,10 @@ void pcvideo_t1000_device::mode_switch( void )
switch( m_mode_control & 0x3B )
{
case 0x08: case 0x09:
- m_update_row = t1000_text_inten_update_row;
+ m_update_row_type = T1000_TEXT_INTEN;
break;
case 0x28: case 0x29:
- m_update_row = t1000_text_blink_update_row;
+ m_update_row_type = T1000_TEXT_BLINK;
break;
case 0x0A: case 0x0B: case 0x2A: case 0x2B:
switch( m_bank & 0xc0 )
@@ -489,7 +504,7 @@ void pcvideo_t1000_device::mode_switch( void )
case 0x00:
case 0x40:
//logerror("t1t_gfx_2bpp - 1\n");
- m_update_row = t1000_gfx_2bpp_update_row;
+ m_update_row_type = T1000_GFX_2BPP;
if ( m_color_select )
{
m_reg.data[0x10] = 0x00;
@@ -508,7 +523,7 @@ void pcvideo_t1000_device::mode_switch( void )
case 0x80:
case 0xc0:
//logerror("t1t_gfx_4bpp\n");
- m_update_row = t1000_gfx_4bpp_update_row;
+ m_update_row_type = T1000_GFX_4BPP;
break;
}
break;
@@ -519,17 +534,17 @@ void pcvideo_t1000_device::mode_switch( void )
case 0x00:
case 0x40:
//logerror("t1t_gfx_1bpp\n");
- m_update_row = t1000_gfx_1bpp_update_row;
+ m_update_row_type = T1000_GFX_1BPP;
break;
case 0x80:
case 0xc0:
//logerror("t1t_gfx_2bpp - 2\n");
- m_update_row = t1000_gfx_2bpp_tga_update_row;
+ m_update_row_type = T1000_GFX_2BPP_TGA;
break;
}
break;
default:
- m_update_row = NULL;
+ m_update_row_type = -1;
break;
}
}
@@ -552,40 +567,40 @@ void pcvideo_pcjr_device::pc_pcjr_mode_switch()
case 0x08: /* 01x0x */
if(m_jxkanji)
{
- m_update_row = pcjx_text_update_row;
+ m_update_row_type = PCJX_TEXT;
break;
}
if ( m_reg.data[3] & 0x02 )
{
- m_update_row = t1000_text_blink_update_row;
+ m_update_row_type = T1000_TEXT_BLINK;
}
else
{
- m_update_row = t1000_text_inten_update_row;
+ m_update_row_type = T1000_TEXT_INTEN;
}
break;
case 0x0A: /* 01x1x */
/* By default use medium resolution mode */
- m_update_row = t1000_gfx_2bpp_update_row;
+ m_update_row_type = T1000_GFX_2BPP;
/* Check for high resolution mode */
if ( ( m_bank & 0xc0 ) == 0xc0 )
- m_update_row = pcjr_gfx_2bpp_high_update_row;
+ m_update_row_type = PCJR_GFX_2BPP_HIGH;
/* Check for 640x200 b/w 2 shades mode */
if ( ( m_reg.data[0] & 0x04 ) && ( m_reg.data[3] & 0x08 ) )
{
- m_update_row = t1000_gfx_1bpp_update_row;
+ m_update_row_type = T1000_GFX_1BPP;
}
break;
case 0x18: /* 11x0x - invalid?? */
- m_update_row = NULL;
+ m_update_row_type = -1;
break;
case 0x1A: /* 11x1x */
- m_update_row = t1000_gfx_4bpp_update_row;
+ m_update_row_type = T1000_GFX_4BPP;
break;
default:
- m_update_row = NULL;
+ m_update_row_type = -1;
break;
}
diff --git a/src/mess/video/pc_t1t.h b/src/mess/video/pc_t1t.h
index 8dd1b582b9e..9d4f2ebb02f 100644
--- a/src/mess/video/pc_t1t.h
+++ b/src/mess/video/pc_t1t.h
@@ -38,6 +38,14 @@ public:
DECLARE_WRITE_LINE_MEMBER( t1000_de_changed );
+ virtual MC6845_UPDATE_ROW( crtc_update_row );
+ MC6845_UPDATE_ROW( t1000_text_inten_update_row );
+ MC6845_UPDATE_ROW( t1000_text_blink_update_row );
+ MC6845_UPDATE_ROW( t1000_gfx_4bpp_update_row );
+ MC6845_UPDATE_ROW( t1000_gfx_2bpp_update_row );
+ MC6845_UPDATE_ROW( t1000_gfx_2bpp_tga_update_row );
+ MC6845_UPDATE_ROW( t1000_gfx_1bpp_update_row );
+
required_device<mc6845_device> m_mc6845;
UINT8 m_mode_control, m_color_select;
UINT8 m_status;
@@ -56,7 +64,7 @@ public:
UINT8 m_address_data_ff;
- mc6845_update_row_func m_update_row;
+ int m_update_row_type;
UINT8 m_display_enable;
UINT8 m_vsync;
UINT8 m_palette_base;
@@ -113,6 +121,10 @@ public:
UINT8 *m_jxkanji;
+ virtual MC6845_UPDATE_ROW( crtc_update_row );
+ MC6845_UPDATE_ROW( pcjx_text_update_row );
+ MC6845_UPDATE_ROW( pcjr_gfx_2bpp_high_update_row );
+
protected:
virtual machine_config_constructor device_mconfig_additions() const;
virtual void device_start();
diff --git a/src/mess/video/super80.c b/src/mess/video/super80.c
index 9376231384a..d67ee220cf0 100644
--- a/src/mess/video/super80.c
+++ b/src/mess/video/super80.c
@@ -357,10 +357,9 @@ UINT32 super80_state::screen_update_super80v(screen_device &screen, bitmap_rgb32
return 0;
}
-MC6845_UPDATE_ROW( super80v_update_row )
+MC6845_UPDATE_ROW( super80_state::crtc_update_row )
{
- super80_state *state = device->machine().driver_data<super80_state>();
- const rgb_t *palette = state->m_palette->palette()->entry_list_raw();
+ const rgb_t *palette = m_palette->palette()->entry_list_raw();
UINT8 chr,col,gfx,fg,bg=0;
UINT16 mem,x;
UINT32 *p = &bitmap.pix32(y);
@@ -370,21 +369,21 @@ MC6845_UPDATE_ROW( super80v_update_row )
UINT8 inv=0;
// if (x == cursor_x) inv=0xff; /* uncomment when mame fixed */
mem = (ma + x) & 0xfff;
- chr = state->m_p_videoram[mem];
+ chr = m_p_videoram[mem];
/* get colour or b&w */
fg = 5; /* green */
- if ((state->m_s_options & 0x60) == 0x60) fg = 15; /* b&w */
+ if ((m_s_options & 0x60) == 0x60) fg = 15; /* b&w */
- if (~state->m_s_options & 0x40)
+ if (~m_s_options & 0x40)
{
- col = state->m_p_colorram[mem]; /* byte of colour to display */
- fg = state->m_palette_index + (col & 0x0f);
- bg = state->m_palette_index + (col >> 4);
+ col = m_p_colorram[mem]; /* byte of colour to display */
+ fg = m_palette_index + (col & 0x0f);
+ bg = m_palette_index + (col >> 4);
}
/* if inverse mode, replace any pcgram chrs with inverse chrs */
- if ((!BIT(state->m_portf0, 4)) && (chr & 0x80)) // is it a high chr in inverse mode
+ if ((!BIT(m_portf0, 4)) && (chr & 0x80)) // is it a high chr in inverse mode
{
inv ^= 0xff; // invert the chr
chr &= 0x7f; // and drop bit 7
@@ -392,10 +391,10 @@ MC6845_UPDATE_ROW( super80v_update_row )
/* process cursor */
if (x == cursor_x)
- inv ^= state->m_mc6845_cursor[ra];
+ inv ^= m_mc6845_cursor[ra];
/* get pattern of pixels for that character scanline */
- gfx = state->m_p_pcgram[(chr<<4) | ra] ^ inv;
+ gfx = m_p_pcgram[(chr<<4) | ra] ^ inv;
/* Display a scanline of a character */
*p++ = palette[BIT(gfx, 7) ? fg : bg];
diff --git a/src/mess/video/v1050.c b/src/mess/video/v1050.c
index 1e357e9aeae..2154b01fb42 100644
--- a/src/mess/video/v1050.c
+++ b/src/mess/video/v1050.c
@@ -52,17 +52,15 @@ WRITE8_MEMBER( v1050_state::videoram_w )
/* MC6845 Interface */
-static MC6845_UPDATE_ROW( v1050_update_row )
+MC6845_UPDATE_ROW( v1050_state::crtc_update_row )
{
- v1050_state *state = device->machine().driver_data<v1050_state>();
-
int column, bit;
for (column = 0; column < x_count; column++)
{
UINT16 address = (((ra & 0x03) + 1) << 13) | ((ma & 0x1fff) + column);
- UINT8 data = state->m_video_ram[address & V1050_VIDEORAM_MASK];
- UINT8 attr = (state->m_attr & 0xfc) | (state->m_attr_ram[address] & 0x03);
+ UINT8 data = m_video_ram[address & V1050_VIDEORAM_MASK];
+ UINT8 attr = (m_attr & 0xfc) | (m_attr_ram[address] & 0x03);
for (bit = 0; bit < 8; bit++)
{
@@ -81,7 +79,7 @@ static MC6845_UPDATE_ROW( v1050_update_row )
/* display blank */
if (attr & V1050_ATTR_BLANK) color = 0;
- bitmap.pix32(vbp + y, hbp + x) = state->m_palette->pen(de ? color : 0);
+ bitmap.pix32(vbp + y, hbp + x) = m_palette->pen(de ? color : 0);
data <<= 1;
}
@@ -95,21 +93,6 @@ WRITE_LINE_MEMBER( v1050_state::crtc_vs_w )
set_interrupt(INT_VSYNC, state);
}
-static MC6845_INTERFACE( crtc_intf )
-{
- true,
- 0,0,0,0,
- 8,
- NULL,
- v1050_update_row,
- NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(v1050_state, crtc_vs_w),
- NULL
-};
-
/* Video Start */
void v1050_state::video_start()
@@ -124,7 +107,11 @@ void v1050_state::video_start()
/* Machine Drivers */
MACHINE_CONFIG_FRAGMENT( v1050_video )
- MCFG_MC6845_ADD(H46505_TAG, H46505, SCREEN_TAG, XTAL_15_36MHz/8, crtc_intf)
+ MCFG_MC6845_ADD(H46505_TAG, H46505, SCREEN_TAG, XTAL_15_36MHz/8)
+ MCFG_MC6845_SHOW_BORDER_AREA(true)
+ MCFG_MC6845_CHAR_WIDTH(8)
+ MCFG_MC6845_UPDATE_ROW_CB(v1050_state, crtc_update_row)
+ MCFG_MC6845_OUT_VSYNC_CB(WRITELINE(v1050_state, crtc_vs_w))
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_UPDATE_DEVICE(H46505_TAG, h46505_device, screen_update)