huge work on FAT32, initial support for writing

This commit is contained in:
2021-02-14 21:35:47 +01:00
parent 6aa951190e
commit da12992ae8
14 changed files with 609 additions and 91 deletions

View File

@@ -17,35 +17,61 @@
#include <fstream>
//class Simu {
// FILE* f;
//public:
// Simu(const char* image) {
// f = fopen(image, "rw");
// if (!f) {throw std::runtime_error("failed to open");}
// }
// uint32_t readSingleBlock(LBA512 addr, uint8_t* dst) {
// Log::addInfo("SD", "read512(%d*512)", addr);
// fseek(f, addr*512, SEEK_SET);
// return fread(dst, 512, 1, f) * 512;
// }
// uint32_t writeSingleBlock(LBA512 addr, const uint8_t* src) {
// Log::addInfo("SD", "write512(%d*512)", addr);
// fseek(f, addr*512, SEEK_SET);
// return fwrite(src, 512, 1, f) * 512;
// }
//};
class Simu {
FILE* f;
uint8_t* data;
public:
Simu(const char* image) {
f = fopen(image, "rw");
FILE* f = fopen(image, "rw");
if (!f) {throw std::runtime_error("failed to open");}
fseek(f, 0L, SEEK_END);
size_t size = ftell(f);
fseek(f, 0L, SEEK_SET);
data = (uint8_t*) malloc(size);
fread(data, size, 1, f);
fclose(f);
}
// uint32_t readSingleBlock(uint32_t addr, uint32_t size, uint8_t* dst) {
// debugMod2("SD", "read(%d @ %d)", size, addr);
// fseek(f, addr, SEEK_SET);
// return fread(dst, size, 1, f) * size;
// }
uint32_t readSingleBlock(LBA512 addr, uint8_t* dst) {
Log::addInfo("SD", "read512(%d*512)", addr);
fseek(f, addr*512, SEEK_SET);
return fread(dst, 512, 1, f) * 512;
memcpy(dst, data+addr*512, 512);
return 512;
}
uint32_t writeSingleBlock(LBA512 addr, const uint8_t* src) {
Log::addInfo("SD", "write512(%d*512)", addr);
fseek(f, addr*512, SEEK_SET);
return fwrite(src, 512, 1, f) * 512;
memcpy(data+addr*512, src, 512);
return 512;
}
};
#include <gtest/gtest.h>
@@ -53,6 +79,7 @@ public:
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
::testing::GTEST_FLAG(filter) = "*TestCreate*";
return RUN_ALL_TESTS();
// diff /tmp/ram/TETRIS.GB /apps/workspace/gbemu/tests/tetris.gb
@@ -77,30 +104,39 @@ int main(int argc, char** argv) {
};
FAT32FS::DirIterator dir = fat.getRoot();
while(true) {
while(false) {
FAT32::DirEntry* de = dir.next();
if (!de) {break;}
std::cout << de->getName() << std::endl;
FAT32::DirEntryAt dea = dir.nextUsable();
if (!dea.isValid()) {break;}
if (1==0) {
FAT32FS::File f = fat.open(*de);
FAT32FS::File2 f = fat.open2(dea);
uint8_t* bufff = (uint8_t*) malloc(1024*1024);
uint32_t read = f.read(de->size, bufff, callback);
if (1==0) {
uint8_t* bufff = (uint8_t*) malloc(1024*1024);
uint32_t read = f.read(f.getSize(), bufff, callback);
std::string name = de->getName();
std::ofstream out("/tmp/ram/" + name);
out.write((char*)bufff, read);
out.close();
std::string name = f.getName();
std::ofstream out("/tmp/ram/" + name);
out.write((char*)bufff, read);
out.close();
free(bufff);
free(bufff);
break;
break;
}
}
}
//FAT32::DirEntryAt root = fat.getRoot().cur();
FAT32FS::File2 file = fat.create2("tmp1.txt");
uint8_t src[128];
file.write(128, src, [] (int percent) {} );
// diff /tmp/ram/TETRIS.GB /apps/workspace/gbemu/tests/tetris.gb
// diff /tmp/ram/KIRBY1.GB /apps/workspace/gbemu/tests/Kirby\'s\ Dream\ Land\ \(USA\,\ Europe\).gb