mirror of https://github.com/PrimeDecomp/prime.git
More DolphinCDvdFile progress, only one function remains
This commit is contained in:
parent
8672ca3aef
commit
76e0804ecb
|
@ -1289,7 +1289,7 @@ AsyncIdle__8CPakFileFv:
|
||||||
/* 80368364 003652C4 80 03 00 2C */ lwz r0, 0x2c(r3)
|
/* 80368364 003652C4 80 03 00 2C */ lwz r0, 0x2c(r3)
|
||||||
/* 80368368 003652C8 2C 00 00 03 */ cmpwi r0, 3
|
/* 80368368 003652C8 2C 00 00 03 */ cmpwi r0, 3
|
||||||
/* 8036836C 003652CC 41 82 00 7C */ beq lbl_803683E8
|
/* 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
|
/* 80368374 003652D4 54 60 06 3F */ clrlwi. r0, r3, 0x18
|
||||||
/* 80368378 003652D8 41 82 00 70 */ beq lbl_803683E8
|
/* 80368378 003652D8 41 82 00 70 */ beq lbl_803683E8
|
||||||
/* 8036837C 003652DC 80 7F 00 34 */ lwz r3, 0x34(r31)
|
/* 8036837C 003652DC 80 7F 00 34 */ lwz r3, 0x34(r31)
|
||||||
|
|
|
@ -17,14 +17,13 @@ lbl_805A89B4:
|
||||||
lbl_805A89B8:
|
lbl_805A89B8:
|
||||||
# ROM: 0x3F6358
|
# ROM: 0x3F6358
|
||||||
.4byte 0x00010000
|
.4byte 0x00010000
|
||||||
.4byte 0
|
|
||||||
|
|
||||||
.section .sbss, "wa"
|
.section .sbss, "wa"
|
||||||
.balign 8
|
.balign 8
|
||||||
|
|
||||||
.global lbl_805A95D0
|
.global sFirstARAM
|
||||||
lbl_805A95D0:
|
sFirstARAM:
|
||||||
.skip 0x8
|
.skip 0x4
|
||||||
|
|
||||||
.section .text, "ax"
|
.section .text, "ax"
|
||||||
|
|
||||||
|
@ -151,9 +150,9 @@ AsyncSeekRead__8CDvdFileFPvUi11ESeekOrigini:
|
||||||
/* 8034FA0C 0034C96C 54 1B 00 34 */ rlwinm r27, r0, 0, 0, 0x1a
|
/* 8034FA0C 0034C96C 54 1B 00 34 */ rlwinm r27, r0, 0, 0, 0x1a
|
||||||
/* 8034FA10 0034C970 7F 64 DB 78 */ mr r4, r27
|
/* 8034FA10 0034C970 7F 64 DB 78 */ mr r4, r27
|
||||||
/* 8034FA14 0034C974 48 02 F0 9D */ bl DCFlushRange
|
/* 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
|
/* 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
|
/* 8034FA24 0034C984 38 A0 00 00 */ li r5, 0
|
||||||
/* 8034FA28 0034C988 4B FC 5E 45 */ bl __nw__FUlPCcPCc
|
/* 8034FA28 0034C988 4B FC 5E 45 */ bl __nw__FUlPCcPCc
|
||||||
/* 8034FA2C 0034C98C 7C 7C 1B 79 */ or. r28, r3, r3
|
/* 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
|
/* 8034FA6C 0034C9CC 7F 9B E3 78 */ mr r27, r28
|
||||||
/* 8034FA70 0034C9D0 48 00 00 70 */ b lbl_8034FAE0
|
/* 8034FA70 0034C9D0 48 00 00 70 */ b lbl_8034FAE0
|
||||||
lbl_8034FA74:
|
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
|
/* 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
|
/* 8034FA80 0034C9E0 38 A0 00 00 */ li r5, 0
|
||||||
/* 8034FA84 0034C9E4 4B FC 5D E9 */ bl __nw__FUlPCcPCc
|
/* 8034FA84 0034C9E4 4B FC 5D E9 */ bl __nw__FUlPCcPCc
|
||||||
/* 8034FA88 0034C9E8 7C 7C 1B 79 */ or. r28, r3, r3
|
/* 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)
|
/* 8034FDE4 0034CD44 93 C1 00 38 */ stw r30, 0x38(r1)
|
||||||
/* 8034FDE8 0034CD48 93 A1 00 34 */ stw r29, 0x34(r1)
|
/* 8034FDE8 0034CD48 93 A1 00 34 */ stw r29, 0x34(r1)
|
||||||
/* 8034FDEC 0034CD4C 7C 7D 1B 78 */ mr r29, r3
|
/* 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)
|
/* 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
|
/* 8034FDFC 0034CD5C 38 61 00 20 */ addi r3, r1, 0x20
|
||||||
/* 8034FE00 0034CD60 83 FD 00 0C */ lwz r31, 0xc(r29)
|
/* 8034FE00 0034CD60 83 FD 00 0C */ lwz r31, 0xc(r29)
|
||||||
/* 8034FE04 0034CD64 4B F8 65 D1 */ bl __ct__10CCallStackFUiPCcPCc
|
/* 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)
|
/* 8034FE70 0034CDD0 80 61 00 1C */ lwz r3, 0x1c(r1)
|
||||||
/* 8034FE74 0034CDD4 4B FC 5A BD */ bl Free__7CMemoryFPCv
|
/* 8034FE74 0034CDD4 4B FC 5A BD */ bl Free__7CMemoryFPCv
|
||||||
lbl_8034FE78:
|
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
|
/* 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
|
/* 8034FE84 0034CDE4 38 C4 6A A8 */ addi r6, r4, kUnknownType__10CCallStack@l
|
||||||
/* 8034FE88 0034CDE8 38 61 00 10 */ addi r3, r1, 0x10
|
/* 8034FE88 0034CDE8 38 61 00 10 */ addi r3, r1, 0x10
|
||||||
/* 8034FE8C 0034CDEC 38 80 FF FF */ li r4, -1
|
/* 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
|
/* 8034FF74 0034CED4 38 21 00 40 */ addi r1, r1, 0x40
|
||||||
/* 8034FF78 0034CED8 4E 80 00 20 */ blr
|
/* 8034FF78 0034CED8 4E 80 00 20 */ blr
|
||||||
|
|
||||||
.global sub_8034ff7c
|
.global IsARAMFileLoaded__8CDvdFileFv
|
||||||
sub_8034ff7c:
|
IsARAMFileLoaded__8CDvdFileFv:
|
||||||
/* 8034FF7C 0034CEDC 94 21 FF E0 */ stwu r1, -0x20(r1)
|
/* 8034FF7C 0034CEDC 94 21 FF E0 */ stwu r1, -0x20(r1)
|
||||||
/* 8034FF80 0034CEE0 7C 08 02 A6 */ mflr r0
|
/* 8034FF80 0034CEE0 7C 08 02 A6 */ mflr r0
|
||||||
/* 8034FF84 0034CEE4 90 01 00 24 */ stw r0, 0x24(r1)
|
/* 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)
|
/* 80350078 0034CFD8 80 84 00 60 */ lwz r4, 0x60(r4)
|
||||||
/* 8035007C 0034CFDC 98 1E 00 09 */ stb r0, 9(r30)
|
/* 8035007C 0034CFDC 98 1E 00 09 */ stb r0, 9(r30)
|
||||||
/* 80350080 0034CFE0 28 04 00 00 */ cmplwi r4, 0
|
/* 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
|
/* 80350088 0034CFE8 41 82 00 0C */ beq lbl_80350094
|
||||||
/* 8035008C 0034CFEC 7C 83 23 78 */ mr r3, r4
|
/* 8035008C 0034CFEC 7C 83 23 78 */ mr r3, r4
|
||||||
/* 80350090 0034CFF0 4B FF FD 39 */ bl StartARAMFileLoad__8CDvdFileFv
|
/* 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)
|
/* 803500C4 0034D024 93 C1 00 08 */ stw r30, 8(r1)
|
||||||
/* 803500C8 0034D028 7C 7E 1B 78 */ mr r30, r3
|
/* 803500C8 0034D028 7C 7E 1B 78 */ mr r30, r3
|
||||||
/* 803500CC 0034D02C 48 03 15 95 */ bl OSDisableInterrupts
|
/* 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
|
/* 803500D4 0034D034 7C 7F 1B 78 */ mr r31, r3
|
||||||
/* 803500D8 0034D038 28 00 00 00 */ cmplwi r0, 0
|
/* 803500D8 0034D038 28 00 00 00 */ cmplwi r0, 0
|
||||||
/* 803500DC 0034D03C 40 82 00 14 */ bne lbl_803500F0
|
/* 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
|
/* 803500E4 0034D044 7F C3 F3 78 */ mr r3, r30
|
||||||
/* 803500E8 0034D048 4B FF FC E1 */ bl StartARAMFileLoad__8CDvdFileFv
|
/* 803500E8 0034D048 4B FF FC E1 */ bl StartARAMFileLoad__8CDvdFileFv
|
||||||
/* 803500EC 0034D04C 48 00 00 30 */ b lbl_8035011C
|
/* 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)
|
/* 80350160 0034D0C0 80 1B 00 04 */ lwz r0, 4(r27)
|
||||||
/* 80350164 0034D0C4 7C 03 00 40 */ cmplw r3, r0
|
/* 80350164 0034D0C4 7C 03 00 40 */ cmplw r3, r0
|
||||||
/* 80350168 0034D0C8 41 82 00 E0 */ beq lbl_80350248
|
/* 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
|
/* 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
|
/* 80350178 0034D0D8 38 A0 00 00 */ li r5, 0
|
||||||
/* 8035017C 0034D0DC 4B FC 56 F1 */ bl __nw__FUlPCcPCc
|
/* 8035017C 0034D0DC 4B FC 56 F1 */ bl __nw__FUlPCcPCc
|
||||||
/* 80350180 0034D0E0 7C 7F 1B 79 */ or. r31, r3, r3
|
/* 80350180 0034D0E0 7C 7F 1B 79 */ or. r31, r3, r3
|
||||||
|
@ -948,10 +947,10 @@ DVDARAMXferCallback__8CDvdFileFlP11DVDFileInfo:
|
||||||
DecodeARAMFile__FPCc:
|
DecodeARAMFile__FPCc:
|
||||||
/* 803504F0 0034D450 94 21 FF F0 */ stwu r1, -0x10(r1)
|
/* 803504F0 0034D450 94 21 FF F0 */ stwu r1, -0x10(r1)
|
||||||
/* 803504F4 0034D454 7C 08 02 A6 */ mflr r0
|
/* 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
|
/* 803504FC 0034D45C 38 A0 00 05 */ li r5, 5
|
||||||
/* 80350500 0034D460 90 01 00 14 */ stw r0, 0x14(r1)
|
/* 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
|
/* 80350508 0034D468 38 84 00 07 */ addi r4, r4, 7
|
||||||
/* 8035050C 0034D46C 93 E1 00 0C */ stw r31, 0xc(r1)
|
/* 8035050C 0034D46C 93 E1 00 0C */ stw r31, 0xc(r1)
|
||||||
/* 80350510 0034D470 7C 7F 1B 78 */ mr r31, r3
|
/* 80350510 0034D470 7C 7F 1B 78 */ mr r31, r3
|
||||||
|
@ -971,10 +970,7 @@ lbl_8035052C:
|
||||||
|
|
||||||
.section .rodata
|
.section .rodata
|
||||||
.balign 8
|
.balign 8
|
||||||
.global lbl_803D8230
|
"@stringBase0":
|
||||||
lbl_803D8230:
|
|
||||||
# ROM: 0x3D5230
|
# ROM: 0x3D5230
|
||||||
.asciz "??(??)"
|
.asciz "??(??)"
|
||||||
.byte 0x61
|
.asciz "aram:"
|
||||||
.asciz "ram:"
|
|
||||||
.balign 4
|
|
||||||
|
|
|
@ -1,17 +1,19 @@
|
||||||
#ifndef _CDVDFILE
|
#ifndef _CDVDFILE
|
||||||
#define _CDVDFILE
|
#define _CDVDFILE
|
||||||
|
|
||||||
#include "types.h"
|
|
||||||
#include "Kyoto/CDvdRequest.hpp"
|
#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"
|
#include "rstl/string.hpp"
|
||||||
|
|
||||||
enum ESeekOrigin {
|
enum ESeekOrigin { kSO_Set, kSO_Cur, kSO_End };
|
||||||
kSO_Set,
|
|
||||||
kSO_Cur,
|
|
||||||
kSO_End
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
class CDvdFile;
|
||||||
|
struct CDvdFileARAM;
|
||||||
struct DVDFileInfo;
|
struct DVDFileInfo;
|
||||||
class CDvdFile {
|
class CDvdFile {
|
||||||
public:
|
public:
|
||||||
|
@ -24,6 +26,7 @@ public:
|
||||||
void TryARAMFile();
|
void TryARAMFile();
|
||||||
void PushARAMFileLoad();
|
void PushARAMFileLoad();
|
||||||
void PopARAMFileLoad();
|
void PopARAMFileLoad();
|
||||||
|
bool IsARAMFileLoaded();
|
||||||
void StartARAMFileLoad();
|
void StartARAMFileLoad();
|
||||||
void StallForARAMFile();
|
void StallForARAMFile();
|
||||||
CDvdRequest* SyncRead(void* buf, uint len);
|
CDvdRequest* SyncRead(void* buf, uint len);
|
||||||
|
@ -38,12 +41,13 @@ public:
|
||||||
static void DVDARAMXferCallback(long, DVDFileInfo*);
|
static void DVDARAMXferCallback(long, DVDFileInfo*);
|
||||||
static void ARAMARAMXferCallback(u32 addr);
|
static void ARAMARAMXferCallback(u32 addr);
|
||||||
static void internalCallback(s32, DVDFileInfo*);
|
static void internalCallback(s32, DVDFileInfo*);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int x0_fileEntry;
|
int x0_fileEntry;
|
||||||
void* x4_;
|
uchar* x4_;
|
||||||
uchar x8_;
|
bool x8_;
|
||||||
uchar x9_;
|
bool x9_;
|
||||||
int xc_;
|
rstl::single_ptr< CDvdFileARAM > xc_;
|
||||||
int x10_offset;
|
int x10_offset;
|
||||||
int x14_size;
|
int x14_size;
|
||||||
rstl::string x18_filename;
|
rstl::string x18_filename;
|
||||||
|
|
|
@ -21,6 +21,8 @@ public:
|
||||||
void PostCancelRequest();
|
void PostCancelRequest();
|
||||||
int GetMediaType() const;
|
int GetMediaType() const;
|
||||||
|
|
||||||
|
DVDFileInfo& FileInfo() { return mFileInfo; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DVDFileInfo mFileInfo;
|
DVDFileInfo mFileInfo;
|
||||||
};
|
};
|
||||||
|
|
|
@ -116,6 +116,14 @@ s32 DVDGetDriveStatus();
|
||||||
|
|
||||||
s32 DVDConvertPathToEntrynum(char* pathPtr);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,24 +1,44 @@
|
||||||
|
#include "Kyoto/CARAMToken.hpp"
|
||||||
#include "Kyoto/CDvdFile.hpp"
|
#include "Kyoto/CDvdFile.hpp"
|
||||||
|
|
||||||
#include "Kyoto/CDvdRequest.hpp"
|
#include "Kyoto/CDvdRequest.hpp"
|
||||||
|
|
||||||
#include "Kyoto/CARAMManager.hpp"
|
#include "Kyoto/CARAMManager.hpp"
|
||||||
|
|
||||||
|
#include "rstl/math.hpp"
|
||||||
|
|
||||||
#include "dolphin/arq.h"
|
#include "dolphin/arq.h"
|
||||||
#include "dolphin/dvd.h"
|
#include "dolphin/dvd.h"
|
||||||
#include "dolphin/os.h"
|
#include "dolphin/os.h"
|
||||||
|
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
const char* tmp = "??(??)";
|
static CDvdFile* sFirstARAM = nullptr;
|
||||||
|
|
||||||
struct SDvdFileInfo : DVDFileInfo {
|
struct CDvdFileARAM {
|
||||||
CDvdFile* x3c_file;
|
CDvdFileARAM()
|
||||||
};
|
: x5c_file(nullptr)
|
||||||
|
, x60_(nullptr)
|
||||||
struct SAramCallback {
|
, x78_(0)
|
||||||
char data[0x5c];
|
, x79_(0)
|
||||||
|
, x7c_(0)
|
||||||
|
, x80_(0)
|
||||||
|
, x84_(0)
|
||||||
|
, x88_(0)
|
||||||
|
, x8c_(0)
|
||||||
|
, x90_(0) {}
|
||||||
|
ARQRequest x0_request;
|
||||||
|
DVDFileInfo x20_dvdFile;
|
||||||
CDvdFile* x5c_file;
|
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) {
|
const char* DecodeARAMFile(const char* filename) {
|
||||||
|
@ -30,38 +50,153 @@ const char* DecodeARAMFile(const char* filename) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDvdFile::DVDARAMXferCallback(s32 result, DVDFileInfo* info) {
|
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);
|
DVDClose(info);
|
||||||
reinterpret_cast< SDvdFileInfo* >(info)->x3c_file->HandleDVDInterrupt();
|
reinterpret_cast<Hack*>(info)->file->HandleDVDInterrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDvdFile::ARAMARAMXferCallback(u32 addr) {
|
void CDvdFile::ARAMARAMXferCallback(u32 addr) {
|
||||||
reinterpret_cast< SAramCallback* >(addr)->x5c_file->HandleARAMInterrupt();
|
reinterpret_cast< CDvdFileARAM* >(addr)->x5c_file->HandleARAMInterrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDvdFile::HandleARAMInterrupt() {
|
void CDvdFile::HandleARAMInterrupt() {
|
||||||
BOOL enabled = OSDisableInterrupts();
|
BOOL enabled = OSDisableInterrupts();
|
||||||
|
CDvdFileARAM* arFile = xc_.get();
|
||||||
|
|
||||||
|
arFile->x78_ = true;
|
||||||
|
|
||||||
|
if (arFile->x78_ && arFile->x79_) {
|
||||||
|
PingARAMTransfer();
|
||||||
|
}
|
||||||
|
|
||||||
OSRestoreInterrupts(enabled);
|
OSRestoreInterrupts(enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDvdFile::HandleDVDInterrupt() {
|
void CDvdFile::HandleDVDInterrupt() {
|
||||||
BOOL enabled = OSDisableInterrupts();
|
BOOL enabled = OSDisableInterrupts();
|
||||||
|
CDvdFileARAM* arFile = xc_.get();
|
||||||
|
|
||||||
|
arFile->x79_ = true;
|
||||||
|
|
||||||
|
if (arFile->x78_ && arFile->x79_) {
|
||||||
|
PingARAMTransfer();
|
||||||
|
}
|
||||||
|
|
||||||
OSRestoreInterrupts(enabled);
|
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)
|
CDvdFile::CDvdFile(const char* filename)
|
||||||
: x0_fileEntry(-1)
|
: 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::SyncRead(void* dest, uint len) { AsyncSeekRead(dest, len, kSO_Cur, 0); }
|
||||||
|
|
||||||
CDvdRequest* CDvdFile::SyncSeekRead(void* buf, uint len, ESeekOrigin origin, int offset) {}
|
CDvdRequest* CDvdFile::SyncSeekRead(void* dest, uint len, ESeekOrigin origin, int offset) {
|
||||||
|
|
||||||
CDvdRequest* CDvdFile::AsyncSeekRead(void* dest, uint len, ESeekOrigin origin, int offset) {
|
|
||||||
CDvdRequest* request;
|
|
||||||
StallForARAMFile();
|
StallForARAMFile();
|
||||||
CalcFileOffset(offset, origin);
|
CalcFileOffset(offset, origin);
|
||||||
|
|
||||||
if (x8_) {
|
if (x8_) {
|
||||||
|
uint roundedLen = (len + 31) & ~31;
|
||||||
|
DCFlushRange(dest, roundedLen);
|
||||||
|
CARAMManager::WaitForDMACompletion(
|
||||||
|
CARAMManager::DMAToMRAM(x4_ + x10_offset, dest, roundedLen, CARAMManager::kDMAPrio_One));
|
||||||
} else {
|
} 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;
|
int roundedLen = (len + 31) & ~31;
|
||||||
DCFlushRange(dest, roundedLen);
|
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);
|
UpdateFilePos(len);
|
||||||
|
@ -127,16 +286,16 @@ bool CDvdFile::FileExists(const char* filename) {
|
||||||
void CDvdFile::internalCallback(s32, DVDFileInfo*) {}
|
void CDvdFile::internalCallback(s32, DVDFileInfo*) {}
|
||||||
|
|
||||||
void CDvdFile::CalcFileOffset(int offset, ESeekOrigin origin) {
|
void CDvdFile::CalcFileOffset(int offset, ESeekOrigin origin) {
|
||||||
switch(origin) {
|
switch (origin) {
|
||||||
case kSO_Set:
|
case kSO_Set:
|
||||||
x10_offset = offset;
|
x10_offset = offset;
|
||||||
break;
|
break;
|
||||||
case kSO_Cur:
|
case kSO_Cur:
|
||||||
x10_offset += offset;
|
x10_offset += offset;
|
||||||
break;
|
break;
|
||||||
case kSO_End:
|
case kSO_End:
|
||||||
x10_offset = offset + x14_size;
|
x10_offset = offset + x14_size;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,6 +303,6 @@ void CDvdFile::UpdateFilePos(int pos) {
|
||||||
x10_offset += (pos + 31) & ~31;
|
x10_offset += (pos + 31) & ~31;
|
||||||
int filesize = GetFileSize();
|
int filesize = GetFileSize();
|
||||||
if (x10_offset > filesize) {
|
if (x10_offset > filesize) {
|
||||||
x10_offset = filesize;
|
x10_offset = filesize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue