tms9927: Eliminate MCFG macros and register_postload; remove "wr_" from callback getters (nw)

This commit is contained in:
AJR 2018-09-11 12:58:49 -04:00
parent 6002d0718f
commit 445c6e1461
16 changed files with 63 additions and 77 deletions

View File

@ -91,9 +91,7 @@ void tms9927_device::device_start()
m_vsync_timer = timer_alloc(TIMER_VSYNC);
m_hsync_timer = timer_alloc(TIMER_HSYNC);
/* register for state saving */
machine().save().register_postload(save_prepost_delegate(FUNC(tms9927_device::state_postload), this));
// register for state saving
save_item(NAME(m_reg));
save_item(NAME(m_start_datarow));
save_item(NAME(m_reset));
@ -181,7 +179,7 @@ void tms9927_device::device_timer(emu_timer &timer, device_timer_id id, int para
}
}
void tms9927_device::state_postload()
void tms9927_device::device_post_load()
{
recompute_parameters(true);
}

View File

@ -10,30 +10,13 @@
#define MAME_VIDEO_TMS9927_H
#define MCFG_TMS9927_VSYN_CALLBACK(_write) \
downcast<tms9927_device &>(*device).set_vsyn_wr_callback(DEVCB_##_write);
#define MCFG_TMS9927_HSYN_CALLBACK(_write) \
downcast<tms9927_device &>(*device).set_hsyn_wr_callback(DEVCB_##_write);
#define MCFG_TMS9927_CHAR_WIDTH(_pixels) \
downcast<tms9927_device &>(*device).set_char_width(_pixels);
#define MCFG_TMS9927_REGION(_tag) \
downcast<tms9927_device &>(*device).set_region_tag(_tag);
#define MCFG_TMS9927_OVERSCAN(_left, _right, _top, _bottom) \
downcast<tms9927_device &>(*device).set_overscan(_left, _right, _top, _bottom);
class tms9927_device : public device_t, public device_video_interface
{
public:
tms9927_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
template <class Object> devcb_base &set_vsyn_wr_callback(Object &&cb) { return m_write_vsyn.set_callback(std::forward<Object>(cb)); }
template <class Object> devcb_base &set_hsyn_wr_callback(Object &&cb) { return m_write_hsyn.set_callback(std::forward<Object>(cb)); }
auto vsyn_wr_callback() { return m_write_vsyn.bind(); }
auto hsyn_wr_callback() { return m_write_hsyn.bind(); }
auto vsyn_callback() { return m_write_vsyn.bind(); }
auto hsyn_callback() { return m_write_hsyn.bind(); }
void set_char_width(int pixels) { m_hpixels_per_column = pixels; }
void set_region_tag(const char *tag) { m_selfload.set_tag(tag); }
@ -62,6 +45,7 @@ protected:
virtual void device_reset() override;
virtual void device_clock_changed() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
virtual void device_post_load() override;
private:
enum
@ -70,7 +54,6 @@ private:
TIMER_HSYNC
};
void state_postload();
void recompute_parameters(bool postload);
void generic_access(address_space &space, offs_t offset);

View File

@ -1229,8 +1229,8 @@ MACHINE_CONFIG_START(alphatp_12_state::alphatp2)
CRT5027(config, m_crtc, 12.8544_MHz_XTAL / 8);
m_crtc->set_char_width(8);
m_crtc->hsyn_wr_callback().set_inputline("maincpu", I8085_RST55_LINE);
m_crtc->vsyn_wr_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1);
m_crtc->hsyn_callback().set_inputline("maincpu", I8085_RST55_LINE);
m_crtc->vsyn_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1);
m_crtc->set_screen("screen");
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_alphatp3)
@ -1306,7 +1306,7 @@ MACHINE_CONFIG_START(alphatp_34_state::alphatp3)
CRT5037(config, m_crtc, 12.8544_MHz_XTAL / 8);
m_crtc->set_char_width(8);
m_crtc->vsyn_wr_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1);
m_crtc->vsyn_callback().set_inputline("maincpu", I8085_RST65_LINE).exor(1);
m_crtc->set_screen("screen");
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_alphatp3)

View File

