Files
ESP8266lib/ext/sd/main.cpp

111 lines
2.9 KiB
C++

#include <stdexcept>
#include <iostream>
//#define debugMod(module, str) {printf("i[%-10s] ", module); printf(str); printf("\n");}
//#define debugMod1(module, str, v1) {printf("i[%-10s] ", module); printf(str, v1); printf("\n");}
//#define debugMod2(module, str, v1, v2) {printf("i[%-10s] ", module); printf(str, v1, v2); printf("\n");}
//#define debugMod3(module, str, v1, v2, v3) {printf("i[%-10s] ", module); printf(str, v1, v2, v3); printf("\n");}
//#define debugMod4(module, str, v1, v2, v3, v4) {printf("i[%-10s] ", module); printf(str, v1, v2, v3, v4); printf("\n");}
//#define debugMod5(module, str, v1, v2, v3, v4, v5) {printf("i[%-10s] ", module); printf(str, v1, v2, v3, v4, v5); printf("\n");}
#define PLATFORM DESKTOP
#include "../../Debug.h"
#include "MBR.h"
#include "fat32/FS.h"
#include "AccessHelper.h"
#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(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;
}
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;
}
};
#include <gtest/gtest.h>
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
// diff /tmp/ram/TETRIS.GB /apps/workspace/gbemu/tests/tetris.gb
Simu simu("/tmp/ram/1.dat");
AccessHelper<Simu> ah(simu);
MBR<AccessHelper<Simu>> mbr(ah);
if (mbr.isPresent() && mbr.isValid()) {
for (int i = 0; i < 4; ++i) {
std::cout << (int) mbr.getPartition(i).getType() << " - " << mbr.getPartition(i).getFirstSector() << " - " << mbr.getPartition(i).getNumSectors() << std::endl;
}
using FAT32FS = FAT32::FS<AccessHelper<Simu>>;
FAT32FS fat(ah, mbr.getPartition(0).getFirstSector() * 512);
auto callback = [] (const int percent) {
std::cout << percent << std::endl;
};
FAT32FS::DirIterator dir = fat.getRoot();
while(true) {
FAT32::DirEntry* de = dir.next();
if (!de) {break;}
std::cout << de->getName() << std::endl;
if (1==0) {
FAT32FS::File f = fat.open(*de);
uint8_t* bufff = (uint8_t*) malloc(1024*1024);
uint32_t read = f.read(de->size, bufff, callback);
std::string name = de->getName();
std::ofstream out("/tmp/ram/" + name);
out.write((char*)bufff, read);
out.close();
free(bufff);
break;
}
}
// 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
}
}