This commit is contained in:
Daveo 2000-08-29 19:52:28 +00:00
parent f8194ab3b1
commit e9f123dec7
8 changed files with 749 additions and 0 deletions

53
source/fileio/cdfile.cpp Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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