@ -31,6 +31,7 @@ public:
ampex_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_vtac(*this, "vtac")
, m_uart(*this, "uart")
, m_dbrg(*this, "dbrg")
, m_p_chargen(*this, "chargen")
@ -68,6 +69,7 @@ private:
std::unique_ptr<u16[]> m_paged_ram;
required_device<cpu_device> m_maincpu;
required_device<crt5037_device> m_vtac;
required_device<ay31015_device> m_uart;
required_device<com8116_device> m_dbrg;
required_region_ptr<u8> m_p_chargen;
@ -170,7 +172,7 @@ void ampex_state::mem_map(address_map &map)
map(0x5843, 0x5843).r(m_uart, FUNC(ay31015_device::receive)).w(FUNC(ampex_state::write_5843));
map(0x5846, 0x5846).r(FUNC(ampex_state::read_5846));
map(0x5847, 0x5847).r(FUNC(ampex_state::read_5847));
map(0x5c00, 0x5c0f).rw("vtac", FUNC(crt5037_device::read), FUNC(crt5037_device::write));
map(0x5c00, 0x5c0f).rw(m_vtac, FUNC(crt5037_device::read), FUNC(crt5037_device::write));
map(0x8000, 0x97ff).rw(FUNC(ampex_state::page_r), FUNC(ampex_state::page_w));
map(0xc000, 0xcfff).ram(); // video RAM
}
@ -207,18 +209,19 @@ void ampex_state::machine_start()
save_pointer(NAME(m_paged_ram), 0x1800 * 4);
}
MACHINE_CONFIG_START(ampex_state::ampex)
MCFG_DEVICE_ADD("maincpu", Z80, XTAL(23'814'000) / 9) // clocked by 8224?
MCFG_DEVICE_PROGRAM_MAP(mem_map)
void ampex_state::ampex(machine_config &config)
{
Z80(config, m_maincpu, 23.814_MHz_XTAL / 9); // clocked by 8224?
m_maincpu->set_addrmap(AS_PROGRAM, &ampex_state::mem_map);
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(23.814_MHz_XTAL / 2, 105 * CHAR_WIDTH, 0, 80 * CHAR_WIDTH, 270, 0, 250);
screen.set_screen_update(FUNC(ampex_state::screen_update));
MCFG_DEVICE_ADD("vtac", CRT5037, XTAL(23'814'000) / 2 / CHAR_WIDTH)
MCFG_TMS9927_CHAR_WIDTH(CHAR_WIDTH)
MCFG_TMS9927_VSYN_CALLBACK(WRITELINE(*this, ampex_state, vsyn_w))
MCFG_VIDEO_SET_SCREEN("screen")
CRT5037(config, m_vtac, 23.814_MHz_XTAL / 2 / CHAR_WIDTH);
m_vtac->set_char_width(CHAR_WIDTH);
m_vtac->vsyn_callback().set(FUNC(ampex_state::vsyn_w));
m_vtac->set_screen("screen");
AY31015(config, m_uart, 0); // COM8017, actually
m_uart->write_so_callback().set(FUNC(ampex_state::so_w));
@ -228,7 +231,7 @@ MACHINE_CONFIG_START(ampex_state::ampex)
COM5016_5(config, m_dbrg, 4.9152_MHz_XTAL);
m_dbrg->fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
m_dbrg->ft_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
MACHINE_CONFIG_END
}
ROM_START( dialog80 )
ROM_REGION( 0x3000, "roms", 0 )

View File

@ -1187,10 +1187,10 @@ MACHINE_CONFIG_START(attache_state::attache)
FLOPPY_CONNECTOR(config, "fdc:0", attache_floppies, "525dd", floppy_image_device::default_floppy_formats);
FLOPPY_CONNECTOR(config, "fdc:1", attache_floppies, "525dd", floppy_image_device::default_floppy_formats);
MCFG_DEVICE_ADD("crtc", TMS9927, 12324000 / 8)
MCFG_TMS9927_CHAR_WIDTH(8)
MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("ctc", z80ctc_device, trg2))
MCFG_VIDEO_SET_SCREEN("screen")
TMS9927(config, m_crtc, 12.324_MHz_XTAL / 8);
m_crtc->set_char_width(8);
m_crtc->vsyn_callback().set(m_ctc, FUNC(z80ctc_device::trg2));
m_crtc->set_screen("screen");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
@ -1277,10 +1277,10 @@ MACHINE_CONFIG_START(attache816_state::attache816)
FLOPPY_CONNECTOR(config, "fdc:0", attache_floppies, "525dd", floppy_image_device::default_floppy_formats);
FLOPPY_CONNECTOR(config, "fdc:1", attache_floppies, "525dd", floppy_image_device::default_floppy_formats);
MCFG_DEVICE_ADD("crtc", TMS9927, 12324000)
MCFG_TMS9927_CHAR_WIDTH(8)
MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("ctc", z80ctc_device, trg2))
MCFG_VIDEO_SET_SCREEN("screen")
TMS9927(config, m_crtc, 12.324_MHz_XTAL / 8);
m_crtc->set_char_width(8);
m_crtc->vsyn_callback().set(m_ctc, FUNC(z80ctc_device::trg2));
m_crtc->set_screen("screen");
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);

View File

@ -31,6 +31,7 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_bank_16k(*this, {"block0", "block4", "block8", "blockc"})
, m_crtc(*this, "crtc")
, m_rom_chargen(*this, "chargen")
, m_ram_chargen(*this, "chargen")
, m_videoram(*this, "videoram")
@ -72,6 +73,7 @@ private:
required_device<cpu_device> m_maincpu;
required_device_array<address_map_bank_device, 4> m_bank_16k;
required_device<crt5037_device> m_crtc;
required_region_ptr<u8> m_rom_chargen;
required_shared_ptr<u8> m_ram_chargen;
required_shared_ptr<u8> m_videoram;
@ -326,8 +328,7 @@ MACHINE_CONFIG_START(cdc721_state::cdc721)
MCFG_PALETTE_INIT_OWNER(cdc721_state, cdc721)
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_cdc721)
MCFG_DEVICE_ADD("crtc", CRT5037, 12.936_MHz_XTAL / 8)
MCFG_TMS9927_CHAR_WIDTH(8)
CRT5037(config, m_crtc, 12.936_MHz_XTAL / 8).set_char_width(8);
z80ctc_device& ctc(Z80CTC(config, "ctc", 6_MHz_XTAL)); // Zilog Z8430B (M1 pulled up)
ctc.intr_callback().set(FUNC(cdc721_state::int_w<6>));

View File

@ -409,12 +409,12 @@ MACHINE_CONFIG_START(compucolor2_state::compucolor2)
MCFG_PALETTE_ADD_3BIT_RGB("palette")
MCFG_DEVICE_ADD(CRT5027_TAG, CRT5027, XTAL(17'971'200)/2/6)
MCFG_TMS9927_CHAR_WIDTH(6)
MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("blink", ripple_counter_device, clock_w))
MCFG_VIDEO_SET_SCREEN("screen")
CRT5027(config, m_vtac, XTAL(17'971'200)/2/6);
m_vtac->set_char_width(6);
m_vtac->vsyn_callback().set("blink", FUNC(ripple_counter_device::clock_w));
m_vtac->set_screen("screen");
ripple_counter_device &blink(RIPPLE_COUNTER(config, "blink", 0)); // 74LS393 at UG10
ripple_counter_device &blink(RIPPLE_COUNTER(config, "blink")); // 74LS393 at UG10
blink.set_stages(8);
blink.count_out_cb().set(m_mioc, FUNC(tms5501_device::sens_w)).bit(4);

View File

@ -556,10 +556,13 @@ MACHINE_CONFIG_START(intv_state::intvkbd)
MCFG_PALETTE_INIT_OWNER(intv_state, intv)
/* crt controller */
MCFG_DEVICE_ADD("crtc", TMS9927, XTAL(7'159'090)/8)
MCFG_TMS9927_CHAR_WIDTH(8)
MCFG_TMS9927_OVERSCAN(stic_device::OVERSCAN_LEFT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE, stic_device::OVERSCAN_RIGHT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE,
stic_device::OVERSCAN_TOP_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE, stic_device::OVERSCAN_BOTTOM_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE)
TMS9927(config, m_crtc, XTAL(7'159'090)/8);
m_crtc->set_char_width(8);
m_crtc->set_overscan(
stic_device::OVERSCAN_LEFT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE,
stic_device::OVERSCAN_RIGHT_WIDTH*stic_device::X_SCALE*INTVKBD_X_SCALE,
stic_device::OVERSCAN_TOP_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE,
stic_device::OVERSCAN_BOTTOM_HEIGHT*stic_device::Y_SCALE*INTVKBD_Y_SCALE);
MCFG_SCREEN_MODIFY("screen")
MCFG_SCREEN_UPDATE_DRIVER(intv_state, screen_update_intvkbd)

