summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/trs80.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/trs80.cpp')
-rw-r--r--src/mame/drivers/trs80.cpp164
1 files changed, 90 insertions, 74 deletions
diff --git a/src/mame/drivers/trs80.cpp b/src/mame/drivers/trs80.cpp
index c3362b9414e..9d1d20c9c66 100644
--- a/src/mame/drivers/trs80.cpp
+++ b/src/mame/drivers/trs80.cpp
@@ -158,6 +158,7 @@ lnw80: works
#include "emu.h"
#include "includes/trs80.h"
+#include "machine/com8116.h"
#include "sound/ay8910.h"
#include "screen.h"
#include "speaker.h"
@@ -204,7 +205,7 @@ void trs80_state::m1_io(address_map &map)
map.global_mask(0xff);
map.unmap_value_high();
map(0xe8, 0xe8).rw(FUNC(trs80_state::port_e8_r), FUNC(trs80_state::port_e8_w));
- map(0xe9, 0xe9).portr("E9").w(m_brg, FUNC(com8116_device::stt_str_w));
+ map(0xe9, 0xe9).portr("E9").w("brg", FUNC(com8116_device::stt_str_w));
map(0xea, 0xea).rw(FUNC(trs80_state::port_ea_r), FUNC(trs80_state::port_ea_w));
map(0xeb, 0xeb).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit));
map(0xff, 0xff).rw(FUNC(trs80_state::port_ff_r), FUNC(trs80_state::port_ff_w));
@@ -255,9 +256,12 @@ void trs80_state::lnw80_io(address_map &map)
{
map.global_mask(0xff);
map.unmap_value_high();
- m1_io(map);
- map(0xe9, 0xe9).nopw();
+ map(0xe8, 0xe8).rw(FUNC(trs80_state::port_e8_r), FUNC(trs80_state::port_e8_w));
+ map(0xe9, 0xe9).portr("E9");
+ map(0xea, 0xea).rw(FUNC(trs80_state::port_ea_r), FUNC(trs80_state::port_ea_w));
+ map(0xeb, 0xeb).rw(m_uart, FUNC(ay31015_device::receive), FUNC(ay31015_device::transmit));
map(0xfe, 0xfe).rw(FUNC(trs80_state::lnw80_fe_r), FUNC(trs80_state::lnw80_fe_w));
+ map(0xff, 0xff).rw(FUNC(trs80_state::port_ff_r), FUNC(trs80_state::port_ff_w));
}
void trs80_state::radionic_mem(address_map &map)
@@ -498,17 +502,18 @@ static void trs80_floppies(device_slot_interface &device)
}
-MACHINE_CONFIG_START(trs80_state::trs80) // the original model I, level I, with no extras
+void trs80_state::trs80(machine_config &config) // the original model I, level I, with no extras
+{
/* basic machine hardware */
- MCFG_DEVICE_ADD("maincpu", Z80, 10.6445_MHz_XTAL / 6)
- MCFG_DEVICE_PROGRAM_MAP(trs80_mem)
- MCFG_DEVICE_IO_MAP(trs80_io)
+ Z80(config, m_maincpu, 10.6445_MHz_XTAL / 6);
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80_state::trs80_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::trs80_io);
/* video hardware */
- MCFG_SCREEN_ADD("screen", RASTER)
- MCFG_SCREEN_RAW_PARAMS(10.6445_MHz_XTAL, 672, 0, 384, 264, 0, 192)
- MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_trs80)
- MCFG_SCREEN_PALETTE("palette")
+ screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ screen.set_raw(10.6445_MHz_XTAL, 672, 0, 384, 264, 0, 192);
+ screen.set_screen_update(FUNC(trs80_state::screen_update_trs80));
+ screen.set_palette("palette");
GFXDECODE(config, "gfxdecode", "palette", gfx_trs80);
PALETTE(config, "palette", palette_device::MONOCHROME);
@@ -516,52 +521,47 @@ MACHINE_CONFIG_START(trs80_state::trs80) // the original model I, level I,
/* sound hardware */
SPEAKER(config, "mono").front_center();
SPEAKER_SOUND(config, "speaker").add_route(ALL_OUTPUTS, "mono", 0.50);
- WAVE(config, "wave", "cassette").add_route(ALL_OUTPUTS, "mono", 0.05);
+ WAVE(config, "wave", m_cassette).add_route(ALL_OUTPUTS, "mono", 0.05);
/* devices */
- MCFG_CASSETTE_ADD("cassette")
-MACHINE_CONFIG_END
+ CASSETTE(config, m_cassette);
+}
MACHINE_CONFIG_START(trs80_state::model1) // model I, level II
trs80(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_PROGRAM_MAP(m1_mem)
- MCFG_DEVICE_IO_MAP(m1_io)
- MCFG_DEVICE_PERIODIC_INT_DRIVER(trs80_state, rtc_interrupt, 40)
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80_state::m1_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::m1_io);
+ m_maincpu->set_periodic_int(FUNC(trs80_state::rtc_interrupt), attotime::from_hz(40));
/* devices */
- MCFG_CASSETTE_MODIFY("cassette")
- MCFG_CASSETTE_FORMATS(trs80l2_cassette_formats)
- MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_PLAY)
+ m_cassette->set_formats(trs80l2_cassette_formats);
+ m_cassette->set_default_state(CASSETTE_PLAY);
- MCFG_QUICKLOAD_ADD("quickload", trs80_state, trs80_cmd, "cmd", 1.0)
+ MCFG_QUICKLOAD_ADD("quickload", trs80_state, trs80_cmd, "cmd", attotime::from_seconds(1))
FD1793(config, m_fdc, 4_MHz_XTAL / 4); // todo: should be fd1771
m_fdc->intrq_wr_callback().set(FUNC(trs80_state::intrq_w));
- MCFG_FLOPPY_DRIVE_ADD("fdc:0", trs80_floppies, "sssd", trs80_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:1", trs80_floppies, "sssd", trs80_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:2", trs80_floppies, "", trs80_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
- MCFG_FLOPPY_DRIVE_ADD("fdc:3", trs80_floppies, "", trs80_state::floppy_formats)
- MCFG_FLOPPY_DRIVE_SOUND(true)
+ FLOPPY_CONNECTOR(config, "fdc:0", trs80_floppies, "sssd", trs80_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", trs80_floppies, "sssd", trs80_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:2", trs80_floppies, "", trs80_state::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:3", trs80_floppies, "", trs80_state::floppy_formats).enable_sound(true);
- MCFG_DEVICE_ADD(m_centronics, CENTRONICS, centronics_devices, "printer")
- MCFG_CENTRONICS_BUSY_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit7))
- MCFG_CENTRONICS_PERROR_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit6))
- MCFG_CENTRONICS_SELECT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit5))
- MCFG_CENTRONICS_FAULT_HANDLER(WRITELINE("cent_status_in", input_buffer_device, write_bit4))
+ CENTRONICS(config, m_centronics, centronics_devices, "printer");
+ m_centronics->busy_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit7));
+ m_centronics->perror_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit6));
+ m_centronics->select_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit5));
+ m_centronics->fault_handler().set(m_cent_status_in, FUNC(input_buffer_device::write_bit4));
- MCFG_DEVICE_ADD("cent_status_in", INPUT_BUFFER, 0)
+ INPUT_BUFFER(config, m_cent_status_in);
- MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
+ OUTPUT_LATCH(config, m_cent_data_out);
+ m_centronics->set_output_latch(*m_cent_data_out);
- COM8116(config, m_brg, 5.0688_MHz_XTAL); // BR1941L
- m_brg->fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
- m_brg->ft_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
+ com8116_device &brg(COM8116(config, "brg", 5.0688_MHz_XTAL)); // BR1941L
+ brg.fr_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
+ brg.ft_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
AY31015(config, m_uart);
m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r));
@@ -571,34 +571,44 @@ MACHINE_CONFIG_START(trs80_state::model1) // model I, level II
RS232_PORT(config, "rs232", default_rs232_devices, nullptr);
MACHINE_CONFIG_END
-MACHINE_CONFIG_START(trs80_state::sys80)
+void trs80_state::sys80(machine_config &config)
+{
model1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(sys80_io)
- MCFG_DEVICE_REMOVE("brg")
-MACHINE_CONFIG_END
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::sys80_io);
+
+ config.device_remove("brg");
+ CLOCK(config, m_uart_clock, 19200 * 16);
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_tcp));
+}
-MACHINE_CONFIG_START(trs80_state::ht1080z)
+void trs80_state::sys80p(machine_config &config)
+{
sys80(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_IO_MAP(ht1080z_io)
+ m_maincpu->set_clock(10.48_MHz_XTAL / 6);
+ subdevice<screen_device>("screen")->set_raw(10.48_MHz_XTAL, 672, 0, 384, 312, 0, 192);
+}
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_ht1080z)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_ht1080z)
+void trs80_state::ht1080z(machine_config &config)
+{
+ sys80p(config);
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::ht1080z_io);
+
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(trs80_state::screen_update_ht1080z));
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_ht1080z);
AY8910(config, "ay1", 1'500'000).add_route(ALL_OUTPUTS, "mono", 0.25); // guess of clock
//ay1.port_a_read_callback(FUNC(trs80_state::...); // ports are some kind of expansion slot
//ay1.port_b_read_callback(FUNC(trs80_state::...);
-MACHINE_CONFIG_END
+}
-MACHINE_CONFIG_START(trs80_state::lnw80)
+void trs80_state::lnw80(machine_config &config)
+{
model1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- //MCFG_DEVICE_CLOCK(16_MHz_XTAL / 4) // or 16MHz / 9; 4MHz or 1.77MHz operation selected by HI/LO switch
- MCFG_DEVICE_CLOCK(16_MHz_XTAL / 9) // need this so cassette can work
- MCFG_DEVICE_PROGRAM_MAP(lnw80_mem)
- MCFG_DEVICE_IO_MAP(lnw80_io)
+ //m_maincpu->set_clock(16_MHz_XTAL / 4); // or 16MHz / 9; 4MHz or 1.77MHz operation selected by HI/LO switch
+ m_maincpu->set_clock(16_MHz_XTAL / 9); // need this so cassette can work
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80_state::lnw80_mem);
+ m_maincpu->set_addrmap(AS_IO, &trs80_state::lnw80_io);
ADDRESS_MAP_BANK(config, m_lnw_bank, 0);
m_lnw_bank->set_addrmap(0, &trs80_state::lnw_banked_mem);
@@ -608,29 +618,32 @@ MACHINE_CONFIG_START(trs80_state::lnw80)
MCFG_MACHINE_RESET_OVERRIDE(trs80_state, lnw80)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_lnw80)
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_lnw80);
subdevice<palette_device>("palette")->set_entries(8).set_init(FUNC(trs80_state::lnw80_palette));
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(3.579545_MHz_XTAL * 3, 682, 0, 480, 264, 0, 192) // 10.738MHz generated by tank circuit (top left of page 2 of schematics)
+ subdevice<screen_device>("screen")->set_raw(3.579545_MHz_XTAL * 3, 682, 0, 480, 264, 0, 192); // 10.738MHz generated by tank circuit (top left of page 2 of schematics)
// LNW80 Theory of Operations gives H and V periods as 15.750kHz and 59.66Hz, probably due to rounding the calculated ~15.7468kHz to 4 figures
- MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_lnw80)
-MACHINE_CONFIG_END
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(trs80_state::screen_update_lnw80));
-MACHINE_CONFIG_START(trs80_state::radionic)
+ config.device_remove("brg");
+ CLOCK(config, m_uart_clock, 19200 * 16);
+ m_uart_clock->signal_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
+ m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_tcp));
+}
+
+void trs80_state::radionic(machine_config &config)
+{
model1(config);
- MCFG_DEVICE_MODIFY("maincpu")
- MCFG_DEVICE_CLOCK(12_MHz_XTAL / 6) // or 3.579MHz / 2 (selectable?)
+ m_maincpu->set_clock(12_MHz_XTAL / 6); // or 3.579MHz / 2 (selectable?)
// Komtek I "User Friendly Manual" calls for "Z80 running at 1.97 MHz." This likely refers to an alternate NTSC version
// whose master clock was approximately 11.8005 MHz (6 times ~1.966 MHz and 750 times 15.734 kHz). Though the schematics
// provide the main XTAL frequency as 12 MHz, that they also include a 3.579 MHz XTAL suggests this possibility.
- MCFG_DEVICE_PERIODIC_INT_DRIVER(trs80_state, nmi_line_pulse, 12_MHz_XTAL / 12 / 16384)
- MCFG_DEVICE_PROGRAM_MAP(radionic_mem)
+ m_maincpu->set_periodic_int(FUNC(trs80_state::nmi_line_pulse), attotime::from_hz(12_MHz_XTAL / 12 / 16384));
+ m_maincpu->set_addrmap(AS_PROGRAM, &trs80_state::radionic_mem);
- MCFG_SCREEN_MODIFY("screen")
- MCFG_SCREEN_RAW_PARAMS(12_MHz_XTAL, 768, 0, 512, 312, 0, 256)
- MCFG_SCREEN_UPDATE_DRIVER(trs80_state, screen_update_radionic)
- MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_radionic)
+ subdevice<screen_device>("screen")->set_raw(12_MHz_XTAL, 768, 0, 512, 312, 0, 256);
+ subdevice<screen_device>("screen")->set_screen_update(FUNC(trs80_state::screen_update_radionic));
+ subdevice<gfxdecode_device>("gfxdecode")->set_info(gfx_radionic);
// Interface to external circuits
I8255(config, m_ppi);
@@ -638,7 +651,7 @@ MACHINE_CONFIG_START(trs80_state::radionic)
//m_ppi->out_pa_callback().set(FUNC(pulsar_state::ppi_pa_w)); // Data for external plugin printer module
//m_ppi->out_pb_callback().set(FUNC(pulsar_state::ppi_pb_w)); // Control data to external
//m_ppi->out_pc_callback().set(FUNC(pulsar_state::ppi_pc_w)); // Printer strobe
-MACHINE_CONFIG_END
+}
/***************************************************************************
@@ -697,6 +710,8 @@ ROM_START(sys80)
ROM_LOAD("trs80m1.chr", 0x0000, 0x0400, CRC(0033f2b9) SHA1(0d2cd4197d54e2e872b515bbfdaa98efe502eda7))
ROM_END
+#define rom_sys80p rom_sys80
+
ROM_START(lnw80)
ROM_REGION(0x3800, "maincpu",0)
@@ -759,7 +774,8 @@ void trs80_state::init_trs80l2()
COMP( 1977, trs80, 0, 0, trs80, trs80, trs80_state, init_trs80, "Tandy Radio Shack", "TRS-80 Model I (Level I Basic)", 0 )
COMP( 1978, trs80l2, 0, 0, model1, trs80l2, trs80_state, init_trs80l2, "Tandy Radio Shack", "TRS-80 Model I (Level II Basic)", 0 )
COMP( 1983, radionic, trs80l2, 0, radionic, trs80l2, trs80_state, init_trs80, "Komtek", "Radionic", 0 )
-COMP( 1980, sys80, trs80l2, 0, sys80, sys80, trs80_state, init_trs80l2, "EACA Computers Ltd", "System-80", 0 )
+COMP( 1980, sys80, trs80l2, 0, sys80, sys80, trs80_state, init_trs80l2, "EACA Computers Ltd", "System-80 (60 Hz)", 0 )
+COMP( 1980, sys80p, trs80l2, 0, sys80p, sys80, trs80_state, init_trs80l2, "EACA Computers Ltd", "System-80 (50 Hz)", 0 )
COMP( 1981, lnw80, trs80l2, 0, lnw80, sys80, trs80_state, init_trs80, "LNW Research", "LNW-80", 0 )
COMP( 1983, ht1080z, trs80l2, 0, ht1080z, sys80, trs80_state, init_trs80l2, "Hiradastechnika Szovetkezet", "HT-1080Z Series I", 0 )
COMP( 1984, ht1080z2, trs80l2, 0, ht1080z, sys80, trs80_state, init_trs80l2, "Hiradastechnika Szovetkezet", "HT-1080Z Series II", 0 )