mirror of
https://github.com/zeldaret/oot.git
synced 2025-08-13 02:10:57 +00:00
* progress * z64.h issues sorted * remove variables.h * format * n64 fix * another fix * did the wrong fix * fix libleo * fix bss * review * remove instead of comment
66 lines
2.2 KiB
C
66 lines
2.2 KiB
C
#include "ultra64.h"
|
|
|
|
OSPiHandle __DriveRomHandle;
|
|
|
|
OSPiHandle* osDriveRomInit(void) {
|
|
#if PLATFORM_IQUE && defined(NON_MATCHING)
|
|
// On iQue, the compiled output of this file is patched so that the
|
|
// `!first` check is always taken. For non-matching builds, we edit the
|
|
// source code instead.
|
|
static u32 first = false;
|
|
#else
|
|
static u32 first = true;
|
|
#endif
|
|
register s32 status;
|
|
register u32 value;
|
|
register u32 prevInt;
|
|
|
|
__osPiGetAccess();
|
|
|
|
if (!first) {
|
|
__osPiRelAccess();
|
|
return &__DriveRomHandle;
|
|
}
|
|
|
|
first = false;
|
|
__DriveRomHandle.type = DEVICE_TYPE_BULK;
|
|
__DriveRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR1);
|
|
__DriveRomHandle.domain = PI_DOMAIN1;
|
|
__DriveRomHandle.speed = 0;
|
|
bzero(&__DriveRomHandle.transferInfo, sizeof(__OSTranxInfo));
|
|
|
|
status = IO_READ(PI_STATUS_REG);
|
|
while (status & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {
|
|
status = IO_READ(PI_STATUS_REG);
|
|
}
|
|
|
|
IO_WRITE(PI_BSD_DOM1_LAT_REG, 255);
|
|
IO_WRITE(PI_BSD_DOM1_PGS_REG, 0);
|
|
IO_WRITE(PI_BSD_DOM1_RLS_REG, 3);
|
|
IO_WRITE(PI_BSD_DOM1_PWD_REG, 255);
|
|
|
|
value = IO_READ(__DriveRomHandle.baseAddress);
|
|
__DriveRomHandle.latency = value & 0xFF;
|
|
__DriveRomHandle.pulse = (value >> 8) & 0xFF;
|
|
__DriveRomHandle.pageSize = (value >> 0x10) & 0xF;
|
|
__DriveRomHandle.relDuration = (value >> 0x14) & 0xF;
|
|
|
|
IO_WRITE(PI_BSD_DOM1_LAT_REG, __DriveRomHandle.latency);
|
|
IO_WRITE(PI_BSD_DOM1_PGS_REG, __DriveRomHandle.pageSize);
|
|
IO_WRITE(PI_BSD_DOM1_RLS_REG, __DriveRomHandle.relDuration);
|
|
IO_WRITE(PI_BSD_DOM1_PWD_REG, __DriveRomHandle.pulse);
|
|
|
|
__osCurrentHandle[__DriveRomHandle.domain]->type = __DriveRomHandle.type;
|
|
__osCurrentHandle[__DriveRomHandle.domain]->latency = __DriveRomHandle.latency;
|
|
__osCurrentHandle[__DriveRomHandle.domain]->pageSize = __DriveRomHandle.pageSize;
|
|
__osCurrentHandle[__DriveRomHandle.domain]->relDuration = __DriveRomHandle.relDuration;
|
|
__osCurrentHandle[__DriveRomHandle.domain]->pulse = __DriveRomHandle.pulse;
|
|
|
|
prevInt = __osDisableInt();
|
|
__DriveRomHandle.next = __osPiTable;
|
|
__osPiTable = &__DriveRomHandle;
|
|
__osRestoreInt(prevInt);
|
|
__osPiRelAccess();
|
|
|
|
return &__DriveRomHandle;
|
|
}
|