mirror of https://github.com/PrimeDecomp/prime.git
More DolphinCDvdFile progress, only one function remains
Former-commit-id: 76e0804ecb
This commit is contained in:
parent
1accd793c4
commit
17148384f2
|
@ -1289,7 +1289,7 @@ AsyncIdle__8CPakFileFv:
|
|||
/* 80368364 003652C4 80 03 00 2C */ lwz r0, 0x2c(r3)
|
||||
/* 80368368 003652C8 2C 00 00 03 */ cmpwi r0, 3
|
||||
/* 8036836C 003652CC 41 82 00 7C */ beq lbl_803683E8
|
||||
/* 80368370 003652D0 4B FE 7C 0D */ bl sub_8034ff7c
|
||||
/* 80368370 003652D0 4B FE 7C 0D */ bl IsARAMFileLoaded__8CDvdFileFv
|
||||
/* 80368374 003652D4 54 60 06 3F */ clrlwi. r0, r3, 0x18
|
||||
/* 80368378 003652D8 41 82 00 70 */ beq lbl_803683E8
|
||||
/* 8036837C 003652DC 80 7F 00 34 */ lwz r3, 0x34(r31)
|
||||
|
|
|
@ -17,14 +17,13 @@ lbl_805A89B4:
|
|||
lbl_805A89B8:
|
||||
# ROM: 0x3F6358
|
||||
.4byte 0x00010000
|
||||
.4byte 0
|
||||
|
||||
.section .sbss, "wa"
|
||||
.balign 8
|
||||
|
||||
.global lbl_805A95D0
|
||||
lbl_805A95D0:
|
||||
.skip 0x8
|
||||
.global sFirstARAM
|
||||
sFirstARAM:
|
||||
.skip 0x4
|
||||
|
||||
.section .text, "ax"
|
||||
|
||||
|
@ -151,9 +150,9 @@ AsyncSeekRead__8CDvdFileFPvUi11ESeekOrigini:
|
|||
/* 8034FA0C 0034C96C 54 1B 00 34 */ rlwinm r27, r0, 0, 0, 0x1a
|
||||
/* 8034FA10 0034C970 7F 64 DB 78 */ mr r4, r27
|
||||
/* 8034FA14 0034C974 48 02 F0 9D */ bl DCFlushRange
|
||||
/* 8034FA18 0034C978 3C 80 80 3E */ lis r4, lbl_803D8230@ha
|
||||
/* 8034FA18 0034C978 3C 80 80 3E */ lis r4, "@stringBase0"@ha
|
||||
/* 8034FA1C 0034C97C 38 60 00 08 */ li r3, 8
|
||||
/* 8034FA20 0034C980 38 84 82 30 */ addi r4, r4, lbl_803D8230@l
|
||||
/* 8034FA20 0034C980 38 84 82 30 */ addi r4, r4, "@stringBase0"@l
|
||||
/* 8034FA24 0034C984 38 A0 00 00 */ li r5, 0
|
||||
/* 8034FA28 0034C988 4B FC 5E 45 */ bl __nw__FUlPCcPCc
|
||||
/* 8034FA2C 0034C98C 7C 7C 1B 79 */ or. r28, r3, r3
|
||||
|
@ -176,9 +175,9 @@ lbl_8034FA6C:
|
|||
/* 8034FA6C 0034C9CC 7F 9B E3 78 */ mr r27, r28
|
||||
/* 8034FA70 0034C9D0 48 00 00 70 */ b lbl_8034FAE0
|
||||
lbl_8034FA74:
|
||||
/* 8034FA74 0034C9D4 3C 80 80 3E */ lis r4, lbl_803D8230@ha
|
||||
/* 8034FA74 0034C9D4 3C 80 80 3E */ lis r4, "@stringBase0"@ha
|
||||
/* 8034FA78 0034C9D8 38 60 00 40 */ li r3, 0x40
|
||||
/* 8034FA7C 0034C9DC 38 84 82 30 */ addi r4, r4, lbl_803D8230@l
|
||||
/* 8034FA7C 0034C9DC 38 84 82 30 */ addi r4, r4, "@stringBase0"@l
|
||||
/* 8034FA80 0034C9E0 38 A0 00 00 */ li r5, 0
|
||||
/* 8034FA84 0034C9E4 4B FC 5D E9 */ bl __nw__FUlPCcPCc
|
||||
/* 8034FA88 0034C9E8 7C 7C 1B 79 */ or. r28, r3, r3
|
||||
|
@ -433,9 +432,9 @@ StartARAMFileLoad__8CDvdFileFv:
|
|||
/* 8034FDE4 0034CD44 93 C1 00 38 */ stw r30, 0x38(r1)
|
||||
/* 8034FDE8 0034CD48 93 A1 00 34 */ stw r29, 0x34(r1)
|
||||
/* 8034FDEC 0034CD4C 7C 7D 1B 78 */ mr r29, r3
|
||||
/* 8034FDF0 0034CD50 3C 60 80 3E */ lis r3, lbl_803D8230@ha
|
||||
/* 8034FDF0 0034CD50 3C 60 80 3E */ lis r3, "@stringBase0"@ha
|
||||
/* 8034FDF4 0034CD54 93 81 00 30 */ stw r28, 0x30(r1)
|
||||
/* 8034FDF8 0034CD58 38 A3 82 30 */ addi r5, r3, lbl_803D8230@l
|
||||
/* 8034FDF8 0034CD58 38 A3 82 30 */ addi r5, r3, "@stringBase0"@l
|
||||
/* 8034FDFC 0034CD5C 38 61 00 20 */ addi r3, r1, 0x20
|
||||
/* 8034FE00 0034CD60 83 FD 00 0C */ lwz r31, 0xc(r29)
|
||||
/* 8034FE04 0034CD64 4B F8 65 D1 */ bl __ct__10CCallStackFUiPCcPCc
|
||||
|
@ -469,9 +468,9 @@ lbl_8034FE58:
|
|||
/* 8034FE70 0034CDD0 80 61 00 1C */ lwz r3, 0x1c(r1)
|
||||
/* 8034FE74 0034CDD4 4B FC 5A BD */ bl Free__7CMemoryFPCv
|
||||
lbl_8034FE78:
|
||||
/* 8034FE78 0034CDD8 3C 60 80 3E */ lis r3, lbl_803D8230@ha
|
||||
/* 8034FE78 0034CDD8 3C 60 80 3E */ lis r3, "@stringBase0"@ha
|
||||
/* 8034FE7C 0034CDDC 3C 80 80 3D */ lis r4, kUnknownType__10CCallStack@ha
|
||||
/* 8034FE80 0034CDE0 38 A3 82 30 */ addi r5, r3, lbl_803D8230@l
|
||||
/* 8034FE80 0034CDE0 38 A3 82 30 */ addi r5, r3, "@stringBase0"@l
|
||||
/* 8034FE84 0034CDE4 38 C4 6A A8 */ addi r6, r4, kUnknownType__10CCallStack@l
|
||||
/* 8034FE88 0034CDE8 38 61 00 10 */ addi r3, r1, 0x10
|
||||
/* 8034FE8C 0034CDEC 38 80 FF FF */ li r4, -1
|
||||
|
@ -539,8 +538,8 @@ lbl_8034FF1C:
|
|||
/* 8034FF74 0034CED4 38 21 00 40 */ addi r1, r1, 0x40
|
||||
/* 8034FF78 0034CED8 4E 80 00 20 */ blr
|
||||
|
||||
.global sub_8034ff7c
|
||||
sub_8034ff7c:
|
||||
.global IsARAMFileLoaded__8CDvdFileFv
|
||||
IsARAMFileLoaded__8CDvdFileFv:
|
||||
/* 8034FF7C 0034CEDC 94 21 FF E0 */ stwu r1, -0x20(r1)
|
||||
/* 8034FF80 0034CEE0 7C 08 02 A6 */ mflr r0
|
||||
/* 8034FF84 0034CEE4 90 01 00 24 */ stw r0, 0x24(r1)
|
||||
|
@ -618,7 +617,7 @@ PopARAMFileLoad__8CDvdFileFv:
|
|||
/* 80350078 0034CFD8 80 84 00 60 */ lwz r4, 0x60(r4)
|
||||
/* 8035007C 0034CFDC 98 1E 00 09 */ stb r0, 9(r30)
|
||||
/* 80350080 0034CFE0 28 04 00 00 */ cmplwi r4, 0
|
||||
/* 80350084 0034CFE4 90 8D AA 10 */ stw r4, lbl_805A95D0@sda21(r13)
|
||||
/* 80350084 0034CFE4 90 8D AA 10 */ stw r4, sFirstARAM@sda21(r13)
|
||||
/* 80350088 0034CFE8 41 82 00 0C */ beq lbl_80350094
|
||||
/* 8035008C 0034CFEC 7C 83 23 78 */ mr r3, r4
|
||||
/* 80350090 0034CFF0 4B FF FD 39 */ bl StartARAMFileLoad__8CDvdFileFv
|
||||
|
@ -641,11 +640,11 @@ PushARAMFileLoad__8CDvdFileFv:
|
|||
/* 803500C4 0034D024 93 C1 00 08 */ stw r30, 8(r1)
|
||||
/* 803500C8 0034D028 7C 7E 1B 78 */ mr r30, r3
|
||||
/* 803500CC 0034D02C 48 03 15 95 */ bl OSDisableInterrupts
|
||||
/* 803500D0 0034D030 80 0D AA 10 */ lwz r0, lbl_805A95D0@sda21(r13)
|
||||
/* 803500D0 0034D030 80 0D AA 10 */ lwz r0, sFirstARAM@sda21(r13)
|
||||
/* 803500D4 0034D034 7C 7F 1B 78 */ mr r31, r3
|
||||
/* 803500D8 0034D038 28 00 00 00 */ cmplwi r0, 0
|
||||
/* 803500DC 0034D03C 40 82 00 14 */ bne lbl_803500F0
|
||||
/* 803500E0 0034D040 93 CD AA 10 */ stw r30, lbl_805A95D0@sda21(r13)
|
||||
/* 803500E0 0034D040 93 CD AA 10 */ stw r30, sFirstARAM@sda21(r13)
|
||||
/* 803500E4 0034D044 7F C3 F3 78 */ mr r3, r30
|
||||
/* 803500E8 0034D048 4B FF FC E1 */ bl StartARAMFileLoad__8CDvdFileFv
|
||||
/* 803500EC 0034D04C 48 00 00 30 */ b lbl_8035011C
|
||||
|
@ -688,9 +687,9 @@ TryARAMFile__8CDvdFileFv:
|
|||
/* 80350160 0034D0C0 80 1B 00 04 */ lwz r0, 4(r27)
|
||||
/* 80350164 0034D0C4 7C 03 00 40 */ cmplw r3, r0
|
||||
/* 80350168 0034D0C8 41 82 00 E0 */ beq lbl_80350248
|
||||
/* 8035016C 0034D0CC 3C 80 80 3E */ lis r4, lbl_803D8230@ha
|
||||
/* 8035016C 0034D0CC 3C 80 80 3E */ lis r4, "@stringBase0"@ha
|
||||
/* 80350170 0034D0D0 38 60 00 94 */ li r3, 0x94
|
||||
/* 80350174 0034D0D4 38 84 82 30 */ addi r4, r4, lbl_803D8230@l
|
||||
/* 80350174 0034D0D4 38 84 82 30 */ addi r4, r4, "@stringBase0"@l
|
||||
/* 80350178 0034D0D8 38 A0 00 00 */ li r5, 0
|
||||
/* 8035017C 0034D0DC 4B FC 56 F1 */ bl __nw__FUlPCcPCc
|
||||
/* 80350180 0034D0E0 7C 7F 1B 79 */ or. r31, r3, r3
|
||||
|
@ -948,10 +947,10 @@ DVDARAMXferCallback__8CDvdFileFlP11DVDFileInfo:
|
|||
DecodeARAMFile__FPCc:
|
||||
/* 803504F0 0034D450 94 21 FF F0 */ stwu r1, -0x10(r1)
|
||||
/* 803504F4 0034D454 7C 08 02 A6 */ mflr r0
|
||||
/* 803504F8 0034D458 3C 80 80 3E */ lis r4, lbl_803D8230@ha
|
||||
/* 803504F8 0034D458 3C 80 80 3E */ lis r4, "@stringBase0"@ha
|
||||
/* 803504FC 0034D45C 38 A0 00 05 */ li r5, 5
|
||||
/* 80350500 0034D460 90 01 00 14 */ stw r0, 0x14(r1)
|
||||
/* 80350504 0034D464 38 84 82 30 */ addi r4, r4, lbl_803D8230@l
|
||||
/* 80350504 0034D464 38 84 82 30 */ addi r4, r4, "@stringBase0"@l
|
||||
/* 80350508 0034D468 38 84 00 07 */ addi r4, r4, 7
|
||||
/* 8035050C 0034D46C 93 E1 00 0C */ stw r31, 0xc(r1)
|
||||
/* 80350510 0034D470 7C 7F 1B 78 */ mr r31, r3
|
||||
|
@ -971,10 +970,7 @@ lbl_8035052C:
|
|||
|
||||
.section .rodata
|
||||
.balign 8
|
||||
.global lbl_803D8230
|
||||
lbl_803D8230:
|
||||
"@stringBase0":
|
||||
# ROM: 0x3D5230
|
||||
.asciz "??(??)"
|
||||
.byte 0x61
|
||||
.asciz "ram:"
|
||||
.balign 4
|
||||
.asciz "aram:"
|
||||
|
|
|
@ -1,17 +1,19 @@
|
|||
#ifndef _CDVDFILE
|
||||
#define _CDVDFILE
|
||||
|
||||
#include "types.h"
|
||||
#include "Kyoto/CDvdRequest.hpp"
|
||||
#include "types.h"
|
||||
|
||||
#include "rstl/auto_ptr.hpp"
|
||||
#include "rstl/reserved_vector.hpp"
|
||||
#include "rstl/single_ptr.hpp"
|
||||
#include "rstl/string.hpp"
|
||||
|
||||
enum ESeekOrigin {
|
||||
kSO_Set,
|
||||
kSO_Cur,
|
||||
kSO_End
|
||||
};
|
||||
enum ESeekOrigin { kSO_Set, kSO_Cur, kSO_End };
|
||||
|
||||
|
||||
class CDvdFile;
|
||||
struct CDvdFileARAM;
|
||||
struct DVDFileInfo;
|
||||
class CDvdFile {
|
||||
public:
|
||||
|
@ -24,6 +26,7 @@ public:
|
|||
void TryARAMFile();
|
||||
void PushARAMFileLoad();
|
||||
void PopARAMFileLoad();
|
||||
bool IsARAMFileLoaded();
|
||||
void StartARAMFileLoad();
|
||||
void StallForARAMFile();
|
||||
CDvdRequest* SyncRead(void* buf, uint len);
|
||||
|
@ -38,12 +41,13 @@ public:
|
|||
static void DVDARAMXferCallback(long, DVDFileInfo*);
|
||||
static void ARAMARAMXferCallback(u32 addr);
|
||||
static void internalCallback(s32, DVDFileInfo*);
|
||||
|
||||
private:
|
||||
int x0_fileEntry;
|
||||
void* x4_;
|
||||
uchar x8_;
|
||||
uchar x9_;
|
||||
int xc_;
|
||||
uchar* x4_;
|
||||
bool x8_;
|
||||
bool x9_;
|
||||
rstl::single_ptr< CDvdFileARAM > xc_;
|
||||
int x10_offset;
|
||||
int x14_size;
|
||||
rstl::string x18_filename;
|
||||
|
|
|
@ -21,6 +21,8 @@ public:
|
|||
void PostCancelRequest();
|
||||
int GetMediaType() const;
|
||||
|
||||
DVDFileInfo& FileInfo() { return mFileInfo; }
|
||||
|
||||
private:
|
||||
DVDFileInfo mFileInfo;
|
||||
};
|
||||
|
|
|
@ -116,6 +116,14 @@ s32 DVDGetDriveStatus();
|
|||
|
||||
s32 DVDConvertPathToEntrynum(char* pathPtr);
|
||||
|
||||
BOOL DVDReadAsyncPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset,
|
||||
DVDCallback callback, s32 prio);
|
||||
|
||||
#define DVDReadAsync(fileInfo, addr, length, offset, callback) \
|
||||
DVDReadAsyncPrio((fileInfo), (addr), (length), (offset), (callback), 2)
|
||||
#define DVDSeekAsync(fileInfo, offset, callback) \
|
||||
DVDSeekAsyncPrio((fileInfo), (offset), (callback), 2)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,24 +1,44 @@
|
|||
#include "Kyoto/CARAMToken.hpp"
|
||||
#include "Kyoto/CDvdFile.hpp"
|
||||
|
||||
#include "Kyoto/CDvdRequest.hpp"
|
||||
|
||||
#include "Kyoto/CARAMManager.hpp"
|
||||
|
||||
#include "rstl/math.hpp"
|
||||
|
||||
#include "dolphin/arq.h"
|
||||
#include "dolphin/dvd.h"
|
||||
#include "dolphin/os.h"
|
||||
|
||||
#include "string.h"
|
||||
|
||||
const char* tmp = "??(??)";
|
||||
static CDvdFile* sFirstARAM = nullptr;
|
||||
|
||||
struct SDvdFileInfo : DVDFileInfo {
|
||||
CDvdFile* x3c_file;
|
||||
};
|
||||
|
||||
struct SAramCallback {
|
||||
char data[0x5c];
|
||||
struct CDvdFileARAM {
|
||||
CDvdFileARAM()
|
||||
: x5c_file(nullptr)
|
||||
, x60_(nullptr)
|
||||
, x78_(0)
|
||||
, x79_(0)
|
||||
, x7c_(0)
|
||||
, x80_(0)
|
||||
, x84_(0)
|
||||
, x88_(0)
|
||||
, x8c_(0)
|
||||
, x90_(0) {}
|
||||
ARQRequest x0_request;
|
||||
DVDFileInfo x20_dvdFile;
|
||||
CDvdFile* x5c_file;
|
||||
CDvdFile* x60_;
|
||||
rstl::reserved_vector< rstl::auto_ptr< uchar >, 2 > x64_;
|
||||
bool x78_;
|
||||
bool x79_;
|
||||
uint x7c_;
|
||||
uint x80_;
|
||||
int x84_;
|
||||
uint x88_;
|
||||
int x8c_;
|
||||
uint x90_;
|
||||
};
|
||||
|
||||
const char* DecodeARAMFile(const char* filename) {
|
||||
|
@ -30,38 +50,153 @@ const char* DecodeARAMFile(const char* filename) {
|
|||
}
|
||||
|
||||
void CDvdFile::DVDARAMXferCallback(s32 result, DVDFileInfo* info) {
|
||||
/* How the hell did retro do this normally?
|
||||
Somehow they manage to get CDvdFileARAM->x5c_file at offset 0x3c
|
||||
which excludes the ARQRequest class member.
|
||||
*/
|
||||
struct Hack {
|
||||
DVDFileInfo info;
|
||||
CDvdFile* file;
|
||||
};
|
||||
|
||||
DVDClose(info);
|
||||
reinterpret_cast< SDvdFileInfo* >(info)->x3c_file->HandleDVDInterrupt();
|
||||
reinterpret_cast<Hack*>(info)->file->HandleDVDInterrupt();
|
||||
}
|
||||
|
||||
void CDvdFile::ARAMARAMXferCallback(u32 addr) {
|
||||
reinterpret_cast< SAramCallback* >(addr)->x5c_file->HandleARAMInterrupt();
|
||||
reinterpret_cast< CDvdFileARAM* >(addr)->x5c_file->HandleARAMInterrupt();
|
||||
}
|
||||
|
||||
void CDvdFile::HandleARAMInterrupt() {
|
||||
BOOL enabled = OSDisableInterrupts();
|
||||
CDvdFileARAM* arFile = xc_.get();
|
||||
|
||||
arFile->x78_ = true;
|
||||
|
||||
if (arFile->x78_ && arFile->x79_) {
|
||||
PingARAMTransfer();
|
||||
}
|
||||
|
||||
OSRestoreInterrupts(enabled);
|
||||
}
|
||||
|
||||
void CDvdFile::HandleDVDInterrupt() {
|
||||
BOOL enabled = OSDisableInterrupts();
|
||||
CDvdFileARAM* arFile = xc_.get();
|
||||
|
||||
arFile->x79_ = true;
|
||||
|
||||
if (arFile->x78_ && arFile->x79_) {
|
||||
PingARAMTransfer();
|
||||
}
|
||||
|
||||
OSRestoreInterrupts(enabled);
|
||||
}
|
||||
|
||||
void CDvdFile::PingARAMTransfer() {}
|
||||
void CDvdFile::PingARAMTransfer() {
|
||||
CDvdFileARAM* aramFile = xc_.get();
|
||||
|
||||
void CDvdFile::TryARAMFile() {}
|
||||
if (aramFile->x8c_ == 0) {
|
||||
PopARAMFileLoad();
|
||||
return;
|
||||
}
|
||||
|
||||
void CDvdFile::PushARAMFileLoad() {}
|
||||
int length = rstl::min_val(65536, aramFile->x8c_);
|
||||
ARQPostRequest(&aramFile->x0_request, 0, ARQ_TYPE_MRAM_TO_ARAM, ARQ_PRIORITY_HIGH,
|
||||
reinterpret_cast< u32 >(aramFile->x64_[aramFile->x90_].get()),
|
||||
reinterpret_cast< u32 >(x4_ + aramFile->x88_), length, ARAMARAMXferCallback);
|
||||
|
||||
void CDvdFile::PopARAMFileLoad() {}
|
||||
aramFile->x8c_ -= length;
|
||||
aramFile->x88_ += length;
|
||||
aramFile->x78_ = false;
|
||||
aramFile->x90_ ^= 1;
|
||||
|
||||
extern "C" void sub_8034ff7c() {}
|
||||
if (aramFile->x84_ != 0) {
|
||||
int length2 = rstl::min_val(65536, aramFile->x84_);
|
||||
DVDFastOpen(x0_fileEntry, &aramFile->x20_dvdFile);
|
||||
DVDReadAsync(&aramFile->x20_dvdFile, aramFile->x64_[aramFile->x90_].get(), length2,
|
||||
aramFile->x80_, DVDARAMXferCallback);
|
||||
aramFile->x80_ += length2;
|
||||
aramFile->x84_ -= length2;
|
||||
aramFile->x79_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
void CDvdFile::StartARAMFileLoad() {}
|
||||
void CDvdFile::TryARAMFile() {
|
||||
x4_ = static_cast< uchar* >(CARAMManager::Alloc(x14_size));
|
||||
if (CARAMManager::GetInvalidAlloc() == x4_) {
|
||||
return;
|
||||
}
|
||||
xc_ = new CDvdFileARAM();
|
||||
CDvdFileARAM* arfile = xc_.get();
|
||||
arfile->x5c_file = this;
|
||||
arfile->x78_ = true;
|
||||
arfile->x7c_ = arfile->x84_ = arfile->x8c_ = GetFileSize();
|
||||
x8_ = true;
|
||||
PushARAMFileLoad();
|
||||
}
|
||||
|
||||
void CDvdFile::StallForARAMFile() {}
|
||||
void CDvdFile::PushARAMFileLoad() {
|
||||
BOOL enabled = OSDisableInterrupts();
|
||||
CDvdFile* file = sFirstARAM;
|
||||
if (file == NULL) {
|
||||
sFirstARAM = this;
|
||||
StartARAMFileLoad();
|
||||
} else {
|
||||
for (CDvdFile* p = file; p != nullptr; p = p->xc_->x60_) {
|
||||
if (p->xc_->x60_ == nullptr) {
|
||||
p->xc_->x60_ = this;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
OSRestoreInterrupts(enabled);
|
||||
}
|
||||
|
||||
void CDvdFile::PopARAMFileLoad() {
|
||||
BOOL enabled = OSDisableInterrupts();
|
||||
CDvdFile* file = xc_->x60_;
|
||||
x9_ = true;
|
||||
sFirstARAM = file;
|
||||
if (file != nullptr) {
|
||||
file->StartARAMFileLoad();
|
||||
}
|
||||
|
||||
OSRestoreInterrupts(enabled);
|
||||
}
|
||||
|
||||
bool CDvdFile::IsARAMFileLoaded() {
|
||||
if (!x8_) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!x9_) {
|
||||
return false;
|
||||
}
|
||||
|
||||
xc_ = nullptr;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CDvdFile::StartARAMFileLoad() {
|
||||
CDvdFileARAM* aramFile = xc_.get();
|
||||
aramFile->x64_.push_back((uchar*)CMemory::Alloc(0x10000, IAllocator::kHI_RoundUpLen));
|
||||
aramFile->x64_.push_back((uchar*)CMemory::Alloc(0x10000, IAllocator::kHI_RoundUpLen));
|
||||
|
||||
int len = rstl::min_val(x14_size, 65536);
|
||||
aramFile->x84_ -= len;
|
||||
aramFile->x80_ = len;
|
||||
DVDFastOpen(x0_fileEntry, &aramFile->x20_dvdFile);
|
||||
DVDReadAsync(&aramFile->x20_dvdFile, reinterpret_cast< void* >(aramFile->x64_[0].get()), len, 0,
|
||||
DVDARAMXferCallback);
|
||||
}
|
||||
|
||||
void CDvdFile::StallForARAMFile() {
|
||||
while (xc_.get() != nullptr) {
|
||||
OSYieldThread();
|
||||
}
|
||||
}
|
||||
|
||||
CDvdFile::CDvdFile(const char* filename)
|
||||
: x0_fileEntry(-1)
|
||||
|
@ -91,19 +226,43 @@ CDvdFile::~CDvdFile() { CloseFile(); }
|
|||
|
||||
CDvdRequest* CDvdFile::SyncRead(void* dest, uint len) { AsyncSeekRead(dest, len, kSO_Cur, 0); }
|
||||
|
||||
CDvdRequest* CDvdFile::SyncSeekRead(void* buf, uint len, ESeekOrigin origin, int offset) {}
|
||||
|
||||
CDvdRequest* CDvdFile::AsyncSeekRead(void* dest, uint len, ESeekOrigin origin, int offset) {
|
||||
CDvdRequest* request;
|
||||
CDvdRequest* CDvdFile::SyncSeekRead(void* dest, uint len, ESeekOrigin origin, int offset) {
|
||||
StallForARAMFile();
|
||||
CalcFileOffset(offset, origin);
|
||||
|
||||
if (x8_) {
|
||||
|
||||
uint roundedLen = (len + 31) & ~31;
|
||||
DCFlushRange(dest, roundedLen);
|
||||
CARAMManager::WaitForDMACompletion(
|
||||
CARAMManager::DMAToMRAM(x4_ + x10_offset, dest, roundedLen, CARAMManager::kDMAPrio_One));
|
||||
} else {
|
||||
DVDFileInfo info;
|
||||
DVDFastOpen(x0_fileEntry, &info);
|
||||
DVDReadAsync(&info, dest, (len + 31) & ~31, x10_offset, internalCallback);
|
||||
while (DVDGetCommandBlockStatus(&info.cb) != DVD_STATE_END) {
|
||||
}
|
||||
DVDClose(&info);
|
||||
}
|
||||
|
||||
UpdateFilePos(len);
|
||||
}
|
||||
|
||||
CDvdRequest* CDvdFile::AsyncSeekRead(void* dest, uint len, ESeekOrigin origin, int offset) {
|
||||
StallForARAMFile();
|
||||
CalcFileOffset(offset, origin);
|
||||
CDvdRequest* request;
|
||||
if (x8_) {
|
||||
int roundedLen = (len + 31) & ~31;
|
||||
DCFlushRange(dest, roundedLen);
|
||||
request = new CARAMDvdRequest(0);
|
||||
request = new CARAMDvdRequest(
|
||||
CARAMManager::DMAToMRAM(x4_ + x10_offset, dest, roundedLen, CARAMManager::kDMAPrio_One));
|
||||
} else {
|
||||
CRealDvdRequest* req = new CRealDvdRequest();
|
||||
int roundedLen = (len + 31) & ~31;
|
||||
DVDFileInfo& info = req->FileInfo();
|
||||
DVDFastOpen(x0_fileEntry, &info);
|
||||
DVDReadAsync(&info, dest, roundedLen, x10_offset, internalCallback);
|
||||
request = req;
|
||||
}
|
||||
|
||||
UpdateFilePos(len);
|
||||
|
@ -127,16 +286,16 @@ bool CDvdFile::FileExists(const char* filename) {
|
|||
void CDvdFile::internalCallback(s32, DVDFileInfo*) {}
|
||||
|
||||
void CDvdFile::CalcFileOffset(int offset, ESeekOrigin origin) {
|
||||
switch(origin) {
|
||||
case kSO_Set:
|
||||
x10_offset = offset;
|
||||
break;
|
||||
case kSO_Cur:
|
||||
x10_offset += offset;
|
||||
break;
|
||||
case kSO_End:
|
||||
x10_offset = offset + x14_size;
|
||||
break;
|
||||
switch (origin) {
|
||||
case kSO_Set:
|
||||
x10_offset = offset;
|
||||
break;
|
||||
case kSO_Cur:
|
||||
x10_offset += offset;
|
||||
break;
|
||||
case kSO_End:
|
||||
x10_offset = offset + x14_size;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -144,6 +303,6 @@ void CDvdFile::UpdateFilePos(int pos) {
|
|||
x10_offset += (pos + 31) & ~31;
|
||||
int filesize = GetFileSize();
|
||||
if (x10_offset > filesize) {
|
||||
x10_offset = filesize;
|
||||
x10_offset = filesize;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue