restore my bbc changes (wtf did happen to them?)

This commit is contained in:
Dirk Best 2015-05-29 23:46:56 +02:00
parent 83e407f7bb
commit 0624b6efd0
6 changed files with 194 additions and 58 deletions

View File

@ -158,6 +158,8 @@ project "formats"
MAME_DIR .. "src/lib/formats/atarist_dsk.h",
MAME_DIR .. "src/lib/formats/atom_tap.c",
MAME_DIR .. "src/lib/formats/atom_tap.h",
MAME_DIR .. "src/lib/formats/bbc_dsk.c",
MAME_DIR .. "src/lib/formats/bbc_dsk.h",
MAME_DIR .. "src/lib/formats/bw2_dsk.c",
MAME_DIR .. "src/lib/formats/bw2_dsk.h",
MAME_DIR .. "src/lib/formats/bw12_dsk.c",

53
src/lib/formats/bbc_dsk.c Normal file
View File

@ -0,0 +1,53 @@
// license:GPL-2.0+
// copyright-holders:Dirk Best
/***************************************************************************
BBC Micro
Disk image format
***************************************************************************/
#include "bbc_dsk.h"
bbc_format::bbc_format() : wd177x_format(formats)
{
}
const char *bbc_format::name() const
{
return "bbc";
}
const char *bbc_format::description() const
{
return "BBC Micro disk image";
}
const char *bbc_format::extensions() const
{
return "bbc,img,ssd,dsd";
}
const bbc_format::format bbc_format::formats[] =
{
{ // 100k single sided single density
floppy_image::FF_525, floppy_image::SSSD, floppy_image::FM,
4000, 10, 40, 1, 256, {}, 0, {}, 16, 11, 19
},
{ // 200k double sided single density
floppy_image::FF_525, floppy_image::DSSD, floppy_image::FM,
4000, 10, 40, 2, 256, {}, 0, {}, 16, 11, 19
},
{ // 200k single sided double density
floppy_image::FF_525, floppy_image::SSQD, floppy_image::FM,
4000, 10, 80, 1, 256, {}, 0, {}, 16, 11, 19
},
{ // 400k double sided double density
floppy_image::FF_525, floppy_image::DSQD, floppy_image::FM,
4000, 10, 80, 2, 256, {}, 0, {}, 16, 11, 19
},
{}
};
const floppy_format_type FLOPPY_BBC_FORMAT = &floppy_image_format_creator<bbc_format>;

33
src/lib/formats/bbc_dsk.h Normal file
View File

@ -0,0 +1,33 @@
// license:GPL-2.0+
// copyright-holders:Dirk Best
/***************************************************************************
BBC Micro
Disk image format
***************************************************************************/
#pragma once
#ifndef __BBC_DSK_H__
#define __BBC_DSK_H__
#include "wd177x_dsk.h"
class bbc_format : public wd177x_format
{
public:
bbc_format();
virtual const char *name() const;
virtual const char *description() const;
virtual const char *extensions() const;
private:
static const format formats[];
};
extern const floppy_format_type FLOPPY_BBC_FORMAT;
#endif // __BBC_DSK_H__

View File

