(MESS) victor9k: Floppy WIP. (nw)

This commit is contained in:
Curt Coder 2014-11-02 20:53:22 +02:00
parent 26d0361693
commit 1f42617b3c
5 changed files with 645 additions and 354 deletions

View File

@ -28,144 +28,6 @@
//**************************************************************************
// READ/WRITE HANDLERS
//**************************************************************************
//-------------------------------------------------
// floppy_p1_r -
//-------------------------------------------------
READ8_MEMBER( victor9k_state::floppy_p1_r )
{
/*
bit description
0 L0MS0
1 L0MS1
2 L0MS2
3 L0MS3
4 L1MS0
5 L1MS1
6 L1MS2
7 L1MS3
*/
return m_lms;
}
//-------------------------------------------------
// floppy_p2_r -
//-------------------------------------------------
READ8_MEMBER( victor9k_state::floppy_p2_r )
{
/*
bit description
0
1
2
3
4
5
6 RDY0
7 RDY1
*/
UINT8 data = 0;
data |= m_rdy0 << 6;
data |= m_rdy1 << 7;
return data;
}
//-------------------------------------------------
// floppy_p2_w -
//-------------------------------------------------
WRITE8_MEMBER( victor9k_state::floppy_p2_w )
{
/*
bit description
0 START0
1 STOP0
2 START1
3 STOP1
4 SEL1
5 SEL0
6
7
*/
if (BIT(data, 0)) m_floppy0->mon_w(0);
if (BIT(data, 1)) m_floppy0->mon_w(1);
if (BIT(data, 2)) m_floppy1->mon_w(0);
if (BIT(data, 3)) m_floppy1->mon_w(1);
int sel0 = BIT(data, 5);
if (m_sel0 && !sel0)
{
m_da0 = m_da;
//m_floppy0->set_rpm();
}
m_sel0 = sel0;
int sel1 = BIT(data, 4);
if (m_sel1 && !sel1)
{
m_da1 = m_da;
//m_floppy1->set_rpm();
}
m_sel1 = sel1;
}
//-------------------------------------------------
// tach0_r -
//-------------------------------------------------
READ8_MEMBER( victor9k_state::tach0_r )
{
return m_tach0;
}
//-------------------------------------------------
// tach1_r -
//-------------------------------------------------
READ8_MEMBER( victor9k_state::tach1_r )
{
return m_tach1;
}
//-------------------------------------------------
// da_w -
//-------------------------------------------------
WRITE8_MEMBER( victor9k_state::da_w )
{
m_da = data;
}
//**************************************************************************
// ADDRESS MAPS
//**************************************************************************
@ -193,19 +55,6 @@ static ADDRESS_MAP_START( victor9k_mem, AS_PROGRAM, 8, victor9k_state )
ADDRESS_MAP_END
//-------------------------------------------------
// ADDRESS_MAP( floppy_io )
//-------------------------------------------------
static ADDRESS_MAP_START( floppy_io, AS_IO, 8, victor9k_state )
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(floppy_p1_r) AM_WRITENOP
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(floppy_p2_r, floppy_p2_w)
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(tach0_r)
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(tach1_r)
AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_WRITE(da_w)
ADDRESS_MAP_END
//**************************************************************************
// INPUT PORTS
@ -511,8 +360,8 @@ WRITE8_MEMBER( victor9k_state::via4_pa_w )
*/
m_lms = (m_lms & 0xf0) | (data & 0x0f);
m_st[0] = data >> 4;
m_fdc->l0ms_w(data & 0x0f);
m_fdc->st0_w(data >> 4);
}
WRITE8_MEMBER( victor9k_state::via4_pb_w )
@ -532,8 +381,8 @@ WRITE8_MEMBER( victor9k_state::via4_pb_w )
*/
m_lms = (data << 4) | (m_lms & 0x0f);
m_st[1] = data >> 4;
m_fdc->l1ms_w(data & 0x0f);
m_fdc->st1_w(data >> 4);
}
WRITE_LINE_MEMBER( victor9k_state::mode_w )
@ -609,16 +458,16 @@ READ8_MEMBER( victor9k_state::via6_pa_r )
UINT8 data = 0;
// track 0 drive A sense
data |= m_floppy0->trk00_r() << 1;
data |= m_fdc->trk0d0_r() << 1;
// track 0 drive B sense
data |= m_floppy1->trk00_r() << 3;
data |= m_fdc->trk0d1_r() << 3;
// write protect sense
data |= (m_drive ? m_floppy1->wpt_r() : m_floppy0->wpt_r()) << 6;
data |= m_fdc->wps_r() << 6;
// disk sync detect
data |= m_sync << 7;
data |= m_fdc->sync_r() << 7;
return data;
}
@ -641,16 +490,16 @@ WRITE8_MEMBER( victor9k_state::via6_pa_w )
*/
// LED, drive A
output_set_led_value(LED_A, BIT(data, 0));
m_fdc->led0a_w(BIT(data, 0));
// LED, drive B
output_set_led_value(LED_B, BIT(data, 2));
m_fdc->led1a_w(BIT(data, 2));
// dual side select
m_side = BIT(data, 4);
m_fdc->side_select_w(BIT(data, 4));
// select drive A/B
m_drive = BIT(data, 5);
m_fdc->drive_select_w(BIT(data, 5));
}
READ8_MEMBER( victor9k_state::via6_pb_r )
@ -673,19 +522,19 @@ READ8_MEMBER( victor9k_state::via6_pb_r )
UINT8 data = 0;
// motor speed status, drive A
data |= m_rdy0;
data |= m_fdc->rdy0_r();
// motor speed status, drive B
data |= m_rdy1 << 1;
data |= m_fdc->rdy1_r() << 1;
// door B sense
data |= m_ds1 << 3;
data |= m_fdc->ds1_r() << 3;
// door A sense
data |= m_ds0 << 4;
data |= m_fdc->ds0_r() << 4;
// single/double sided
data |= (m_drive ? m_floppy1->twosid_r() : m_floppy0->twosid_r()) << 5;
data |= m_fdc->single_double_sided_r() << 5;
return data;
}
@ -708,22 +557,13 @@ WRITE8_MEMBER( victor9k_state::via6_pb_w )
*/
// motor speed controller reset
if (!BIT(data, 2))
m_fdc_cpu->reset();
m_fdc->screset_w(BIT(data, 2));
// stepper enable A
m_stp[0] = BIT(data, 6);
m_fdc->stp0_w(BIT(data, 6));
// stepper enable B
m_stp[1] = BIT(data, 7);
}
WRITE_LINE_MEMBER( victor9k_state::drw_w )
{
}
WRITE_LINE_MEMBER( victor9k_state::erase_w )
{
m_fdc->stp1_w(BIT(data, 7));
}
WRITE_LINE_MEMBER( victor9k_state::via6_irq_w )
@ -753,64 +593,6 @@ WRITE_LINE_MEMBER( victor9k_state::kbdata_w )
m_via2->write_pa6(state);
}
//-------------------------------------------------
// SLOT_INTERFACE( victor9k_floppies )
//-------------------------------------------------
void victor9k_state::ready0_cb(floppy_image_device *device, int state)
{
m_rdy0 = state;
m_via5->write_ca2(m_rdy0);
}
int victor9k_state::load0_cb(floppy_image_device *device)
{
m_ds0 = 0;
m_via4->write_ca1(m_ds0);
return IMAGE_INIT_PASS;
}
void victor9k_state::unload0_cb(floppy_image_device *device)
{
m_ds0 = 1;
m_via4->write_ca1(m_ds0);
}
void victor9k_state::ready1_cb(floppy_image_device *device, int state)
{
m_rdy1 = state;
m_via5->write_cb2(m_rdy1);
}
int victor9k_state::load1_cb(floppy_image_device *device)
{
m_ds1 = 0;
m_via4->write_cb1(m_ds1);
return IMAGE_INIT_PASS;
}
void victor9k_state::unload1_cb(floppy_image_device *device)
{
m_ds1 = 1;
m_via4->write_cb1(m_ds1);
}
static SLOT_INTERFACE_START( victor9k_floppies )
SLOT_INTERFACE( "525qd", FLOPPY_525_QD )
SLOT_INTERFACE_END
FLOPPY_FORMATS_MEMBER( victor9k_state::floppy_formats )
FLOPPY_VICTOR_9000_FORMAT
FLOPPY_FORMATS_END
//**************************************************************************
// MACHINE INITIALIZATION
@ -822,20 +604,20 @@ FLOPPY_FORMATS_END
void victor9k_state::machine_start()
{
// set floppy callbacks
m_floppy0->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor9k_state::ready0_cb), this));
m_floppy0->setup_load_cb(floppy_image_device::load_cb(FUNC(victor9k_state::load0_cb), this));
m_floppy0->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor9k_state::unload0_cb), this));
m_floppy1->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor9k_state::ready1_cb), this));
m_floppy1->setup_load_cb(floppy_image_device::load_cb(FUNC(victor9k_state::load1_cb), this));
m_floppy1->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor9k_state::unload1_cb), this));
// state saving
save_item(NAME(m_brt));
save_item(NAME(m_cont));
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_ssda_irq));
// memory banking
address_space &program = m_maincpu->space(AS_PROGRAM);
program.install_ram(0x00000, m_ram->size() - 1, m_ram->pointer());
m_via5->write_ca1(m_brdy);
m_via6->write_ca1(m_gcrerr);
}
@ -854,9 +636,6 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state )
MCFG_CPU_PROGRAM_MAP(victor9k_mem)
MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE(I8259A_TAG, pic8259_device, inta_cb)
MCFG_CPU_ADD(I8048_TAG, I8048, XTAL_30MHz/6)
MCFG_CPU_IO_MAP(floppy_io)
// video hardware
MCFG_SCREEN_ADD(SCREEN_TAG, RASTER)
MCFG_SCREEN_REFRESH_RATE(50)
@ -942,13 +721,10 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state )
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(WRITELINE(victor9k_state, drw_w))
MCFG_VIA6522_CB2_HANDLER(WRITELINE(victor9k_state, erase_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_FLOPPY_DRIVE_ADD(I8048_TAG":0", victor9k_floppies, "525qd", victor9k_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(I8048_TAG":1", victor9k_floppies, "525qd", victor9k_state::floppy_formats)
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))
@ -967,6 +743,14 @@ static MACHINE_CONFIG_START( victor9k, victor9k_state )
MCFG_VICTOR9K_KBRDY_HANDLER(WRITELINE(victor9k_state, kbrdy_w))
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))
// internal ram
MCFG_RAM_ADD(RAM_TAG)
MCFG_RAM_DEFAULT_SIZE("128K")
@ -995,12 +779,6 @@ ROM_START( victor9k )
ROM_SYSTEM_BIOS( 1, "univ", "Universal" )
ROMX_LOAD( "v9000 univ. fe f3f7 13db.7j", 0x0000, 0x1000, CRC(25c7a59f) SHA1(8784e9aa7eb9439f81e18b8e223c94714e033911), ROM_BIOS(2) )
ROMX_LOAD( "v9000 univ. ff f3f7 39fe.8j", 0x1000, 0x1000, CRC(496c7467) SHA1(eccf428f62ef94ab85f4a43ba59ae6a066244a66), ROM_BIOS(2) )
ROM_REGION( 0x400, I8048_TAG, 0)
ROM_LOAD( "36080.5d", 0x000, 0x400, CRC(9bf49f7d) SHA1(b3a11bb65105db66ae1985b6f482aab6ea1da38b) )
ROM_REGION( 0x800, "gcr", 0 )
ROM_LOAD( "100836-001.4k", 0x000, 0x800, CRC(adc601bd) SHA1(6eeff3d2063ae2d97452101aa61e27ef83a467e5) )
ROM_END

