diff --git a/include/bios_disk.h b/include/bios_disk.h index ca136735..95c3d345 100644 --- a/include/bios_disk.h +++ b/include/bios_disk.h @@ -65,6 +65,7 @@ public: Bit32u sector_size; Bit32u heads,cylinders,sectors; + Bit32u current_fpos; }; void updateDPT(void); diff --git a/src/dos/drive_fat.cpp b/src/dos/drive_fat.cpp index 46e662be..052d9769 100644 --- a/src/dos/drive_fat.cpp +++ b/src/dos/drive_fat.cpp @@ -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=0) { diff --git a/src/dos/drives.h b/src/dos/drives.h index ca0f93a1..d3c47bdb 100644 --- a/src/dos/drives.h +++ b/src/dos/drives.h @@ -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; diff --git a/src/ints/bios_disk.cpp b/src/ints/bios_disk.cpp index 53cc7d98..556b5743 100644 --- a/src/ints/bios_disk.cpp +++ b/src/ints/bios_disk.cpp @@ -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) {