cdp1861, cdp1864: Hook in screens efficiently without using MCFG (nw)

This commit is contained in:
AJR 2018-08-17 21:46:03 -04:00
parent 06559ae451
commit 577f198564
11 changed files with 49 additions and 72 deletions

View File

@ -78,6 +78,14 @@ cdp1864_device::cdp1864_device(const machine_config &mconfig, const char *tag, d
{
}
cdp1864_device::cdp1864_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, screen_device &screen)
: cdp1864_device(mconfig, tag, owner, clock)
{
set_screen(screen, DEVICE_SELF);
screen.set_screen_update(screen_update_rgb32_delegate(FUNC(cdp1864_device::screen_update), this));
screen.set_raw(clock, SCREEN_WIDTH, HBLANK_END, HBLANK_START, TOTAL_SCANLINES, SCANLINE_VBLANK_END, SCANLINE_VBLANK_START);
}
//-------------------------------------------------
// device_start - device-specific startup

View File

@ -44,15 +44,6 @@
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_CDP1864_SCREEN_ADD(_tag, _clock) \
MCFG_SCREEN_ADD(_tag, RASTER) \
MCFG_SCREEN_RAW_PARAMS(_clock, cdp1864_device::SCREEN_WIDTH, cdp1864_device::HBLANK_END, cdp1864_device::HBLANK_START, cdp1864_device::TOTAL_SCANLINES, cdp1864_device::SCANLINE_VBLANK_END, cdp1864_device::SCANLINE_VBLANK_START)
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@ -92,6 +83,7 @@ public:
// construction/destruction
cdp1864_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
cdp1864_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, screen_device &screen);
auto inlace_cb() { return m_read_inlace.bind(); }
auto int_cb() { return m_write_int.bind(); }

View File

@ -51,6 +51,14 @@ cdp1861_device::cdp1861_device(const machine_config &mconfig, const char *tag, d
{
}
cdp1861_device::cdp1861_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, screen_device &screen)
: cdp1861_device(mconfig, tag, owner, clock)
{
set_screen(screen, DEVICE_SELF);
screen.set_screen_update(screen_update_rgb32_delegate(FUNC(cdp1861_device::screen_update), this));
screen.set_raw(clock, SCREEN_WIDTH, HBLANK_END, HBLANK_START, TOTAL_SCANLINES, SCANLINE_VBLANK_END, SCANLINE_VBLANK_START);
}
//-------------------------------------------------
// device_start - device-specific startup

View File

@ -29,17 +29,6 @@
#include "screen.h"
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MCFG_CDP1861_SCREEN_ADD(_cdptag, _tag, _clock) \
MCFG_SCREEN_ADD(_tag, RASTER) \
MCFG_SCREEN_UPDATE_DEVICE(_cdptag, cdp1861_device, screen_update) \
MCFG_SCREEN_RAW_PARAMS(_clock, cdp1861_device::SCREEN_WIDTH, cdp1861_device::HBLANK_END, cdp1861_device::HBLANK_START, cdp1861_device::TOTAL_SCANLINES, cdp1861_device::SCANLINE_VBLANK_END, cdp1861_device::SCANLINE_VBLANK_START)
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
@ -76,6 +65,7 @@ public:
// construction/destruction
cdp1861_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
cdp1861_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, screen_device &screen);
auto int_cb() { return m_write_int.bind(); }
auto dma_out_cb() { return m_write_dma_out.bind(); }

View File

@ -527,16 +527,13 @@ MACHINE_CONFIG_START(cosmicos_state::cosmicos)
MCFG_TIMER_DRIVER_ADD_PERIODIC("digit", cosmicos_state, digit_tick, attotime::from_hz(100))
MCFG_TIMER_DRIVER_ADD_PERIODIC("interrupt", cosmicos_state, int_tick, attotime::from_hz(1000))
MCFG_CDP1864_SCREEN_ADD(SCREEN_TAG, 1.75_MHz_XTAL)
MCFG_SCREEN_UPDATE_DEVICE(CDP1864_TAG, cdp1864_device, screen_update)
/* sound hardware */
SPEAKER(config, "mono").front_center();
MCFG_DEVICE_ADD("speaker", SPEAKER_SOUND)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
CDP1864(config, m_cti, 1.75_MHz_XTAL).set_screen(SCREEN_TAG);
CDP1864(config, m_cti, 1.75_MHz_XTAL, SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
m_cti->inlace_cb().set_constant(0);
m_cti->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_cti->dma_out_cb().set(FUNC(cosmicos_state::dmaout_w));

View File

@ -251,11 +251,11 @@ MACHINE_CONFIG_START(elf2_state::elf2)
/* video hardware */
config.set_default_layout(layout_elf2);
CDP1861(config, m_vdc, XTAL(3'579'545)/2).set_screen(SCREEN_TAG);
CDP1861(config, m_vdc, XTAL(3'579'545)/2, SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
m_vdc->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_vdc->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);
m_vdc->efx_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_EF1);
MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, XTAL(3'579'545)/2)
/* devices */
MCFG_DEVICE_ADD(MM74C923_TAG, MM74C923, 0)