View File

@ -724,8 +724,7 @@ MACHINE_CONFIG_START(itt3030_state::itt3030)
/* devices */
ADDRESS_MAP_BANK(config, "lowerbank").set_map(&itt3030_state::lower48_map).set_options(ENDIANNESS_LITTLE, 8, 20, 0xc000);
MCFG_DEVICE_ADD("crt5027", CRT5027, 6_MHz_XTAL / 8)
MCFG_TMS9927_CHAR_WIDTH(8)
CRT5027(config, m_crtc, 6_MHz_XTAL / 8).set_char_width(8);
FD1791(config, m_fdc, 20_MHz_XTAL / 20);
m_fdc->intrq_wr_callback().set(FUNC(itt3030_state::fdcirq_w));

View File

@ -399,10 +399,10 @@ MACHINE_CONFIG_START(micral_state::micral)
MCFG_PALETTE_ADD_MONOCHROME("palette")
//MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_micral)
MCFG_DEVICE_ADD("crtc", CRT5037, 4000000 / 8) // xtal freq unknown
MCFG_TMS9927_CHAR_WIDTH(8) // unknown
//MCFG_TMS9927_VSYN_CALLBACK(WRITELINE(TMS5501_TAG, tms5501_device, sens_w))
MCFG_VIDEO_SET_SCREEN("screen")
CRT5037(config, m_crtc, 4000000 / 8); // xtal freq unknown
m_crtc->set_char_width(8); // unknown
//m_crtc->vsyn_callback().set(TMS5501_TAG, FUNC(tms5501_device::sens_w));
m_crtc->set_screen("screen");
/* sound hardware */
//MCFG_SPEAKER_STANDARD_MONO("mono")

View File

@ -831,7 +831,7 @@ MACHINE_CONFIG_START(notetaker_state::notetakr)
MCFG_PALETTE_ADD_MONOCHROME("palette")
/* Devices */
MCFG_DEVICE_ADD( "crt5027", CRT5027, (36_MHz_XTAL / 4) / 8) // See below
CRT5027(config, m_crtc, (36_MHz_XTAL / 4) / 8); // See below
/* the clock for the crt5027 is configurable rate; 36MHz xtal divided by 1*,
2, 3, 4, 5, 6, 7, or 8 (* because this is a 74s163 this setting probably
means divide by 1; documentation at
@ -841,17 +841,17 @@ MACHINE_CONFIG_START(notetaker_state::notetakr)
on reset, bitclk is 000 so divider is (36mhz/8)/8; during boot it is
written with 101, changing the divider to (36mhz/4)/8 */
// TODO: for now, we just hack it to the latter setting from start; this should be handled correctly in iop_reset();
MCFG_TMS9927_CHAR_WIDTH(8) //(8 pixels per column/halfword, 16 pixels per fullword)
m_crtc->set_char_width(8); //(8 pixels per column/halfword, 16 pixels per fullword)
// TODO: below is HACKED to trigger the odd/even int ir4 instead of vblank int ir7 since ir4 is required for anything to be drawn to screen! hence with the hack this interrupt triggers twice as often as it should
MCFG_TMS9927_VSYN_CALLBACK(WRITELINE("iop_pic8259", pic8259_device, ir4_w)) // note this triggers interrupts on both the iop (ir7) and emulatorcpu (ir4)
MCFG_VIDEO_SET_SCREEN("screen")
m_crtc->vsyn_callback().set("iop_pic8259", FUNC(pic8259_device::ir4_w)); // note this triggers interrupts on both the iop (ir7) and emulatorcpu (ir4)
m_crtc->set_screen("screen");
AY31015(config, m_kbduart, 0); // HD6402, == AY-3-1015D
AY31015(config, m_kbduart); // HD6402, == AY-3-1015D
m_kbduart->set_rx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud)
m_kbduart->set_tx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud)
m_kbduart->write_dav_callback().set("iop_pic8259", FUNC(pic8259_device::ir6_w)); // DataRecvd = KbdInt
AY31015(config, m_eiauart, 0); // HD6402, == AY-3-1015D
AY31015(config, m_eiauart); // HD6402, == AY-3-1015D
m_eiauart->set_rx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud)
m_eiauart->set_tx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud)
m_eiauart->write_dav_callback().set("iop_pic8259", FUNC(pic8259_device::ir3_w)); // EIADataReady = EIAInt

View File

@ -630,8 +630,7 @@ MACHINE_CONFIG_START(statriv2_state::statriv2)
MCFG_SCREEN_UPDATE_DRIVER(statriv2_state, screen_update_statriv2)
MCFG_SCREEN_PALETTE("palette")
MCFG_DEVICE_ADD("tms", TMS9927, MASTER_CLOCK/2/8)
MCFG_TMS9927_CHAR_WIDTH(8)
TMS9927(config, m_tms, MASTER_CLOCK/2/8).set_char_width(8);
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_horizontal)
MCFG_PALETTE_ADD("palette", 2*64)

View File

@ -286,8 +286,7 @@ MACHINE_CONFIG_START(tdv2324_state::tdv2324)
MCFG_PALETTE_ADD_MONOCHROME("palette")
MCFG_DEVICE_ADD(TMS9937NL_TAG, TMS9927, 25.39836_MHz_XTAL / 8)
MCFG_TMS9927_CHAR_WIDTH(8)
TMS9927(config, m_tms, 25.39836_MHz_XTAL / 8).set_char_width(8);
// devices
MCFG_DEVICE_ADD(P8259A_TAG, PIC8259, 0)

View File

@ -410,9 +410,10 @@ MACHINE_CONFIG_START(thief_state::thief)
MCFG_SCREEN_UPDATE_DRIVER(thief_state, screen_update_thief)
MCFG_SCREEN_PALETTE("palette")
MCFG_DEVICE_ADD("tms", TMS9927, XTAL(20'000'000)/4/8)
MCFG_TMS9927_CHAR_WIDTH(8)
MCFG_TMS9927_VSYN_CALLBACK(ASSERTLINE("maincpu", 0))
TMS9927(config, m_tms, XTAL(20'000'000)/4/8);
m_tms->set_char_width(8);
m_tms->vsyn_callback().set_inputline("maincpu", 0, ASSERT_LINE);
MCFG_PALETTE_ADD("palette", 16)
// sound hardware

View File

@ -896,7 +896,7 @@ void tv912_state::tv912(machine_config &config)
TMS9927(config, m_crtc, 23.814_MHz_XTAL / CHAR_WIDTH);
m_crtc->set_char_width(CHAR_WIDTH);
m_crtc->vsyn_wr_callback().set_inputline(m_maincpu, MCS48_INPUT_IRQ);
m_crtc->vsyn_callback().set_inputline(m_maincpu, MCS48_INPUT_IRQ);
m_crtc->set_screen("screen");
AY51013(config, m_uart);

View File

@ -371,8 +371,8 @@ MACHINE_CONFIG_START(v100_state::v100)
CRT5037(config, m_vtac, XTAL(47'736'000) / CHAR_WIDTH);
m_vtac->set_char_width(CHAR_WIDTH);
m_vtac->set_screen("screen");
m_vtac->hsyn_wr_callback().set(FUNC(v100_state::picu_r_w<7>)).invert();
m_vtac->vsyn_wr_callback().set(FUNC(v100_state::picu_r_w<6>)).invert();
m_vtac->hsyn_callback().set(FUNC(v100_state::picu_r_w<7>)).invert();
m_vtac->vsyn_callback().set(FUNC(v100_state::picu_r_w<6>)).invert();
I8214(config, m_picu, XTAL(47'736'000) / 12);
m_picu->int_wr_callback().set_inputline(m_maincpu, 0, ASSERT_LINE);