diff --git a/source/fileio/cdfile.cpp b/source/fileio/cdfile.cpp new file mode 100644 index 000000000..0550b212c --- /dev/null +++ b/source/fileio/cdfile.cpp @@ -0,0 +1,53 @@ +/***********************************/ +/*** PSX CD BigLump FileIO Stuff ***/ +/***********************************/ + +#include "system\global.h" +#include "fileio\fileio.h" +#include "fileio\cdfile.h" +#include +#include "system\vid.h" +#include "sound\cdxa.h" + +/*****************************************************************************/ +CCDFileIO::CCDFileIO(u32 FilePos,sBigLump *BigLumpPtr) +{ + DbgMsg0("CD FILE SYSTEM\n"); + while (!CdInit()); + +#if !defined(__USER_CDBUILD__) + CFileIO::FindAllFilePos(); +#endif + BigLump=BigLumpPtr; + FileStart=CFileIO::GetFilePos(FILEPOS_BIGLUMP); + CXAStream::SetSector(CFileIO::GetFilePos(FILEPOS_TRACK1)); +} + +/*****************************************************************************/ +void CCDFileIO::Open() +{ +} + +/*****************************************************************************/ +void CCDFileIO::Read(u32 Count,void *Dst) +{ +u8 Com=CdlModeSpeed; +int Error=0; +// seek + + while (!Error) + { + CdIntToPos(BigLump->Sector+FileStart,&CdPos); + CdControlB(CdlSetloc, (u8*)&CdPos, 0); // Set CD Pos + CdControlB(CdlSetmode, &Com, 0); + Error=CdRead(Count, (u32*)Dst, CdlModeSpeed); + } + while (CdReadSync(1,0) > 0); + BigLump->Sector+=Count; +} + +/*****************************************************************************/ +void CCDFileIO::Close() +{ +} + diff --git a/source/fileio/cdfile.h b/source/fileio/cdfile.h new file mode 100644 index 000000000..ab751fb95 --- /dev/null +++ b/source/fileio/cdfile.h @@ -0,0 +1,30 @@ +/***************************/ +/*** PSX CD FileIO Stuff ***/ +/***************************/ + +#ifndef __CDFILE_H__ +#define __CDFILE_H__ + +#include "fileio\fileio.h" + +/*****************************************************************************/ +class CCDFileIO : public CLOFileIO +{ +public: + CCDFileIO(u32 FilePos,sBigLump *BigLumpPtr); + virtual ~CCDFileIO(){}; + + void Open(); + void Read(u32 Length,void *Buffer); + void Close(); + +private: + sBigLump *BigLump; + u32 FileStart; + CdlLOC CdPos; + static int HasInit; +}; + +/*****************************************************************************/ +#endif + diff --git a/source/fileio/fileio.cpp b/source/fileio/fileio.cpp new file mode 100644 index 000000000..9758df28e --- /dev/null +++ b/source/fileio/fileio.cpp @@ -0,0 +1,380 @@ +/***************************************/ +/*** PSX PC/CD Big Lump FileIO Stuff ***/ +/***************************************/ + +#include "system\global.h" +#include "fileio\fileio.h" +#if __FILE_SYSTEM__==PC +#include "fileio\pcfile.h" +#else +#include "fileio\cdfile.h" +#endif +#include "utils\replace.h" +#include "utils\utils.h" + +char *LumpNames[]= +{ +"BIGLUMP.BIN", +}; + +/*****************************************************************************/ +sBigLump CFileIO::BigLump; +CLOFileIO *CFileIO::FileIO; +int CFileIO::FilePosList[FILEPOS_MAX]; + +sFAT *CFileIO::MainFAT=0; + +/*****************************************************************************/ +sDataBank CFileIO::DataBank[DATABANK_MAX]= +{ +/* + {SYSTEM_CACHE ,0}, + {FRONTEND_CACHE ,0}, + {LEVEL1_CACHE ,0}, + {LEVEL2_CACHE ,0}, + {LEVEL3_CACHE ,0}, + {LEVEL4_CACHE ,0}, + {LEVEL5_CACHE ,0}, + {LEVEL6_CACHE ,0}, + {LEVEL7_CACHE ,0}, + {LEVEL8_CACHE ,0}, + {BACKEND_CACHE ,0}, +*/ +}; + +DataBankEquate CFileIO::CurrentDataBank=DATABANK_MAX; + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +//sFAT *FAT; +void CFileIO::Init() +{ + DBG_MSG0("IO INIT!!!!\n"); + +#if __FILE_SYSTEM__==PC + FileIO=new ("CFileIO::FileIOInit") CPCFileIO(LumpNames[DataLump],&BigLump); +#else + FileIO=new ("CFileIO::FileIOInit") CCDFileIO(0,&BigLump); +#endif + BigLump.Status=BLStatusReady; + +int FATSize=FileEquate_MAX*sizeof(sFAT); +// Read Main FAT (special case load) + MainFAT=(sFAT *)MemAlloc( FATSize,"MainFAT"); + + DBG_MSG1("FATSIZE=%i\n",FATSize); + FileIO->Open(); + + BigLump.Status = BLStatusOpen; + BigLump.Sector=0; + BigLump.Length=FATSize; + BigLump.LengthLeft=BigLump.Length; + BigLump.ReadSoFar=0; + BigLump.LoadMode = FILEIO_MODE_NONE; + BigLump.ChunkLeft=0; + ReadFile(MainFAT,FATSize); + CloseFile(); + + for (int Bank=0;BankOpen(); + BigLump.Status = BLStatusOpen; + BigLump.Sector = getFileSector( ( file ) ); + BigLump.Length = getFileSize( ( file ) ); + BigLump.LengthLeft = BigLump.Length; + BigLump.ReadSoFar=0; + BigLump.LoadMode = FILEIO_MODE_NONE; + BigLump.ChunkLeft=0; +} + +/*****************************************************************************/ +/*** Read ********************************************************************/ +/*****************************************************************************/ +void CFileIO::CheckChunk() +{ +int ChunkCount; + if (!BigLump.ChunkLeft) + { + ChunkCount=BigLump.LengthLeft/2048; + if (ChunkCount>FILEIO_MAXCHUNKS) ChunkCount=FILEIO_MAXCHUNKS; + else + if (ChunkCountRead(ChunkCount, (char*)BigLump.ChunkPtr); + } +} + +/*****************************************************************************/ +long CFileIO::ReadFile( void * Buffer, s32 Length ) +{ +int ThisLoadSize; + + BigLump.LoadLeft=Length; + BigLump.DstPtr=(u8*)Buffer; + + while (BigLump.LoadLeft) + { + if (BigLump.LoadMode==FILEIO_MODE_NONE) + { + if (BigLump.LoadLeft>=FILEIO_CHUNKSIZE) + BigLump.LoadMode = FILEIO_MODE_CHUNK; + else + BigLump.LoadMode = FILEIO_MODE_STREAM; + } + + switch (BigLump.LoadMode) + { + case FILEIO_MODE_CHUNK: // Load large chunk + ThisLoadSize=BigLump.LoadLeft-(BigLump.LoadLeft%FILEIO_CHUNKSIZE); + FileIO->Read(ThisLoadSize/FILEIO_CHUNKSIZE, (char*)BigLump.DstPtr); + BigLump.DstPtr+=ThisLoadSize; + BigLump.LoadLeft-=ThisLoadSize; + BigLump.LengthLeft-=ThisLoadSize; + BigLump.ReadSoFar+=ThisLoadSize; + BigLump.LoadMode=FILEIO_MODE_NONE; + break; + + case FILEIO_MODE_STREAM: // Stream chunk + CheckChunk(); + ThisLoadSize=BigLump.LoadLeft; + if (ThisLoadSize>BigLump.ChunkLeft) ThisLoadSize=BigLump.ChunkLeft; + if (BigLump.DstPtr) MCmemcpy(BigLump.DstPtr, BigLump.ChunkPtr, ThisLoadSize ); + + BigLump.ChunkLeft-=ThisLoadSize; + BigLump.DstPtr+=ThisLoadSize; + BigLump.ChunkPtr+=ThisLoadSize; + BigLump.LoadLeft-=ThisLoadSize; + BigLump.LengthLeft-=ThisLoadSize; + BigLump.ReadSoFar+=ThisLoadSize; + if (!BigLump.ChunkLeft) BigLump.LoadMode=FILEIO_MODE_NONE; + break; + default: + ASSERT(!"Unknown Load Type!"); + } + } + + return (BigLump.LoadLeft); +} + +/*****************************************************************************/ +/*** Load ********************************************************************/ +/*****************************************************************************/ +u8 * CFileIO::loadFile( FileEquate file, char *allocName ) +{ + u8 * buffer; + s32 Length; + +// Is Already loaded in a databank? + buffer=isFileInDataBank(file); + if (buffer) return(buffer); + + Length = getFileSize( file ); + + buffer = (u8 *)MemAlloc( Length ,allocName); + ASSERT( buffer ); +#if defined(__USER_ART__) + EnterCriticalSection(); +#endif + OpenFile( file ); + ReadFile( buffer, Length ); + CloseFile(); +#if defined(__USER_ART__) + ExitCriticalSection(); +#endif + + return buffer; +} + +/*****************************************************************************/ +int CFileIO::IsFromDataBank(void *Addr) +{ +// See if we can find the file by its address +// Simply check if address is within a bank range +// Dont check start address, as this will prevent the bank from being freed + for (int Bank=0;BankStartAddr && Addr <=EndAddr) return(1); + } + } + return(0); +} + +/*****************************************************************************/ +u8 * CFileIO::loadFileAtAddr( FileEquate file, u8* buffer) +{ + s32 Length; + + Length = getFileSize( file ); + + ASSERT( buffer ); +#if defined(__USER_ART__) + EnterCriticalSection(); +#endif + OpenFile( file ); + ReadFile( buffer, Length ); + CloseFile(); +#if defined(__USER_ART__) + ExitCriticalSection(); +#endif + + return buffer; +} + +/*****************************************************************************/ +/*** Close *******************************************************************/ +/*****************************************************************************/ +void CFileIO::CloseFile() +{ + FileIO->Close(); + BigLump.Status=BLStatusReady; +} + + +/*****************************************************************************/ +void CFileIO::LoadFileSizeAtAddr(FileEquate Filename,void *Buffer,u32 Length) +{ +#if defined(__USER_ART__) + EnterCriticalSection(); +#endif + OpenFile(Filename); + ReadFile(Buffer,Length); + CloseFile(); +#if defined(__USER_ART__) + ExitCriticalSection(); +#endif + + +} + +/*****************************************************************************/ +void CFileIO::AlignFile(int Align) +{ +int Length = ((BigLump.ReadSoFar+Align-1)&-Align)-BigLump.ReadSoFar; + + if (Length) + { + ReadFile( NULL, Length ); + } +} + +/*****************************************************************************/ + +s32 CFileIO::getFileSize( FileEquate file ) +{ +s32 Ret=MainFAT[file].FileSize; + return (Ret); +} + + +s32 CFileIO::getFileSector( FileEquate file ) +{ +s32 Ret=MainFAT[file].FilePos/2048; + return (Ret); +} + +s32 CFileIO::getFileOffset( FileEquate file ) +{ +s32 Ret=MainFAT[file].FilePos; + return (Ret); +} + +/*****************************************************************************/ +void CFileIO::SkipFile(int Skip) +{ + if (Skip) ReadFile(0,Skip); +} + +/*****************************************************************************/ +int CFileIO::GetFilePos(int File) +{ + return(FilePosList[File]); +} + +/*****************************************************************************/ +#if !defined(__USER_CDBUILD__) +#include "fileio/filetab.cpp" +#endif + +void CFileIO::FindAllFilePos() +{ +#if !defined(__USER_CDBUILD__) + CalcFilePos(FilePosList); +#endif +} + +/*****************************************************************************/ +// File positions are passed by Bootstrap VIA Scratch Ram (nice!) +void CFileIO::GetAllFilePos() +{ +int *Pos=(int*)SCRATCH_RAM; + + for (int Loop=0;LoopSector*FILEIO_CHUNKSIZE,0); + PCread(FileHandle,(char*)Dst,Count*FILEIO_CHUNKSIZE); + BigLump->Sector+=Count; +} + +/*****************************************************************************/ +void CPCFileIO::Close() +{ + if (FileHandle!=-1) PCclose(FileHandle); + FileHandle=-1; + +} diff --git a/source/fileio/pcfile.h b/source/fileio/pcfile.h new file mode 100644 index 000000000..2f73014f7 --- /dev/null +++ b/source/fileio/pcfile.h @@ -0,0 +1,36 @@ +/***************************/ +/*** PSX PC FileIO Stuff ***/ +/***************************/ + +#ifndef __PCFILE_H__ +#define __PCFILE_H__ + +#include "fileio\fileio.h" +/*****************************************************************************/ +enum +{ + F_READ, + F_WRITE, + F_READWRITE, +}; + +/*****************************************************************************/ +class CPCFileIO : public CLOFileIO +{ +public: + CPCFileIO(char *Filename,sBigLump *BigLumpPtr); + virtual ~CPCFileIO(){}; + + void Open(); + void Read(u32 Length,void *Buffer); + void Close(); + +private: + sBigLump *BigLump; + s32 FileHandle; + char FullFilename[256]; + +}; + +/*****************************************************************************/ +#endif \ No newline at end of file