View File

@ -318,13 +318,9 @@ MACHINE_CONFIG_START(eti660_state::eti660)
m_maincpu->q_cb().set(FUNC(eti660_state::q_w));
m_maincpu->dma_wr_cb().set(FUNC(eti660_state::dma_w));
/* video hardware */
MCFG_CDP1864_SCREEN_ADD(SCREEN_TAG, XTAL(8'867'238)/5)
MCFG_SCREEN_UPDATE_DEVICE(CDP1864_TAG, cdp1864_device, screen_update)
/* sound hardware */
/* video/sound hardware */
SPEAKER(config, "mono").front_center();
CDP1864(config, m_cti, XTAL(8'867'238)/5).set_screen(SCREEN_TAG);
CDP1864(config, m_cti, XTAL(8'867'238)/5, SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
m_cti->inlace_cb().set_constant(0);
m_cti->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_cti->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);

View File

@ -660,11 +660,10 @@ MACHINE_CONFIG_START(studio2_state::studio2)
m_maincpu->dma_wr_cb().set(m_vdc, FUNC(cdp1861_device::dma_w));
/* video hardware */
CDP1861(config, m_vdc, 1760000).set_screen(SCREEN_TAG);
CDP1861(config, m_vdc, 1760000, SCREEN(config, m_screen, SCREEN_TYPE_RASTER));
m_vdc->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_vdc->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);
m_vdc->efx_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_EF1);
MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, 1760000)
/* sound hardware */
SPEAKER(config, "mono").front_center();
@ -686,12 +685,11 @@ MACHINE_CONFIG_START(visicom_state::visicom)
m_maincpu->dma_wr_cb().set(FUNC(visicom_state::dma_w));
/* video hardware */
CDP1861(config, m_vdc, XTAL(3'579'545)/2);
CDP1861(config, m_vdc, XTAL(3'579'545)/2, SCREEN(config, m_screen, SCREEN_TYPE_RASTER));
m_vdc->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_vdc->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);
m_vdc->efx_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_EF1);
MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, XTAL(3'579'545)/2)
MCFG_SCREEN_UPDATE_DRIVER(visicom_state, screen_update)
m_screen->set_screen_update(FUNC(visicom_state::screen_update));
/* sound hardware */
SPEAKER(config, "mono").front_center();
@ -716,15 +714,11 @@ MACHINE_CONFIG_START(mpt02_state::mpt02)
m_maincpu->q_cb().set(FUNC(mpt02_state::q_w));
m_maincpu->dma_wr_cb().set(FUNC(mpt02_state::dma_w));
/* video hardware */
MCFG_CDP1864_SCREEN_ADD(SCREEN_TAG, 1.75_MHz_XTAL)
MCFG_SCREEN_UPDATE_DEVICE(CDP1864_TAG, cdp1864_device, screen_update)
/* sound hardware */
/* video/sound hardware */
SPEAKER(config, "mono").front_center();
BEEP(config, m_beeper, 300).add_route(ALL_OUTPUTS, "mono", 1.00);
CDP1864(config, m_cti, 1.75_MHz_XTAL).set_screen(SCREEN_TAG);
CDP1864(config, m_cti, 1.75_MHz_XTAL, SCREEN(config, m_screen, SCREEN_TYPE_RASTER));
m_cti->inlace_cb().set_constant(0);
m_cti->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_cti->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);

View File

@ -280,7 +280,8 @@ void tmc2000e_state::machine_reset()
/* Machine Drivers */
MACHINE_CONFIG_START(tmc2000e_state::tmc2000e)
void tmc2000e_state::tmc2000e(machine_config &config)
{
// basic system hardware
CDP1802(config, m_maincpu, 1.75_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &tmc2000e_state::tmc2000e_map);
@ -292,13 +293,9 @@ MACHINE_CONFIG_START(tmc2000e_state::tmc2000e)
m_maincpu->q_cb().set(FUNC(tmc2000e_state::q_w));
m_maincpu->dma_wr_cb().set(FUNC(tmc2000e_state::dma_w));
// video hardware
MCFG_CDP1864_SCREEN_ADD(SCREEN_TAG, 1.75_MHz_XTAL)
MCFG_SCREEN_UPDATE_DEVICE(CDP1864_TAG, cdp1864_device, screen_update)
// sound hardware
// video/sound hardware
SPEAKER(config, "mono").front_center();
CDP1864(config, m_cti, 1.75_MHz_XTAL).set_screen(SCREEN_TAG);
CDP1864(config, m_cti, 1.75_MHz_XTAL, SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
m_cti->inlace_cb().set_constant(0);
m_cti->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_cti->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);
@ -310,12 +307,11 @@ MACHINE_CONFIG_START(tmc2000e_state::tmc2000e)
m_cti->add_route(ALL_OUTPUTS, "mono", 0.25);
/* devices */
MCFG_CASSETTE_ADD("cassette")
MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED)
CASSETTE(config, m_cassette).set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED);
/* internal ram */
RAM(config, RAM_TAG).set_default_size("8K").set_extra_options("40K");
MACHINE_CONFIG_END
}
/* ROMs */

