summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/sega/sg1000.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/sega/sg1000.cpp')
-rw-r--r--src/mame/sega/sg1000.cpp134
1 files changed, 68 insertions, 66 deletions
diff --git a/src/mame/sega/sg1000.cpp b/src/mame/sega/sg1000.cpp
index b26f32fbdb2..c326e2e7eb5 100644
--- a/src/mame/sega/sg1000.cpp
+++ b/src/mame/sega/sg1000.cpp
@@ -76,7 +76,6 @@ Notes:
#include "imagedev/floppy.h"
#include "machine/i8251.h"
#include "machine/i8255.h"
-#include "machine/ram.h"
#include "machine/upd765.h"
#include "sound/sn76496.h"
#include "video/tms9928a.h"
@@ -105,7 +104,6 @@ public:
sg1000_state_base(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, Z80_TAG),
- m_ram(*this, RAM_TAG),
m_rom(*this, Z80_TAG),
m_cart(*this, "slot"),
m_sgexpslot(*this, "sgexp")
@@ -113,7 +111,6 @@ public:
protected:
required_device<cpu_device> m_maincpu;
- required_device<ram_device> m_ram;
required_memory_region m_rom;
optional_device<sega8_cart_slot_device> m_cart;
required_device<sg1000_expansion_slot_device> m_sgexpslot;
@@ -136,15 +133,15 @@ public:
protected:
required_device_array<sms_control_port_device, 2> m_ctrlports;
- virtual void machine_start() override;
+ virtual void machine_start() override ATTR_COLD;
uint8_t peripheral_r(offs_t offset);
void peripheral_w(offs_t offset, uint8_t data);
- void sg1000_map(address_map &map);
- void sg1000_io_map(address_map &map);
- void sc3000_map(address_map &map);
- void sc3000_io_map(address_map &map);
+ void sg1000_map(address_map &map) ATTR_COLD;
+ void sg1000_io_map(address_map &map) ATTR_COLD;
+ void sc3000_map(address_map &map) ATTR_COLD;
+ void sc3000_io_map(address_map &map) ATTR_COLD;
};
class omv_state : public sg1000_state_base
@@ -160,8 +157,8 @@ private:
uint8_t omv_r(offs_t offset);
void omv_w(offs_t offset, uint8_t data);
- void omv_map(address_map &map);
- void omv_io_map(address_map &map);
+ void omv_map(address_map &map) ATTR_COLD;
+ void omv_io_map(address_map &map) ATTR_COLD;
};
class omv2000_state : public omv_state
@@ -179,7 +176,7 @@ public:
private:
required_device<sms_control_port_device> m_ctrl2;
- virtual void machine_start() override;
+ virtual void machine_start() override ATTR_COLD;
};
class sc3000_state : public sg1000_state
@@ -190,9 +187,10 @@ public:
{ }
void sc3000(machine_config &config);
+ void sc3000pal(machine_config &config);
protected:
- virtual void machine_start() override;
+ virtual void machine_start() override ATTR_COLD;
void sc3000_base(machine_config &config);
};
@@ -204,7 +202,8 @@ public:
sc3000_state(mconfig, type, tag),
m_fdc(*this, UPD765_TAG),
m_centronics(*this, "centronics"),
- m_floppy0(*this, UPD765_TAG ":0:3ssdd")
+ m_floppy0(*this, UPD765_TAG ":0:3ssdd"),
+ m_romview(*this, "romview")
{ }
void sf7000(machine_config &config);
@@ -214,17 +213,18 @@ private:
required_device<centronics_device> m_centronics;
required_device<floppy_image_device> m_floppy0;
+ memory_view m_romview;
+
int m_centronics_busy = 0;
- virtual void machine_start() override;
- virtual void machine_reset() override;
+ virtual void machine_start() override ATTR_COLD;
void write_centronics_busy(int state);
uint8_t ppi_pa_r();
void ppi_pc_w(uint8_t data);
- void sf7000_io_map(address_map &map);
- void sf7000_map(address_map &map);
+ void sf7000_io_map(address_map &map) ATTR_COLD;
+ void sf7000_map(address_map &map) ATTR_COLD;
static void floppy_formats(format_registration &fr);
};
@@ -361,8 +361,9 @@ void sg1000_state::sc3000_io_map(address_map &map)
void sf7000_state::sf7000_map(address_map &map)
{
- map(0x0000, 0x3fff).bankr("bank1").bankw("bank2");
- map(0x4000, 0xffff).ram();
+ map(0x0000, 0xffff).ram();
+ map(0x0000, 0x3fff).view(m_romview);
+ m_romview[0](0x0000, 0x3fff).rom().region(Z80_TAG, 0);
}
/*-------------------------------------------------
@@ -394,7 +395,7 @@ INPUT_CHANGED_MEMBER( sg1000_state::trigger_nmi )
}
/*-------------------------------------------------
- CUSTOM_INPUT_MEMBER( ctrl2_r )
+ ioport_value ctrl2_r()
-------------------------------------------------*/
template <unsigned Shift>
@@ -409,7 +410,7 @@ ioport_value omv2000_state::ctrl2_r()
static INPUT_PORTS_START( sg1000 )
PORT_START("NMI")
- PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME(DEF_STR(Pause)) PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, sg1000_state, trigger_nmi, 0)
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME(DEF_STR(Pause)) PORT_CODE(KEYCODE_1) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(sg1000_state::trigger_nmi), 0)
INPUT_PORTS_END
/*-------------------------------------------------
@@ -464,10 +465,10 @@ static INPUT_PORTS_START( omv2000 )
PORT_INCLUDE( omv1000 )
PORT_MODIFY("C4")
- PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(omv2000_state, ctrl2_r<0>);
+ PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(FUNC(omv2000_state::ctrl2_r<0>));
PORT_MODIFY("C5")
- PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(omv2000_state, ctrl2_r<2>);
+ PORT_BIT( 0x0f, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(FUNC(omv2000_state::ctrl2_r<2>));
PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
@@ -479,7 +480,8 @@ static INPUT_PORTS_START( sc3000 )
// keyboard keys are added by the embedded sk1100 device
PORT_START("NMI")
- PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESET") PORT_CODE(KEYCODE_F10) PORT_CHANGED_MEMBER(DEVICE_SELF, sg1000_state, trigger_nmi, 0)
+ // This is actually part of the main keyboard, though emulated separately here
+ PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Reset") PORT_CODE(KEYCODE_F10) PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(sg1000_state::trigger_nmi), 0)
INPUT_PORTS_END
/*-------------------------------------------------
@@ -541,7 +543,7 @@ void sf7000_state::ppi_pc_w(uint8_t data)
/*
Signal Description
- PC0 /INUSE signal to FDD
+ PC0 /INUSE signal to FDD (drives LED?)
PC1 /MOTOR ON signal to FDD
PC2 TC signal to FDC
PC3 RESET signal to FDC
@@ -563,13 +565,13 @@ void sf7000_state::ppi_pc_w(uint8_t data)
m_fdc->tc_w(BIT(data, 2));
/* FDC reset */
- if (BIT(data, 3))
- {
- m_fdc->reset();
- }
+ m_fdc->reset_w(BIT(data, 3));
/* ROM selection */
- membank("bank1")->set_entry(BIT(data, 6));
+ if (BIT(data, 6))
+ m_romview.disable();
+ else
+ m_romview.select(0);
/* printer strobe */
m_centronics->write_strobe(BIT(data, 7));
@@ -660,17 +662,6 @@ void sf7000_state::machine_start()
sc3000_state::machine_start();
save_item(NAME(m_centronics_busy));
-
- /* configure memory banking */
- membank("bank1")->configure_entry(0, m_rom->base());
- membank("bank1")->configure_entry(1, m_ram->pointer());
- membank("bank2")->configure_entry(0, m_ram->pointer());
-}
-
-void sf7000_state::machine_reset()
-{
- membank("bank1")->set_entry(0);
- membank("bank2")->set_entry(0);
}
/***************************************************************************
@@ -680,10 +671,10 @@ void sf7000_state::machine_reset()
void sg1000_state_base::sg1000_base(machine_config &config)
{
/* basic machine hardware */
- Z80(config, m_maincpu, XTAL(10'738'635) / 3); // LH0080A
+ Z80(config, m_maincpu, 10.738635_MHz_XTAL / 3); // LH0080A
/* video hardware */
- tms9918a_device &vdp(TMS9918A(config, TMS9918A_TAG, XTAL(10'738'635)));
+ tms9918a_device &vdp(TMS9918A(config, TMS9918A_TAG, 10.738635_MHz_XTAL));
vdp.set_screen("screen");
vdp.set_vram_size(0x4000);
vdp.int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
@@ -693,7 +684,7 @@ void sg1000_state_base::sg1000_base(machine_config &config)
/* sound hardware */
SPEAKER(config, "mono").front_center();
- SN76489A(config, SN76489AN_TAG, XTAL(10'738'635) / 3).add_route(ALL_OUTPUTS, "mono", 1.00);
+ SN76489A(config, SN76489AN_TAG, 10.738635_MHz_XTAL / 3).add_route(ALL_OUTPUTS, "mono", 1.00);
/* software lists */
SOFTWARE_LIST(config, "cart_list").set_original("sg1000");
@@ -733,9 +724,6 @@ void sg1000_state::sg1000(machine_config &config)
/* cartridge */
SG1000_CART_SLOT(config, m_cart, sg1000_cart, nullptr).set_must_be_loaded(true);
-
- /* internal ram */
- RAM(config, m_ram).set_default_size("1K");
}
/*-------------------------------------------------
@@ -754,9 +742,6 @@ void omv_state::omv1000(machine_config &config)
/* cartridge */
OMV_CART_SLOT(config, m_cart, sg1000_cart, nullptr);
-
- /* internal ram */
- RAM(config, m_ram).set_default_size("2K");
}
/*-------------------------------------------------
@@ -784,9 +769,22 @@ void sc3000_state::sc3000(machine_config &config)
/* cartridge */
SC3000_CART_SLOT(config, m_cart, sg1000_cart, nullptr).set_must_be_loaded(true);
+}
+
+void sc3000_state::sc3000pal(machine_config &config)
+{
+ sc3000(config);
- /* internal ram */
- RAM(config, m_ram).set_default_size("2K");
+ tms9929a_device &vdp(TMS9929A(config.replace(), TMS9918A_TAG, 10.738635_MHz_XTAL));
+ vdp.set_screen("screen");
+ vdp.set_vram_size(0x4000);
+ vdp.int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
+
+ // Z80A and SN76489AN are clocked by a separate ceramic oscillator since TMS9929A has no CPUCLK output
+ m_maincpu->set_clock(3.58_MHz_XTAL);
+ subdevice(SN76489AN_TAG)->set_clock(3.58_MHz_XTAL);
+
+ m_sgexpslot->set_default_option("sk1100e");
}
/*-------------------------------------------------
@@ -807,17 +805,21 @@ void sf7000_state::sf7000(machine_config &config)
ppi.in_pa_callback().set(FUNC(sf7000_state::ppi_pa_r));
ppi.out_pb_callback().set("cent_data_out", FUNC(output_latch_device::write));
ppi.out_pc_callback().set(FUNC(sf7000_state::ppi_pc_w));
+ ppi.tri_pc_callback().set_constant(0x8f); // /ROM SEL must be active after reset
- i8251_device &upd8251(I8251(config, UPD8251_TAG, 0));
+ i8251_device &upd8251(I8251(config, UPD8251_TAG, 4.9152_MHz_XTAL / 2));
upd8251.txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
upd8251.dtr_handler().set(RS232_TAG, FUNC(rs232_port_device::write_dtr));
upd8251.rts_handler().set(RS232_TAG, FUNC(rs232_port_device::write_rts));
rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
rs232.rxd_handler().set(UPD8251_TAG, FUNC(i8251_device::write_rxd));
+ rs232.cts_handler().set(UPD8251_TAG, FUNC(i8251_device::write_cts));
rs232.dsr_handler().set(UPD8251_TAG, FUNC(i8251_device::write_dsr));
- UPD765A(config, m_fdc, 8'000'000, false, false);
+ UPD765A(config, m_fdc, 16_MHz_XTAL / 4); // clocked through SED9420C
+ m_fdc->set_ready_line_connected(true); // or disconnected by split pad?
+ m_fdc->set_select_lines_connected(false); // FIXME: actually connected according to schematics
FLOPPY_CONNECTOR(config, UPD765_TAG ":0", sf7000_floppies, "3ssdd", sf7000_state::floppy_formats);
CENTRONICS(config, m_centronics, centronics_devices, "printer");
@@ -828,9 +830,6 @@ void sf7000_state::sf7000(machine_config &config)
/* software lists */
SOFTWARE_LIST(config, "flop_list").set_original("sf7000");
-
- /* internal ram */
- RAM(config, m_ram).set_default_size("64K");
}
/***************************************************************************
@@ -845,7 +844,7 @@ ROM_END
#define rom_sc3000 rom_sg1000
-#define rom_sc3000h rom_sg1000
+#define rom_sc3000pal rom_sg1000
ROM_START( sf7000 )
ROM_REGION( 0x10000, Z80_TAG, ROMREGION_ERASE00 )
@@ -869,11 +868,14 @@ ROM_END
SYSTEM DRIVERS
***************************************************************************/
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-CONS( 1983, sg1000, 0, 0, sg1000, sg1000, sg1000_state, empty_init, "Sega", "SG-1000", MACHINE_SUPPORTS_SAVE )
-CONS( 1984, sg1000m2, sg1000, 0, sc3000, sc3000, sc3000_state, empty_init, "Sega", "SG-1000 II", MACHINE_SUPPORTS_SAVE )
-COMP( 1983, sc3000, 0, sg1000, sc3000, sc3000, sc3000_state, empty_init, "Sega", "SC-3000", MACHINE_SUPPORTS_SAVE )
-COMP( 1983, sc3000h, sc3000, 0, sc3000, sc3000, sc3000_state, empty_init, "Sega", "SC-3000H", MACHINE_SUPPORTS_SAVE )
-COMP( 1983, sf7000, sc3000, 0, sf7000, sf7000, sf7000_state, empty_init, "Sega", "SC-3000/Super Control Station SF-7000", MACHINE_SUPPORTS_SAVE )
-CONS( 1984, omv1000, sg1000, 0, omv1000, omv1000, omv_state, empty_init, "Tsukuda Original", "Othello Multivision FG-1000", MACHINE_SUPPORTS_SAVE )
-CONS( 1984, omv2000, sg1000, 0, omv2000, omv2000, omv2000_state, empty_init, "Tsukuda Original", "Othello Multivision FG-2000", MACHINE_SUPPORTS_SAVE )
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+CONS( 1983, sg1000, 0, 0, sg1000, sg1000, sg1000_state, empty_init, "Sega", "SG-1000", MACHINE_SUPPORTS_SAVE )
+CONS( 1984, sg1000m2, sg1000, 0, sc3000, sc3000, sc3000_state, empty_init, "Sega", "SG-1000 II", MACHINE_SUPPORTS_SAVE )
+CONS( 1984, omv1000, sg1000, 0, omv1000, omv1000, omv_state, empty_init, "Tsukuda Original", "Othello Multivision FG-1000", MACHINE_SUPPORTS_SAVE )
+CONS( 1984, omv2000, sg1000, 0, omv2000, omv2000, omv2000_state, empty_init, "Tsukuda Original", "Othello Multivision FG-2000", MACHINE_SUPPORTS_SAVE )
+
+// SC-3000 and SC-3000H are identical except for key mechanism.
+// PAL/SECAM versions of SC-3000 were distributed by Yeno in France, by John Sands Electronics in Australia and by Grandstand Leisure in New Zealand.
+COMP( 1983, sc3000, 0, sg1000, sc3000, sc3000, sc3000_state, empty_init, "Sega", "SC-3000 (NTSC)", MACHINE_SUPPORTS_SAVE )
+COMP( 1983, sc3000pal, sc3000, 0, sc3000pal, sc3000, sc3000_state, empty_init, "Sega", "SC-3000 (PAL)", MACHINE_SUPPORTS_SAVE )
+COMP( 1983, sf7000, sc3000, 0, sf7000, sf7000, sf7000_state, empty_init, "Sega", "SC-3000/Super Control Station SF-7000", MACHINE_SUPPORTS_SAVE )