speed up fat drive access
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3714
This commit is contained in:
parent
379727f63d
commit
1887b2590b
4 changed files with 17 additions and 8 deletions
|
@ -65,6 +65,7 @@ public:
|
|||
|
||||
Bit32u sector_size;
|
||||
Bit32u heads,cylinders,sectors;
|
||||
Bit32u current_fpos;
|
||||
};
|
||||
|
||||
void updateDPT(void);
|
||||
|
|
|
@ -982,11 +982,13 @@ bool fatDrive::GetFileAttr(char *name, Bit16u *attr) {
|
|||
/* Find directory entry in parent directory */
|
||||
Bit32s fileidx = 2;
|
||||
if (dirClust==0) fileidx = 0; // root directory
|
||||
while(directoryBrowse(dirClust, &fileEntry, fileidx)) {
|
||||
Bit32s last_idx=0;
|
||||
while(directoryBrowse(dirClust, &fileEntry, fileidx, last_idx)) {
|
||||
if(memcmp(&fileEntry.entryname, &pathName[0], 11) == 0) {
|
||||
*attr=fileEntry.attrib;
|
||||
return true;
|
||||
}
|
||||
last_idx=fileidx;
|
||||
fileidx++;
|
||||
}
|
||||
return false;
|
||||
|
@ -994,12 +996,15 @@ bool fatDrive::GetFileAttr(char *name, Bit16u *attr) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool fatDrive::directoryBrowse(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum) {
|
||||
bool fatDrive::directoryBrowse(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum, Bit32s start/*=0*/) {
|
||||
direntry sectbuf[16]; /* 16 directory entries per sector */
|
||||
Bit32u logentsector; /* Logical entry sector */
|
||||
Bit32u entryoffset = 0; /* Index offset within sector */
|
||||
Bit32u tmpsector;
|
||||
Bit16u dirPos = 0;
|
||||
if ((start<0) || (start>65535)) return false;
|
||||
Bit16u dirPos = (Bit16u)start;
|
||||
if (entNum<start) return false;
|
||||
entNum-=start;
|
||||
|
||||
while(entNum>=0) {
|
||||
|
||||
|
|
|
@ -171,7 +171,7 @@ public:
|
|||
Bit32u appendCluster(Bit32u startCluster);
|
||||
void deleteClustChain(Bit32u startCluster);
|
||||
Bit32u getFirstFreeClust(void);
|
||||
bool directoryBrowse(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum);
|
||||
bool directoryBrowse(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum, Bit32s start=0);
|
||||
bool directoryChange(Bit32u dirClustNumber, direntry *useEntry, Bit32s entNum);
|
||||
imageDisk *loadedDisk;
|
||||
bool created_successfully;
|
||||
|
|
|
@ -149,8 +149,9 @@ Bit8u imageDisk::Read_AbsoluteSector(Bit32u sectnum, void * data) {
|
|||
|
||||
bytenum = sectnum * sector_size;
|
||||
|
||||
fseek(diskimg,bytenum,SEEK_SET);
|
||||
fread(data, 1, sector_size, diskimg);
|
||||
if (bytenum!=current_fpos) fseek(diskimg,bytenum,SEEK_SET);
|
||||
size_t ret=fread(data, 1, sector_size, diskimg);
|
||||
current_fpos=bytenum+ret;
|
||||
|
||||
return 0x00;
|
||||
}
|
||||
|
@ -161,7 +162,6 @@ Bit8u imageDisk::Write_Sector(Bit32u head,Bit32u cylinder,Bit32u sector,void * d
|
|||
sectnum = ( (cylinder * heads + head) * sectors ) + sector - 1L;
|
||||
|
||||
return Write_AbsoluteSector(sectnum, data);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -172,8 +172,9 @@ Bit8u imageDisk::Write_AbsoluteSector(Bit32u sectnum, void *data) {
|
|||
|
||||
//LOG_MSG("Writing sectors to %ld at bytenum %d", sectnum, bytenum);
|
||||
|
||||
fseek(diskimg,bytenum,SEEK_SET);
|
||||
if (bytenum!=current_fpos) fseek(diskimg,bytenum,SEEK_SET);
|
||||
size_t ret=fwrite(data, sector_size, 1, diskimg);
|
||||
current_fpos=bytenum+ret;
|
||||
|
||||
return ((ret>0)?0x00:0x05);
|
||||
|
||||
|
@ -184,7 +185,9 @@ imageDisk::imageDisk(FILE *imgFile, Bit8u *imgName, Bit32u imgSizeK, bool isHard
|
|||
cylinders = 0;
|
||||
sectors = 0;
|
||||
sector_size = 512;
|
||||
current_fpos = 0;
|
||||
diskimg = imgFile;
|
||||
fseek(diskimg,0,SEEK_SET);
|
||||
|
||||
memset(diskname,0,512);
|
||||
if(strlen((const char *)imgName) > 511) {
|
||||
|
|
Loading…
Add table
Reference in a new issue