diff --git a/asm/Kyoto/CPakFile.s b/asm/Kyoto/CPakFile.s index eef8c4f1..5cd3f08d 100644 --- a/asm/Kyoto/CPakFile.s +++ b/asm/Kyoto/CPakFile.s @@ -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) diff --git a/asm/Kyoto/DolphinCDvdFile.s b/asm/Kyoto/DolphinCDvdFile.s index 32208c90..ce3dc352 100644 --- a/asm/Kyoto/DolphinCDvdFile.s +++ b/asm/Kyoto/DolphinCDvdFile.s @@ -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:" diff --git a/include/Kyoto/CDvdFile.hpp b/include/Kyoto/CDvdFile.hpp index 6da931a7..edefbb3b 100644 --- a/include/Kyoto/CDvdFile.hpp +++ b/include/Kyoto/CDvdFile.hpp @@ -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; diff --git a/include/Kyoto/CDvdRequest.hpp b/include/Kyoto/CDvdRequest.hpp index 1ba967e9..85df208f 100644 --- a/include/Kyoto/CDvdRequest.hpp +++ b/include/Kyoto/CDvdRequest.hpp @@ -21,6 +21,8 @@ public: void PostCancelRequest(); int GetMediaType() const; + DVDFileInfo& FileInfo() { return mFileInfo; } + private: DVDFileInfo mFileInfo; }; diff --git a/include/dolphin/dvd.h b/include/dolphin/dvd.h index e48c34b1..ad4a8a7d 100644 --- a/include/dolphin/dvd.h +++ b/include/dolphin/dvd.h @@ -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 diff --git a/src/Kyoto/DolphinCDvdFile.cpp b/src/Kyoto/DolphinCDvdFile.cpp index 74fc2505..2c1dc087 100644 --- a/src/Kyoto/DolphinCDvdFile.cpp +++ b/src/Kyoto/DolphinCDvdFile.cpp @@ -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(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; } }