mirror of
https://github.com/pret/pokestadium.git
synced 2026-09-11 12:55:33 -05:00
decompile Libleo main api
decomp ReadDiskID decomp ReadWrite add symbol addresses decompile LeoSetRTC decompile LeoReadRTC decompile LeoSeek decompile LeoTestUnitReady decompile LeoDriveExist decomp LBA <-> Byte decompile LeoSetRTC
This commit is contained in:
45
src/libleo/driveexist.c
Normal file
45
src/libleo/driveexist.c
Normal file
@@ -0,0 +1,45 @@
|
||||
#include <ultra64.h>
|
||||
#include "libleo/internal.h"
|
||||
|
||||
void __osPiRelAccess(void);
|
||||
void __osPiGetAccess(void);
|
||||
|
||||
#define CONNECTED 0x2129FFF8
|
||||
#define DDROM_STATUS_REG 0x06001010
|
||||
|
||||
// https://github.com/LuigiBlood/64dd/wiki/64DD-IPL
|
||||
u32 LeoDriveExist(void) {
|
||||
register u32 ddromStatus;
|
||||
register s32 status;
|
||||
register u32 lastLatency;
|
||||
register u32 lastPageSize;
|
||||
register u32 lastRelDuration;
|
||||
register u32 lastPulse;
|
||||
|
||||
__osPiGetAccess();
|
||||
|
||||
while ((status = HW_REG(PI_STATUS_REG, u32)) & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY)) {}
|
||||
|
||||
lastLatency = HW_REG(PI_BSD_DOM1_LAT_REG, u32);
|
||||
lastPageSize = HW_REG(PI_BSD_DOM1_PGS_REG, u32);
|
||||
lastRelDuration = HW_REG(PI_BSD_DOM1_RLS_REG, u32);
|
||||
lastPulse = HW_REG(PI_BSD_DOM1_PWD_REG, u32);
|
||||
|
||||
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;
|
||||
|
||||
ddromStatus = HW_REG(DDROM_STATUS_REG, u32);
|
||||
|
||||
HW_REG(PI_BSD_DOM1_LAT_REG, u32) = lastLatency;
|
||||
HW_REG(PI_BSD_DOM1_PGS_REG, u32) = lastPageSize;
|
||||
HW_REG(PI_BSD_DOM1_RLS_REG, u32) = lastRelDuration;
|
||||
HW_REG(PI_BSD_DOM1_PWD_REG, u32) = lastPulse;
|
||||
|
||||
__osPiRelAccess();
|
||||
if (ddromStatus == CONNECTED) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
19
src/libleo/readdiskid.c
Normal file
19
src/libleo/readdiskid.c
Normal file
@@ -0,0 +1,19 @@
|
||||
#include <ultra64.h>
|
||||
#include "libleo/internal.h"
|
||||
|
||||
s32 LeoReadDiskID(LEOCmd *cmdBlock, LEODiskID *vaddr, OSMesgQueue *mq) {
|
||||
if (!__leoActive) {
|
||||
return -1;
|
||||
}
|
||||
cmdBlock->header.command = LEO_COMMAND_READ_DISK_ID;
|
||||
cmdBlock->header.reserve1 = 0;
|
||||
cmdBlock->header.control = 0;
|
||||
cmdBlock->header.reserve3 = 0;
|
||||
cmdBlock->data.readdiskid.buffer_pointer = vaddr;
|
||||
if (mq != NULL) {
|
||||
cmdBlock->header.control |= LEO_CONTROL_POST;
|
||||
cmdBlock->header.post = mq;
|
||||
}
|
||||
leoCommand(cmdBlock);
|
||||
return 0;
|
||||
}
|
||||
18
src/libleo/readrtc.c
Normal file
18
src/libleo/readrtc.c
Normal file
@@ -0,0 +1,18 @@
|
||||
#include <ultra64.h>
|
||||
#include "libleo/internal.h"
|
||||
|
||||
s32 LeoReadRTC(LEOCmd* cmdBlock, OSMesgQueue* mq) {
|
||||
if (!__leoActive) {
|
||||
return -1;
|
||||
}
|
||||
cmdBlock->header.command = LEO_COMMAND_READ_TIMER;
|
||||
cmdBlock->header.reserve1 = 0;
|
||||
cmdBlock->header.control = 0;
|
||||
cmdBlock->header.reserve3 = 0;
|
||||
if (mq != NULL) {
|
||||
cmdBlock->header.control |= LEO_CONTROL_POST;
|
||||
cmdBlock->header.post = mq;
|
||||
}
|
||||
leoCommand(cmdBlock);
|
||||
return 0;
|
||||
}
|
||||
26
src/libleo/readwrite.c
Normal file
26
src/libleo/readwrite.c
Normal file
@@ -0,0 +1,26 @@
|
||||
#include <ultra64.h>
|
||||
#include "libleo/internal.h"
|
||||
|
||||
s32 LeoReadWrite(LEOCmd* cmdBlock, s32 direction, u32 LBA, void* vAddr, u32 nLBAs, OSMesgQueue* mq) {
|
||||
if (!__leoActive) {
|
||||
return -1;
|
||||
}
|
||||
if (direction == OS_READ) {
|
||||
cmdBlock->header.command = LEO_COMMAND_READ;
|
||||
} else {
|
||||
cmdBlock->header.command = LEO_COMMAND_WRITE;
|
||||
}
|
||||
cmdBlock->header.reserve1 = 0;
|
||||
if (mq != NULL) {
|
||||
cmdBlock->header.control = LEO_CONTROL_POST;
|
||||
} else {
|
||||
cmdBlock->header.control = 0;
|
||||
}
|
||||
cmdBlock->header.reserve3 = 0;
|
||||
cmdBlock->header.post = mq;
|
||||
cmdBlock->data.readwrite.lba = LBA;
|
||||
cmdBlock->data.readwrite.xfer_blks = nLBAs;
|
||||
cmdBlock->data.readwrite.buff_ptr = vAddr;
|
||||
leoCommand(cmdBlock);
|
||||
return 0;
|
||||
}
|
||||
19
src/libleo/seek.c
Normal file
19
src/libleo/seek.c
Normal file
@@ -0,0 +1,19 @@
|
||||
#include <ultra64.h>
|
||||
#include "libleo/internal.h"
|
||||
|
||||
s32 LeoSeek(LEOCmd* cmdBlock, u32 lba, OSMesgQueue* mq) {
|
||||
if (!__leoActive) {
|
||||
return -1;
|
||||
}
|
||||
cmdBlock->header.command = LEO_COMMAND_SEEK;
|
||||
cmdBlock->header.reserve1 = 0;
|
||||
cmdBlock->header.control = 0;
|
||||
cmdBlock->header.reserve3 = 0;
|
||||
cmdBlock->data.readwrite.lba = lba;
|
||||
if (mq != NULL) {
|
||||
cmdBlock->header.control |= LEO_CONTROL_POST;
|
||||
cmdBlock->header.post = mq;
|
||||
}
|
||||
leoCommand(cmdBlock);
|
||||
return 0;
|
||||
}
|
||||
49
src/libleo/setrtc.c
Normal file
49
src/libleo/setrtc.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <ultra64.h>
|
||||
#include "libleo/internal.h"
|
||||
|
||||
s32 LeoSetRTC(LEOCmd* cmdBlock, LEODiskTime* RTCdata, OSMesgQueue* mq) {
|
||||
if (!__leoActive) {
|
||||
return -1;
|
||||
}
|
||||
if (leoVerifyRTC(RTCdata->yearhi, RTCdata->yearlo) != 0) {
|
||||
osSendMesg(mq, (void *)LEO_SENSE_ILLEGAL_TIMER_VALUE, 1);
|
||||
return 0;
|
||||
}
|
||||
cmdBlock->header.command = LEO_COMMAND_SET_TIMER;
|
||||
cmdBlock->header.reserve1 = 0;
|
||||
cmdBlock->header.control = 0;
|
||||
cmdBlock->header.reserve3 = 0;
|
||||
_bcopy(RTCdata, &cmdBlock->data.time, 8);
|
||||
if (mq != NULL) {
|
||||
cmdBlock->header.control |= LEO_CONTROL_POST;
|
||||
cmdBlock->header.post = mq;
|
||||
}
|
||||
leoCommand(cmdBlock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef NON_MATCHING
|
||||
/*
|
||||
* The "year" is expressed in 4 digits with the high 2 digits being yearhi and low 2 digits being yearlo. 2023 = 0x20, 0x23
|
||||
* The "hour" member uses the 24-hour clock.
|
||||
* Return 0 if year is between ranges from 1996 to 2095
|
||||
*/
|
||||
// https://decomp.me/scratch/NUHIy
|
||||
s32 leoVerifyRTC(u8 yearhi, u8 yearlo) {
|
||||
u32 year;
|
||||
s32 hiMask;
|
||||
u32 loMask;
|
||||
hiMask = yearhi & 0xFF;
|
||||
loMask = yearlo & 0xFF;
|
||||
if (((loMask & 0xF) >= 0xA) || ((loMask & 0xF0) >= 0x91) || ((hiMask & 0xF) >= 0xA) || ((hiMask & 0xF0) >= 0x91)) {
|
||||
return 1;
|
||||
}
|
||||
year = (((hiMask - ((hiMask >> 4) * 6)) * 0x64) + loMask) - ((loMask >> 4) * 6);
|
||||
if ((year < 0x7CCU) || (year >= 0x830U)) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#pragma GLOBAL_ASM("asm/nonmatchings/libleo/setrtc/leoVerifyRTC.s")
|
||||
#endif
|
||||
23
src/libleo/testunitready.c
Normal file
23
src/libleo/testunitready.c
Normal file
@@ -0,0 +1,23 @@
|
||||
#include <ultra64.h>
|
||||
#include "libleo/internal.h"
|
||||
|
||||
s32 LeoTestUnitReady(u8* status) {
|
||||
volatile LEOCmdTestUnitReady cmdBlock;
|
||||
|
||||
if (!__leoActive) {
|
||||
return -1;
|
||||
}
|
||||
if (HW_REG(PI_STATUS_REG, u32) & 1) {
|
||||
return LEO_STATUS_BUSY;
|
||||
}
|
||||
cmdBlock.header.command = 3;
|
||||
cmdBlock.header.reserve1 = 0;
|
||||
cmdBlock.header.control = 0;
|
||||
cmdBlock.header.reserve3 = 0;
|
||||
leoCommand((void *)&cmdBlock);
|
||||
|
||||
while (cmdBlock.header.status == LEO_STATUS_BUSY) {}
|
||||
|
||||
*status = cmdBlock.test;
|
||||
return cmdBlock.header.sense;
|
||||
}
|
||||
@@ -156,12 +156,12 @@ void* func_800009C8(void) {
|
||||
}
|
||||
|
||||
void *func_800009F8(struct UnkStruct800006C4_2* arg0) {
|
||||
func_80050FC0(arg0, 0, arg0->unk1C, arg0->vaddr, arg0->size, &D_80083BD0.queue2);
|
||||
LeoReadWrite(arg0, 0, arg0->unk1C, arg0->vaddr, arg0->size, &D_80083BD0.queue2);
|
||||
return func_800009C8();
|
||||
}
|
||||
|
||||
void *func_80000A3C(struct UnkStruct800006C4_2* arg0) {
|
||||
func_80050FC0(arg0, 1, arg0->unk1C, arg0->vaddr, arg0->size, &D_80083BD0.queue2);
|
||||
LeoReadWrite(arg0, 1, arg0->unk1C, arg0->vaddr, arg0->size, &D_80083BD0.queue2);
|
||||
return func_800009C8();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user