176 lines
7.9 KiB
C
176 lines
7.9 KiB
C
/*
|
|
* (C) Copyright 2002
|
|
* Stäubli Faverges - <www.staubli.com>
|
|
* Pierre AUBERT p.aubert@staubli.com
|
|
*
|
|
* See file CREDITS for list of people who contributed to this
|
|
* project.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*/
|
|
|
|
#ifndef _DOS_H_
|
|
#define _DOS_H_
|
|
|
|
/* Definitions for Dos diskettes */
|
|
|
|
/* General definitions */
|
|
#define SZ_STD_SECTOR 512 /* Standard sector size */
|
|
#define MDIR_SIZE 32 /* Direntry size */
|
|
#define FAT_BITS 12 /* Diskette use 12 bits fat */
|
|
|
|
#define MAX_PATH 128 /* Max size of the MSDOS PATH */
|
|
#define MAX_DIR_SECS 64 /* Taille max d'un repertoire (en */
|
|
/* secteurs) */
|
|
/* Misc. definitions */
|
|
#define DELMARK '\xe5'
|
|
#define EXTENDED_BOOT (0x29)
|
|
#define MEDIA_STD (0xf0)
|
|
#define JUMP_0_1 (0xe9)
|
|
#define JUMP_0_2 (0xeb)
|
|
|
|
/* Boot size is 256 bytes, but we need to read almost a sector, then
|
|
assume bootsize is 512 */
|
|
#define BOOTSIZE 512
|
|
|
|
/* Fat definitions for 12 bits fat */
|
|
#define FAT12_MAX_NB 4086
|
|
#define FAT12_LAST 0x0ff6
|
|
#define FAT12_END 0x0fff
|
|
|
|
/* file attributes */
|
|
#define ATTR_READONLY 0x01
|
|
#define ATTR_HIDDEN 0x02
|
|
#define ATTR_SYSTEM 0x04
|
|
#define ATTR_VOLUME 0x08
|
|
#define ATTR_DIRECTORY 0x10
|
|
#define ATTR_ARCHIVE 0x20
|
|
#define ATTR_VSE 0x0f
|
|
|
|
/* Name format */
|
|
#define EXTCASE 0x10
|
|
#define BASECASE 0x8
|
|
|
|
/* Definition of the boot sector */
|
|
#define BANNER_LG 8
|
|
#define LABEL_LG 11
|
|
|
|
typedef struct bootsector
|
|
{
|
|
unsigned char jump [3]; /* 0 Jump to boot code */
|
|
char banner [BANNER_LG]; /* 3 OEM name & version */
|
|
unsigned short secsiz; /* 11 Bytes per sector hopefully 512 */
|
|
unsigned char clsiz; /* 13 Cluster size in sectors */
|
|
unsigned short nrsvsect; /* 14 Number of reserved (boot) sectors */
|
|
unsigned char nfat; /* 16 Number of FAT tables hopefully 2 */
|
|
unsigned short dirents; /* 17 Number of directory slots */
|
|
unsigned short psect; /* 19 Total sectors on disk */
|
|
unsigned char descr; /* 21 Media descriptor=first byte of FAT */
|
|
unsigned short fatlen; /* 22 Sectors in FAT */
|
|
unsigned short nsect; /* 24 Sectors/track */
|
|
unsigned short nheads; /* 26 Heads */
|
|
unsigned int nhs; /* 28 number of hidden sectors */
|
|
unsigned int bigsect; /* 32 big total sectors */
|
|
unsigned char physdrive; /* 36 physical drive ? */
|
|
unsigned char reserved; /* 37 reserved */
|
|
unsigned char dos4; /* 38 dos > 4.0 diskette */
|
|
unsigned int serial; /* 39 serial number */
|
|
char label [LABEL_LG]; /* 43 disk label */
|
|
char fat_type [8]; /* 54 FAT type */
|
|
unsigned char res_2m; /* 62 reserved by 2M */
|
|
unsigned char CheckSum; /* 63 2M checksum (not used) */
|
|
unsigned char fmt_2mf; /* 64 2MF format version */
|
|
unsigned char wt; /* 65 1 if write track after format */
|
|
unsigned char rate_0; /* 66 data transfer rate on track 0 */
|
|
unsigned char rate_any; /* 67 data transfer rate on track<>0 */
|
|
unsigned short BootP; /* 68 offset to boot program */
|
|
unsigned short Infp0; /* 70 T1: information for track 0 */
|
|
unsigned short InfpX; /* 72 T2: information for track<>0 */
|
|
unsigned short InfTm; /* 74 T3: track sectors size table */
|
|
unsigned short DateF; /* 76 Format date */
|
|
unsigned short TimeF; /* 78 Format time */
|
|
unsigned char junk [BOOTSIZE - 80]; /* 80 remaining data */
|
|
} __attribute__ ((packed)) BootSector_t;
|
|
|
|
/* Structure d'une entree de repertoire */
|
|
typedef struct directory {
|
|
char name [8]; /* file name */
|
|
char ext [3]; /* file extension */
|
|
unsigned char attr; /* attribute byte */
|
|
unsigned char Case; /* case of short filename */
|
|
unsigned char reserved [9]; /* ?? */
|
|
unsigned char time [2]; /* time stamp */
|
|
unsigned char date [2]; /* date stamp */
|
|
unsigned short start; /* starting cluster number */
|
|
unsigned int size; /* size of the file */
|
|
} __attribute__ ((packed)) Directory_t;
|
|
|
|
|
|
#define MAX_VFAT_SUBENTRIES 20
|
|
#define VSE_NAMELEN 13
|
|
|
|
#define VSE1SIZE 5
|
|
#define VSE2SIZE 6
|
|
#define VSE3SIZE 2
|
|
|
|
#define VBUFSIZE ((MAX_VFAT_SUBENTRIES * VSE_NAMELEN) + 1)
|
|
|
|
#define MAX_VNAMELEN (255)
|
|
|
|
#define VSE_PRESENT 0x01
|
|
#define VSE_LAST 0x40
|
|
#define VSE_MASK 0x1f
|
|
|
|
/* Flag used by vfat_lookup */
|
|
#define DO_OPEN 1
|
|
#define ACCEPT_PLAIN 0x20
|
|
#define ACCEPT_DIR 0x10
|
|
#define ACCEPT_LABEL 0x08
|
|
#define SINGLE 2
|
|
#define MATCH_ANY 0x40
|
|
|
|
struct vfat_subentry {
|
|
unsigned char id; /* VSE_LAST pour la fin, VSE_MASK */
|
|
/* pour un VSE */
|
|
char text1 [VSE1SIZE * 2]; /* Caracteres encodes sur 16 bits */
|
|
unsigned char attribute; /* 0x0f pour les VFAT */
|
|
unsigned char hash1; /* toujours 0 */
|
|
unsigned char sum; /* Checksum du nom court */
|
|
char text2 [VSE2SIZE * 2]; /* Caracteres encodes sur 16 bits */
|
|
unsigned char sector_l; /* 0 pour les VFAT */
|
|
unsigned char sector_u; /* 0 pour les VFAT */
|
|
char text3 [VSE3SIZE * 2]; /* Caracteres encodes sur 16 bits */
|
|
} __attribute__ ((packed)) ;
|
|
|
|
struct vfat_state {
|
|
char name [VBUFSIZE];
|
|
int status; /* is now a bit map of 32 bits */
|
|
int subentries;
|
|
unsigned char sum; /* no need to remember the sum for each */
|
|
/* entry, it is the same anyways */
|
|
} __attribute__ ((packed)) ;
|
|
|
|
/* Conversion macros */
|
|
#define DOS_YEAR(dir) (((dir)->date[1] >> 1) + 1980)
|
|
#define DOS_MONTH(dir) (((((dir)->date[1]&0x1) << 3) + ((dir)->date[0] >> 5)))
|
|
#define DOS_DAY(dir) ((dir)->date[0] & 0x1f)
|
|
#define DOS_HOUR(dir) ((dir)->time[1] >> 3)
|
|
#define DOS_MINUTE(dir) (((((dir)->time[1]&0x7) << 3) + ((dir)->time[0] >> 5)))
|
|
#define DOS_SEC(dir) (((dir)->time[0] & 0x1f) * 2)
|
|
|
|
|
|
#endif
|