summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
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
commit4ede8ce068403c358d3153d2fcbc3ac12b972b17 (patch)
tree3241b825acb9d7d29894acf1ac7eaa7433ad8153
parent1f42617b3cdb5f66d9938490b34afdf5a32cbfc5 (diff)
(MESS) victor9k: Floppy WIP. (nw)
-rw-r--r--src/mess/drivers/victor9k.c282
-rw-r--r--src/mess/includes/victor9k.h31
-rw-r--r--src/mess/machine/victor9k_fdc.c297
-rw-r--r--src/mess/machine/victor9k_fdc.h89
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;
};