Added specialist mx custom format handling (nw)
This commit is contained in:
parent
f356f30e6e
commit
0716e22259
@ -1,159 +1,74 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
Copyright Olivier Galibert
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are
|
||||||
|
met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
* Neither the name 'MAME' nor the names of its contributors may be
|
||||||
|
used to endorse or promote products derived from this software
|
||||||
|
without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
|
||||||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
|
||||||
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||||
|
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
|
|
||||||
formats/smx_dsk.c
|
formats/smx_dsk.c
|
||||||
|
|
||||||
Specialist MX disk images
|
Specialist MX format
|
||||||
|
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
#include <string.h>
|
#include "emu.h"
|
||||||
|
#include "formats/smx_dsk.h"
|
||||||
|
|
||||||
#include "smx_dsk.h"
|
smx_format::smx_format() : wd177x_format(formats)
|
||||||
#include "basicdsk.h"
|
|
||||||
|
|
||||||
static FLOPPY_IDENTIFY(smx_dsk_identify)
|
|
||||||
{
|
{
|
||||||
*vote = (floppy_image_size(floppy) == 819200) ? 100 : 0;
|
|
||||||
return FLOPPY_ERROR_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smx_get_heads_per_disk(floppy_image_legacy *floppy)
|
const char *smx_format::name() const
|
||||||
{
|
{
|
||||||
return 2;
|
return "smx";
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smx_get_tracks_per_disk(floppy_image_legacy *floppy)
|
const char *smx_format::description() const
|
||||||
{
|
{
|
||||||
return 80;
|
return "Specialist MX disk image";
|
||||||
}
|
}
|
||||||
|
|
||||||
static UINT64 smx_translate_offset(floppy_image_legacy *floppy,
|
const char *smx_format::extensions() const
|
||||||
int track, int head, int sector)
|
|
||||||
{
|
{
|
||||||
return (track * 1024 * 5 * 2) + (head * 1024 * 5) + 1024 * sector;
|
return "odi";
|
||||||
}
|
}
|
||||||
|
|
||||||
static floperr_t get_offset(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, UINT64 *offset)
|
// Unverified gap sizes
|
||||||
|
const smx_format::format smx_format::formats[] =
|
||||||
{
|
{
|
||||||
UINT64 offs;
|
{ // 720K 5.25 inch
|
||||||
/* translate the sector to a raw sector */
|
floppy_image::FF_525, floppy_image::DSQD,
|
||||||
if (!sector_is_index)
|
2000, 5, 80, 2, 1024, {}, 1, {}, 100, 22, 20
|
||||||
{
|
},
|
||||||
sector -= 1;
|
{}
|
||||||
}
|
};
|
||||||
/* check to see if we are out of range */
|
|
||||||
if ((head < 0) || (head >= 2) || (track < 0) || (track >= 80)
|
|
||||||
|| (sector < 0) || (sector >= 6))
|
|
||||||
return FLOPPY_ERROR_SEEKERROR;
|
|
||||||
|
|
||||||
offs = smx_translate_offset(floppy, track, head, sector);
|
const floppy_format_type FLOPPY_SMX_FORMAT = &floppy_image_format_creator<smx_format>;
|
||||||
if (offset)
|
|
||||||
*offset = offs;
|
|
||||||
return FLOPPY_ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static floperr_t internal_smx_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, void *buffer, size_t buflen)
|
|
||||||
{
|
|
||||||
UINT64 offset;
|
|
||||||
floperr_t err;
|
|
||||||
err = get_offset(floppy, head, track, sector, sector_is_index, &offset);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
floppy_image_read(floppy, buffer, offset, buflen);
|
|
||||||
return FLOPPY_ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static floperr_t internal_smx_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, const void *buffer, size_t buflen, int ddam)
|
|
||||||
{
|
|
||||||
UINT64 offset;
|
|
||||||
floperr_t err;
|
|
||||||
|
|
||||||
err = get_offset(floppy, head, track, sector, sector_is_index, &offset);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
floppy_image_write(floppy, buffer, offset, buflen);
|
|
||||||
return FLOPPY_ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static floperr_t smx_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen)
|
|
||||||
{
|
|
||||||
return internal_smx_read_sector(floppy, head, track, sector, FALSE, buffer, buflen);
|
|
||||||
}
|
|
||||||
|
|
||||||
static floperr_t smx_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam)
|
|
||||||
{
|
|
||||||
return internal_smx_write_sector(floppy, head, track, sector, FALSE, buffer, buflen, ddam);
|
|
||||||
}
|
|
||||||
|
|
||||||
static floperr_t smx_read_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen)
|
|
||||||
{
|
|
||||||
return internal_smx_read_sector(floppy, head, track, sector, TRUE, buffer, buflen);
|
|
||||||
}
|
|
||||||
|
|
||||||
static floperr_t smx_write_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam)
|
|
||||||
{
|
|
||||||
return internal_smx_write_sector(floppy, head, track, sector, TRUE, buffer, buflen, ddam);
|
|
||||||
}
|
|
||||||
|
|
||||||
static floperr_t smx_get_sector_length(floppy_image_legacy *floppy, int head, int track, int sector, UINT32 *sector_length)
|
|
||||||
{
|
|
||||||
floperr_t err;
|
|
||||||
err = get_offset(floppy, head, track, sector, FALSE, NULL);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
|
|
||||||
if (sector_length) {
|
|
||||||
*sector_length = 1024;
|
|
||||||
}
|
|
||||||
return FLOPPY_ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static floperr_t smx_get_indexed_sector_info(floppy_image_legacy *floppy, int head, int track, int sector_index, int *cylinder, int *side, int *sector, UINT32 *sector_length, unsigned long *flags)
|
|
||||||
{
|
|
||||||
sector_index += 1;
|
|
||||||
if (cylinder)
|
|
||||||
*cylinder = track;
|
|
||||||
if (side)
|
|
||||||
*side = head;
|
|
||||||
if (sector)
|
|
||||||
*sector = sector_index;
|
|
||||||
if (flags)
|
|
||||||
/* TODO: read DAM or DDAM and determine flags */
|
|
||||||
*flags = 0;
|
|
||||||
return smx_get_sector_length(floppy, head, track, sector_index, sector_length);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static FLOPPY_CONSTRUCT(smx_dsk_construct)
|
|
||||||
{
|
|
||||||
struct FloppyCallbacks *callbacks;
|
|
||||||
callbacks = floppy_callbacks(floppy);
|
|
||||||
callbacks->read_sector = smx_read_sector;
|
|
||||||
callbacks->write_sector = smx_write_sector;
|
|
||||||
callbacks->read_indexed_sector = smx_read_indexed_sector;
|
|
||||||
callbacks->write_indexed_sector = smx_write_indexed_sector;
|
|
||||||
callbacks->get_sector_length = smx_get_sector_length;
|
|
||||||
callbacks->get_heads_per_disk = smx_get_heads_per_disk;
|
|
||||||
callbacks->get_tracks_per_disk = smx_get_tracks_per_disk;
|
|
||||||
callbacks->get_indexed_sector_info = smx_get_indexed_sector_info;
|
|
||||||
|
|
||||||
return FLOPPY_ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
LEGACY_FLOPPY_OPTIONS_START( specimx )
|
|
||||||
LEGACY_FLOPPY_OPTION( smx_dsk, "odi", "Specialist MX floppy disk image", smx_dsk_identify, smx_dsk_construct, NULL, NULL)
|
|
||||||
LEGACY_FLOPPY_OPTIONS_END
|
|
||||||
|
@ -2,17 +2,27 @@
|
|||||||
|
|
||||||
formats/smx_dsk.h
|
formats/smx_dsk.h
|
||||||
|
|
||||||
SVI318 disk images
|
Specialist MX disk images
|
||||||
|
|
||||||
*********************************************************************/
|
*********************************************************************/
|
||||||
|
|
||||||
#ifndef SMX_DSK_H
|
#ifndef SMX_DSK_H_
|
||||||
#define SMX_DSK_H
|
#define SMX_DSK_H_
|
||||||
|
|
||||||
#include "flopimg.h"
|
#include "wd177x_dsk.h"
|
||||||
|
|
||||||
/**************************************************************************/
|
class smx_format : public wd177x_format {
|
||||||
|
public:
|
||||||
|
smx_format();
|
||||||
|
|
||||||
LEGACY_FLOPPY_OPTIONS_EXTERN(specimx);
|
virtual const char *name() const;
|
||||||
|
virtual const char *description() const;
|
||||||
|
virtual const char *extensions() const;
|
||||||
|
|
||||||
#endif /* SVI_DSK_H */
|
private:
|
||||||
|
static const format formats[];
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const floppy_format_type FLOPPY_SMX_FORMAT;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -379,6 +379,10 @@ static const cassette_interface special_cassette_interface =
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
FLOPPY_FORMATS_MEMBER( special_state::specimx_floppy_formats )
|
||||||
|
FLOPPY_SMX_FORMAT
|
||||||
|
FLOPPY_FORMATS_END
|
||||||
|
|
||||||
static SLOT_INTERFACE_START( specimx_floppies )
|
static SLOT_INTERFACE_START( specimx_floppies )
|
||||||
SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
|
SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
|
||||||
SLOT_INTERFACE_END
|
SLOT_INTERFACE_END
|
||||||
@ -446,8 +450,8 @@ static MACHINE_CONFIG_DERIVED( specimx, special )
|
|||||||
/* Devices */
|
/* Devices */
|
||||||
MCFG_FD1793x_ADD("fd1793", XTAL_8MHz / 8)
|
MCFG_FD1793x_ADD("fd1793", XTAL_8MHz / 8)
|
||||||
|
|
||||||
MCFG_FLOPPY_DRIVE_ADD("fd0", specimx_floppies, "525dd", 0, floppy_image_device::default_floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("fd0", specimx_floppies, "525dd", 0, special_state::specimx_floppy_formats)
|
||||||
MCFG_FLOPPY_DRIVE_ADD("fd1", specimx_floppies, "525dd", 0, floppy_image_device::default_floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("fd1", specimx_floppies, "525dd", 0, special_state::specimx_floppy_formats)
|
||||||
|
|
||||||
/* internal ram */
|
/* internal ram */
|
||||||
MCFG_RAM_ADD(RAM_TAG)
|
MCFG_RAM_ADD(RAM_TAG)
|
||||||
@ -485,8 +489,8 @@ static MACHINE_CONFIG_START( erik, special_state )
|
|||||||
MCFG_I8255_ADD( "ppi8255", specialist_ppi8255_interface )
|
MCFG_I8255_ADD( "ppi8255", specialist_ppi8255_interface )
|
||||||
MCFG_FD1793x_ADD("fd1793", XTAL_8MHz / 8)
|
MCFG_FD1793x_ADD("fd1793", XTAL_8MHz / 8)
|
||||||
|
|
||||||
MCFG_FLOPPY_DRIVE_ADD("fd0", specimx_floppies, "525dd", 0, floppy_image_device::default_floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("fd0", specimx_floppies, "525dd", 0, special_state::specimx_floppy_formats)
|
||||||
MCFG_FLOPPY_DRIVE_ADD("fd1", specimx_floppies, "525dd", 0, floppy_image_device::default_floppy_formats)
|
MCFG_FLOPPY_DRIVE_ADD("fd1", specimx_floppies, "525dd", 0, special_state::specimx_floppy_formats)
|
||||||
|
|
||||||
/* internal ram */
|
/* internal ram */
|
||||||
MCFG_RAM_ADD(RAM_TAG)
|
MCFG_RAM_ADD(RAM_TAG)
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include "machine/i8255.h"
|
#include "machine/i8255.h"
|
||||||
#include "machine/pit8253.h"
|
#include "machine/pit8253.h"
|
||||||
#include "imagedev/cassette.h"
|
#include "imagedev/cassette.h"
|
||||||
|
#include "formats/smx_dsk.h"
|
||||||
#include "formats/rk_cas.h"
|
#include "formats/rk_cas.h"
|
||||||
#include "machine/wd_fdc.h"
|
#include "machine/wd_fdc.h"
|
||||||
#include "machine/ram.h"
|
#include "machine/ram.h"
|
||||||
@ -95,6 +96,7 @@ public:
|
|||||||
TIMER_CALLBACK_MEMBER(special_reset);
|
TIMER_CALLBACK_MEMBER(special_reset);
|
||||||
TIMER_CALLBACK_MEMBER(setup_pit8253_gates);
|
TIMER_CALLBACK_MEMBER(setup_pit8253_gates);
|
||||||
void fdc_drq(bool state);
|
void fdc_drq(bool state);
|
||||||
|
DECLARE_FLOPPY_FORMATS( specimx_floppy_formats );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user