diff options
author | Curt Coder <curtcoder@mail.com> | 2014-11-02 21:31:20 +0200 |
---|---|---|
committer | Curt Coder <curtcoder@mail.com> | 2014-11-02 21:31:20 +0200 |
commit | 4ede8ce068403c358d3153d2fcbc3ac12b972b17 (patch) | |
tree | 3241b825acb9d7d29894acf1ac7eaa7433ad8153 | |
parent | 1f42617b3cdb5f66d9938490b34afdf5a32cbfc5 (diff) |
(MESS) victor9k: Floppy WIP. (nw)
-rw-r--r-- | src/mess/drivers/victor9k.c | 282 | ||||
-rw-r--r-- | src/mess/includes/victor9k.h | 31 | ||||
-rw-r--r-- | src/mess/machine/victor9k_fdc.c | 297 | ||||
-rw-r--r-- | src/mess/machine/victor9k_fdc.h | 89 |
4 files changed, 334 insertions, 365 deletions
diff --git a/src/mess/drivers/victor9k.c b/src/mess/drivers/victor9k.c index 40af098cbc3..cbcc4476711 100644 --- a/src/mess/drivers/victor9k.c +++ b/src/mess/drivers/victor9k.c @@ -47,9 +47,9 @@ static ADDRESS_MAP_START( victor9k_mem, AS_PROGRAM, 8, victor9k_state ) AM_RANGE(0xe8040, 0xe804f) AM_DEVREADWRITE(M6522_2_TAG, via6522_device, read, write) AM_RANGE(0xe8060, 0xe8061) AM_DEVREADWRITE(MC6852_TAG, mc6852_device, read, write) AM_RANGE(0xe8080, 0xe808f) AM_DEVREADWRITE(M6522_3_TAG, via6522_device, read, write) - AM_RANGE(0xe80a0, 0xe80af) AM_DEVREADWRITE(M6522_4_TAG, via6522_device, read, write) - AM_RANGE(0xe80c0, 0xe80cf) AM_DEVREADWRITE(M6522_6_TAG, via6522_device, read, write) - AM_RANGE(0xe80e0, 0xe80ef) AM_DEVREADWRITE(M6522_5_TAG, via6522_device, read, write) + AM_RANGE(0xe80a0, 0xe80af) AM_DEVREADWRITE(FDC_TAG, victor_9000_fdc_t, cs5_r, cs5_w) + AM_RANGE(0xe80c0, 0xe80cf) AM_DEVREADWRITE(FDC_TAG, victor_9000_fdc_t, cs6_r, cs6_w) + AM_RANGE(0xe80e0, 0xe80ef) AM_DEVREADWRITE(FDC_TAG, victor_9000_fdc_t, cs7_r, cs7_w) AM_RANGE(0xf0000, 0xf0fff) AM_MIRROR(0x1000) AM_RAM AM_SHARE("video_ram") AM_RANGE(0xfe000, 0xfffff) AM_ROM AM_REGION(I8088_TAG, 0) ADDRESS_MAP_END @@ -160,7 +160,7 @@ WRITE_LINE_MEMBER( victor9k_state::ssda_irq_w ) { m_ssda_irq = state; - m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_via4_irq || m_via5_irq || m_via6_irq); + m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_fdc_irq); } @@ -232,7 +232,7 @@ WRITE_LINE_MEMBER( victor9k_state::via1_irq_w ) { m_via1_irq = state; - m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_via4_irq || m_via5_irq || m_via6_irq); + m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_fdc_irq); } WRITE8_MEMBER( victor9k_state::via2_pa_w ) @@ -299,7 +299,7 @@ WRITE_LINE_MEMBER( victor9k_state::via2_irq_w ) { m_via2_irq = state; - m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_via4_irq || m_via5_irq || m_via6_irq); + m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_fdc_irq); } @@ -339,238 +339,7 @@ WRITE_LINE_MEMBER( victor9k_state::via3_irq_w ) { m_via3_irq = state; - m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_via4_irq || m_via5_irq || m_via6_irq); -} - - -WRITE8_MEMBER( victor9k_state::via4_pa_w ) -{ - /* - - bit description - - PA0 L0MS0 - PA1 L0MS1 - PA2 L0MS2 - PA3 L0MS3 - PA4 ST0A - PA5 ST0B - PA6 ST0C - PA7 ST0D - - */ - - m_fdc->l0ms_w(data & 0x0f); - m_fdc->st0_w(data >> 4); -} - -WRITE8_MEMBER( victor9k_state::via4_pb_w ) -{ - /* - - bit description - - PB0 L1MS0 - PB1 L1MS1 - PB2 L1MS2 - PB3 L1MS3 - PB4 ST1A - PB5 ST1B - PB6 ST1C - PB7 ST1D - - */ - - m_fdc->l1ms_w(data & 0x0f); - m_fdc->st1_w(data >> 4); -} - -WRITE_LINE_MEMBER( victor9k_state::mode_w ) -{ -} - -WRITE_LINE_MEMBER( victor9k_state::via4_irq_w ) -{ - m_via4_irq = state; - - m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_via4_irq || m_via5_irq || m_via6_irq); -} - - -/* - - bit description - - PA0 E0 - PA1 E1 - PA2 I1 - PA3 E2 - PA4 E4 - PA5 E5 - PA6 I7 - PA7 E6 - -*/ - -WRITE8_MEMBER( victor9k_state::via5_pb_w ) -{ - /* - - bit description - - PB0 WD0 - PB1 WD1 - PB2 WD2 - PB3 WD3 - PB4 WD4 - PB5 WD5 - PB6 WD6 - PB7 WD7 - - */ -} - -WRITE_LINE_MEMBER( victor9k_state::via5_irq_w ) -{ - m_via5_irq = state; - - m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_via4_irq || m_via5_irq || m_via6_irq); -} - - -READ8_MEMBER( victor9k_state::via6_pa_r ) -{ - /* - - bit description - - PA0 - PA1 _TRK0D0 - PA2 - PA3 _TRK0D1 - PA4 - PA5 - PA6 WPS - PA7 _SYNC - - */ - - UINT8 data = 0; - - // track 0 drive A sense - data |= m_fdc->trk0d0_r() << 1; - - // track 0 drive B sense - data |= m_fdc->trk0d1_r() << 3; - - // write protect sense - data |= m_fdc->wps_r() << 6; - - // disk sync detect - data |= m_fdc->sync_r() << 7; - - return data; -} - -WRITE8_MEMBER( victor9k_state::via6_pa_w ) -{ - /* - - bit description - - PA0 LED0A - PA1 - PA2 LED1A - PA3 - PA4 SIDE SELECT - PA5 DRIVE SELECT - PA6 - PA7 - - */ - - // LED, drive A - m_fdc->led0a_w(BIT(data, 0)); - - // LED, drive B - m_fdc->led1a_w(BIT(data, 2)); - - // dual side select - m_fdc->side_select_w(BIT(data, 4)); - - // select drive A/B - m_fdc->drive_select_w(BIT(data, 5)); -} - -READ8_MEMBER( victor9k_state::via6_pb_r ) -{ - /* - - bit description - - PB0 RDY0 - PB1 RDY1 - PB2 - PB3 _DS1 - PB4 _DS0 - PB5 SINGLE/_DOUBLE SIDED - PB6 - PB7 - - */ - - UINT8 data = 0; - - // motor speed status, drive A - data |= m_fdc->rdy0_r(); - - // motor speed status, drive B - data |= m_fdc->rdy1_r() << 1; - - // door B sense - data |= m_fdc->ds1_r() << 3; - - // door A sense - data |= m_fdc->ds0_r() << 4; - - // single/double sided - data |= m_fdc->single_double_sided_r() << 5; - - return data; -} - -WRITE8_MEMBER( victor9k_state::via6_pb_w ) -{ - /* - - bit description - - PB0 - PB1 - PB2 _SCRESET - PB3 - PB4 - PB5 - PB6 STP0 - PB7 STP1 - - */ - - // motor speed controller reset - m_fdc->screset_w(BIT(data, 2)); - - // stepper enable A - m_fdc->stp0_w(BIT(data, 6)); - - // stepper enable B - m_fdc->stp1_w(BIT(data, 7)); -} - -WRITE_LINE_MEMBER( victor9k_state::via6_irq_w ) -{ - m_via6_irq = state; - - m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_via4_irq || m_via5_irq || m_via6_irq); + m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_fdc_irq); } @@ -594,6 +363,14 @@ WRITE_LINE_MEMBER( victor9k_state::kbdata_w ) } +WRITE_LINE_MEMBER( victor9k_state::fdc_irq_w ) +{ + m_fdc_irq = state; + + m_pic->ir3_w(m_ssda_irq || m_via1_irq || m_via2_irq || m_via3_irq || m_fdc_irq); +} + + //************************************************************************** // MACHINE INITIALIZATION //************************************************************************** @@ -610,9 +387,7 @@ void victor9k_state::machine_start() save_item(NAME(m_via1_irq)); save_item(NAME(m_via2_irq)); save_item(NAME(m_via3_irq)); - save_item(NAME(m_via4_irq)); - save_item(NAME(m_via5_irq)); - save_item(NAME(m_via6_irq)); + save_item(NAME(m_fdc_irq)); save_item(NAME(m_ssda_irq)); // memory banking @@ -707,24 +482,6 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state ) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(victor9k_state, via3_pb_w)) MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor9k_state, via3_irq_w)) - MCFG_DEVICE_ADD(M6522_4_TAG, VIA6522, XTAL_30MHz/30) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(victor9k_state, via4_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(victor9k_state, via4_pb_w)) - MCFG_VIA6522_CA2_HANDLER(WRITELINE(victor9k_state, mode_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor9k_state, via4_irq_w)) - - MCFG_DEVICE_ADD(M6522_5_TAG, VIA6522, XTAL_30MHz/30) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor9k_state, via5_irq_w)) - - MCFG_DEVICE_ADD(M6522_6_TAG, VIA6522, XTAL_30MHz/30) - MCFG_VIA6522_READPA_HANDLER(READ8(victor9k_state, via6_pa_r)) - MCFG_VIA6522_READPB_HANDLER(READ8(victor9k_state, via6_pb_r)) - MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(victor9k_state, via6_pa_w)) - MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(victor9k_state, via6_pb_w)) - MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE(FDC_TAG, victor_9000_fdc_t, drw_w)) - MCFG_VIA6522_CB2_HANDLER(DEVWRITELINE(FDC_TAG, victor_9000_fdc_t, erase_w)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor9k_state, via6_irq_w)) - MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, NULL) MCFG_RS232_RXD_HANDLER(DEVWRITELINE(UPD7201_TAG, z80dart_device, rxa_w)) MCFG_RS232_DCD_HANDLER(DEVWRITELINE(UPD7201_TAG, z80dart_device, dcda_w)) @@ -744,12 +501,7 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state ) MCFG_VICTOR9K_KBDATA_HANDLER(WRITELINE(victor9k_state, kbdata_w)) MCFG_DEVICE_ADD(FDC_TAG, VICTOR_9000_FDC, 0) - MCFG_VICTOR_9000_FDC_DS0_CB(DEVWRITELINE(M6522_4_TAG, via6522_device, write_ca1)) - MCFG_VICTOR_9000_FDC_DS1_CB(DEVWRITELINE(M6522_4_TAG, via6522_device, write_cb1)) - MCFG_VICTOR_9000_FDC_RDY0_CB(DEVWRITELINE(M6522_5_TAG, via6522_device, write_ca2)) - MCFG_VICTOR_9000_FDC_RDY1_CB(DEVWRITELINE(M6522_5_TAG, via6522_device, write_cb2)) - MCFG_VICTOR_9000_FDC_BRDY_CB(DEVWRITELINE(M6522_5_TAG, via6522_device, write_ca1)) - MCFG_VICTOR_9000_FDC_GCRERR_CB(DEVWRITELINE(M6522_6_TAG, via6522_device, write_ca1)) + MCFG_VICTOR_9000_FDC_IRQ_CB(WRITELINE(victor9k_state, fdc_irq_w)) // internal ram MCFG_RAM_ADD(RAM_TAG) diff --git a/src/mess/includes/victor9k.h b/src/mess/includes/victor9k.h index c6e75df8814..aacaf3f1403 100644 --- a/src/mess/includes/victor9k.h +++ b/src/mess/includes/victor9k.h @@ -41,9 +41,6 @@ #define M6522_1_TAG "m6522_1" #define M6522_2_TAG "m6522_2" #define M6522_3_TAG "14l" -#define M6522_4_TAG "1f" -#define M6522_5_TAG "1k" -#define M6522_6_TAG "1h" #define DAC0808_0_TAG "5b" #define DAC0808_1_TAG "5c" #define CENTRONICS_TAG "centronics" @@ -66,9 +63,6 @@ public: m_via1(*this, M6522_1_TAG), m_via2(*this, M6522_2_TAG), m_via3(*this, M6522_3_TAG), - m_via4(*this, M6522_4_TAG), - m_via5(*this, M6522_5_TAG), - m_via6(*this, M6522_6_TAG), m_cvsd(*this, HC55516_TAG), m_crtc(*this, HD46505S_TAG), m_ram(*this, RAM_TAG), @@ -83,9 +77,7 @@ public: m_via1_irq(CLEAR_LINE), m_via2_irq(CLEAR_LINE), m_via3_irq(CLEAR_LINE), - m_via4_irq(CLEAR_LINE), - m_via5_irq(CLEAR_LINE), - m_via6_irq(CLEAR_LINE), + m_fdc_irq(CLEAR_LINE), m_ssda_irq(CLEAR_LINE) { } @@ -97,9 +89,6 @@ public: required_device<via6522_device> m_via1; required_device<via6522_device> m_via2; required_device<via6522_device> m_via3; - required_device<via6522_device> m_via4; - required_device<via6522_device> m_via5; - required_device<via6522_device> m_via6; required_device<hc55516_device> m_cvsd; required_device<mc6845_device> m_crtc; required_device<ram_device> m_ram; @@ -128,24 +117,14 @@ public: DECLARE_WRITE8_MEMBER( via3_pb_w ); DECLARE_WRITE_LINE_MEMBER( via3_irq_w ); - DECLARE_WRITE8_MEMBER( via4_pa_w ); - DECLARE_WRITE8_MEMBER( via4_pb_w ); - DECLARE_WRITE_LINE_MEMBER( mode_w ); - DECLARE_WRITE_LINE_MEMBER( via4_irq_w ); + DECLARE_WRITE_LINE_MEMBER( fdc_irq_w ); - DECLARE_WRITE8_MEMBER( via5_pb_w ); - DECLARE_WRITE_LINE_MEMBER( via5_irq_w ); + DECLARE_WRITE_LINE_MEMBER( ssda_irq_w ); - DECLARE_READ8_MEMBER( via6_pa_r ); - DECLARE_READ8_MEMBER( via6_pb_r ); - DECLARE_WRITE8_MEMBER( via6_pa_w ); - DECLARE_WRITE8_MEMBER( via6_pb_w ); DECLARE_WRITE_LINE_MEMBER( kbrdy_w ); DECLARE_WRITE_LINE_MEMBER( kbdata_w ); DECLARE_WRITE_LINE_MEMBER( vert_w ); - DECLARE_WRITE_LINE_MEMBER( via6_irq_w ); - DECLARE_WRITE_LINE_MEMBER( ssda_irq_w ); MC6845_UPDATE_ROW( crtc_update_row ); /* video state */ @@ -156,9 +135,7 @@ public: int m_via1_irq; int m_via2_irq; int m_via3_irq; - int m_via4_irq; - int m_via5_irq; - int m_via6_irq; + int m_fdc_irq; int m_ssda_irq; DECLARE_WRITE_LINE_MEMBER(mux_serial_b_w); diff --git a/src/mess/machine/victor9k_fdc.c b/src/mess/machine/victor9k_fdc.c index aeffe7c9afb..6eb7adad85d 100644 --- a/src/mess/machine/victor9k_fdc.c +++ b/src/mess/machine/victor9k_fdc.c @@ -28,6 +28,9 @@ #define LOG 0 #define I8048_TAG "5d" +#define M6522_4_TAG "1f" +#define M6522_5_TAG "1k" +#define M6522_6_TAG "1h" @@ -82,14 +85,14 @@ void victor_9000_fdc_t::ready0_cb(floppy_image_device *device, int state) { m_rdy0 = state; - m_rdy0_cb(state); + m_via5->write_ca2(m_rdy0); } int victor_9000_fdc_t::load0_cb(floppy_image_device *device) { m_ds0 = 0; - m_ds0_cb(0); + m_via4->write_ca1(m_ds0); return IMAGE_INIT_PASS; } @@ -98,21 +101,21 @@ void victor_9000_fdc_t::unload0_cb(floppy_image_device *device) { m_ds0 = 1; - m_ds0_cb(1); + m_via4->write_ca1(m_ds0); } void victor_9000_fdc_t::ready1_cb(floppy_image_device *device, int state) { m_rdy1 = state; - m_rdy1_cb(state); + m_via5->write_cb2(m_rdy1); } int victor_9000_fdc_t::load1_cb(floppy_image_device *device) { m_ds1 = 0; - m_ds1_cb(0); + m_via4->write_cb1(m_ds1); return IMAGE_INIT_PASS; } @@ -121,7 +124,7 @@ void victor_9000_fdc_t::unload1_cb(floppy_image_device *device) { m_ds1 = 1; - m_ds1_cb(1); + m_via4->write_cb1(m_ds1); } static SLOT_INTERFACE_START( victor9k_floppies ) @@ -141,6 +144,24 @@ static MACHINE_CONFIG_FRAGMENT( victor_9000_fdc ) MCFG_CPU_ADD(I8048_TAG, I8048, XTAL_30MHz/6) MCFG_CPU_IO_MAP(floppy_io) + MCFG_DEVICE_ADD(M6522_4_TAG, VIA6522, XTAL_30MHz/30) + MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(victor_9000_fdc_t, via4_pa_w)) + MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(victor_9000_fdc_t, via4_pb_w)) + MCFG_VIA6522_CA2_HANDLER(WRITELINE(victor_9000_fdc_t, mode_w)) + MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor_9000_fdc_t, via4_irq_w)) + + MCFG_DEVICE_ADD(M6522_5_TAG, VIA6522, XTAL_30MHz/30) + MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor_9000_fdc_t, via5_irq_w)) + + MCFG_DEVICE_ADD(M6522_6_TAG, VIA6522, XTAL_30MHz/30) + MCFG_VIA6522_READPA_HANDLER(READ8(victor_9000_fdc_t, via6_pa_r)) + MCFG_VIA6522_READPB_HANDLER(READ8(victor_9000_fdc_t, via6_pb_r)) + MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(victor_9000_fdc_t, via6_pa_w)) + MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(victor_9000_fdc_t, via6_pb_w)) + MCFG_VIA6522_CA2_HANDLER(WRITELINE(victor_9000_fdc_t, drw_w)) + MCFG_VIA6522_CB2_HANDLER(WRITELINE(victor_9000_fdc_t, erase_w)) + MCFG_VIA6522_IRQ_HANDLER(WRITELINE(victor_9000_fdc_t, via6_irq_w)) + MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":0", victor9k_floppies, "525qd", victor_9000_fdc_t::floppy_formats) MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":1", victor9k_floppies, "525qd", victor_9000_fdc_t::floppy_formats) MACHINE_CONFIG_END @@ -168,13 +189,11 @@ machine_config_constructor victor_9000_fdc_t::device_mconfig_additions() const victor_9000_fdc_t::victor_9000_fdc_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, VICTOR_9000_FDC, "Victor 9000 FDC", tag, owner, clock, "victor9k_fdc", __FILE__), - m_ds0_cb(*this), - m_ds1_cb(*this), - m_rdy0_cb(*this), - m_rdy1_cb(*this), - m_brdy_cb(*this), - m_gcrerr_cb(*this), + m_irq_cb(*this), m_maincpu(*this, I8048_TAG), + m_via4(*this, M6522_4_TAG), + m_via5(*this, M6522_5_TAG), + m_via6(*this, M6522_6_TAG), m_floppy0(*this, I8048_TAG":0:525qd"), m_floppy1(*this, I8048_TAG":1:525qd"), m_gcr_rom(*this, "gcr"), @@ -198,7 +217,10 @@ victor_9000_fdc_t::victor_9000_fdc_t(const machine_config &mconfig, const char * m_side(0), m_brdy(1), m_sync(1), - m_gcrerr(0) + m_gcrerr(0), + m_via4_irq(CLEAR_LINE), + m_via5_irq(CLEAR_LINE), + m_via6_irq(CLEAR_LINE) { } @@ -231,6 +253,9 @@ void victor_9000_fdc_t::device_start() save_item(NAME(m_brdy)); save_item(NAME(m_sync)); save_item(NAME(m_gcrerr)); + save_item(NAME(m_via4_irq)); + save_item(NAME(m_via5_irq)); + save_item(NAME(m_via6_irq)); } @@ -241,12 +266,7 @@ void victor_9000_fdc_t::device_start() void victor_9000_fdc_t::device_reset() { // resolve callbacks - m_ds0_cb.resolve_safe(); - m_ds1_cb.resolve_safe(); - m_rdy0_cb.resolve_safe(); - m_rdy1_cb.resolve_safe(); - m_brdy_cb.resolve_safe(); - m_gcrerr_cb.resolve_safe(); + m_irq_cb.resolve_safe(); // set floppy callbacks m_floppy0->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor_9000_fdc_t::ready0_cb), this)); @@ -398,3 +418,242 @@ WRITE8_MEMBER( victor_9000_fdc_t::da_w ) { m_da = data; } + +WRITE8_MEMBER( victor_9000_fdc_t::via4_pa_w ) +{ + /* + + bit description + + PA0 L0MS0 + PA1 L0MS1 + PA2 L0MS2 + PA3 L0MS3 + PA4 ST0A + PA5 ST0B + PA6 ST0C + PA7 ST0D + + */ + + m_lms = (m_lms & 0xf0) | (data & 0x0f); + m_st0 = data >> 4; +} + +WRITE8_MEMBER( victor_9000_fdc_t::via4_pb_w ) +{ + /* + + bit description + + PB0 L1MS0 + PB1 L1MS1 + PB2 L1MS2 + PB3 L1MS3 + PB4 ST1A + PB5 ST1B + PB6 ST1C + PB7 ST1D + + */ + + m_lms = (data << 4) | (m_lms & 0x0f); + m_st1 = data >> 4; +} + +WRITE_LINE_MEMBER( victor_9000_fdc_t::mode_w ) +{ +} + +WRITE_LINE_MEMBER( victor_9000_fdc_t::via4_irq_w ) +{ + m_via4_irq = state; + + m_irq_cb(m_via4_irq || m_via5_irq || m_via6_irq); +} + + +/* + + bit description + + PA0 E0 + PA1 E1 + PA2 I1 + PA3 E2 + PA4 E4 + PA5 E5 + PA6 I7 + PA7 E6 + +*/ + +WRITE8_MEMBER( victor_9000_fdc_t::via5_pb_w ) +{ + /* + + bit description + + PB0 WD0 + PB1 WD1 + PB2 WD2 + PB3 WD3 + PB4 WD4 + PB5 WD5 + PB6 WD6 + PB7 WD7 + + */ +} + +WRITE_LINE_MEMBER( victor_9000_fdc_t::via5_irq_w ) +{ + m_via5_irq = state; + + m_irq_cb(m_via4_irq || m_via5_irq || m_via6_irq); +} + + +READ8_MEMBER( victor_9000_fdc_t::via6_pa_r ) +{ + /* + + bit description + + PA0 + PA1 _TRK0D0 + PA2 + PA3 _TRK0D1 + PA4 + PA5 + PA6 WPS + PA7 _SYNC + + */ + + UINT8 data = 0; + + // track 0 drive A sense + data |= m_floppy0->trk00_r() << 1; + + // track 0 drive B sense + data |= m_floppy1->trk00_r() << 3; + + // write protect sense + data |= (m_drive ? m_floppy1->wpt_r() : m_floppy0->wpt_r()) << 6; + + // disk sync detect + data |= m_sync << 7; + + return data; +} + +WRITE8_MEMBER( victor_9000_fdc_t::via6_pa_w ) +{ + /* + + bit description + + PA0 LED0A + PA1 + PA2 LED1A + PA3 + PA4 SIDE SELECT + PA5 DRIVE SELECT + PA6 + PA7 + + */ + + // LED, drive A + output_set_led_value(LED_A, BIT(data, 0)); + + // LED, drive B + output_set_led_value(LED_B, BIT(data, 2)); + + // dual side select + m_side = BIT(data, 4); + + // select drive A/B + m_drive = BIT(data, 5); +} + +READ8_MEMBER( victor_9000_fdc_t::via6_pb_r ) +{ + /* + + bit description + + PB0 RDY0 + PB1 RDY1 + PB2 + PB3 _DS1 + PB4 _DS0 + PB5 SINGLE/_DOUBLE SIDED + PB6 + PB7 + + */ + + UINT8 data = 0; + + // motor speed status, drive A + data |= m_rdy0; + + // motor speed status, drive B + data |= m_rdy1 << 1; + + // door B sense + data |= m_ds1 << 3; + + // door A sense + data |= m_ds0 << 4; + + // single/double sided + data |= (m_drive ? m_floppy1->twosid_r() : m_floppy0->twosid_r()) << 5; + + return data; +} + +WRITE8_MEMBER( victor_9000_fdc_t::via6_pb_w ) +{ + /* + + bit description + + PB0 + PB1 + PB2 _SCRESET + PB3 + PB4 + PB5 + PB6 STP0 + PB7 STP1 + + */ + + // motor speed controller reset + if (!BIT(data, 2)) + m_maincpu->reset(); + + // stepper enable A + m_stp0 = BIT(data, 6); + + // stepper enable B + m_stp1 = BIT(data, 7); +} + +WRITE_LINE_MEMBER( victor_9000_fdc_t::drw_w ) +{ +} + +WRITE_LINE_MEMBER( victor_9000_fdc_t::erase_w ) +{ +} + +WRITE_LINE_MEMBER( victor_9000_fdc_t::via6_irq_w ) +{ + m_via6_irq = state; + + m_irq_cb(m_via4_irq || m_via5_irq || m_via6_irq); +} diff --git a/src/mess/machine/victor9k_fdc.h b/src/mess/machine/victor9k_fdc.h index 29ad7004ce1..7dbda814334 100644 --- a/src/mess/machine/victor9k_fdc.h +++ b/src/mess/machine/victor9k_fdc.h @@ -18,6 +18,7 @@ #include "cpu/mcs48/mcs48.h" #include "formats/victor9k_dsk.h" #include "imagedev/floppy.h" +#include "machine/6522via.h" @@ -25,23 +26,8 @@ // INTERFACE CONFIGURATION MACROS //************************************************************************** -#define MCFG_VICTOR_9000_FDC_DS0_CB(_write) \ - devcb = &victor_9000_fdc_t::set_ds0_wr_callback(*device, DEVCB_##_write); - -#define MCFG_VICTOR_9000_FDC_DS1_CB(_write) \ - devcb = &victor_9000_fdc_t::set_ds1_wr_callback(*device, DEVCB_##_write); - -#define MCFG_VICTOR_9000_FDC_RDY0_CB(_write) \ - devcb = &victor_9000_fdc_t::set_rdy0_wr_callback(*device, DEVCB_##_write); - -#define MCFG_VICTOR_9000_FDC_RDY1_CB(_write) \ - devcb = &victor_9000_fdc_t::set_rdy1_wr_callback(*device, DEVCB_##_write); - -#define MCFG_VICTOR_9000_FDC_BRDY_CB(_write) \ - devcb = &victor_9000_fdc_t::set_brdy_wr_callback(*device, DEVCB_##_write); - -#define MCFG_VICTOR_9000_FDC_GCRERR_CB(_write) \ - devcb = &victor_9000_fdc_t::set_gcrerr_wr_callback(*device, DEVCB_##_write); +#define MCFG_VICTOR_9000_FDC_IRQ_CB(_write) \ + devcb = &victor_9000_fdc_t::set_irq_wr_callback(*device, DEVCB_##_write); @@ -57,37 +43,14 @@ public: // construction/destruction victor_9000_fdc_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - template<class _Object> static devcb_base &set_ds0_wr_callback(device_t &device, _Object object) { return downcast<victor_9000_fdc_t &>(device).m_ds0_cb.set_callback(object); } - template<class _Object> static devcb_base &set_ds1_wr_callback(device_t &device, _Object object) { return downcast<victor_9000_fdc_t &>(device).m_ds1_cb.set_callback(object); } - template<class _Object> static devcb_base &set_rdy0_wr_callback(device_t &device, _Object object) { return downcast<victor_9000_fdc_t &>(device).m_rdy0_cb.set_callback(object); } - template<class _Object> static devcb_base &set_rdy1_wr_callback(device_t &device, _Object object) { return downcast<victor_9000_fdc_t &>(device).m_rdy1_cb.set_callback(object); } - template<class _Object> static devcb_base &set_brdy_wr_callback(device_t &device, _Object object) { return downcast<victor_9000_fdc_t &>(device).m_brdy_cb.set_callback(object); } - template<class _Object> static devcb_base &set_gcrerr_wr_callback(device_t &device, _Object object) { return downcast<victor_9000_fdc_t &>(device).m_gcrerr_cb.set_callback(object); } - - void set_floppy(floppy_image_device *floppy0, floppy_image_device *floppy1); - - void l0ms_w(UINT8 data) { m_lms = (m_lms & 0xf0) | (data & 0x0f); } - void l1ms_w(UINT8 data) { m_lms = (data << 4) | (m_lms & 0x0f); } - void st0_w(UINT8 data) { m_st0 = data; } - void st1_w(UINT8 data) { m_st1 = data; } - DECLARE_WRITE_LINE_MEMBER( side_select_w ) { m_side = state; } - DECLARE_WRITE_LINE_MEMBER( drive_select_w ) { m_drive = state; } - DECLARE_WRITE_LINE_MEMBER( stp0_w ) { m_stp0 = state; } - DECLARE_WRITE_LINE_MEMBER( stp1_w ) { m_stp1 = state; } - DECLARE_WRITE_LINE_MEMBER( drw_w ) { } - DECLARE_WRITE_LINE_MEMBER( erase_w ) { } - DECLARE_READ_LINE_MEMBER( trk0d0_r ) { return m_floppy0->trk00_r(); } - DECLARE_READ_LINE_MEMBER( trk0d1_r ) { return m_floppy1->trk00_r(); } - DECLARE_READ_LINE_MEMBER( wps_r ) { return m_drive ? m_floppy1->wpt_r() : m_floppy0->wpt_r(); } - DECLARE_READ_LINE_MEMBER( sync_r ) { return 1; } - DECLARE_WRITE_LINE_MEMBER( led0a_w ) { output_set_led_value(LED_A, state); } - DECLARE_WRITE_LINE_MEMBER( led1a_w ) { output_set_led_value(LED_B, state); } - DECLARE_READ_LINE_MEMBER( rdy0_r ) { return m_rdy0; } - DECLARE_READ_LINE_MEMBER( rdy1_r ) { return m_rdy1; } - DECLARE_READ_LINE_MEMBER( ds0_r ) { return m_ds0; } - DECLARE_READ_LINE_MEMBER( ds1_r ) { return m_ds1; } - DECLARE_READ_LINE_MEMBER( single_double_sided_r ) { return m_drive ? m_floppy1->twosid_r() : m_floppy0->twosid_r(); } - DECLARE_WRITE_LINE_MEMBER( screset_w ) { if (!state) m_maincpu->reset(); } + template<class _Object> static devcb_base &set_irq_wr_callback(device_t &device, _Object object) { return downcast<victor_9000_fdc_t &>(device).m_irq_cb.set_callback(object); } + + DECLARE_READ8_MEMBER( cs5_r ) { return m_via4->read(space, offset); } + DECLARE_WRITE8_MEMBER( cs5_w ) { return m_via4->write(space, offset, data); } + DECLARE_READ8_MEMBER( cs6_r ) { return m_via6->read(space, offset); } + DECLARE_WRITE8_MEMBER( cs6_w ) { return m_via6->write(space, offset, data); } + DECLARE_READ8_MEMBER( cs7_r ) { return m_via5->read(space, offset); } + DECLARE_WRITE8_MEMBER( cs7_w ) { return m_via5->write(space, offset, data); } DECLARE_FLOPPY_FORMATS( floppy_formats ); @@ -98,6 +61,22 @@ public: DECLARE_READ8_MEMBER( tach1_r ); DECLARE_WRITE8_MEMBER( da_w ); + DECLARE_WRITE8_MEMBER( via4_pa_w ); + DECLARE_WRITE8_MEMBER( via4_pb_w ); + DECLARE_WRITE_LINE_MEMBER( mode_w ); + DECLARE_WRITE_LINE_MEMBER( via4_irq_w ); + + DECLARE_WRITE8_MEMBER( via5_pb_w ); + DECLARE_WRITE_LINE_MEMBER( via5_irq_w ); + + DECLARE_READ8_MEMBER( via6_pa_r ); + DECLARE_READ8_MEMBER( via6_pb_r ); + DECLARE_WRITE8_MEMBER( via6_pa_w ); + DECLARE_WRITE8_MEMBER( via6_pb_w ); + DECLARE_WRITE_LINE_MEMBER( drw_w ); + DECLARE_WRITE_LINE_MEMBER( erase_w ); + DECLARE_WRITE_LINE_MEMBER( via6_irq_w ); + protected: // device-level overrides virtual void device_start(); @@ -115,14 +94,12 @@ private: LED_B }; - devcb_write_line m_ds0_cb; - devcb_write_line m_ds1_cb; - devcb_write_line m_rdy0_cb; - devcb_write_line m_rdy1_cb; - devcb_write_line m_brdy_cb; - devcb_write_line m_gcrerr_cb; + devcb_write_line m_irq_cb; required_device<cpu_device> m_maincpu; + required_device<via6522_device> m_via4; + required_device<via6522_device> m_via5; + required_device<via6522_device> m_via6; required_device<floppy_image_device> m_floppy0; required_device<floppy_image_device> m_floppy1; required_memory_region m_gcr_rom; @@ -156,6 +133,10 @@ private: int m_brdy; int m_sync; int m_gcrerr; + + int m_via4_irq; + int m_via5_irq; + int m_via6_irq; }; |