summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess')
-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
90 files changed, 958 insertions, 1766 deletions
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)