View File

@ -16,7 +16,6 @@
#include "bus/rs232/rs232.h"
#include "cpu/i86/i86.h"
#include "cpu/mcs48/mcs48.h"
#include "formats/victor9k_dsk.h"
#include "imagedev/floppy.h"
#include "machine/ram.h"
@ -28,11 +27,11 @@
#include "machine/pic8259.h"
#include "machine/z80dart.h"
#include "machine/victor9kb.h"
#include "machine/victor9k_fdc.h"
#include "sound/hc55516.h"
#include "video/mc6845.h"
#define I8088_TAG "8l"
#define I8048_TAG "5d"
#define I8253_TAG "13h"
#define I8259A_TAG "7l"
#define UPD7201_TAG "16e"
@ -52,53 +51,45 @@
#define RS232_B_TAG "rs232b"
#define SCREEN_TAG "screen"
#define VICTOR9K_KEYBOARD_TAG "victor9kb"
#define FDC_TAG "fdc"
class victor9k_state : public driver_device
{
public:
victor9k_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, I8088_TAG),
m_fdc_cpu(*this, I8048_TAG),
m_ieee488(*this, IEEE488_TAG),
m_pic(*this, I8259A_TAG),
m_upd7201(*this, UPD7201_TAG),
m_ssda(*this, MC6852_TAG),
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),
m_floppy0(*this, I8048_TAG":0:525qd"),
m_floppy1(*this, I8048_TAG":1:525qd"),
m_kb(*this, VICTOR9K_KEYBOARD_TAG),
m_rs232a(*this, RS232_A_TAG),
m_rs232b(*this, RS232_B_TAG),
m_video_ram(*this, "video_ram"),
m_da(0),
m_da0(0),
m_da1(0),
m_sel0(0),
m_sel1(0),
m_tach0(0),
m_tach1(0),
m_rdy0(0),
m_rdy1(0),
m_ds0(1),
m_ds1(1),
m_lms(0),
m_brdy(1),
m_sync(1),
m_gcrerr(0),
m_palette(*this, "palette")
victor9k_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, I8088_TAG),
m_ieee488(*this, IEEE488_TAG),
m_pic(*this, I8259A_TAG),
m_upd7201(*this, UPD7201_TAG),
m_ssda(*this, MC6852_TAG),
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),
m_kb(*this, VICTOR9K_KEYBOARD_TAG),
m_fdc(*this, FDC_TAG),
m_rs232a(*this, RS232_A_TAG),
m_rs232b(*this, RS232_B_TAG),
m_palette(*this, "palette"),
m_video_ram(*this, "video_ram"),
m_brt(0),
m_cont(0),
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_ssda_irq(CLEAR_LINE)
{ }
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_fdc_cpu;
required_device<ieee488_device> m_ieee488;
required_device<pic8259_device> m_pic;
required_device<upd7201_device> m_upd7201;
@ -112,21 +103,15 @@ public:
required_device<hc55516_device> m_cvsd;
required_device<mc6845_device> m_crtc;
required_device<ram_device> m_ram;
required_device<floppy_image_device> m_floppy0;
required_device<floppy_image_device> m_floppy1;
required_device<victor9k_keyboard_device> m_kb;
required_device<victor_9000_fdc_t> m_fdc;
required_device<rs232_port_device> m_rs232a;
required_device<rs232_port_device> m_rs232b;
required_device<palette_device> m_palette;
required_shared_ptr<UINT8> m_video_ram;
virtual void machine_start();
DECLARE_READ8_MEMBER( floppy_p1_r );
DECLARE_READ8_MEMBER( floppy_p2_r );
DECLARE_WRITE8_MEMBER( floppy_p2_w );
DECLARE_READ8_MEMBER( tach0_r );
DECLARE_READ8_MEMBER( tach1_r );
DECLARE_WRITE8_MEMBER( da_w );
DECLARE_WRITE8_MEMBER( via1_pa_w );
DECLARE_WRITE_LINE_MEMBER( write_nfrd );
DECLARE_WRITE_LINE_MEMBER( write_ndac );
@ -155,8 +140,6 @@ public:
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( kbrdy_w );
DECLARE_WRITE_LINE_MEMBER( kbdata_w );
DECLARE_WRITE_LINE_MEMBER( vert_w );
@ -165,23 +148,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( ssda_irq_w );
MC6845_UPDATE_ROW( crtc_update_row );
DECLARE_FLOPPY_FORMATS( floppy_formats );
void ready0_cb(floppy_image_device *, int device);
int load0_cb(floppy_image_device *device);
void unload0_cb(floppy_image_device *device);
void ready1_cb(floppy_image_device *, int device);
int load1_cb(floppy_image_device *device);
void unload1_cb(floppy_image_device *device);
enum
{
LED_A = 0,
LED_B
};
/* video state */
required_shared_ptr<UINT8> m_video_ram;
int m_brt;
int m_cont;
@ -194,30 +161,8 @@ public:
int m_via6_irq;
int m_ssda_irq;
/* floppy state */
UINT8 m_da;
UINT8 m_da0;
UINT8 m_da1;
int m_sel0;
int m_sel1;
int m_tach0;
int m_tach1;
int m_rdy0;
int m_rdy1;
int m_ds0;
int m_ds1;
UINT8 m_lms; /* motor speed */
int m_st[2]; /* stepper phase */
int m_stp[2]; /* stepper enable */
int m_drive; /* selected drive */
int m_side; /* selected side */
int m_brdy;
int m_sync;
int m_gcrerr;
DECLARE_WRITE_LINE_MEMBER(mux_serial_b_w);
DECLARE_WRITE_LINE_MEMBER(mux_serial_a_w);
required_device<palette_device> m_palette;
};
#endif

View File

@ -0,0 +1,400 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
Victor 9000 floppy disk controller emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
/*
TODO:
- everything
*/
#include "victor9k_fdc.h"
//**************************************************************************
// MACROS / CONSTANTS
//**************************************************************************
#define LOG 0
#define I8048_TAG "5d"
//**************************************************************************
// DEVICE DEFINITIONS
//**************************************************************************
const device_type VICTOR_9000_FDC = &device_creator<victor_9000_fdc_t>;
//-------------------------------------------------
// ROM( victor_9000_fdc )
//-------------------------------------------------
ROM_START( victor_9000_fdc )
ROM_REGION( 0x400, I8048_TAG, 0)
ROM_LOAD( "36080.5d", 0x000, 0x400, CRC(9bf49f7d) SHA1(b3a11bb65105db66ae1985b6f482aab6ea1da38b) )
ROM_REGION( 0x800, "gcr", 0 )
ROM_LOAD( "100836-001.4k", 0x000, 0x800, CRC(adc601bd) SHA1(6eeff3d2063ae2d97452101aa61e27ef83a467e5) )
ROM_END
//-------------------------------------------------
// rom_region - device-specific ROM region
//-------------------------------------------------
const rom_entry *victor_9000_fdc_t::device_rom_region() const
{
return ROM_NAME( victor_9000_fdc );
}
//-------------------------------------------------
// ADDRESS_MAP( floppy_io )
//-------------------------------------------------
static ADDRESS_MAP_START( floppy_io, AS_IO, 8, victor_9000_fdc_t )
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(floppy_p1_r) AM_WRITENOP
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(floppy_p2_r, floppy_p2_w)
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ(tach0_r)
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(tach1_r)
AM_RANGE(MCS48_PORT_BUS, MCS48_PORT_BUS) AM_WRITE(da_w)
ADDRESS_MAP_END
//-------------------------------------------------
// SLOT_INTERFACE( victor9k_floppies )
//-------------------------------------------------
void victor_9000_fdc_t::ready0_cb(floppy_image_device *device, int state)
{
m_rdy0 = state;
m_rdy0_cb(state);
}
int victor_9000_fdc_t::load0_cb(floppy_image_device *device)
{
m_ds0 = 0;
m_ds0_cb(0);
return IMAGE_INIT_PASS;
}
void victor_9000_fdc_t::unload0_cb(floppy_image_device *device)
{
m_ds0 = 1;
m_ds0_cb(1);
}
void victor_9000_fdc_t::ready1_cb(floppy_image_device *device, int state)
{
m_rdy1 = state;
m_rdy1_cb(state);
}
int victor_9000_fdc_t::load1_cb(floppy_image_device *device)
{
m_ds1 = 0;
m_ds1_cb(0);
return IMAGE_INIT_PASS;
}
void victor_9000_fdc_t::unload1_cb(floppy_image_device *device)
{
m_ds1 = 1;
m_ds1_cb(1);
}
static SLOT_INTERFACE_START( victor9k_floppies )
SLOT_INTERFACE( "525qd", FLOPPY_525_QD )
SLOT_INTERFACE_END
FLOPPY_FORMATS_MEMBER( victor_9000_fdc_t::floppy_formats )
FLOPPY_VICTOR_9000_FORMAT
FLOPPY_FORMATS_END
//-------------------------------------------------
// MACHINE_CONFIG_FRAGMENT( victor_9000_fdc )
//-------------------------------------------------
static MACHINE_CONFIG_FRAGMENT( victor_9000_fdc )
MCFG_CPU_ADD(I8048_TAG, I8048, XTAL_30MHz/6)
MCFG_CPU_IO_MAP(floppy_io)
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
//-------------------------------------------------
// machine_config_additions - device-specific
// machine configurations
//-------------------------------------------------
machine_config_constructor victor_9000_fdc_t::device_mconfig_additions() const
{
return MACHINE_CONFIG_NAME( victor_9000_fdc );
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// victor_9000_fdc_t - constructor
//-------------------------------------------------
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_maincpu(*this, I8048_TAG),
m_floppy0(*this, I8048_TAG":0:525qd"),
m_floppy1(*this, I8048_TAG":1:525qd"),
m_gcr_rom(*this, "gcr"),
m_da(0),
m_da0(0),
m_da1(0),
m_sel0(0),
m_sel1(0),
m_tach0(0),
m_tach1(0),
m_rdy0(0),
m_rdy1(0),
m_ds0(1),
m_ds1(1),
m_lms(0),
m_st0(0),
m_st1(0),
m_stp0(0),
m_stp1(0),
m_drive(0),
m_side(0),
m_brdy(1),
m_sync(1),
m_gcrerr(0)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void victor_9000_fdc_t::device_start()
{
// state saving
save_item(NAME(m_da));
save_item(NAME(m_da0));
save_item(NAME(m_da1));
save_item(NAME(m_sel0));
save_item(NAME(m_sel1));
save_item(NAME(m_tach0));
save_item(NAME(m_tach1));
save_item(NAME(m_rdy0));
save_item(NAME(m_rdy1));
save_item(NAME(m_ds0));
save_item(NAME(m_ds1));
save_item(NAME(m_lms));
save_item(NAME(m_st0));
save_item(NAME(m_st1));
save_item(NAME(m_stp0));
save_item(NAME(m_stp1));
save_item(NAME(m_drive));
save_item(NAME(m_side));
save_item(NAME(m_brdy));
save_item(NAME(m_sync));
save_item(NAME(m_gcrerr));
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
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();
// set floppy callbacks
m_floppy0->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor_9000_fdc_t::ready0_cb), this));
m_floppy0->setup_load_cb(floppy_image_device::load_cb(FUNC(victor_9000_fdc_t::load0_cb), this));
m_floppy0->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor_9000_fdc_t::unload0_cb), this));
m_floppy1->setup_ready_cb(floppy_image_device::ready_cb(FUNC(victor_9000_fdc_t::ready1_cb), this));
m_floppy1->setup_load_cb(floppy_image_device::load_cb(FUNC(victor_9000_fdc_t::load1_cb), this));
m_floppy1->setup_unload_cb(floppy_image_device::unload_cb(FUNC(victor_9000_fdc_t::unload1_cb), this));
}
//-------------------------------------------------
// device_timer - handler timer events
//-------------------------------------------------
void victor_9000_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
}
//-------------------------------------------------
// floppy_p1_r -
//-------------------------------------------------
READ8_MEMBER( victor_9000_fdc_t::floppy_p1_r )
{
/*
bit description
0 L0MS0
1 L0MS1
2 L0MS2
3 L0MS3
4 L1MS0
5 L1MS1
6 L1MS2
7 L1MS3
*/
return m_lms;
}
//-------------------------------------------------
// floppy_p2_r -
//-------------------------------------------------
READ8_MEMBER( victor_9000_fdc_t::floppy_p2_r )
{
/*
bit description
0
1
2
3
4
5
6 RDY0
7 RDY1
*/
UINT8 data = 0;
data |= m_rdy0 << 6;
data |= m_rdy1 << 7;
return data;
}
//-------------------------------------------------
// floppy_p2_w -
//-------------------------------------------------
WRITE8_MEMBER( victor_9000_fdc_t::floppy_p2_w )
{
/*
bit description
0 START0
1 STOP0
2 START1
3 STOP1
4 SEL1
5 SEL0
6
7
*/
if (BIT(data, 0)) m_floppy0->mon_w(0);
if (BIT(data, 1)) m_floppy0->mon_w(1);
if (BIT(data, 2)) m_floppy1->mon_w(0);
if (BIT(data, 3)) m_floppy1->mon_w(1);
int sel0 = BIT(data, 5);
if (m_sel0 && !sel0)
{
m_da0 = m_da;
//m_floppy0->set_rpm();
}
m_sel0 = sel0;
int sel1 = BIT(data, 4);
if (m_sel1 && !sel1)
{
m_da1 = m_da;
//m_floppy1->set_rpm();
}
m_sel1 = sel1;
}
//-------------------------------------------------
// tach0_r -
//-------------------------------------------------
READ8_MEMBER( victor_9000_fdc_t::tach0_r )
{
return m_tach0;
}
//-------------------------------------------------
// tach1_r -
//-------------------------------------------------
READ8_MEMBER( victor_9000_fdc_t::tach1_r )
{
return m_tach1;
}
//-------------------------------------------------
// da_w -
//-------------------------------------------------
WRITE8_MEMBER( victor_9000_fdc_t::da_w )
{
m_da = data;
}

