mirror of
https://github.com/LNH-team/pico-loader.git
synced 2026-06-02 09:16:49 +02:00
Initial commit
This commit is contained in:
86
arm7/source/loader/DldiDriver.h
Normal file
86
arm7/source/loader/DldiDriver.h
Normal file
@@ -0,0 +1,86 @@
|
||||
#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)();
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user