huge work on FAT32, initial support for writing
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user