This commit is contained in:
parent
f8194ab3b1
commit
e9f123dec7
8 changed files with 749 additions and 0 deletions
53
source/fileio/cdfile.cpp
Normal file
53
source/fileio/cdfile.cpp
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/***********************************/
|
||||||
|
/*** PSX CD BigLump FileIO Stuff ***/
|
||||||
|
/***********************************/
|
||||||
|
|
||||||
|
#include "system\global.h"
|
||||||
|
#include "fileio\fileio.h"
|
||||||
|
#include "fileio\cdfile.h"
|
||||||
|
#include <libcd.h>
|
||||||
|
#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()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
30
source/fileio/cdfile.h
Normal file
30
source/fileio/cdfile.h
Normal file
|
@ -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
|
||||||
|
|
380
source/fileio/fileio.cpp
Normal file
380
source/fileio/fileio.cpp
Normal file
|
@ -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;Bank<DATABANK_MAX; Bank++) DataBank[Bank].Data=0;
|
||||||
|
// loadDataBank(DATABANK_SYSTEM);
|
||||||
|
// CurrentDataBank=DATABANK_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*** Open ********************************************************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CFileIO::OpenFile( FileEquate file )
|
||||||
|
{
|
||||||
|
ASSERT(MainFAT);
|
||||||
|
FileIO->Open();
|
||||||
|
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 (ChunkCount<FILEIO_MINCHUNKS) ChunkCount=FILEIO_MINCHUNKS;
|
||||||
|
BigLump.ChunkPtr=BigLump.ChunkBuffer;
|
||||||
|
BigLump.ChunkLeft=ChunkCount*2048;
|
||||||
|
FileIO->Read(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;Bank<DATABANK_MAX; Bank++)
|
||||||
|
{
|
||||||
|
sDataBank &ThisBank=DataBank[Bank];
|
||||||
|
if (ThisBank.Data)
|
||||||
|
{
|
||||||
|
int Size=getFileSize(ThisBank.Filename);
|
||||||
|
u8 *StartAddr=(u8*)ThisBank.Data;
|
||||||
|
u8 *EndAddr=StartAddr+Size;
|
||||||
|
if (Addr>StartAddr && 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;Loop<FILEPOS_MAX;Loop++)
|
||||||
|
{
|
||||||
|
FilePosList[Loop]=*Pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
int CFileIO::GetReadLeft()
|
||||||
|
{
|
||||||
|
return(BigLump.LengthLeft);
|
||||||
|
}
|
||||||
|
/*****************************************************************************/
|
||||||
|
/*** Data Banks **************************************************************/
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CFileIO::loadDataBank(DataBankEquate Bank)
|
||||||
|
{
|
||||||
|
// Check if already loaded
|
||||||
|
if (DataBank[Bank].Data) return;
|
||||||
|
|
||||||
|
// Check to see no more are loaded
|
||||||
|
ASSERT(CurrentDataBank==DATABANK_MAX);
|
||||||
|
|
||||||
|
DataBank[Bank].Data=(sFAT*)loadFile(DataBank[Bank].Filename,"DataBank");
|
||||||
|
CurrentDataBank=Bank;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CFileIO::dumpDataBank()
|
||||||
|
{
|
||||||
|
// Check if loaded
|
||||||
|
ASSERT(CurrentDataBank!=DATABANK_MAX);
|
||||||
|
MemFree(DataBank[CurrentDataBank].Data);
|
||||||
|
DataBank[CurrentDataBank].Data=0;
|
||||||
|
CurrentDataBank=DATABANK_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
u8 *CFileIO::isFileInDataBank(FileEquate File)
|
||||||
|
{
|
||||||
|
for (int Bank=0;Bank<DATABANK_MAX; Bank++)
|
||||||
|
{
|
||||||
|
sDataBank &ThisBank=DataBank[Bank];
|
||||||
|
if (ThisBank.Data)
|
||||||
|
{
|
||||||
|
int Pos=ThisBank.Data[File].FilePos;
|
||||||
|
if (Pos!=-1) return(MakePtr(ThisBank.Data,Pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBG_MSG1("File Not in Cache [%i]",File);
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
130
source/fileio/fileio.h
Normal file
130
source/fileio/fileio.h
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
/***************************************/
|
||||||
|
/*** PSX PC/CD Big Lump FileIO Stuff ***/
|
||||||
|
/***************************************/
|
||||||
|
|
||||||
|
#ifndef _FILEIO_HEADER_
|
||||||
|
#define _FILEIO_HEADER_
|
||||||
|
|
||||||
|
#include "BigLump.h"
|
||||||
|
#include "fileio\filetab.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
#define FILEIO_MINCHUNKS (1) // 2k
|
||||||
|
#define FILEIO_MAXCHUNKS (1) // 2k 64k (only needed for small files, daft streams and end of files now)
|
||||||
|
#define FILEIO_CHUNKSIZE (2048)
|
||||||
|
#define FILEIO_MINCHUNKSIZE (FILEIO_CHUNKSIZE*FILEIO_MINCHUNKS)
|
||||||
|
#define FILEIO_MAXCHUNKSIZE (FILEIO_CHUNKSIZE*FILEIO_MAXCHUNKS)
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
FILEIO_MODE_NONE=0,
|
||||||
|
FILEIO_MODE_CHUNK,
|
||||||
|
FILEIO_MODE_STREAM,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
BLStatusOffline=-1,
|
||||||
|
BLStatusReady,
|
||||||
|
BLStatusOpen,
|
||||||
|
BLStatusRead,
|
||||||
|
BLStatusFail
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
DataLump=0,
|
||||||
|
OverlayLump,
|
||||||
|
MaxLumps
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sFAT
|
||||||
|
{
|
||||||
|
s32 FilePos;
|
||||||
|
s32 FileSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sBigLump
|
||||||
|
{
|
||||||
|
s16 Status;
|
||||||
|
u32 Sector;
|
||||||
|
u8 *ChunkPtr,*DstPtr;
|
||||||
|
int ChunkLeft;
|
||||||
|
int Length,LengthLeft,ReadSoFar;
|
||||||
|
int LoadLeft;
|
||||||
|
int LoadMode;
|
||||||
|
u8 ChunkBuffer[FILEIO_MAXCHUNKSIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
enum DataBankEquate
|
||||||
|
{
|
||||||
|
DATABANK_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sDataBank
|
||||||
|
{
|
||||||
|
FileEquate Filename;
|
||||||
|
sFAT *Data;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
class CLOFileIO;
|
||||||
|
class CFileIO
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
static void Init();
|
||||||
|
static void OpenFile(FileEquate file);
|
||||||
|
static long ReadFile(void *Buffer,s32 Length);
|
||||||
|
static void CloseFile();
|
||||||
|
static void AlignFile(int Length);
|
||||||
|
static void SkipFile(int Skip);
|
||||||
|
|
||||||
|
static int GetStatus() {return(BigLump.Status);}
|
||||||
|
|
||||||
|
static void LoadFileSizeAtAddr(FileEquate Filename,void *Buffer,u32 Length);
|
||||||
|
|
||||||
|
static u8 *loadFile( FileEquate file, char *allocName="CFileIO::loadFile" );
|
||||||
|
static int IsFromDataBank(void *Addr);
|
||||||
|
static u8 *loadFileAtAddr(FileEquate file, u8* buffer);
|
||||||
|
|
||||||
|
static void loadDataBank(DataBankEquate Bank);
|
||||||
|
static void dumpDataBank();
|
||||||
|
static u8 *isFileInDataBank(FileEquate File);
|
||||||
|
|
||||||
|
static s32 getFileSize( FileEquate file );
|
||||||
|
static s32 getFileSector( FileEquate file );
|
||||||
|
static s32 getFileOffset( FileEquate file );
|
||||||
|
|
||||||
|
static int GetFilePos(int File);
|
||||||
|
static void FindAllFilePos();
|
||||||
|
static void GetAllFilePos();
|
||||||
|
static int GetReadLeft();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void CheckChunk();
|
||||||
|
|
||||||
|
static sBigLump BigLump;
|
||||||
|
static CLOFileIO *FileIO;
|
||||||
|
static int FilePosList[FILEPOS_MAX];
|
||||||
|
|
||||||
|
static sDataBank DataBank[DATABANK_MAX];
|
||||||
|
static DataBankEquate CurrentDataBank;
|
||||||
|
|
||||||
|
static sFAT *MainFAT;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
class CLOFileIO
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void Open()=0;
|
||||||
|
virtual void Read(u32 Length,void *Buffer)=0;
|
||||||
|
virtual void Close()=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
#endif
|
44
source/fileio/filetab.cpp
Normal file
44
source/fileio/filetab.cpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/******************/
|
||||||
|
/*** File Table ***/
|
||||||
|
/******************/
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
char *FilenameList[FILEPOS_MAX]=
|
||||||
|
{
|
||||||
|
"BIGLUMP.BIN",
|
||||||
|
"TRACK1.IXA",
|
||||||
|
"CLIMAX.STR",
|
||||||
|
"INTRO.STR",
|
||||||
|
"LEVEL1.STR",
|
||||||
|
"LEVEL2.STR",
|
||||||
|
"LEVEL3.STR",
|
||||||
|
"LEVEL4.STR",
|
||||||
|
"LEVEL5.STR",
|
||||||
|
"LEVEL6.STR",
|
||||||
|
"LEVEL7.STR",
|
||||||
|
"ZORD1.STR",
|
||||||
|
"ZORD2.STR",
|
||||||
|
/*
|
||||||
|
"DEMO2.STR",
|
||||||
|
"DEMO3.STR",
|
||||||
|
"DEMO4.STR",
|
||||||
|
"DEMO5.STR",
|
||||||
|
"DEMO6.STR"
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
void CalcFilePos(int *Dst)
|
||||||
|
{
|
||||||
|
for (int Loop=0;Loop<FILEPOS_MAX;Loop++)
|
||||||
|
{
|
||||||
|
CdlFILE RetFile;
|
||||||
|
int Pos;
|
||||||
|
char Name[32];
|
||||||
|
sprintf(Name,"\\%s;1",FilenameList[Loop]);
|
||||||
|
while ( !CdSearchFile(&RetFile,Name) );
|
||||||
|
Dst[Loop]=CdPosToInt(&RetFile.pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
36
source/fileio/filetab.h
Normal file
36
source/fileio/filetab.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/******************/
|
||||||
|
/*** File Table ***/
|
||||||
|
/******************/
|
||||||
|
|
||||||
|
#ifndef __FILE_TABLE___
|
||||||
|
#define __FILE_TABLE___
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
enum FILEPOS_ENUM
|
||||||
|
{
|
||||||
|
FILEPOS_BIGLUMP,
|
||||||
|
FILEPOS_TRACK1,
|
||||||
|
FILEPOS_CLIMAX_STR,
|
||||||
|
FILEPOS_INTRO_STR,
|
||||||
|
FILEPOS_LEVEL1_STR,
|
||||||
|
FILEPOS_LEVEL2_STR,
|
||||||
|
FILEPOS_LEVEL3_STR,
|
||||||
|
FILEPOS_LEVEL4_STR,
|
||||||
|
FILEPOS_LEVEL5_STR,
|
||||||
|
FILEPOS_LEVEL6_STR,
|
||||||
|
FILEPOS_LEVEL7_STR,
|
||||||
|
FILEPOS_ZORD1_STR,
|
||||||
|
FILEPOS_ZORD2_STR,
|
||||||
|
/*
|
||||||
|
FILEPOS_DEMO2_STR,
|
||||||
|
FILEPOS_DEMO3_STR,
|
||||||
|
FILEPOS_DEMO4_STR,
|
||||||
|
FILEPOS_DEMO5_STR,
|
||||||
|
FILEPOS_DEMO6_STR,
|
||||||
|
*/
|
||||||
|
FILEPOS_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
/*******************************************************************************/
|
||||||
|
|
||||||
|
#endif
|
40
source/fileio/pcfile.cpp
Normal file
40
source/fileio/pcfile.cpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/***********************************/
|
||||||
|
/*** PSX PC BigLump FileIO Stuff ***/
|
||||||
|
/***********************************/
|
||||||
|
|
||||||
|
#include "system\global.h"
|
||||||
|
#include "fileio\fileio.h"
|
||||||
|
#include "fileio\pcfile.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
CPCFileIO::CPCFileIO(char *Filename,sBigLump *BigLumpPtr)
|
||||||
|
{
|
||||||
|
int NoPath=0;
|
||||||
|
PCinit();
|
||||||
|
sprintf(FullFilename,"out\\%s\\%s\\version\\%s\\%s",INF_Territory,INF_Version,INF_FileSystem,Filename);
|
||||||
|
BigLump=BigLumpPtr;
|
||||||
|
FileHandle=-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CPCFileIO::Open()
|
||||||
|
{
|
||||||
|
FileHandle=PCopen(FullFilename,F_READ,0);
|
||||||
|
ASSERT(FileHandle!=-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CPCFileIO::Read(u32 Count,void *Dst)
|
||||||
|
{
|
||||||
|
PClseek(FileHandle,BigLump->Sector*FILEIO_CHUNKSIZE,0);
|
||||||
|
PCread(FileHandle,(char*)Dst,Count*FILEIO_CHUNKSIZE);
|
||||||
|
BigLump->Sector+=Count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
void CPCFileIO::Close()
|
||||||
|
{
|
||||||
|
if (FileHandle!=-1) PCclose(FileHandle);
|
||||||
|
FileHandle=-1;
|
||||||
|
|
||||||
|
}
|
36
source/fileio/pcfile.h
Normal file
36
source/fileio/pcfile.h
Normal file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue