diff --git a/src/main.c b/src/main.c index c3886ab..6d69684 100644 --- a/src/main.c +++ b/src/main.c @@ -215,6 +215,25 @@ nn_Exit ne_fsState_handler(nn_FilesystemRequest *req) { } fwrite(req->strarg1, sizeof(char), req->strarg1len, f); return NN_OK; + case NN_FS_SEEK: + if(req->fd < 0 || req->fd >= NN_MAX_OPENFILES) { + nn_setError(C, "bad file descriptor"); + return NN_EBADCALL; + } + f = state->files[req->fd]; + if(f == NULL) { + nn_setError(C, "bad file descriptor"); + return NN_EBADCALL; + } + int whence = SEEK_SET; + if(req->whence == NN_SEEK_CUR) { + whence = SEEK_CUR; + } else if(req->whence == NN_SEEK_END) { + whence = SEEK_END; + } + fseek(f, req->off, whence); + req->off = ftell(f); + return NN_OK; case NN_FS_OPENDIR: ne_fsState_truepath(state, truepath, req->strarg1); state->dir = ne_opendir(truepath); diff --git a/src/neonucleus.c b/src/neonucleus.c index 2c49713..f030100 100644 --- a/src/neonucleus.c +++ b/src/neonucleus.c @@ -3006,10 +3006,13 @@ typedef struct nn_DriveState { } nn_DriveState; void nn_drive_seekPenalty(nn_Computer *C, size_t lastSector, size_t newSector, const nn_Drive *drive) { + // Check if SSD + if(drive->rpm == 0) return; + size_t maxSectors = drive->capacity / drive->sectorSize; size_t sectorsPerPlatter = maxSectors / drive->platterCount; // RPM over the number of sectors, over 60 seconds. - double latencyPerSector = (double)drive->rpm / maxSectors / 60; + double latencyPerSector = 1.0 / ((double)drive->rpm / 60 * maxSectors); // magic lastSector %= sectorsPerPlatter;