(MESS) fp: Floppy modernization. (nw)

This commit is contained in:
Curt Coder 2012-12-18 15:36:17 +00:00
parent a526f94bfa
commit 394ee300e4
2 changed files with 153 additions and 106 deletions

View File

@ -74,7 +74,7 @@ static const mc6845_interface crtc_intf =
void fp_state::video_start() void fp_state::video_start()
{ {
// allocate memory // allocate memory
m_video_ram = auto_alloc_array(machine(), UINT16, 0x20000); m_video_ram.allocate(0x20000);
} }
@ -124,26 +124,30 @@ READ8_MEMBER( fp_state::prtr_snd_r )
{ {
/* /*
bit description bit description
0 BUSY 0 BUSY
1 SE 1 SE
2 _FAULT 2 _FAULT
3 PE 3 PE
4 LP23 4 LP23
5 DCNG-L 5 DCNG-L
6 J9 1-2 6 J9 1-2
7 J9 3-4 7 J9 3-4
*/ */
UINT8 data = 0; UINT8 data = 0;
// centronics
data |= m_centronics->busy_r(); data |= m_centronics->busy_r();
data |= m_centronics->vcc_r() << 1; data |= m_centronics->vcc_r() << 1;
data |= m_centronics->fault_r() << 2; data |= m_centronics->fault_r() << 2;
data |= m_centronics->pe_r() << 3; data |= m_centronics->pe_r() << 3;
// floppy
data |= (m_floppy ? m_floppy->dskchg_r() : 1) << 5;
return data; return data;
} }
@ -169,18 +173,18 @@ WRITE8_MEMBER( fp_state::palette_w )
{ {
/* /*
bit description bit description
0 B 0 B
1 G 1 G
2 R 2 R
3 I 3 I
4 index 4 index
5 index 5 index
6 index 6 index
7 index 7 index
*/ */
} }
@ -188,30 +192,58 @@ WRITE16_MEMBER( fp_state::video_w )
{ {
/* /*
bit description bit description
0 CRTRES-H 0 CRTRES-H
1 SEL1 1 SEL1
2 DON-H 2 DON-H
3 LCDON-H 3 LCDON-H
4 SEL2 4 SEL2
5 L3 even access 5 L3 even access
6 L2 odd access 6 L2 odd access
7 L1 video RAM enable 7 L1 video RAM enable
8 8
9 STOP LED 9 STOP LED
10 POWER LED 10 POWER LED
11 SHIFT LOCK LED 11 SHIFT LOCK LED
12 DISK LED 12 DISK LED
13 VOICE LED 13 VOICE LED
14 COLOUR SELECT LED 14 COLOUR SELECT LED
15 CAPS LOCK LED 15 CAPS LOCK LED
*/ */
m_video = data & 0xff; m_video = data & 0xff;
} }
void fp_state::lat_ls259_w(offs_t offset, int state)
{
switch (offset)
{
case 0:
{
m_floppy = NULL;
if (state) m_floppy = m_floppy0->get_device();
else m_floppy = m_floppy1->get_device();
m_fdc->set_floppy(m_floppy);
if (m_floppy)
{
m_floppy->set_rpm(600);
m_floppy->mon_w(0);
}
}
break;
}
}
WRITE8_MEMBER( fp_state::lat_w )
{
lat_ls259_w((offset >> 1) & 0x07, BIT(data, 0));
}
READ16_MEMBER( fp_state::mem_r ) READ16_MEMBER( fp_state::mem_r )
{ {
@ -312,7 +344,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( fp_io, AS_IO, 16, fp_state ) static ADDRESS_MAP_START( fp_io, AS_IO, 16, fp_state )
ADDRESS_MAP_UNMAP_HIGH ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x000, 0x007) AM_DEVREADWRITE8_LEGACY(WD2797_TAG, wd17xx_r, wd17xx_w, 0x00ff) AM_RANGE(0x000, 0x007) AM_DEVREADWRITE8(WD2797_TAG, wd2797_t, read, write, 0x00ff)
AM_RANGE(0x008, 0x00f) AM_DEVREADWRITE8_LEGACY(I8253A5_TAG, pit8253_r, pit8253_w, 0x00ff) AM_RANGE(0x008, 0x00f) AM_DEVREADWRITE8_LEGACY(I8253A5_TAG, pit8253_r, pit8253_w, 0x00ff)
AM_RANGE(0x018, 0x01f) AM_DEVREADWRITE8_LEGACY(Z80SIO0_TAG, z80dart_ba_cd_r, z80dart_ba_cd_w, 0x00ff) AM_RANGE(0x018, 0x01f) AM_DEVREADWRITE8_LEGACY(Z80SIO0_TAG, z80dart_ba_cd_r, z80dart_ba_cd_w, 0x00ff)
AM_RANGE(0x020, 0x021) AM_DEVWRITE8(CENTRONICS_TAG, centronics_device, write, 0x00ff) AM_RANGE(0x020, 0x021) AM_DEVWRITE8(CENTRONICS_TAG, centronics_device, write, 0x00ff)
@ -445,8 +477,8 @@ static I8237_INTERFACE( dmac_intf )
DEVCB_DEVICE_LINE(I8259A_TAG, pic8259_ir7_w), DEVCB_DEVICE_LINE(I8259A_TAG, pic8259_ir7_w),
DEVCB_NULL, DEVCB_NULL,
DEVCB_NULL, DEVCB_NULL,
{ DEVCB_NULL, DEVCB_DEVICE_HANDLER(WD2797_TAG, wd17xx_data_r), DEVCB_NULL, DEVCB_NULL }, { DEVCB_NULL, DEVCB_DEVICE_MEMBER(WD2797_TAG, wd_fdc_t, data_r), DEVCB_NULL, DEVCB_NULL },
{ DEVCB_NULL, DEVCB_DEVICE_HANDLER(WD2797_TAG, wd17xx_data_w), DEVCB_NULL, DEVCB_NULL }, { DEVCB_NULL, DEVCB_DEVICE_MEMBER(WD2797_TAG, wd_fdc_t, data_w), DEVCB_NULL, DEVCB_NULL },
{ DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL } { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }
}; };
@ -481,35 +513,29 @@ static Z80DART_INTERFACE( sio_intf )
// wd17xx_interface fdc_intf // wd17xx_interface fdc_intf
//------------------------------------------------- //-------------------------------------------------
static SLOT_INTERFACE_START( fp_floppies )
SLOT_INTERFACE( "35dd", FLOPPY_35_DD ) // Sony OA-D32W (600 rpm)
SLOT_INTERFACE_END
/*
static LEGACY_FLOPPY_OPTIONS_START( act ) static LEGACY_FLOPPY_OPTIONS_START( act )
LEGACY_FLOPPY_OPTION( img2hd, "dsk", "2HD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, LEGACY_FLOPPY_OPTION( img2hd, "dsk", "2HD disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
HEADS([2]) HEADS([2])
TRACKS([80]) TRACKS([80])
SECTORS([16]) SECTORS([16])
SECTOR_LENGTH([256]) SECTOR_LENGTH([256])
FIRST_SECTOR_ID([1])) FIRST_SECTOR_ID([1]))
LEGACY_FLOPPY_OPTIONS_END LEGACY_FLOPPY_OPTIONS_END
*/
static const floppy_interface act_floppy_interface = void fp_state::fdc_intrq_w(bool state)
{ {
DEVCB_NULL, m_pic->ir1_w(state);
DEVCB_NULL, }
DEVCB_NULL,
DEVCB_NULL,
DEVCB_NULL,
FLOPPY_STANDARD_3_5_DSDD, // Sony OA-D32W
LEGACY_FLOPPY_OPTIONS_NAME(act),
"floppy_3_5",
NULL
};
static const wd17xx_interface fdc_intf = void fp_state::fdc_drq_w(bool state)
{ {
DEVCB_LINE_GND, m_dmac->dreq1_w(state);
DEVCB_DEVICE_LINE(I8259A_TAG, pic8259_ir1_w), }
DEVCB_DEVICE_LINE_MEMBER(I8237_TAG, am9517a_device, dreq1_w),
{ FLOPPY_0, NULL, NULL, NULL }
};
//------------------------------------------------- //-------------------------------------------------
@ -518,7 +544,7 @@ static const wd17xx_interface fdc_intf =
WRITE_LINE_MEMBER( fp_state::busy_w ) WRITE_LINE_MEMBER( fp_state::busy_w )
{ {
if (!state) pic8259_ir6_w(m_pic, ASSERT_LINE); if (!state) pic8259_ir6_w(m_pic, ASSERT_LINE);
} }
static const centronics_interface centronics_intf = static const centronics_interface centronics_intf =
@ -542,7 +568,7 @@ static const centronics_interface centronics_intf =
static const sn76496_config psg_intf = static const sn76496_config psg_intf =
{ {
DEVCB_NULL DEVCB_NULL
}; };
@ -556,11 +582,15 @@ static const sn76496_config psg_intf =
void fp_state::machine_start() void fp_state::machine_start()
{ {
// floppy callbacks
m_fdc->setup_intrq_cb(wd_fdc_t::line_cb(FUNC(fp_state::fdc_intrq_w), this));
m_fdc->setup_drq_cb(wd_fdc_t::line_cb(FUNC(fp_state::fdc_drq_w), this));
// register CPU IRQ callback // register CPU IRQ callback
m_maincpu->set_irq_acknowledge_callback(fp_irq_callback); m_maincpu->set_irq_acknowledge_callback(fp_irq_callback);
// allocate memory // allocate memory
m_work_ram = auto_alloc_array(machine(), UINT16, m_ram->size() / 2); m_work_ram.allocate(m_ram->size() / 2);
} }
@ -571,6 +601,13 @@ void fp_state::machine_start()
void fp_state::machine_reset() void fp_state::machine_reset()
{ {
m_video = 0; m_video = 0;
m_fdc->dden_w(0);
for (offs_t offset = 0; offset < 7; offset++)
{
lat_ls259_w(offset, 0);
}
} }
@ -627,8 +664,9 @@ static MACHINE_CONFIG_START( fp, fp_state )
MCFG_PIC8259_ADD(I8259A_TAG, pic_intf) MCFG_PIC8259_ADD(I8259A_TAG, pic_intf)
MCFG_PIT8253_ADD(I8253A5_TAG, pit_intf) MCFG_PIT8253_ADD(I8253A5_TAG, pit_intf)
MCFG_Z80DART_ADD(Z80SIO0_TAG, 2500000, sio_intf) MCFG_Z80DART_ADD(Z80SIO0_TAG, 2500000, sio_intf)
MCFG_WD2797_ADD(WD2797_TAG, fdc_intf) MCFG_WD2797x_ADD(WD2797_TAG, 2000000)
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(act_floppy_interface) MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":0", fp_floppies, "35dd", NULL, floppy_image_device::default_floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD2797_TAG":1", fp_floppies, NULL, NULL, floppy_image_device::default_floppy_formats)
MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, centronics_intf) MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, centronics_intf)
/* internal ram */ /* internal ram */
@ -649,8 +687,8 @@ MACHINE_CONFIG_END
ROM_START( fp ) ROM_START( fp )
ROM_REGION( 0x8000, I8086_TAG, 0 ) ROM_REGION( 0x8000, I8086_TAG, 0 )
ROM_LOAD16_BYTE( "lo_fp_3.1.ic20", 0x0000, 0x4000, CRC(0572add2) SHA1(c7ab0e5ced477802e37f9232b5673f276b8f5623) ) // Labelled 11212721 F97E PORT LO VR 3.1 ROM_LOAD16_BYTE( "lo_fp_3.1.ic20", 0x0000, 0x4000, CRC(0572add2) SHA1(c7ab0e5ced477802e37f9232b5673f276b8f5623) ) // Labelled 11212721 F97E PORT LO VR 3.1
ROM_LOAD16_BYTE( "hi_fp_3.1.ic9", 0x0001, 0x4000, CRC(3903674b) SHA1(8418682dcc0c52416d7d851760fea44a3cf2f914) ) // Labelled 11212721 BD2D PORT HI VR 3.1 ROM_LOAD16_BYTE( "hi_fp_3.1.ic9", 0x0001, 0x4000, CRC(3903674b) SHA1(8418682dcc0c52416d7d851760fea44a3cf2f914) ) // Labelled 11212721 BD2D PORT HI VR 3.1
ROM_REGION( 0x1000, HD63B01V1_TAG, 0 ) ROM_REGION( 0x1000, HD63B01V1_TAG, 0 )
ROM_LOAD( "voice interface hd63b01v01.ic29", 0x0000, 0x1000, NO_DUMP ) ROM_LOAD( "voice interface hd63b01v01.ic29", 0x0000, 0x1000, NO_DUMP )

