(MESS) CBM floppy drives cleanup. (nw)

This commit is contained in:
Curt Coder 2012-12-20 19:33:46 +00:00
parent befcbf655f
commit ed31425f78
12 changed files with 233 additions and 298 deletions

View File

@ -98,10 +98,10 @@ inline void c64h156_device::read_current_track()
int track_length = G64_BUFFER_SIZE;
// read track data
floppy_drive_read_track_data_info_buffer(m_image, m_side, m_track_buffer, &track_length);
floppy_drive_read_track_data_info_buffer(m_floppy, m_side, m_track_buffer, &track_length);
// extract track length
m_track_len = floppy_drive_get_current_track_size(m_image, m_side);
m_track_len = floppy_drive_get_current_track_size(m_floppy, m_side);
// set bit pointer to track start
m_buffer_pos = 0;
@ -400,7 +400,7 @@ c64h156_device::c64h156_device(const machine_config &mconfig, const char *tag, d
: device_t(mconfig, C64H156, "64H156", tag, owner, clock),
device_execute_interface(mconfig, *this),
m_icount(0),
m_image(*this->owner(), FLOPPY_0),
m_floppy(NULL),
m_track_buffer(*this, "track_buffer"),
m_speed_buffer(*this, "speed_buffer"),
m_side(0),
@ -409,7 +409,7 @@ c64h156_device::c64h156_device(const machine_config &mconfig, const char *tag, d
m_bit_pos(0),
m_bit_count(0),
m_mtr(0),
m_accl(1),
m_accl(0),
m_ds(0),
m_soe(0),
m_oe(0),
@ -627,7 +627,7 @@ WRITE_LINE_MEMBER( c64h156_device::mtr_w )
read_current_track();
}
floppy_mon_w(m_image, !state);
floppy_mon_w(m_floppy, !state);
m_mtr = state;
}
@ -696,6 +696,20 @@ WRITE_LINE_MEMBER( c64h156_device::atna_w )
}
//-------------------------------------------------
// set_floppy -
//-------------------------------------------------
void c64h156_device::set_floppy(legacy_floppy_image_device *floppy)
{
m_floppy = floppy;
// install image callbacks
floppy_install_unload_proc(m_floppy, c64h156_device::on_disk_change);
floppy_install_load_proc(m_floppy, c64h156_device::on_disk_change);
}
//-------------------------------------------------
// stp_w -
//-------------------------------------------------
@ -704,7 +718,7 @@ void c64h156_device::stp_w(int data)
{
if (m_mtr)
{
int track = floppy_drive_get_current_track(m_image);
int track = floppy_drive_get_current_track(m_floppy);
int tracks = (data - track) & 0x03;
if (tracks == 3)
@ -715,7 +729,7 @@ void c64h156_device::stp_w(int data)
if (tracks == -1 || tracks == 1)
{
// step read/write head
floppy_drive_seek(m_image, tracks);
floppy_drive_seek(m_floppy, tracks);
// read new track data
read_current_track();
@ -734,18 +748,6 @@ void c64h156_device::ds_w(int data)
}
//-------------------------------------------------
// on_disk_changed -
//-------------------------------------------------
void c64h156_device::on_disk_changed(int wp)
{
m_wp = wp;
read_current_track();
}
//-------------------------------------------------
// set_side -
//-------------------------------------------------
@ -754,3 +756,15 @@ void c64h156_device::set_side(int side)
{
m_side = side;
}
//-------------------------------------------------
// on_disk_change -
//-------------------------------------------------
void c64h156_device::on_disk_change(device_image_interface &image)
{
//m_wp = !floppy_wpt_r(image);
//read_current_track();
}

View File

@ -118,11 +118,13 @@ public:
DECLARE_WRITE_LINE_MEMBER( atni_w );
DECLARE_WRITE_LINE_MEMBER( atna_w );
void set_floppy(legacy_floppy_image_device *floppy);
void stp_w(int data);
void ds_w(int data);
void set_side(int side);
void on_disk_changed(int wp);
static void on_disk_change(device_image_interface &image);
protected:
// device-level overrides
@ -145,7 +147,7 @@ private:
devcb_resolved_write_line m_out_sync_func;
devcb_resolved_write_line m_out_byte_func;
required_device<legacy_floppy_image_device> m_image;
legacy_floppy_image_device *m_floppy;
optional_shared_ptr<UINT8> m_track_buffer; // track data buffer
optional_shared_ptr<UINT8> m_speed_buffer; // speed block buffer

View File

@ -1075,9 +1075,8 @@ c1541_prologic_dos_classic_device::c1541_prologic_dos_classic_device(const machi
void base_c1541_device::device_start()
{
// install image callbacks
floppy_install_unload_proc(m_image, base_c1541_device::on_disk_change);
floppy_install_load_proc(m_image, base_c1541_device::on_disk_change);
// install image callbacks
m_ga->set_floppy(m_image);
// register for state saving
save_item(NAME(m_data_out));
@ -1117,6 +1116,10 @@ void base_c1541_device::device_reset()
m_via0->reset();
m_via1->reset();
// initialize gate array
m_ga->accl_w(0);
m_ga->ted_w(1);
}
@ -1164,16 +1167,3 @@ void base_c1541_device::parallel_strobe_w(int state)
{
m_via0->write_cb1(state);
}
//-------------------------------------------------
// on_disk_change -
//-------------------------------------------------
void base_c1541_device::on_disk_change(device_image_interface &image)
{
base_c1541_device *c1541 = static_cast<base_c1541_device *>(image.device().owner());
int wp = floppy_wpt_r(image);
c1541->m_ga->on_disk_changed(wp);
}

View File

@ -64,9 +64,6 @@ public:
TYPE_1541_PROLOGIC_DOS_CLASSIC
};
// not really public
static void on_disk_change(device_image_interface &image);
DECLARE_WRITE_LINE_MEMBER( via0_irq_w );
DECLARE_READ8_MEMBER( via0_pa_r );
DECLARE_WRITE8_MEMBER( via0_pa_w );

View File

@ -493,8 +493,7 @@ void c1551_device::device_start()
m_irq_timer->adjust(attotime::zero, CLEAR_LINE);
// install image callbacks
floppy_install_unload_proc(m_image, c1551_device::on_disk_change);
floppy_install_load_proc(m_image, c1551_device::on_disk_change);
m_ga->set_floppy(m_image);
// register for state saving
save_item(NAME(m_tcbm_data));
@ -613,16 +612,3 @@ void c1551_device::plus4_breset_w(int state)
m_exp->breset_w(state);
}
//-------------------------------------------------
// on_disk_change -
//-------------------------------------------------
void c1551_device::on_disk_change(device_image_interface &image)
{
c1551_device *c1551 = static_cast<c1551_device *>(image.device().owner());
int wp = floppy_wpt_r(image);
c1551->m_ga->on_disk_changed(wp);
}

View File

@ -45,9 +45,6 @@ public:
virtual machine_config_constructor device_mconfig_additions() const;
virtual ioport_constructor device_input_ports() const;
// not really public
static void on_disk_change(device_image_interface &image);
DECLARE_READ8_MEMBER( port_r );
DECLARE_WRITE8_MEMBER( port_w );

View File

@ -972,8 +972,8 @@ mini_chief_device::mini_chief_device(const machine_config &mconfig, const char *
void base_c1571_device::device_start()
{
// install image callbacks
floppy_install_unload_proc(m_image, base_c1571_device::on_disk_change);
floppy_install_load_proc(m_image, base_c1571_device::on_disk_change);
m_ga->set_floppy(m_image);
//m_fdc->set_floppy(m_floppy);
// register for state saving
save_item(NAME(m_1_2mhz));
@ -1000,7 +1000,6 @@ void base_c1571_device::device_reset()
m_cia->reset();
m_fdc->reset();
//m_fdc->set_floppy(m_floppy);
m_fdc->dden_w(0);
m_sp_out = 1;
@ -1073,19 +1072,6 @@ void base_c1571_device::parallel_strobe_w(int state)
}
//-------------------------------------------------
// on_disk_change -
//-------------------------------------------------
void base_c1571_device::on_disk_change(device_image_interface &image)
{
base_c1571_device *c1571 = static_cast<base_c1571_device *>(image.device().owner());
int wp = floppy_wpt_r(image);
c1571->m_ga->on_disk_changed(wp);
}
//-------------------------------------------------
// update_iec -
//-------------------------------------------------

View File

@ -61,9 +61,6 @@ public:
virtual const rom_entry *device_rom_region() const;
virtual machine_config_constructor device_mconfig_additions() const;
// not really public
static void on_disk_change(device_image_interface &image);
DECLARE_WRITE_LINE_MEMBER( via0_irq_w );
DECLARE_READ8_MEMBER( via0_pa_r );
DECLARE_WRITE8_MEMBER( via0_pa_w );

View File

@ -430,8 +430,7 @@ c2031_device::c2031_device(const machine_config &mconfig, const char *tag, devic
void c2031_device::device_start()
{
// install image callbacks
floppy_install_unload_proc(m_image, c2031_device::on_disk_change);
floppy_install_load_proc(m_image, c2031_device::on_disk_change);
m_ga->set_floppy(m_image);
// register for state saving
save_item(NAME(m_nrfd_out));
@ -487,16 +486,3 @@ void c2031_device::ieee488_ifc(int state)
device_reset();
}
}
//-------------------------------------------------
// on_disk_change -
//-------------------------------------------------
void c2031_device::on_disk_change(device_image_interface &image)
{
c2031_device *c2031 = static_cast<c2031_device *>(image.device().owner());
int wp = floppy_wpt_r(image);
c2031->m_ga->on_disk_changed(wp);
}

View File

@ -37,9 +37,6 @@ public:
// construction/destruction
c2031_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// not really public
static void on_disk_change(device_image_interface &image);
DECLARE_WRITE_LINE_MEMBER( via0_irq_w );
DECLARE_READ8_MEMBER( via0_pa_r );
DECLARE_WRITE8_MEMBER( via0_pa_w );

View File

@ -11,8 +11,6 @@
TODO:
- 8050/8250 only work when debugger is active!?
- 2040 DOS 1 FDC rom (jumps to 104d while getting block header)
FE70: jsr $104D
@ -83,7 +81,7 @@ const device_type SFD1001 = &device_creator<sfd1001_device>;
// complete
//-------------------------------------------------
void base_c2040_device::device_config_complete()
void c2040_device::device_config_complete()
{
switch (m_variant)
{
@ -265,7 +263,7 @@ ROM_END
// rom_region - device-specific ROM region
//-------------------------------------------------
const rom_entry *base_c2040_device::device_rom_region() const
const rom_entry *c2040_device::device_rom_region() const
{
switch (m_variant)
{
@ -294,7 +292,7 @@ const rom_entry *base_c2040_device::device_rom_region() const
// ADDRESS_MAP( c2040_main_mem )
//-------------------------------------------------
static ADDRESS_MAP_START( c2040_main_mem, AS_PROGRAM, 8, base_c2040_device )
static ADDRESS_MAP_START( c2040_main_mem, AS_PROGRAM, 8, c2040_device )
ADDRESS_MAP_GLOBAL_MASK(0x7fff)
AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x0100) AM_RAM // 6532 #1
AM_RANGE(0x0080, 0x00ff) AM_MIRROR(0x0100) AM_RAM // 6532 #2
@ -312,7 +310,7 @@ ADDRESS_MAP_END
// ADDRESS_MAP( c2040_fdc_mem )
//-------------------------------------------------
static ADDRESS_MAP_START( c2040_fdc_mem, AS_PROGRAM, 8, base_c2040_device )
static ADDRESS_MAP_START( c2040_fdc_mem, AS_PROGRAM, 8, c2040_device )
ADDRESS_MAP_GLOBAL_MASK(0x1fff)
AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530
AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via6522_device, read, write)
@ -329,7 +327,7 @@ ADDRESS_MAP_END
// ADDRESS_MAP( c8050_main_mem )
//-------------------------------------------------
static ADDRESS_MAP_START( c8050_main_mem, AS_PROGRAM, 8, base_c2040_device )
static ADDRESS_MAP_START( c8050_main_mem, AS_PROGRAM, 8, c2040_device )
AM_RANGE(0x0000, 0x007f) AM_MIRROR(0x0100) AM_RAM // 6532 #1
AM_RANGE(0x0080, 0x00ff) AM_MIRROR(0x0100) AM_RAM // 6532 #2
AM_RANGE(0x0200, 0x021f) AM_MIRROR(0x0d60) AM_DEVREADWRITE_LEGACY(M6532_0_TAG, riot6532_r, riot6532_w)
@ -346,7 +344,7 @@ ADDRESS_MAP_END
// ADDRESS_MAP( c8050_fdc_mem )
//-------------------------------------------------
static ADDRESS_MAP_START( c8050_fdc_mem, AS_PROGRAM, 8, base_c2040_device )
static ADDRESS_MAP_START( c8050_fdc_mem, AS_PROGRAM, 8, c2040_device )
ADDRESS_MAP_GLOBAL_MASK(0x1fff)
AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530
AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via6522_device, read, write)
@ -363,7 +361,7 @@ ADDRESS_MAP_END
// ADDRESS_MAP( c8250lp_fdc_mem )
//-------------------------------------------------
static ADDRESS_MAP_START( c8250lp_fdc_mem, AS_PROGRAM, 8, base_c2040_device )
static ADDRESS_MAP_START( c8250lp_fdc_mem, AS_PROGRAM, 8, c2040_device )
ADDRESS_MAP_GLOBAL_MASK(0x1fff)
AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530
AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via6522_device, read, write)
@ -380,7 +378,7 @@ ADDRESS_MAP_END
// ADDRESS_MAP( sfd1001_fdc_mem )
//-------------------------------------------------
static ADDRESS_MAP_START( sfd1001_fdc_mem, AS_PROGRAM, 8, base_c2040_device )
static ADDRESS_MAP_START( sfd1001_fdc_mem, AS_PROGRAM, 8, c2040_device )
ADDRESS_MAP_GLOBAL_MASK(0x1fff)
AM_RANGE(0x0000, 0x003f) AM_MIRROR(0x0300) AM_RAM // 6530
AM_RANGE(0x0040, 0x004f) AM_MIRROR(0x0330) AM_DEVREADWRITE(M6522_TAG, via6522_device, read, write)
@ -397,7 +395,7 @@ ADDRESS_MAP_END
// riot6532_interface riot0_intf uc1
//-------------------------------------------------
READ8_MEMBER( base_c2040_device::dio_r )
READ8_MEMBER( c2040_device::dio_r )
{
/*
@ -417,8 +415,7 @@ READ8_MEMBER( base_c2040_device::dio_r )
return m_bus->dio_r();
}
WRITE8_MEMBER( base_c2040_device::dio_w )
WRITE8_MEMBER( c2040_device::dio_w )
{
/*
@ -438,13 +435,12 @@ WRITE8_MEMBER( base_c2040_device::dio_w )
m_bus->dio_w(this, data);
}
static const riot6532_interface riot0_intf =
{
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, dio_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, dio_r),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, dio_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, dio_w),
DEVCB_NULL
};
@ -453,7 +449,7 @@ static const riot6532_interface riot0_intf =
// riot6532_interface riot1_intf ue1
//-------------------------------------------------
READ8_MEMBER( base_c2040_device::riot1_pa_r )
READ8_MEMBER( c2040_device::riot1_pa_r )
{
/*
@ -484,8 +480,7 @@ READ8_MEMBER( base_c2040_device::riot1_pa_r )
return data;
}
WRITE8_MEMBER( base_c2040_device::riot1_pa_w )
WRITE8_MEMBER( c2040_device::riot1_pa_w )
{
/*
@ -520,8 +515,7 @@ WRITE8_MEMBER( base_c2040_device::riot1_pa_w )
update_ieee_signals();
}
READ8_MEMBER( base_c2040_device::riot1_pb_r )
READ8_MEMBER( c2040_device::riot1_pb_r )
{
/*
@ -552,8 +546,7 @@ READ8_MEMBER( base_c2040_device::riot1_pb_r )
return data;
}
WRITE8_MEMBER( base_c2040_device::riot1_pb_w )
WRITE8_MEMBER( c2040_device::riot1_pb_w )
{
/*
@ -580,13 +573,12 @@ WRITE8_MEMBER( base_c2040_device::riot1_pb_w )
output_set_led_value(LED_ERR, BIT(data, 5));
}
static const riot6532_interface riot1_intf =
{
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, riot1_pa_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, riot1_pb_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, riot1_pa_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, riot1_pb_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, riot1_pa_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, riot1_pb_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, riot1_pa_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, riot1_pb_w),
DEVCB_CPU_INPUT_LINE(M6502_TAG, INPUT_LINE_IRQ0)
};
@ -595,7 +587,7 @@ static const riot6532_interface riot1_intf =
// via6522_interface via_intf um3
//-------------------------------------------------
READ8_MEMBER( base_c2040_device::via_pa_r )
READ8_MEMBER( c2040_device::via_pa_r )
{
/*
@ -612,15 +604,10 @@ READ8_MEMBER( base_c2040_device::via_pa_r )
*/
UINT16 i = m_i;
UINT8 e = m_e;
UINT8 data = (BIT(e, 6) << 7) | (BIT(i, 7) << 6) | (e & 0x33) | (BIT(e, 2) << 3) | (i & 0x04);
return data;
return (BIT(m_e, 6) << 7) | (BIT(m_i, 7) << 6) | (m_e & 0x33) | (BIT(m_e, 2) << 3) | (m_i & 0x04);
}
WRITE8_MEMBER( base_c2040_device::via_pb_w )
WRITE8_MEMBER( c2040_device::via_pb_w )
{
/*
@ -656,20 +643,17 @@ WRITE8_MEMBER( base_c2040_device::via_pb_w )
m_bit_timer->enable(!mtr1 || !mtr0);
}
READ_LINE_MEMBER( base_c2040_device::ready_r )
READ_LINE_MEMBER( c2040_device::ready_r )
{
return m_ready;
}
READ_LINE_MEMBER( base_c2040_device::err_r )
READ_LINE_MEMBER( c2040_device::err_r )
{
return ERROR;
}
WRITE_LINE_MEMBER( base_c2040_device::mode_sel_w )
WRITE_LINE_MEMBER( c2040_device::mode_sel_w )
{
// mode select
m_mode = state;
@ -678,7 +662,7 @@ WRITE_LINE_MEMBER( base_c2040_device::mode_sel_w )
m_via->write_cb1(ERROR);
}
WRITE_LINE_MEMBER( base_c2040_device::rw_sel_w )
WRITE_LINE_MEMBER( c2040_device::rw_sel_w )
{
// read/write select
m_rw = state;
@ -687,22 +671,21 @@ WRITE_LINE_MEMBER( base_c2040_device::rw_sel_w )
m_via->write_cb1(ERROR);
}
static const via6522_interface via_intf =
{
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, via_pa_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, via_pa_r),
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, ready_r),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, err_r),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c2040_device, ready_r),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c2040_device, err_r),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, via_pb_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, via_pb_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, mode_sel_w),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, rw_sel_w),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c2040_device, mode_sel_w),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c2040_device, rw_sel_w),
DEVCB_NULL
};
@ -712,7 +695,7 @@ static const via6522_interface via_intf =
// via6522_interface c8050_via_intf um3
//-------------------------------------------------
READ8_MEMBER( base_c2040_device::c8050_via_pb_r )
READ8_MEMBER( c8050_device::via_pb_r )
{
/*
@ -737,8 +720,7 @@ READ8_MEMBER( base_c2040_device::c8050_via_pb_r )
return data;
}
WRITE8_MEMBER( base_c2040_device::c8050_via_pb_w )
WRITE8_MEMBER( c8050_device::via_pb_w )
{
/*
@ -774,22 +756,21 @@ WRITE8_MEMBER( base_c2040_device::c8050_via_pb_w )
m_bit_timer->enable(!mtr1 || !mtr0);
}
static const via6522_interface c8050_via_intf =
{
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, via_pa_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, c8050_via_pb_r),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, ready_r),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, err_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, via_pa_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c8050_device, via_pb_r),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c2040_device, ready_r),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c2040_device, err_r),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, c8050_via_pb_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c8050_device, via_pb_w),
DEVCB_NULL,
DEVCB_NULL,
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, mode_sel_w),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, rw_sel_w),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c2040_device, mode_sel_w),
DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, c2040_device, rw_sel_w),
DEVCB_NULL
};
@ -799,7 +780,7 @@ static const via6522_interface c8050_via_intf =
// mos6530_interface miot_intf uk3
//-------------------------------------------------
READ8_MEMBER( base_c2040_device::pi_r )
READ8_MEMBER( c2040_device::pi_r )
{
/*
@ -819,7 +800,7 @@ READ8_MEMBER( base_c2040_device::pi_r )
return m_pi;
}
WRITE8_MEMBER( base_c2040_device::pi_w )
WRITE8_MEMBER( c2040_device::pi_w )
{
/*
@ -839,7 +820,7 @@ WRITE8_MEMBER( base_c2040_device::pi_w )
m_pi = data;
}
READ8_MEMBER( base_c2040_device::miot_pb_r )
READ8_MEMBER( c2040_device::miot_pb_r )
{
/*
@ -867,7 +848,7 @@ READ8_MEMBER( base_c2040_device::miot_pb_r )
return data;
}
WRITE8_MEMBER( base_c2040_device::miot_pb_w )
WRITE8_MEMBER( c2040_device::miot_pb_w )
{
/*
@ -906,10 +887,10 @@ WRITE8_MEMBER( base_c2040_device::miot_pb_w )
static MOS6530_INTERFACE( miot_intf )
{
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, pi_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, pi_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, miot_pb_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, miot_pb_w)
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, pi_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, pi_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, miot_pb_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, miot_pb_w)
};
@ -917,7 +898,7 @@ static MOS6530_INTERFACE( miot_intf )
// mos6530_interface c8050_miot_intf uk3
//-------------------------------------------------
READ8_MEMBER( base_c2040_device::c8050_miot_pb_r )
READ8_MEMBER( c8050_device::miot_pb_r )
{
/*
@ -943,7 +924,7 @@ READ8_MEMBER( base_c2040_device::c8050_miot_pb_r )
data |= 0x10;
// single/dual sided
if (m_variant == base_c2040_device::TYPE_8050)
if (m_variant == c2040_device::TYPE_8050)
{
data |= 0x40;
}
@ -951,7 +932,7 @@ READ8_MEMBER( base_c2040_device::c8050_miot_pb_r )
return data;
}
WRITE8_MEMBER( base_c2040_device::c8050_miot_pb_w )
WRITE8_MEMBER( c8050_device::miot_pb_w )
{
/*
@ -969,8 +950,8 @@ WRITE8_MEMBER( base_c2040_device::c8050_miot_pb_w )
*/
// drive select
if ((m_variant == base_c2040_device::TYPE_8050) ||
(m_variant == base_c2040_device::TYPE_8250))
if ((m_variant == c2040_device::TYPE_8050) ||
(m_variant == c2040_device::TYPE_8250))
{
m_drive = BIT(data, 0);
}
@ -985,8 +966,8 @@ WRITE8_MEMBER( base_c2040_device::c8050_miot_pb_w )
}
// side select
if ((m_variant == base_c2040_device::TYPE_8250) ||
(m_variant == base_c2040_device::TYPE_SFD1001))
if ((m_variant == c2040_device::TYPE_8250) ||
(m_variant == c2040_device::TYPE_SFD1001))
{
m_side = !BIT(data, 4);
}
@ -1001,10 +982,10 @@ WRITE8_MEMBER( base_c2040_device::c8050_miot_pb_w )
static MOS6530_INTERFACE( c8050_miot_intf )
{
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, pi_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, pi_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, c8050_miot_pb_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, base_c2040_device, c8050_miot_pb_w)
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, pi_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c2040_device, pi_w),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c8050_device, miot_pb_r),
DEVCB_DEVICE_MEMBER(DEVICE_SELF_OWNER, c8050_device, miot_pb_w)
};
@ -1262,7 +1243,7 @@ MACHINE_CONFIG_END
// machine configurations
//-------------------------------------------------
machine_config_constructor base_c2040_device::device_mconfig_additions() const
machine_config_constructor c2040_device::device_mconfig_additions() const
{
switch (m_variant)
{
@ -1298,7 +1279,7 @@ machine_config_constructor base_c2040_device::device_mconfig_additions() const
// update_ieee_signals -
//-------------------------------------------------
inline void base_c2040_device::update_ieee_signals()
inline void c2040_device::update_ieee_signals()
{
int atn = m_bus->atn_r();
int nrfd = !(!(!(atn && m_atna) && m_rfdo) || !(atn || m_atna));
@ -1313,7 +1294,7 @@ inline void base_c2040_device::update_ieee_signals()
// update_gcr_data -
//-------------------------------------------------
inline void base_c2040_device::update_gcr_data()
inline void c2040_device::update_gcr_data()
{
if (m_rw)
{
@ -1368,7 +1349,7 @@ inline void base_c2040_device::update_gcr_data()
// update_ieee_signals -
//-------------------------------------------------
inline void base_c2040_device::read_current_track(int unit)
inline void c2040_device::read_current_track(int unit)
{
m_unit[unit].m_track_len = G64_BUFFER_SIZE;
m_unit[unit].m_buffer_pos = 0;
@ -1387,7 +1368,7 @@ inline void base_c2040_device::read_current_track(int unit)
// spindle_motor -
//-------------------------------------------------
inline void base_c2040_device::spindle_motor(int unit, int mtr)
inline void c2040_device::spindle_motor(int unit, int mtr)
{
if (m_unit[unit].m_mtr != mtr)
{
@ -1408,7 +1389,7 @@ inline void base_c2040_device::spindle_motor(int unit, int mtr)
// micropolis_step_motor -
//-------------------------------------------------
inline void base_c2040_device::micropolis_step_motor(int unit, int stp)
inline void c2040_device::micropolis_step_motor(int unit, int stp)
{
if (!m_unit[unit].m_mtr && (m_unit[unit].m_stp != stp))
{
@ -1440,7 +1421,7 @@ inline void base_c2040_device::micropolis_step_motor(int unit, int stp)
// mpi_step_motor -
//-------------------------------------------------
inline void base_c2040_device::mpi_step_motor(int unit, int stp)
inline void c2040_device::mpi_step_motor(int unit, int stp)
{
if (!m_unit[unit].m_mtr && (m_unit[unit].m_stp != stp))
{
@ -1468,72 +1449,16 @@ inline void base_c2040_device::mpi_step_motor(int unit, int stp)
}
//-------------------------------------------------
// initialize -
//-------------------------------------------------
inline void base_c2040_device::initialize(int drives)
{
// find GCR ROM
m_gcr = memregion("gcr")->base();
// install image callbacks
m_unit[0].m_image = m_image0;
floppy_install_unload_proc(m_image0, base_c2040_device::on_disk0_change);
floppy_install_load_proc(m_image0, base_c2040_device::on_disk0_change);
if (drives == 2)
{
m_unit[1].m_image = m_image1;
floppy_install_unload_proc(m_image1, base_c2040_device::on_disk1_change);
floppy_install_load_proc(m_image1, base_c2040_device::on_disk1_change);
}
// register for state saving
save_item(NAME(m_drive));
save_item(NAME(m_side));
save_item(NAME(m_rfdo));
save_item(NAME(m_daco));
save_item(NAME(m_atna));
save_item(NAME(m_ds));
save_item(NAME(m_bit_count));
save_item(NAME(m_sr));
save_item(NAME(m_pi));
save_item(NAME(m_i));
save_item(NAME(m_e));
save_item(NAME(m_ready));
save_item(NAME(m_mode));
save_item(NAME(m_rw));
save_item(NAME(m_miot_irq));
save_item(NAME(m_unit[0].m_stp));
save_item(NAME(m_unit[0].m_mtr));
save_item(NAME(m_unit[0].m_track_len));
save_item(NAME(m_unit[0].m_buffer_pos));
save_item(NAME(m_unit[0].m_bit_pos));
if (drives == 2)
{
save_item(NAME(m_unit[1].m_stp));
save_item(NAME(m_unit[1].m_mtr));
save_item(NAME(m_unit[1].m_track_len));
save_item(NAME(m_unit[1].m_buffer_pos));
save_item(NAME(m_unit[1].m_bit_pos));
}
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// base_c2040_device - constructor
// c2040_device - constructor
//-------------------------------------------------
base_c2040_device::base_c2040_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant)
c2040_device::c2040_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant)
: device_t(mconfig, type, name, tag, owner, clock),
device_ieee488_interface(mconfig, *this),
m_maincpu(*this, M6502_TAG),
@ -1567,13 +1492,39 @@ base_c2040_device::base_c2040_device(const machine_config &mconfig, device_type
}
}
//-------------------------------------------------
// base_c2040_device - constructor
//-------------------------------------------------
c2040_device::c2040_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: base_c2040_device(mconfig, C2040, "C2040", tag, owner, clock, TYPE_2040) { }
: device_t(mconfig, C2040, "C2040", tag, owner, clock),
device_ieee488_interface(mconfig, *this),
m_maincpu(*this, M6502_TAG),
m_fdccpu(*this, M6504_TAG),
m_riot0(*this, M6532_0_TAG),
m_riot1(*this, M6532_1_TAG),
m_miot(*this, M6530_TAG),
m_via(*this, M6522_TAG),
m_image0(*this, FLOPPY_0),
m_image1(*this, FLOPPY_1),
m_drive(0),
m_side(0),
m_rfdo(1),
m_daco(1),
m_atna(1),
m_ds(-1),
m_bit_count(0),
m_ready(0),
m_mode(0),
m_rw(0),
m_miot_irq(CLEAR_LINE),
m_variant(TYPE_2040)
{
for (int i = 0; i < 2; i++)
{
m_unit[i].m_stp = 0;
m_unit[i].m_mtr = 1;
m_unit[i].m_track_len = 0;
m_unit[i].m_buffer_pos = 0;
m_unit[i].m_bit_pos = 0;
}
}
//-------------------------------------------------
@ -1581,7 +1532,7 @@ c2040_device::c2040_device(const machine_config &mconfig, const char *tag, devic
//-------------------------------------------------
c3040_device::c3040_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: base_c2040_device(mconfig, C3040, "C3040", tag, owner, clock, TYPE_3040) { }
: c2040_device(mconfig, C3040, "C3040", tag, owner, clock, TYPE_3040) { }
//-------------------------------------------------
@ -1589,15 +1540,18 @@ c3040_device::c3040_device(const machine_config &mconfig, const char *tag, devic
//-------------------------------------------------
c4040_device::c4040_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: base_c2040_device(mconfig, C4040, "C4040", tag, owner, clock, TYPE_4040) { }
: c2040_device(mconfig, C4040, "C4040", tag, owner, clock, TYPE_4040) { }
//-------------------------------------------------
// c8050_device - constructor
//-------------------------------------------------
c8050_device::c8050_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant)
: c2040_device(mconfig, type, name, tag, owner, clock, variant) { }
c8050_device::c8050_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: base_c2040_device(mconfig, C8050, "C8050", tag, owner, clock, TYPE_8050) { }
: c2040_device(mconfig, C8050, "C8050", tag, owner, clock, TYPE_8050) { }
//-------------------------------------------------
@ -1605,7 +1559,7 @@ c8050_device::c8050_device(const machine_config &mconfig, const char *tag, devic
//-------------------------------------------------
c8250_device::c8250_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: base_c2040_device(mconfig, C8250, "C8250", tag, owner, clock, TYPE_8250) { }
: c8050_device(mconfig, C8250, "C8250", tag, owner, clock, TYPE_8250) { }
//-------------------------------------------------
@ -1613,7 +1567,7 @@ c8250_device::c8250_device(const machine_config &mconfig, const char *tag, devic
//-------------------------------------------------
c8250lp_device::c8250lp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: base_c2040_device(mconfig, C8250LP, "C8250LP", tag, owner, clock, TYPE_8250LP) { }
: c8050_device(mconfig, C8250LP, "C8250LP", tag, owner, clock, TYPE_8250LP) { }
//-------------------------------------------------
@ -1621,26 +1575,63 @@ c8250lp_device::c8250lp_device(const machine_config &mconfig, const char *tag, d
//-------------------------------------------------
sfd1001_device::sfd1001_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: base_c2040_device(mconfig, SFD1001, "SFD1001", tag, owner, clock, TYPE_SFD1001) { }
: c8050_device(mconfig, SFD1001, "SFD1001", tag, owner, clock, TYPE_SFD1001) { }
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void base_c2040_device::device_start()
void c2040_device::device_start()
{
m_bit_timer = timer_alloc();
switch (m_variant)
{
default:
initialize(2);
break;
// find GCR ROM
m_gcr = memregion("gcr")->base();
case base_c2040_device::TYPE_SFD1001:
initialize(1);
break;
// install image callbacks
m_unit[0].m_image = m_image0;
floppy_install_unload_proc(m_image0, c2040_device::on_disk0_change);
floppy_install_load_proc(m_image0, c2040_device::on_disk0_change);
if (m_image1)
{
m_unit[1].m_image = m_image1;
floppy_install_unload_proc(m_image1, c2040_device::on_disk1_change);
floppy_install_load_proc(m_image1, c2040_device::on_disk1_change);
}
// register for state saving
save_item(NAME(m_drive));
save_item(NAME(m_side));
save_item(NAME(m_rfdo));
save_item(NAME(m_daco));
save_item(NAME(m_atna));
save_item(NAME(m_ds));
save_item(NAME(m_bit_count));
save_item(NAME(m_sr));
save_item(NAME(m_pi));
save_item(NAME(m_i));
save_item(NAME(m_e));
save_item(NAME(m_ready));
save_item(NAME(m_mode));
save_item(NAME(m_rw));
save_item(NAME(m_miot_irq));
save_item(NAME(m_unit[0].m_stp));
save_item(NAME(m_unit[0].m_mtr));
save_item(NAME(m_unit[0].m_track_len));
save_item(NAME(m_unit[0].m_buffer_pos));
save_item(NAME(m_unit[0].m_bit_pos));
if (m_image1)
{
save_item(NAME(m_unit[1].m_stp));
save_item(NAME(m_unit[1].m_mtr));
save_item(NAME(m_unit[1].m_track_len));
save_item(NAME(m_unit[1].m_buffer_pos));
save_item(NAME(m_unit[1].m_bit_pos));
}
}
@ -1649,7 +1640,7 @@ void base_c2040_device::device_start()
// device_reset - device-specific reset
//-------------------------------------------------
void base_c2040_device::device_reset()
void c2040_device::device_reset()
{
m_maincpu->reset();
@ -1673,7 +1664,7 @@ void base_c2040_device::device_reset()
// device_timer - handler timer events
//-------------------------------------------------
void base_c2040_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
void c2040_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{
int ready = 1;
@ -1721,9 +1712,9 @@ void base_c2040_device::device_timer(emu_timer &timer, device_timer_id id, int p
m_via->write_ca1(ready);
m_via->write_cb1(ERROR);
if ((m_variant == base_c2040_device::TYPE_8050) ||
(m_variant == base_c2040_device::TYPE_8250) ||
(m_variant == base_c2040_device::TYPE_SFD1001))
if ((m_variant == c2040_device::TYPE_8050) ||
(m_variant == c2040_device::TYPE_8250) ||
(m_variant == c2040_device::TYPE_SFD1001))
{
m_fdccpu->set_input_line(M6502_SET_OVERFLOW, ready ? CLEAR_LINE : ASSERT_LINE);
}
@ -1735,7 +1726,7 @@ void base_c2040_device::device_timer(emu_timer &timer, device_timer_id id, int p
// ieee488_atn -
//-------------------------------------------------
void base_c2040_device::ieee488_atn(int state)
void c2040_device::ieee488_atn(int state)
{
update_ieee_signals();
@ -1748,7 +1739,7 @@ void base_c2040_device::ieee488_atn(int state)
// ieee488_ifc -
//-------------------------------------------------
void base_c2040_device::ieee488_ifc(int state)
void c2040_device::ieee488_ifc(int state)
{
if (!state)
{
@ -1761,9 +1752,9 @@ void base_c2040_device::ieee488_ifc(int state)
// on_disk0_change -
//-------------------------------------------------
void base_c2040_device::on_disk0_change(device_image_interface &image)
void c2040_device::on_disk0_change(device_image_interface &image)
{
base_c2040_device *c2040 = static_cast<base_c2040_device *>(image.device().owner());
c2040_device *c2040 = static_cast<c2040_device *>(image.device().owner());
c2040->read_current_track(0);
}
@ -1773,9 +1764,9 @@ void base_c2040_device::on_disk0_change(device_image_interface &image)
// on_disk_change -
//-------------------------------------------------
void base_c2040_device::on_disk1_change(device_image_interface &image)
void c2040_device::on_disk1_change(device_image_interface &image)
{
base_c2040_device *c2040 = static_cast<base_c2040_device *>(image.device().owner());
c2040_device *c2040 = static_cast<c2040_device *>(image.device().owner());
c2040->read_current_track(1);
}

View File

@ -30,10 +30,10 @@
// TYPE DEFINITIONS
//**************************************************************************
// ======================> base_c2040_device
// ======================> c2040_device
class base_c2040_device : public device_t,
public device_ieee488_interface
class c2040_device : public device_t,
public device_ieee488_interface
{
public:
enum
@ -48,7 +48,8 @@ public:
};
// construction/destruction
base_c2040_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant);
c2040_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant);
c2040_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
// not really public
static void on_disk0_change(device_image_interface &image);
@ -70,10 +71,6 @@ public:
DECLARE_WRITE8_MEMBER( pi_w );
DECLARE_READ8_MEMBER( miot_pb_r );
DECLARE_WRITE8_MEMBER( miot_pb_w );
DECLARE_READ8_MEMBER( c8050_via_pb_r );
DECLARE_WRITE8_MEMBER( c8050_via_pb_w );
DECLARE_READ8_MEMBER( c8050_miot_pb_r );
DECLARE_WRITE8_MEMBER( c8050_miot_pb_w );
// optional information overrides
virtual const rom_entry *device_rom_region() const;
@ -96,7 +93,6 @@ protected:
inline void spindle_motor(int unit, int mtr);
inline void micropolis_step_motor(int unit, int stp);
inline void mpi_step_motor(int unit, int stp);
inline void initialize(int drives);
required_device<m6502_device> m_maincpu;
required_device<m6504_device> m_fdccpu;
@ -135,7 +131,7 @@ protected:
int m_bit_count; // GCR bit counter
UINT16 m_sr; // GCR data shift register
UINT8 m_pi; // parallel data input
UINT8* m_gcr; // GCR encoder/decoder ROM
const UINT8* m_gcr; // GCR encoder/decoder ROM
UINT16 m_i; // GCR encoder/decoded ROM address
UINT8 m_e; // GCR encoder/decoded ROM data
@ -152,19 +148,9 @@ protected:
};
// ======================> c2040_device
class c2040_device : public base_c2040_device
{
public:
// construction/destruction
c2040_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
};
// ======================> c3040_device
class c3040_device : public base_c2040_device
class c3040_device : public c2040_device
{
public:
// construction/destruction
@ -174,7 +160,7 @@ public:
// ======================> c4040_device
class c4040_device : public base_c2040_device
class c4040_device : public c2040_device
{
public:
// construction/destruction
@ -184,17 +170,23 @@ public:
// ======================> c8050_device
class c8050_device : public base_c2040_device
class c8050_device : public c2040_device
{
public:
// construction/destruction
c8050_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
c8050_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, UINT32 variant);
DECLARE_READ8_MEMBER( via_pb_r );
DECLARE_WRITE8_MEMBER( via_pb_w );
DECLARE_READ8_MEMBER( miot_pb_r );
DECLARE_WRITE8_MEMBER( miot_pb_w );
};
// ======================> c8250_device
class c8250_device : public base_c2040_device
class c8250_device : public c8050_device
{
public:
// construction/destruction
@ -204,7 +196,7 @@ public:
// ======================> c8250lp_device
class c8250lp_device : public base_c2040_device
class c8250lp_device : public c8050_device
{
public:
// construction/destruction
@ -214,7 +206,7 @@ public:
// ======================> sfd1001_device
class sfd1001_device : public base_c2040_device
class sfd1001_device : public c8050_device
{
public:
// construction/destruction