#include "ultra64.h" OSPiHandle __CartRomHandle; OSPiHandle* osCartRomInit(void) { static u32 first = true; register u32 value; register s32 status; register u32 prevInt; register u32 latency; register u32 pageSize; register u32 relDuration; register u32 pulse; __osPiGetAccess(); if (!first) { __osPiRelAccess(); return &__CartRomHandle; } first = false; __CartRomHandle.type = DEVICE_TYPE_CART; __CartRomHandle.baseAddress = PHYS_TO_K1(PI_DOM1_ADDR2); __CartRomHandle.domain = PI_DOMAIN1; __CartRomHandle.speed = 0; bzero(&__CartRomHandle.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); } latency = IO_READ(PI_BSD_DOM1_LAT_REG); pageSize = IO_READ(PI_BSD_DOM1_PGS_REG); relDuration = IO_READ(PI_BSD_DOM1_RLS_REG); pulse = IO_READ(PI_BSD_DOM1_PWD_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(__CartRomHandle.baseAddress); __CartRomHandle.latency = value & 0xFF; __CartRomHandle.pageSize = (value >> 0x10) & 0xF; __CartRomHandle.relDuration = (value >> 0x14) & 0xF; __CartRomHandle.pulse = (value >> 8) & 0xFF; IO_WRITE(PI_BSD_DOM1_LAT_REG, latency); IO_WRITE(PI_BSD_DOM1_PGS_REG, pageSize); IO_WRITE(PI_BSD_DOM1_RLS_REG, relDuration); IO_WRITE(PI_BSD_DOM1_PWD_REG, pulse); prevInt = __osDisableInt(); __CartRomHandle.next = __osPiTable; __osPiTable = &__CartRomHandle; __osRestoreInt(prevInt); __osPiRelAccess(); return &__CartRomHandle; }