summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/formats/fsmgr.cpp
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2021-04-28 16:17:41 +0200
committer Olivier Galibert <galibert@pobox.com>2021-04-28 16:17:56 +0200
commit8709e06b673765ef76594de2878a4c48aa011b42 (patch)
tree723bf2b9ac26e8796de8001ac8e0ea3e85e92606 /src/lib/formats/fsmgr.cpp
parent3b24032ba84a083a8f93274f10136a3f14d522d0 (diff)
floppy: start block-devicing fielsystem support
Diffstat (limited to 'src/lib/formats/fsmgr.cpp')
-rw-r--r--src/lib/formats/fsmgr.cpp136
1 files changed, 106 insertions, 30 deletions
diff --git a/src/lib/formats/fsmgr.cpp b/src/lib/formats/fsmgr.cpp
index 597d1428411..ec80710ac33 100644
--- a/src/lib/formats/fsmgr.cpp
+++ b/src/lib/formats/fsmgr.cpp
@@ -8,20 +8,47 @@
#include "emu.h"
#include "fsmgr.h"
+void fsblk_t::iblock_t::ref()
+{
+ m_ref ++;
+}
+
+void fsblk_t::iblock_t::ref_weak()
+{
+ m_weak_ref ++;
+}
+
+void fsblk_t::iblock_t::unref()
+{
+ m_ref --;
+ if(m_ref == 0) {
+ if(m_weak_ref) {
+ drop_weak_references();
+ if(m_weak_ref)
+ fatalerror("drop_weak_references kept %d active references\n", m_weak_ref);
+ } else
+ delete this;
+ }
+}
+
+void fsblk_t::iblock_t::unref_weak()
+{
+ m_weak_ref --;
+ if(m_weak_ref == 0 && m_ref == 0)
+ delete this;
+}
+
+
void filesystem_manager_t::enumerate(floppy_enumerator &fe, uint32_t form_factor, const std::vector<uint32_t> &variants) const
{
}
-void filesystem_manager_t::floppy_instantiate(u32 key, std::vector<u8> &image) const
+void filesystem_manager_t::enumerate(hd_enumerator &he) const
{
- fprintf(stderr, "filesystem_manager_t::floppy_instantiate called while unsupported\n");
- abort();
}
-void filesystem_manager_t::floppy_instantiate_raw(u32 key, floppy_image *image) const
+void filesystem_manager_t::enumerate(cdrom_enumerator &ce) const
{
- fprintf(stderr, "filesystem_manager_t::floppy_instantiate_raw called while unsupported\n");
- abort();
}
bool filesystem_manager_t::has_variant(const std::vector<uint32_t> &variants, uint32_t variant)
@@ -32,50 +59,99 @@ bool filesystem_manager_t::has_variant(const std::vector<uint32_t> &variants, ui
return false;
}
-void filesystem_manager_t::copy(std::vector<u8> &image, u32 offset, const u8 *src, u32 size)
+bool filesystem_manager_t::has(uint32_t form_factor, const std::vector<uint32_t> &variants, uint32_t ff, uint32_t variant)
+{
+ if(form_factor == floppy_image::FF_UNKNOWN)
+ return true;
+ if(form_factor != ff)
+ return false;
+ for(uint32_t v : variants)
+ if(variant == v)
+ return true;
+ return false;
+}
+
+void filesystem_t::format()
+{
+ fatalerror("format called on filesystem not supporting it.\n");
+}
+
+filesystem_t::dir_t filesystem_t::root()
+{
+ fatalerror("root called on filesystem not supporting it.\n");
+}
+
+void fsblk_t::set_block_size(uint32_t block_size)
+{
+ m_block_size = block_size;
+}
+
+
+uint8_t *fsblk_t::iblock_t::offset(const char *function, uint32_t off, uint32_t size)
+{
+ if(off + size > m_size)
+ fatalerror("block_t::%s out-of-block access, offset=%d, size=%d, block size=%d\n", function, off, size, m_size);
+ return data() + off;
+}
+
+void fsblk_t::block_t::copy(u32 offset, const uint8_t *src, u32 size)
+{
+ uint8_t *blk = m_block->offset("copy", offset, size);
+ memcpy(blk, src, size);
+}
+
+void fsblk_t::block_t::fill(u32 offset, uint8_t data, u32 size)
{
- memcpy(image.data() + offset, src, size);
+ uint8_t *blk = m_block->offset("fill", offset, size);
+ memset(blk, data, size);
}
-void filesystem_manager_t::fill(std::vector<u8> &image, u32 offset, u8 data, u32 size)
+void fsblk_t::block_t::fill(uint8_t data)
{
- memset(image.data() + offset, data, size);
+ uint8_t *blk = m_block->data();
+ memset(blk, data, m_block->size());
}
-void filesystem_manager_t::wstr(std::vector<u8> &image, u32 offset, const std::string &str)
+void fsblk_t::block_t::wstr(u32 offset, const std::string &str)
{
- memcpy(image.data() + offset, str.data(), str.size());
+ uint8_t *blk = m_block->offset("wstr", offset, str.size());
+ memcpy(blk, str.data(), str.size());
}
-void filesystem_manager_t::w8(std::vector<u8> &image, u32 offset, u8 data)
+void fsblk_t::block_t::w8(u32 offset, uint8_t data)
{
- image[offset] = data;
+ uint8_t *blk = m_block->offset("w8", offset, 1);
+ blk[0] = data;
}
-void filesystem_manager_t::w16b(std::vector<u8> &image, u32 offset, u16 data)
+void fsblk_t::block_t::w16b(u32 offset, u16 data)
{
- image[offset ] = data >> 8;
- image[offset+1] = data;
+ uint8_t *blk = m_block->offset("w16b", offset, 2);
+ blk[0] = data >> 8;
+ blk[1] = data;
}
-void filesystem_manager_t::w32b(std::vector<u8> &image, u32 offset, u32 data)
+void fsblk_t::block_t::w32b(u32 offset, u32 data)
{
- image[offset ] = data >> 24;
- image[offset+1] = data >> 16;
- image[offset+2] = data >> 8;
- image[offset+3] = data;
+ uint8_t *blk = m_block->offset("w32b", offset, 4);
+ blk[0] = data >> 24;
+ blk[1] = data >> 16;
+ blk[2] = data >> 8;
+ blk[3] = data;
}
-void filesystem_manager_t::w16l(std::vector<u8> &image, u32 offset, u16 data)
+void fsblk_t::block_t::w16l(u32 offset, u16 data)
{
- image[offset ] = data;
- image[offset+1] = data >> 8;
+ uint8_t *blk = m_block->offset("w16l", offset, 2);
+ blk[0] = data;
+ blk[1] = data >> 8;
}
-void filesystem_manager_t::w32l(std::vector<u8> &image, u32 offset, u32 data)
+void fsblk_t::block_t::w32l(u32 offset, u32 data)
{
- image[offset ] = data;
- image[offset+1] = data >> 8;
- image[offset+2] = data >> 16;
- image[offset+3] = data >> 24;
+ uint8_t *blk = m_block->offset("w32l", offset, 4);
+ blk[0] = data;
+ blk[1] = data >> 8;
+ blk[2] = data >> 16;
+ blk[3] = data >> 24;
}