From 8709e06b673765ef76594de2878a4c48aa011b42 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Wed, 28 Apr 2021 16:17:41 +0200 Subject: floppy: start block-devicing fielsystem support --- src/devices/bus/oricext/jasmin.cpp | 6 +++++- src/devices/imagedev/floppy.cpp | 19 +++++++++++++------ src/devices/imagedev/floppy.h | 17 +++++++++-------- 3 files changed, 27 insertions(+), 15 deletions(-) (limited to 'src/devices') diff --git a/src/devices/bus/oricext/jasmin.cpp b/src/devices/bus/oricext/jasmin.cpp index dabae07c7c9..a7188667b09 100644 --- a/src/devices/bus/oricext/jasmin.cpp +++ b/src/devices/bus/oricext/jasmin.cpp @@ -3,6 +3,7 @@ #include "emu.h" #include "jasmin.h" #include "formats/oric_dsk.h" +#include "formats/fs_oric_jasmin.h" DEFINE_DEVICE_TYPE(ORIC_JASMIN, oric_jasmin_device, "oric_jasmin", "Jasmin floppy drive interface") @@ -15,6 +16,9 @@ void oric_jasmin_device::floppy_formats(format_registration &fr) { fr.add_mfm_containers(); fr.add(FLOPPY_ORIC_DSK_FORMAT); + fr.add(FLOPPY_ORIC_JASMIN_FORMAT); + + fr.add(FS_ORIC_JASMIN); } static void jasmin_floppies(device_slot_interface &device) @@ -24,7 +28,7 @@ static void jasmin_floppies(device_slot_interface &device) INPUT_PORTS_START( jasmin ) PORT_START("JASMIN") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Boot") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHANGED_MEMBER(DEVICE_SELF, oric_jasmin_device, boot_pressed, 0) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Boot") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHANGED_MEMBER(DEVICE_SELF, oric_jasmin_device, boot_pressed, 0) INPUT_PORTS_END void oric_jasmin_device::map(address_map &map) diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp index b01a7943935..2decede8498 100644 --- a/src/devices/imagedev/floppy.cpp +++ b/src/devices/imagedev/floppy.cpp @@ -21,6 +21,7 @@ #include "formats/pc_dsk.h" #include "formats/fs_unformatted.h" +#include "formats/fsblk_vec.h" #include "speaker.h" #include "formats/imageutl.h" @@ -308,14 +309,17 @@ void floppy_image_device::setup_led_cb(led_cb cb) cur_led_cb = cb; } -void floppy_image_device::fs_enum::add(const filesystem_manager_t *manager, floppy_format_type type, u32 image_size, const char *name, u32 key, const char *description) +void floppy_image_device::fs_enum::add(const filesystem_manager_t *manager, floppy_format_type type, u32 image_size, const char *name, const char *description) { - m_fid->m_fs.emplace_back(fs_info(manager, type, image_size, name, key, description)); + if(manager->can_format()) + m_fid->m_create_fs.emplace_back(fs_info(manager, type, image_size, name, description)); + if(manager->can_read()) + m_fid->m_io_fs.emplace_back(fs_info(manager, type, image_size, name, description)); } -void floppy_image_device::fs_enum::add_raw(const filesystem_manager_t *manager, const char *name, u32 key, const char *description) +void floppy_image_device::fs_enum::add_raw(const char *name, u32 key, const char *description) { - m_fid->m_fs.emplace_back(fs_info(manager, name, key, description)); + m_fid->m_create_fs.emplace_back(fs_info(name, key, description)); } void floppy_image_device::register_formats() @@ -718,14 +722,17 @@ void floppy_image_device::init_fs(const fs_info *fs) if (fs->m_type) { std::vector img(fs->m_image_size); - fs->m_manager->floppy_instantiate(fs->m_key, img); + fsblk_vec_t blockdev(img); + auto cfs = fs->m_manager->mount(blockdev); + cfs->format(); + auto iog = ram_open(img); auto source_format = fs->m_type(); source_format->load(iog, floppy_image::FF_UNKNOWN, variants, image.get()); delete source_format; delete iog; } else - fs->m_manager->floppy_instantiate_raw(fs->m_key, image.get()); + fs_unformatted::format(fs->m_key, image.get()); } /* write protect, active high diff --git a/src/devices/imagedev/floppy.h b/src/devices/imagedev/floppy.h index f847e525a05..0747e1bef3a 100644 --- a/src/devices/imagedev/floppy.h +++ b/src/devices/imagedev/floppy.h @@ -56,17 +56,17 @@ public: u32 m_key; const char *m_description; - fs_info(const filesystem_manager_t *manager, floppy_format_type type, u32 image_size, const char *name, u32 key, const char *description) : + fs_info(const filesystem_manager_t *manager, floppy_format_type type, u32 image_size, const char *name, const char *description) : m_manager(manager), m_type(type), m_image_size(image_size), m_name(name), - m_key(key), + m_key(0), m_description(description) {} - fs_info(const filesystem_manager_t *manager, const char *name, u32 key, const char *description) : - m_manager(manager), + fs_info(const char *name, u32 key, const char *description) : + m_manager(nullptr), m_type(nullptr), m_image_size(0), m_name(name), @@ -80,7 +80,8 @@ public: void set_formats(std::function formats); floppy_image_format_t *get_formats() const; - const std::vector &get_fs() const { return m_fs; } + const std::vector &get_create_fs() const { return m_create_fs; } + const std::vector &get_io_fs() const { return m_io_fs; } floppy_image_format_t *get_load_format() const; floppy_image_format_t *identify(std::string filename); void set_rpm(float rpm); @@ -158,8 +159,8 @@ protected: floppy_image_device *m_fid; fs_enum(floppy_image_device *fid) : filesystem_manager_t::floppy_enumerator(), m_fid(fid) {}; - virtual void add(const filesystem_manager_t *manager, floppy_format_type type, u32 image_size, const char *name, u32 key, const char *description) override; - virtual void add_raw(const filesystem_manager_t *manager, const char *name, u32 key, const char *description) override; + virtual void add(const filesystem_manager_t *manager, floppy_format_type type, u32 image_size, const char *name, const char *description) override; + virtual void add_raw(const char *name, u32 key, const char *description) override; }; floppy_image_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); @@ -186,7 +187,7 @@ protected: std::unique_ptr image; char extension_list[256]; floppy_image_format_t *fif_list; - std::vector m_fs; + std::vector m_create_fs, m_io_fs; std::vector> m_fs_managers; emu_timer *index_timer; -- cgit v1.2.3