From 4530934020c61654b70476a15b55f099e506b69a Mon Sep 17 00:00:00 2001 From: Mark Seminatore Date: Wed, 8 May 2024 12:44:49 -0700 Subject: [PATCH] fixes #4 granule alloc skips fat/dir track --- dsk.c | 7 +++++++ dsk.h | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/dsk.c b/dsk.c index 29df721..4012897 100644 --- a/dsk.c +++ b/dsk.c @@ -369,6 +369,13 @@ int dsk_seek_to_granule(DSK_Drive *drv, int granule) assert(granule >= 0 && granule <= DSK_LAST_GRANULE); int track = granule / DSK_GRANULES_PER_TRACK; + + // skip FAT/DIR track + if (granule >= DSK_DIR_START_GRANULE ) + track++; + + assert(track != DSK_DIR_TRACK); + int sector = 1 + (granule % DSK_GRANULES_PER_TRACK) * DSK_SECTORS_PER_GRANULE; return dsk_seek_drive(drv, track, sector); diff --git a/dsk.h b/dsk.h index 79532ef..e6e8bfd 100644 --- a/dsk.h +++ b/dsk.h @@ -19,6 +19,7 @@ #define DSK_FAT_SECTOR 2 #define DSK_DIRECTORY_SECTOR 3 #define DSK_GRANULES_PER_TRACK 2 +#define DSK_DIR_START_GRANULE (DSK_DIR_TRACK * DSK_GRANULES_PER_TRACK) #define DSK_SECTORS_PER_GRANULE (DSK_SECTORS_PER_TRACK / DSK_GRANULES_PER_TRACK) #define DSK_BYTES_PER_GRANULE (DSK_SECTORS_PER_GRANULE * DSK_BYTES_DATA_PER_SECTOR) #define DSK_TOTAL_GRANULES ((DSK_NUM_TRACKS - 1) * DSK_GRANULES_PER_TRACK) @@ -73,18 +74,21 @@ // offset in DSK to start of track/sector #define DSK_OFFSET(track, sector) (DSK_TRACK_OFFSET(track) + DSK_SECTOR_OFFSET(sector)) +// drive status enum typedef enum { DSK_UNMOUNTED, DSK_MOUNTED } DSK_DRIVE_STATUS; +// file modes typedef enum { DSK_MODE_BINARY, DSK_MODE_ASCII } DSK_OPEN_MODE; +// DSK file types typedef enum { DSK_TYPE_BASIC, @@ -93,11 +97,13 @@ typedef enum DSK_TYPE_TEXT } DSK_FILE_TYPE; +// represents a DSK sector typedef struct { char data[DSK_BYTES_DATA_PER_SECTOR]; } DSK_Sector; +// represents a DSK track typedef struct { DSK_Sector sectors[DSK_SECTORS_PER_TRACK];