Files
pico-loader/arm9/source/patches/platform/supercard/SuperCardLoaderPlatform.h
2026-02-15 20:26:24 +01:00

124 lines
4.1 KiB
C++

#pragma once
#include "../LoaderPlatform.h"
#include "SuperCardCommon.h"
#include "sclite/SuperCardLiteReadSectorPatchCode.h"
#include "sclite/SuperCardLiteSendSdCommandPatchCode.h"
#include "sclite/SuperCardLiteWriteSectorPatchCode.h"
#include "scsd/SuperCardSDReadSectorPatchCode.h"
#include "scsd/SuperCardSDSendSdCommandPatchCode.h"
#include "scsd/SuperCardSDWriteSectorPatchCode.h"
/// @brief Implementation of LoaderPlatform for the slot 2 SuperCard flashcard
class SuperCardLoaderPlatform : public LoaderPlatform
{
public:
const IReadSectorsPatchCode* CreateSdReadPatchCode(
PatchCodeCollection& patchCodeCollection, PatchHeap& patchHeap) const override
{
auto common = patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardCommonPatchCode(patchHeap);
});
auto changeMode = patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardChangeModePatchCode(patchHeap);
});
auto sendSdCommand = CreateSdCommandPatchCode(patchCodeCollection, patchHeap);
if (isScLite || isSuperChis)
{
return patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardReadSectorLitePatchCode(patchHeap, common, changeMode,
sendSdCommand,
patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardLiteReadDataPatchCode(patchHeap);
})
);
});
}
else
{
return patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardSDReadSectorPatchCode(patchHeap, common, changeMode,
sendSdCommand,
patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardSDReadDataPatchCode(patchHeap);
})
);
});
}
}
const IWriteSectorsPatchCode* CreateSdWritePatchCode(
PatchCodeCollection& patchCodeCollection, PatchHeap& patchHeap) const override
{
auto common = patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardCommonPatchCode(patchHeap);
});
auto changeMode = patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardChangeModePatchCode(patchHeap);
});
auto sendSdCommand = CreateSdCommandPatchCode(patchCodeCollection, patchHeap);
if (isScLite)
{
return patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardLiteWriteSectorPatchCode(patchHeap, common, changeMode,
sendSdCommand,
patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardLiteWriteDataPatchCode(patchHeap);
})
);
});
}
else
{
return patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardSDWriteSectorPatchCode(patchHeap, common, changeMode,
sendSdCommand,
patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardSDWriteDataPatchCode(patchHeap);
})
);
});
}
}
LoaderPlatformType GetPlatformType() const override { return LoaderPlatformType::Slot2; }
bool InitializeSdCard() override;
private:
const ISuperCardSendSdCommandPatchCode* CreateSdCommandPatchCode(
PatchCodeCollection& patchCodeCollection, PatchHeap& patchHeap) const
{
if (isScLite)
{
return patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardLiteSendSdCommandPatchCode(patchHeap);
});
}
else
{
return patchCodeCollection.GetOrAddSharedPatchCode([&]
{
return new SuperCardSDSendSdCommandPatchCode(patchHeap);
});
}
}
u16 isScLite = false;
u16 isSuperChis = false;
bool InitializeSdCardIntern();
};