diff options
Diffstat (limited to 'src/lib/formats/fsmgr.cpp')
-rw-r--r-- | src/lib/formats/fsmgr.cpp | 286 |
1 files changed, 259 insertions, 27 deletions
diff --git a/src/lib/formats/fsmgr.cpp b/src/lib/formats/fsmgr.cpp index 048007730ce..cc18a942ed5 100644 --- a/src/lib/formats/fsmgr.cpp +++ b/src/lib/formats/fsmgr.cpp @@ -8,37 +8,41 @@ #include "emu.h" #include "fsmgr.h" -void fsblk_t::iblock_t::ref() +void fs_refcounted_inner::ref() { m_ref ++; } -void fsblk_t::iblock_t::ref_weak() +void fs_refcounted_inner::ref_weak() { m_weak_ref ++; } -void fsblk_t::iblock_t::unref() +bool fs_refcounted_inner::unref() { m_ref --; if(m_ref == 0) { - if(m_weak_ref) { + if(m_weak_ref) drop_weak_references(); - if(m_weak_ref) - fatalerror("drop_weak_references kept %d active references\n", m_weak_ref); - } else + else delete this; + return true; } + return false; } -void fsblk_t::iblock_t::unref_weak() +bool fs_refcounted_inner::unref_weak() { m_weak_ref --; - if(m_weak_ref == 0 && m_ref == 0) + if(m_weak_ref == 0 && m_ref == 0) { delete this; + return true; + } + return false; } + void filesystem_manager_t::enumerate_f(floppy_enumerator &fe, uint32_t form_factor, const std::vector<uint32_t> &variants) const { } @@ -89,6 +93,11 @@ std::vector<fs_meta_description> filesystem_manager_t::directory_meta_descriptio return res; } +char filesystem_manager_t::directory_separator() const +{ + return 0; // Subdirectories not supported by default +} + void filesystem_t::format(const fs_meta_data &meta) { fatalerror("format called on a filesystem not supporting it.\n"); @@ -126,44 +135,52 @@ const uint8_t *fsblk_t::iblock_t::rooffset(const char *function, uint32_t off, u void fsblk_t::block_t::copy(u32 offset, const uint8_t *src, u32 size) { - uint8_t *blk = m_block->offset("copy", offset, size); + uint8_t *blk = m_object->offset("copy", offset, size); memcpy(blk, src, size); } void fsblk_t::block_t::fill(u32 offset, uint8_t data, u32 size) { - uint8_t *blk = m_block->offset("fill", offset, size); + uint8_t *blk = m_object->offset("fill", offset, size); memset(blk, data, size); } void fsblk_t::block_t::fill(uint8_t data) { - uint8_t *blk = m_block->data(); - memset(blk, data, m_block->size()); + uint8_t *blk = m_object->data(); + memset(blk, data, m_object->size()); } void fsblk_t::block_t::wstr(u32 offset, const std::string &str) { - uint8_t *blk = m_block->offset("wstr", offset, str.size()); + uint8_t *blk = m_object->offset("wstr", offset, str.size()); memcpy(blk, str.data(), str.size()); } void fsblk_t::block_t::w8(u32 offset, uint8_t data) { - uint8_t *blk = m_block->offset("w8", offset, 1); + uint8_t *blk = m_object->offset("w8", offset, 1); blk[0] = data; } void fsblk_t::block_t::w16b(u32 offset, u16 data) { - uint8_t *blk = m_block->offset("w16b", offset, 2); + uint8_t *blk = m_object->offset("w16b", offset, 2); blk[0] = data >> 8; blk[1] = data; } +void fsblk_t::block_t::w24b(u32 offset, u32 data) +{ + uint8_t *blk = m_object->offset("w24b", offset, 3); + blk[0] = data >> 16; + blk[1] = data >> 8; + blk[2] = data; +} + void fsblk_t::block_t::w32b(u32 offset, u32 data) { - uint8_t *blk = m_block->offset("w32b", offset, 4); + uint8_t *blk = m_object->offset("w32b", offset, 4); blk[0] = data >> 24; blk[1] = data >> 16; blk[2] = data >> 8; @@ -172,14 +189,22 @@ void fsblk_t::block_t::w32b(u32 offset, u32 data) void fsblk_t::block_t::w16l(u32 offset, u16 data) { - uint8_t *blk = m_block->offset("w16l", offset, 2); + uint8_t *blk = m_object->offset("w16l", offset, 2); blk[0] = data; blk[1] = data >> 8; } +void fsblk_t::block_t::w24l(u32 offset, u32 data) +{ + uint8_t *blk = m_object->offset("w24l", offset, 3); + blk[0] = data; + blk[1] = data >> 8; + blk[2] = data >> 16; +} + void fsblk_t::block_t::w32l(u32 offset, u32 data) { - uint8_t *blk = m_block->offset("w32l", offset, 4); + uint8_t *blk = m_object->offset("w32l", offset, 4); blk[0] = data; blk[1] = data >> 8; blk[2] = data >> 16; @@ -188,35 +213,242 @@ void fsblk_t::block_t::w32l(u32 offset, u32 data) std::string fsblk_t::block_t::rstr(u32 offset, u32 size) { - const u8 *d = m_block->rooffset("rstr", offset, size); + const u8 *d = m_object->rooffset("rstr", offset, size); std::string res; for(u32 i=0; i != size; i++) res += char(*d++); return res; } -const char *fs_meta_get_name(fs_meta_name name) +uint8_t fsblk_t::block_t::r8(u32 offset) +{ + const uint8_t *blk = m_object->offset("r8", offset, 1); + return blk[0]; +} + +uint16_t fsblk_t::block_t::r16b(u32 offset) +{ + const uint8_t *blk = m_object->offset("r16b", offset, 2); + return (blk[0] << 8) | blk[1]; +} + +uint32_t fsblk_t::block_t::r24b(u32 offset) +{ + const uint8_t *blk = m_object->offset("r24b", offset, 3); + return (blk[0] << 16) | (blk[1] << 8) | blk[2]; +} + +uint32_t fsblk_t::block_t::r32b(u32 offset) +{ + const uint8_t *blk = m_object->offset("r32b", offset, 4); + return (blk[0] << 24) | (blk[1] << 16) | (blk[2] << 8) | blk[3]; +} + +uint16_t fsblk_t::block_t::r16l(u32 offset) +{ + const uint8_t *blk = m_object->offset("r16l", offset, 2); + return blk[0] | (blk[1] << 8); +} + +uint32_t fsblk_t::block_t::r24l(u32 offset) +{ + const uint8_t *blk = m_object->offset("r24l", offset, 3); + return blk[0] | (blk[1] << 8) | (blk[2] << 16); +} + +uint32_t fsblk_t::block_t::r32l(u32 offset) +{ + const uint8_t *blk = m_object->offset("r32l", offset, 4); + return blk[0] | (blk[1] << 8) | (blk[2] << 16) | (blk[3] << 24); +} + + + +void filesystem_t::copy(uint8_t *p, const uint8_t *src, u32 size) +{ + memcpy(p, src, size); +} + +void filesystem_t::fill(uint8_t *p, uint8_t data, u32 size) +{ + memset(p, data, size); +} + +void filesystem_t::wstr(uint8_t *p, const std::string &str) +{ + memcpy(p, str.data(), str.size()); +} + +void filesystem_t::w8(uint8_t *p, uint8_t data) +{ + p[0] = data; +} + +void filesystem_t::w16b(uint8_t *p, u16 data) +{ + p[0] = data >> 8; + p[1] = data; +} + +void filesystem_t::w24b(uint8_t *p, u32 data) +{ + p[0] = data >> 16; + p[1] = data >> 8; + p[2] = data; +} + +void filesystem_t::w32b(uint8_t *p, u32 data) +{ + p[0] = data >> 24; + p[1] = data >> 16; + p[2] = data >> 8; + p[3] = data; +} + +void filesystem_t::w16l(uint8_t *p, u16 data) +{ + p[0] = data; + p[1] = data >> 8; +} + +void filesystem_t::w24l(uint8_t *p, u32 data) +{ + p[0] = data; + p[1] = data >> 8; + p[2] = data >> 16; +} + +void filesystem_t::w32l(uint8_t *p, u32 data) +{ + p[0] = data; + p[1] = data >> 8; + p[2] = data >> 16; + p[3] = data >> 24; +} + +std::string filesystem_t::rstr(const uint8_t *p, u32 size) +{ + std::string res; + for(u32 i=0; i != size; i++) + res += char(*p++); + return res; +} + +uint8_t filesystem_t::r8(const uint8_t *p) +{ + return p[0]; +} + +uint16_t filesystem_t::r16b(const uint8_t *p) +{ + return (p[0] << 8) | p[1]; +} + +uint32_t filesystem_t::r24b(const uint8_t *p) +{ + return (p[0] << 16) | (p[1] << 8) | p[2]; +} + +uint32_t filesystem_t::r32b(const uint8_t *p) +{ + return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; +} + +uint16_t filesystem_t::r16l(const uint8_t *p) +{ + return p[0] | (p[1] << 8); +} + +uint32_t filesystem_t::r24l(const uint8_t *p) +{ + return p[0] | (p[1] << 8) | (p[2] << 16); +} + +uint32_t filesystem_t::r32l(const uint8_t *p) +{ + return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); +} + +std::string filesystem_t::trim_end_spaces(const std::string &str) +{ + auto i = str.end(); + while(i != str.begin() && i[-1] == ' ') + i--; + return std::string(str.begin(), i); +} + +filesystem_t::file_t filesystem_t::idir_t::file_create(const fs_meta_data &info) +{ + fatalerror("file_create called on a filesystem not supporting write\n"); +} + +void filesystem_t::idir_t::file_delete(uint64_t key) +{ + fatalerror("file_delete called on a filesystem not supporting write\n"); +} + + +void filesystem_t::ifile_t::replace(const std::vector<u8> &data) +{ + fatalerror("replace called on a filesystem not supporting write \n"); +} + +void filesystem_t::ifile_t::rsrc_replace(const std::vector<u8> &data) +{ + fatalerror("rsrc_replace called on a filesystem not supporting write or resource forks \n"); +} + +void filesystem_t::ifile_t::metadata_change(const fs_meta_data &info) +{ + fatalerror("metadata_change called on a filesystem not supporting write \n"); +} + +void filesystem_t::idir_t::metadata_change(const fs_meta_data &info) +{ + fatalerror("metadata_change called on a filesystem not supporting write \n"); +} + +void filesystem_t::metadata_change(const fs_meta_data &info) +{ + fatalerror("metadata_change called on a filesystem not supporting write \n"); +} + +std::vector<u8> filesystem_t::ifile_t::rsrc_read_all() +{ + fatalerror("rsrc_read_all called on a filesystem without resource forks\n"); +} + +const char *fs_meta_data::entry_name(fs_meta_name name) { switch(name) { + case fs_meta_name::basic: return "basic"; case fs_meta_name::creation_date: return "creation_date"; case fs_meta_name::length: return "length"; case fs_meta_name::loading_address: return "loading_address"; case fs_meta_name::locked: return "locked"; - case fs_meta_name::sequential: return "sequential"; case fs_meta_name::modification_date: return "modification_date"; case fs_meta_name::name: return "name"; + case fs_meta_name::os_minimum_version: return "os_minimum_version"; + case fs_meta_name::os_version: return "os_version"; + case fs_meta_name::rsrc_length: return "rsrc_length"; + case fs_meta_name::sequential: return "sequential"; case fs_meta_name::size_in_blocks: return "size_in_blocks"; } return ""; } -std::string fs_meta_to_string(fs_meta_type type, const fs_meta &m) +std::string fs_meta::to_string(fs_meta_type type, const fs_meta &m) { switch(type) { - case fs_meta_type::string: return std::get<std::string>(m); - case fs_meta_type::number: return util::string_format("0x%x", std::get<uint64_t>(m)); - case fs_meta_type::flag: return std::get<bool>(m) ? "t" : "f"; - case fs_meta_type::date: abort(); + case fs_meta_type::string: return m.as_string(); + case fs_meta_type::number: return util::string_format("0x%x", m.as_number()); + case fs_meta_type::flag: return m.as_flag() ? "t" : "f"; + case fs_meta_type::date: { + auto dt = m.as_date(); + return util::string_format("%04d-%02d-%02d %02d:%02d:%02d", + dt.year, dt.month, dt.day_of_month, + dt.hour, dt.minute, dt.second); + } } return std::string(""); } |