mirror of
https://github.com/LNH-team/pico-loader.git
synced 2026-01-10 08:29:29 +01:00
87 lines
3.2 KiB
C++
87 lines
3.2 KiB
C++
#pragma once
|
|
#include "dldiHeader.h"
|
|
|
|
/// @brief Class representing a DLDI driver.
|
|
class DldiDriver
|
|
{
|
|
dldi_header_t* _driver;
|
|
public:
|
|
explicit DldiDriver(dldi_header_t* driver)
|
|
: _driver(driver) { }
|
|
|
|
/// @brief Returns whether the driver has been relocated to its current ram address.
|
|
/// @return True if the driver is relocated to its current ram address, or false otherwise.
|
|
bool IsRelocated() const
|
|
{
|
|
return _driver->driverStartAddress == (u32)_driver;
|
|
}
|
|
|
|
/// @brief Relocates the driver to its current ram address.
|
|
void Relocate()
|
|
{
|
|
Relocate((u32)_driver);
|
|
}
|
|
|
|
/// @brief Relocates the driver to the given targetAddress.
|
|
/// @param targetAddress The address to relocate the driver to.
|
|
void Relocate(u32 targetAddress);
|
|
|
|
/// @brief Clears the bss area of the driver if needed, making it ready for use.
|
|
/// This method should only be used after placing the driver in a memory region
|
|
/// with enough space and relocating it.
|
|
void PrepareForUse();
|
|
|
|
/// @brief Patches this dldi driver into the given stub.
|
|
/// @param stub The stub to patch the dldi driver into.
|
|
/// @return \c true if patching was successful, or \c false otherwise.
|
|
bool PatchTo(dldi_header_t* stub);
|
|
|
|
/// @brief Calls the startup function of the DLDI driver and returns the result.
|
|
/// @return \c true if startup was successful, or \c false otherwise.
|
|
bool Startup()
|
|
{
|
|
return ((dldi_startup_func_t)_driver->startupFuncAddress)();
|
|
}
|
|
|
|
/// @brief Calls the is inserted function of the DLDI driver and returns the result.
|
|
/// @return \c true if the storage medium is inserted, or \c false otherwise.
|
|
bool IsInserted()
|
|
{
|
|
return ((dldi_inserted_func_t)_driver->isInsertedFuncAddress)();
|
|
}
|
|
|
|
/// @brief Reads sectors using this DLDI driver.
|
|
/// @param sector The sector to start reading at.
|
|
/// @param count The number of sectors to read.
|
|
/// @param dst The destination buffer.
|
|
/// @return \c true if reading was successful, or \c false otherwise.
|
|
bool ReadSectors(u32 sector, u32 count, void* dst)
|
|
{
|
|
return ((dldi_read_func_t)_driver->readSectorsFuncAddress)(sector, count, dst);
|
|
}
|
|
|
|
/// @brief Writes sectors using this DLDI driver.
|
|
/// @param sector The sector to start writing at.
|
|
/// @param count The number of sectors to write.
|
|
/// @param src The source buffer.
|
|
/// @return \c true if writing was successful, or \c false otherwise.
|
|
bool WriteSectors(u32 sector, u32 count, const void* src)
|
|
{
|
|
return ((dldi_write_func_t)_driver->writeSectorsFuncAddress)(sector, count, src);
|
|
}
|
|
|
|
/// @brief Calls the clear status function of the DLDI driver and returns the result.
|
|
/// @return \c true if clear status was successful, or \c false otherwise.
|
|
bool ClearStatus()
|
|
{
|
|
return ((dldi_clearstatus_func_t)_driver->clearStatusFuncAddress)();
|
|
}
|
|
|
|
/// @brief Calls the shutdown function of the DLDI driver and returns the result.
|
|
/// @return \c true if shutdown was successful, or \c false otherwise.
|
|
bool Shutdown()
|
|
{
|
|
return ((dldi_shutdown_func_t)_driver->shutdownFuncAddress)();
|
|
}
|
|
};
|