Merge pull request #53 from LuigiBlood/libleo

osDriveRomInit match
This commit is contained in:
Revo 2023-07-30 16:23:36 -04:00 committed by GitHub
commit 9acaedf5fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 23 deletions

View File

@ -327,6 +327,8 @@ segments:
- [0x6A3B0, bin, rom_data_6A3B0]
- [0x6A3D0, .data, gb_tower]
- [0x6A3E0, bin, rom_data_6A3E0]
- [0x7A180, .data, libleo/driverominit]
- [0x7A190, bin, rom_data_7A190]
- [0x7A2A0, .data, libultra/os/initialize]
- [0x7A2C0, .data, libultra/al/reverb]
- [0x7A2E0, bin, rom_data_7A2E0]

View File

@ -4,22 +4,21 @@
void __osPiRelAccess(void);
void __osPiGetAccess(void);
extern OSPiHandle* __osCurrentHandle[];
extern OSPiHandle __DriveRomHandle;
OSPiHandle __DriveRomHandle;
#ifdef NON_MATCHING
// https://decomp.me/scratch/uNZ73
OSPiHandle* osDriveRomInit(void) {
register s32 saveMask;
register u32 value;
register s32 status;
static s32 first = 1; // D_80079580
register s32 status;
register s32 saveMask;
register u32 value;
static s32 first = 1; // D_80079580
u32 latency, pageSize, release, pulse;
__osPiGetAccess();
if (!first) {
__osPiRelAccess();
return &__DriveRomHandle;
}
__osPiGetAccess();
if (!first) {
__osPiRelAccess();
return &__DriveRomHandle;
}
first = 0;
__DriveRomHandle.type = DEVICE_TYPE_BULK;
__DriveRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR1);
@ -27,31 +26,39 @@ OSPiHandle* osDriveRomInit(void) {
__DriveRomHandle.speed = 0;
bzero(&__DriveRomHandle.transferInfo, sizeof(__OSTranxInfo));
while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) {}
while (status = HW_REG(PI_STATUS_REG, u32), status & (PI_STATUS_IO_BUSY | PI_STATUS_DMA_BUSY)) {}
//Keep the previous PI settings as we go to into the safest settings to read the PI info from DDROM.
latency = HW_REG(PI_BSD_DOM1_LAT_REG, u32);
pageSize = HW_REG(PI_BSD_DOM1_PGS_REG, u32);
release = HW_REG(PI_BSD_DOM1_RLS_REG, u32);
pulse = HW_REG(PI_BSD_DOM1_PWD_REG, u32);
//Set the safest PI settings
HW_REG(PI_BSD_DOM1_LAT_REG, u32) = 0xff;
HW_REG(PI_BSD_DOM1_PGS_REG, u32) = 0;
HW_REG(PI_BSD_DOM1_RLS_REG, u32) = 3;
HW_REG(PI_BSD_DOM1_PWD_REG, u32) = 0xff;
//Read the PI settings from DDROM and put it in __DriveRomHandle
value = HW_REG(__DriveRomHandle.baseAddress, u32);
__DriveRomHandle.latency = value & 0xFF;
__DriveRomHandle.pulse = (value >> 8) & 0xFF;
__DriveRomHandle.pageSize = (value >> 0x10) & 0xF;
__DriveRomHandle.relDuration = (value >> 0x14) & 0xF;
__DriveRomHandle.pulse = (value >> 8) & 0xFF;
//Put back the previous PI settings
HW_REG(PI_BSD_DOM1_LAT_REG, u32) = latency;
HW_REG(PI_BSD_DOM1_PGS_REG, u32) = pageSize;
HW_REG(PI_BSD_DOM1_RLS_REG, u32) = release;
HW_REG(PI_BSD_DOM1_PWD_REG, u32) = pulse;
HW_REG(PI_BSD_DOM1_LAT_REG, u32) = (u8)value;
HW_REG(PI_BSD_DOM1_PGS_REG, u32) = __DriveRomHandle.pageSize;
HW_REG(PI_BSD_DOM1_RLS_REG, u32) = __DriveRomHandle.relDuration;
HW_REG(PI_BSD_DOM1_PWD_REG, u32) = __DriveRomHandle.pulse;
saveMask = __osDisableInt();
__DriveRomHandle.next = __osPiTable;
__osPiTable = &__DriveRomHandle;
__osRestoreInt(saveMask);
__osPiRelAccess();
return &__DriveRomHandle;
return &__DriveRomHandle;
}
#else
#pragma GLOBAL_ASM("asm/nonmatchings/libleo/driverominit/osDriveRomInit.s")
#endif