mirror of
https://github.com/holub/mame
synced 2025-10-04 08:28:39 +03:00
Fix OS-9 disk writing bug (#4925)
* Start fixing OS9 disk handling * Got it working, now need to refine and test * Almost complete. Doing more testing... * Tested aginst a varient of sotware. Solved bug. Cleaned up tabs. * Turned on sector interleaving in OS9_DSK and retested.
This commit is contained in:
parent
ca07dc3cc5
commit
8a8fcba120
@ -989,6 +989,18 @@ if (FORMATS["JVC_DSK"]~=null or _OPTIONS["with-tools"]) then
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--------------------------------------------------
|
||||||
|
--
|
||||||
|
--@src/lib/formats/os9_dsk.h,FORMATS["OS9_DSK"] = true
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
if (FORMATS["OS9_DSK"]~=null or _OPTIONS["with-tools"]) then
|
||||||
|
files {
|
||||||
|
MAME_DIR.. "src/lib/formats/os9_dsk.cpp",
|
||||||
|
MAME_DIR.. "src/lib/formats/os9_dsk.h",
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
--
|
--
|
||||||
--@src/lib/formats/jfd_dsk.h,FORMATS["JFD_DSK"] = true
|
--@src/lib/formats/jfd_dsk.h,FORMATS["JFD_DSK"] = true
|
||||||
|
@ -931,6 +931,7 @@ FORMATS["IQ151_DSK"] = true
|
|||||||
FORMATS["ITT3030_DSK"] = true
|
FORMATS["ITT3030_DSK"] = true
|
||||||
FORMATS["JFD_DSK"] = true
|
FORMATS["JFD_DSK"] = true
|
||||||
FORMATS["JVC_DSK"] = true
|
FORMATS["JVC_DSK"] = true
|
||||||
|
FORMATS["OS9_DSK"] = true
|
||||||
FORMATS["KAYPRO_DSK"] = true
|
FORMATS["KAYPRO_DSK"] = true
|
||||||
FORMATS["KC85_DSK"] = true
|
FORMATS["KC85_DSK"] = true
|
||||||
FORMATS["KC_CAS"] = true
|
FORMATS["KC_CAS"] = true
|
||||||
|
@ -53,6 +53,7 @@
|
|||||||
#include "formats/jvc_dsk.h"
|
#include "formats/jvc_dsk.h"
|
||||||
#include "formats/vdk_dsk.h"
|
#include "formats/vdk_dsk.h"
|
||||||
#include "formats/sdf_dsk.h"
|
#include "formats/sdf_dsk.h"
|
||||||
|
#include "formats/os9_dsk.h"
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -118,7 +119,8 @@ FLOPPY_FORMATS_MEMBER( coco_family_fdc_device_base::floppy_formats )
|
|||||||
FLOPPY_DMK_FORMAT,
|
FLOPPY_DMK_FORMAT,
|
||||||
FLOPPY_JVC_FORMAT,
|
FLOPPY_JVC_FORMAT,
|
||||||
FLOPPY_VDK_FORMAT,
|
FLOPPY_VDK_FORMAT,
|
||||||
FLOPPY_SDF_FORMAT
|
FLOPPY_SDF_FORMAT,
|
||||||
|
FLOPPY_OS9_FORMAT
|
||||||
FLOPPY_FORMATS_END
|
FLOPPY_FORMATS_END
|
||||||
|
|
||||||
static void coco_fdc_floppies(device_slot_interface &device)
|
static void coco_fdc_floppies(device_slot_interface &device)
|
||||||
|
@ -75,6 +75,7 @@
|
|||||||
#include "formats/jvc_dsk.h"
|
#include "formats/jvc_dsk.h"
|
||||||
#include "formats/vdk_dsk.h"
|
#include "formats/vdk_dsk.h"
|
||||||
#include "formats/sdf_dsk.h"
|
#include "formats/sdf_dsk.h"
|
||||||
|
#include "formats/os9_dsk.h"
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
@ -164,34 +164,6 @@ bool jvc_format::parse_header(io_generic *io, int &header_size, int &tracks, int
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// os-9 format disk images often don't have a header, but can contain
|
|
||||||
// various geometries. we try to open the file as os-9 image here and
|
|
||||||
// see if the values we get make sense
|
|
||||||
if (header_size == 0 && size > 0x20)
|
|
||||||
{
|
|
||||||
uint8_t os9_header[0x20];
|
|
||||||
io_generic_read(io, os9_header, 0, 0x20);
|
|
||||||
|
|
||||||
int os9_total_sectors = pick_integer_be(os9_header, 0x00, 3);
|
|
||||||
int os9_heads = BIT(os9_header[0x10], 0) ? 2 : 1;
|
|
||||||
int os9_sectors = pick_integer_be(os9_header, 0x11, 2);
|
|
||||||
|
|
||||||
if (os9_total_sectors > 0 && os9_heads > 0 && os9_sectors > 0)
|
|
||||||
{
|
|
||||||
int os9_tracks = os9_total_sectors / os9_sectors / os9_heads;
|
|
||||||
|
|
||||||
// now let's see if we have valid info
|
|
||||||
if ((os9_tracks * os9_heads * os9_sectors * 256) == size)
|
|
||||||
{
|
|
||||||
tracks = os9_tracks;
|
|
||||||
heads = os9_heads;
|
|
||||||
sectors = os9_sectors;
|
|
||||||
|
|
||||||
osd_printf_verbose("OS-9 format disk image detected.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
osd_printf_verbose("Floppy disk image geometry: %d tracks, %d head(s), %d sectors with %d bytes.\n", tracks, heads, sectors, sector_size);
|
osd_printf_verbose("Floppy disk image geometry: %d tracks, %d head(s), %d sectors with %d bytes.\n", tracks, heads, sectors, sector_size);
|
||||||
|
|
||||||
return tracks * heads * sectors * sector_size == (size - header_size);
|
return tracks * heads * sectors * sector_size == (size - header_size);
|
||||||
@ -223,19 +195,20 @@ bool jvc_format::load(io_generic *io, uint32_t form_factor, floppy_image *image)
|
|||||||
desc_pc_sector sectors[256];
|
desc_pc_sector sectors[256];
|
||||||
uint8_t sector_data[10000];
|
uint8_t sector_data[10000];
|
||||||
int sector_offset = 0;
|
int sector_offset = 0;
|
||||||
|
// standard RS-DOS interleave
|
||||||
|
int interleave[18] = { 0, 11, 4, 15, 8, 1, 12, 5, 16, 9, 2, 13, 6, 17, 10, 3, 14, 7 };
|
||||||
for (int i = 0; i < sector_count; i++)
|
for (int i = 0; i < sector_count; i++)
|
||||||
{
|
{
|
||||||
sectors[i].track = track;
|
sectors[interleave[i]].track = track;
|
||||||
sectors[i].head = head;
|
sectors[interleave[i]].head = head;
|
||||||
sectors[i].sector = sector_base_id + i;
|
sectors[interleave[i]].sector = sector_base_id + i;
|
||||||
sectors[i].actual_size = sector_size;
|
sectors[interleave[i]].actual_size = sector_size;
|
||||||
sectors[i].size = sector_size >> 8;
|
sectors[interleave[i]].size = sector_size >> 8;
|
||||||
sectors[i].deleted = false;
|
sectors[interleave[i]].deleted = false;
|
||||||
sectors[i].bad_crc = false;
|
sectors[interleave[i]].bad_crc = false;
|
||||||
sectors[i].data = §or_data[sector_offset];
|
sectors[interleave[i]].data = §or_data[sector_offset];
|
||||||
|
|
||||||
io_generic_read(io, sectors[i].data, file_offset, sector_size);
|
io_generic_read(io, sectors[interleave[i]].data, file_offset, sector_size);
|
||||||
|
|
||||||
sector_offset += sector_size;
|
sector_offset += sector_size;
|
||||||
file_offset += sector_size;
|
file_offset += sector_size;
|
||||||
|
115
src/lib/formats/os9_dsk.cpp
Normal file
115
src/lib/formats/os9_dsk.cpp
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:tim lindner
|
||||||
|
/*********************************************************************
|
||||||
|
|
||||||
|
formats/os9_dsk.c
|
||||||
|
|
||||||
|
OS-9 disk images
|
||||||
|
|
||||||
|
OS-9 Level 2 Technical Reference, Chapter 5, Random Block File
|
||||||
|
Manager, page 2
|
||||||
|
|
||||||
|
Available: http://www.colorcomputerarchive.com/coco/Documents/Manuals/
|
||||||
|
Operating Systems/OS-9 Level 2 Manual (Tandy).pdf
|
||||||
|
|
||||||
|
*********************************************************************/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include "emu.h"
|
||||||
|
#include "formats/imageutl.h"
|
||||||
|
|
||||||
|
#include "formats/os9_dsk.h"
|
||||||
|
|
||||||
|
os9_format::os9_format() : wd177x_format(formats)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *os9_format::name() const
|
||||||
|
{
|
||||||
|
return "os9";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *os9_format::description() const
|
||||||
|
{
|
||||||
|
return "OS-9 floppy disk image";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *os9_format::extensions() const
|
||||||
|
{
|
||||||
|
return "dsk,os9";
|
||||||
|
}
|
||||||
|
|
||||||
|
int os9_format::identify(io_generic *io, uint32_t form_factor)
|
||||||
|
{
|
||||||
|
int type = find_size(io, form_factor);
|
||||||
|
|
||||||
|
if (type != -1)
|
||||||
|
return 75;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int os9_format::find_size(io_generic *io, uint32_t form_factor)
|
||||||
|
{
|
||||||
|
uint64_t size = io_generic_size(io);
|
||||||
|
|
||||||
|
uint8_t os9_header[0x20];
|
||||||
|
io_generic_read(io, os9_header, 0, 0x20);
|
||||||
|
|
||||||
|
int os9_total_sectors = pick_integer_be(os9_header, 0x00, 3);
|
||||||
|
int os9_heads = BIT(os9_header[0x10], 0) ? 2 : 1;
|
||||||
|
int os9_sectors = pick_integer_be(os9_header, 0x11, 2);
|
||||||
|
|
||||||
|
if (os9_total_sectors > 0 && os9_heads > 0 && os9_sectors > 0) {
|
||||||
|
int os9_tracks = os9_total_sectors / os9_sectors / os9_heads;
|
||||||
|
|
||||||
|
// now let's see if we have valid info
|
||||||
|
if ((os9_tracks * os9_heads * os9_sectors * 256) == size) {
|
||||||
|
for(int i=0; formats[i].form_factor; i++) {
|
||||||
|
const format &f = formats[i];
|
||||||
|
|
||||||
|
if(form_factor != floppy_image::FF_UNKNOWN && form_factor != f.form_factor)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(os9_tracks == f.track_count) {
|
||||||
|
if( os9_heads == f.head_count ) {
|
||||||
|
if(os9_sectors == f.sector_count ) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const os9_format::format os9_format::formats[] = {
|
||||||
|
{ // 5"25 160K double density
|
||||||
|
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
|
||||||
|
2000, 18, 35, 1, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
|
||||||
|
},
|
||||||
|
{ // 5"25 160K double density
|
||||||
|
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||||
|
2000, 18, 35, 2, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
|
||||||
|
},
|
||||||
|
{ // 5"25 160K double density
|
||||||
|
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
|
||||||
|
2000, 18, 40, 1, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
|
||||||
|
},
|
||||||
|
{ // 5"25 160K double density
|
||||||
|
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||||
|
2000, 18, 40, 2, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
|
||||||
|
},
|
||||||
|
{ // 5"25 160K double density
|
||||||
|
floppy_image::FF_525, floppy_image::SSDD, floppy_image::MFM,
|
||||||
|
2000, 18, 80, 1, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
|
||||||
|
},
|
||||||
|
{ // 5"25 160K double density
|
||||||
|
floppy_image::FF_525, floppy_image::DSDD, floppy_image::MFM,
|
||||||
|
2000, 18, 80, 2, 256, {}, -1, {1, 7, 13, 2, 8, 14, 3, 9, 15, 4, 10, 16, 5, 11, 17, 6, 12, 18}, 18, 28, 20
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
const floppy_format_type FLOPPY_OS9_FORMAT = &floppy_image_format_creator<os9_format>;
|
33
src/lib/formats/os9_dsk.h
Normal file
33
src/lib/formats/os9_dsk.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:tim lindner
|
||||||
|
/*********************************************************************
|
||||||
|
|
||||||
|
formats/os9_dsk.h
|
||||||
|
|
||||||
|
OS-9 disk images
|
||||||
|
|
||||||
|
*********************************************************************/
|
||||||
|
#ifndef MAME_FORMATS_OS9_DSK_H
|
||||||
|
#define MAME_FORMATS_OS9_DSK_H
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "wd177x_dsk.h"
|
||||||
|
|
||||||
|
class os9_format : public wd177x_format {
|
||||||
|
public:
|
||||||
|
os9_format();
|
||||||
|
|
||||||
|
virtual int identify(io_generic *io, uint32_t form_factor) override;
|
||||||
|
virtual int find_size(io_generic *io, uint32_t form_factor) override;
|
||||||
|
virtual const char *name() const override;
|
||||||
|
virtual const char *description() const override;
|
||||||
|
virtual const char *extensions() const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const format formats[];
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const floppy_format_type FLOPPY_OS9_FORMAT;
|
||||||
|
|
||||||
|
#endif // MAME_FORMATS_OS9_DSK_H
|
Loading…
Reference in New Issue
Block a user