summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2015-09-28 16:14:53 -0500
committer cracyc <cracyc@users.noreply.github.com>2015-09-28 16:14:53 -0500
commitc400248728c831b2bcdca3382780a07422d025e5 (patch)
tree643a7dd57cb35bbae0d11896255838f940e6433d /src/mess
parentf73fe4cda85b04102f5b834b793eb61df5250e19 (diff)
i8271: modernize [Carl]
Diffstat (limited to 'src/mess')
-rw-r--r--src/mess/drivers/atom.c43
-rw-r--r--src/mess/drivers/bbc.c21
-rw-r--r--src/mess/drivers/imds2.c48
-rw-r--r--src/mess/includes/atom.h6
-rw-r--r--src/mess/includes/bbc.h1
-rw-r--r--src/mess/includes/imds2.h5
-rw-r--r--src/mess/machine/bbc.c6
7 files changed, 68 insertions, 62 deletions
diff --git a/src/mess/drivers/atom.c b/src/mess/drivers/atom.c
index 88d142d15c4..9403c7c62e5 100644
--- a/src/mess/drivers/atom.c
+++ b/src/mess/drivers/atom.c
@@ -247,7 +247,7 @@ READ8_MEMBER( atomeb_state::dos_r )
static ADDRESS_MAP_START( atom_mem, AS_PROGRAM, 8, atom_state )
AM_RANGE(0x0000, 0x09ff) AM_RAM
- AM_RANGE(0x0a00, 0x0a03) AM_MIRROR(0x1f8) AM_DEVREADWRITE(I8271_TAG, i8271_device, read, write)
+ AM_RANGE(0x0a00, 0x0a03) AM_MIRROR(0x1f8) AM_DEVICE(I8271_TAG, i8271_device, map)
AM_RANGE(0x0a04, 0x0a04) AM_MIRROR(0x1f8) AM_DEVREADWRITE(I8271_TAG, i8271_device, data_r, data_w)
AM_RANGE(0x0a05, 0x7fff) AM_RAM
AM_RANGE(0x8000, 0x97ff) AM_RAM AM_SHARE("video_ram")
@@ -583,30 +583,11 @@ WRITE_LINE_MEMBER( atom_state::atom_8271_interrupt_callback )
m_previous_i8271_int_state = state;
}
-/*-------------------------------------------------
- LEGACY_FLOPPY_OPTIONS( atom )
--------------------------------------------------*/
-
-static LEGACY_FLOPPY_OPTIONS_START( atom )
- LEGACY_FLOPPY_OPTION(atom, "dsk,40t", "Atom disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
- HEADS([1])
- TRACKS([40])
- SECTORS([10])
- SECTOR_LENGTH([256])
- FIRST_SECTOR_ID([0]))
-LEGACY_FLOPPY_OPTIONS_END
-
-/*-------------------------------------------------
- floppy_interface atom_floppy_interface
--------------------------------------------------*/
-
-static const floppy_interface atom_floppy_interface =
+WRITE_LINE_MEMBER( atom_state::motor_w )
{
- FLOPPY_STANDARD_5_25_SSDD_40,
- LEGACY_FLOPPY_OPTIONS_NAME(atom),
- "floppy_5_25"
-};
-
+ m_fdc->subdevice<floppy_connector>("0")->get_device()->mon_w(!state);
+ m_fdc->subdevice<floppy_connector>("1")->get_device()->mon_w(!state);
+}
TIMER_DEVICE_CALLBACK_MEMBER(atom_state::cassette_output_tick)
{
@@ -687,6 +668,13 @@ int atom_state::load_cart(device_image_interface &image, generic_slot_device *sl
return IMAGE_INIT_PASS;
}
+static SLOT_INTERFACE_START(atom_floppies)
+ SLOT_INTERFACE("525sssd", FLOPPY_525_SSSD)
+SLOT_INTERFACE_END
+
+FLOPPY_FORMATS_MEMBER(atom_state::floppy_formats)
+ FLOPPY_ATOM_FORMAT
+FLOPPY_FORMATS_END
/*-------------------------------------------------
MACHINE_DRIVER( atom )
@@ -722,10 +710,11 @@ static MACHINE_CONFIG_START( atom, atom_state )
MCFG_I8255_IN_PORTC_CB(READ8(atom_state, ppi_pc_r))
MCFG_I8255_OUT_PORTC_CB(WRITE8(atom_state, ppi_pc_w))
- MCFG_DEVICE_ADD(I8271_TAG, I8271, 0)
+ MCFG_DEVICE_ADD(I8271_TAG, I8271 , 0)
MCFG_I8271_IRQ_CALLBACK(WRITELINE(atom_state, atom_8271_interrupt_callback))
- MCFG_I8271_FLOPPIES(FLOPPY_0, FLOPPY_1)
- MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(atom_floppy_interface)
+ MCFG_I8271_HDL_CALLBACK(WRITELINE(atom_state, motor_w))
+ MCFG_FLOPPY_DRIVE_ADD(I8271_TAG ":0", atom_floppies, "525sssd", atom_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD(I8271_TAG ":1", atom_floppies, "525sssd", atom_state::floppy_formats)
MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_devices, "printer")
MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE(R6522_TAG, via6522_device, write_ca1))
diff --git a/src/mess/drivers/bbc.c b/src/mess/drivers/bbc.c
index 8c6815c3eb7..437e6545cb1 100644
--- a/src/mess/drivers/bbc.c
+++ b/src/mess/drivers/bbc.c
@@ -194,8 +194,8 @@ static ADDRESS_MAP_START( bbcb_mem, AS_PROGRAM, 8, bbc_state )
AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank4") AM_WRITE(bbc_memoryb4_w) /* 8000-bfff Paged ROM */
AM_RANGE(0xfe30, 0xfe3f) AM_READWRITE(bbc_fe_r, bbc_page_selectb_w) /* R: fe30-fe3f NC Not Connected */
/* W: fe30-fe3f 84LS161 Paged ROM selector */
- AM_RANGE(0xfe80, 0xfe83) AM_DEVREADWRITE("i8271", i8271_device, read, write) /* fe80-fe9f 8271 FDC Floppy disc controller */
- AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("i8271", i8271_device, dack_r, dack_w) /* fe80-fe9f 8271 FDC Floppy disc controller */
+ AM_RANGE(0xfe80, 0xfe83) AM_DEVICE("i8271" , i8271_device, map) /* fe80-fe9f 8271 FDC Floppy disc controller */
+ AM_RANGE(0xfe84, 0xfe9f) AM_DEVREADWRITE("i8271", i8271_device, data_r, data_w) /* fe80-fe9f 8271 FDC Floppy disc controller */
AM_IMPORT_FROM(bbc_base)
ADDRESS_MAP_END
@@ -635,13 +635,6 @@ WRITE_LINE_MEMBER(bbc_state::bbcb_acia6850_irq_w)
}
-static const floppy_interface bbc_floppy_interface =
-{
- FLOPPY_STANDARD_5_25_DSDD,
- LEGACY_FLOPPY_OPTIONS_NAME(bbc),
- "floppy_5_25"
-};
-
FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats_525sd )
FLOPPY_BBC_SSD_525_FORMAT,
FLOPPY_BBC_DSD_525_FORMAT
@@ -824,11 +817,11 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
/* fdc */
- MCFG_DEVICE_ADD("i8271", I8271, 0)
+ MCFG_DEVICE_ADD("i8271" , I8271 , 0)
MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, bbc_i8271_interrupt))
- MCFG_I8271_FLOPPIES(FLOPPY_0, FLOPPY_1)
-
- MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface)
+ MCFG_I8271_HDL_CALLBACK(WRITELINE(bbc_state, motor_w))
+ MCFG_FLOPPY_DRIVE_ADD("i8271:0", bbc_floppies_525, "qd", bbc_state::floppy_formats_525sd)
+ MCFG_FLOPPY_DRIVE_ADD("i8271:1", bbc_floppies_525, "qd", bbc_state::floppy_formats_525sd)
/* software lists */
MCFG_DEVICE_REMOVE("cass_ls_a")
@@ -844,8 +837,6 @@ static MACHINE_CONFIG_DERIVED(bbcb1770, bbcb)
/* fdc */
MCFG_DEVICE_REMOVE("i8271")
- MCFG_DEVICE_REMOVE(FLOPPY_0)
- MCFG_DEVICE_REMOVE(FLOPPY_1)
MCFG_WD1770_ADD("wd1770", XTAL_16MHz / 2)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
diff --git a/src/mess/drivers/imds2.c b/src/mess/drivers/imds2.c
index 4db7ffd7555..aae8a4506f7 100644
--- a/src/mess/drivers/imds2.c
+++ b/src/mess/drivers/imds2.c
@@ -140,7 +140,7 @@ static ADDRESS_MAP_START(ioc_io_map , AS_IO , 8 , imds2_state)
AM_RANGE(0x90 , 0x9f) AM_READ(imds2_kb_read)
AM_RANGE(0xa0 , 0xaf) AM_READ(imds2_ioc_status_r)
AM_RANGE(0xb0 , 0xbf) AM_READ(imds2_ioc_dbbin_r)
- AM_RANGE(0xc0 , 0xcf) AM_DEVREADWRITE("iocfdc" , i8271_device , read , write)
+ AM_RANGE(0xc0 , 0xcf) AM_DEVICE("iocfdc" , i8271_device, map)
AM_RANGE(0xd0 , 0xdf) AM_DEVREADWRITE("ioccrtc" , i8275_device , read , write)
AM_RANGE(0xe0 , 0xef) AM_DEVREADWRITE("ioctimer" , pit8253_device , read , write);
// DMA controller range doesn't extend to 0xff because register 0xfd needs to be read as 0xff
@@ -171,11 +171,12 @@ imds2_state::imds2_state(const machine_config &mconfig, device_type type, const
m_iocbeep(*this , "iocbeep"),
m_ioctimer(*this , "ioctimer"),
m_iocfdc(*this , "iocfdc"),
+ m_flop0(*this, "iocfdc:0"),
+ m_flop1(*this, "iocfdc:1"),
m_iocpio(*this , "iocpio"),
m_kbcpu(*this , "kbcpu"),
m_palette(*this , "palette"),
m_gfxdecode(*this, "gfxdecode"),
- m_floppy0(*this , FLOPPY_0),
m_centronics(*this , "centronics"),
m_io_key0(*this , "KEY0"),
m_io_key1(*this , "KEY1"),
@@ -551,6 +552,17 @@ I8275_DRAW_CHARACTER_MEMBER(imds2_state::crtc_display_pixels)
}
}
+int imds2_state::floppy_load(floppy_image_device *dev)
+{
+ dev->mon_w(0);
+ return IMAGE_INIT_PASS;
+}
+
+void imds2_state::floppy_unload(floppy_image_device *dev)
+{
+ dev->mon_w(1);
+}
+
void imds2_state::driver_start()
{
// Allocate 64k for IPC RAM
@@ -566,8 +578,11 @@ void imds2_state::driver_start()
void imds2_state::machine_start()
{
- m_floppy0->floppy_mon_w(0);
- m_floppy0->floppy_drive_set_ready_state(1 , 0);
+ // As far as I can tell from the schmatic, there's no software motor control
+ m_flop0->get_device()->setup_load_cb(floppy_image_device::load_cb(FUNC(imds2_state::floppy_load), this));
+ m_flop0->get_device()->setup_unload_cb(floppy_image_device::unload_cb(FUNC(imds2_state::floppy_unload), this));
+ m_flop1->get_device()->setup_load_cb(floppy_image_device::load_cb(FUNC(imds2_state::floppy_load), this));
+ m_flop1->get_device()->setup_unload_cb(floppy_image_device::unload_cb(FUNC(imds2_state::floppy_unload), this));
}
void imds2_state::video_start()
@@ -580,6 +595,10 @@ void imds2_state::machine_reset()
m_iocbeep->set_frequency(IOC_BEEP_FREQ);
m_ipc_control = 0x00;
m_ipc_ioc_status = 0x0f;
+ m_flop0->get_device()->mon_w(!m_flop0->get_device()->exists());
+ m_flop1->get_device()->mon_w(!m_flop1->get_device()->exists());
+
+ m_iocfdc->set_rate(500000); // The IMD images show a rate of 500kbps
}
bool imds2_state::imds2_in_ipc_rom(offs_t offset) const
@@ -737,15 +756,9 @@ static GFXDECODE_START(imds2)
GFXDECODE_ENTRY("gfx1" , 0x0000 , imds2_charlayout , 0 , 1)
GFXDECODE_END
-static LEGACY_FLOPPY_OPTIONS_START(imds2)
-LEGACY_FLOPPY_OPTIONS_END
-
-static const floppy_interface imds2_floppy_interface =
-{
- FLOPPY_STANDARD_8_SSSD,
- LEGACY_FLOPPY_OPTIONS_NAME(imds2),
- "floppy_8"
-};
+static SLOT_INTERFACE_START( imds2_floppies )
+ SLOT_INTERFACE( "8sssd", FLOPPY_8_SSSD )
+SLOT_INTERFACE_END
static MACHINE_CONFIG_START(imds2 , imds2_state)
MCFG_CPU_ADD("ipccpu" , I8085A , IPC_XTAL_Y2 / 2) // 4 MHz
@@ -805,8 +818,8 @@ static MACHINE_CONFIG_START(imds2 , imds2_state)
MCFG_I8257_OUT_HRQ_CB(WRITELINE(imds2_state, imds2_hrq_w))
MCFG_I8257_IN_MEMR_CB(READ8(imds2_state , imds2_ioc_mem_r))
MCFG_I8257_OUT_MEMW_CB(WRITE8(imds2_state , imds2_ioc_mem_w))
- MCFG_I8257_IN_IOR_1_CB(DEVREAD8("iocfdc" , i8271_device , dack_r))
- MCFG_I8257_OUT_IOW_1_CB(DEVWRITE8("iocfdc" , i8271_device , dack_w))
+ MCFG_I8257_IN_IOR_1_CB(DEVREAD8("iocfdc" , i8271_device , data_r))
+ MCFG_I8257_OUT_IOW_1_CB(DEVWRITE8("iocfdc" , i8271_device , data_w))
MCFG_I8257_OUT_IOW_2_CB(DEVWRITE8("ioccrtc" , i8275_device , dack_w))
MCFG_DEVICE_ADD("ioctimer" , PIT8253 , 0)
@@ -816,9 +829,8 @@ static MACHINE_CONFIG_START(imds2 , imds2_state)
MCFG_DEVICE_ADD("iocfdc" , I8271 , IOC_XTAL_Y1 / 2)
MCFG_I8271_DRQ_CALLBACK(DEVWRITELINE("iocdma" , i8257_device , dreq1_w))
- MCFG_I8271_FLOPPIES(FLOPPY_0 , FLOPPY_1)
-
- MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, imds2_floppy_interface)
+ MCFG_FLOPPY_DRIVE_ADD("iocfdc:0", imds2_floppies, "8sssd", floppy_image_device::default_floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("iocfdc:1", imds2_floppies, "8sssd", floppy_image_device::default_floppy_formats)
MCFG_CPU_ADD("iocpio" , I8041 , IOC_XTAL_Y3)
MCFG_CPU_IO_MAP(pio_io_map)
diff --git a/src/mess/includes/atom.h b/src/mess/includes/atom.h
index 62992b67469..bd7b2427897 100644
--- a/src/mess/includes/atom.h
+++ b/src/mess/includes/atom.h
@@ -13,7 +13,7 @@
#include "machine/ram.h"
#include "imagedev/snapquik.h"
#include "formats/atom_tap.h"
-#include "formats/basicdsk.h"
+#include "formats/atom_dsk.h"
#include "formats/uef_cas.h"
#include "bus/centronics/ctronics.h"
#include "machine/6522via.h"
@@ -46,6 +46,7 @@ public:
m_maincpu(*this, SY6502_TAG),
m_vdg(*this, MC6847_TAG),
m_cassette(*this, "cassette"),
+ m_fdc(*this, I8271_TAG),
m_centronics(*this, CENTRONICS_TAG),
m_speaker(*this, "speaker"),
m_cart(*this, "cartslot"),
@@ -67,6 +68,7 @@ public:
required_device<cpu_device> m_maincpu;
required_device<mc6847_base_device> m_vdg;
required_device<cassette_image_device> m_cassette;
+ optional_device<i8271_device> m_fdc;
required_device<centronics_device> m_centronics;
required_device<speaker_sound_device> m_speaker;
optional_device<generic_slot_device> m_cart;
@@ -95,6 +97,7 @@ public:
DECLARE_READ8_MEMBER( vdg_videoram_r );
DECLARE_INPUT_CHANGED_MEMBER( trigger_reset );
DECLARE_WRITE_LINE_MEMBER( atom_8271_interrupt_callback );
+ DECLARE_WRITE_LINE_MEMBER( motor_w );
/* video state */
required_shared_ptr<UINT8> m_video_ram;
@@ -109,6 +112,7 @@ public:
/* devices */
int m_previous_i8271_int_state;
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
TIMER_DEVICE_CALLBACK_MEMBER(cassette_output_tick);
int load_cart(device_image_interface &image, generic_slot_device *slot);
diff --git a/src/mess/includes/bbc.h b/src/mess/includes/bbc.h
index 9f5dcb19327..5b8e56d25e5 100644
--- a/src/mess/includes/bbc.h
+++ b/src/mess/includes/bbc.h
@@ -167,6 +167,7 @@ public:
DECLARE_WRITE_LINE_MEMBER(write_cts_serial);
DECLARE_INPUT_CHANGED_MEMBER( trigger_reset );
DECLARE_WRITE_LINE_MEMBER(bbc_i8271_interrupt);
+ DECLARE_WRITE_LINE_MEMBER(motor_w);
UPD7002_GET_ANALOGUE(BBC_get_analogue_input);
UPD7002_EOC(BBC_uPD7002_EOC);
diff --git a/src/mess/includes/imds2.h b/src/mess/includes/imds2.h
index 2b7b20de074..298b808be82 100644
--- a/src/mess/includes/imds2.h
+++ b/src/mess/includes/imds2.h
@@ -79,11 +79,12 @@ class imds2_state : public driver_device
required_device<beep_device> m_iocbeep;
required_device<pit8253_device> m_ioctimer;
required_device<i8271_device> m_iocfdc;
+ required_device<floppy_connector> m_flop0;
+ required_device<floppy_connector> m_flop1;
required_device<i8041_device> m_iocpio;
required_device<i8741_device> m_kbcpu;
required_device<palette_device> m_palette;
required_device<gfxdecode_device> m_gfxdecode;
- required_device<legacy_floppy_image_device> m_floppy0;
required_device<centronics_device> m_centronics;
required_ioport m_io_key0;
required_ioport m_io_key1;
@@ -101,6 +102,8 @@ class imds2_state : public driver_device
void imds2_update_beeper(void);
void imds2_update_printer(void);
+ int floppy_load(floppy_image_device *dev);
+ void floppy_unload(floppy_image_device *dev);
// IPC control port
UINT8 m_ipc_control;
diff --git a/src/mess/machine/bbc.c b/src/mess/machine/bbc.c
index 88ced246f43..3ffefc8a585 100644
--- a/src/mess/machine/bbc.c
+++ b/src/mess/machine/bbc.c
@@ -1439,6 +1439,12 @@ WRITE_LINE_MEMBER(bbc_state::bbc_i8271_interrupt)
m_previous_i8271_int_state = state;
}
+WRITE_LINE_MEMBER(bbc_state::motor_w)
+{
+ m_i8271->subdevice<floppy_connector>("0")->get_device()->mon_w(!state);
+ m_i8271->subdevice<floppy_connector>("1")->get_device()->mon_w(!state);
+}
+
/**************************************
WD1770 disc control function