2016-06-20 11:00:32 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <nall/range.hpp>
|
|
|
|
#include <nall/shared-pointer.hpp>
|
|
|
|
|
|
|
|
namespace nall { namespace vfs {
|
|
|
|
|
|
|
|
struct file {
|
|
|
|
enum class mode : uint { read, write, modify, create };
|
|
|
|
enum class index : uint { absolute, relative };
|
|
|
|
|
|
|
|
virtual ~file() = default;
|
|
|
|
|
2016-08-09 11:07:18 +00:00
|
|
|
virtual auto size() const -> uintmax = 0;
|
|
|
|
virtual auto offset() const -> uintmax = 0;
|
2016-06-20 11:00:32 +00:00
|
|
|
|
2016-08-09 11:07:18 +00:00
|
|
|
virtual auto seek(intmax offset, index = index::absolute) -> void = 0;
|
2016-06-20 11:00:32 +00:00
|
|
|
virtual auto read() -> uint8_t = 0;
|
|
|
|
virtual auto write(uint8_t data) -> void = 0;
|
|
|
|
virtual auto flush() -> void {}
|
|
|
|
|
|
|
|
auto end() const -> bool {
|
|
|
|
return offset() >= size();
|
|
|
|
}
|
|
|
|
|
2016-08-09 11:07:18 +00:00
|
|
|
auto read(void* vdata, uintmax bytes) -> void {
|
Update to v099r06 release.
byuu says:
Changelog:
- Super Famicom core converted to use nall/vfs
- excludes Super Game Boy; since that's invoked from inside the GB core
This was definitely the major obstacle to test nall/vfs'
applicability. Things worked out pretty great in the end.
We went from 22.0KiB (cartridge) + 18.6KiB (interface) to 24.5KiB
(cartridge) + 11.4KiB (interface). Or 40.7KiB to 36.0KiB. This removes
a very large source of indirection. Before it was: "coprocessor <=>
cartridge <=> interface" for loading and saving data, and now it's just
"coprocessor <=> cartridge". And it may make sense to eventually turn
this into just "cartridge -> coprocessor" by making each coprocessor
class handle its own markup parsing.
It's nice to have all the manifest parsing in one location (well, sans
MSU1); but it's also nice for loading/unloading to be handled by each
coprocessor itself. So I'll have to think longer about that one.
I've also started handling Interface::save() differently. Instead of
keeping track of memory IDs and filenames, and iterating through that
vector of objects ... instead I now have a system that mirrors the markup
parsing on loading, but handles saving instead. This was actually the
reason the code size savings weren't more significant, but I like this
style more. As before, it removes an extra level of indirection.
So ... next up, I need to port over the GB, then GBA, then WS
cores. These shouldn't take too long since they're all very simple with
just ROM+RAM(+RTC) right now. Then get the SGB callbacks using vfs. Then
after that, gut all the old stream stuff from nall and higan. Kill the
(load,save)Request stuff, rename the load(Gamepak)Request to something
simpler, and then we should be good.
Anyway ... these are some huge changes.
2016-06-21 05:22:52 +00:00
|
|
|
auto data = (uint8_t*)vdata;
|
2016-06-20 11:00:32 +00:00
|
|
|
while(bytes--) *data++ = read();
|
|
|
|
}
|
|
|
|
|
2016-08-09 11:07:18 +00:00
|
|
|
auto readl(uint bytes) -> uintmax {
|
|
|
|
uintmax data = 0;
|
|
|
|
for(auto n : range(bytes)) data |= (uintmax)read() << n * 8;
|
2016-06-20 11:00:32 +00:00
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
2016-08-09 11:07:18 +00:00
|
|
|
auto readm(uint bytes) -> uintmax {
|
|
|
|
uintmax data = 0;
|
2016-06-20 11:00:32 +00:00
|
|
|
for(auto n : range(bytes)) data = data << 8 | read();
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
Update to v099r06 release.
byuu says:
Changelog:
- Super Famicom core converted to use nall/vfs
- excludes Super Game Boy; since that's invoked from inside the GB core
This was definitely the major obstacle to test nall/vfs'
applicability. Things worked out pretty great in the end.
We went from 22.0KiB (cartridge) + 18.6KiB (interface) to 24.5KiB
(cartridge) + 11.4KiB (interface). Or 40.7KiB to 36.0KiB. This removes
a very large source of indirection. Before it was: "coprocessor <=>
cartridge <=> interface" for loading and saving data, and now it's just
"coprocessor <=> cartridge". And it may make sense to eventually turn
this into just "cartridge -> coprocessor" by making each coprocessor
class handle its own markup parsing.
It's nice to have all the manifest parsing in one location (well, sans
MSU1); but it's also nice for loading/unloading to be handled by each
coprocessor itself. So I'll have to think longer about that one.
I've also started handling Interface::save() differently. Instead of
keeping track of memory IDs and filenames, and iterating through that
vector of objects ... instead I now have a system that mirrors the markup
parsing on loading, but handles saving instead. This was actually the
reason the code size savings weren't more significant, but I like this
style more. As before, it removes an extra level of indirection.
So ... next up, I need to port over the GB, then GBA, then WS
cores. These shouldn't take too long since they're all very simple with
just ROM+RAM(+RTC) right now. Then get the SGB callbacks using vfs. Then
after that, gut all the old stream stuff from nall and higan. Kill the
(load,save)Request stuff, rename the load(Gamepak)Request to something
simpler, and then we should be good.
Anyway ... these are some huge changes.
2016-06-21 05:22:52 +00:00
|
|
|
auto reads() -> string {
|
|
|
|
string s;
|
2016-06-20 11:00:32 +00:00
|
|
|
s.resize(size());
|
|
|
|
read(s.get<uint8_t>(), s.size());
|
Update to v099r06 release.
byuu says:
Changelog:
- Super Famicom core converted to use nall/vfs
- excludes Super Game Boy; since that's invoked from inside the GB core
This was definitely the major obstacle to test nall/vfs'
applicability. Things worked out pretty great in the end.
We went from 22.0KiB (cartridge) + 18.6KiB (interface) to 24.5KiB
(cartridge) + 11.4KiB (interface). Or 40.7KiB to 36.0KiB. This removes
a very large source of indirection. Before it was: "coprocessor <=>
cartridge <=> interface" for loading and saving data, and now it's just
"coprocessor <=> cartridge". And it may make sense to eventually turn
this into just "cartridge -> coprocessor" by making each coprocessor
class handle its own markup parsing.
It's nice to have all the manifest parsing in one location (well, sans
MSU1); but it's also nice for loading/unloading to be handled by each
coprocessor itself. So I'll have to think longer about that one.
I've also started handling Interface::save() differently. Instead of
keeping track of memory IDs and filenames, and iterating through that
vector of objects ... instead I now have a system that mirrors the markup
parsing on loading, but handles saving instead. This was actually the
reason the code size savings weren't more significant, but I like this
style more. As before, it removes an extra level of indirection.
So ... next up, I need to port over the GB, then GBA, then WS
cores. These shouldn't take too long since they're all very simple with
just ROM+RAM(+RTC) right now. Then get the SGB callbacks using vfs. Then
after that, gut all the old stream stuff from nall and higan. Kill the
(load,save)Request stuff, rename the load(Gamepak)Request to something
simpler, and then we should be good.
Anyway ... these are some huge changes.
2016-06-21 05:22:52 +00:00
|
|
|
return s;
|
2016-06-20 11:00:32 +00:00
|
|
|
}
|
|
|
|
|
2016-08-09 11:07:18 +00:00
|
|
|
auto write(const void* vdata, uintmax bytes) -> void {
|
Update to v099r06 release.
byuu says:
Changelog:
- Super Famicom core converted to use nall/vfs
- excludes Super Game Boy; since that's invoked from inside the GB core
This was definitely the major obstacle to test nall/vfs'
applicability. Things worked out pretty great in the end.
We went from 22.0KiB (cartridge) + 18.6KiB (interface) to 24.5KiB
(cartridge) + 11.4KiB (interface). Or 40.7KiB to 36.0KiB. This removes
a very large source of indirection. Before it was: "coprocessor <=>
cartridge <=> interface" for loading and saving data, and now it's just
"coprocessor <=> cartridge". And it may make sense to eventually turn
this into just "cartridge -> coprocessor" by making each coprocessor
class handle its own markup parsing.
It's nice to have all the manifest parsing in one location (well, sans
MSU1); but it's also nice for loading/unloading to be handled by each
coprocessor itself. So I'll have to think longer about that one.
I've also started handling Interface::save() differently. Instead of
keeping track of memory IDs and filenames, and iterating through that
vector of objects ... instead I now have a system that mirrors the markup
parsing on loading, but handles saving instead. This was actually the
reason the code size savings weren't more significant, but I like this
style more. As before, it removes an extra level of indirection.
So ... next up, I need to port over the GB, then GBA, then WS
cores. These shouldn't take too long since they're all very simple with
just ROM+RAM(+RTC) right now. Then get the SGB callbacks using vfs. Then
after that, gut all the old stream stuff from nall and higan. Kill the
(load,save)Request stuff, rename the load(Gamepak)Request to something
simpler, and then we should be good.
Anyway ... these are some huge changes.
2016-06-21 05:22:52 +00:00
|
|
|
auto data = (const uint8_t*)vdata;
|
2016-06-20 11:00:32 +00:00
|
|
|
while(bytes--) write(*data++);
|
|
|
|
}
|
|
|
|
|
2016-08-09 11:07:18 +00:00
|
|
|
auto writel(uintmax data, uint bytes) -> void {
|
2016-06-20 11:00:32 +00:00
|
|
|
for(auto n : range(bytes)) write(data), data >>= 8;
|
|
|
|
}
|
|
|
|
|
2016-08-09 11:07:18 +00:00
|
|
|
auto writem(uintmax data, uint bytes) -> void {
|
2016-06-20 11:00:32 +00:00
|
|
|
for(auto n : rrange(bytes)) write(data >> n * 8);
|
|
|
|
}
|
|
|
|
|
|
|
|
auto writes(const string& s) -> void {
|
|
|
|
write(s.data<uint8_t>(), s.size());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
}}
|
|
|
|
|
|
|
|
namespace nall { namespace vfs { namespace shared {
|
|
|
|
using file = shared_pointer<vfs::file>;
|
|
|
|
}}}
|
|
|
|
|
|
|
|
#include <nall/vfs/fs/file.hpp>
|
|
|
|
#include <nall/vfs/memory/file.hpp>
|