View File

@ -0,0 +1,168 @@
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
Victor 9000 floppy disk controller emulation
Copyright MESS Team.
Visit http://mamedev.org for licensing and usage restrictions.
**********************************************************************/
#pragma once
#ifndef __VICTOR_9000_FDC__
#define __VICTOR_9000_FDC__
#include "emu.h"
#include "cpu/mcs48/mcs48.h"
#include "formats/victor9k_dsk.h"
#include "imagedev/floppy.h"
//**************************************************************************
// 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);
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> victor_9000_fdc_t
class victor_9000_fdc_t : public device_t
{
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(); }
DECLARE_FLOPPY_FORMATS( floppy_formats );
DECLARE_READ8_MEMBER( floppy_p1_r );
DECLARE_READ8_MEMBER( floppy_p2_r );
DECLARE_WRITE8_MEMBER( floppy_p2_w );
DECLARE_READ8_MEMBER( tach0_r );
DECLARE_READ8_MEMBER( tach1_r );
DECLARE_WRITE8_MEMBER( da_w );
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
// optional information overrides
virtual const rom_entry *device_rom_region() const;
virtual machine_config_constructor device_mconfig_additions() const;
private:
enum
{
LED_A = 0,
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;
required_device<cpu_device> m_maincpu;
required_device<floppy_image_device> m_floppy0;
required_device<floppy_image_device> m_floppy1;
required_memory_region m_gcr_rom;
void ready0_cb(floppy_image_device *, int device);
int load0_cb(floppy_image_device *device);
void unload0_cb(floppy_image_device *device);
void ready1_cb(floppy_image_device *, int device);
int load1_cb(floppy_image_device *device);
void unload1_cb(floppy_image_device *device);
/* floppy state */
UINT8 m_da;
UINT8 m_da0;
UINT8 m_da1;
int m_sel0;
int m_sel1;
int m_tach0;
int m_tach1;
int m_rdy0;
int m_rdy1;
int m_ds0;
int m_ds1;
UINT8 m_lms; /* motor speed */
int m_st0; /* stepper phase */
int m_st1; /* stepper phase */
int m_stp0; /* stepper enable */
int m_stp1; /* stepper enable */
int m_drive; /* selected drive */
int m_side; /* selected side */
int m_brdy;
int m_sync;
int m_gcrerr;
};
// device type definition
extern const device_type VICTOR_9000_FDC;
#endif

View File

@ -959,7 +959,7 @@ $(MESSOBJ)/act.a: \
$(MESS_DRIVERS)/apricotf.o \
$(MESS_DRIVERS)/apricotp.o \
$(MESS_MACHINE)/apricotkb.o \
$(MESS_DRIVERS)/victor9k.o $(MESS_MACHINE)/victor9kb.o \
$(MESS_DRIVERS)/victor9k.o $(MESS_MACHINE)/victor9kb.o $(MESS_MACHINE)/victor9k_fdc.o \
$(MESSOBJ)/adc.a: \
$(MESS_DRIVERS)/super6.o \