1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-08-13 02:10:57 +00:00
oot/src/boot/driverominit.c
fig02 2278bcb2c3
Remove Variables.h; Decouple z64.h from global.h (#2507)
* 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
2025-04-19 22:04:08 -04:00

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;
}