View File

@ -716,12 +716,12 @@ MACHINE_CONFIG_START(vip_state::vip)
m_maincpu->tpb_cb().set(m_exp, FUNC(vip_expansion_slot_device::tpb_w));
// video hardware
CDP1861(config, m_vdc, 3.52128_MHz_XTAL / 2).set_screen(SCREEN_TAG);
screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
CDP1861(config, m_vdc, 3.52128_MHz_XTAL / 2, screen);
m_vdc->int_cb().set(FUNC(vip_state::vdc_int_w));
m_vdc->dma_out_cb().set(FUNC(vip_state::vdc_dma_out_w));
m_vdc->efx_cb().set(FUNC(vip_state::vdc_ef1_w));
MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, 3.52128_MHz_XTAL / 2)
MCFG_SCREEN_UPDATE_DRIVER(vip_state, screen_update)
screen.set_screen_update(FUNC(vip_state::screen_update));
// sound hardware
SPEAKER(config, "mono").front_center();

View File

@ -36,13 +36,13 @@ uint32_t osc1000b_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
/* Machine Drivers */
MACHINE_CONFIG_START(tmc1800_state::tmc1800_video)
CDP1861(config, m_vdc, XTAL(1'750'000)).set_screen(SCREEN_TAG);
void tmc1800_state::tmc1800_video(machine_config &config)
{
CDP1861(config, m_vdc, XTAL(1'750'000), SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
m_vdc->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_vdc->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);
m_vdc->efx_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_EF1);
MCFG_CDP1861_SCREEN_ADD(CDP1861_TAG, SCREEN_TAG, XTAL(1'750'000))
MACHINE_CONFIG_END
}
MACHINE_CONFIG_START(osc1000b_state::osc1000b_video)
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
@ -52,12 +52,10 @@ MACHINE_CONFIG_START(osc1000b_state::osc1000b_video)
MCFG_SCREEN_VISIBLE_AREA(0, 319, 0, 199)
MACHINE_CONFIG_END
MACHINE_CONFIG_START(tmc2000_state::tmc2000_video)
MCFG_CDP1864_SCREEN_ADD(SCREEN_TAG, XTAL(1'750'000))
MCFG_SCREEN_UPDATE_DEVICE(CDP1864_TAG, cdp1864_device, screen_update)
void tmc2000_state::tmc2000_video(machine_config &config)
{
SPEAKER(config, "mono").front_center();
CDP1864(config, m_cti, XTAL(1'750'000)).set_screen(SCREEN_TAG);
CDP1864(config, m_cti, XTAL(1'750'000), SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
m_cti->inlace_cb().set_constant(0);
m_cti->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_cti->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);
@ -67,14 +65,12 @@ MACHINE_CONFIG_START(tmc2000_state::tmc2000_video)
m_cti->gdata_cb().set(FUNC(tmc2000_state::gdata_r));
m_cti->set_chrominance(RES_K(1.21), RES_K(2.05), RES_K(2.26), RES_K(3.92)); // RL64, RL63, RL61, RL65 (also RH62 (2K pot) in series, but ignored here)
m_cti->add_route(ALL_OUTPUTS, "mono", 0.25);
MACHINE_CONFIG_END
MACHINE_CONFIG_START(nano_state::nano_video)
MCFG_CDP1864_SCREEN_ADD(SCREEN_TAG, XTAL(1'750'000))
MCFG_SCREEN_UPDATE_DEVICE(CDP1864_TAG, cdp1864_device, screen_update)
}
void nano_state::nano_video(machine_config &config)
{
SPEAKER(config, "mono").front_center();
CDP1864(config, m_cti, XTAL(1'750'000)).set_screen(SCREEN_TAG);
CDP1864(config, m_cti, XTAL(1'750'000), SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
m_cti->inlace_cb().set_constant(0);
m_cti->int_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_INT);
m_cti->dma_out_cb().set_inputline(m_maincpu, COSMAC_INPUT_LINE_DMAOUT);
@ -84,4 +80,4 @@ MACHINE_CONFIG_START(nano_state::nano_video)
m_cti->gdata_cb().set_constant(1);
m_cti->set_chrominance(RES_K(1.21), RES_INF, RES_INF, 0); // R18 (unconfirmed)
m_cti->add_route(ALL_OUTPUTS, "mono", 0.25);
MACHINE_CONFIG_END
}