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:
Diamond Lewis
2023-07-13 07:32:03 -05:00
parent b756089b91
commit 0d8676aa93
14 changed files with 241 additions and 15 deletions

45
src/libleo/driveexist.c Normal file
View 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
View 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
View 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
View 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
View 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
View 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

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

View File

@@ -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();
}