diff options
author | 2021-04-28 16:17:41 +0200 | |
---|---|---|
committer | 2021-04-28 16:17:56 +0200 | |
commit | 8709e06b673765ef76594de2878a4c48aa011b42 (patch) | |
tree | 723bf2b9ac26e8796de8001ac8e0ea3e85e92606 /src/lib/formats/fsmgr.cpp | |
parent | 3b24032ba84a083a8f93274f10136a3f14d522d0 (diff) |
floppy: start block-devicing fielsystem support
Diffstat (limited to 'src/lib/formats/fsmgr.cpp')
-rw-r--r-- | src/lib/formats/fsmgr.cpp | 136 |
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; } |