diff options
Diffstat (limited to 'src/devices/bus/econet/e01.cpp')
-rw-r--r-- | src/devices/bus/econet/e01.cpp | 138 |
1 files changed, 55 insertions, 83 deletions
diff --git a/src/devices/bus/econet/e01.cpp b/src/devices/bus/econet/e01.cpp index ffb29dbe53e..e46ac49e379 100644 --- a/src/devices/bus/econet/e01.cpp +++ b/src/devices/bus/econet/e01.cpp @@ -30,7 +30,7 @@ 2 x TMM27256D-20 white labelled EPROMs, TMSE01 MOS on left and E01 FS on the right IC20 WD2793-APL-02 floppy disc controller 2 x NEC D41464C-12 64k x 4bit NMOS RAM ICs giving 64K memory - IC21 Rockwell RC6522AP VIA behind to the right + IC21 Rockwell R65C22AP or CMD G65SC22P-2 VIA behind to the right */ @@ -53,8 +53,11 @@ #include "emu.h" #include "e01.h" + #include "bus/scsi/scsihd.h" -#include "softlist.h" +#include "softlist_dev.h" + +#include "formats/afs_dsk.h" //************************************************************************** @@ -133,7 +136,7 @@ const tiny_rom_entry *econet_e01_device::device_rom_region() const // MC146818_INTERFACE( rtc_intf ) //------------------------------------------------- -WRITE_LINE_MEMBER(econet_e01_device::rtc_irq_w) +void econet_e01_device::rtc_irq_w(int state) { m_rtc_irq = state; @@ -145,49 +148,50 @@ WRITE_LINE_MEMBER(econet_e01_device::rtc_irq_w) // mc6854_interface adlc_intf //------------------------------------------------- -WRITE_LINE_MEMBER( econet_e01_device::adlc_irq_w ) +void econet_e01_device::adlc_irq_w(int state) { m_adlc_irq = state; update_interrupts(); } -WRITE_LINE_MEMBER( econet_e01_device::econet_data_w ) +void econet_e01_device::econet_data_w(int state) { m_econet->data_w(this, state); } -WRITE_LINE_MEMBER(econet_e01_device::via_irq_w) +void econet_e01_device::via_irq_w(int state) { m_via_irq = state; update_interrupts(); } -WRITE_LINE_MEMBER( econet_e01_device::clk_en_w ) +void econet_e01_device::clk_en_w(int state) { m_clk_en = state; } -FLOPPY_FORMATS_MEMBER( econet_e01_device::floppy_formats_afs ) - FLOPPY_AFS_FORMAT -FLOPPY_FORMATS_END0 +void econet_e01_device::floppy_formats_afs(format_registration &fr) +{ + fr.add(FLOPPY_AFS_FORMAT); +} -WRITE_LINE_MEMBER( econet_e01_device::fdc_irq_w ) +void econet_e01_device::fdc_irq_w(int state) { m_fdc_irq = state; update_interrupts(); } -WRITE_LINE_MEMBER( econet_e01_device::fdc_drq_w ) +void econet_e01_device::fdc_drq_w(int state) { m_fdc_drq = state; update_interrupts(); } -WRITE_LINE_MEMBER( econet_e01_device::scsi_bsy_w ) +void econet_e01_device::scsi_bsy_w(int state) { m_scsi_ctrl_in->write_bit1(state); @@ -197,7 +201,7 @@ WRITE_LINE_MEMBER( econet_e01_device::scsi_bsy_w ) } } -WRITE_LINE_MEMBER( econet_e01_device::scsi_req_w ) +void econet_e01_device::scsi_req_w(int state) { m_scsi_ctrl_in->write_bit5(state); @@ -218,17 +222,17 @@ WRITE_LINE_MEMBER( econet_e01_device::scsi_req_w ) void econet_e01_device::e01_mem(address_map &map) { map(0x0000, 0xffff).rw(FUNC(econet_e01_device::read), FUNC(econet_e01_device::write)); - map(0xfc00, 0xfc00).mirror(0x00c3).rw(FUNC(econet_e01_device::rtc_address_r), FUNC(econet_e01_device::rtc_address_w)); - map(0xfc04, 0xfc04).mirror(0x00c3).rw(FUNC(econet_e01_device::rtc_data_r), FUNC(econet_e01_device::rtc_data_w)); + map(0xfc00, 0xfc00).mirror(0x00c3).w(m_rtc, FUNC(mc146818_device::address_w)); + map(0xfc04, 0xfc04).mirror(0x00c3).rw(m_rtc, FUNC(mc146818_device::data_r), FUNC(mc146818_device::data_w)); map(0xfc08, 0xfc08).mirror(0x00c0).r(FUNC(econet_e01_device::ram_select_r)).w(FUNC(econet_e01_device::floppy_w)); map(0xfc0c, 0xfc0f).mirror(0x00c0).rw(WD2793_TAG, FUNC(wd2793_device::read), FUNC(wd2793_device::write)); map(0xfc10, 0xfc1f).mirror(0x00c0).m(R6522_TAG, FUNC(via6522_device::map)); map(0xfc20, 0xfc23).mirror(0x00c0).rw(MC6854_TAG, FUNC(mc6854_device::read), FUNC(mc6854_device::write)); map(0xfc24, 0xfc24).mirror(0x00c3).rw(FUNC(econet_e01_device::network_irq_disable_r), FUNC(econet_e01_device::network_irq_disable_w)); map(0xfc28, 0xfc28).mirror(0x00c3).rw(FUNC(econet_e01_device::network_irq_enable_r), FUNC(econet_e01_device::network_irq_enable_w)); - map(0xfc2c, 0xfc2c).mirror(0x00c3).portr("FLAP"); + map(0xfc2c, 0xfc2c).mirror(0x00c3).portr(m_flap); map(0xfc30, 0xfc30).mirror(0x00c0).rw(FUNC(econet_e01_device::hdc_data_r), FUNC(econet_e01_device::hdc_data_w)); - map(0xfc31, 0xfc31).mirror(0x00c0).r("scsi_ctrl_in", FUNC(input_buffer_device::bus_r)); + map(0xfc31, 0xfc31).mirror(0x00c0).r("scsi_ctrl_in", FUNC(input_buffer_device::read)); map(0xfc32, 0xfc32).mirror(0x00c0).w(FUNC(econet_e01_device::hdc_select_w)); map(0xfc33, 0xfc33).mirror(0x00c0).w(FUNC(econet_e01_device::hdc_irq_enable_w)); } @@ -241,15 +245,15 @@ void econet_e01_device::e01_mem(address_map &map) void econet_e01_device::device_add_mconfig(machine_config &config) { // basic machine hardware - M65C02(config, m_maincpu, XTAL(8'000'000)/4); // Rockwell R65C102P3 + R65C102(config, m_maincpu, XTAL(8'000'000)); // Rockwell R65C102P3 m_maincpu->set_addrmap(AS_PROGRAM, &econet_e01_device::e01_mem); MC146818(config, m_rtc, 32.768_kHz_XTAL); m_rtc->irq().set(FUNC(econet_e01_device::rtc_irq_w)); // devices - via6522_device &via(VIA6522(config, R6522_TAG, 8_MHz_XTAL / 4)); - via.writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + via6522_device &via(R65C22(config, R6522_TAG, 8_MHz_XTAL / 4)); + via.writepa_handler().set("cent_data_out", FUNC(output_latch_device::write)); via.irq_handler().set(FUNC(econet_e01_device::via_irq_w)); MC6854(config, m_adlc, 0); @@ -269,7 +273,7 @@ void econet_e01_device::device_add_mconfig(machine_config &config) } software_list_device &softlist(SOFTWARE_LIST(config, "flop_ls_e01")); - softlist.set_type("e01_flop", SOFTWARE_LIST_ORIGINAL_SYSTEM); + softlist.set_original("e01_flop"); CENTRONICS(config, m_centronics, centronics_devices, "printer"); m_centronics->ack_handler().set(R6522_TAG, FUNC(via6522_device::write_ca1)); @@ -400,6 +404,8 @@ econet_e01_device::econet_e01_device(const machine_config &mconfig, device_type , m_floppy(*this, WD2793_TAG":%u", 0U) , m_rom(*this, R65C102_TAG) , m_centronics(*this, CENTRONICS_TAG) + , m_flap(*this, "FLAP") + , m_led(*this, "led_0") , m_adlc_ie(0) , m_hdc_ie(0) , m_rtc_irq(CLEAR_LINE) @@ -421,8 +427,10 @@ econet_e01_device::econet_e01_device(const machine_config &mconfig, device_type void econet_e01_device::device_start() { + m_led.resolve(); + // allocate timers - m_clk_timer = timer_alloc(); + m_clk_timer = timer_alloc(FUNC(econet_e01_device::clk_tick), this); // register for state saving save_item(NAME(m_adlc_ie)); @@ -447,10 +455,10 @@ void econet_e01_device::device_reset() //------------------------------------------------- -// device_timer - handler timer events +// clk_tick - update our clock output //------------------------------------------------- -void econet_e01_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +TIMER_CALLBACK_MEMBER(econet_e01_device::clk_tick) { if (m_clk_en) { @@ -464,7 +472,7 @@ void econet_e01_device::device_timer(emu_timer &timer, device_timer_id id, int p // read - //------------------------------------------------- -READ8_MEMBER( econet_e01_device::read ) +uint8_t econet_e01_device::read(offs_t offset) { uint8_t data; @@ -485,7 +493,7 @@ READ8_MEMBER( econet_e01_device::read ) // write - //------------------------------------------------- -WRITE8_MEMBER( econet_e01_device::write ) +void econet_e01_device::write(offs_t offset, uint8_t data) { m_ram->pointer()[offset] = data; } @@ -495,9 +503,10 @@ WRITE8_MEMBER( econet_e01_device::write ) // eprom_r - ROM/RAM select read //------------------------------------------------- -READ8_MEMBER( econet_e01_device::ram_select_r ) +uint8_t econet_e01_device::ram_select_r() { - m_ram_en = true; + if (!machine().side_effects_disabled()) + m_ram_en = true; return 0; } @@ -507,7 +516,7 @@ READ8_MEMBER( econet_e01_device::ram_select_r ) // floppy_w - floppy control write //------------------------------------------------- -WRITE8_MEMBER( econet_e01_device::floppy_w ) +void econet_e01_device::floppy_w(uint8_t data) { /* @@ -542,12 +551,12 @@ WRITE8_MEMBER( econet_e01_device::floppy_w ) m_fdc->dden_w(BIT(data, 4)); // floppy master reset - if (!BIT(data, 5)) m_fdc->soft_reset(); + m_fdc->mr_w(BIT(data, 5)); // TODO floppy test // mode LED - machine().output().set_value("led_0", BIT(data, 7)); + m_led = BIT(data, 7); } @@ -555,9 +564,10 @@ WRITE8_MEMBER( econet_e01_device::floppy_w ) // network_irq_disable_r - //------------------------------------------------- -READ8_MEMBER( econet_e01_device::network_irq_disable_r ) +uint8_t econet_e01_device::network_irq_disable_r() { - network_irq_enable(0); + if (!machine().side_effects_disabled()) + network_irq_enable(0); return 0; } @@ -567,7 +577,7 @@ READ8_MEMBER( econet_e01_device::network_irq_disable_r ) // network_irq_disable_w - //------------------------------------------------- -WRITE8_MEMBER( econet_e01_device::network_irq_disable_w ) +void econet_e01_device::network_irq_disable_w(uint8_t data) { network_irq_enable(0); } @@ -577,9 +587,10 @@ WRITE8_MEMBER( econet_e01_device::network_irq_disable_w ) // network_irq_enable_r - //------------------------------------------------- -READ8_MEMBER( econet_e01_device::network_irq_enable_r ) +uint8_t econet_e01_device::network_irq_enable_r() { - network_irq_enable(1); + if (!machine().side_effects_disabled()) + network_irq_enable(1); return 0; } @@ -589,7 +600,7 @@ READ8_MEMBER( econet_e01_device::network_irq_enable_r ) // network_irq_enable_w - //------------------------------------------------- -WRITE8_MEMBER( econet_e01_device::network_irq_enable_w ) +void econet_e01_device::network_irq_enable_w(uint8_t data) { network_irq_enable(1); } @@ -599,11 +610,12 @@ WRITE8_MEMBER( econet_e01_device::network_irq_enable_w ) // hdc_data_r - //------------------------------------------------- -READ8_MEMBER( econet_e01_device::hdc_data_r ) +uint8_t econet_e01_device::hdc_data_r() { uint8_t data = m_scsi_data_in->read(); - m_scsibus->write_ack(1); + if (!machine().side_effects_disabled()) + m_scsibus->write_ack(1); return data; } @@ -613,7 +625,7 @@ READ8_MEMBER( econet_e01_device::hdc_data_r ) // hdc_data_w - //------------------------------------------------- -WRITE8_MEMBER( econet_e01_device::hdc_data_w ) +void econet_e01_device::hdc_data_w(uint8_t data) { m_scsi_data_out->write(data); @@ -625,7 +637,7 @@ WRITE8_MEMBER( econet_e01_device::hdc_data_w ) // hdc_select_w - //------------------------------------------------- -WRITE8_MEMBER( econet_e01_device::hdc_select_w ) +void econet_e01_device::hdc_select_w(uint8_t data) { m_scsibus->write_sel(1); } @@ -635,53 +647,13 @@ WRITE8_MEMBER( econet_e01_device::hdc_select_w ) // hdc_irq_enable_w - //------------------------------------------------- -WRITE8_MEMBER( econet_e01_device::hdc_irq_enable_w ) +void econet_e01_device::hdc_irq_enable_w(uint8_t data) { hdc_irq_enable(BIT(data, 0)); } //------------------------------------------------- -// rtc_address_r - -//------------------------------------------------- - -READ8_MEMBER( econet_e01_device::rtc_address_r ) -{ - return m_rtc->read(0); -} - - -//------------------------------------------------- -// rtc_address_w - -//------------------------------------------------- - -WRITE8_MEMBER( econet_e01_device::rtc_address_w ) -{ - m_rtc->write(0, data); -} - - -//------------------------------------------------- -// rtc_data_r - -//------------------------------------------------- - -READ8_MEMBER( econet_e01_device::rtc_data_r ) -{ - return m_rtc->read(1); -} - - -//------------------------------------------------- -// rtc_data_w - -//------------------------------------------------- - -WRITE8_MEMBER( econet_e01_device::rtc_data_w ) -{ - m_rtc->write(1, data); -} - - -//------------------------------------------------- // econet_clk_w - //------------------------------------------------- |