diff options
Diffstat (limited to 'src/mame/drivers/ampro.cpp')
-rw-r--r-- | src/mame/drivers/ampro.cpp | 135 |
1 files changed, 105 insertions, 30 deletions
diff --git a/src/mame/drivers/ampro.cpp b/src/mame/drivers/ampro.cpp index b5c7cbce501..b3092ba2b81 100644 --- a/src/mame/drivers/ampro.cpp +++ b/src/mame/drivers/ampro.cpp @@ -15,16 +15,17 @@ power supply and serial terminal. The later versions included a SCSI chip (NCR5380) enabling the use of a hard drive of up to 88MB. -ToDo: -- (maybe) add scsi interface -- Add printer - ****************************************************************************/ #include "emu.h" +#include "bus/centronics/ctronics.h" #include "bus/rs232/rs232.h" #include "cpu/z80/z80.h" #include "imagedev/floppy.h" +#include "machine/ncr5380n.h" +#include "machine/nscsi_cd.h" +#include "machine/nscsi_hd.h" +#include "machine/output_latch.h" #include "machine/z80daisy.h" #include "machine/z80ctc.h" #include "machine/z80dart.h" @@ -42,6 +43,8 @@ public: , m_ctc(*this, "ctc") , m_fdc(*this, "fdc") , m_floppy0(*this, "fdc:0") + , m_ncr(*this, "scsi:7:ncr") + , m_printer(*this, "printer") { } void ampro(machine_config &config); @@ -53,9 +56,13 @@ protected: private: TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick); - DECLARE_WRITE8_MEMBER(port00_w); - DECLARE_READ8_MEMBER(io_r); - DECLARE_WRITE8_MEMBER(io_w); + void port00_w(uint8_t data); + void set_strobe(uint8_t data); + void clear_strobe(uint8_t data); + uint8_t ctc_r(offs_t offset); + uint8_t dart_r(offs_t offset); + void ctc_w(offs_t offset, uint8_t data); + void dart_w(offs_t offset, uint8_t data); void ampro_io(address_map &map); void ampro_mem(address_map &map); @@ -65,6 +72,8 @@ private: required_device<z80ctc_device> m_ctc; required_device<wd1772_device> m_fdc; required_device<floppy_connector> m_floppy0; + required_device<ncr5380n_device> m_ncr; + required_device<centronics_device> m_printer; }; /* @@ -74,7 +83,7 @@ d5 /DDEN d6 Banking 0=rom d7 FDC master clock 0=8MHz 1=16MHz (for 20cm disks, not emulated) */ -WRITE8_MEMBER( ampro_state::port00_w ) +void ampro_state::port00_w(uint8_t data) { membank("bankr0")->set_entry(BIT(data, 6)); m_fdc->dden_w(BIT(data, 5)); @@ -85,20 +94,34 @@ WRITE8_MEMBER( ampro_state::port00_w ) floppy->ss_w(BIT(data, 4)); } -READ8_MEMBER( ampro_state::io_r ) +void ampro_state::set_strobe(uint8_t data) +{ + m_printer->write_strobe(0); +} + +void ampro_state::clear_strobe(uint8_t data) +{ + m_printer->write_strobe(1); +} + +uint8_t ampro_state::ctc_r(offs_t offset) +{ + return m_ctc->read(offset>>4); +} + +uint8_t ampro_state::dart_r(offs_t offset) { - if (offset < 0x40) - return m_ctc->read(offset>>4); - else - return m_dart->ba_cd_r(offset>>2); + return m_dart->ba_cd_r(offset>>2); } -WRITE8_MEMBER( ampro_state::io_w ) +void ampro_state::ctc_w(offs_t offset, uint8_t data) { - if (offset < 0x40) - m_ctc->write(offset>>4, data); - else - m_dart->ba_cd_w(offset>>2, data); + m_ctc->write(offset>>4, data); +} + +void ampro_state::dart_w(offs_t offset, uint8_t data) +{ + m_dart->ba_cd_w(offset>>2, data); } void ampro_state::ampro_mem(address_map &map) @@ -113,12 +136,14 @@ void ampro_state::ampro_io(address_map &map) map.unmap_value_high(); map.global_mask(0xff); map(0x00, 0x00).w(FUNC(ampro_state::port00_w)); // system - //AM_RANGE(0x01, 0x01) AM_WRITE(port01_w) // printer data - //AM_RANGE(0x02, 0x03) AM_WRITE(port02_w) // printer strobe - //AM_RANGE(0x20, 0x27) AM_READWRITE() // scsi chip - //AM_RANGE(0x28, 0x28) AM_WRITE(port28_w) // scsi control - //AM_RANGE(0x29, 0x29) AM_READ(port29_r) // ID port - map(0x40, 0x8f).rw(FUNC(ampro_state::io_r), FUNC(ampro_state::io_w)); + map(0x01, 0x01).w("pio", FUNC(output_latch_device::bus_w)); // printer data + map(0x02, 0x02).w(FUNC(ampro_state::set_strobe)); // printer strobe + map(0x03, 0x03).w(FUNC(ampro_state::clear_strobe)); // printer strobe + map(0x20, 0x27).rw(m_ncr, FUNC(ncr5380n_device::read), FUNC(ncr5380n_device::write)); // scsi chip + map(0x28, 0x28).rw(m_ncr, FUNC(ncr5380n_device::dma_r), FUNC(ncr5380n_device::dma_w)); // scsi control + map(0x29, 0x29).portr("ID"); // ID port + map(0x40, 0x7f).rw(FUNC(ampro_state::ctc_r), FUNC(ampro_state::ctc_w)); + map(0x80, 0x8f).rw(FUNC(ampro_state::dart_r), FUNC(ampro_state::dart_w)); map(0xc0, 0xc3).w(m_fdc, FUNC(wd1772_device::write)); map(0xc4, 0xc7).r(m_fdc, FUNC(wd1772_device::read)); } @@ -135,14 +160,37 @@ static void ampro_floppies(device_slot_interface &device) device.option_add("525dd", FLOPPY_525_DD); } +static void scsi_devices(device_slot_interface &device) +{ + device.option_add("harddisk", NSCSI_HARDDISK); + device.option_add_internal("ncr", NCR5380N); +} + /* Input ports */ static INPUT_PORTS_START( ampro ) + PORT_START("ID") + PORT_DIPUNUSED_DIPLOC(0x80, 0x80, "J9:1") // actually pin pair 1-2 + PORT_DIPUNUSED_DIPLOC(0x40, 0x40, "J9:2") // actually pin pair 3-4 + PORT_DIPUNUSED_DIPLOC(0x20, 0x20, "J9:3") // actually pin pair 5-6 + PORT_DIPUNUSED_DIPLOC(0x10, 0x10, "J9:4") // actually pin pair 7-8 + PORT_DIPUNUSED_DIPLOC(0x08, 0x08, "J9:5") // actually pin pair 9-10 + PORT_DIPNAME(0x07, 0x07, "SCSI ID") PORT_DIPLOCATION("J9:8,7,6") // actually pin pairs 15-16, 13-14, 11-12 + PORT_DIPSETTING(0x00, "0") + PORT_DIPSETTING(0x01, "1") + PORT_DIPSETTING(0x02, "2") + PORT_DIPSETTING(0x03, "3") + PORT_DIPSETTING(0x04, "4") + PORT_DIPSETTING(0x05, "5") + PORT_DIPSETTING(0x06, "6") + PORT_DIPSETTING(0x07, "7") INPUT_PORTS_END void ampro_state::machine_reset() { - membank("bankr0")->set_entry(0); // point at rom membank("bankw0")->set_entry(0); // always write to ram + + port00_w(0); + clear_strobe(0); } void ampro_state::init_ampro() @@ -172,17 +220,44 @@ void ampro_state::ampro(machine_config &config) m_ctc->zc_callback<1>().set(m_dart, FUNC(z80dart_device::rxtxcb_w)); // SIO Ch B Z80DART(config, m_dart, 16_MHz_XTAL / 4); - m_dart->out_txda_callback().set("rs232", FUNC(rs232_port_device::write_txd)); - m_dart->out_dtra_callback().set("rs232", FUNC(rs232_port_device::write_dtr)); - m_dart->out_rtsa_callback().set("rs232", FUNC(rs232_port_device::write_rts)); + m_dart->out_txda_callback().set("rs232a", FUNC(rs232_port_device::write_txd)); + m_dart->out_rtsa_callback().set("rs232a", FUNC(rs232_port_device::write_rts)); + m_dart->out_txdb_callback().set("rs232b", FUNC(rs232_port_device::write_txd)); + m_dart->out_rtsb_callback().set("rs232b", FUNC(rs232_port_device::write_rts)); m_dart->out_int_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal")); - rs232.rxd_handler().set(m_dart, FUNC(z80dart_device::rxa_w)); + rs232_port_device &rs232a(RS232_PORT(config, "rs232a", default_rs232_devices, "terminal")); + rs232a.rxd_handler().set(m_dart, FUNC(z80dart_device::rxa_w)); + rs232a.cts_handler().set(m_dart, FUNC(z80dart_device::ctsa_w)); + + rs232_port_device &rs232b(RS232_PORT(config, "rs232b", default_rs232_devices, nullptr)); + rs232b.rxd_handler().set(m_dart, FUNC(z80dart_device::rxb_w)); + rs232b.cts_handler().set(m_dart, FUNC(z80dart_device::ctsb_w)); + + output_latch_device &pio(OUTPUT_LATCH(config, "pio")); + CENTRONICS(config, m_printer, centronics_devices, nullptr); + m_printer->busy_handler().set(m_dart, FUNC(z80dart_device::rib_w)); + m_printer->set_output_latch(pio); WD1772(config, m_fdc, 16_MHz_XTAL / 2); + //m_fdc->intrq_wr_callback().set(m_ctc, FUNC(z80ctc_device::trg3)); // only if JMP2-3 shorted + //m_fdc->drq_wr_callback().set(m_dart, FUNC(z80dart_device::ria_w)); // only if JMP7 shorted + m_fdc->ready_wr_callback().set(m_dart, FUNC(z80dart_device::dcdb_w)); // actually from the drive, and not used by the FDC at all FLOPPY_CONNECTOR(config, "fdc:0", ampro_floppies, "525dd", floppy_image_device::default_floppy_formats).enable_sound(true); SOFTWARE_LIST(config, "flop_list").set_original("ampro"); + + NSCSI_BUS(config, "scsi"); + NSCSI_CONNECTOR(config, "scsi:0", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:1", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:2", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:3", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:4", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:5", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:6", scsi_devices, nullptr); + NSCSI_CONNECTOR(config, "scsi:7", scsi_devices, "ncr", true).set_option_machine_config("ncr", [this] (device_t *device) { + //downcast<ncr5380n_device &>(*device).irq_handler().set(m_ctc, FUNC(z80ctc_device::trg2)); // only if JMP3 shorted + //downcast<ncr5380n_device &>(*device).drq_handler().set(m_dart, FUNC(z80dart_device::dcda_w)); // only if JMP8 shorted + }); } /* ROM definition */ |