    /* For now hard-coded */
    /* Could be made dynamic if we want to be useful */
    /* On dos3.2 disks, or larger filesystems */

#define PRODOS_BYTES_PER_BLOCK 0x200
#define PRODOS_VOLNAME_LEN	15
#define PRODOS_FILENAME_LEN	15

#define PRODOS_INTERLEAVE_PRODOS	0x0
#define PRODOS_INTERLEAVE_DOS33		0x1


#define PRODOS_VOLDIR_KEY_BLOCK 0x02		// key block

#define PRODOS_FILE_DESC_LEN	0x27

#define PRODOS_FILE_DELETED	0x00
#define PRODOS_FILE_SEEDLING	0x01
#define PRODOS_FILE_SAPLING	0x02
#define PRODOS_FILE_TREE	0x03
#define PRODOS_FILE_SUBDIR	0x0d
#define PRODOS_FILE_SUBDIR_HDR	0x0e
#define PRODOS_FILE_VOLUME_HDR	0x0f

#define PRODOS_TYPE_TXT		0x04
#define PRODOS_TYPE_BIN		0x06
#define PRODOS_TYPE_BAS		0xFC
#define PRODOS_TYPE_VAR		0xFD
#define PRODOS_TYPE_SYS		0xFF

/* Normal access is $C3 */
/* Locked file is $01 */
/* Non-empty directories often locked? */
#define PRODOS_ACCESS_DESTROY	0x80	// can be deleted
#define PRODOS_ACCESS_RENAME	0x40
#define PRODOS_ACCESS_CHANGED	0x20	// has been changed since last backup
#define PRODOS_ACCESS_WRITE	0x02
#define PRODOS_ACCESS_READ	0x01

struct voldir_t {
	int fd;
	int interleave;
	int image_offset;
	unsigned char storage_type;
	unsigned char name_length;
	unsigned char version;
	unsigned char min_version;
	unsigned char access;
	unsigned char entry_length;
	unsigned char entries_per_block;
	unsigned short next_block;
	unsigned short file_count;
	unsigned short bit_map_pointer;
	unsigned short total_blocks;
	unsigned char volume_name[16];
	unsigned int creation_time;
};

struct subdir_t {
	unsigned char storage_type;
	unsigned char name_length;
	unsigned char version;
	unsigned char min_version;
	unsigned char access;
	unsigned char entry_length;
	unsigned char entries_per_block;
	unsigned char parent_entry;
	unsigned char parent_entry_length;
	unsigned short file_count;
	unsigned short parent_pointer;
//	unsigned short next_block;
//	unsigned short bit_map_pointer;
//	unsigned short total_blocks;
	unsigned char subdir_name[16];
	unsigned int creation_time;
};


struct file_entry_t {
	unsigned char storage_type;
	unsigned char name_length;
	unsigned char file_name[16];
	unsigned char file_type;
	unsigned short key_pointer;
	unsigned short blocks_used;
	int eof;
	int creation_time;
	unsigned char version;
	unsigned char min_version;
	unsigned char access;
	unsigned short aux_type;
	int last_mod;
	unsigned short header_pointer;
};

/* prodos_volume_bitmap.c */
int prodos_voldir_free_space(struct voldir_t *voldir);
int prodos_voldir_free_block(struct voldir_t *voldir, int block);
int prodos_voldir_reserve_block(struct voldir_t *voldir, int block);
void prodos_voldir_dump_bitmap(struct voldir_t *voldir);
int prodos_voldir_find_free_block(struct voldir_t *voldir);

/* prodos_catalog.c */
int prodos_find_next_file(int inode, struct voldir_t *voldir);
int prodos_populate_filedesc(unsigned char *file_desc,
                struct file_entry_t *file_entry);
//unsigned char prodos_char_to_type(char type, int lock);
void prodos_catalog(struct voldir_t *voldir, int dir_block, char *path);
//char *prodos_filename_to_ascii(char *dest,unsigned char *src,int len);
//unsigned char prodos_file_type(int value);

/* prodos_dump.c */
int prodos_dump(struct voldir_t *voldir);
int prodos_showfree(struct voldir_t *voldir);

/* prodos_read.c */
int prodos_read_block(struct voldir_t *voldir,unsigned char *block, int blocknum);
int prodos_write_block(struct voldir_t *voldir,unsigned char *block, int blocknum);

/* prodos_voldir.c */
int prodos_sync_voldir(struct voldir_t *voldir);
int prodos_change_volume_name(struct voldir_t *voldir, char *volname);
int prodos_init_voldir(int fd, struct voldir_t *voldir,
                                int interleave, int image_offset);
int prodos_read_voldir(struct voldir_t *voldir);

/* prodos_time.c */
int prodos_time(time_t t);
