#include #include //#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 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 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 ah(simu); MBR> 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>; 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 } }