Annotation of hatari/src/includes/floppy_stx.h, revision 1.1.1.1

1.1       root        1: /*
                      2:   Hatari - floppy_stx.h
                      3: 
                      4:   This file is distributed under the GNU General Public License, version 2 or at
                      5:   your option any later version. Read the file gpl.txt for details.
                      6: */
                      7: 
                      8: 
                      9: 
                     10: 
                     11: typedef struct {
                     12:        /* Content of the STX sector block (16 bytes) */
                     13:        Uint32          DataOffset;                             /* Offset of sector data in the track data */
                     14:        Uint16          BitPosition;                            /* Position in bits from the start of the track */
                     15:                                                                /* (this seems to be the position of the start of the ID field, */
                     16:                                                                /* just after the IDAM, but it's not always precise) */
                     17:        Uint16          ReadTime;                               /* in ms */
                     18: 
                     19:        Uint8           ID_Track;                               /* Content of the Address Field */
                     20:        Uint8           ID_Head;
                     21:        Uint8           ID_Sector;
                     22:        Uint8           ID_Size;
                     23:        Uint16          ID_CRC;
                     24: 
                     25:        Uint8           FDC_Status;                             /* FDC status and flags for this sector */
                     26:        Uint8           Reserved;                               /* Unused, always 0 */
                     27: 
                     28:        /* Other internal variables */
                     29:        Uint16          SectorSize;                             /* In bytes, depends on ID_Size */
                     30:        Uint8           *pData;                                 /* Bytes for this sector or null if RNF */
                     31:        Uint8           *pFuzzyData;                            /* Fuzzy mask for this sector or null if no fuzzy bits */
                     32:        Uint8           *pTimingData;                           /* Data for variable bit width or null */
                     33: 
                     34:        Sint32          SaveSectorIndex;                        /* Index in STX_SaveStruct[].pSaveSectorsStruct or -1 if not used */
                     35: } STX_SECTOR_STRUCT;
                     36: 
                     37: #define        STX_SECTOR_BLOCK_SIZE           ( 4+2+2+1+1+1+1+2+1+1 ) /* Size of the sector block in an STX file = 16 bytes */
                     38: 
                     39: /* NOTE : bits 3,4,5 have the same meaning as in the FDC's Status register */
                     40: #define        STX_SECTOR_FLAG_VARIABLE_TIME   (1<<0)                  /* bit 0, if set, this sector has variable bit width */
                     41: #define        STX_SECTOR_FLAG_LOST_DATA       (1<<3)                  /* bit 3, if set, data were lost while reading/writing */
                     42: #define        STX_SECTOR_FLAG_CRC             (1<<3)                  /* bit 3, if set, there's a CRC error */
                     43: #define        STX_SECTOR_FLAG_RNF             (1<<4)                  /* bit 4, if set, there's no sector data */
                     44: #define        STX_SECTOR_FLAG_RECORD_TYPE     (1<<5)                  /* bit 5, if set, deleted data */
                     45: #define        STX_SECTOR_FLAG_FUZZY           (1<<7)                  /* bit 7, if set, this sector has fuzzy bits */
                     46: 
                     47: #define        STX_SECTOR_READ_TIME_DEFAULT    16384                   /* Default value if ReadTime==0 */
                     48: 
                     49: 
                     50: typedef struct {
                     51:        /* Content of the STX track block (16 bytes) */
                     52:        Uint32          BlockSize;                              /* Number of bytes in this track block */
                     53:        Uint32          FuzzySize;                              /* Number of bytes in fuzzy mask */
                     54:        Uint16          SectorsCount;                           /* Number of sector blocks in this track */
                     55:        Uint16          Flags;                                  /* Flags for this track */
                     56:        Uint16          MFMSize;                                /* Number of MFM bytes in this track */
                     57:        Uint8           TrackNumber;                            /* bits 0-6 = track number   bit 7 = side */
                     58:        Uint8           RecordType;                             /* Unused */
                     59: 
                     60:        /* Other internal variables */
                     61:        STX_SECTOR_STRUCT       *pSectorsStruct;                /* All the sectors struct for this track or null */
                     62: 
                     63:        Uint8                   *pFuzzyData;                    /* Fuzzy mask data for all the fuzzy sectors of the track */
                     64: 
                     65:        Uint8                   *pTrackData;                    /* Track data (after sectors data and fuzzy data) */
                     66:        Uint16                  TrackImageSyncPosition;
                     67:        Uint16                  TrackImageSize;                 /* Number of bytes in pTrackImageData */
                     68:        Uint8                   *pTrackImageData;               /* Optional data as returned by the read track command */
                     69: 
                     70:        Uint8                   *pSectorsImageData;             /* Optional data for the sectors of this track */
                     71: 
                     72:        Uint8                   *pTiming;
                     73:        Uint16                  TimingFlags;                    /* always '5' ? */
                     74:        Uint16                  TimingSize;
                     75:        Uint8                   *pTimingData;                   /* Timing data for all the sectors of the track ; each timing */
                     76:                                                                /* consists of 2 bytes per 16 FDC bytes */
                     77: 
                     78:        Sint32                  SaveTrackIndex;                 /* Index in STX_SaveStruct[].pSaveTracksStruct or -1 if not used */
                     79: } STX_TRACK_STRUCT;
                     80: 
                     81: #define        STX_TRACK_BLOCK_SIZE            ( 4+4+2+2+2+1+1 )       /* Size of the track block in an STX file = 16 bytes */
                     82: 
                     83: #define        STX_TRACK_FLAG_SECTOR_BLOCK     (1<<0)                  /* bit 0, if set, this track contains sector blocks */
                     84: #define        STX_TRACK_FLAG_TRACK_IMAGE      (1<<6)                  /* bit 6, if set, this track contains a track image */
                     85: #define        STX_TRACK_FLAG_TRACK_IMAGE_SYNC (1<<7)                  /* bit 7, if set, the track image has a sync position */
                     86: 
                     87: 
                     88: 
                     89: 
                     90: typedef struct {
                     91:        /* Content of the STX header block (16 bytes) */
                     92:        char            FileID[ 4 ];                            /* Should be "RSY\0" */
                     93:        Uint16          Version;                                /* Only version 3 is supported */
                     94:        Uint16          ImagingTool;                            /* 0x01 (Atari Tool) or 0xCC (Discovery Cartridge) */
                     95:        Uint16          Reserved_1;                             /* Unused */
                     96:        Uint8           TracksCount;                            /* Number of track blocks in this file */
                     97:        Uint8           Revision;                               /* 0x00 (old Pasti file)   0x02 (new Pasti file) */
                     98:        Uint32          Reserved_2;                             /* Unused */
                     99: 
                    100:        /* Other internal variables */
                    101:        STX_TRACK_STRUCT        *pTracksStruct;
                    102: 
                    103:        /* These variable are used to warn the user only one time if a write command is made */
                    104:        bool            WarnedWriteSector;                      /* True if a 'write sector' command was made and user was warned */
                    105:        bool            WarnedWriteTrack;                       /* True if a 'write track' command was made and user was warned */
                    106: } STX_MAIN_STRUCT;
                    107: 
                    108: #define        STX_MAIN_BLOCK_SIZE             ( 4+2+2+2+1+1+4 )       /* Size of the header block in an STX file = 16 bytes */
                    109: 
                    110: 
                    111: /* Additionnal structures used to save the data for the 'write sector' and 'write track' commands */
                    112: /* TODO : data are only saved in memory / snapshot and will be lost when exiting. */
                    113: /* We should have a file format to store them with the .STX file */
                    114: typedef struct {
                    115:        /* Copy track/side + ID field + BitPosition to uniquely identify each sector */
                    116:        Uint8           Track;
                    117:        Uint8           Side;
                    118:        Uint16          BitPosition;
                    119:        Uint8           ID_Track;                               /* Content of the Address Field */
                    120:        Uint8           ID_Head;
                    121:        Uint8           ID_Sector;
                    122:        Uint8           ID_Size;
                    123:        Uint16          ID_CRC;
                    124:        
                    125:        Uint16          SectorSize;                             /* Number of bytes in this sector */
                    126:        Uint8           *pData;                                 /* Data written for this sector */
                    127: 
                    128:        Uint8           StructIsUsed;                           /* >0 : this structure contains info (and must be saved) */
                    129:                                                                /* =0 : this structure is free and can be reused for another sector */
                    130: } STX_SAVE_SECTOR_STRUCT;
                    131: 
                    132: 
                    133: typedef struct {
                    134:        Uint8           Track;
                    135:        Uint8           Side;
                    136:        
                    137:        Uint16          TrackSizeWrite;                         /* Number of bytes in this track (when writing) */
                    138:                                                                /* (can be rounded to 16 because of DMA buffering */
                    139:        Uint8           *pDataWrite;                            /* Data written for this track */
                    140: 
                    141:        Uint16          TrackSizeRead;                          /* Number of bytes in this track (when reading) */
                    142:                                                                /* Due to interpreting bytes $F5-$FF, TrackSizeRead will often be > TrackSizeWrite */
                    143:        Uint8           *pDataRead;                             /* Data saved for this track as they will be read */
                    144:                                                                /* (after interpreting bytes $F5-$FF) */
                    145: } STX_SAVE_TRACK_STRUCT;
                    146: 
                    147: 
                    148: typedef struct {
                    149:        Uint32                  SaveSectorsCount;
                    150:        STX_SAVE_SECTOR_STRUCT  *pSaveSectorsStruct;
                    151: 
                    152:        Uint32                  SaveTracksCount;
                    153:        STX_SAVE_TRACK_STRUCT   *pSaveTracksStruct;
                    154: } STX_SAVE_STRUCT;
                    155: 
                    156: 
                    157: 
                    158: extern void    STX_MemorySnapShot_Capture(bool bSave);
                    159: extern bool    STX_FileNameIsSTX(const char *pszFileName, bool bAllowGZ);
                    160: extern bool    STX_FileNameToSave ( const char *FilenameSTX , char *FilenameSave );
                    161: extern Uint8   *STX_ReadDisk(int Drive, const char *pszFileName, long *pImageSize, int *pImageType);
                    162: extern bool    STX_WriteDisk(int Drive, const char *pszFileName, Uint8 *pBuffer, int ImageSize);
                    163: 
                    164: extern bool    STX_Init ( void );
                    165: extern bool    STX_Insert ( int Drive , const char *FilenameSTX , Uint8 *pImageBuffer , long ImageSize );
                    166: extern bool    STX_Eject ( int Drive );
                    167: 
                    168: extern STX_MAIN_STRUCT *STX_BuildStruct ( Uint8 *pFileBuffer , int Debug );
                    169: 
                    170: 
                    171: extern Uint32  FDC_GetCyclesPerRev_FdcCycles_STX ( Uint8 Drive , Uint8 Track , Uint8 Side );
                    172: extern int     FDC_NextSectorID_FdcCycles_STX ( Uint8 Drive , Uint8 NumberOfHeads , Uint8 Track , Uint8 Side );
                    173: extern Uint8   FDC_NextSectorID_TR_STX ( void );
                    174: extern Uint8   FDC_NextSectorID_SR_STX ( void );
                    175: extern Uint8   FDC_NextSectorID_LEN_STX ( void );
                    176: extern Uint8   FDC_NextSectorID_CRC_OK_STX ( void );
                    177: extern Uint8   FDC_ReadSector_STX ( Uint8 Drive , Uint8 Track , Uint8 Sector , Uint8 Side , int *pSectorSize );
                    178: extern Uint8   FDC_WriteSector_STX ( Uint8 Drive , Uint8 Track , Uint8 Sector , Uint8 Side , int SectorSize );
                    179: extern Uint8   FDC_ReadAddress_STX ( Uint8 Drive , Uint8 Track , Uint8 Sector , Uint8 Side );
                    180: extern Uint8   FDC_ReadTrack_STX ( Uint8 Drive , Uint8 Track , Uint8 Side );
                    181: extern Uint8   FDC_WriteTrack_STX ( Uint8 Drive , Uint8 Track , Uint8 Side , int TrackSize );
                    182: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.