View File

@ -7,15 +7,13 @@
#include "emu.h" #include "emu.h"
#include "cpu/i86/i86.h" #include "cpu/i86/i86.h"
#include "cpu/m6800/m6800.h" #include "cpu/m6800/m6800.h"
#include "formats/basicdsk.h"
#include "imagedev/flopdrv.h"
#include "machine/am9517a.h" #include "machine/am9517a.h"
#include "machine/apricotkb.h" #include "machine/apricotkb.h"
#include "machine/ctronics.h" #include "machine/ctronics.h"
#include "machine/pic8259.h" #include "machine/pic8259.h"
#include "machine/pit8253.h" #include "machine/pit8253.h"
#include "machine/ram.h" #include "machine/ram.h"
#include "machine/wd17xx.h" #include "machine/wd_fdc.h"
#include "machine/z80dart.h" #include "machine/z80dart.h"
#include "sound/sn76496.h" #include "sound/sn76496.h"
#include "video/mc6845.h" #include "video/mc6845.h"
@ -27,22 +25,22 @@
// MACROS / CONSTANTS // MACROS / CONSTANTS
//************************************************************************** //**************************************************************************
#define I8086_TAG "ic7" #define I8086_TAG "ic7"
#define I8284_TAG "ic30" #define I8284_TAG "ic30"
#define I8237_TAG "ic17" #define I8237_TAG "ic17"
#define I8259A_TAG "ic51" #define I8259A_TAG "ic51"
#define I8253A5_TAG "ic20" #define I8253A5_TAG "ic20"
#define TMS4500_TAG "ic42" #define TMS4500_TAG "ic42"
#define MC6845_TAG "ic69" #define MC6845_TAG "ic69"
#define HD63B01V1_TAG "ic29" #define HD63B01V1_TAG "ic29"
#define AD7574_TAG "ic34" #define AD7574_TAG "ic34"
#define AD1408_TAG "ic37" #define AD1408_TAG "ic37"
#define Z80SIO0_TAG "ic6" #define Z80SIO0_TAG "ic6"
#define WD2797_TAG "ic5" #define WD2797_TAG "ic5"
#define SN76489AN_TAG "ic13" #define SN76489AN_TAG "ic13"
#define CENTRONICS_TAG "centronics" #define CENTRONICS_TAG "centronics"
#define SCREEN_LCD_TAG "screen0" #define SCREEN_LCD_TAG "screen0"
#define SCREEN_CRT_TAG "screen1" #define SCREEN_CRT_TAG "screen1"
@ -57,17 +55,21 @@ class fp_state : public driver_device
public: public:
fp_state(const machine_config &mconfig, device_type type, const char *tag) fp_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag),
m_maincpu(*this, I8086_TAG), m_maincpu(*this, I8086_TAG),
m_soundcpu(*this, HD63B01V1_TAG), m_soundcpu(*this, HD63B01V1_TAG),
m_dmac(*this, I8237_TAG), m_dmac(*this, I8237_TAG),
m_pic(*this, I8259A_TAG), m_pic(*this, I8259A_TAG),
m_pit(*this, I8253A5_TAG), m_pit(*this, I8253A5_TAG),
m_sio(*this, Z80SIO0_TAG), m_sio(*this, Z80SIO0_TAG),
m_fdc(*this, WD2797_TAG), m_fdc(*this, WD2797_TAG),
m_crtc(*this, MC6845_TAG), m_crtc(*this, MC6845_TAG),
m_ram(*this, RAM_TAG), m_ram(*this, RAM_TAG),
m_floppy0(*this, FLOPPY_0), m_floppy0(*this, WD2797_TAG":0"),
m_centronics(*this, CENTRONICS_TAG) m_floppy1(*this, WD2797_TAG":1"),
m_floppy(NULL),
m_centronics(*this, CENTRONICS_TAG),
m_work_ram(*this, "work_ram"),
m_video_ram(*this, "video_ram")
{ } { }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
@ -76,10 +78,12 @@ public:
required_device<pic8259_device> m_pic; required_device<pic8259_device> m_pic;
required_device<pit8253_device> m_pit; required_device<pit8253_device> m_pit;
required_device<z80dart_device> m_sio; required_device<z80dart_device> m_sio;
required_device<wd2797_device> m_fdc; required_device<wd2797_t> m_fdc;
required_device<mc6845_device> m_crtc; required_device<mc6845_device> m_crtc;
required_device<ram_device> m_ram; required_device<ram_device> m_ram;
required_device<legacy_floppy_image_device> m_floppy0; required_device<floppy_connector> m_floppy0;
required_device<floppy_connector> m_floppy1;
floppy_image_device *m_floppy;
required_device<centronics_device> m_centronics; required_device<centronics_device> m_centronics;
virtual void machine_start(); virtual void machine_start();
@ -96,12 +100,17 @@ public:
DECLARE_WRITE8_MEMBER( contrast_w ); DECLARE_WRITE8_MEMBER( contrast_w );
DECLARE_WRITE8_MEMBER( palette_w ); DECLARE_WRITE8_MEMBER( palette_w );
DECLARE_WRITE16_MEMBER( video_w ); DECLARE_WRITE16_MEMBER( video_w );
DECLARE_WRITE8_MEMBER( lat_w );
DECLARE_WRITE_LINE_MEMBER( busy_w ); DECLARE_WRITE_LINE_MEMBER( busy_w );
void fdc_intrq_w(bool state);
void fdc_drq_w(bool state);
UINT16 *m_work_ram; void lat_ls259_w(offs_t offset, int state);
optional_shared_ptr<UINT16> m_work_ram;
// video state // video state
UINT16 *m_video_ram; optional_shared_ptr<UINT16> m_video_ram;
UINT8 m_video; UINT8 m_video;
}; };