@ -57,6 +57,7 @@
/* Devices */
#include "imagedev/flopdrv.h"
#include "formats/bbc_dsk.h"
#include "formats/basicdsk.h"
#include "imagedev/cassette.h"
#include "formats/uef_cas.h"
@ -609,6 +610,19 @@ static const floppy_interface bbc_floppy_interface =
"floppy_5_25"
};
FLOPPY_FORMATS_MEMBER( bbc_state::floppy_formats )
FLOPPY_BBC_FORMAT
FLOPPY_FORMATS_END
static SLOT_INTERFACE_START( bbc_floppies )
SLOT_INTERFACE("sssd", FLOPPY_525_SSSD)
SLOT_INTERFACE("sd", FLOPPY_525_SD)
SLOT_INTERFACE("ssdd", FLOPPY_525_SSDD)
SLOT_INTERFACE("dd", FLOPPY_525_DD)
SLOT_INTERFACE("ssqd", FLOPPY_525_SSQD)
SLOT_INTERFACE("qd", FLOPPY_525_QD)
SLOT_INTERFACE_END
WRITE_LINE_MEMBER(bbc_state::econet_clk_w)
{
m_adlc->rxc_w(state);
@ -760,13 +774,15 @@ static MACHINE_CONFIG_DERIVED( bbcb, bbca )
MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, bbc_i8271_interrupt))
MCFG_I8271_FLOPPIES(FLOPPY_0, FLOPPY_1)
MCFG_DEVICE_ADD("wd177x", WD1770, 0)
MCFG_WD17XX_DEFAULT_DRIVE2_TAGS
MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w))
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface)
MCFG_WD1770x_ADD("wd177x", XTAL_16MHz / 2)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w))
MCFG_FLOPPY_DRIVE_ADD("wd177x:0", bbc_floppies, "qd", bbc_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("wd177x:1", bbc_floppies, "qd", bbc_state::floppy_formats)
/* software lists */
MCFG_DEVICE_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
@ -822,13 +838,15 @@ static MACHINE_CONFIG_DERIVED( bbcb_us, bbca )
MCFG_I8271_IRQ_CALLBACK(WRITELINE(bbc_state, bbc_i8271_interrupt))
MCFG_I8271_FLOPPIES(FLOPPY_0, FLOPPY_1)
MCFG_DEVICE_ADD("wd177x", WD1770, 0)
MCFG_WD17XX_DEFAULT_DRIVE2_TAGS
MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w))
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface)
MCFG_WD1770x_ADD("wd177x", XTAL_16MHz / 2)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w))
MCFG_FLOPPY_DRIVE_ADD("wd177x:0", bbc_floppies, "qd", bbc_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("wd177x:1", bbc_floppies, "qd", bbc_state::floppy_formats)
/* software lists */
MCFG_DEVICE_REMOVE("cass_ls_a")
MCFG_SOFTWARE_LIST_ADD("cass_ls_b", "bbcb_cass")
@ -852,6 +870,8 @@ static MACHINE_CONFIG_DERIVED( bbcbp, bbcb )
/* fdc */
MCFG_DEVICE_REMOVE("i8271")
MCFG_DEVICE_REMOVE(FLOPPY_0)
MCFG_DEVICE_REMOVE(FLOPPY_1)
MACHINE_CONFIG_END
@ -981,12 +1001,12 @@ static MACHINE_CONFIG_START( bbcm, bbc_state )
MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_user_irq_w))
/* fdc */
MCFG_DEVICE_ADD("wd177x", WD1770, 0)
MCFG_WD17XX_DEFAULT_DRIVE2_TAGS
MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w))
MCFG_WD1770x_ADD("wd177x", XTAL_16MHz / 2)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w))
MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(bbc_floppy_interface)
MCFG_FLOPPY_DRIVE_ADD("wd177x:0", bbc_floppies, "qd", bbc_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("wd177x:1", bbc_floppies, "qd", bbc_state::floppy_formats)
/* econet */
MCFG_DEVICE_ADD("mc6854", MC6854, 0)
@ -1068,10 +1088,14 @@ static MACHINE_CONFIG_DERIVED( bbcmc, bbcm )
/* fdc */
MCFG_DEVICE_REMOVE("wd177x")
MCFG_DEVICE_ADD("wd177x", WD1772, 0)
MCFG_WD17XX_DEFAULT_DRIVE2_TAGS
MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w))
// MCFG_WD1772x_ADD("wd177x", XTAL_16MHz / 2)
MCFG_WD1770x_ADD("wd177x", XTAL_16MHz / 2)
MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_intrq_w))
MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(bbc_state, bbc_wd177x_drq_w))
MCFG_FLOPPY_DRIVE_ADD("wd177x:0", bbc_floppies, "qd", bbc_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD("wd177x:1", bbc_floppies, "qd", bbc_state::floppy_formats)
/* software lists */
MCFG_SOFTWARE_LIST_REMOVE("cart_ls_m")

View File

@ -20,7 +20,7 @@
#include "machine/mc6854.h"
#include "machine/ram.h"
#include "machine/i8271.h"
#include "machine/wd17xx.h"
#include "machine/wd_fdc.h"
#include "machine/upd7002.h"
#include "video/mc6845.h"
#include "video/saa5050.h"
@ -80,6 +80,8 @@ public:
m_palette(*this, "palette")
{ }
DECLARE_FLOPPY_FORMATS(floppy_formats);
DECLARE_WRITE8_MEMBER(bbc_page_selecta_w);
DECLARE_WRITE8_MEMBER(bbc_memorya1_w);
DECLARE_WRITE8_MEMBER(bbc_page_selectb_w);

View File

@ -17,6 +17,7 @@
#include "cpu/m6502/m6502.h"
#include "sound/tms5220.h"
#include "machine/6522via.h"
#include "machine/wd_fdc.h"
#include "imagedev/flopdrv.h"
#include "includes/bbc.h"
#include "machine/mc146818.h"
@ -1575,7 +1576,7 @@ void bbc_state::bbc_update_fdq_int(int state)
/* do not trigger int */
bbc_state = 0;
}
//printf("bbc_state %d prev %d\n", bbc_state, m_previous_wd177x_int_state);
/* nmi is edge triggered, and triggers when the state goes from clear->set.
Here we are checking this transition before triggering the nmi */
if (bbc_state!=m_previous_wd177x_int_state)
@ -1593,6 +1594,7 @@ void bbc_state::bbc_update_fdq_int(int state)
WRITE_LINE_MEMBER(bbc_state::bbc_wd177x_intrq_w)
{
//printf("bbc_wd177x_intrq_w %d \n", state);
m_wd177x_irq_state = state;
bbc_update_fdq_int(state);
}
@ -1605,20 +1607,28 @@ WRITE_LINE_MEMBER(bbc_state::bbc_wd177x_drq_w)
WRITE8_MEMBER(bbc_state::bbc_wd177x_status_w)
{
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device();
floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device();
floppy_image_device *floppy = NULL;
m_drive_control = data;
/* set drive */
if ((data>>0) & 0x01) fdc->set_drive(0);
if ((data>>1) & 0x01) fdc->set_drive(1);
// bit 0, 1: drive select
if (BIT(data, 0)) floppy = floppy0;
if (BIT(data, 1)) floppy = floppy1;
/* set side */
fdc->set_side((data>>2) & 0x01);
fdc->set_floppy(floppy);
/* set density */
// bit 2: side select
if (floppy)
floppy->ss_w(BIT(data, 2));
// bit 3: density
fdc->dden_w(BIT(data, 3));
m_1770_IntEnabled=(((data>>4) & 0x01)==0);
// bit 4: interrupt enable
m_1770_IntEnabled = !BIT(data, 4);
}
@ -1626,7 +1636,7 @@ WRITE8_MEMBER(bbc_state::bbc_wd177x_status_w)
READ8_MEMBER(bbc_state::bbc_wd1770_read)
{
int retval=0xff;
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
switch (offset)
{
case 4:
@ -1644,22 +1654,22 @@ READ8_MEMBER(bbc_state::bbc_wd1770_read)
default:
break;
}
logerror("wd177x read: $%02X $%02X\n", offset,retval);
//logerror("wd177x read: $%02X $%02X\n", offset,retval);
return retval;
}
WRITE8_MEMBER(bbc_state::bbc_wd1770_write)
{
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
logerror("wd177x write: $%02X $%02X\n", offset,data);
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
//logerror("wd177x write: $%02X $%02X\n", offset,data);
switch (offset)
{
case 0:
bbc_wd177x_status_w(space, 0, data);
break;
case 4:
fdc->command_w(space, 0, data);
fdc->cmd_w(space, 0, data);
break;
case 5:
fdc->track_w(space, 0, data);
@ -1714,26 +1724,34 @@ AM_RANGE(0xfc00, 0xfdff) AM_READWRITE(bbc_opus_read , bbc_opus_write )
WRITE8_MEMBER(bbc_state::bbc_opus_status_w)
{
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device();
floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device();
floppy_image_device *floppy = NULL;
m_drive_control = data;
/* set drive */
if ((data>>1) & 0x01) fdc->set_drive(0);
if ((data>>2) & 0x01) fdc->set_drive(1);
// bit 1, 2: drive select
if (BIT(data, 1)) floppy = floppy0;
if (BIT(data, 2)) floppy = floppy1;
/* set side */
fdc->set_side((data>>0) & 0x01);
fdc->set_floppy(floppy);
/* set density */
// bit 0: side select
if (floppy)
floppy->ss_w(BIT(data, 0));
// bit 5: density
fdc->dden_w(BIT(data, 5));
m_1770_IntEnabled=(data>>4) & 0x01;
// bit 4: interrupt enable
m_1770_IntEnabled = BIT(data, 4);
}
READ8_MEMBER(bbc_state::bbc_opus_read)
{
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
logerror("wd177x read: $%02X\n", offset);
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
//logerror("wd177x read: $%02X\n", offset);
if (m_DFSType==6)
{
@ -1761,8 +1779,8 @@ READ8_MEMBER(bbc_state::bbc_opus_read)
WRITE8_MEMBER(bbc_state::bbc_opus_write)
{
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
logerror("wd177x write: $%02X $%02X\n", offset,data);
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
//logerror("wd177x write: $%02X $%02X\n", offset,data);
if (m_DFSType==6)
{
@ -1771,7 +1789,7 @@ WRITE8_MEMBER(bbc_state::bbc_opus_write)
switch (offset)
{
case 0xf8:
fdc->command_w(space, 0, data);
fdc->cmd_w(space, 0, data);
break;
case 0xf9:
fdc->track_w(space, 0, data);
@ -1809,7 +1827,7 @@ BBC MASTER DISC SUPPORT
READ8_MEMBER(bbc_state::bbcm_wd1770_read)
{
int retval=0xff;
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
switch (offset)
{
case 0:
@ -1833,12 +1851,12 @@ READ8_MEMBER(bbc_state::bbcm_wd1770_read)
WRITE8_MEMBER(bbc_state::bbcm_wd1770_write)
{
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
//logerror("wd177x write: $%02X $%02X\n", offset,data);
switch (offset)
{
case 0:
fdc->command_w(space, 0, data);
fdc->cmd_w(space, 0, data);
break;
case 1:
fdc->track_w(space, 0, data);
@ -1862,22 +1880,26 @@ READ8_MEMBER(bbc_state::bbcm_wd1770l_read)
WRITE8_MEMBER(bbc_state::bbcm_wd1770l_write)
{
wd1770_device *fdc = machine().device<wd1770_device>("wd177x");
wd1770_t *fdc = machine().device<wd1770_t>("wd177x");
floppy_image_device *floppy0 = machine().device<floppy_connector>("wd177x:0")->get_device();
floppy_image_device *floppy1 = machine().device<floppy_connector>("wd177x:1")->get_device();
floppy_image_device *floppy = NULL;
m_drive_control = data;
/* set drive */
if ((data>>0) & 0x01) fdc->set_drive(0);
if ((data>>1) & 0x01) fdc->set_drive(1);
// bit 0, 1: drive select
if (BIT(data, 0)) floppy = floppy0;
if (BIT(data, 1)) floppy = floppy1;
/* set side */
fdc->set_side((data>>4) & 0x01);
// bit 4: side select
if (floppy)
floppy->ss_w(BIT(data, 4));
/* set density */
// bit 5: density
fdc->dden_w(BIT(data, 5));
// m_1770_IntEnabled=(((data>>4) & 0x01)==0);
m_1770_IntEnabled=1;
}